Вы находитесь на странице: 1из 195

Universidade Federal de Pelotas Instituto de Fsica e Matemtica Departamento de Informtica

Programao I
2010/1 v.8/6/2010

Prof. Marilton S. De Aguiar marilton@ufpel.edu.br http://marilton.wordpress.com/p1

Introduo Linguagem C

Criada por Denis Ritchie em 1972 (Bell Labs, USA) Sua primeira utilizao importante foi a escrita do S.O. Unix Em meados de 1970 ela foi liberada para uso em Universidades Em 1980 j existiam vrias verses de compiladores de diversas empresas (no restritos ao ambiente Unix) C uma linguagem de propsito geral, adequada programao estruturada Juntamente com Fortran, a principal linguagem para uso cientfico (compiladores, analisadores lxicos, bancos de dados, editores de texto...)

Introduo Linguagem C

Pertence a um conjunto de linguagens cujas principais caractersticas so:

Portabilidade Modularidade Compilao separada Recursos de baixo nvel (tratamento de caracteres) Gerao de cdigo eficiente Confiabilidade Regularidade Simplicidade Facilidade de uso
3

A Sintaxe do C

So as regras para cada construo vlida em uma linguagem especfica. Esto relacionadas com:

Tipos: definem as propriedades dos dados Declaraes: expressam as partes de um programa Funes: especificam as aes que um programa executa, quando roda

Determinao e alterao de valores Chamada de funes de I/O


4

Funes em C

So os blocos bsicos dos programas em C H funes bsicas, definidas na biblioteca C: printf(), scanf(), getchar(), putchar() H funes definidas pelo programador Todo programa C inicia sua execuo chamando a funo main(), sendo obrigatrio a sua declarao no programa principal.

Exemplo
#include<stdio.h> /*comentario*/ //comentario main() { printf("oi"); }

Identificadores

So os nomes usados para fazer referncia a


Variveis Funes Mdulos Rtulos Demais objetos definidos pelo usurio

Identificadores (cont.)

Regras de Formao:

O primeiro caracter deve ser uma letra ou sublinhado Os 32 primeiros caracteres so significativos Case sensitive - difere maisculas de minscula
a A Nota nota _nota
8

Exemplos de identificadores vlidos em C:


Tipos

O Tipo serve (grosso modo) para determinar


Como os valores sero armazenados Quais operaes podero ser realizadas sobre estes valores Tipos escalares Tipos no-escalares

Tipos para Dados e para Funes


tipo de estrutura, tipo de unio, tipo de matriz

Tipos Escalares

Tipos Aritmticos

Tipos Inteiros

char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long float, double, long double

Tipos Flutuantes

Tipos Ponteiros

para funes para objetos de dados para tipos incompletos


10

Tipos Inteiros

11

Tipo Flutuante

12

Exemplo
#include<stdio.h> //tamanhodostipos main() { charc; unsignedcharuc; inti; unsignedintui; floatf; doubled; printf("char%d",sizeof(c)); printf("unsignedchar%d",sizeof(uc)); printf("int%d",sizeof(i)); printf("unsignedint%d",sizeof(ui)); prinft("float%d",sizeof(f)); printf("double%d",sizeof(d)); }
13

Operadores

Atribuio (=) Aritmticos (+, -, *, /, %)

Outros operadores

i += 2; (equivalente: i = i+2;) x *= y+1; (equivalente: x = x*(y+1);) d -= 3; (equivalente: d = d-3;)

14

Operadores (cont.)

Relacionais (>, >=, <, <=, ==, !=) Lgicos (&&, ||, !)
Em C, falso 0 (zero); qualquer outro valor considerado verdadeiro (inclusive negativo) Operadores relacionais e lgicos tm menor precedncia do que operadores aritmticos

15

{De,In}cremento

++x incrementa x antes de usar o seu valor x++ incrementa x depois de ser usado --y decrementa y antes de usar o seu valor y-decrementa y depois de ser usado
16

Sobre a Precedncia
()[]> !~++(tipo)* &sizeof */% + <<>> <<=>>= ==!= &^! && || ?: =+==*=/=etc ,

Maior

Menor
17

Funes Bsicas

printf()

Sintaxe:
printf("expressaodecontrole",argumentos);

uma funo de E/S que permite escrever no dispositivo padro (tela) A expresso de controle pode conter: caracteres que sero exibidos na tela cdigos de formatao Cada argumento deve ser separado por vrgulas

18

Funes Bsicas

printf()

Cdigos de formatao:

\n (nova linha); \t (tabulao); \b (retrocesso); \" (aspas); \\ (barra); \f (salta formulrio) e \0 (nulo). %c (caractere simples); %d (decimal); %e (notao cientfica); %f (ponto flutuante); %o (octal); %s (string); %u (decimal sem sinal); e %x (hexadecimal)
19

Exemplo - printf()
#include<stdio.h> main() { printf("esteehonumerodois:%d",2); } #include<stdio.h> main() { inta,b; floatc; a=2; b=10; c=2/((float)1/a+(float)1/b); printf("a=%db=%d\n",a,b); printf("amdiaharmnicadeaeb:%f",c); }
Exemplo 1

Exemplo 2

20

Funes Bsicas

scanf()

Sintaxe:
scanf("expressaodecontrole",argumentos);

uma funo de E/S que permite ler dados formatados da entrada padro (teclado) A lista de argumentos deve consistir dos endereos das variveis na memria do computador. Como obter o endereo de uma varivel??

Colocando um & junto ao nome da varivel. Ex.: &a (fornece o endereo da varivel a)
21

Exemplo - scanf()
Exemplo 1

#include<stdio.h> main() { inta,b; floatc; printf("entrecomovalordea\n"); scanf("%d",&a); printf("entrecomovalordeb\n"); scanf("%d",&b); c=2/((float)1/a+(float)1/b); printf("a=%db=%d\n",a,b); printf("amdiaharmnicadeaeb:%f",c); }
22

Estruturas de Controle

if(...)

Sintaxe: if(condio)comando1; elsecomando2;


Se condio for verdadeira (qualquer valor diferente de zero), o programa executar o comando1; caso contrrio (condio for falsa), o programa executar o comando2. No lugar de um comando, pode haver uma seqncia de comandos (ou seja, um bloco). Em C, um bloco incia com um abre chaves e termina com um fecha chaves
23

Estruturas de Controle

if(...)

Sintaxe: if(condio){ comando1; comando2; comando3; ... }else{ comando4; comando5; ... }
24

if aninhado
if(x>0) if(y>0) printf("pontono1oquadrante"); else printf("pontono4oquadrante"); else if(y>0) printf("pontono2oquadrante"); else printf("pontono3oquadrante");

25

Expresso Condicional
#include<stdio.h> main() { inta,b; printf("digitedoisnumeros\n"); scanf("%d%d",&a,&b); if(b) printf("%d\n",a/b); else printf("naopodedividirporzero"); }

26

Exerccios
(1) Fazer um programa que l as 3 notas de um aluno de Programao I (v1, v2 e MT, onde MT a mdia dos trabalhos). O programa calcula e imprime a mdia do aluno, usando a frmula Mdia=(3*v1+3*v2+4*MT)/10. (2) Utilizando o programa anterior, fazer um novo programa que verifica se o aluno atingiu a mdia 7. Caso positivo, o programa imprime a mensagem "aprovado por mdia". Caso contrrio, o programa calcula e imprime o valor necessrio na optativa, apresentando a mensagem apropriada. (Lembre-se que a mdia dos trabalhos no pode ser substituda pela optativa).

27

switch
Sintaxe: switch(expressao) { caseconstante1: sequencia_de_comandos1; break; caseconstante2: sequencia_de_comandos2; break; caseconstante3: sequencia_de_comandos3; break; ... default: break; }

Seleo Mltipla

28

Exemplo - switch
ch=getchar(); switch(ch) { caseC: casec: clio++; break; caseS: scenic++; break; caseK: kangoo++; break; caseM: meganec++; break; default: break; }

29

Exemplo - switch
ch=getchar(); switch(ch) { caseC: casec: clio++; break; caseS: scenic++; break; caseK: kangoo++; break; caseM: meganec++; break; default: break; }
permitido tambm: uso de switchs aninhados uso de ifs dentro dos switchs

30

Comandos de Iterao: for


Sintaxe: Caso 1 for(inicializacoes;testes;atualizacoes) comando; Caso 2 for(inicializacoes;testes;atualizacoes) { comando1; comando2; comando3; }

31

Comandos de Iterao: for


Funcionamento:
for(inicializacoes;testes;atualizacoes) { comando1; 3 comando2; comando3; }
1 2 4

32

Exemplo - for
#include<stdio.h> main() { inti,n; floatvalor,media; media=0; printf("entrecomonumerodevalores\n"); scanf("%d",&n); for(i=0;i<n;i++){ printf("entrecomo%dvalor\n",i+1); scanf("%f",&valor); media+=valor; } media/=n; printf("Amediadestesvaloreseh:%f\n",media); }

33

Exemplo - for
Exemplo 1

for(;;) printf("Repitaisso...\n"); charch; ch=\0; for(;;){ ch=getchar();//obtemumcaractere if(ch==A) break;//saidolaco } printf("tudigitasteumA,tche!\n");


34

Exemplo 2

Comandos de Iterao - for

Laos for sem corpo:


for(i=0;i<tam;i++);

Este trecho serve, por exemplo, para posicionar um indexador (i, neste caso) numa dada posio, que pode ser o final de um vetor.
Repare no ponto-e-vrgula logo aps o parntesis

35

Comandos de Iterao - while


Sintaxe: Caso 1
while(condicao) comando;

Caso 2
while(condicao){ comando1; comando2; comando3; }

36

Exemplo - while

Exemplo: inti=0; while(i<=100){ printf("%d\n",i); i++; }

Primeiro faz a comparao de i depois executa o lao de comandos; Repare na linha i++ incrementando o valor de i.

37

Comandos de Iterao do...while


Sintaxe: Caso 1
do comando; while(condicao);

Caso 2
do{ comando1; comando2; comando3; }while(condicao);
38

Exemplo do...while
do scanf("%d",&num); while(num>100);

Este trecho de cdigo l nmeros do teclado at que encontre um nmero menor ou igual a 100.

39

Comandos de Desvio: return

usado para retornar de uma funo considerado um comando de desvio porque faz com que a execuo retorne ao ponto em que a chamada funo foi feita. Se return tem um valor associado a ele, este valor o valor de retorno da funo Se no houver valor associado ao return, assume-se que somente lixo retornado. Forma Geral: returnexpressao;
40

Comandos de Desvio: break

Usos:

Terminar um case do comando switch; Forar uma terminao imediata de um lao.

Quando o comando break encontrado dentro de um lao, o lao imediatamente terminado e o controle do programa retorna no comando seguinte ao lao. Forma Geral:
for(i=0;i<100;i++){ printf("%d",i); if(i==10) break; } printf("Valordeiaosairdolaco:%d",i);

41

Comandos de Desvio: exit

Da mesma forma que se pode sair de um lao, pode-se sair de um programa usando a funo exit() da biblioteca padro. Esta funo provoca uma terminao imediata do programa inteiro, forando um retorno ao sistema operacional. Forma Geral: voidexit(intcodigo_de_retorno); O valor de codigo_de_retorno retornado ao processo chamador, que normalmente o sistema operacional O zero geralmente usado como cdigo de retorno que indica uma terminao normal do programa. Outros valores so usados para indicar algum tipo de erro.

42

Exerccios
(1) Escreva um programa que l as coordenadas de n pontos no plano cartesiano (x, y) e identifica se estes pontos pertencem: i) ao 1o. quadrante; ii) ao 2o. quadrante; iii) ao 3o. quadrante; iv) ao quarto quadrante; ou esto sobre v) o eixo dos "x"; vi) o eixo dos "y"; ou vii) esto na origem. Feito isso, o programa escrever os totais de pontos em cada uma destas situaes. (2) Considere a seguinte srie 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, e um inteiro positivo n. Deseja-se: i) imprimir os n primeiros termos da srie; e, ii) calcular e imprimir a soma dos n primeiros termos. Desenvolva dois programas utilizando for e do while que resolvam este problema. (3) Dados trs nmeros inteiros correspondentes, respectivamente, ao dia, ms e ano de nascimento de uma pessoa e trs outros nmeros correspondentes ao dia, ms e ano corrente (ex. data de hoje), calcular e imprimir a idade em anos completos. Verificar se as datas so compatveis (nascimento <= corrente).
43

Exerccios
(4) Usando o comando for, faa um programa que calcule o fatorial de um nmero inteiro n. (5) Refaa o exerccio anterior usando o comando while. (6) Faa um programa que recebe um nmero inteiro e imprime o somatrio de seus divisores. (7) Faa um programa que recebe um nmero inteiro e verifica se o nmero primo ou no, escrevendo uma mensagem apropriada. (8) Faa um programa que recebe l n conceitos de alunos (n fornecido no incio do programa) e conta quantos conceitos de cada tipo existem. Os conceitos possveis so: A, B, C, D, E e podem ser fornecidos com letras maisculas ou minsculas.

44

Matrizes

Uma matriz uma coleo de variveis do mesmo tipo que referenciada por um nome comum Em C todas as matrizes consistem em posies contguas na memria:

o endereo mais baixo corresponde ao primeiro elemento o endereo mais alto corresponde ao ltimo elemento

Um elemento especfico da matriz pode ser acessado por meio de um ndice Matrizes podem ter de uma a vrias dimenses
45

Matrizes Unidimensionais

Forma geral de se declarar uma matriz unidimensional: tiponome_da_variavel[tamanho]; Como qualquer varivel, as matrizes precisam ser declaradas para que o compilador possa alocar espao na memria para elas

tipo declara o tipo de base da matriz tamanho define a quantidade mxima de elementos que a matriz poder armazenar
46

Exemplos
Declarao de uma matriz chamada valor de 100 elementos do tipo int. intvalor[100]; Para acessar o primeiro elemento da matriz valor: valor[0]=0; Para acessar o ltimo elemento da matriz valor: valor[99]=0; Em C, uma matriz de N elementos tem ndice que inicia em 0 (zero) e termina em N-1. floatnotas[100]; doublebalance[20]; charlinha[80];

47

Alocao de Memria
Mas como o compilador calcula a quantidade de memria a ser alocada para uma dada matriz? total (bytes) = sizeof (tipo) * qtde elem da matriz Sizeof um operador unrio, em tempo de compilao, que retorna o tamanho, em bytes, da varivel ou especificador de tipo entre parntesis. O clculo do tamanho feito automaticamente, em tempo de compilao, para cada matriz declarada no programa. No preciso se preocupar com a alocao de memria. 48

Exemplo
Lendo uma matriz unidimensional

floatnota[50]; inti; for(i=0;i<50;i++){ printf(digiteanotado%d.oaluno\n,i+1); scanf(%f,&nota[i]); } Ateno: C no tem verificao dos limites de matrizes. Isto significa que se pode escrever valores para alm do final da matriz, sobre outras variveis ou mesmo sobre o prprio cdigo do programa!
49

Exemplo
O que acontecer neste exemplo?

floatnota[50]; inti; for(i=0;i<100;i++){ printf(digiteanotado%d.oaluno\n,i+1); scanf(%f,&nota[i]); }

tarefa do programador assegurar que isso no ocorra no programa!!!

50

Matrizes Bidimensionais

C suporta matrizes multidimensionais. Uma matriz bidimensional a forma mais simples Exemplo: intd[10][20]; Declara uma matriz do tipo int, com 10 linhas 20 colunas, chamada d.

51

Exemplo
main() { floatnum[3][4]; inti,j; Lendo uma matriz bidimensional

for(i=0;i<3;i++) for(j=0;j<4;j++){ printf(digiteoelementodalinha%d,coluna%d\n,i+1,j+1); scanf(%f,&num[i][j]); } }

Uma matriz bidimensional exige sempre dois laos aninhados para sua manipulao.
52

Exemplo

Faa um programa que l n nmeros e calcula a mdia aritmtica destes. Em seguida, o programa conta quantos nmeros esto acima da mdia e imprime esta informao.

53

#include<stdio.h> #defineTAM1000 main(){ floatvalor[TAM],media=0.0; inti,n,conta=0; printf("digiteonumerodevalores\n"); scanf("%d",&n); if((n>TAM)||(n<1)) printf("erro:otamanhodeveestarentre1e%d\n",TAM); else{ for(i=0;i<n;i++){ printf("digiteo%d.ovalor\n",i+1); scanf("%f",&valor[i]); media+=valor[i]; } media/=n; for(i=0;i<n;i++) if(valor[i]>media) conta++; printf("media=%f\n%dvaloresacimadamedia\n",media,conta); } }

54

Matrizes Multidimensionais

C suporta matrizes com mais de 2 dimenses. O limite de dimenses definido pelo compilador usado (alguns compiladores no limitam) Exemplo de declarao: intm[10][20][4][100];

55

Inicializao de Matrizes
Forma Geral:
tipomatriz[tam1][tam2][tamN]={lista_de_valores};

Exemplos:
intm[10]={1,2,3,4,5,6,7,8,9,10}; floataux[5]={0.0,1.0,2.0,3.0,4.0}; intmatriz[10]={0};

Os elementos so inicializados com os valores da lista, seguindo a ordem da esquerda para a direita. Se no houver inicializadores suficientes, os elementos faltantes so inicializados com 0 (zero).
56

Outros Exemplos

Muitas vezes possvel inicializar uma matriz dentro de um lao (vantajoso quando o lao j existe):
Exemplo 2 floataux[1000],i; for(i=0;i<1000;i++) aux[i]=0.0;

Exemplo 1 intm[100],i; for(i=0;i<100;i++) m[i]=i; Exemplo 3

charlinha[80]={E,u,,g,o,s,t,o,,d,e,,C,\0};

Exemplo 4 charlinha[80]={EugostodeC};
57

Matrizes Unidimensionais de Caracteres

Usadas para armazenar cadeias de caracteres de interesse (strings). C prov uma biblioteca para o tratamento de strings. Conveno: cada string deve terminar com o caractere especial '\0'. O '\0' serve para delimitar o final de uma cadeia de caracteres (strings). Com ele se pode usar as bibliotecas de tratamento de strings. Sua existncia deve sempre ser levada em conta no tamanho de uma matriz de caracteres. Permite que se armazene uma string com nmero de caracteres menor do que o tamanho-1 da matriz.
58

Exemplos
main(){ charc,linha[100]; inti=0; while((c=getchar())!='\n'){ linha[i]=c; i++; } linha[i]='\0';//finaldestring printf("%s",linha); } main() { charlinha[100]={"Imprimaestalinha."}; inti=0; while(linha[i]!='\0'){ putchar(linha[i]); i++; } }

Lendo uma string

Imprimindo uma string

59

Outros Exemplos
#include<stdio.h> main() { chars[256]="",str[256]="";

Entrada Seletiva (Scansets)

scanf("%[aeiou]",s);//leapenasasvogais"aeiou" printf("String(s):%s\n",s); scanf("%[^AZ]",str);//NaolecaracteresmaiusculosdeAaZ printf("String(str):%s\n",str); }

#include<stdio.h> main() { charstr[31]; printf("Digiteseunome:"); fgets(str,30,stdin);//eomesmoquescanf("%30s",str);??? puts(str);//putsimprimenatelaumastring } 60

Limitando o tamanho da string

Outros Comandos
Para utilizar: strcpy(s1,s2)Copia s1 em s2. strcat(s1,s2)Concatena (junta) s2 ao final de s1. strlen(s1)Retorna o tamanho de s1. strcmp(s1,s2)Retorna 0 se s1 e s2 so iguais; menor que zero se s1 != s2; strchr(s1,ch)Retorna um ponteiro para a primeira ocorrncia de ch em s1. strstr(s1,s2)Retorna um ponteiro para a primeira ocorrncia de s2 em s1. deve-se incluir string.h Para limpar o buffer de entrada: intx=getchar(); while((x!='\n')&&(x!=EOF)) x=getchar();
61

Exerccios
(1) Faa um programa que l n nmeros decimais, armazenando-os em um vetor. Aps, o programa identifica o menor nmero do vetor e imprime sua posio. (2) Faa um programa que l n x m valores decimais, armazenandoos em uma matriz com n linhas e m colunas. Aps, para cada linha da matriz, o algoritmo calcula a mdia e conta quantos elementos esto acima da mdia calculada, imprimindo estas informaes. (3) Fazer um programa que l as 3 notas de n alunos (n fornecido pelo usurio, no incio do programa) de uma turma de Programao I (V1, V2 e MT, onde MT a mdia dos trabalhos). O programa calcula e imprime a mdia de cada aluno, usando a frmula M=(3*v1+3*v2+4*MT)/10. Aps, o programa calula e imprime a mdia da turma em V1, em V2 e em MT. Finalmente, o programa conta quantos alunos obtiveram nota maior que a mdia calculada para V1, imprimindo esta informao.
62

Exerccios
(4) Faa um programa que l n nmeros inteiros (cujo valor mximo no ultrapassa 1000). Aps, o programa imprime em ordem crescente os nmeros no duplicados do vetor. (5) Faa um programa que l n nmeros decimais (no mximo 10000 valores), armazenando-os em um vetor. Aps, o programa ordena este vetor usando o mtodo "Bubble Sort". Finalmente, o programa imprime o vetor ordenado. (6) Faa um programa que l duas matrizes de nmeros decimais, M1 e M2, ambas de tamanhos n x m. Aps, o programa cria e imprime a matriz S, resultante da soma de M1 com M2. (7) Faa um programa que l uma matriz de valores decimais e calcula a mdia de sua diagonal secundria. Aps, o programa deve verificar e imprimir a posio de cada elemento cujo valor est abaixo da mdia calculada.
63

Exerccios Complementares
(8) Escreva um programa que l n coordenadas x e y de pontos e as armazene em uma matriz. Decida para cada ponto se est ao Norte, Sul, Leste, Oeste, Nordeste, Noroeste, Sudoeste, Sudeste ou sobre o ponto anterior e informe com uma mensagem apropriada. Para o primeiro ponto lido tome a origem (0,0) para sua deciso. (9) Escreva um programa que preenche um vetor de 50 posies com zeros, com exceo da posio central, que deve ter o valor 1. Ainda, o programa l um valor n que representa o nmero de iteraes da aplicao da seguinte regra: o prximo valor da posio v[i] (v[i-1]+v[i+1]) mod 2, usar os valores de v[i-1] e v[i+1] da iterao anterior. Imprima o vetor original e todas as demais atualizaes do vetor.
64

Exerccios Complementares
(10) Leia um valor n mpar (3 < n < 50) para preencher e imprimir uma matriz da seguinte forma: n=5
..x.. .xxx. xxxxx5caracteresx .xxx. ..x..

(11) Escreva um programa que embaralha uma matriz de ordem n (n x n elementos) da seguinte maneira:
Moriginal: AB CD Membaralhada: BA DC

65

Ponteiros

Conceitos Envolvidos:

Um ponteiro o endereo de uma varivel na memria. Uma varivel de ponteiro uma varivel especialmente declarada para guardar um ponteiro para seu tipo especificado.

66

Utilidades dos Ponteiros

So uma maneira rpida de referenciar uma varivel em C; So o meio pelo qual as funes em C conseguem modificar seus parmetros de chamada; Provem suporte s listas encadeadas e outras estruturas de dados dinmicas.

67

Operadores para Ponteiros

operador & :

Operador unrio Devolve o endereo da memria em que se encontra alocado seu operando; m=&count;

Exemplo: atribui a m o endereo da memria em que se encontra a varivel count. Esse endereo no tem nenhuma relao com o valor de count. Pode-se imaginar & como significando o endereo de. Desta forma, a sentena de atribuio anterior significa m recebe o endereo de count.
68

Operador & - Exemplo


endereo 1999 2000 2001 2002 ... memria 100 count

intcount; ... count=100; m=&count; ...

1) Assuma que a varivel count, quando foi declarada, ficou alocada para a posio de memria 2000. 2) Assuma tambm que count tem como valor 100. 3) Ento, aps a setena de atribuio m tem o valor 2000.

69

Operadores para Ponteiros

operador * :

Operador unrio Devolve o valor da varivel localizada no endereo que o segue. (ou seja, este operador sempre interpreta seu operando
como um endereo de memria!)

a partir do exemplo anterior, se m contm o endereo da varivel count, q=*m; coloca o valor de count em q. Agora q tem o valor 100 porque 100 est armazenado na posio 2000, endereo da memria em que est armazenado m. Pode-se pensar no * como significando o contedo do endereo . Assim, a sentena anterior poderia ser 70 lida como q recebe o contedo do endereo m.

Declarando Ponteiros

Por exemplo, para declarar uma varivel ponteiro ch para char, escreve-se: char*ch; Aqui, ch no um caractere, mas um ponteiro para caractere (so conceitos completamente diferentes). Pode-se misturar diretivas de ponteiro e de noponteiro na mesma declarao, como por exemplo: intx,*y,count; Declara x e count como sendo do tipo inteiro e y como sendo um ponteiro para o tipo inteiro.
71

Usando Ponteiros
O que faz este programa?

#include<stdio.h> voidmain(void) { inttarget,source=10,*m; m=&source; target=*m; printf("%d",target); }


72

Atribuio de Ponteiros

Como qualquer varivel, um ponteiro pode ser usado do lado direito de um comando de atribuio para se passar seu valor para outro ponteiro: #include<stdio.h> voidmain(void) { intx=0,*p1,*p2; p1=&x; p2=p1; printf("%p",p2); }

O que ser impresso?


73

Aritmtica de Ponteiros

Existem apenas duas operaes aritmticas que podem ser feitas com ponteiros:

Adio Subtrao

Regras da aritmtica de ponteiros: 1. Cada vez que um ponteiro incrementado, ele aponta para a posio de memria do prximo elemento do seu tipo base. 2. Cada vez que um ponteiro decrementado, ele aponta para a posio de memria do elemento anterior do seu tipo base
74

Aritmtica de Ponteiros - Exemplo

Exemplo:

assuma que estamos usando uma mquina na qual um inteiro ocupa 2 bytes. Ento int*p1,x; p1=&x; p1++;

Se x estava armazenada na posio de memria 2000. Ento, aps p1++, p1 conter o valor 2002.

75

Comparao de Ponteiros

possvel comparar dois ponteiros em uma expresso relacional. Exemplo:

if(p<q) printf(papontaparaumamemoriamaisbaixaqueq\n);

Geralmente, comparaes de ponteiros so usadas para verificar se dois ou mais ponteiros apontam para um mesmo objeto (uso em estruturas de dados tais como pilhas, filas etc)

76

Ponteiros e Matrizes

H uma estreita relao entre ponteiros e matrizes. De fato, os ndices das matrizes so uma maneira mais confortvel para se acessar um dado elemento de uma matriz. charnome[80],*p1,ch; p1=nome;

P1 foi inicializado com o endereo do primeiro elemento da matriz nome ch=nome[4]; ou ch=*(p1+4) copiam o quinto elemento de nome para ch
77

Exemplos
Acessando uma string por ndices

for(i=0;nome[i]!='\0';i++) putchar(nome[i]);
Acessando uma string por ponteiros

for(p=nome;*p;p++) putchar(*p); ou p=nome; while(*p) putchar(*p++);


78

Exemplos
O que este programa est fazendo?

#include<stdio.h> #include<string.h> main(){ char*p="alomundo"; intt; printf(p); printf("\n"); for(t=strlen(p)1;t>1;t) printf("%c",p[t]); }

79

Exemplos
#include<stdio.h> #include<string.h> voidmain(void){ inti; char*p1,c,s[80]; p1=s; do{ i=0; while((c=getchar())!='\n'){ s[i]=c; i++; } s[i]='\0'; while(*p1) printf("%c",*p1++); printf("\n"); }while(strcmp(s,"feito!")); }

O que faz este programa?

80

Matrizes de Ponteiros

Como qualquer outro tipo bsico, ponteiros podem ser organizados em matrizes: int*listas[100]; Para se atribuir o endereo de uma varivel inteira, chamada var, ao terceiro elemento da matriz de ponteiros, deve-se escrever: listas[2]=&var; Para encontrar o valor de var, escreve-se: *listas[2];

81

Indireo Mltipla
Ocorre quando se tem um ponteiro que aponta para outro ponteiro que (finalmente) aponta para o valor. 1. Indireo simples
ponteiro endereo endereo varivel valor valor

2. Indireo mltipla
ponteiro endereo endereo ponteiro endereo endereo varivel valor valor

82

Exemplo
Exemplo de Indireo Mltipla

#include<stdio.h> voidmain(void) { intx,*p,**q; x=10; p=&x; q=&p; printf("%d",**q); }


83

Exerccios
(1) Seja o seguinte trecho de programa: inti=3,j=5; int*p,*q; p=&i; q=&j; Qual o valor das seguintes expresses ? a) p=&i b) *p*q c) **&p d) 3**p/(*q)+7 (2) Qual ser a sada deste programa supondo que i ocupa o endereo 1000 na memria?
main(){ inti=5,*p; p=&i; printf("%p%d%d%d%d\n",p,*p+2,**&p,3**p,**&p+4); }
84

Exerccios
(3) Se i e j so variveis inteiras e p e q ponteiros para int, quais das seguintes expresses de atribuio so ilegais?
a)p=&i;b)*q=&j;c)p=&*&i;d)i=(*&)j; e)i=*&j;f)i=*&*&j;g)q=*p;h)i=(*p)+++*q

(4) Qual o resultado do seguinte programa?


#include<stdio.h> voidmain(){ floatvet[5]={1.1,2.2,3.3,4.4,5.5}; float*f; inti; f=vet; printf("contador/valor/valor/endereco/endereco"); for(i=0;i<=4;i++){ printf("\ni=%d",i); printf("vet[%d]=%.1f",i,vet[i]); printf("*(f+%d)=%.1f",i,*(f+i)); printf("&vet[%d]=%p",i,&vet[i]); printf("(f+%d)=%p",i,f+i); } }

85

Exerccios
(5) Qual sero as sadas do
seguinte programa?
#include<stdio.h> main(){ intvalor; int*p1; floattemp; float*p2; charaux; char*nome="Algoritmos"; char*p3; intidade; intvetor[3]; int*p4; int*p5; /*(a)*/ valor=10; p1=&valor; *p1=20; printf("(a)%d\n",valor); /*(b)*/ temp=26.5; p2=&temp; *p2=29.0; printf("(b)%.1f\n",temp); /*(c)*/ p3=&nome[0]; aux=*p3; printf("(c)%c\n",aux); /*(d)*/ p3=&nome[4]; aux=*p3; printf("(d)%c\n",aux); /*(e)*/ p3=nome; printf("(e)%c\n",*p3); /*(f)*/ p3=p3+4; printf("(f)%c\n",*p3); /*(g)*/ p3; printf("(g)%c\n",*p3); /*<h>*/ vetor[0]=31;vetor[1]=45;vetor[2]=27; p4=vetor;idade=*p4; printf("(h)%d\n",idade); /*(i)*/ p5=p4+1; idade=*p5; printf("(i)%d\n",idade); /*(j)*/ p4=p5+1; idade=*p4; printf("(j)%d\n",idade); /*(l)*/ p4=p42; idade=*p4; printf("(l)%d\n",idade); /*(m)*/ p5=&vetor[2]1; printf("(m)%d\n",*p5); /*(n)*/ p5++; printf("(n)%d\n",*p5); }

86

Exerccios
(6) Assumindo que pulo[] um vetor do tipo int, quais das seguintes expresses referenciam o valor do terceiro elemento da matriz?
a)*(pulo+2)b)*(pulo+4)c)pulo+4d)pulo+2

(7) Supor as declaraes: intmat[4],*p,x; Quais expresses so vlidas? Justifique:


a)p=mat+1;b)p=mat++;c)p=++mat;d)x=(*mat)++;

(8) O que fazem os seguintes programas?


#include<stdio.h> voidmain(){ intvet[]={4,9,13}; inti; for(i=0;i<3;i++){ printf("%d",*(vet+i)); } } #include<stdio.h> voidmain(){ intvet[]={4,9,13}; inti; for(i=0;i<3;i++){ printf("%p",vet+i); } }

87

Exerccios
(9) O que fazem os seguintes programas quando executados?
#include<stdio.h> voidmain(){ intvet[]={4,9,12}; inti,*ptr; ptr=vet; for(i=0;i<3;i++){ printf("%d",*ptr++); } } #include<stdio.h> voidmain(){ intvet[]={4,9,12}; inti,*ptr; ptr=vet; for(i=0;i<3;i++){ printf("%d",(*ptr)++); } }

88

Exerccios
(10) Seja vet um vetor de 4 elementos: TIPOvet[4]. Supor que depois da declarao, vet esteja armazenado no endereo de memria 1000 (ou seja, o endereo de vet[0]). Supor tambm que na mquina usada uma varivel do tipo char ocupa 1 byte, do tipo int ocupa 4 bytes, do tipo float ocupa 4 bytes e do tipo double ocupa 8 bytes. Qual o valor devet+1,vet+2evet+3 se: a) vet for declarado como char? b) vet for declarado como int? c) vet for declarado como float? d) vet for declarado como double?

89

Funes

Conceitos:

Funes so os blocos de construo de C e o local onde toda a atividade do programa ocorre. Qualquer programa C possui ao menos uma funo (main).

90

Forma Geral
tiponome_da_funo(listadeparmetros) { corpodafuno } tipo especifica o tipo de valor que o comando return da funo devolve, podendo ser qualquer tipo vlido.

Se nenhum tipo especificado, o compilador assume que a funo devolve um resultado inteiro.

91

Forma Geral
tiponome_da_funo(listadeparmetros) { corpodafuno } listadeparmetros uma lista de nomes de variveis separados por vrgulas e seus tipos associados que recebem os valores dos argumentos quando a funo chamada. Uma funo pode no ter parmetros, neste caso a lista de parmetros vazia. Ainda assim os parntesis so necessrios. f(tiponomevar1,tiponomevar2,,tiponomevarN)
92

Regras de Escopo

As regras de escopo de uma linguagem so as regras que determinam se uma poro de cdigo conhece ou tem acesso a outra poro de cdigo ou dados. Em C, cada funo um bloco discreto de cdigo. Um cdigo de uma funo privativo quela funo e no pode ser acessado por nenhum comando em outra funo, exceto por meio de uma chamada funo O cdigo que constitui o corpo de uma funo escondido do resto do programa e, a menos que use variveis ou dados globais, no pode afetar ou ser afetado por outras partes do programa O cdigo e os dados que so definidos internamente a uma funo no podem interagir com o cdigo ou dados definidos em outra funo porque as duas funes tm escopos diferentes.
93

Regras de Escopo

Variveis locais:

So as variveis definidas internamente a uma funo Existem somente durante a execuo da funo que as definiu No podem manter seus dados entre chamadas da funo, exceto se se usa o especificador de tipo de armazenamento static

Em C, todas as funes esto no mesmo nvel de escopo Por este motivo, C no considerada uma linguagem estruturada em blocos
94

Argumentos

Se uma funo usa argumentos, ento ela deve declarar variveis que aceitem os valores dos argumentos. Essas variveis so chamadas parmetros formais da funo. Parmetros formais comportam-se como variveis locais dentro da funo: so criadas na entrada e destrudas na sada. A declarao ocorre aps o nome da funo (e segundo o padro ANSI, entre os parntesis)
95

Comando return

Possui dois usos:

Invoca uma sada imediata da funo que o contm (faz com que a execuo do programa retorne ao cdigo chamador) usado para devolver um valor

H duas maneiras pelas quais uma funo termina sua execuo (e retorna ao cdigo qua a chamou):

Ao executar o ltimo comando da funo (e o } ) Quando o comando return encontrado

96

Exemplo
Funo: devolve 1 se c parte da string s; 0 caso contrrio.

is_in(char*s,charc) { while(*s) if(*s==c) return1; elses++; return0; }

97

Argumentos

Os argumentos usados para chamar a funo devem ser compatveis com os tipos de seus parmetros. C robusta: se os tipos forem incompatveis, o compilador no gera uma mensagem de erro, mas ocorrem resultados inesperados. O uso de prottipos de funes pode ajudar a achar esses tipos de erros. Tal como as variveis locais da funo, os parmetros formais podem ser usados em qualquer expresso permitida em C
98

Argumentos

Em C, podem ser passados argumentos para subrotinas de duas maneiras: Chamada por valor

Chamada por referncia

99

Chamada por Valor

Parmetro formal da funo recebe uma cpia do valor do argumento. Conseqncia:

As alteraes feitas nos parmetros formais da funo no tm nenhum efeito nas variveis usadas para cham-la.

100

Chamada por Referncia

O parmetro formal da funo recebe uma cpia do endereo do argumento (ponteiro). Conseqncias:

Dentro da funo, o endereo usado para acessar o argumento real usado na chamada. Alteraes feitas no parmetro afetam a variveis usada para chamar a funo.

101

Exemplo
#include<stdio.h> intpot(intn,inte); voidmain(void){ intt=10; printf("%d%d",t,pot(t,2)); } intpot(intn,inte){ inttotal=n; for(e;e>1;e) total=total*n; return(total); }

Note que o valor da varivel t, usada como argumento na chamada de pot, permanece inalterado, de modo que a sada deste programa ser ''10 100''.

102

Exemplo
#include<stdio.h> voidtroca(int*x,int*y); voidmain(void){ inta,b; scanf("%d%d",&a,&b); printf("a=%db=%d\n",a,b); troca(&a,&b); printf("a=%db=%d\n",a,b); } voidtroca(int*x,int*y){ inttemp; temp=*x; *x=*y; *y=temp; }

Para a chamada por referncia, deve-se passar para a funo um ponteiro para cada argumento que se deseja modificar

103

Funes e Matrizes

Em C, um nome de matriz sem qualquer ndice um ponteiro para o primeiro elemento da matriz. H 3 maneiras de se declarar um parmetro que ir receber um ponteiro para matriz.

104

Exemplos
#include<stdio.h>
Caso 1) Declarando como uma matriz apesar de num ter sido declarado como uma matriz, o compilador C o converte automaticamente para um ponteiro de inteiros.

voidimprime(intnum[10]); voidmain(void){ intt[10],i; for(i=0;i<10;i++) t[i]=i; imprime(t); } voidimprime(intnum[10]){ inti; for(i=0;i<10;i++) printf("%d",num[i]); }

isto ocorre porque nenhum parmetro pode realmente receber uma matriz completa.

105

Exemplos
#include<stdio.h>
Caso 2) Especificando uma matriz sem dimenso Neste caso, num declarado como uma matriz de inteiros de tamanho desconhecido.

voidimprime(intnum[]); voidmain(void){ intt[10],i; for(i=0;i<10;i++) t[i]=i; imprime(t); } voidimprime(intnum[]){ inti; for(i=0;i<10;i++) printf("%d",num[i]); 106 }

Os limites da matriz precisam ser respeitados, o que fica por conta do programador, pois C no testa tais limites. (Este mtodo realmente define num como um ponteiro para inteiros).

Exemplos
#include<stdio.h>
Caso 3) Usando Ponteiros Isto permitido porque qualquer ponteiro pode ser indexado usando [], como se fosse uma matriz.

voidimprime(int*num); voidmain(void){ intt[10],i; for(i=0;i<10;i++) t[i]=i; imprime(t); } voidimprime(int*num){ inti; for(i=0;i<10;i++) printf("%d",num[i]); }

Esta a forma mais comum em programas profissionais.

107

Argumentos para main()

Freqentemente, necessrio passar informaes para um programa antes que ele inicie a executar Isto feito mediante os argumentos da linha de comando. Exemplo: marilton@redbull:~$./progparq.txt Neste exemplo, prog poderia ser o programa, p poderia ser uma opo para imprimir os dados do arquivo arq.txt Todo programa C executa a partir da funo main Existem 2 argumentos internos especiais que so usados para receber os argumentos da linha de comando: argc e argv
108

Argumentos para main()

argc

Contm o nmero de argumentos de linha de comando digitados pelo usurio Obviamente, um inteiro argc sempre vale ao menos 1 porque o prprio nome do programa considerado como primeiro argumento. um ponteiro para uma matriz de ponteiros para caractere (char*argv[]); Cada elemento nessa matriz aponta para um argumento da linha de comando Todos os argumentos da linha de comando so strings (quaisquer nmeros tero que ser convertidos pelo programa para o formato adequado)

argv

109

Exemplo
Este programa imprime a string que vier aps o nome usado para invoc-lo (cham-lo):
#include<stdio.h> #include<stdlib.h>//porcausadeexit() voidmain(intargc,char*argv[]){ if(argc!=2){ printf("Erro:Informeseunomecomoparmetro!\n"); exit(1); } printf("Ol,%s!\n",argv[1]); }

110

Outros Exemplos
#include<stdio.h> #include<string.h> voidinverte(char*s); voidmain(void){ char*msg="EugostodeC"; inverte(msg); } voidinverte(char*s){ inti; for(i=strlen(s)1;i>=0;i) putchar(s[i]); }
111

Outros Exemplos
#include<stdio.h> intsubstring(char*string1,char*string2); voidmain(void){ if(substring("Cehlegal","eh")) printf("substring!\n"); else printf("Nosubstring!\n"); } intsubstring(char*string1,char*string2){ inti; char*p1,*p2; for(i=0;string1[i];i++){ p1=&string1[i]; p2=string2; while(*p2&&*p2==*p1){ p1++; p2++; } if(!*p2) return1; } return0; }

112

Funes

Todas as funes, exceto as do tipo void, retornam um valor Este valor explicitamente especificado pelo comando return Se no houver um comando return na funo, ento o valor de retorno ser tecnicamente indefinido Neste caso, geralmente os compiladores C devolvem o valor zero (mas no se pode contar com isso) Desde que uma funo no seja void, ela pode ser usada como operando em qualquer expresso vlida em C
113

Biblioteca de Rotinas
principal.c bib.h
intfatorial(intn);

#include<stdio.h> #include"bib.h" main(){ intn; printf("Informenparaofatorial:"); scanf("%d",&n); printf("fat(%d)=%d",n, fatorial(n)); }

bib.c
#include"bib.h" intfatorial(intn){ if((n==1)||(n==0))return1; elsereturnn*fatorial(n1); }

para compilar e gerar o executvel gccprincipal.cbib.coteste


114

Exerccios
(1) Modifique o programa do exerccio 1 do slide 27, de modo a fazer o clculo da mdia das notas utilizando uma funo, que recebe como parmetros as notas N1, N2 e MT, e devolve a mdia M. O programa verifica se o aluno atingiu a mdia 7 e em caso positivo, o programa imprime a mensagem ''aprovado por mdia''. Caso contrrio, o programa chama uma outra funo que calcula e retorna o valor necessrio na optativa, que ser impresso no programa principal. (2) Faa um programa que calcule e imprima o fatorial de um nmero N. Este programa deve usar uma funo, a qual calcula o fatorial do nmero lido. No esquea de testar as restries cabveis a N.
115

Exerccios
(3) Faa um programa utilizando uma funo que l um nmero inteiro e verifica se este nmero primo ou no, imprimindo uma mensagem condizente. (4) Faa um programa que l dois nmeros inteiros, A e B, e, com uma funo, testa se estes nmeros so amigos. Dizemos que dois nmeros so amigos se cada um deles igual a soma dos divisores prprios do outro. Os divisores prprios de um nmero positivo N so todos os divisores inteiros positivos de N exceto o prprio N. (5) Modifique o programa do exerccio 2, de modo que o nmero N seja passado como parmetro na linha de comando. (6) Modifique o programa do exerccio anterior, transformando a funo "fatorial" em uma funo recursiva.
116

Exerccios
(7) Faa um programa que l n nmeros decimais (n fornecido pelo usurio), armazenando-os em um vetor. Logo aps, uma funo deve retirar os nmeros duplicados que eventualmente possam existir neste vetor, deixando apenas uma ocorrncia de cada nmero. Ao final, o vetor resultante deve ser impresso na tela. (8) Faa um programa que leia uma string (de 80 caracteres) chamada linha e, com uma funo, identifique cada palavra (substring) desta linha copiando-a para um novo vetor. Ao final, o programa deve imprimir as palavras separadas, uma palavra por linha. Dicas: i) faa uma funo para identificar o fim e/ou o incio de cada substring em linha; e, ii) utilize o modo de leitura apresentado no slide 59.
117

Estruturas

A linguagem C permite ao usurio criar tipos de dados de 5 formas diferentes:


Estrutura (chamado tipo de dado agregado) Campo de Bit Unio Enumerao Usando typedef

118

Uma estrutura uma coleo de variveis referenciadas por um nome til quando se deseja agrupar informaes (registros) Uma definio de estrutura forma um modelo que pode ser usado para criar variveis de estrutura As variveis que formam a estrutura so chamados membros (ou campos ou elementos ou registros). Geralmente, todos os membros de uma estrutura so relacionados
119

Criando uma Estrutura


structend{ charnome[30]; charrua[40]; charcidade[20]; charestado[3]; unsignedlongintcep; };

Especificador de Tipo

Elementos

Fim da Definio (ponto-e-vrgula)

No trecho acima, nenhuma varivel foi de fato declarada. Apenas a forma dos dados foi definida. Para declarar uma varivel do tipo end deve-se escrever: structendinfo;

120

Quando uma varivel de estrutura (como end) declarada, o compilador C aloca automaticamente memria suficiente para acomodar todos os seus membros. Exemplo (assumindo caracteres com 1 byte e inteiros longos com 4 bytes):

nome (30 bytes) rua (40 bytes) cidade (20 bytes) estado (3 bytes) cep (4 bytes)
121

Declaraes de Variveis
Apenas uma varivel struct{ charnome[30]; charrua[40]; charcidade[20]; charestado[3]; unsignedlongintcep; }info; Mais de uma varivel structend{ charnome[30]; charrua[40]; charcidade[20]; charestado[3]; unsignedlongintcep; }info,info2,info3;

122

Forma Geral
structidentificador { tipovarivelregistro; tipovarivelregistro; tipovarivelregistro; ... }variveisestutura;

123

Referenciando Elementos

A forma geral para se acessar um elemento de estrutura : nome_da_estrutura.nome_do_elemento Elementos individuais de estruturas so referenciados por meio do operador ponto. info.cep=96010; Atribui o valor 96010 ao campo cepda varivel estrutura info. Exemplos: printf(%d,info.cep); scanf(%d,&info.cep);
124

Referenciando Elementos
inti;charc; while((c=getchar())!='\n') { info.nome[i]=c; i++; } info.nome[i]='\0'; inti; while((info.nome[i]!='\0') { putchar(info.nome[i]); i++; }

ou gets(info.nome)

ou printf(%s,info.nome)
125

Atribuio de Estruturas
Em C padro ANSI o contedo de uma estrutura pode ser atribudo a outra estrutura do mesmo tipo. #include<stdio.h> voidmain(void){ struct{ inta; intb; }x,y; x.a=10; y=x; printf(%d,y.a); }
126

Atribui uma estrutura a outra do mesmo tipo

Matrizes de Estruturas

o uso mais comum para estruturas... Primeiro definir uma estrutura Depois, declarar uma varivel matriz desse tipo structendinfo[100]; Cria 100 conjuntos de variveis, onde cada varivel est organizada conforme definido na estrutura end.
127

Exemplo
#include<stdio.h> #include<stdlib.h> #defineMAX100 structend{ charnome[31]; charrua[41]; charcidade[21]; charestado[3]; unsignedlongintcep; }info[MAX]; voidcria_lista(void); voidinsere(void); voidapaga(void); voidimprime(void); intmenu(void); intlivre(void); voidler_string(charpalavra[100],inttamanho);

Definio da Estrutura
Obs.: 1 caractere a mais em cada string por causa do \0

Prottipos das Funes

128

Exemplo (cont.)
intmain(void){ intescolha; cria_lista(); for(;;){ escolha=menu(); switch(escolha){ case1:insere(); break; case2:apaga(); break; case3:imprime(); break; case4:exit(0); break; } } } Inicializa a Lista

A funo main() possui chamadas para outras funes deixando o cdigo mais claro. H cinco funes sendo chamadas alm de exit(). A quinta funo est sendo chamada dentro da funo insere().

129

Exemplo (cont.)
voidcria_lista(void){ inti; for(i=0;i<MAX;i++) info[i].nome[0]='\0'; }
Um registro disponvel ter '\0' na primeira posio do nome. No incio do programa todas as posies esto livres. Logo, coloca-se '\0' na primeira posio do campo nome de cada registro.

intmenu(void){ intc=0; do{ printf("MENU:\n"); printf("\t1.Inserirumnome\n"); printf("\t2.Excluirumnome\n"); printf("\t3.Listaroarquivo\n"); printf("\t4.Sair\n"); printf("Digitesuaescolha:"); scanf("%d",&c); }while(c<=0||c>4); getchar(); returnc; }

Esta funo solicita ao usurio que digite uma opo vlida, retornando esta informao para a funo que a chamou.

130

Exemplo (cont.)
voidler_string(charpalavra[100],inttamanho){ inti=0; charc; c=getchar(); while((c!='\n')&&(i<tamanho)){ palavra[i++]=c; c=getchar(); } palavra[i]='\0'; if(c!='\n'){ c=getchar(); while((c!='\n')&&(c!=EOF)){ c=getchar(); } } }
131 L a string, caractere por caractere, at encontrar um \n ou estourar o tamanho passado como parmetro. E, adiciona um \0 ao final da string.

Aqui, limpa o buffer que tem os caracteres que ficaram aps o limite estipulado.

Exemplo (cont.)
voidinsere(void){ intposicao; posicao=livre(); if(posicao==1){ printf("\nEstruturaCheia!!"); return; } printf("Registro%d:\n",posicao); printf("\tNome:"); ler_string(info[posicao].nome,30); printf("\tRua:"); ler_string(info[posicao].rua,40); printf("\tCidade:"); ler_string(info[posicao].cidade,20); printf("\tEstado:"); ler_string(info[posicao].estado,2); printf("\tCEP:"); scanf("%d",&info[posicao].cep); }
Esta funo inicia chamando a funo livre, a qual retorna o ndice da primeira posio livre, a partir da posio 0.

Aps, ela solicita os dados de uma usurio, preenchendo cada registro

132

Exemplo (cont.)
intlivre(void){ inti; for(i=0;info[i].nome[0]&&i<MAX;i++); if(i==MAX)return1; returni; } voidapaga(void){ intposicao; printf("NmerodoRegistro:"); scanf("%d",&posicao); if(posicao>=0&&posicao<MAX) info[posicao].nome[0]='\0'; }
Retorna o ndice da 1a. posio livre a partir da posio 0. Caso todas estejam ocupadas, retorna -1.

Marca um endereo como disponvel, escrevendo '\0' na primeira posio do campo nome. Na verdade os dados no so apagados

133

Exemplo (cont.)
voidimprime(void) { inti; for(i=0;i<MAX;i++) Esta funo imprime todos if(info[i].nome[0]!='\0') os dados de todas { as posies da matriz printf("Registro%d:\n",i); de estruturas, iniciando pelos dados printf("\tNome:%s",info[i].nome); da posio 0 (zero) printf("\tRua:%s",info[i].rua); printf("\tCidade:%s",info[i].cidade); printf("\tEstado:%s\n",info[i].estado); printf("\tCEP:%lu\n",info[i].cep); } }

134

typedef

C permite que sejam definidos explicitamente novos nomes aos tipos de dados utilizando a palavra-chave typedef No se est criando uma nova classe de dados, mas apenas definindo um novo nome para tipos j existentes. Exemplo: typedeffloatnota; notaprova01;
135

Exemplo 1
#include<stdio.h> typedefstruct{ intdia; intmes; intano; }data; voidmain(void){ dataaniversario; aniversario.dia=14; aniversario.mes=1; aniversario.ano=1975; printf("%d/%d/%d.",aniversario.dia,aniversario.mes, aniversario.ano); }
136

Exemplo 2
#include<stdio.h> #include<math.h> typedefstruct{ intx; inty; }ponto; typedefstruct{ pontocie; //cantoinferioresquerdo pontocsd; //cantosuperiordireito }retangulo; typedefstruct{ pontocentro; floatraio; }circulo; floatdistancia(intx1,inty1,intx2,inty2) { returnsqrt(pow(fabs(x2x1),2)+pow(fabs(y2y1),2)); }

137

intmain(void){ pontoA; pontoB; circuloC; retanguloR; floatdist; printf("InformeascoordenadasdopontoA:"); scanf("%d%d",&A.x,&A.y); printf("InformeascoordenadasdopontoB:"); scanf("%d%d",&B.x,&B.y); R.cie=A; R.csd=B; printf("CoordenadadoCIEdeR:(%d,%d)\n",R.cie.x,R.cie.y); printf("CoordenadadoCSDdeR:(%d,%d)\n\n",R.csd.x,R.csd.y); C.centro=B; C.raio=10.0; printf("CoordenadadocentrodeC:(%d,%d)\n",C.centro.x,C.centro.y); printf("RaiodeC:%f\n",C.raio); dist=distancia(C.centro.x,C.centro.y,A.x,A.y); if(dist<=C.raio) printf("OpontoAestDENTROdocrculoC.\n"); else printf("OpontoAestFORAdocrculoC.\n"); printf("DistnciadopontoAaocentrodeC:%f",dist); return0; }

138

Exerccios
(1) Faa download do programa do slide 128 visto em aula. Compile o programa. Teste-o. (2) Modifique o programa do slide 128, de modo que ele permita apagar somente os dados de uma pessoa com Nome e Sobrenome fornecidos pelo usurio do programa. Porm, antes de apagar os dados, o programa deve perguntar se o usurio deseja mesmo apagar... Sugesto: fazer uma funo que busca na lista a posio (ndice) onde se encontram armazenados os dados de uma pessoa de Nome e Sobrenome (ex: Joao Silva). (3) Modifique o programa do slide 128, de modo que ele permita tambm a impresso de todos os dados de uma pessoa com Nome e Sobrenome. Sugesto: usar a funo de busca feita na questo 2. (4) Modifique o programa do slide 128, de modo que antes de inserir um novo nome, ele teste se o referido nome j est presente na lista (testar ambos Nome e Sobrenome). Sugesto: usar a funo de busca feita na questo 2. 139

Arquivos

Streams e Arquivos

O sistema de E/S da linguagem C fornece uma interface consistente ao programador, independentemente do dispositivo real que acessado. Este sistema (que uma abstrao) chamado de stream e o dispositivo real chamado de arquivo. Da decorre que, em C, todos os dispositivos so encarados como arquivos
140

Streams

O sistema de arquivos de C projetado para trabalhar com uma ampla variedade de dispositivos, incluindo:

terminais, acionadores de disco, e acionadores de fita.

Embora cada um dos dispositivos seja muito diferente, o sistema de arquivo com buffer transforma-os em um dispositivo lgico chamado de stream.

141

Streams

Todas as streams comportam-se de forma semelhante. Pelo fato de as streams serem totalmente independentes do dispositivo, a mesma funo pode escrever em um arquivo em disco ou em algum outro dispositivo, como o console. Existem dois tipos de streams: texto e binria.
142

Streams de Texto

Um stream de texto uma seqncia de caracteres. O padro C ANSI permite (mas no exige) que uma stream de texto seja organizada em linhas terminadas por um caractere de nova linha. Porm, o caractere de nova linha opcional na ltima linha e determinado pela implementao.
143

Streams Binrias

Uma stream binria uma seqncia de bytes com uma correspondncia de um para um com aqueles encontrados no dispositivo externo. O nmero de bytes escritos (ou lidos) o mesmo que o encontrado no dispositivo externo. Porm, um nmero definido pela implementao de bytes nulos pode ser acrescentado a um stream binrio. Esse bytes nulos poderiam ser usados para aumentar a informao para que ela preenchesse um setor de um disco, por exemplo.

144

Arquivos

Em C, um arquivo pode ser qualquer coisa, desde um arquivo em disco at um terminal ou uma impressora. Associa-se um stream com um arquivo especfico realizando uma operao de abertura. Uma vez o arquivo aberto, informaes podem ser trocadas entre ele e o seu programa.
145

Arquivos

Nem todos os arquivos apresentam os mesmos recursos. Por exemplo, um arquivo em disco pode suportar acesso aleatrio (sequencial), enquanto um teclado no pode. Isso releva um ponto importante sobre o sistema de E/S de C: todas as streams so iguais, mas no todos os arquivos.
146

Arquivos

Se o arquivo pode suportar acesso aleatrio

Abrir este arquivo inicializa o indicador de posio no arquivo para o comeo do arquivo Quando cada caractere lido ou escrito no arquivo, o indicador de posio incrementado, garantindo progresso atravs do arquivo.

147

Arquivos

Um arquivo desassociado de uma stream especfica por meio de uma operao de fechamento. Se um arquivo aberto para sada for fechado, o contedo, da sua stream associada ser escrito no dispositivo externo. Este processo geralmente referido como descarga (flushing) da stream e garante que nenhuma informao seja acidentalmente deixada no buffer do disco.
148

Arquivos

Todos os arquivos so fechados automaticamente quando o programa termina normalmente, com

main() retornando ao sistema operacional ou uma chamada a exit()

Os arquivos no so fechados quando um programa quebra (crash) ou quando ele chama abort().
149

Fundamentos do Sistema de Arquivos

Cada stream associada a um arquivo tem uma estrutura de controle de arquivo do tipo FILE. Esta estrutura definida no cabealho stdio.h. O sistema de arquivos C ANSI composto de diversas funes interrelacionadas. Estas funes exigem o cabealho stdio.h. A maioria das funes comea com a letra f.
150

Principais Funes
Nome fopen() fclose() puts() fputs() gets() fgets() fseek() fprintf() fscanf() feof() ferror() rewind() remove() fflush() Funo
abre um arquivo fecha um arquivo escreve um caractere em um arquivo idem l um caracteres de um arquivo idem posiciona um arquivo em um byte especfico o mesmo que printf() para console o mesmo que scanf() para console devolve verdadeiro para fim de arquivo devolve verdadeiro se ocorreu algum erro recoloca o indicador de posio para o incio do arquivo apaga um arquivo descarrega um arquivo
151

arquivo de cabealho stdio.h fornece os prottipos para as funes de E/S e define estes trs tipos: size_t, fpos_t e FILE

Os tipos size_t e fpos_t so essencialmente o mesmo que um unsigned. O tipo FILE ser discutido logo adiante

stdio.h tambm define vrias macros. As mais relevantes so: NULL, EOF, FOPEN_MAX, SEEK_SET, SEEK_CUR e SEEK_END.
152

A macro NULL define um ponteiro nulo A macro EOF geralmente definida como 1 e o valor devolvido quando uma funo de entrada tenta ler alm do final do arquivo FOPEN_MAX, define um valor inteiro que determina o nmero de arquivos que podem estar abertos ao mesmo tempo As outras macros so usadas com fseek(), que uma funo que executa 153 acesso aleatrio em um arquivo.

Ponteiro de Arquivo

Um ponteiro de arquivo um ponteiro para informaes que definem vrias coisas sobre o arquivo:

nome, status e a posio atual do arquivo

Um ponteiro de arquivo uma varivel ponteiro do tipo FILE. Para ler ou escrever arquivos, seu programa precisa usar ponteiros de arquivo. Para obter uma varivel ponteiro de arquivo, use o comando: FILE*fp;
154

Abrindo um Arquivo

A funo fopen() abre uma stream para uso e associa um arquivo a ela Ela retorna o ponteiro de arquivo associado a este arquivo
FILEfopen(constchar*nomearq,constchar*modo*);

onde nomearq um ponteiro para uma cadeia de caracteres que forma um nome vlido de arquivo e pode incluir uma especificao de caminho de pesquisa (path).

155

Abrindo um Arquivo
FILE*fp; fp=fopen(arquivo.txt,w);
Modo r w a rb wb ab r+ w+ a+ r+b w+b a+b Significado abre arquivo texto para leitura cria arquivo texto para escrita anexa ao arquivo texto abre arquivo binrio para leitura cria arquivo binrio para escrita anexa ao arquivo binrio abre arquivo texto para leitura/escrita cria arquivo texto para leitura/escrita anexa ao arquivo texto para leitura/escrita abre arquivo binrio para leitura/escrita cria arquivo binrio para leitura/escrita anexa ao arquivo binrio para leitura/escrita
156

Abrindo um Arquivo
FILE*fp; if((fp=fopen(arquivo.txt,w))==NULL){ printf(naofoipossivelcriaroarquivo\n); exit(1); }

Neste caso, qualquer erro na abertura do arquivo ser detectado (e.g., disco cheio ou protegido contra gravao).

157

Algumas Consideraes

Confirmar o sucesso de fopen() antes de tentar qualquer outra operao sobre o arquivo! Se voc usar fopen() para abrir um arquivo com permisso para escrita, qualquer arquivo j existente com esse nome ser apagado e um novo arquivo ser iniciado Se nenhum arquivo com este nome existe, ento o arquivo ser criado.
158

Se voc deseja adicionar ao final do arquivo, deve usar o modo a. Arquivos j existentes s podem ser abertos para operaes de leitura. Se o arquivo no existe, um erro devolvido. Se um arquivo aberto para operaes de leitura/escrita, ele no ser apagado caso j exista e, seno existir, ele ser criado.
159

Fechando um Arquivo

A funo fclose() fecha uma stream que foi aberta por meio de uma chamada a fopen() Ela escreve qualquer dado que ainda permanece no buffer de disco no arquivo e, ento, fecha normalmente o arquivo em nvel de sistema operacional Se um arquivo aberto para operaes de leitura/escrita, ele no ser apagado caso j exista e, seno existir, ele ser criado.

160

Fechando um Arquivo

Uma fclose() tambm libera o bloco de controle de arquivo associado stream, deixando-o disponvel para reutilizao. Em muitos casos, h um limite do sistema operacional para o nmero de arquivos abertos simultaneamente, assim, voc deve fechar um arquivo antes de abrir outro.

161

Fechando um Arquivo

A funo fclose() tem o seguinte prottipo: intfclose(FILE*fp); onde fp o ponteiro de arquivo devolvido pela chamada a fopen(). Um valor de retorno zero significa uma operao de fechamento bem sucedida. Qualquer outro valor indica um erro. A funo padro ferror() pode ser utilizada para determinar e informar qualquer problema. Geralmente, fclose() falhar quando um disco tiver sido retirado prematuramente do acionador ou no houver mais espao no disco.

162

Exemplo

Abrindo um Arquivo com Nome Fornecido

FILE*fp; charnome_arq[50]; printf(entrecomonomedoarquivo\n); fgets(nome_arq,49,stdin); if((fp=fopen(nome_arq,r))==NULL){ printf(Erroaoabriroarquivo%s,nome_arq); exit(1); }

163

Exemplo

Lendo e Imprimindo um Arquivo Texto

#defineMAX120 ... FILE*fp; charnome_arq[50],linha[120]; printf(entrecomonomedoarquivo\n); fgets(nome_arq,49,stdin); if((fp=fopen(nome_arq,r))==NULL){ printf(Erroaoabriroarquivo%s\n,nome_arq); exit(1); } while(fgets(linha,MAX,fp)!=NULL){ printf(%s,linha); }
164

Exemplos
#include<stdio.h> main(){ FILE*fp; charnome_arquivo[32]; doublea; printf("Informeonomedoarquivo:"); scanf("%s",nome_arquivo); fp=fopen(nome_arquivo,"w"); printf("Informeumnumero(999parasair):"); scanf("%lf",&a); while(a!=999){ fprintf(fp,"%10.4lf",a); printf("Informeumnumero(999parasair):"); scanf("%lf",&a); } fclose(fp); fp=fopen(nome_arquivo,"r"); printf("\n*****conteudodoarquivocriado******\n"); while(fscanf(fp,"%lf",&a)!=EOF) printf("\n\t%lf",a); fclose(fp); }

165

Exemplos
#include<stdio.h> #include<stdlib.h> intmain(void){ intinum=10; floatfnum=2.5; doublepi=3.141516; charc='Z'; FILE*pa; char*nome="texto.txt"; if((pa=fopen(nome,"w+b"))==NULL){ printf("\n\nNaofoipossivelabriroarquivoparaescrita.\n"); exit(1); } fwrite(&inum,sizeof(int),1,pa); fwrite(&fnum,sizeof(float),1,pa); fwrite(&pi,sizeof(double),1,pa); fwrite(&c,sizeof(char),1,pa); rewind(pa); fread(&inum,sizeof(int),1,pa); fread(&fnum,sizeof(float),1,pa); fread(&pi,sizeof(double),1,pa); fread(&c,sizeof(char),1,pa); printf("%d,%f,%lf,%c\n",inum,fnum,pi,c); fclose(pa); exit(0); }

166

Exemplos
#include<stdio.h> /*descrioderegistroaleatriopodeserqualqueruma*/ structrec { intx,y,z; }; /*gravaedepoisl10registrosarbitrrios doarquivo"junk".*/ intmain() { inti,j; FILE*f; structrecr; /*criaoarquivode10registros*/ f=fopen("junk","w"); if(!f) return1; for(i=1;i<=10;i++) { r.x=i; fwrite(&r,sizeof(structrec),1,f); } fclose(f); //seguenoprximoslide 167

Exemplos
/*los10registros*/ f=fopen("junk","r"); if(!f) return1; for(i=1;i<=10;i++) { fread(&r,sizeof(structrec),1,f); printf("%d\n",r.x); } fclose(f); printf("\n"); /*usafseekparaleros10registros emordeminversa*/ f=fopen("junk","r"); if(!f) return1; for(i=9;i>=0;i) { fseek(f,sizeof(structrec)*i,SEEK_SET); fread(&r,sizeof(structrec),1,f); printf("%d\n",r.x); } fclose(f); printf("\n"); //seguenoprximoslide

168

Exemplos
/*usafseekparalertodoosoutrosregistros*/ f=fopen("junk","r"); if(!f) return1; fseek(f,0,SEEK_SET); for(i=0;i<5;i++) { fread(&r,sizeof(structrec),1,f); printf("%d\n",r.x); fseek(f,sizeof(structrec),SEEK_CUR); } fclose(f); printf("\n"); /*usafseekparalero4registro, altereoeescrevaodevolta*/ f=fopen("junk","r+"); if(!f) return1; fseek(f,sizeof(structrec)*3,SEEK_SET); fread(&r,sizeof(structrec),1,f); r.x=100; fseek(f,sizeof(structrec)*3,SEEK_SET); fwrite(&r,sizeof(structrec),1,f); fclose(f); printf("\n"); //seguenoprximoslide

169

Exemplos
/*los10registrosparagarantir queo4arquivofoialterado*/ f=fopen("junk","r"); if(!f) return1; for(i=1;i<=10;i++) { fread(&r,sizeof(structrec),1,f); printf("%d\n",r.x); } fclose(f); return0; } //FIM

170

Exerccios
(1) Modifique o programa do slide 128, de modo a incluir duas novas opes no menu principal. Gravar Lista de Endereos em Arquivo e Recuperar Lista de Endereos de Arquivo. Implemente estas novas rotinas, sempre solicitando ao usurio que informe o nome do arquivo para cada operao. Faa testes manipulando tanto com arquivos binrios quanto com arquivos texto.
171

Alocao de Memria

Alocao de memria diz respeito a como a memria (necessria para o armazenamento dos dados) reservada em um programa Existem 2 formas de um programa em C alocar memria:

Esttica Dinmica

172

Alocao Esttica

Ocorre na declarao de variveis globais e variveis locais; No caso de variveis globais e variveis locais estticas, o armazenamento fixo durante todo o tempo de execuo do programa; Variveis globais so alocadas em tempo de compilao; No caso de variveis locais, o armazenamento dura o tempo de vida da 173 varivel.

Mapa de Memria
Memria do Sistema alta Pilha Variveis Locais

Memria Livre heap Variveis Globais

Programa baixa
174

Alocao Dinmica

Para a alocao esttica, necessrio que se saiba de antemo (antes do incio do programa) a quantidade de memria que ser necessria; Estimativas podem ser feitas, porm h o risco de sub ou superestimar; Assim, muitas vezes necessrio que um programa possa ir ajustando a memria a ser usada durante sua execuo; Ajustar = alocar ou desalocar
175

Alocao Dinmica

Alocao dinmica o mtodo pelo qual um programa ajusta dinamicamente a quantidade de memria a ser usada durante sua execuo; Permite otimizar o uso da memria implementado mediante funes de alocao/liberao da memria, as quais o programador precisa usar de maneira coerente
176

Mapa de Memria
Memria do Sistema alta Pilha Variveis Locais

Memria Livre heap Variveis Globais

Variveis Alocadas Dinamicamente

Programa baixa
177

Alocao Dinmica

Principais funes C para alocao dinmica de memria:

mallocefree;

Implementadas na biblioteca stdlib.h H diversas outras funes mais especficas, as quais normalmente esto implementadas em stdlib.h

178

Exemplo - malloc

Serve para alocar memria; Devolve um ponteiro para o incio da quantidade de memria alocada; Exemplo: char*p; p=malloc(1000); O trecho acima aloca 1000 bytes de memria para o armazenamento de caracteres.
179

Porm:

A memria ocupada por um determinado tipo pode variar de mquina para mquina! As implementaes devem ser independentes da mquina!

Soluo: usar o operador sizeof

180

sizeof retorna o tamanho de uma varivel ou de um tipo sizeof funciona em tempo de compilao Exemplo de uso de sizeof:

floatx; printf(umfloatocupa%dbytesnestamaquina,sizeof(x)); printf(umintocupa%dbytesnestamaquina,sizeof(int));


Para mais detalhes, veja o programa do slide 13.

181

int*p; p=malloc(50*sizeof(int)); Aloca memria suficiente para armazenar 50 inteiros (de maneira contgua na memria)

182

Porm, pode ser que o programa tenha alocado muita memria, a ponto de no restar espao na rea de heap (efetivamente, isto pode ocorrer); Se malloc no conseguir alocar memria, ele retornar um ponteiro nulo; Logo, preciso testar o resultado de malloc:
char*p; if((p=malloc(50*sizeof(char)))==NULL){ printf(Nofoipossivelalocarmemoria\n); exit(1); }

183

Exemplo - free

Libera memria previamente alocada de maneira dinmica, por meio de uma das funes de alocao dinmica (devolve memria ao heap) Recebe como argumento um ponteiro para a poro de memria que se deseja liberar Jamais use free com um argumento invlido, pois isto destri a lista de memria livre!! free(p);
184

Exemplo
#include<stdio.h> #include<stdlib.h> main(){ intn,i,*p,*inicio; printf("Entrecomonumerodeelementos:\n"); scanf("%d",&n); if((p=malloc(n*sizeof(int)))==NULL){ printf("Nofoipossvelalocarmemria\n"); exit(1); } inicio=p; for(i=0;i<n;i++,p++){ printf("Entrecomo%dvalor:\n",i+1); scanf("%d",p); } p=inicio; for(i=0;i<n;i++,p++){ printf("%do.valor:%d\n",i+1,*p); } }

185

Operaes bit a bit


Operador & ! ^ ~ >> << AND OR XOR Complemento Deslocamento a esquerda Deslocamento a direita Ao

11000001 01111111 & 01000001

10000000 00000011 ! 10000011

01111111 01111000 ^ 00000111


186

Exemplo
#include<stdio.h> main(){ unsignedcharx; x=7; printf("%d",x); x=x<<1; printf("\n%d",x); x=x<<3; printf("\n%d",x); x=x<<2; printf("\n%d",x); x=x>>1; printf("\n%d",x); x=x>>2; printf("\n%d",x); x=~x; printf("\n%d",x); } Sada: 7(00000111) 14(00001110) 112(01110000) 192(11000000) 96(01100000) 24(00011000) 231(11100111)

x=x<<1;(multiplicaxpor2) x=x>>1;(dividexpor2)

187

Exemplo
#include<stdio.h> voidmain(void){ unsignedinti; intj; i=1; for(j=0;j<4;j++){ i=i<<1; printf("%d:%d\n",j,i); } for(j=0;j<4;j++){ i=i>>1; printf("%d:%d\n",j,i); } }
188

Qual a sada deste programa?

Unies

Uma unio um tipo de dado que pode ser usado de muitas maneiras diferentes. Por exemplo, uma unio pode ser interpretada como sendo inteiro em uma operao e um float ou double em outra. Embora as unies possam tomar a aparncia de uma estrutura, elas so muito diferentes. Uma unio pode conter um grupo de muitos tipos de dados, todos eles compartilhando a mesma localizao na memria.
189

No entanto, uma unio s pode conter informaes de um tipo de dados de cada vez. Sintaxe:

unionnome_tipo{ tipovar1; tipovar2; tipovar3; };

190

unionvarios_tipos{ charc; inti; floatf; doubled; }tdata; Faz-se referncia aos membros da unio usando o operador ponto: tdata.d=1.3;
191

Exemplo
#include<stdio.h> unionvarios_tipos{ charc; inti; floatf; doubled; }tdata; voidmain(void){ tdata.c='b'; printf("%c\n",tdata.c); tdata.i=1234; printf("%d\n",tdata.i); tdata.f=12.34; printf("%f\n",tdata.f); tdata.d=123456.78E+12; printf("%lf\n",tdata.d); printf("\n%c\n",tdata.c); printf("%d\n",tdata.i); printf("%f\n",tdata.f); printf("%lf\n",tdata.d); printf("\nOtamanhodestaunio:%dbytes.",sizeof(unionvarios_tipos)); }

192

Exemplo
#include<stdio.h> unionvarios_tipos{ charc; inti; floatf; doubled; }tdata; voidmain(void){

b 1234 12.340000 123456780000000000.000000 1731184768 0.000000 123456780000000000.000000

tdata.c='b'; printf("%c\n",tdata.c); tdata.i=1234; printf("%d\n",tdata.i); tdata.f=12.34; printf("%f\n",tdata.f); Otamanhodestaunio:8bytes. tdata.d=123456.78E+12; printf("%lf\n",tdata.d); printf("\n%c\n",tdata.c); printf("%d\n",tdata.i); printf("%f\n",tdata.f); printf("%lf\n",tdata.d); printf("\nOtamanhodestaunio:%dbytes.",sizeof(unionvarios_tipos)); }

193

enum

Um tipo de dado enum permite criar um tipo de dado de sua escolha em itens. enum til quando a informao pode ser mais bem representada por uma lista, como por exemplo, de valores inteiros indicando o nmero de meses do ano ou o nmero de dias da semana.

194

Exemplo
#include<stdio.h> enummeses{ janeiro=1,fevereiro,marco,abril,maio,junho,julho,agosto, setembro,outubro,novembro,dezembro }; voidmain(void){ intmes_corrente; intsoma,dif; enummesesfim; printf("Digiteomscorrente(1a12):"); scanf("%d",&mes_corrente); fim=dezembro; soma=(int)mes_corrente; dif=(int)fim(int)mes_corrente; printf("\n%dmesesamenos,poisfaltam%dparaacabaresteano.\n", soma,dif); }
195

Вам также может понравиться