Anda di halaman 1dari 75

FACULDADES ADAMANTINENSES INTEGRADAS

DISCIPLINA: ALGORITMOS E ESTRUTURAS DE DADOS I CURSO: CINCIAS DA COMPUTAO

Prof. Dr. Dlcio Cardim

ADAMANTINA-SP Fevereiro - 2010

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Sumrio
1. ALGORITMO .................................................................................................................. 4 2. ESTRUTURA BSICA DE UM PROGRAMA EM C ................................................... 4 2.1. Forma Geral das Funes C/C++ ................................................................................ 5 3. VARIVEIS ..................................................................................................................... 6 3.1. Tipos de Dados ........................................................................................................... 6 3.2. Strings ......................................................................................................................... 7 4. CONSTANTES ................................................................................................................ 8 5. FUNES DE SADA DE DADOS ................................................................................ 8 5.1. A Funo printf( ) ....................................................................................................... 8 5.2. A Funo putchar( ) .................................................................................................. 10 5.3. A Funo puts( )........................................................................................................ 10 5.4. O Objeto cout ............................................................................................................ 10 5.4.1. Manipuladores de Tamanho de Campos na Impresso do Objeto cout ................. 11 6. FUNES DE ENTRADA DE DADOS ....................................................................... 12 6.1. A Funo scanf( ) ...................................................................................................... 12 6.2. A FUNO gets() .................................................................................................... 14 6.3. As Funes getch() e getche()................................................................................... 14 6.4. O OBJETO cin (C in) ............................................................................................... 15 7. OPERADORES .............................................................................................................. 15 7.1. Operador de Atribuio............................................................................................. 15 7.1.1. Converso de Tipo ................................................................................................. 16 7.2. Operadores Aritmticos ............................................................................................ 16 7.2.1. Atribuio composta .............................................................................................. 17 7.2.2. Incremento (++) e decremento (--): ....................................................................... 18 7.2.3. Menos unrio ......................................................................................................... 18 7.2.4. Precedncia de operadores. .................................................................................... 18 7.3. Operadores Relacionais e Lgicos ............................................................................ 19 7.3.1. Operadores Relacionais ......................................................................................... 19 7.3.2. Operadores Lgicos ............................................................................................... 20 8. ESTRUTURAS DE DECISES .................................................................................... 21 8.1. A Estrutura if............................................................................................................. 21 8.2. A Estrutura if - else ................................................................................................... 22 8.3. A Estrutura switch..................................................................................................... 23 9. ESTRUTURAS DE REPETIO ................................................................................. 25 9.1. Estrutura while .......................................................................................................... 25
Prof. Dr. Dlcio Cardim Pgina 2

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

9.2. Estrutura do-while..................................................................................................... 26 9.3. Estrutura for .............................................................................................................. 27 10. MATRIZES .................................................................................................................. 28 10.1. Matrizes de uma Dimenso ou Vetores .................................................................. 28 10.2. Matrizes com mais de uma Dimenso .................................................................... 29 11. STRINGS ..................................................................................................................... 31 11.1. Funes teis para Manipular Strings .................................................................... 31 12. FUNES .................................................................................................................... 34 12.1. Definio de Funes .............................................................................................. 34 12.2. Comando return ...................................................................................................... 36 12.3. Parmetros das Funes .......................................................................................... 37 12.4. Classes de Variveis ............................................................................................... 38 12.5. Funes com Matrizes ............................................................................................ 40 12.6. Funes Recursivas ................................................................................................. 44 13. PONTEIROS ................................................................................................................ 46 13.1 Operadores para Ponteiros ....................................................................................... 47 13.2 Operaes com Ponteiros......................................................................................... 48 13.3 Ponteiros e Matrizes................................................................................................. 50 14. ESTRUTURAS ............................................................................................................ 53 14.1 Tipo Estrutura .......................................................................................................... 54 14.2 Atribuies entre Estruturas..................................................................................... 55 14.3 Estruturas Aninhadas ............................................................................................... 56 14.4 Passando Estruturas para Funes ........................................................................... 57 14.5 Matrizes de Estruturas.............................................................................................. 59 14.6 Ponteiros para Estruturas ......................................................................................... 61 15. ARQUIVOS ................................................................................................................. 63 15.1 Abrindo um Arquivo ................................................................................................ 64 15.2 Gravando em Arquivos ............................................................................................ 66 15.3 Lendo do Arquivo .................................................................................................... 66 15.4 Fechando um Arquivo.............................................................................................. 67 15.5 Uso das Funes: fopen( ), getc( ), putc( ) e fclose( ) .............................................. 67 15.6 Lendo e Escrevendo Cadeias de Caracteres............................................................. 69 15.7 As funes fprintf () e fscanf()................................................................................. 71 15.7 Arquivos Binrios .................................................................................................... 73 16. BIBLIOGRAFIA .......................................................................................................... 74

Prof. Dr. Dlcio Cardim

Pgina 3

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

1. ALGORITMO
Algoritmo uma seqncia ordenada, sem ambigidade, de passos (Aes ou Comandos) que visam atingir um objetivo bem definido para a resoluo de um determinado problema. (Ordem de Pensamento, portanto, Lgica). Exemplos: Ir ao trabalho Ir ao supermercado Receita de bolo Trocar um pneu furado Tomar banho Seqncia lgica que leve construo de algoritmos: 1. 2. 3. 4. Ler atentamente o enunciado; Retirar do enunciado a relao das entradas de dados; Retirar do enunciado a relao das sadas de dados; Determinar o que deve ser feito para transformar as entradas de dados nas sadas de dados (construo do algoritmo); 5. Executar o algoritmo; Exemplo: Construir um algoritmo que efetue a soma entre dois nmeros inteiros, seguindo a seqncia acima. 1. Deve-se entender o que so nmeros inteiros e como efetuar a soma entre eles; 2. As entradas de dados so dois nmeros inteiros genricos x e y , que podem ser lidas atravs do comando leia( x, y) ; 3. A sada de dados o resultado da soma, que pode ser armazenado em z , impressa atravs do comando imprima( z ) ; 4. Para transformar as entradas de dados nas sadas de dados, efetua-se a operao z x + y; 5. Executar o algoritmo: Leia(x,y); z x + y; imprima(z);

2. ESTRUTURA BSICA DE UM PROGRAMA EM C


Um programa em C consiste em uma ou vrias funes, sendo que uma delas deve ser denominada main, funo que iniciar a execuo do programa. Definies de funes adicionais podem preceder ou suceder a funo main. O C case sensitive, ou seja, na linguagem C h diferena entre letras maisculas e minsculas (por exemplo cod Cod). Regras Gerais: Toda funo deve ser iniciada por uma chave de abertura ({) e encerrada por uma chave de fechamento (});
Prof. Dr. Dlcio Cardim Pgina 4

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Toda funo precedida de parnteses ( ); Todo programa dever conter a funo main; As linhas de cdigo so encerradas por ponto e vrgula (;); Os comandos so executados na ordem em que foram escritos; Os comentrios devem ser delimitados por /* no inicio e */ no final. Podem ser usados para comentrio de uma linha os caracteres //;

2.1. Forma Geral das Funes C/C++ Declarao de variveis globais tipo funo (lista dos argumentos ) { declarao de variveis locais a funo _ _ _ _; _ _ _ _ comandos; _ _ _ _; } Exemplo: Programa para somar dois nmeros inteiros. 1 # include <stdio.h> 2 int main( ) //funo principal 3 { 4 int A, B, S; /* definio das variveis*/ 5 printf("Estou no curso de Computao\n"); 6 printf("Digite o valor da variavel A: "); 7 scanf("%d", &A); /*leitura da varivel A*/ 8 printf("Digite o valor da variavel B: "); 9 scanf("%d", &B); /*leitura da varivel B*/ 10 S = A + B; /*soma dos dois inteiros*/ 11 printf("\nResultado %d + %d = %d", A, B, S); 12 return(0); 13 }

Na primeira linha do programa encontra-se a citao do uso do arquivo de cabealho stdio.h por meio da linha de comando # include <stdio.h>, a qual estabelece o vnculo do programa com a biblioteca externa stdio.h que possui o suporte ao uso das funes (comandos) de entrada (scanf) e sada (printf). Na segunda linha a funo main( ) definida como int (tipo padro da principal funo em C), estabelece a estrutura do bloco principal do programa. Dentro da funo main( ) entre os smbolos { e } so definidas as variveis de trabalho, bem como as aes de entrada, processamento e sada.
Prof. Dr. Dlcio Cardim Pgina 5

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

A instruo return(0) est informando que a funo main( ) est retornando o valor zero (valor padro para a funo)

3. VARIVEIS
um espao de memria reservado para armazenar um certo tipo de dado e tendo um nome para referenciar seu contedo. Regra gerais: Em C, todas variveis utilizadas no programa devem ser definidas previamente; A definio indica, no mnimo, o nome e o tipo de cada uma delas; Na ocorrncia de mais de uma varivel do mesmo tipo, pode-se defini-las de uma nica vez, separando seus nomes com vrgula; H distino entre letras maisculas e minsculas. Sendo assim, as variveis: NOME, nome, Nome so diferentes; O primeiro caractere do nome de uma varivel no pode ser em hiptese alguma um nmero; sempre deve ser uma letra; O nome de uma varivel no pode ter espao em branco; No podem ser utilizados outros caracteres a no ser letra (a z ou A Z) e nmeros, com exceo do caractere underscore _ , que pode ser utilizado para simular a separao de duas palavras, como: Cod_Produto; proibido o uso de palavras reservadas para o nome de varivel. Exemplos: nomes de variveis: x, k, nome_aluno, Nome_Aluno, _valor, A1, A2, a3.

Sintaxe: A sintaxe para definio de variveis a seguinte: tipo variavel_1 [, variavel_2, ...] ; Onde tipo o tipo de dado e variavel_1 o nome da varivel a ser declarada. Se houver mais de uma varivel, seus nomes so separados por vrgulas.

3.1. Tipos de Dados O tipo de uma varivel informa a quantidade de memria, em bytes, que esta ir ocupar e a forma como o seu contedo ser armazenado. A tabela a seguir apresenta os tipos, seu tamanho (em bytes) e sua escala de abrangncia.
Tipo Void Char Int Float Double
Prof. Dr. Dlcio Cardim

Bytes 0 1 2 4 8

Escala Sem valor -128 a 127 -32 768 a 32 767 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308
Pgina 6

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Tipos modificados unsigned char unsigned int long int unsigned long int long Double

Bytes 1 2 4 4 10

Escala 0 a 255 0 a 65535 -2 147 483 648 a 2 147 483 647 0 a 4 294 967 295 3.4e-4932 a 3.4e+4932

Exemplos: Definio de variveis int valor; float x, n; double Valores; char letra; Pode-se iniciar uma varivel no momento de sua definio, ou em qualquer momento do algoritmo. Exemplos: int x=5 int main( ) { float tempo=20.65 char caracter=R; int k; k=15; x=x+k; } 3.2. Strings Em C no existe um tipo especfico para se utilizar Strings. Strings so vetores do tipo char, ou seja, para se utilizar uma string em C define-se um vetor do tipo char. Exemplo: #include <stdio.h> #include <stdlib.h> int main() { char nome[30]; printf("Digite seu nome: "); gets(nome); printf("\nO nome digitado foi: %s", nome); system("pause >>null"); }

//global

//local //local //local

Prof. Dr. Dlcio Cardim

Pgina 7

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

4. CONSTANTES
Uma constante tem valor fixo e inaltervel. Podem-se utilizar duas formas de definir constantes em C. 1 - Atravs da diretiva #define: Exemplo: #define raio 6.45 #define letra H 2 - Atravs do modificador de acesso varivel const: Exemplos: const float raio = 6.45 const nome = Paulo Obs.: Em C uma constante caractere indicada atravs de aspas simples, ex: b. J uma constante string indicada atravs de aspas duplas, ex: Frase. #include <stdio.h> #include <stdlib.h> #define pi 3.1415 //definindo a constant pi int main() { float raio; printf("Digite o raio da circunferncia: "); scanf("%f",&raio); float area; float perimetro; area = pi * raio * raio; perimetro = 2 * pi * raio; printf("\nArea = %5.2f", area); printf("\nPerimetro = %5.2f", perimetro); system("pause >>null"); return(0); }

Define o nmero decimal com 5 espaos na tela sendo 2 para casa decimal

5. FUNES DE SADA DE DADOS


5.1. A Funo printf( ) Biblioteca: stdio.h Sintaxe: printf(expresses de controle ou strings, lista de argumentos);

Prof. Dr. Dlcio Cardim

Pgina 8

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Exemplos: printf(Mensagem a ser impressa); printf(\nA rea da circunferncia : %5.2f, rea); print(\nA mdia de pesos as %d pessoas : %5.2f, media_peso); onde: \n: indica nova linha; %d: indica que ser impresso um nmero decimal; %5.2f: indica que ser impresso um nmero real com 5 espaos na tela sendo 2 para casa decimal. A expresso de controle se caracteriza por conter cdigos de formatao para o tipo de dado a ser processado. A tabela a seguir apresenta os cdigos de formatao para a funo printf( ). Cdigo %c %d %e %f %o %s %u %x Funo Permite que seja efetuada a escrita de apenas um caractere. Permite que seja efetuada a escrita de nmeros inteiros decimais. Permite que seja efetuada a escrita de nmeros em notao cientfica. Permite que seja efetuada a escrita de nmeros reais (ponto flutuante). Permite que seja efetuada a escrita de nmeros octais. Permite que seja efetuada a escrita de uma srie de caracteres. Permite que seja efetuada a escrita de um nmero decimal sem sinal. Permite que seja efetuada a escrita de um nmero hexadecimal.

A tabela a seguir apresenta os cdigos especiais de formatao de sada de dados em vdeo. Cdigo \n \t \b \ \ \\ \f \0 Finalidade Gera uma nova linha a partir do ponto que indicado. Gera um espao de tabulao (Tab) do ponto que indicado. Executa um retrocesso de espao do ponto que indicado. Apresenta o smbolo de aspas dupla no ponto em que indicado. Apresenta o smbolo de aspas simples no ponto em que indicado. Apresenta o smbolo de barra no ponto em que indicado. Gera um salto de pgina de formulrio (uso de uma impressora). Gera um nulo.

Prof. Dr. Dlcio Cardim

Pgina 9

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

5.2. A Funo putchar( ) Biblioteca: stdio.h A funo putchar() coloca apenas um caracter na tela na posio onde estiver o cursor. Exemplo: #include <stdio.h> #include <iostream.h> #include <conio.h>

//define toupper() //define getche()

int main() { char letra; printf("Digite uma letra: "); //pede para usurio digitar uma letra letra=getchar(); //l o caracter digitado e armazena na varivel letra putchar(toupper(letra)); //imprime o caracter em maisculo putchar('\n'); getche(); }

5.3. A Funo puts( ) Biblioteca: stdio.h A funo puts() apresenta uma nica string na tela por vez seguida de um caracter de nova linha. Exemplo: puts(Exemplo da funo puts);

5.4. O Objeto cout O objeto cout (pronuncia-se C out) um objeto de uma classe de I/O predefinida em C++. Sntaxe: cout << expresso Exemplo: cout << O nmero de alunos : << qde;

Prof. Dr. Dlcio Cardim

Pgina 10

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

5.4.1. Manipuladores de Tamanho de Campos na Impresso do Objeto cout O objeto cout permite estabelecer o tamanho de um campo para a impresso. Isto significa que pode-se definir o nmero de colunas que sero ocupadas por um valor ou texto a ser impresso. Geralmente, a definio de tamanho de campos usada para alinhamento e esttica de um relatrio. Os manipuladores de tamanho de campos esto definidos no arquivo iomanip.h e so os seguintes: setw Seleciona o tamanho do prximo campo a ser impresso. setprecision Define o nmero de casas decimais a serem impressas para nmeros em ponto flutuante. setfill Seleciona o caracter que dever preencher as colunas em branco de um campo. Exemplo1: #include <iostream> #include <iomanip> #include <conio.h> using namespace std; int main () { float preco = 38.45, desc = 4.25; cout << "\nPreo: " << setw(15) << preco; cout << "\nDesconto: " << setw(15) << desc; getche(); } A sada ser: Preo Desconto

38.45 4.25

Exemplo2: #include <iostream> #include <iomanip> #include <conio.h> using namespace std; int main () { float preco = 38.45, desc = 4.25; cout << setfill('.'); cout << "\nPreo: " << setw(15) << preco; cout << "\nDesconto: " << setw(15) << desc; getche(); }

Prof. Dr. Dlcio Cardim

Pgina 11

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

A sada ser: Preo .........38.45 Desconto ...........4.25

6. FUNES DE ENTRADA DE DADOS


6.1. A Funo scanf( ) Biblioteca: stdio.h Sintaxe: scanf(expresso de controle, lista de argumentos); A expresso de controle se caracteriza por conter cdigos de formatao para o tipo de dado a ser processado, precedidos pelo sinal %. A tabela a seguir apresenta os cdigos de formatao para a funo scanf( ). Cdigo %c %d %e %f %l %o %s %u %x Funo Permite que seja efetuada a leitura de apenas um caractere. Permite que seja efetuada a leitura de nmeros inteiros decimais. Permite que seja efetuada a leitura de nmeros em notao cientfica. Permite que seja efetuada a leitura de nmeros reais (ponto flutuante). Permite que seja efetuada a leitura de um nmero inteiro longo. Permite que seja efetuada a leitura de nmeros octais. Permite que seja efetuada a leitura de uma srie de caracteres. Permite que seja efetuada a leitura de um nmero decimal sem sinal. Permite que seja efetuada a leitura de um nmero hexadecimal.

A lista de argumentos a indicao dos endereos das variveis em uso, por meio do operador de endereo &, que possibilita retornar o valor da varivel. Exemplo: L a idade em anos e imprime a idade em dias. #include <stdio.h> #include <stdlib.h> int main() { float Id_Anos, Id_Dias; printf("Entre com sua idade em anos: "); scanf("%f", &Id_Anos); Id_Dias = Id_Anos * 365; printf("\nIdade em dias: %.0f",Id_Dias); system("pause >>null"); }
Prof. Dr. Dlcio Cardim Pgina 12

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

A memria de seu computador dividida em bytes, e estes bytes so numerados de 0 at o limite de memria de sua mquina. Estes nmeros so denominados de endereos de bytes. Toda varivel ocupa certa localizao na memria, e seu endereo o do primeiro byte ocupado por ela. Um inteiro ocupa 2 bytes. Se definirmos uma varivel n como inteira e atribuirmos a ela o valor 6, quando n for referenciada devolver 6. Entretanto, se referenciarmos n precedido de & (&n) devolver o endereo do primeiro byte onde n est guardada. Exemplo: Imprime o valor e o endereo de memria da varivel. #include <stdio.h> #include <stdlib.h> int main() { int valor; valor = 6; printf("Valor = %d", valor); printf("\nEndereo = %u", &valor); //Um endereo de memria visto como um //nmero inteiro sem sinal, por isso //usou-se %u system("pause >>null"); } Para ler uma string com scanf no necessita de se colocar o operar & para passar o endereo da varivel porque uma string um vetor de char e todo vetor em C um endereo para a primeira posio (veremos mais adiante). Exemplo: #include <stdio.h> #include <stdlib.h> int main() { char curso[30]; printf("Digite o curso: "); scanf("%s", curso); printf("\nCurso: %s",curso); system("pause >>null"); } A sada ser: Digite o curso: Cincias da Computao Curso: Cincias Observa-se que no foi impresso todo curso, isto ocorre porque a funo scanf entende espao como um finalizador de string, semelhante ao objeto cin. Para resolver-se isto se deve utilizar a funo gets().
Prof. Dr. Dlcio Cardim Pgina 13

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

6.2. A FUNO gets() Biblioteca: stdio.h A funo gets l uma string inclusive espaos at que se pressione Enter. Exemplo: #include <stdio.h> #include <stdlib.h> int main() { char curso[30]; printf("Digite o curso: "); gets(curso); printf("\nCurso: %s",curso); system("pause >>null"); } A sada ser: Digite o curso: Cincias da Computao Curso: Cincias da Computao

6.3. As Funes getch() e getche() Biblioteca: conio.h As funes getch() e getche() lem um nico caractere, no necessitando que o Enter seja pressionado. Assim que qualquer caractere seja pressionado a funo encerra. A diferena que getch() no apresenta o caractere na tela enquanto getche() apresenta o caractere na tela. Exemplo: #include <stdio.h> #include <conio.h> int main() { char ch; printf("Digite um caracter: "); ch = getch(); printf("\nO caracter que voc digitou %c", ch); getch(); }

Prof. Dr. Dlcio Cardim

Pgina 14

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

6.4. O OBJETO cin (C in) Biblioteca: iostream.h O objeto cin (pronuncia-se C in) manipula toda entrada do teclado por meio do operador de extrao >> que conecta a entrada de dados varivel que a conter. Exemplo: #include <iostream.h> #include <conio.h> int main() { float N1, N2; cout << "\nDigite a nota do bimestre 1: "; cin >> N1; cout << "\nDigite a nota do bimestre 2: "; cin >> N2; cout <<"\nSua mdia " << (N1 + N2)/2; getch(); }

7. OPERADORES
7.1. Operador de Atribuio A operao de atribuio a operao mais simples do C. Consiste de atribuir valor de uma expresso a uma varivel. Sintaxe: identificador = expresso; Onde: identificador: o nome de uma varivel; expresso: uma expresso vlida (ou outro identificador). Exemplos: a = 1; delta = b * b - 4. * a * c; Obs: C aceita vrias atribuies numa mesma instruo. Exemplo: K = X = M = 100; O operando esquerdo deve ser um identificador de varivel, isto , no pode ser uma constante ou expresso. Exemplo: Algumas atribuies invlidas: 1 = a; // constante! b + 1 = a; // expresso!
Prof. Dr. Dlcio Cardim Pgina 15

i = j;

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

7.1.1. Converso de Tipo Se os dois operandos de uma atribuio no so do mesmo tipo, o valor da expresso ou operador da direita ser convertido para o tipo do identificador da esquerda. Exemplo: Algumas atribuies com converso de tipo: int i; float f; i = 5; f=i;

// valor de i: 5 // valor de f: 5.0

A varivel i foi inicializada com o valor 5. Ao final da terceira instruo, f recebe o valor 5.0. Nestas converses podem ocorrer alteraes dos valores convertidos se o operando da esquerda for de um tipo que utilize menor numero de bytes que o operando da direita. Exemplo: Algumas atribuies com converso de tipo e perda de informao: int i; float f =284.43421; i = f; // truncamento! Aps a execuo deste trecho de programa o valor da varivel f ser 284 pois seu valor foi truncado durante a converso. Pode-se dizer que as converses potencialmente perigosas (onde h possibilidade de perda de informao) so:
char int float Double

O compilador C ao encontrar esta operao no gera nenhum aviso de ateno para o programador. Assim este detalhe pode gerar um erro de programao ( bug) que passe desapercebido ao programador inexperiente. possvel dizer que a linguagem C possui tipos macios (soft types) pois a operao com variveis de tipos diferentes perfeitamente possvel. 7.2. Operadores Aritmticos Cada operador aritmtico est relacionado a uma operao aritmtica elementar: adio, subtrao, multiplicao e diviso. Existe ainda um operador (%) chamado operador de mdulo cujo significado o resto da diviso inteira.

Prof. Dr. Dlcio Cardim

Pgina 16

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

No existe em C, como existe em outras linguagens, um operador especfico para a operao de potenciao (ab). Existe, porm, uma funo de biblioteca ( pow()) que realiza esta operao. A funo sqrt() fornece a raiz quadrada de um nmero. Obs: As funes pow() e sqrt() encontram-se na biblioteca math.h. Os smbolos dos operadores aritmticos so: Operador + * / % pow(base, expoente) sqrt(valor numrico) Operao adio subtrao multiplicao diviso mdulo (resto da diviso inteira) exponenciao raiz quadrada

Exemplos: printf( O resto de %d / %d %d, 14, 3, 14%3); O resultado ser: O resto de 14/3 2 printf(%5.2f elevado a %5.2f = %5.2f", 5,3, pow(5,3)); O resultado ser: 5.00 elevado a 3.00 = 125.00 printf("\nRaiz quadrada de %5.2f = %5.4f", 55, sqrt(55)); O resultado ser: Raiz quadrada de 55.00 = 7.416

7.2.1. Atribuio composta Em C, qualquer expresso da forma: <varivel> = <varivel <operador> <expresso> pode ser compactada na forma: <varivel><operador> = <expresso> Exemplos: a=a+b a=ab a=a*b a=a/b a=a%b etc....

a += b a -= b a *= b a /= b a %=b

Prof. Dr. Dlcio Cardim

Pgina 17

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

7.2.2. Incremento (++) e decremento (--): Em programao existem instrues muito comuns chamadas de incremento e decremento. Uma instruo de incremento adiciona uma unidade ao contedo de uma varivel. Uma instruo de decremento subtrai uma unidade do contedo de uma varivel. Existem, em C, operadores especficos para realizar as operaes de incremento (++) e decremento (--). Eles so genericamente chamados de operadores incrementais. ++x incrementa x antes de utilizar o seu valor. x++ incrementa x depois de ser utilizado. Exemplos: X = 8; K = X++; Neste caso: K = 8, pois atribui-se X a K e depois incrementa X, portanto X valor 9 X = 8; K = ++X; Neste caso: K = 9, pois X incrementado para 9 e depois atribudo a K. Observe as instrues a seguir e note o valor que as variveis recebem aps a execuo da instruo: valor das variveis int a, b, c, i = 3; // a: ? b: ? c: ? i: 3 a = i++; // a: 3 b: ? c: ? i: 4 b = ++i; // a: 3 b: 5 c: ? i: 5 c = --i; // a: 3 b: 5 c: 4 i: 4

7.2.3. Menos unrio O operador menos unrio usado somente para indicar a troca do sinal algbrico do valor. Pode tambm ser pensado como o operador que multiplica seu operador por -1. Exemplo: valor = -12; result = -valor; Depois destas duas instrues, o contedo de result ser 12.

7.2.4. Precedncia de operadores. Quando mais de um operador se encontram em uma expresso aritmtica as operaes so efetuadas uma de cada vez respeitando algumas regras de precedncia: Estas regras de precedncia so as mesmas da matemtica elementar.
Prof. Dr. Dlcio Cardim Pgina 18

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Os operadores de incremento (++) e (--) tem precedncia sobre os operadores de multiplicao (*), diviso (/) e mdulo (%) que tem precedncia sobre os operadores de adio (+) e subtrao (-). Entre operadores de mesma precedncia as operaes so efetuadas da esquerda para a direita. ++ -- mais alta */% + - mais baixa Exemplo: Observe, nas expresses a seguir, o seu valor e a ordem das operaes efetuadas: Expresso 1+2-3 24 - 3 * 5 4-2*6/4+1 6 / 2 + 11 % 3 * 4 Valor 0 9 2 11 Ordem +**/-+ /%*+

A ordem de precedncia dos operadores pode ser quebrada usando-se parnteses: ( ). Os parnteses so, na verdade, operadores de mais alta precedncia e so executados primeiro. Parnteses internos so executados primeiro que parnteses externos.

7.3. Operadores Relacionais e Lgicos Operadores relacionais verificam a relao de magnitude e igualdade entre dois valores e lgicos se refere s maneiras como essas relaes podem ser conectadas. As expresses que usam operadores de relao e lgicos retornaro 0 para falso e 1 para verdadeiro.

7.3.1. Operadores Relacionais Os operadores relacionais so: Operador == != > < >= <= Significado igual a diferente de maior que menor que maior ou igual que menor ou igual que

Os operadores relacionais de igualdade (== e !=) tem precedncia menor que os de magnitude (>, <, >= e <=). Estes, por sua vez, tem precedncia menor que os operadores aritmticos. Operadores relacionais de mesma precedncia so avaliados da esquerda para a direita.

Prof. Dr. Dlcio Cardim

Pgina 19

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Exemplo: Observe as expresses lgicas abaixo e verifique o resultado de sua avaliao. Admita que x e y so variveis tipo int com valores 4 e 1, respectivamente. Expresso x + y == 5 x != 2 * y > x 6 >= n < 3 - x x == y <= x > x Valor 1 1 0 0 Ordem de Operao + == * > != - >= < <= > !=

7.3.2. Operadores Lgicos Os operadores lgicos so: Operador && || ! Significado operador lgico E (and) operador lgico OU (or) operador lgico NOT

O resultado da operao lgica && ser 1 somente se os dois operandos forem 1, caso contrrio o resultado 0. O resultado da operao lgica || ser 0 somente se os dois operandos forem 0, caso contrrio o resultado 1. O resultado da operao lgica ! ser 0 se o operandos for 1, e 1 se o operando for 0. Resultado das possveis combinaes entre os operandos para cada operador lgico: Operador &&: op_1 && op_2 op_1 op_2 Res 1 1 1 1 0 0 0 1 0 0 0 0 op_1 op_2 Res 1 1 1 1 0 1 0 1 1 0 0 0 op 1 0 Res 0 1

Operador ||: op_1 || op_2

Operador !: !op

O Operador && tem precedncia sobre o operador ||. Estes dois tm precedncia menor que os operadores relacionais. O operador ! tem a mesma precedncia que os operadores incrementais. Exemplo: Observe as expresses lgicas a seguir e verifique o resultado de sua avaliao. Admita que a, b e c so variveis tipo int com valores 0, 1 e 2, respectivamente.

Prof. Dr. Dlcio Cardim

Pgina 20

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Expresso a && b c > b || a < c a + b && !c - b !b && c || a

Valor 0 1 1 0

Ordem de Operao > < || ! + - && ! && ||

8. ESTRUTURAS DE DECISES
8.1. A Estrutura if usada para executar uma instruo ou bloco de instrues somente se uma condio for satisfeita. Sntaxe: if ( condio ) instruo; onde condio a expresso que est sendo avaliada. Se a condio for verdadeira (valor diferente de 0), a instruo executada. Se for falso (valor igual a 0), a instruo ignorada (no executada) e o programa continua na prxima instruo depois da estrutura condicional. Exemplo: #include <conio.h> #include <stdio.h> int main() { float N1, N2, Media; printf("\nDigite a nota do bimestre 1: "); scanf("%f", &N1); printf("\nDigite a nota do bimestre 2: "); scanf("%f", &N2); Media = (N1 + N2)/2; if (Media > 7) printf("\nParabns voc foi aprovado com mdia %5.2f", Media); getch(); } Se for necessrio executar mais de uma nica instruo caso da condio ser verdadeira, precisa-se especificar um bloco de instrues usando chaves { }: Sntaxe: if ( condio ) { instrues; }

Prof. Dr. Dlcio Cardim

Pgina 21

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Exemplo: #include <conio.h> #include <stdio.h> int main() { float N1, N2, Media; printf("\nDigite a nota do bimestre 1: "); scanf("%f", &N1); printf("\nDigite a nota do bimestre 2: "); scanf("%f", &N2); Media = (N1 + N2)/2; if (Media > 7) } printf("\nSua mdia = %5.2f", Media) printf("\nParabns voc foi aprovado"); } getch(); } 8.2. A Estrutura if - else Pode-se especificar tambm o que queremos que acontea caso a condio no seja satisfeita usando a palavra-chave else. Sntaxe: if ( condio ) instruo; else instruo; ou if (condio) { instrues } else { instrues }

Exemplo: #include <conio.h> # include <stdio.h> int main() { float N1, N2, Media; printf("\nDigite a nota do bimestre 1: "); scanf("%f", &N1); printf("\nDigite a nota do bimestre 2: "); scanf("%f", &N2); Media = (N1 + N2)/2; if (Media > 7) { printf("\nSua mdia foi %5.2f", Media); printf("\nPARABNS VOC FOI APROVADO"); } else { printf("\Sua mdia foi %5.2f", Media); printf("\nINFELIZMENTE VOC NO FOI APROVADO"); } getch(); }
Prof. Dr. Dlcio Cardim Pgina 22

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

As estruturas if + else podem ser concatenadas com a inteno de verificar um intervalo de valores. Sntaxe: if ( condio 1) instruo 1; else if (condio 2) instruo 2; else if (condio 3) instruo 3; else instruo 4; Exemplo: #include <conio.h> #include <stdio.h> int main() { float N1, N2, Media; printf("\nDigite a nota do bimestre 1: "); scanf("%f", &N1); printf("\nDigite a nota do bimestre 2: "); scanf("%f", &N2); Media = (N1 + N2)/2; if (Media >= 7) { printf("\nSua mdia foi %5.2f", Media); printf("\nPARABNS VOC FOI APROVADO"); } else if (Media >= 4) { printf("\nSua mdia foi %5.2f", Media); printf("\nVOC FICOU DE EXAME - ESTUDE MAIS"); } else { printf("\nSua mdia foi %5.2f", Media); printf("\nVOC FICOU DE DP - AT O PRXIMO ANO!"); } getch(); }

8.3. A Estrutura switch A estrutura switch uma estrutura de deciso que permite a execuo de um conjunto de instrues a partir de pontos diferentes conforme o resultado de uma expresso inteira de controle.

Prof. Dr. Dlcio Cardim

Pgina 23

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Sintaxe: switch (expresso) { case constante1: instrues; break; case constante2: instrues; break; case constante3: instrues; break; default: // opcional instrues; } A estrutura switch avalia a expresso entre parnteses e compara seu valor com os rtulos dos casos. A expresso deve ser um valor inteiro ou caractere. No se pode usar uma varivel e nem uma expresso lgica para rtulos de casos, s se deve rotular um caso por uma constante do tipo inteiro ou caractere ou por uma expresso constante. Se um caso for igual ao valor da expresso, a execuo comea nele. Se nenhum caso for satisfeito e existir um caso defaut: a execuo comear nele, seno o programa processar as instrues seguintes ao bloco switch. O comando break causa uma sada imediata do switch. Se no existir um comando break seguindo as instrues de um caso, o programa segue executando todas as instrues dos casos seguintes. Exemplo: Reajuste de salrios conforme a profisso #include <stdio.h> #include <stdlib.h> int main() { float salario, sal_reaj; int op; system("cls"); printf("Informe seu salario atual: "); scanf("%f",&salario); printf("\nQual a sua profisso? - Escolha uma opo: "); printf("\n1 - Analista"); printf("\n2 - Advogado"); printf("\n3 - Programador"); printf("\n4 - Mecnico"); printf("\n5 - Nenhuma das anteriores");
Prof. Dr. Dlcio Cardim Pgina 24

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("\nOpo: "); scanf("%d", &op); switch (op) { case 1: sal_reaj = salario * 1.3; printf("\nSeu novo salario %.2f", sal_reaj); break; case 2: sal_reaj = salario * 1.1; printf("\nSeu novo salario %.2f", sal_reaj); break; case 3: sal_reaj = salario * 1.25; printf("\nSeu novo salario %.2f", sal_reaj); break; case 4: sal_reaj = salario * 1.15; printf("\nSeu novo salario %.2f", sal_reaj); break; case 5: sal_reaj = salario * 1.05; printf("\nSeu novo salario %.2f", sal_reaj); break; default: printf("\nOpo invlida"); } system("\npause"); }

9. ESTRUTURAS DE REPETIO
As estruturas de repetio permitem que um bloco de instrues seja executado repetidamente uma quantidade controlada de vezes. Em C existem trs estruturas de repetio: while, do-while e for.

9.1. Estrutura while Sntaxe: while( condio ) { instrues; } Na estrutura while a condio avaliada em primeiro lugar. Se a condio for verdadeira o bloco de instrues executado uma vez e a condio avaliada novamente.
Prof. Dr. Dlcio Cardim Pgina 25

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Caso a condio seja falsa a repetio terminada sem a execuo do bloco de instrues. Observe que o bloco de instrues pode no ser executado nenhuma vez, basta que a condio seja inicialmente falsa. Exemplo: Imprime a tabuada de um nmero dado #include <stdio.h> #include <stdlib.h> int main() { int N, cont = 1; system("cls"); printf("Qual o n que deseja calcular a tabuada: "); scanf("%d",&N); while (cont <= 10) { printf("\n%d x %d = %d", cont, N, cont*N); cont++; } system("pause"); }

9.2. Estrutura do-while Sntaxe: do { instrues; } while (condio); Esta estrutura faz com que o bloco de instrues seja executado pelo menos uma vez. Aps a execuo do bloco, a condio avaliada. Se a condio verdadeira o bloco executado outra vez, caso contrrio a repetio terminada Exemplo: Verifica entre 50 alunos quem obteve aprovao #include <stdio.h> #include <stdlib.h> int main() { float N1, N2, Media; int cont = 1; do { system("cls"); printf("Entre com as duas notas: ");
Prof. Dr. Dlcio Cardim Pgina 26

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

scanf("%f%f",&N1, &N2); Media = (N1 + N2)/2; printf("\nMdia = %.2f", Media); if (Media >= 7) printf("\nAluno aprovado - Parabns"); else if (Media >= 4) printf("\nAluno de exame - Estude mais"); else printf("\nAluno de DP - At o prximo ano\n"); cont++; system("pause"); } while (cont <= 3); }

9.3. Estrutura for A estrutura for utilizada geralmente quando se conhece o nmero de repeties. A contagem das repeties feita por uma varivel chamada de contador. A estrutura for , as vezes, chamada de estrutura de repetio com contador. Sintaxe: for (inicializao; condio; incremento) { instrues } onde: inicializao uma expresso de inicializao do contador. condio uma expresso lgica de controle de repetio. incremento uma expresso de incremento do contador. instrues um conjunto de instrues a ser executado. O contador inicializado na expresso de inicializao antes do primeiro loop. Por exemplo: i = 1; ou cont = 20;. Ento o bloco de instrues executado e depois de cada loop, o contador incrementado de acordo com a expresso de incremento. Por exemplo: i++ ou cont -= 2. Ento a expresso de condio avaliada: se a condio for verdadeira, o bloco de instrues executado novamente e o ciclo recomea, se a condio falsa termina-se o lao. Esta condio , em geral, uma expresso lgica que determina o ultimo valor do contador. Por exemplo: i <= 50 ou cont > 0. Exemplo:Soma os n primeiros nmeros mltiplos de 3. #include <stdio.h> #include <stdlib.h> int main() { int soma, n, i; system("cls"); printf("Quantos mltiplos de 3 deseja somar: ");
Prof. Dr. Dlcio Cardim Pgina 27

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

scanf("%d",&n); soma = 0; for (i=1; i<=n; i++) { soma += 3*i; //igual a soma = soma + 3*i } printf("\nSoma dos %d primeiros mltiplos de 3 = %d", n, soma); system("pause"); }

10. MATRIZES
Matriz um tipo de dado usado para representar uma certa quantidade de variveis de mesmo tipo. Os elementos so agrupados sob o mesmo nome e diferenciados entre si atravs de ndices.

10.1. Matrizes de uma Dimenso ou Vetores Um vetor representado por seu nome, tamanho (dimenso) entre colchetes e seu tipo. Sintaxe: tipo nome[tamanho]; Exemplo: Definindo um vetor para armazenar as notas de 20 alunos. float Notas[20]; As matrizes tem 0 como ndice do primeiro elemento, portanto sendo declarada uma matriz de 20 elementos, o ndice varia de 0 a 19. Para acessar a nota de um aluno deve-se informar o nome do vetor seguido de um ndice inteiro. Exemplo: Imprime a nota do quinto aluno. printf("Nota = %f", Notas[4]); Porque 4? Porque a nota do quinto aluno est armazenado no ndice 4 do vetor, pois o primeiro ndice 0 (zero). Na declarao de um vetor estamos reservando espao de memria para os elementos de um vetor. A quantidade de memria (em bytes) usada para armazenar um vetor pode ser calculada como: quantidade de memria = tamanho do tipo * tamanho do vetor
Prof. Dr. Dlcio Cardim Pgina 28

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Assim, no exemplo anterior, a quantidade de memria utilizada pelo vetor Notas : 80 = (4 x 20) bytes. As matrizes tambm podem ser inicializadas em sua declarao utilizando-se chaves e os valores separados por vrgula respectivamente em suas posies. Exemplos: int dia[6] = {25, 17, 30, 10, 14, 19}; ou int dia[] = {25, 17, 30, 10, 14, 19}; float nota[5] = {8.4, 6.9, 4.5, 4.6, 7.2}; char vogal[5] = {'a, e, i, o, u'}; Note que o vetor dia foi definido de duas maneiras, na segunda maneira no foi informado o nmero de posies. Isto porque quando inicializamos uma matriz o compilador conta quantos elementos separamos por vrgula e assume este nmero como a quantidade de posies da matriz. Exemplo: O programa a seguir l as notas de 20 alunos e armazena em um vetor e apresenta a mdia da turma. #include <stdio.h> #include <stdlib.h> int main() { float notas[20]; float media, soma = 0; int i; system("cls"); printf("\nCalculo da media de 20 alunos\n\n"); for (i = 0; i < 20; i++) { printf("Informe a nota %d: ", i+1); scanf("%f", &notas[i]); soma += notas[i]; } media = soma / 20; printf("\nAs notas foram:\n\n"); for (i = 0; i < 20; i++) printf("%5.2f", notas[i]); printf("\n\nMedia da turma: %5.2f\n\n", media); system("pause"); }

10.2. Matrizes com mais de uma Dimenso Uma matriz pode ter mais de uma dimenso, isto , mais de um ndice de referncia. Podemos ter matrizes de duas, trs, ou mais dimenses.

Prof. Dr. Dlcio Cardim

Pgina 29

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Sintaxe: tipo nome[tamanho 1][tamanho 2][tamanho 3] ... [tamanho n]; Exemplo: Definindo uma matriz 5x10. float TAB[5][10]; A matriz TAB uma matriz de duas dimenses, possuindo um tamanho de 5 linhas (de 0 a 4) e 10 colunas (de 0 a 9), ou seja, uma matriz de 5 por 10 (5 x 10). Isto significa que podem ser armazenados em TAB at 50 elementos. Para acessar um determinado elemento da matriz deve-se informar o nome da matriz seguido dos ndices da linha e coluna, respectivamente. Exemplo: Imprime o elemento armazenado na 3 linha e 5 coluna. printf("%f", TAB[2][4]); A 3 linha corresponde ao ndice 2 e a 5 coluna ao ndice 4, pois o primeiro ndice 0 (zero). Exemplo: veja a declarao e inicializao de uma matriz com trs dimenses. int Tabela[3][4][2] = {{{12, 17}, {25, 30}, {40, 42}, {10, 15}}, {{50, 45}, {20, 35}, {60, 75}, {23, 33}}, {{70, 75}, {40, 45}, {18, 28}, {35; 45}}}; Tabela uma matriz de trs dimenses ([][][]). Esta matriz composta de 3 vetores de 4 sub-vetores de 2 elementos cada. Exemplo: O programa a seguir l uma matriz 5x5, imprime seus elementos, imprime os elementos da diagonal principal e a soma dos elementos da diagonal principal.. #include <stdio.h> #include <stdlib.h> #define TAM 5 int main() { int mat[TAM][TAM]; float soma = 0; int i, j; system("cls"); printf("\nEntre com os elementos da matriz\n\n"); for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { printf("Elemento [%d, %d]: ", i, j); scanf("%d", &mat[i][j]);
Prof. Dr. Dlcio Cardim Pgina 30

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

} } system("cls"); printf("Matriz\n\n"); for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) printf("%5d", mat[i][j]); printf("\n"); } printf("\n\nElementos da diagonal principal\n\n"); for (i = 0; i < 5; i++) { printf("%5d", mat[i][i]); soma += mat[i][i]; } printf("\n\nSoma dos elementos da diagonal principal: %5.1f\n\n", soma); system("pause"); }

11. STRINGS
String usada para armazenar e manipular textos como palavras, nomes e sentenas. Em C no existe um tipo de dado string. Uma string um vetor de char terminado pelo caractere null (\0). Por essa razo uma string deve conter uma posio a mais do que o nmero de caracteres que se deseja. No necessrio colocar o ltimo elemento \0, que colocado pelo compilador. A declarao geral para uma string : char nome[tamanho];

11.1. Funes teis para Manipular Strings Para us-las, voc deve incluir o cabealho string.h no incio dos seus arquivos. gets: l uma string do teclado. Sintaxe: gets ( nome_da_string); Exemplo: O programa a seguir demonstra o funcionamento da funo gets(): #include <stdio.h> #include <stdlib.h> int main ()
Prof. Dr. Dlcio Cardim Pgina 31

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

{ char nome[50]; printf ("Digite um nome: "); gets (nome); printf ("\n\n O nome e: %s", nome); system("pause >>null"); } puts: imprime uma nica string por vez e pula de linha sozinha. Sintaxe: puts ( nome_da_string); Exemplo: Uso da funo puts() #include <stdio.h> #include <stdlib.h> int main () { char nome[50]; printf ("Digite um nome: "); gets (nome); puts ("O nome digitado foi: "); puts(nome); puts("Nome a partir do quarto caractere"); puts(&nome[3]); system("pause >>null"); } As instrues a seguir tm o mesmo efeito: printf(%s\n, nome); puts(nome);

strlen: retorna o tamanho, em caracteres, de uma string dada. O terminador nulo no contado, ou seja, o tamanho do vetor da string deve ser um a mais que o inteiro retornado por strlen(). Sintaxe: strlen ( nome_da_string); Exemplo: #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { int x; char nome[50];
Prof. Dr. Dlcio Cardim Pgina 32

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf ("Digite um nome: "); gets(nome); x = strlen (nome); printf ("\n\nO nome que voce digitou tem tamanho %d", x); system("pause >>null"); } strcpy: copia o contedo de uma string para outra e coloca um terminador de string. Sintaxe: strcpy (string_destino, string_origem); Exemplo: #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char nome1[50], nome2[50]; printf ("Digite um nome: "); gets(nome1); strcpy(nome2, nome1); printf ("\n\n %s", nome2); system("pause >>null"); }

// Copia nome1 em nome2

strcat: concatena duas strings, adicionando o contedo da string origem ao final da string destino, alm do terminador (\0). A string destino deve ter espao suficiente para conter a string origem. Sintaxe: strcat (string_destino, string_origem); Exemplo: #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char nome[50], sobrenome[100]; printf ("Digite o primeiro nome da pessoa: "); gets (nome); printf ("Digite o sobrenome da pessoa: "); gets (sobrenome); strcat (nome, sobrenome); printf ("\n\n%s", nome); system("pause >>null"); }

Prof. Dr. Dlcio Cardim

Pgina 33

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

strcmp: compara o contedo de duas strings. Se as duas strings forem idnticas a funo retorna zero, caso contrrio, se as strings forem diferentes a funo retorna um valor diferente de zero. Sintaxe: strcmp (string_1, string_2); Exemplo: #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char string_1[50], string_2[50]; printf ("Entre com a primeira string: "); gets (string_1); printf ("\n\nEntre com a segunda string: "); gets (string_2); if (strcmp(string_1, string_2)) printf ("\n\nAs duas strings sao diferentes."); else printf ("\n\nAs duas strings sao iguais."); system("pause >>null"); }

12. FUNES
Funes (tambm chamadas de rotinas, ou sub-programas) so a essncia da programao estruturada. Uma funo um conjunto de instrues que executam uma determinada tarefa especifica. A principal razo para usar funes a de dividir um programa grande em vrios programas menores que simplificam e organizam o programa como um todo. Esta diviso chamada de modularizao e permite que cada mdulo seja escrito, testado e revisado individualmente sem alterar o funcionamento do programa como um todo. Permite ainda que um programa seja escrito por vrios programadores ao mesmo tempo, cada um escrevendo um mdulo separado.

12.1. Definio de Funes De modo formal, a sintaxe de uma funo a seguinte: tipo nome(tipo arg_1, tipo arg_2, ...) { comandos da funo } A primeira linha da funo contm a declarao da funo. Na declarao de uma funo se define o nome da funo, seu tipo de retorno (se no retornar nada ser void) e
Prof. Dr. Dlcio Cardim Pgina 34

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

a lista de argumentos que recebe. Em seguida, dentro de chaves {}, definimos os comandos da funo. Apenas a primeira linha: tipo nome(tipo arg_1, tipo arg_2, ...) chamada de prottipo da funo, geralmente colocada no incio do programa. Exemplo: O programa a seguir possui uma funo que recebe dois valores e retorna a mdia desses valores. #include <stdlib.h> #include <stdio.h> // Prottipo da funo float media( float x, float y); int main() { float a, b, m; printf("Digite o primeiro valor: "); scanf("%f", &a); printf("\nDigite o segundo valor: "); scanf("%f", &b); m = media(a, b); // chamada da funo printf("\nA media dos valores: %f", m); system("pause >>null"); } // Definio da funo float media(float x, float y) { float r; r = (x + y) / 2.0; return (r); } A funo pode ser definida junto com seu prottipo. Exemplo: #include <stdlib.h> #include <stdio.h> // Definio da funo junto com o prottipo float media(float x, float y) { float r; r = (x + y) / 2.0; return (r); }

Prof. Dr. Dlcio Cardim

Pgina 35

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

int main() { float a, b, m; printf("Digite o primeiro valor: "); scanf("%f", &a); printf("\nDigite o segundo valor: "); scanf("%f", &b); m = media(a, b); // chamada a funo printf("\nA media dos valores: %5.2f", m); system("pause >>null"); }

12.2. Comando return O comando return funciona como uma porta de sada da funo. Ele pode ser usado para devolver um valor e retornar, imediatamente, para a prxima instruo do cdigo de chamada ou pode ser usado para causar uma sada imediata da funo na qual ele se encontra retornando para o prximo comando do cdigo de chamada. Contudo, o fato de um comando return ser encontrado, no significa necessariamente que o mesmo ser executado, pois poder haver um desvio na linha de execuo do cdigo. Assim, pode-se ter um ou mais comandos return numa funo: Exemplo: A funo Uso_return do programa a seguir recebe dois valores inteiros (x e y) e retorna x vezes y se x for maior que y, x mais y se x for igual a y e y menos x se x for menor que y. #include <stdlib.h> #include <stdio.h> int Uso_return(int x, int y) { if(x > y) return x * y; else if(x == y) return x + y; else return (y - x); } int main() { int a, b, m; printf("Digite o primeiro valor: "); scanf("%d", &a); printf("\nDigite o segundo valor: "); scanf("%d", &b); m = Uso_return(a, b); printf("\nResultado: %d", m); system("pause >>null"); }
Prof. Dr. Dlcio Cardim Pgina 36

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

12.3. Parmetros das Funes H duas formas de se passar parmetros para as funes. Uma chamada de passagem de parmetros por valor e a outra passagem de parmetros por referncia. Por Valor: O valor enviado para a funo ser armazenado em uma varivel no prottipo da funo criada quando a funo inicia a sua execuo e destruda quando a funo termina. Exemplo: #include <stdlib.h> #include <stdio.h> int soma(int x) { x = x + 10; printf("\nValor de x: %d", x); } int main() { int y; printf("Digite um valor: "); scanf("%d", &y); soma(y); printf("\nValor de y: = %d", y); system("pause >>null"); }

A sada desse programa ser: Digite um valor: 5 Valor de x: 15 Valor de y: 5

Por Referncia: Neste caso, ao invs de se passar um valor para a funo e esta criar uma varivel dentro da funo, a passagem de parmetros por referncia passa para a funo o endereo de memria da varivel passada como argumento, e portanto, qualquer alterao no parmetro dentro da varivel, tambm ser alterada a varivel que foi passada como parmetro. Exemplo: #include <stdlib.h> #include <stdio.h> int soma(int& x) { x = x + 10; printf("\nValor de x: %d", x); } int main() { int y;
Prof. Dr. Dlcio Cardim Pgina 37

A sada desse programa ser: Digite um valor: 5 Valor de x: 15 Valor de y: 15

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("Digite um valor: "); scanf("%d", &y); soma(y); printf("\nValor de y: %d", y); system("pause >>null"); } Note que a nica diferena na declarao dos argumentos. int& x indica que ali ser armazenado um endereo de alguma varivel e no o seu contedo.

12.4. Classes de Variveis Uma funo pode chamar outras funes, mas o cdigo que compreende o corpo de uma funo (bloco entre {}) est escondido do resto do programa, ele no pode afetar nem ser afetado por outras partes do programa, a no ser que o cdigo use variveis globais. Existem trs classes bsicas de variveis: locais, estticas e globais. - Variveis locais: As variveis que so declaradas dentro de uma funo so chamadas de locais. Na realidade toda varivel declarada entre um bloco { } podem ser referenciadas apenas dentro deste bloco. Elas existem apenas durante a execuo do bloco de cdigo no qual esto declaradas. O armazenamento de variveis locais por default na pilha, assim sendo uma regio dinmica. Exemplo: func1 (...) { int num, x; ... } func2 (...) { int num; ... } int main () { int a, x, y; for (...) { float a, b, c; ... } ... }

Prof. Dr. Dlcio Cardim

Pgina 38

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

No esboo do programa acima tem-se trs funes. As variveis locais de cada uma delas no iro interferir com as variveis locais de outras funes. Assim, a varivel num de func1() no tem nada a ver (e pode ser tratada independentemente) com a varivel num de func2(). A varivel x de func1() tambm completamente independente da varivel x de main(). As variveis a, b e c so locais ao bloco for. Isto quer dizer que s so conhecidas dentro deste bloco for e so desconhecidas no resto da funo main(). Quando usarmos a varivel a dentro do bloco for estaremos usando a varivel a local ao for e no a varivel a da funo main(). - Variveis Globais: So conhecidas por todo programa e podem ser usadas em qualquer parte do cdigo. Permanecem com seu valor durante toda execuo do programa. Deve ser declarada fora de qualquer funo e at mesmo antes da declarao da funo main. Quando uma funo tem uma varivel local com o mesmo nome de uma varivel global a funo dar preferncia varivel local. Exemplo: int a, b; func1 (...) { int x, y; ... } func2 (...) { int x, y, a; ... a = 40; ... } main () { int count; ... } No exemplo acima as variveis a e b so globais. Veja que func2() tem uma varivel local chamada a. Quando temos ento, em func2(), o comando a = 40 quem recebe o valor de 40 a varivel local, no afetando o valor da varivel global a. Evite ao mximo o uso de variveis globais. Elas ocupam memria o tempo todo (as locais s ocupam memria enquanto esto sendo usadas) e tornam o programa mais difcil de ser entendido e menos geral. - Variveis Estticas: Funcionam de forma parecida com as variveis globais, conservando o valor durante a execuo de diferentes funes do programa. No entanto s so reconhecidas na funo onde esto declaradas.

Prof. Dr. Dlcio Cardim

Pgina 39

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Exemplo: #include <stdio.h> #include <stdlib.h> int i; void func ( ) { static int a = 0; int b = 10; printf ("a = %3d; b = %3d;", a, b); b = i + 20; printf (" b = %3d;\n", b); a += 5; } int main ( ) { for (i = 1; i <= 5; i++) func ( ); system("pause >>null"); } So muitas utilizadas para inicializar vetores. Exemplo: int main() { int i; static int x[10]={0,1,2,3,4,5,6,7,8,9}; for(i=0;i<10;i++) printf("%d\n",x[i]); } A sada desse programa ser: a = 0; a = 5; a = 10; a = 15; a = 20; b = 10; b = 10; b = 10; b = 10; b = 10; b = 21; b = 22; b = 23; b = 24; b = 25;

12.5. Funes com Matrizes Matrizes de uma ou mais dimenses, assim como variveis, podem ser usados como argumentos de funes. Na declarao de funes que recebem vetores usa-se a seguinte sintaxe: tipo_funo nome_funo(tipo_vetor nome_vetor[]) { comandos da funo; } onde: tipo_funo: o tipo de retorno da funo.
Prof. Dr. Dlcio Cardim Pgina 40

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

nome_funo: o nome da funo. tipo_vetor: o tipo de elementos do vetor. nome_vetor: o nome do vetor. Observe que depois do nome do vetor temos um ndice vazio [] para indicar que estamos recebendo um vetor. Na passagem de vetores para funes usa-se a seguinte sintaxe: nome_da_funo(nome_do_vetor) onde: nome_da_funo: o nome da funo que se est chamando. nome_do_vetor: o nome do vetor que queremos passar. Indicamos apenas o nome do vetor, sem ndices. Exemplo: O programa a seguir contm trs funes que recebe como parmetro um vetor, uma faz a leitura dos elementos do vetor, outra imprime seus elementos e a outra retorna a mdia dos elementos armazenados no vetor. #include <stdlib.h> #include <stdio.h> int Imprime_vetor(int vet2[]) { int j; system("cls"); printf("Dados armazenado no vetor:\n\n"); for (j = 0; j < 5; j++) { printf("%d ", vet2[j]); } system("pause >>null"); } int Ler_vetor(int vet2[]) { int i; system("cls"); printf("\nEntre com os elementos do vetor\n\n"); for (i = 0; i < 5; i++) { printf("Elemento [%d]: ", i); scanf("%d", &vet2[i]); } } float Media_vetor(int vet2[]) { int j; float s = 0;
Prof. Dr. Dlcio Cardim Pgina 41

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

for (j = 0; j < 5; j++) { s += vet2[j]; } return(s/5); } int main() { int vet[5]; int i, op; do { system("cls"); printf("\n1 - Ler dados do vetor"); printf("\n2 - Imprimir vetor"); printf("\n3 - Mdia dos elementos"); printf("\n0 - Sair"); printf("\nOpcao: "); scanf("%d", &op); switch (op) { case 1: Ler_vetor(vet); //passagem do vetor para a funo break; case 2: Imprime_vetor(vet); //passagem do vetor para a funo break; case 3: float m; m = Media_vetor(vet); //passagem do vetor para a funo system("cls"); printf("\nMedia = %5.2f", m); system("pause >>null"); break; default: break; } } while (op != 0); } Ao contrrio das variveis comuns, o contedo de um vetor pode ser modificado pela funo chamada. Isto significa que podemos passar um vetor para uma funo e alterar os valores de seus elementos. Isto ocorre porque a passagem de vetores para funes feita por referncia, ou seja, passado o endereo do vetor. Portanto devemos ter cuidado ao manipularmos os elementos de um vetor dentro de uma funo para no modific-los por descuido.

Prof. Dr. Dlcio Cardim

Pgina 42

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Na declarao de funes que recebem matrizes usa-se a seguinte sintaxe: tipo_funo nome_funo(tipo_matriz nome_matriz[tam_1][tam_2]) { comandos da funo; } Exemplo: O programa a seguir contm trs funes que recebe como parmetro uma matriz, uma faz a leitura dos elementos da matriz, outra imprime seus elementos e a outra retorna o maior valor armazenado na matriz. #include <stdlib.h> #include <stdio.h> int Imprime_matriz(int mat2[4][5]) { int i, j; system("cls"); printf("Dados armazenado na matriz:\n\n"); for (j = 0; j < 4; j++) { for (i = 0; i < 5; i++) printf("%6d ", mat2[j][i]); printf("\n\n"); } system("pause >>null"); } int Ler_matriz(int mat2[4][5]) { int i, j; system("cls"); printf("\nEntre com os elementos do vetor\n\n"); for (i = 0; i < 4; i++) { for (j = 0; j < 5; j++) { printf("Elemento [%d, %d]: ", i, j); scanf("%d", &mat2[i][j]); } } } int maximo(int mat2[4][5]) { int i, j; int max = mat2[0][0]; for (i = 0; i < 4; i++) {
Prof. Dr. Dlcio Cardim Pgina 43

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

for (j = 0; j < 5; j++) { if (mat2[i][j] > max) max = mat2[i][j]; } } return(max); } int main() { int mat[4][5]; int i, op, j; do { system("cls"); printf("\n1 - Ler dados da matriz"); printf("\n2 - Imprimir matriz"); printf("\n3 - Maior valor armazenado na matriz"); printf("\n0 - Sair"); printf("\nOpcao: "); scanf("%d", &op); switch (op) { case 1: Ler_matriz(mat); //passagem da matriz para a funo break; case 2: Imprime_matriz(mat); //passagem da matriz para a funo break; case 3: system("cls"); printf("\nMaior valor armazenado na matriz: %d", maximo(mat)); system("pause >>null"); break; default: break; } } while (op != 0); }

12.6. Funes Recursivas A recursividade talvez seja a mais importante vantagem das funes em C. Uma funo recursiva quando dentro dela est presente uma chamada a si prpria. Para que esta chamada no se repita indefinidamente, necessrio que ela seja feita dentro de uma estrutura condicional.

Prof. Dr. Dlcio Cardim

Pgina 44

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Exemplo: Clculo do fatorial de um nmero. A definio de fatorial : n! = n . (n-1) . (n-2) . ... . 3 . 2 . 1 0! = 1 onde: n um numero inteiro positivo. Uma propriedade (facilmente verificvel) dos fatoriais que: n! = n . (n-1)! Esta propriedade chamada de propriedade recursiva: o fatorial de um numero pode ser calculado atravs do fatorial de seu antecessor. Ora, podemos utilizar esta propriedade para escrevermos uma rotina recursiva para o calculo de fatoriais. Para criarmos uma rotina recursiva, em C, basta criar uma chamada a prpria funo dentro dela mesma. O programa a seguir tem uma rotina recursiva que calcula o fatorial de um nmero inteiro e positivo. #include <stdio.h> #include <stdlib.h> int fat(int n) { int f; if (n > 0) f = n * fat(n-1); else f = 1; return (f); } int main() { int n, x; printf("Digite o valor de n: "); scanf("%d", &n); x = fat(n); printf("\n\nFatorial de %d = %d\n", n, x); system("pause >>null"); } Exemplo: Clculo do n-simo nmero da srie de Fibonacci. F = {1 1 2 3 5 8 13 21 34 55.........} #include <stdio.h> #include <stdlib.h> int fibonacci(int n) { if (n == 0) return 0; if (n == 1) return 1;
Prof. Dr. Dlcio Cardim Pgina 45

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

return fibonacci(n - 1) + fibonacci(n - 2); } int main() { int n, x; printf("Digite o termo da serie: "); scanf("%d", &n); printf("\n\nO %d termo da serie de fibonacci = %d" , n, fibonacci(n)); system("pause >>null"); }

13. PONTEIROS Ponteiros so variveis que armazenam endereos de memria e so utilizadas por 3 razes especficas na programao: permitem a modificao de argumentos de funes: permitem que uma funo altere valores de variveis no globais e no locais a ela atravs da referncia ao endereo de memria da varivel passada como parmetro para a funo; permitem o uso de rotinas de alocao dinmica de memria: alocao e desalocao de memria em tempo de execuo conforme a necessidade do programa; aumento de eficincia em determinadas rotinas. Em C quando se declara ponteiros informa-se ao compilador para que tipo de varivel vai apont-lo. Um ponteiro int aponta para um inteiro, isto , guarda o endereo de um inteiro. Sintaxe: Tipo *nome_varivel; onde: tipo: o tipo de varivel apontada pela varivel ponteiro. *: o operador que indica que nome_varivel um ponteiro Exemplo: int *p; float* a, b

// p um ponteiro de int // a e b so ponteiros de float

O ponteiro p aponta para o primeiro endereo de um uma regio de memria que armazena um valor int (dois bytes). Na declarao de a e b, observe que o * est justaposto ao tipo: assim todos os elementos da lista sero declarados ponteiros.

Prof. Dr. Dlcio Cardim

Pgina 46

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

13.1 Operadores para Ponteiros Quando se trabalha com ponteiros, se quer fazer duas coisas basicamente: conhecer endereo de uma varivel (operador de endereo: &). conhecer o contedo de um endereo (operador de contedo: *). O operador de endereo (&) determina o endereo de uma varivel (o primeiro byte do bloco ocupado pela varivel). Exemplo: &valor determina o endereo do bloco ocupado pela varivel nome. Esta informao no totalmente nova, pois j a usamos antes: na funo scanf(). Quando se escreve a instruo: scanf("%d", &valor); est-se referindo ao endereo do bloco ocupado pela varivel valor. Exemplo: Para se atribuir a um ponteiro o endereo de uma varivel escreve-se: int *p, int valor =20; p = &valor // declarao de ponteiro // declarao de varivel // p recebe o endereo de memria da varivel valor

No exemplo criou-se um inteiro valor com o valor 20 e um apontador para um inteiro p. A expresso &valor nos d o endereo de valor, o qual se armazenou em p. Repare que no se alterou o valor de valor, que continua valendo 20. Como se colocou um endereo em p, ele est agora "liberado" para ser usado. Podese, por exemplo, alterar o valor de valor usando p. Para tanto usar-se o operador "inverso" do operador &, que o operador *. No exemplo acima, uma vez que p = &valor a expresso *p equivalente ao prprio valor. Isto significa que, se quisermos mudar o valor de valor para 40, basta fazer *p = 40. Observaes: O operador endereo (&) somente pode ser usado em uma nica varivel. No pode ser usado em expresses como, por exemplo, &(a+b). O operador contedo (*) somente pode ser usado em variveis ponteiros. Exemplo: #include <stdio.h> #include <stdlib.h> int main () { int n = 100, v; int *p;
Prof. Dr. Dlcio Cardim Pgina 47

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

p = &n; //p recebe o endereo de n v = *p; //v recebe o valor armazenado no endereo de p printf ("\n\nValor de n: %d", n); printf ("\nValor de v: %d", v); printf ("\nEndereco para onde o ponteiro aponta: %p", p); printf ("\nValor da variavel apontada: %d", *p); system ("pause >>null"); } Sada do programa: Valor de n: 100 Valor de v: 100 Endereco para onde o ponteiro aponta: 0022FF74 Valor da variavel apontada: 100 Outro exemplo: #include <stdio.h> #include <stdlib.h> int main () { int n = 100, *p; p=&n; //p recebe o endereo de n printf ("\n\nValor inicial de n: %d", n); *p = 200; //Altera o valor de n de uma maneira indireta printf ("\nValor final de n: %d", n); system ("pause >>null"); } Sada do programa: Valor inicial de n: 100 Valor final de n: 200

13.2 Operaes com Ponteiros Existem uma srie de operaes (aritmticas, lgicas, etc.) envolvendo ponteiros que so permitidas e outras no. Pode-se atribuir a um ponteiro o endereo de uma varivel comum. Exemplo: int *pont; int valor; pont = &valor;

// o ponteiro pont recebe o endereo da varivel valor

Pode-se atribuir a um ponteiro o valor de outro ponteiro, isto , um ponteiro pode receber o endereo de outro ponteiro, desde que os ponteiros sejam de mesmo tipo.

Prof. Dr. Dlcio Cardim

Pgina 48

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Exemplo: float *p1, *p2, valor; p1 = &valor; // p1 recebe o endereo de valor p2 = p1; // ...e p2 recebe o contedo de p1 (endereo de valor) Uma quantidade inteira pode ser adicionada ou subtrada de um ponteiro. Cada vez que um ponteiro incrementado, ele aponta para a posio de memria do prximo elemento do seu tipo base. Cada vez que decrementado, ele aponta para a posio do elemento anterior. Com ponteiros de caracteres, isso frequentemente se parece com a aritmtica normal. Contudo, todos os outros ponteiros incrementam ou decrementam pelo tamanho do tipo de dado que eles apontam. Por exemplo, assumindo caracteres de 1 byte e inteiros de 2 bytes, quando um ponteiro caracteres incrementado, seu valor aumenta em um. Porm, quando um ponteiro inteiro incrementado, seu valor aumenta em dois. A figura a seguir ilustra esse conceito. char *ch = 3000; int *p = 3000; Memria
Ch ch + 1 ch + 2 ch + 3 ch + 4 ch + 5 3000 3001 3002 3003 3004 3005

p+1

p+2

Figura 12.1 Toda aritmtica de ponteiros relativa a seu tipo base No se est limitado a apenas incremento e decremento. Pode-se somar e subtrair quaisquer inteiros em ponteiros. Exemplo: int *p1, *p2, valor; p1 = &valor p2 = p1 + 10; p1 = p2 - 5;

// p2 aponta para o dcimo bloco depois de p1 // p1 aponta para o quinto bloco anterior a p2

Dois ponteiros podem ser comparados (usando-se operadores lgicos) desde que sejam de mesmo tipo. Exemplo: if (p1 == p2) { ... } // se p1 aponta para o mesmo bloco que p2. if (p1 > p2) { ... } // se p1 aponta para um bloco posterior a p2. IF (p1 != p2) { ... } // se p1 aponta para um bloco diferente de p2.

Prof. Dr. Dlcio Cardim

Pgina 49

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

13.3 Ponteiros e Matrizes Matrizes como ponteiros Quando se declara uma matriz: tipo nome_matriz [tam1][tam2] ... [tamN]; o compilador C calcula o tamanho, em bytes, necessrio para armazenar esta matriz. Este tamanho : tam1 x tam2 x tam3 x ... x tamN x tamanho_do_tipo O compilador ento aloca este nmero de bytes em um espao livre de memria. O nome da varivel que voc declarou na verdade um ponteiro para o tipo da varivel da matriz. Tendo alocado na memria o espao para a matriz, ele toma o nome da varivel (que um ponteiro) e aponta para o primeiro elemento da matriz. Mas a surge a pergunta: ento como que se pode usar a seguinte notao? nome_matriz[ndice] Isto pode ser facilmente explicado desde que voc entenda que a notao acima absolutamente equivalente a se fazer: *(nome_matriz + ndice) A varredura seqencial de uma matriz. Para varrer todos os elementos de uma matriz de uma forma sequencial, pode-se usar um ponteiro, o qual incrementando. Exemplo: O programa a seguir atribui o valor 10.0 para toda a matriz. #include <stdio.h> #include <stdlib.h> int main () { float mat [5][5]; int i, j; for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) mat[i][j] = 10.0; printf("\nDados da Matriz\n\n"); for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) printf("%7.1f", mat[i][j]); printf("\n\n"); } system ("pause >>null"); }
Prof. Dr. Dlcio Cardim Pgina 50

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

A atribuio dos valores pode ser reescrito usando ponteiros da seguinte forma: #include <stdio.h> #include <stdlib.h> int main () { float mat [5][5]; int i; float *p; p = mat[0]; for (i = 0; i < 25; i++) { *p = 10.0; p++; } p = mat[0]; printf("\nDados da Matriz\n\n"); for (i = 0; i < 25; i++) { printf("%7.1f", *p); p++; printf("\n"); } system ("pause >>null"); } ou #include <stdio.h> #include <stdlib.h> int main () { float mat [5][5]; int i; float *p; p = mat[0]; for (i = 0; i < 25; i++) *(p+i) = 10.0; printf("\nDados da Matriz\n\n"); for (i = 0; i < 25; i++) { printf("%7.1f", *(p+i)); printf("\n"); } system ("pause >>null"); }

Ponteiros como matrizes Na verdade o nome de um vetor um ponteiro constante. Sabe-se tambm que se pode indexar o nome de um vetor. Como consequncia pode-se tambm indexar um ponteiro qualquer. Exemplo: O programa a seguir funciona perfeitamente: #include <stdio.h> #include <stdlib.h> int main () { int vet [5] = {10, 20, 30, 40, 50} ; int *p; p = vet; printf ("O terceiro elemento do vetor e: %d", p[2]); system ("pause >>null"); } Obs: p[2] equivale a *(p+2)

Prof. Dr. Dlcio Cardim

Pgina 51

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Matrizes de ponteiros Pode-se construir vetores de ponteiros como se declara vetores de qualquer outro tipo. Exemplo: int *vet [10]; vet um vetor que armazena 10 ponteiros para inteiros. Para atribuir o endereo de uma varivel inteira chamada valor ao terceiro elemento do vetor de ponteiros: vet[2] = &valor; Para verificar o contedo de valor: *vet[2]

Ponteiros para ponteiros Um ponteiro para um ponteiro uma forma de indicao mltipla. Num ponteiro normal, o valor do ponteiro o valor do endereo da varivel que contm o valor desejado. Nesse caso o primeiro ponteiro contm o endereo do segundo, que aponta para a varivel que contm o valor desejado Sintaxe: tipo_da_varivel **nome_da_varivel; Exemplo: #include <stdio.h> #include <stdlib.h> int main() { int a,*p1,**p2; //p2 um ponteiro para um ponteiro int. a = 40; p1 = &a; p2 = &p1; printf("%d",**p2); system ("pause >>null"); }

Ponteiros como parmetros de funo Quando for necessrio alterar o valor de um parmetro, dever passar para a funo um ponteiro para um parmetro.
Prof. Dr. Dlcio Cardim Pgina 52

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Exemplo: O programa a seguir usa os ponteiros para dois parmetros do tipo int para permutar os valores das variveis. #include <stdio.h> #include <stdlib.h> void troca(int *a, int *b) { int temp; temp = *a; // Armazena temporariamente o valor apontado por a *a = *b; // Atribui o valor de b a a *b = temp; // Atribui o valor de a a b } int main() { int x = 10, y = 20; troca(&x, &y); printf("x = %d \ny = %d\n", x, y); system ("pause >>null"); } O programa passa o endereo de cada varivel para a funo usando o operador de endereo (&). Dentro da funo necessrio usar o operador (*) quando referenciar os parmetros, ou seja, os parmetros so ponteiros.

14. ESTRUTURAS Estrutura uma coleo de variveis, possivelmente de tipos diferentes, referenciadas por um nome (Estruturas so chamadas registros em algumas linguagem). As variveis que compreendem a estrutura so chamadas membros da estrutura. Os membros da estrutura so comumente chamados elementos ou campos. Sintaxe: struct nome_da_estrutura { tipo_1 nome_da_varivel_1; tipo_2 nome_da_varivel_2; tipo_3 nome_da_varivel_3; ... tipo_n nome_da_varivel_n; } variveis estrutura; Onde: struct a palavra reservada para criar uma estrutura.; nome_da_estrutura o identificador da estrutura (ETIQUETA da estrutura); nome_da_varivel_1, nome_da_varivel_2, ... so os membros da estrutura; variveis_estrutura so opcionais e seriam nomes de variveis que o usurio j estaria declarando e que seriam do tipo nome_da_estrutura.

Prof. Dr. Dlcio Cardim

Pgina 53

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Obs: nome_da_estrutura ou variveis_estrutura podem ser omitidos, mas no ambos. Para acessar um membro de uma estrutura informa-se seu nome.membro. Exemplo: O programa a seguir define uma estrutura com 4 campos, faz a leitura e imprime os campos. #include <stdlib.h> #include <stdio.h> int main() { struct reg_aluno{ //definio de uma estrutura char nome[30]; //campos long int RA; float n1, n2; } aluno; printf("Nome do aluno: "); gets(aluno.nome); printf("RA do aluno: "); scanf("%d", &aluno.RA); printf("Nota 1: "); scanf("%f", &aluno.n1); printf("Nota 2: "); scanf("%f", &aluno.n2); system("cls"); printf("\nRA: %6d", aluno.RA); printf("\nNome: "); puts(aluno.nome); printf("Nota 1: %6.2f", aluno.n1); printf("\nNota 2: %6.2f", aluno.n2); system("pause >> null"); }

14.1 Tipo Estrutura No exemplo anterior as seguintes instrues definem o tipo estrutura: int main() { struct reg_aluno{ char nome[30]; long int RA; float n1, n2; };

Prof. Dr. Dlcio Cardim

Pgina 54

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Estas instrues definem um novo tipo de dado chamado struct reg_aluno. A etiqueta no o nome de uma varivel, isto , no se declarou uma varivel. Etiqueta um nome de um tipo. Para declarar uma ou mais variveis deste tipo, basta defini-las do tipo struct reg_aluno. struct reg_aluno aluno1, aluno2; ou struct reg_aluno aluno1; struct reg_aluno aluno2;

14.2 Atribuies entre Estruturas O valor de uma varivel estrutura pode ser atribudo a outra varivel estrutura do mesmo tipo. A seguinte expresso pode ser usada: aluno1 = aluno2; Exemplo: #include <stdlib.h> #include <stdio.h> int main() { struct reg_aluno{ char nome[30]; long int RA; float n1, n2; }; struct reg_aluno aluno1, aluno2; //definindo as variveis tipo reg_aluno printf("Nome do aluno: "); gets(aluno1.nome); printf("RA do aluno: "); scanf("%d", &aluno1.RA); printf("Nota 1: "); scanf("%f", &aluno1.n1); printf("Nota 2: "); scanf("%f", &aluno1.n2); aluno2 = aluno1; //atribuindo contedo de aluno1 para aluno2 system("cls"); printf("\nRA: %6d", aluno2.RA); printf("\nNome: "); puts(aluno2.nome); printf("Nota 1: %6.2f", aluno2.n1); printf("\nNota 2: %6.2f", aluno2.n2); system("pause >> null"); }
Prof. Dr. Dlcio Cardim Pgina 55

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

14.3 Estruturas Aninhadas

Como se pode ter matrizes de matrizes, pode-se ter estruturas que contm outras estruturas. Exemplo: O programa a seguir cria uma estrutura reg_aluno. Um campo dessa estrutura do tipo reg_endereco, que outra estrutura. #include <stdlib.h> #include <stdio.h> int main() { struct reg_endereco{ char rua[30]; int num; char bairro[30]; }; struct reg_aluno{ char nome[30]; long int RA; struct reg_endereco endereco; float n1, n2; }; struct reg_aluno aluno; printf("Nome do aluno: "); gets(aluno.nome); printf("RA do aluno: "); scanf("%d", &aluno.RA); printf("Endereco -> Rua: "); gets(aluno.endereco.rua); printf("Endereco -> Numero casa: "); scanf("%d", &aluno.endereco.num); printf("\nEndereco -> Bairro: "); gets(aluno.endereco.bairro); printf("Nota 1: "); scanf("%f", &aluno.n1); printf("Nota 2: "); scanf("%f", &aluno.n2); system("cls"); printf("\nRA: %6d", aluno.RA); printf("\nNome: "); puts(aluno.nome); printf("\nEndereco: "); printf("\n Rua: ");
Prof. Dr. Dlcio Cardim Pgina 56

//endereco uma estrutura tipo reg_endereco

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

puts(aluno.endereco.rua); printf("\n Numero: %d", aluno.endereco.num); printf("\n Bairro: "); puts(aluno.endereco.bairro); printf("Nota 1: %6.2f", aluno.n1); printf("\nNota 2: %6.2f", aluno.n2); system("pause >> null"); }

14.4 Passando Estruturas para Funes Pode-se passar para uma funo uma estrutura completa. Exemplo: O programa a seguir contm uma funo (ler_dados) que retorna os dados do aluno para varivel aluno (varivel do tipo reg_aluno). #include <stdlib.h> #include <stdio.h> struct reg_aluno{ char nome[30]; long int RA; float n1, n2; }; struct reg_aluno ler_dados() { struct reg_aluno r; printf("Nome do aluno: "); gets(r.nome); printf("RA do aluno: "); scanf("%d", &r.RA); printf("Nota 1: "); scanf("%f", &r.n1); printf("Nota 2: "); scanf("%f", &r.n2); return r; } int main() { struct reg_aluno aluno; aluno = ler_dados(); system("cls"); printf("\nRA: %6d", aluno.RA); printf("\nNome: "); puts(aluno.nome);
Prof. Dr. Dlcio Cardim Pgina 57

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("Nota 1: %7.2f", aluno.n1); printf("\nNota 2: %7.2f\n", aluno.n2); system("pause >> null"); } Exemplo: O programa a seguir contm duas funes: a funo ler_dados, que recebe como parmetro uma varivel tipo estrutura (reg_aluno) e retorna por referncia os dados do aluno para varivel aluno (varivel do tipo reg_aluno) e a funo imprime_dados, que recebe por parmetro uma estrutura tipo reg_aluno e imprime os campos dessa estrutura.. #include <stdlib.h> #include <stdio.h> struct reg_aluno{ char nome[30]; long int RA; float n1, n2; }; void ler_dados(struct reg_aluno& reg) { printf("Nome do aluno: "); gets(reg.nome); printf("RA do aluno: "); scanf("%d", &reg.RA); printf("Nota 1: "); scanf("%f", &reg.n1); printf("Nota 2: "); scanf("%f", &reg.n2); } void imprime_dados(struct reg_aluno reg) { printf("\nRA: %6d", reg.RA); printf("\nNome: "); puts(reg.nome); printf("Nota 1: %7.2f", reg.n1); printf("\nNota 2: %7.2f\n", reg.n2); } int main() { struct reg_aluno aluno; ler_dados(aluno); system("cls"); imprime_dados(aluno); system("pause >> null"); }
Prof. Dr. Dlcio Cardim Pgina 58

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

Na funo ler_dados a varivel reg pode ser um ponteiro. Os dados so lidos em uma varivel auxiliar (r) que no final atribudo ao ponteiro reg. void ler_dados(struct reg_aluno *reg) { struct reg_aluno r; printf("Nome do aluno: "); gets(r.nome); printf("RA do aluno: "); scanf("%d", &r.RA); printf("Nota 1: "); scanf("%f", &r.n1); printf("Nota 2: "); scanf("%f", &r.n2); *reg = r; } Neste caso na chamada necessrio passar o endereo da varivel: ler_dados(&aluno);

14.5 Matrizes de Estruturas Pode-se tambm definir um vetor de estruturas. Exemplo: O programa a seguir contm um vetor (alunos[100]) do tipo estrutura reg_aluno, ou seja, no vetor pode-se armazenar at 100 estruturas do tipo reg_aluno. #include <stdlib.h> #include <stdio.h> struct reg_aluno{ char nome[30]; long int RA; float n1, n2; }; int main() { struct reg_aluno alunos[100]; int n, i; printf("Entre com a quantidade de alunos: "); scanf("%d", &n); for (i = 0; i < n; i++) { system("cls"); printf("Aluno %d:", i+1); printf("\nNome: ");
Prof. Dr. Dlcio Cardim Pgina 59

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

gets(alunos[i].nome); printf("RA: "); scanf("%d", &alunos[i].RA); printf("Nota 1: "); scanf("%f", &alunos[i].n1); printf("Nota 2: "); scanf("%f", &alunos[i].n2); } system("cls"); for (i = 0; i < n; i++) { printf("\nRA: %6d", alunos[i].RA); printf("\nNome: "); puts(alunos[i].nome); printf("Nota 1: %7.2f", alunos[i].n1); printf("\nNota 2: %7.2f\n", alunos[i].n2); } system("pause >> null"); } Utilizando funes: #include <stdlib.h> #include <stdio.h> struct reg_aluno{ char nome[30]; long int RA; float n1, n2; }; void ler(struct reg_aluno aluno[], int n) { for ( int i = 0; i < n; i++) { system("cls"); printf("Aluno %d:", i+1); printf("\nNome: "); gets(aluno[i].nome); printf("RA: "); scanf("%d", &aluno[i].RA); printf("Nota 1: "); scanf("%f", &aluno[i].n1); printf("Nota 2: "); scanf("%f", &aluno[i].n2); } }

Prof. Dr. Dlcio Cardim

Pgina 60

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

void imprime(struct reg_aluno aluno[], int n) { for ( int i = 0; i < n; i++) { printf("\nRA: %6d", aluno[i].RA); printf("\nNome: "); puts(aluno[i].nome); printf("Nota 1: %7.2f", aluno[i].n1); printf("\nNota 2: %7.2f\n", aluno[i].n2); } } int main() { struct reg_aluno alunos[100]; int n, i; printf("Entre com a quantidade de alunos: "); scanf("%d", &n); ler(alunos, n); system("cls"); imprime(alunos, n); system("pause >> null"); }

14.6 Ponteiros para Estruturas Pode-se tambm definir ponteiros para estruturas. Exemplo: O programa a seguir mostra como definir um ponteiro para estrutura e us-lo para acessar os membros da estrutura. #include <stdlib.h> #include <stdio.h> int main() { struct reg_aluno{ char nome[30]; long int RA; float n1, n2; }; struct reg_aluno aluno; struct reg_aluno *p_aluno; printf("Nome do aluno: "); gets(aluno.nome); printf("RA do aluno: ");
Prof. Dr. Dlcio Cardim Pgina 61

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

scanf("%d", &aluno.RA); printf("Nota 1: "); scanf("%f", &aluno.n1); printf("Nota 2: "); scanf("%f", &aluno.n2); p_aluno = &aluno; system("cls"); printf("\nRA: %6d", (*p_aluno).RA); printf("\nNome: "); puts((*p_aluno).nome); printf("Nota 1: %6.2f", (*p_aluno).n1); printf("\nNota 2: %6.2f", (*p_aluno).n2); system("pause >> null"); } Existem duas maneiras de acessar os membros de uma estrutura por meio do ponteiro: como no exemplo anterior: (*p_aluno).nome ou p_aluno->nome Exemplo: O programa a seguir mostra como definir um ponteiro para um vetor de estruturas e us-lo para acessar os membros da estrutura no vetor. #include <stdlib.h> #include <stdio.h> int main() { struct reg_aluno{ char nome[30]; long int RA; float n1, n2; }; struct reg_aluno alunos[10]; struct reg_aluno *p_aluno; int i, n; printf("Entre com a quantidade de alunos: "); scanf("%d", &n); for (i = 0; i < n; i++) { printf("Nome do aluno: "); gets(alunos[i].nome); gets(alunos[i].nome);
Prof. Dr. Dlcio Cardim Pgina 62

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("RA do aluno: "); scanf("%d", &alunos[i].RA); printf("Nota 1: "); scanf("%f", &alunos[i].n1); printf("Nota 2: "); scanf("%f", &alunos[i].n2); } p_aluno = &alunos[0]; system("cls"); for (i = 0; i < n; i++) { printf("\nRA: %6d", (*p_aluno).RA); printf("\nNome: "); puts((*p_aluno).nome); printf("Nota 1: %6.2f", (*p_aluno).n1); printf("\nNota 2: %6.2f", (*p_aluno).n2); p_aluno++; } //ou assim p_aluno = &alunos[0]; for (i = 0; i < n; i++) { printf("\n\n\nRA: %6d", (p_aluno+i)->RA); printf("\nNome: "); puts((p_aluno+i)->nome); printf("Nota 1: %6.2f", (p_aluno+i)->n1); printf("\nNota 2: %6.2f", (p_aluno+i)->n2); } system("pause >> null"); }

15. ARQUIVOS O sistema de entrada e sada do ANSI C composto por uma srie de funes, cujos prottipos esto reunidos em stdio.h. Todas estas funes trabalham com o conceito de "ponteiro de arquivo". Este no um tipo propriamente dito, mas uma definio usando o comando typedef. Um ponteiro de arquivo declarado da seguinte forma: FILE *arq; arq ser ento um ponteiro para um arquivo. usando este tipo de ponteiro que vamos poder manipular arquivos no C.
Prof. Dr. Dlcio Cardim Pgina 63

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

As funes mais comuns do sistema de arquivo so: Funo fopen( ) fclose( ) putc( ) fputc( ) getc( ) fgetc( ) fseek( ) fprintf( ) fscanf( ) feof( ) ferror( ) rewind( ) remove( ) fflush( ) Operao Abre um arquivo Fecha um arquivo Escreve um caractere em um arquivo O mesmo que putc( ) L um caractere de um arquivo O mesmo que getc( ) Posiciona o arquivo em um byte especifico para um arquivo o que printf( ) para o console para um arquivo o que scanf( ) para o console Retorna verdadeiro se o fim do arquivo encontrado Retorna verdadeiro se ocorreu um erro Reposiciona o indicador de posio de arquivo no incio do arquivo Apaga um arquivo Descarrega um arquivo

15.1 Abrindo um Arquivo A funo fopen( ) serve a dois propsitos. Primeiro, ela abre um fluxo para uso e liga um arquivo com ele. Segundo, retorna o ponteiro de arquivo associado quele arquivo. Mais freqentemente, e para o resto desta discusso, o arquivo um arquivo em disco. A funo fopen( ) tem este prottipo: FILE *fopen(char *nome_de_arquivo, char *modo); Onde: nome_de_arquivo deve ser uma string de caracteres que compreende um nome de arquivo vlido para o sistema operacional e onde possa ser includa uma especificao de caminho (path). modo uma string contendo o estado desejado para abertura. A funo fopen( ) retorna um ponteiro de arquivo que no deve ter o valor alterado pelo seu programa. Se ocorrer um erro quando estiver tentando abrir um arquivo, fopen( ) retorna um nulo. Um arquivo pode ser aberto ou em modo texto ou em modo binrio. No modo texto, as seqncias de retorno de carro e alimentao de formulrios so transformadas em seqncias de novas linhas na entrada. Na sada, ocorre o inverso: novas linhas so transformadas em retorno de carro e alimentao de formulrio. Tais transformaes no acontecem em um arquivo binrio. Os valores legais para modo so: Modo r w
Prof. Dr. Dlcio Cardim

Significado Abre um arquivo para leitura Cria um arquivo para escrita


Pgina 64

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

a rb wb ab r+ w+ a+ r+b w+b a+b rt wt at r+t w+t a+t

Acrescenta dados para um arquivo existente Abre um arquivo binrio para leitura Cria um arquivo binrio para escrita Acrescenta dados a um arquivo binrio existente Abre um arquivo para leitura/escrita Cria um arquivo para leitura/escrita Acrescenta dados ou cria um arquivo para leitura/escrita Abre um arquivo binrio para leitura/escrita Cria um arquivo binrio para leitura/escrita Acrescenta ou cria um arquivo binrio para leitura/escrita Abre um arquivo texto para leitura Cria um arquivo texto para escrita Acrescenta dados a um arquivo texto Abre um arquivo-texto para leitura/escrita Cria um arquivo texto para leitura/escrita Acrescenta dados ou cria um arquivo texto para leitura/escrita

Exemplo: Para criar um arquivo para escrita com o nome arq_externo deve-se escrever: FILE *arq; arq = fopen (arq_externo.txt, w); Existem algumas situaes que pode impedir de abrir um arquivo: O arquivo no existe e tentou-se abri-lo para leitura; No se tem permisso para ler ou gravar o arquivo pedido; O arquivo j est aberto e/ou bloqueado por outro programa.

Nesses casos, quando se chama a funo fopen, a varivel referente ao arquivo receber o valor NULL (um valor mais ou menos especial em C, que geralmente indica algum objeto invlido). Para vericar se isso ocorreu, pode-se fazer o seguinte teste: If ((arq = fopen(arq_externo, w)) == NULL) { puts(No posso abrir o arquivo\n); exit(1); } Esse mtodo detecta qualquer erro na abertura do arquivo. Um nulo usado porque no ponteiro do arquivo nunca haver aquele valor. Tambm introduzido por esse fragmento est outra funo de biblioteca: exit( ). Uma chamada funo exit( ) faz com que haja uma terminao imediata do programa, no importando de onde a funo exit( ) chamada. Esta funo encontrada em stdlib.h. Quando se usa a funo fopen( ) para abrir um arquivo para gravao, pode acontecer de j existir um arquivo com o mesmo nome. Se isso ocorrer, o arquivo existente ser apagado, e o que se gravar ficar no lugar do arquivo antigo. Caso contrrio, o programa simplesmente criar um arquivo novo, com o nome que se pediu. Se o que se

Prof. Dr. Dlcio Cardim

Pgina 65

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

quer apenas adicionar dados ao final do arquivo, sem apagar nada, deve-se usar, no lugar da letra w, a letra a (de append). Para se abrir um arquivo para operaes de leitura necessrio que o arquivo j exista. Se ele no existir, ser retornado um erro. Finalmente, se o arquivo existe e aberto para escrita/leitura, as operaes feitas no apagaro o arquivo; entretanto, se no existir, o arquivo dever ser criado.

15.2 Gravando em Arquivos A funo putc( ) usada para escrever caracteres em um arquivo que foi previamente aberto para escrita pela funo fopen( ). A funo putc( ) toma o caractere ch e o grava no arquivo cuja estrutura FILE apontada por arq. putc(ch, arq); A funo putc( ) similar as funes putch( ) e putchar( ). Entretanto, estas funes escrevem somente na tela (se no foi usado algum redirecionamento) Se uma operao com a funo putc( ) for satisfatria, ela retornar o caractere escrito. Em caso de falha, um EOF retornado. EOF definida em stdio.h que significa fim do arquivo.

15.3 Lendo do Arquivo A funo getc( ) usada para ler caracteres de um arquivo aberto em modo de leitura pela funo fopen( ). getc(arq); A funo getc( ) retornar EOF quando o fim do arquivo tiver sido encontrado ou um erro tiver ocorrido. Portanto, para ler um arquivo-texto at que a marca de fim de arquivo seja mostrada, voc poder usar o seguinte cdigo: ch = getc(arq); while (ch != EOF) { ch = getc(arq); }

Prof. Dr. Dlcio Cardim

Pgina 66

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

15.4 Fechando um Arquivo A funo fclose( ) usada para fechar um arquivo que foi aberto pela funo fopen( ). fclose(arq); O fechamento do arquivo serve, basicamente, para liberar a memria que foi utilizada para trabalhar com o arquivo, alm de desbloquear o arquivo para uso em outros programas. A funo fclose( ) escreve quaisquer dados restantes na rea intermediria (buffer) no arquivo e faz um fechamento formal em nvel de sistema operacional do arquivo. Uma falha no fechamento de um arquivo leva a todo tipo de problemas, incluindo-se perda de dados, arquivos destrudos e a possibilidade de erros no seu programa. Uma outra funo que fecha arquivos a funo exit( ). Esta funo fecha todos os arquivos abertos, termina o programa e devolve o controle ao sistema operacional. A funo fclose( ) simplesmente fecha o arquivo associado ao ponteiro FILE usado como argumento.

15.5 Uso das Funes: fopen( ), getc( ), putc( ) e fclose( ) As funes fopen( ), getc( ),putc( ) e fclose( ) constituem o conjunto mnimo de rotinas de arquivo. Exemplo: O programa a seguir l caracteres do teclado e os escreve em um arquivo em disco e em seguida l os caracteres do arquivo e imprime na tela. O processo de gravao continua a cada iterao do lao while. Toda vez que a funo putc( ) executada, um outro caractere gravado no arquivo. Quando o usurio pressiona <RETURN>, o lao termina. Na leitura dos dados do arquivo a cada execuo da funo getc( ) um caractere lido do arquivo. O lao while executado enquanto o caractere lido for diferente de EOF (final de arquivo). #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { FILE *arq; char ch; arq = fopen("arqtexto.txt", "w"); printf("Digite o texto para armazenar no arquivo\n\n") ; while ((ch = getche()) != '\r') putc(ch, arq); fclose(arq);
Prof. Dr. Dlcio Cardim Pgina 67

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("\n\nDigite uma tecla para imprimir dados do arquivo") ; system("pause >>null"); system("cls"); arq = fopen("arqtexto.txt", "r"); printf("Dados armazenados no arquivo\n\n") ; ch = getc(arq); while (ch != EOF) { putch(ch); ch = getc(arq); } system("pause >>null"); fclose(arq); } O programa anterior tem uma falha em potencial. Se o arquivo especificado em fopen( ) no puder ser aberto, o programa ir parar. Quando se abre um arquivo para gravao, pode acontecer que no se tenha mais espao em disco. Se, para leitura, talvez o arquivo no tenha sido criado ainda. Ento importante que todos os programas que acessam arquivos em disco verifiquem se o arquivo foi aberto com sucesso, antes de ler ou gravar nele. Se o arquivo no pde ser aberto, a funo fopen( ) devolve o valor 0 (definido como NULL em stdio.h) Exemplo: O programa a seguir abre o arquivo arq_texto.txt para leitura . Se der erro na abertura o programa fornece uma mensagem de erro. #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { FILE *arq; char ch; if ((arq = fopen("arq_texto.txt", "r")) == NULL) { printf("ERRO!!! Arquivo nao pode ser aberto"); system("pause >>null"); exit(1); } printf("Dados armazenados no arquivo\n\n") ; while ((ch = getc(arq)) != EOF)
Prof. Dr. Dlcio Cardim Pgina 68

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("%c", ch); system("pause >>null"); fclose(arq); }

15.6 Lendo e Escrevendo Cadeias de Caracteres As funes fgets() e fputs() servem para ler e escrever cadeias de caracteres em arquivos. Os prottipos das funes so: fputs(str, arq); fgets(str, tamanho, arq); A funo fputs() escreve a cadeia de caracteres apontada por str no arquivo apontado por arq e o cdigo correspondente EOF ser retornado se ocorrer um erro. A funo fgets() l uma cadeia de caracteres do arquivo especificado at que um caracter de nova linha seja encontrado ou tamanho-1 caracteres sejam lidos. Observar que diferentemente de gets() o caracter de nova linha encontrado passa a fazer parte da cadeia que recebe um caracter nulo ao seu final. Caso ocorra um erro na leitura da cadeia o ponteiro str recebe o valor NULL Exemplo: No programa a seguir, a funo fputs() escreve a string frase no arquivo texto.txt. A gravao terminada com a insero de de uma linha em branco. Como gets() no armazena o caractere de nova linha, acrescentado um antes que a string seja escrita no arquivo para que o arquivo possa ser lido mais facilmente. #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 80 int main (void ) { char frase[MAX]; FILE *arq; char *nome = "texto.txt"; /* Abre o arquivo para leitura e escrita */ if (( arq = fopen(nome, "w")) == NULL) { printf("\n\nO arquivo no pode ser aberto.\n"); exit(1); } /* Cada linha digitada sera gravada no arquivo */ do { printf("Digite uma frase (<Enter> para sair): "); gets(frase);
Prof. Dr. Dlcio Cardim Pgina 69

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

strcat(frase, "\n"); /*acrescenta uma nova linha */ fputs(frase, arq); } while (*frase != '\n'); /*repete at digitar enter em vez da frase*/ }

rewind( ) A funo rewind() reposiciona o indicador de posio de arquivo no incio do arquivo especificado como argumento. rewind(arq); onde: arq o ponteiro vlido de arquivo. O prottipo para rewind() est em stdio.h. Exemplo: No programa do exemplo anterior foi modificado para mostrar o contedo do arquivo recm-criado. Com o uso da funo rewind(), posicionou o indicador de arquivo no incio do arquivo depois de efetuada a entrada e, ento, usa-se fgets() para ler de volta o arquivo. Note que o arquivo precisou ser aberto no modo leitura/escrita usando w+. #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 80 int main (void ) { char frase[MAX]; FILE *arq; char *nome = "texto.txt"; /* Abre o arquivo para leitura e escrita */ if (( arq = fopen(nome, "w+")) == NULL) { printf("\n\nO arquivo no pode ser aberto.\n"); exit(1); } /* Cada linha digitada sera gravada no arquivo */ do { printf("Digite uma frase (<Enter> para sair): "); gets(frase); strcat(frase, "\n"); /*acrescenta uma nova linha */ fputs(frase, arq); } while (*frase != '\n'); /*repete at digitar enter em vez da frase*/ rewind(arq); /* volta ao inicio do arquivo */

printf("\nTerminei de escrever, agora vou ler.\n"); fgets(frase, MAX, arq); while (!feof(arq)) {
Prof. Dr. Dlcio Cardim Pgina 70

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("%s",frase); fgets(frase, MAX, arq); } fclose(arq); getchar(); /* Espera o usuario digitar alguma coisa */ }

15.7 As funes fprintf () e fscanf() Para leitura e gravao de arquivos com formatao, so utilizadas as funes fprintf() e fscanf(). Estas funes so semelhantes a printf() e scanf(), utilizadas ao longo do curso. Todos os cdigos de formato e modificadores so os mesmos. Exemplo: O programa a seguir contm uma funo cadastro que cadastra a identificao, a idade, o peso e a altura de pessoas. Esses dados so organizados no arquivo em forma de coluna. Cada linha armazena os dados de uma pessoa. A funo imprime fornece um relatrio dos dados armazenados no arquivo. #include <stdio.h> #include <stdlib.h> float peso, estatura; int id_anos, ident; FILE *dados; void cria_arquivo() { if((dados = fopen("dados_pessoa.txt", "w")) == NULL) { printf("Impossivel abrir arquivo"); system("pause >>null"); } fclose(dados); } void cadastro() { char opc; if((dados = fopen("dados_pessoa.txt", "a")) == NULL) { printf("Impossivel abrir arquivo"); system("pause >>null"); return; } do { printf("Digite a identificao da pessoa: "); scanf("%d", &ident); printf("Digite a idade em anos: ");
Prof. Dr. Dlcio Cardim Pgina 71

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

scanf("%d", &id_anos); printf("Digite o peso: "); scanf("%f", &peso); printf("Digite a estatura: "); scanf("%f", &estatura); fprintf(dados, "%5d %5d %10.2f %10.2f\n", ident, id_anos, peso, estatura); printf("Dejeja cadastrar dados de outra pessoa (S/N): "); scanf("%c", &opc); scanf("%c", &opc); } while ((opc == 's') or (opc =='S')); fclose(dados); } void imprime() { if((dados = fopen("dados_pessoa.txt", "r")) == NULL) { printf("Impossivel abrir arquivo saida.txt."); getchar(); /* Espera o usuario digitar alguma coisa */ } printf("\nIdentificacao Idade Peso Estatura\n"); while (!feof(dados)) { fscanf(dados, "%d%d%f%f\n", &ident, &id_anos, &peso, &estatura); printf("%8d %9d %10.2f %10.2f\n", ident, id_anos, peso, estatura); } system("pause >>null"); fclose(dados); } int main() { int op; do { system("cls"); printf("1 - Criar arquivo\n"); printf("2 - Cadastrar dados\n"); printf("3 - Imprimir dados\n"); printf("0 - Sair\n"); scanf("%d",&op); switch (op) { case 1: cria_arquivo(); break; case 2: system("cls");
Prof. Dr. Dlcio Cardim Pgina 72

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

cadastro(); break; case 3: system("cls"); imprime(); break; } } while (op!=0); }

15.7 Arquivos Binrios Os dados so armazenados em arquivos binrios da mesma forma que so armazenados na memria do computador. Ou seja, ao guardarmos o valor de uma varivel float num arquivo binrio, ela ocupa no arquivo os mesmos 4 bytes que ocupa na memria. Ao guardarmos valores em modo texto, o compilador converte o valor da varivel para uma forma de apresent-lo por meio de caracteres. Por exemplo, o nmero inteiro 20000, apesar de ocupar somente dois bytes na memria, para ser armazenado em um arquivo texto ocupa pelo menos cinco bytes, j que cada caractere ocupa um byte. Arquivos binrios normalmente so menores que arquivos texto, contendo a mesma informao. A velocidade de leitura do arquivo tambm consideravelmente reduzida ao utilizarmos arquivos binrios. Exemplo: Lendo e gravando registros #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { struct produto { char descricao[30]; int qde; double preco; }; struct produto prod; char numstr[81]; FILE *arq_prod; if ((arq_prod = fopen("produtos.rec","ab")) == NULL) { printf("\nNao posso abrir arquivo produtos.rec"); exit(1); } do { system("cls");
Prof. Dr. Dlcio Cardim Pgina 73

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

printf("\nDigite a descricao: "); gets(prod.descricao); printf("\nDigete a quantidade: "); gets(numstr); prod.qde = atoi(numstr); printf("\nDigete o preco: "); gets(numstr); prod.preco = atof(numstr); fwrite(&prod, sizeof(prod),1,arq_prod); printf("\nAdiciona outro produto (s/n)? : "); } while (getche() == 's'); fclose(arq_prod); //listagem if ((arq_prod = fopen("produtos.rec","rb")) == NULL) { printf("\nNao posso abrir arquivo produtos.rec"); exit(1); } system("cls"); printf("Produtos cadastrados"); while (fread(&prod,sizeof(prod),1,arq_prod) == 1 ) { printf("\n\nDescricao : %s", prod.descricao); printf("\nQuantidade: %5d", prod.qde); printf("\npreco : %5.2f", prod.preco); } fclose(arq_prod); system("pause >>null"); }

16. BIBLIOGRAFIA ADALBERTO A. DORMELLES F. Fundamentos de Linguagem C. Apostila: Centro Tecnolgico de Mecatrnica, Caxias do Sul, 1997. ASCENCIO, Anna Fernanda Gomes. Fundamentos da programao de computadores: algoritmos, Pascal e C/C++. So Paulo: Prentice Hall, 2004. CARDIM, Dlcio. Algoritmos e Estrutura de Dados. Apostila: Curso de Cincias da Computao FAI, Adamantina-SP, 2000. COCIAN, Luis Fernando Spinosa. Manual da Linguagem CI. Canoas: Ulbra, 2004. GARCIA, Andre Mendes. Introduo ao C++ e C++ Builde. Apostila: Curso de Tecnologia em Processamento de Dados FAI, Adamantina-SP.

Prof. Dr. Dlcio Cardim

Pgina 74

Algoritmos e Estruturas de Dados I

Cincias da Computao - FAI

MANZANO, Jos Augusto Navaro Garcia. Estudo Dirigido de Linguagem C. 10 ed. So Paulo: rica, 2007. MIZRAHI, Victorine Viviane. Treinamento em Linguagem C: Mdulo I. So Paulo: McGraw-Hill, 1990. MIZRAHI, Victorine Viviane. Treinamento em Linguagem C++: Mdulo I. So Paulo: McGraw-Hill, 1995.

Prof. Dr. Dlcio Cardim

Pgina 75

Anda mungkin juga menyukai