Linguagem C
86 pág.

Linguagem C


DisciplinaAlgoritmos e Estrutura de Dados I749 materiais7.902 seguidores
Pré-visualização18 páginas
20. fseek(stream, 0L, SEEK_END); 
21. length = ftell(stream); 
22. fseek(stream, curpos, SEEK_SET); 
23. return length; 
24. } 
 
Função ferror() : Devolve verdadeiro se ocorreu um erro durante a última operação no arquivo. 
int ferror(FILE *arq); 
 
Função rewind() : Recoloca o indicador de posição de arquivo no início do arquivo. 
void rewind(FILE *arq); 
 
Função remove() : Apaga um arquivo. 
int remove(const char *nome_arquivo); 
 65
 
Função fflush() : Esvazia um stream. 
int fflush(FILE *arq); 
 
Função fscanf() : Lê argumento de um arquivo. 
int fscanf(FILE *arq, const char *control_string, ...); 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. int main(void) 
5. { 
6. FILE *stream; 
7. int i; 
8. char c; 
9. float f; 
10. stream = fopen(&quot;DUMMY.FIL&quot;, &quot;r&quot;); 
11. if (!stream) 
12. exit(1); 
13. fscanf(stream, &quot;%d %c %f&quot;, &i, &c, &f); 
14. fclose(stream); 
15. printf(&quot;%d %c %f&quot;, i, c, f); 
16. return 0; 
17. } 
 
Função fread() : Lê count blocos de num_bytes de arq para buffer. Se não ocorrer erro retorna 
count. 
size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *arq); 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. int main(void) 
5. { 
6. FILE *stream; 
7. int s[10], i; 
8. if ((stream = fopen(&quot;TEST.$$$&quot;, &quot;rb&quot;)) == NULL) 
9. { 
10. fprintf(stderr, &quot;Cannot open output file.\n&quot;); 
11. return 1; 
12. } 
13. for (i=0; i<10; i++) 
14. { 
15. fread (&s[i], sizeof(int), 1, stream); 
16. printf(&quot;x[%d]=%d\n&quot;,i, s[i]); 
17. } 
18. fclose(stream); 
19. return 0; 
20. } 
 
Função feof() : Devolve verdadeiro se fim de arquivo for atingido. 
int feof(FILE *arq); 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. int main(void) 
5. { 
6. FILE *stream; 
7. if ((stream = fopen(&quot;DUMMY.FIL&quot;, &quot;r&quot;)==NULL) 
8. exit(1); 
9. fgetc(stream); 
10. if (feof(stream)) 
11. printf(&quot;We have reached end-of-file\n&quot;); 
12. fclose(stream); 
13. return 0; 
14. } 
 
 66
Função fwrite() : Escreve count blocos de num_bytes de buffer para arq. Se não ocorrer erro retorna 
count. 
size_t fwrite(void *buffer, size_t num_bytes, size_t count, FILE *arq); 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. int main(void) 
5. { 
6. FILE *stream; 
7. int s[10], i; 
8. if ((stream = fopen(&quot;TEST.$$$&quot;, &quot;wb&quot;)) == NULL) 
9. { 
10. fprintf(stderr, &quot;Cannot open output file.\n&quot;); 
11. return 1; 
12. } 
13. for (i=0; i<10; i++) 
14. { 
15. printf(&quot;x[%d]=&quot;,i); 
16. scanf(&quot;%d&quot;,&s[i]); 
17. fwrite(&s[i], sizeof(int), 1, stream); 
18. } 
19. fclose(stream); 
20. return 0; 
21. } 
 
Função fgetc() : Devolve o próximo caractere da stream de entrada na posição atual e incrementa o 
indicador de posição do arquivo. 
int fgetc(FILE *arq); 
1. #include <string.h> 
2. #include <stdio.h> 
3. 
4. int main(void) 
5. { 
6. FILE *stream; 
7. char string[] = &quot;This is a test&quot;; 
8. char ch; 
9. 
10. /* open a file for update */ 
11. stream = fopen(&quot;DUMMY.FIL&quot;, &quot;w+&quot;); 
12. 
13. /* write a string into the file */ 
14. fwrite(string, strlen(string), 1, stream); 
15. 
16. /* seek to the beginning of the file */ 
17. fseek(stream, 0, SEEK_SET); 
18. 
19. do 
20. { 
21. /* read a char from the file */ 
22. ch = fgetc(stream); 
23. 
24. /* display the character */ 
25. 
26. putchar(ch); 
27. } while (ch != EOF); 
28. 
29. fclose(stream); 
30. return 0; 
31. } 
 
12.4 Exercícios 
1. Faça um programa de cadastro de clientes. Este programa deve permitir a inserção de novos 
clientes, editar dados de clientes cadastrados, imprimir informações de um determinado cliente, 
excluir um cliente do cadastro, pesquisar clientes e relatório. São necessários as seguintes 
 67
informações do cliente: nome, sobrenome, rg, sexo, estado civil, data de nascimento, endereço, 
numero, complemento, cep, bairro, cidade, estado, telefone, fax e celular. 
\u2022 relatório deve calcular a média de idade, quantos são do sexo masculino e feminino, quantos são 
solteiros(as), quantos são casados(as) , quantos divorciados(as), listar as cidades e a respectiva 
quantidade de clientes por cidade; 
\u2022 Para armazenar as informações dos clientes, utilize um vetor de ponteiros (deve-se iniciar todos 
ponteiros com nulo); 
\u2022 Cada novo cliente, aloca-se dinamicamente um registro e atribui o endereço desse bloco a uma 
posição do vetor; 
\u2022 Criar também uma função para ordenar os clientes; 
\u2022 Implementar operações para manipular arquivos. 
 
2. Faça um programa contendo os serviços que uma oficina mecânica pode realizar: 
\u2022 Ordem de serviço (número da OS, data, valor, serviço realizado, cliente - ler informações de um 
arquivo); 
\u2022 Leia as informações sobre várias ordens de serviço e determine, ao final, a média dos valores, o 
nome do cliente que realizou o serviço mais caro, juntamente com a descrição desse serviço e a 
data de sua realização. 
 
3. Faça um programa que gerencia os produtos armazenados em uma farmácia. Deve-se criar um 
arquivo que armazene as informações dos produtos e a quantidade disponível. 
4. Faça um programa que gerencie a venda de produtos de uma farmácia. O programa consulta um 
arquivo (exercício 3) que contém a disponibilidade dos produtos. A cada venda deve-se 
atualizar a quantidade no arquivo. 
 
 
 
 
 68
13. ORDENAÇÃO 
Ordenação é o processo de arranjar um conjunto de informações semelhantes numa 
ordem crescente ou decrescente. Geralmente, quando a informação é ordenada, apenas uma porção 
dessa informação é usada como chave da ordenação. Essa chave é utilizada nas comparações, mas, 
quando uma troca se torna necessária, toda a estrutura de dados é transferida. 
Existem três método básicos para ordenar matrizes: 
\u2022 Troca; 
\u2022 Seleção; 
\u2022 Inserção. 
Considerando-se o seguinte exemplo são apresentados os algoritmos de ordenação a 
seguir: 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. void selecao(int *p, int count); 
5. void insercao((int *p, int count); 
6. void troca(int *p, int count); 
7. void shakesort(int *p, int count); 
8. void shell(int *p, int count); 
9. void quicksort((int *p, int count); 
10. void qs(int *p, int left, int right); 
11. void print(int *p, int count); 
12. 
13. int main(void) 
14. { 
15. int *q, n, i; 
16. printf(&quot;Quantos números deseja:&quot;); 
17. scanf(&quot;%d&quot;, &n); 
18. q=(int*)malloc(n*sizeof(int)); 
19. if (!q) 
20. exit(1); 
21. for (i=0; i<n; i++) 
22. { 
23. printf(&quot;x[%d]=&quot;,i); 
24. scanf(&quot;%d&quot;, &q[i]); 
25. } 
26. print(q,n); 
27. shakesort(q,n); 
28. printf(&quot;\nOrdenando...\n&quot;); 
29. print(q,n); 
30. free(q); 
31. return 0; 
32. } 
33. 
34. void print(int *p, int count) 
35. { 
36. int i; 
37. printf(&quot;\n&quot;); 
38. for (i=0; i<count; i++) 
39. printf(&quot;%d &quot;, p[i]); 
40. printf(&quot;\n&quot;); 
41. } 
42. ... 
 
13.1 Ordenação por Troca 
A ordenação por troca envolve repetidas comparações e, se necessário, a troca de dois 
elementos adjacentes. Consiste em dois loops, um dentro do outro (i e j). O loop j é o loop interno, 
e ele passa por cada item da tabela (do fim para o início), e compara a si próprio (j) com o anterior 
(j+1). Caso seja maior que o próximo, estes dois são trocados. Após j ter passado por toda a tabela, 
ele volta ao final e i é incrementado. Essa operação é repetida tantas vezes quantas sejam o número 
de registros da tabela. 
void troca(int *p, int count) 
{ 
 int a, b, temp; 
 print(p, count); 
 for (a=1; a<count; a++) 
 for (b=count-1; b>=a; b--) 
 { 
 if (p[b-1]>p[b]) 
 { 
 temp=p[b-1]; 
void shakesort(int *p, int count) 
{ 
 int a, exchange, temp; 
 do 
 { 
 exchange=0; 
 for (a=count-1; a>0; a--) 
 { 
 if (p[a-1]>p[a]) 
 { 
 69
 p[b-1]=p[b]; 
 p[b]=temp; 
 } 
 } 
} 
 temp=p[a-1]; 
 p[a-1]=p[a]; 
 p[a]=temp;