Você está na página 1de 53

PROGRAMAO C ( Avanado )

NDICE
INTRODUO........................................................................................................................................ 3 CONCEITO.............................................................................................................................................. 3 ESTRUTURA BSICA DE UM PROGRAMA C ................................................................................. 4 TIPOS BSICOS ..................................................................................................................................... OPERADORES ARITMTICOS DE ATRIBUIO........................................................................... 11 OPERADORES RELACIONAIS............................................................................................................... COMANDOS DE SELEO .................................................................................................................... O COMANDO if ........................................................................................................................................ OPERADORES LGICOS........................................................................................................................ O COMANDO switch ................................................................................................................................ O COMANDO break.............................................................................................................................. 16 OPERADOR CONDICIONAL TERNRIO ( ? : ).................................................................................... LAOS DE REPETIES ........................................................................................................................ Estrutura de Repetio:............................................................................................................................... Lao for ...................................................................................................................................................... O LAO WHILE........................................................................................................................................ Estrutura do lao while : ............................................................................................................................. WHILE X FOR........................................................................................................................................... O LAO do-while ...................................................................................................................................... O COMANDO continue ............................................................................................................................. A Funo exit()........................................................................................................................................... FUNES / MDULOS / SUB-ROTINAS .......................................................................................... 24 FUNES.............................................................................................................................................. 25 VARIVEL GLOBAL........................................................................................................................... 26 O COMANDO return ............................................................................................................................. 26 PASSANDO DADOS PARA FUNES .............................................................................................. 27 USANDO VRIAS FUNES............................................................................................................. 28 RECURSIVIDADE ................................................................................................................................ 29 ARRANJOS............................................................................................................................................ 30 ARRANJOS MULTIDIMENSIONAL................................................................................................... 32 STRING.................................................................................................................................................. 34 REGISTROS E ESTRUTURAS ........................................................................................................... 37 Conjunto de Estruturas ........................................................................................................................... 39 Unies..................................................................................................................................................... 40 Argumentos argv e argc.......................................................................................................................... 40 PONTEIROS .......................................................................................................................................... 42 Operadores.............................................................................................................................................. 42 MATRIZES E PONTEIROS.................................................................................................................. 44 Streams ................................................................................................................................................... 47 Arquivos ................................................................................................................................................. 47 Referncias ............................................................................................................................................. 53

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 2

INTRODUO
O objetivo desta trabalho introduzir os conceitos bsicos essenciais para um bom habito de programar, utilizando como ferramenta de programao a linguagem de programao C. Criada por Dennis M. Ritchie e Ken Thompson no laboratrio Bell em 1972, baseada na linguagem B de Ken Thompson, que era uma evoluo da antiga linguagem BCPL. B foi nomeada como a primeira letra de BCPL e C como a segunda. Embora o termo linguagem estruturada em blocos no seja rigorosamente aplicvel a C, ele normalmente referida simplesmente como linguagem estruturada. A razo pela qual C no , tecnicamente, uma linguagem estruturada em blocos, que essas linguagens permitem que procedimentos e funes sejam declarados dentro de procedimentos e funes. No entanto, como C no permite a criao de funes dentro de funes, no pode ser chamada formalmente de uma linguagem estruturada em blocos. ( Schildt )

CONCEITO
O tipo de um dado determina o conjunto de valores a que uma constante pertence, ou que podem ser assumidos por uma varivel, uma expresso ou gerados por uma funo. Uma linguagem de programao representa um computador abstrato capaz de interpretar os termos utilizados nesta linguagem, os quais podem englobar um certo nvel de abstrao em relao aos objetos utilizados pela mquina fsica (Niklaus Wirth) Tipo Abstrato de Dados um modelo matemtico com um conjunto de operaes definidas sobre o modelo. Algoritmo um procedimento para resolver um problema matemtico em um nmero finito de passos, que freqentemente envolve repetio de operaes. Um algoritmo um procedimento computacional bem definido que toma alguns valores como entrada e produz alguns valores como sada. Programar estruturar dados e construir algoritmos. Analisar um algoritmo significa predizer quais recursos o algoritmo vai demandar quando executar. Programa: Forma de comunicao entre o programador e o computador Programas so traduzidos atravs de outros programas especiais: para a Linguagem de mquina binrio (compiladores e interpretadores.)

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 3

ESTRUTURA BSICA DE UM PROGRAMA C


consiste em uma coleo de funes forma geral
main ( ) { } // primeira funo a ser executada // incio da funo // fim da funo

As interpretaes abaixo so as mesmas, porem para uma melhor legibilidade vamos adotar a primeira definio para a estrutura de uma funo.
main ( ) { } main ( ) { } main() { }

Blocos de Comandos
Blocos de comandos so simplesmente grupos de comandos relacionados que so tratados como uma unidade. Os comandos que constituem um bloco esto logicamente conectados. Um bloco comea e termina com uma chave ( { } ). Um bloco de comando geralmente pode ser interpretado como um programa completo, uma funo completa, a parte verdadeira ou falsa de uma condio if-else ou o contedo de um lao de repetio.

A FUNO main ( )
A funo main() deve existir em algum lugar do programa e marca o ponto de incio da execuo do programa. As chaves limitam o corpo da funo. Toda instruo deve ser encerrada por ponto e vrgula ( ; ) Comentrios Comandos ( /* */ // ) Informao acrescentada ao cdigo para facilitar sua compreenso ignorado pelo compilador (no faz parte do cdigo objeto) Comentrio de Bloco, comea com ( /* ) terminando com ( */ ) Comentrios de linha // , comea com ( // ) terminando no final da linha.

A FUNO printf ( )
A funo printf() uma das funes de I/O ( entrada e sada) que usada em C. Ela no faz parte da definio da linguagem, mas todos os ambientes de programao que suportam a linguagem de programao C tem uma verso da funo printf() definida em suas bibliotecas. Funo de E / S ( definida no cabealho padro de entrada e sada stdio.h ) Uma funo pode receber uma informao (argumento)
Programao C / 2005-1
Verso 0.05 Pgina 4

Prof.: Ciro M. Santos

Sintaxe:
printf (expresso de controle,lista de argumentos);

main ( ) { int x = 2; // declarao de variveis local a funo printf (" O nmero %d",x); //printf recebe a informao x e //imprime-a na tela como forma de sada. }

OBS.: ( %d ) cdigo de formatao utilizado pela funo printf() na impresso dos dados.
Outras utilizaes de printf main ( ) { printf ("\r %s est a %d km de Caratinga \n \r ou a %d metros, Ipatinga, 98, 98000); }

Sada: Ipatinga est a 98 km de Caratinga ou a 98000 metros. \ n : um caractere de controle que indica uma mudana de linha. \ r : um caractere de controle que indica retorno do cursor ( <enter> ).
main ( ) { printf("a letra %c",a ); //a letra b sera interpretadas como char. printf (" vem antes de %c", b); }

Sada: a letra a vem antes de b

CARACTERES DE CONTROLE
Cdigo
\n

\r \t \b \ \\ \0

Descrio nova linha retorno do cursor (enter) tabulao ( tab ) retrocesso ( backspace ) aspas Barra Nulo

CDIGO DE FORMATAO
Cdigo %c %x %d %e %f %o %s %u Descrio car c caractere Hexadecimal Decimal Notao cientfica ponto flutuante Octal cadeia de caracteres (string) Decimal sem sinal
Programao C / 2005-1
Verso 0.05 Pgina 5

Prof.: Ciro M. Santos

EXPLORANDO A FUNO printf


Tamanho de campos: possvel estabelecer o tamanho mnimo para a impresso de um campo main ( ) { printf (" os alunos so %2d \ n", 350); printf (" os alunos so %4d \ n", 350); printf (" os alunos so %5d \ n", 350); } Sada: os alunos so 350 os alunos so 350 os alunos so 350 3 5 3 0 5 3

0 5

main ( ) { printf (" %3.1f printf (" %10.3f } Sada: 3456.8 3456.780

\ n", 3456.78); \ n",3456.78);

CONSTANTES E VARIVEIS Constantes


Constantes referem-se a valores fixos que o programa no pode alterar. Objeto que tem valor fixo e inaltervel . Ex: c, 8, primeiro programa

Variveis
Uma varivel uma posio nomeada de memria, que usada para guardar um valor que pode ser modificado pelo programa. um objeto que pode assumir diferentes valores es . espao de memria de um certo tipo de dado associado a um nome para referenciar seu contedo.

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 6

INICIALIZANDO VARIVEIS
/* */ A combinao de uma declarao de variveis com o operador de atribuio. O programa abaixo faz a demonstrao de alguns cdigos de formatao.

main ( ) { int evento = 5; char corrida = A; float tempo = 27.25; printf ("O melhor tempo da eliminatria %c",corrida); printf ("\n do evento %d foi % f", evento, tempo); }

Sada: O melhor tempo da eliminatria A do evento 5 foi 27.25


main ( ) { int idade; // declarao da varivel. Idade = 30; // inicializando a varivel printf (" A idade mnima : %d", idade); }

Sada: A idade mnima : 30

NOMES DE VARIVEIS
Quantos caracteres quiser (at 32). Comece com letras ou sublinhado: seguidos de letras, nmeros ou sublinhados 'C' sensvel ao caso: => peso Peso PESO pESo No podemos definir um identificador com o mesmo nome que uma palavra chave. Ex.: int char, int while, int for, int int.

Declarao de variveis em um programa na sua forma mais simples: tipo nome-da-varivel; tipo nome1, nome2, ... nomeN;

O Tipo uma instruo utilizada para reservar uma quantidade de memria para um certo tipo de dado, indicando o nome pela qual a rea ser referenciada (int, char, float...).

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 7

TIPOS BSICOS
Determina um conjunto de valores e as possveis operaes realizadas sobre os mesmos. Informa a quantidade de memria (bytes). Bytes 1 2 4 8 0 escala -128 a 127 -32.768 a 32.767 3.4e-38 a 3.4e+38 1.7e-308 a 1.7e+308 sem valor

tipo char int float double void

Modificadores de tipos
long int unsigned char unsigned int ( 4 bytes) ( 0 a 255 ) ( 0 a 65.535 )

Obs.: int tem sempre o tamanho da palavra da mquina.

A FUNO scanf( )
A funo scanf() uma das funes de I/O ( entrada e sada) que usada em C. Ela no faz parte da definio da linguagem, mas todos os ambientes de programao que suporta a linguagem de programao C tem uma verso da funo scanf() definida em suas bibliotecas. Funo de E / S ( Biblioteca : stdio.h ) Complemento de printf( )

Sintaxe
scanf( expresso de controle ,lista de argumentos) expresso de controle : % lista de argumentos : &varivel

main ( ) { int num; printf("Digite um nmero\n"); //o programa escrever na tela scanf("%d", &num); printf(" numero digitado foi %d ",num); // sada do programa.

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 8

OBS. : Logo que o usurio atender mensagem o nmero ser lido pela funo scanf(), sendo que o operador & indicar o endereo de memria da varivel indicada. /* A nica diferena do programa abaixo que uma letra ser lida pelo scanf(). */
main ( ) { char letra; printf(" Digite uma letra\n"); scanf ("%c", &letra); printf(" A letra digitada foi %c",letra); }

O OPERADOR DE ENDEREO (&)


O nome da varivel associado a um endereo de memria pelo computador Toda varivel ocupa uma rea de memria e seu endereo identificado pelo primeiro byte por ela ocupado com o deslocamento do tamanho da varivel

Quando usamos & precedendo uma varivel, estamos falando do endereo da mesma na memria
main ( ) { int num; num = 2; printf (" valor = %d, endereo = %u", num, &num); // %d valor decimal e %u um endereo de memria da varivel. }

Sada valor = 2, endereo = 1230

CDIGO DE FORMATAO scanf( )


Cdigo %c %d %e %f %o %x %u %s %lf Descrio Caracter Inteiro Nmero ou notao cientfica Ponto flutuante Octal Hexadecimal Decimal sem sinal ( endereo de memria) String (cadeia de caracteres) Double

/* O programa abaixo relaciona um caracter com o seu valor decimal da tabela ASCII, seu valor octal e hexadecimal. */
main ( ) { char a ; printf ( digite um caracter ); scanf ( % c, &a ); printf ( \n %c = %d em decimal, a, a); printf (%o em octal, %x em hexadecimal, }
Prof.: Ciro M. Santos

a,

a);
Pgina 9

Programao C / 2005-1

Verso 0.05

Digitando m:

m = 109 em decimal, 155 em octal, 6d em hexadecimal

LENDO E ESCREVENDO CARACTERES getchar( )

putchar()

L um caracter do teclado, sem a obrigatoriedade de pressionar < enter >, ou seja, aps a digitao do caracter. Escreve um caracter na tela a partir da posio atual do cursor.

#include <stdio.h> /* Funo usando getchar e putchar */

void main ( void ) { char ch; printf(" Digite um caracter: " ) ; ch = getchar( ); // o caracter est sendo lido do teclado. putchar(ch); // impresso do caracter na tela. }

OPERDORES ARITMTICOS
binrios: unrio: = + * / %

main ( ) { int resto, divisor, dividendo; printf(entre com 2 nmeros); scanf( %d %d , &dividendo, &divisor); resto = dividendo % divisor; // % resto da diviso entre dois num. printf(o resto da diviso inteira de %d, dividendo); printf(por %d = %d, divisor, resto); }

Sada: entre com 2 nmeros 10 4 o resto da diviso inteira de 10 por 4 = 2 O % como resto da diviso s aceita nmeros inteiros.

OPERADORES DE INCREMENTO E DECREMENTO


Incrementam / decrementam uma unidade de seu operando. pr - fixado (--x) ps -fixado (x++)

ex.: int n; n = 0;
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 10

n++; n = 0; ++n;

n=0, inicialmente a varivel ter valor zero e depois ser ps-fixada em 1. Neste caso a varivel ser primeiramente incrementada. como se fosse 1 + 0 = 1, n = 1.

main( ) { int num = 0; printf (" %d \n", printf (" %d \n", printf (" %d \n", printf (" %d \n", }

num); num++); num); ++num);

Sada:

0 0 1 2

main ( ) { int num = printf (" printf (" printf (" printf (" }

0; %d %d %d %d

\n",num); \n", ++num); \n", num++); \n",num);

Sada:

0 1 1 2

PRECEDNCIA ++ -* / % + - (binrio) = Ou seja: x = 3 * a++ - b y = 3 * --a - b z = a * b++ = (3 * (a++)) - b = (3 * (--a)) - b = a * (b ++)

Obs.: ++, -- s podem ser usados com variveis inteiras. CUIDADO COM printf( ) Ex.: n = 5; printf ( %d %d %d \n, n, n + 1, n++); sada: 5 6 5 Ex.: (avaliao feita esquerda)

main ( ) { int n, i = 3; n = i * (i + 1) + (++i); printf ("n = %d", n); }

OBS. : i tem valor 3 que somado com 1 no primeiro parntese ser 4 e incrementado no segundo continuar com o valor 4, logo 3*(4) + (4) = 24. Sada: n = 24

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 11

OPERADORES ARITMTICOS DE ATRIBUIO


+=, -=, *=, /=, %=. Atribuir um novo valor varivel dependendo do operador e da expresso a direita. A sintaxe: x op = exp equivalente a x = (x) op (exp) Ex.: i += 2 i = i + 2; x = x * (y + 1) x *= y + 1 t = t / 4 t /= 4 p = p % 6 p %= 6 h = h - 3; h -= 3

OPERADORES RELACIONAIS
Usados para comparaes Operador > >= < <= == != Descrio Maior Maior ou igual Menor Menor ou igual Igualdade Diferena

Em C no existe o tipo "booleano". 0 falso. Valor diferente de zero (0) verdadeiro.

main ( ) { int verdadeiro, falso; verdadeiro = (15 < 20); falso = (15 == 20); printf (Verd. = %d, falso = %d, verdadeiro, falso); }

Sada:

Verd. = 1

falso = 0

/* Definio de verdadeiro ou falso para um programa.*/ #define true = 1 #define false = 0 /* Para que este programa funcione devemos usar a biblioteca stdio.h. Quando usamos o comando define estamos definindo que a varivel ter um valor que por sua vez ser constante. */
main ( ) { int verdadeiro, falso; verdadeiro = true; falso = false;

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 12

printf (Verd. = %d, falso = %d, verdadeiro, falso);

Sada:

Verd. = 1

falso = 0

Precedncia:
! - ++ - * / % + < > <= >= == != && | | = += -= *= /= %= Aritmticos Relacionais Lgico Atribuio

COMANDOS DE SELEO
No desenvolvimento de um programa muitas vezes se faz necessrio o conhecimento de uma resposta para podermos decidir qual bloco de comando deve ser executado. Isto alcanado atravs dos comandos de decises disponveis na linguagem de programao. Permitir testes com uma varivel para decidir qual bloco de comando ser executado. if, if - else, switch e Operador Condicional Ternrio ( ? : ).

O COMANDO if
Estrutura : if ( condio ) instruo;
main ( ) { char ch; ch = getchar ( ); // obtm o caracter digitado. if (ch == p) // compara o caracter digitado coma letra p. printf (" voc pressionou a tecla %c ",ch); } MLTIPLAS INSTRUES

Estrutura:
if } ( condio ) comando 1; comando 2; {

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 13

if ANINHADOS

Se um comando if est dentro de outro if, dizemos que o if interno est aninhado
main ( ) { char ch; printf ( digite uma letra entre A e Z); ch = getche ( ); //obtm o prximo caracter a ser considerado. if (ch >= A) //faz o primeiro teste, se for verdadeiro faz o segundo. //As duas condies tm que ser verdadeiras. if (ch < = Z) printf (voc digitou uma letra maiscula) }

/* Aprimorando o programa anterior. */


main ( ) { char ch; printf (" Digite uma letra entre A e Z: "); ch = getche ( ); if (( ch >= 'A')&&(ch <= ' Z')) // && operador lgico and. printf (" Voc acertou\n"); // tem que ser satisfeita. } O COMANDO if - else

Comando if s executa as instrues que fazem parte do primeiro bloco, caso a condio de teste seja verdadeira, nada ser feito se a expresso for falsa. Comando else executar um bloco de instrues se a expresso de teste for falsa. Estrutura: if( condio ) {
instruo1; instruo2; // condio // verdadeira

} else { instruo3 // condio instruo4 // falso } main ( ) { if (getchar ( ) == c) printf (" Voc digitou c "); else printf (" Voc no digitou c"); } if - else ANINHADOS

Estrutura: if( condio1 )

instruo else if( condio2 ) instruo else if (condicao3) ...

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 14

main ( ) { int numero; printf("Digite um nmero \n"); scanf (" %d",&numero); if ( numero < 0 ) printf (" nmero menor que zero\n"); else if ( numero < 10) printf ("nmero 0 e < 10\n"); else if ( numero < 100) printf (" nmero 10 e < 100 \n") else printf ("nmero 100\n"); }

else sempre associado ao if mais interno (mais prximo) Note a diferena: /* Neste bloco o comando else est associado ao primeiro if, pois o if foi fechado antes de else, descartando assim a possibilidade de relacionamento com o segundo if.
*/ if (n > 0) if (a > z = }else z = { b) a; b;

OPERADORES LGICOS
( && , | |, ! ) Comando && || ! Descrio and ( e ) ou ( ou ) not ( no )

Ex.: (1 || 2) (x && y) (a > 10) && (x < 10) !( x > 0) (10 < = a) && (a < = 100) EXEMPLOS: if (10 < a) && (a < 100) / * 10 < a < 100 * /

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 15

main ( ) { int numero; printf("Digite um nmero:"); scanf (" % d", &numero); if( numero < 0 ) printf (" Nmero menor que zero"); else if ((numero > 0) && (numero printf (" Nmero > 0 e < else if (( numero >= 10) && printf (" Nmero > else printf (" Nmero > }

< 10) ) 10"); ( numero < 100) ) = 10 e < 100"); = 100" );

Contando caracteres e dgitos de uma frase:


main ( ) { char c; int car = 0, dig = 0; printf ("Digite uma frase e encerre-a com <enter>\n" ); while ( ( c = getchar ( ) ) != \r ) { car++; if ( ( c >= 0)&&( c < = 9) ) dig++; } printf ("Nmero de caracteres %d", car); printf (" Nmero de dgitos %d", dig); }

Para se formular um pergunta podemos utilizar o unrio ! Isto possvel porque na linguagem C ZERO falso e qualquer valor positivo verdadeiro. if (nota = = 1) if ( nota ) if (nota = = 0) if ( !nota )

O COMANDO switch
Construes if-else facilitam a escrita de programas que devem escolher uma entre duas alternativas. Algumas vezes, entretanto, o programa necessita escolher uma entre vrias alternativas. Embora construes else-if possam executar testes de vrios modos, elas no so de maneira nenhuma elegantes. O cdigo pode ficar difcil de ser seguido e confundir at mesmo seu autor num momento futuro. Para estes casos, C oferece a construo switch. Forma de substituir o comando if - else ao se executar vrios testes. Similar ao if - else com maior flexibilidade e formato limpo.

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 16

ESTRUTURA SWITCH:
switch ( expresso ) { case constante1: instrues; break; // O break usado para forar a sada do case. case constante2: instrues break; default: //ser executado se a opo digitada for invlida. instrues }

/* No programa abaixo o break usado para forar uma sada imediata do case ao qual pertence. Se no colocarmos o break, a segunda opo ser executada sem que seja solicitada. */
main ( ) { char op; float num 1, num 2; while ( 1 ) { printf (" Digite um n, um operador e um n); scanf ( "%f %c %f ",&num1,&op,&num2); switch ( op ) { case '+ ': printf ("= %f", num 1 + num 2); break: case '-':: printf ("= %f", num 1 - num 2); break; default: printf ( " Operador invlido"); } }

O COMANDO break
O comando break um dos comandos de desvio em C. Voc deve us-lo juntamente com o comando switch. Quando um break encontrado em um switch, a execuo do programa salta para a linha de cdigo seguinte ao comando switch. O comando break pode ser usado em qualquer estrutura C. ( switch ou lao ). Causa a sada imediata do bloco em que se encontra. Quando estiver presente em laos aninhados afetar somente o lao que o contm (e os internos, obviamente).

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 17

O OPERADOR CONDICIONAL TERNRIO (? : )


Forma composta de expressar uma instruo if else Estrutura... ( Condio ) ? valor para caso verdadeiro : valor para caso falso ;
max = (num1 > num2) ? num1 : num2;

Note:
if else (num1 > num2) max = num1; max = num2;

Os dois exemplos so equivalentes. Exemplo:

main( ) { int num, resultado; printf ("Digite um nmero \n"); scanf ("%d",&num); resutado = abs ( ( num < 0 ) ? -num: num ); printf (" O valor absoluto do nmero :",resultado);

LAOS DE REPETIES
Comando de repeties permitem que um conjunto de instrues ( bloco de instrues) seja executado at que ocorra uma certa condio. Essa condio pode ser predefinida ( como no lao for) ou como o final aberto ( como nos laos while e do-while )
main ( ) { printf printf : printf } (" (" : (" 1 " ); 2 " ); : 10 ");

Sada: 1 2 3 4 ... 10 Como imprimir os 1000 primeiros nmeros a partir de 1? Soluo 1:


main ( ) { printf printf : printf } ( "1"); ( "2"); : : ("1000");

Soluo 2:
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 18

main ( ) { int i; for (i = 1; i < 1000; i++) printf ("%d",i);

//Nesta linha ocorre a predefinio do //lao, sendo que a condio //de parada i > 1000.

for,

while, do-while

Estrutura de Repetio:
Inicializao: expresso de atribuio. sempre executada uma nica vez. Teste: condio que controla a execuo do lao. sempre avaliada a cada execuo. verdadeiro continua a execuo falso para a execuo Incremento OU Decremento: define como a varivel de controle ser alterada para que o lao seja finalizado sempre executada aps execuo do corpo do lao

Lao for
Estrutura: for(inicializao ; teste ; incremento/decremento ) instruo; // corpo do lao } {

O lao for permite muitas variaes. Entretanto, a inicializao , geralmente, um comando de atribuio que usado para colocar um valor na varivel de controle do lao. O teste uma expresso relacional que determina quando o lao acaba. O Incremento/Decremento define como a varivel de controle do lao varia cada vez que o lao repetido. IMPRIMINDO NMEROS PARES
main ( ) { int nmero; for ( nmero = 2; nmero < 10; printf (" %d", nmero); }

nmero +=

2 )

Sada: 2 4 6 8

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 19

FLEXIBILIDADE
Qualquer expresso de um lao for pode conter vrias instrues separadas por vrgula.
main ( ) { int x, y; for (x = 0, y = 0; (x + y) <= 100; x++, y++) printf ("%d", x + y); }

Ex.: /* imprime as letras do alfabeto. */


main ( ){ char ch; int i; for (i = 1, ch = a; ch <= z; ch++,i++) printf ("%d letra = %c ascii = %d \n",i,ch,ch); }

Sada:

ascii = nmero da letra correspondente na tabela ASCII. 0 1 2 3 4 5 letra = a ascii = 97 letra = b ascii = 98 letra = c ascii = 99 letra = d ascii = 100 letra = e ascii = 101 letra = f ascii = 102 : : : 25 letra = z ascii = 122

Note o uso de funes nas expresses do lao. /* Neste lao for os caracteres digitados so lidos, ao mesmo tempo que so testados verificando se so diferentes de x e incrementados no printf ch + 1. */
main ( ) { char ch; printf( " Digite uma frase\n"); for (ch = getchar( ); ch!= x;ch=getch()) // A funo getch() l o caracter do teclado e no imprime na tela. printf ("%c", ch + 1); }

Frase digitada : analise do problema em questo Sada: b o b m j t f ! e p ! q s p c m f n b ! f n ! r v f t u b p OBS.: Os caracteres digitados foram somados com um ( 1 ), de forma que a = b, b = c e assim sucessivamente. OBS.: Qualquer uma das 3 expresses pode ser omitida, permanecendo apenas os ( ; ; )

Reescrevendo o exemplo anterior:


Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 20

main ( ) { char ch; printf(" Digite uma frase\n"); for ( ; (ch = getchar ( );)!=x; printf (" %c", ch + 1); }

CUIDADO Se a expresso de teste no estiver presente considerada sempre verdadeira.


main ( ) { for ( ; ; ) printf (\n estou }

em

loop

infinito);

main ( ) { int i; for ( i = 0; i < 100; i++ ) printf ("%d", i ); }

Sada: 0 1 2 3 4...99
main ( ) { int i; for ( ; ; ){ printf (" %d", i ); i++; if ( i == 100 ) break; } main ( ) { int i=0; for ( ; i < 100 ; ){ printf (" %d", i ); i++; } LAOS ANINHADOS

Quando um lao est dentro de outro, dizemos que o lao interior est aninhado
main ( ) { int i, j; for (i = 1; i <= 3; i++) for (j = 1; j < = 2; j++) printf ("%d %d \n", i, j); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 21

O LAO WHILE
Estrutura do lao while :
Inicio
while ( expresso de teste ) { instruo; inc / dec }

Onde a instruo pode ser uma instruo simples ou um bloco de instrues. A expresso de teste pode ser qualquer expresso, sendo considerado verdadeiro qualquer valor diferente de zero. O lao se repete quando a condio for verdeira. Quando a expresso de teste for falsa, o controle do programa passa para a linha aps o cdigo do lao. Instruo s executada se expresso de teste for verdadeira ( != 0 ) Expresso sempre avaliada at que se torne falsa ( = 0)
main ( ) { int num; num = 0; while (num < 3) //enquanto o num for menor que 3 o lao se repetir. printf("%d",num++); //sada do programa e inc da varivel }

Ex.:

Obs.: O corpo de um while pode ter: uma nica instruo, vrias instrues entre chaves e nenhuma instruo.

WHILE X FOR

for: Geralmente este lao muito estvel, sendo conhecido o inicio e o fim do lao. nmero de repeties fixo; Muito til para controle de vetor e matriz. while: no se sabe a princpio o nmero de iteraes, o lao pode terminar inesperadamente. /* Contar o nmero de caracteres de uma frase at que <enter> seja digitado. */

main ( ) { int cont = 0; printf ( " Digite uma frase: \n"); while (getchar( ) != \r) //Os caracteres sero lidos at //que < enter > seja pressionado. cont++; printf ("\n O nmero de caracteres %d", cont); }
Programao C / 2005-1
Verso 0.05 Pgina 22

Prof.: Ciro M. Santos

Whiles dentro de um lao while ( lao aninhado )

main ( ) { int num, vezes = 1; char continua = s; while (continua == s ) { printf ("\n Digite um nmero entre 1 e 1000" ); scanf (" %d", &num); while (num != 50) { printf ("%d incorreto.", num); printf(" Tente novamente \n" ); scanf ("%d", &num); vezes++; } printf (" \n Acertou em %d tentativa(s) ", vezes); printf (" \n Joga novamente? (s / n):" ); continua = getche( ); } } /* A funo getche() l o caracter do teclado e permite que seja impresso na tela. */

O LAO do-while
Cria um ciclo repetitivo at que a expresso seja falsa (zero). Evita duplicao de cdigo. Executa o lao (pelo menos uma vez) mesmo que a condio seja falsa. Similar ao lao while ( a diferena est no momento em que a condio avaliada ). Estrutura:
inicio do { instruo; inc/dec ; }while(expresso de teste);

/ * O programa abaixo testa a capacidade de adivinhar uma letra */


main ( ) { char ch; int tentativas; do { printf (" Digite uma letra\n"); tentativas = 1; while ( (ch = getchar ( ) ) != t) { printf ("%c incorreto \n", c); tentativas++; printf ( " Tente novamente \n"); } printf (" %c correto", c); printf (" Acertou em %d vezes\n", tentativas); printf ("Continua? (s / n):"); }while( getchar( )== s); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 23

O COMANDO continue
O comando continue trabalha de uma forma um pouco parecida com a do comando break. Em vez de forar a terminao, continue fora que ocorra a prxima iterao do lao, pulando qualquer cdigo intermedirio ou imediatamente abaixo. Deve-se evitar o comando Continue, pois dificulta a legibilidade de um programa.

A Funo exit()
A funo exit() est definida na biblioteca padro do C. Essa funo provoca uma terminao imediata do programa inteiro, forando um retorno ao sistema operacional. /* O programa abaixo relaciona os comandos: continue, break e exit( ). */
#include <stdio.h> void main( void) { int i; for(i = 0; i < 100; i++) { if ( i < 4 ) continue; if ( i == 20 ) break; if ( i == 15 ) exit(1); printf( %u, i); } }

FUNES / MDULOS / SUB-ROTINAS


Funes so os blocos de construo de C. O tipo-de-retorno especifica o tipo do valor que o comando retorn da funo devolve, podendo ser qualquer tipo vlido. Se nenhum tipo especificado, o compilador assume que a funo devolve um resultado inteiro. A lista de parmetros uma lista de nomes de variveis separados por vrgula e seuss tipos associados que recebem os valores dos argumentos quando a funo chamada. Quando a funo no tem parmetro, os parnteses ainda so necessrios.

Variveis Locais static


Quando o modificador static aplicado a uma varivel local ( ou declarada dentro de uma funo ), o compilador cria armazenamento permanente para ela.

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 24

Variveis Globais static


Aplicar o especificado static a uma varivel global informa ao compilador para criar uma varivel global que reconhecida apenas no arquivo no qual a mesma foi declarada. Isso significa que, muito embora a varivel seja global, rotinas em outros arquivos no podem reconhec-la. Funes : abstraes de expresses ( Modulo ) Dividir uma tarefa complexa em tarefas menores, permitindo esconder detalhes de implementao Evita-se a repetio de um mesmo cdigo

Estrutura:
tipo_de_retorno nome(lista de parmetros ex. tipo var1, tipo var2..) { corpo da funo } tipo_de_retorno nome (lista de parmetros ex. var1, var2 ... ) tipo var1; tipo var2; { corpo da funo } EM C UM PROCEDIMENTO FEITO ATRAVS DE UMA FUNO SEM RETORNO Funes que no retornam valores void desenha( ) { int i; for (i = 0; i < = 10; printf (-); }

i++)

main ( ) { desenha ( ); printf ( usando funes); desenha ( ); printf ( \n usando funes); desenha(); }

FUNES
/* A funo abaixo calcula o fatorial de um nmero retornando o resultado. */
int fatorial (int n){ int i, resultado = 1; for ( i = 1; i <= n; i ++) resultado *= i; // resultado = resultado * i. return resultado; } main ( ) { printf ( o fatorial de 4 = %d, fatorial(4) ); printf ( o fatorial de 3 = %d, fatorial(3) ); }
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 25

VARIVEIS LOCAIS
Ex.: Variveis declaradas dentro de uma funo so denominadas locais e somente podem ser usadas dentro do prprio bloco So criadas apenas na entrada do bloco e destrudas na sada (automaticamente) void desenha ( ) { int a, i; . . . . . . } main ( ) { int a; desenha(); a = i; erro . . . }

VARIVEL GLOBAL
Varivel que declarada externamente podendo ser acessada por qualquer funo
int i; void desenha ( ) int j; i = 0; . . . } void calcula ( ) { int m; i = 5; . . . } {

O COMANDO return
Causa a atribuio da expresso a funo, Forando o retorno imediato ao ponto de chamada da funo

Exemplo

/* Esta funo retorna um caracter. */


char minsculo ( ) { char ch; ch = getchar( ); if ( (ch >= A) && (ch <= Z)) return (ch + a - A); else return (ch); }
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 26

main ( ) { char letra; printf ( digite uma letra em minsculo); letra = minsculo ( ); if (letra == a) // if (minsculo( ) == a) printf (ok); }

PASSANDO DADOS PARA FUNES



Ex.: char minsculo (char ch) parmetro formal { If (( ch >= A) (ch <= Z)) return (ch + a - , A); else return (ch); } main ( ) { printf ( %c, minsculo (A) ); parmetro real } Exemplo....

Passagem de parmetro por valor - uma cpia do argumento passada para a funo parmetro se comporta como uma varivel local

Valor Absoluto
/* Retornando o valor absoluta de um nmero */
int abs (int x) { return ( ( x < 0 ) ? -x : x ); } main ( ) { int num, b; printf (" Entre com um nmero "); scanf (" %d", &num ); b = abs (num); printf (" Valor absoluto de num = %d", b ); b = abs(-3); printf ("%d",b); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 27

PASSANDO VRIOS ARGUMENTOS


Freqentemente uma funo necessita de mais de uma informao para produzir um resultado Podemos passar para a funo mais de um argumento
Ex. 1: float area_retangulo (float largura, float return (largura * altura); } altura){

Ex. 2: float potncia (float base, int expoente) { int i; float resultado = 1; if (expoente == 0) return 1; for (i = 1; i <= expoente; i++) resultado *= base return resultado; }

USANDO VRIAS FUNES


Calcular a seguinte seqncia: S(x, n) = x/1! + x2/2! + x3/3! + ... + xn/ n! Soluo:
int fat(int n) { int i, resultado = 1; for ( i = 1; i <= n; resultado *= i; return resultado; }

i ++)

float potncia (float base, int expoente) { int i; float resultado = 1; If (expoente == 0) return 1; for (i = 1; i <= expoente; i++) resultado *= base; return resultado; } float serie (float x, int n) { int i; float resultado = 0; for ( i = 1; i <= n; i++) resultado += potncia( x, i ) return resultado; }

fat( i );

void main( ) { float x; int termos; printf(" Entre com o numero de termos: "); scanf("%d", &termos); printf(" Entre com o valor de X: "); //x o valor da base . scanf(" %f" ,x); printf(" O valor de srie = %f", serie(x, termos)); }
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 28

OBS.: No programa acima relacionado vemos a dependncia entre as funes, isto nos informa que a tarefa de resolver a sequncia foi dividida em problemas menores dentro das funes, sendo resolvida de forma mais simplificada. Ento percebemos que a funo facilita nosso trabalho. Note: Uma mesma funo pode ser chamada vrias vezes para resolver diversos problemas.

RECURSIVIDADE
A Recursividade o ato da funo chamar a si mesma com a finalidade de resolver determinado problema. A funo recursiva se um comando no corpo da funo chama a prpria funo. Recurso o processo de definir algo em termos de si mesmo e , algumas vezes, chamado de definio circular. A idia por trs da recursividade est em pegar um problema inicialmente grande, sabendo a soluo para um problema pequeno, o ato de recursividade transformar um problema grande em um problema pequeno para que o mesmo seja resolvido atravs da soluo do problema pequeno. Vrios problemas j so recursivos naturalmente. O problema do fatorial tambm pode ser utilizado para demonstrar a recursividade como segue: fat(0) = 1 fat(n) = n (fat(n-1)) para n > 0 0! = 1 1! = 1 * 0! 2! = 2 * 1! 3! = 3 * 2! 4! = 4 * 3! 5! = 5 * 4! .....
int fat( int n ) { if (n == 1) return 1; else return fat(n-1) * n; }

O exemplo abaixo demonstra uma recorrncia que tambm recursiva. t(1) = 1 t(n) = 2 t(n-1) + 3n + 1 t(1) = 1 t(2) = 2 * t(1) + 3 * 2 + 1 t(3) = 2 * t(2) + 3 * 3 + 1 t(4) = 2 * t(3) + 3 * 4 + 1 ... para n > 1

int t( int n ) { if (n == 1)
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 29

return 1; else return 2* t(n-1) + (3 * n) + 1;

main() {

int j; printf("Digite um numero: "); scanf("%d",&j); printf(" O fatorial de = %d e %d ",j , f t(j)); printf(" A srie de = %d e %d",j , t( j));

ARRANJOS
Um Arranjo uma coleo de variveis do mesmo tipo que referenciado por um nome comum. Um elemento especfico em uma matriz acessado por meio de ndice. Em C, todos os arranjos consistem em posies contnuas na memria. O endereo mais baixo corresponde ao primeiro elemento e o mais alto, ao ltimo elemento. Um conjunto pode ser composto de uma dimenso, tambm conhecido como Vetor ou vrias dimenses, ou matriz. Ex.: Ler a nota de 3 alunos e calcular a mdia int nota0, nota1, nota2;

printf(entre com a i nota); scanf(%d, &notai ); : : : printf(mdia = %f, (nota0 + nota1 + nota2) / 3)); Arranjos: Unidimensional (VETOR) N-dimensional (MATRIZ)

Informalmente: Cada varivel diferenciada por um ndice int nota [ 4 ]; Vetor de inteiros nota [ 0 ], nota [ 1 ], nota [ 2 ], nota[ 3 ] Obs.: tamanho n ndice 0 a (n - 1) ou ( 0 , 1, 2, 3 )
Inicializando Arranjos

Considere uma varivel inteira numero Podemos inicializar a varivel numero: int numero = 0;
Programao C / 2005-1
Verso 0.05 Pgina 30

Prof.: Ciro M. Santos

numero = 0; scanf ("%d", &numero);

Dado um arranjo int notas[5], podemos inicializ-lo: int notas[5] = {0,0,0,0,0} int notas[] = {0} notas[0] = 0; notas[1] = 0 ... notas [4] = 0; for ( i = 0 ; i < 5; i++) { notas[i] = 0; // ou printf(" Digite uma nota para inicializao"); scanf (" %d ", &notas [ i ] ); } Obs.: Dado int notas [10] podemos fazer: notas [9] = 5; notas [0] = 50; as demais posies do vetor contm lixo Programa utilizado para clculo da mdia de no mximo 40 alunos.
#define N_ALUNOS 40 int i; float notas[N_ALUNOS];

/* Removendo os contedos invlidos das posies indicadas de memria, colocando nestas posies o zero (0), evitando resultados indesejados. */
void limpeza( ) { for ( i = 0; i < N_ALUNOS; i++ ) notas [ i ] = 0; }

/* Inicializa o vetor com os nmeros digitados pelo usurio. */


void inicializa() for ( i = 0; printf (" scanf (" } } { i < N_ALUNOS; i++ ) { Entre com a nota %d ", i+1); %f ", &notas[ i ]);

/*

i+1, para que a numerao das notas no inicie com zero (0). Ex.: nota 1, nota 2,...,nota n. */ /* Calcula a mdia das notas dos alunos. */
float media( ) { float media; for ( i = 0; i < N_ALUNOS; i++ ) { media += notas [ i ]; } return (media / N_ALUNOS);

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 31

} void imprime() { for ( i = 0; i < N_ALUNOS; i++ ) { printf (" %d", notas[i] ); }

/* PROGRAMA PRINCIPAL */
main( ) { limpeza(); inicializa(); imprime(); printf ("\n Mdia = %f }

\n", media());

tamanho de um arranjo tem que ser determinado em tempo de compilao. Soluo: declarar um arranjo que suporte um nmero mximo de elementos. #define TAMANHO 100
main( ) { int quantidade, media = 0; float notas [ TAMANHO ]; // quantidade deve ser TAMANHO

printf (" Quantas notas devo ler ?"); scanf("%d", &quantidade); for ( i = 0; i < quantidade; i++) { printf ("Entre com a nota %d",i+1); scanf("%d",&notas[i]); } : : : for ( i = 0; i < quantidade; i++) media += notas [ i ]; } : : :

RESULTADOS IMPREVISVEIS
C no realiza verificao de limites em arranjos. Nada impede o acesso alm do fim do arranjo faa sempre que necessrio a verificao dos limites

ARRANJOS MULTIDIMENSIONAL
Um arranjo multidimensional consiste em um arranjo de linhas e colunas. 0 1 5 9 1 2 6 10 2 3 7 11 3 4 8 12

#define linha 3; #define coluna 4;


Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 32

int

matria [ linha ] [ coluna ];

interpretao : temos 3 linha e 4 colunas; temos 3 vetores de tamanho 4 Agora temos :


int i, j, matria [ linha ] [ coluna ];

for ( i = 0 ; i < linha; i++ ) { printf (linha = %d,i+1); for (j = 0; j < coluna; j++) { printf (coluna = %d, j+1); scanf (%d, matria[i][j]); } } Inicializando Matrizes

dado:

#define linhas 3 #define colunas 4 int nota [linhas][colunas]; Uma das maneiras de inicializ-las. int nota[3][4] = {{0,0,0,0}, ...,{0,0,0,0}} nota[0][0] = 0; ... nota[0][3] = 0; : : : nota[2][0] = 0; ... nota[2][3] = 0;

Uma outra forma de iniciliz-las de maneira mais eficiente usando laos for :
for(i = 0;i < linhas; i++ ) for(j = 0; j < colunas; j++ ) nota[i][j] = 0;

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 33

STRING
A linguagem de programao C no existe um tipo de dados string. Este tipo definido atravs da utilizao de um vetor de caractere, com um caractere especial \0 nulo indicando o final deste vetor. Um valor nulo especificado como \0 e geralmente zero. Por esta razo, voc precisa declarar matrizes de caracteres como sendo um caractere mais longo e de maior string necessria. uma seqncia de caracteres delimitada por aspas duplas. Ex.: printf("Isto um teste"); printf("%s",Isto um teste); OBS.: visto pelo compilador: " Isto um teste\0" '\0' ( null ) = '0' '\0'indica para as funes o fim de um string..
Varivel String

matriz do tipo char terminada pelo caractere null \0. cada caractere de um string pode ser acessado individualmente. Ex.:
char string[10] = "exemplo"; char string[10] = {"exemplo"}; char string[10] = {'e','x','e','m','p','l','o','\0'}; printf ( "%s", string ); for( i = 0; i < 10; i++) printf ( "%c", string [i]);

Lendo Strings

scanf () l o string at que um espao em branco seja encontrado. main ( ) { char nome[40]; printf(Digite seu nome: ); scanf(%s, &nome[0]); printf(Bom dia %s,nome ); } Sada: Digite seu nome: Ciro Gomes Bom dia Ciro

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 34

gets()

l caracteres at encontrar '\n'. substitui '\n' '\0'.. a funo ideal para ler um string. Exemplo: main ( ) { char nome[40]; printf("Digite seu nome \n"); gets(&nome[0]); printf ("Bom dia %s !",nome); } Sada: Digite seu nome: Ciro Gomes Bom dia Ciro Gomes! Imprimindo Strings printf() puts() complemento de gets() puts() imprime uma nica string por vez e cada string impressa por ele termina com um caracter de nova linha ( \n ). Ex.:
main ( ) { char nome[40]; printf ( Digite seu nome: ); gets ( &nome[ 0 ] ); puts ( Bom dia ); puts ( nome ); }

Sada: Digite seu nome: Ciro Gomes Bom dia Ciro Gomes Lembre-se Sempre que uma funo espera receber um apontador podemos passar: o endereo da primeira posio do vetor/matriz o prprio vetor/matriz Exemplo: Observe as equivalncias. char nome[40]; gets(&nome[0]) = gets(nome) scanf("%s", nome[0]) = scanf("%s",nome[0]) puts(&nome[0]) = puts(nome)
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 35

main ( ) { char nome[40]; printf ("Digite seu nome: "); gets (&nome[0]); printf ("%s\n", &nome[3]); printf (" %s \n",&nome[0]); printf (" %s \n",nome); } FUNES DE MANIPULAO DE STRINGS Funo Descrio strlen(s1) Retorna o tamanho de s1. strcpy(s1,s2) Copia s2 em s1. strcat(s1,s2) Concatena s2 no final de s1. strcmp(s1,s2) Retorna 0 se s1 e s2 so iguais; menor que 0 se s1 < s2; maior que 0 se s1 > s2. strchr(s1,ch) Retorna um ponteiro para a primeira ocorrncia de ch em s1. Procura uma letra em uma palavra. strstr(s1,s2) Retorna um ponteiro para a primeira ocorrncia de s2 em s1. Procura uma palavra em uma frase. strncmp(s1,s2,n) igual strcmp, porm a comparao feita a partir de n em s1. OBS.: ch = 1 caracter, s1, s2 e n so strings.

strlen(s1)
retorna o tamanho do string - no conta '\0'. Ex.:
main ( ) { char nome[40]; printf ("Digite seu nome:" ); gets ( nome ); printf ("Tamanho = %d", strlen(nome) ); }

Sada: Digite seu nome: Ciro Gomes Tamanho = 10

strcat(s1,s2)
concatena s2 ao final de s1. dado s1 + s2 tem que caber em s1 + \0, ou seja, o tamanho de s1 teem que ser suficiente para ele e para s2. Ex.:
main ( ) { char nome[40]="Ciro ", sobrenome[30] ="Gomes"; strcat(nome,sobrenome); puts (nome); }

Sada: Ciro Gomes


Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 36

strcmp ( s1, s2 )
Compara dois strings retornando: negativo se s1 < s2; 0 se s1 = s2; positivo se s1 > s2; a comparao feita por ordem alfabtica .
main ( ) { char nome[40] = "Ciro", sobrenome[30] = "Gomes"; if (strcmp(nome,sobrenome )) puts ("Os strings so diferentes" ); else puts (" Os strings so idnticos " ); }

REGISTROS E ESTRUTURAS
Registros so conjunto de dados logicamente relacionados, mas de tipos diferentes. Uma estrutura uma coleo de variveis referenciadas por um nome, fornecendo uma maneira conveniente de se ter informaes relacionadas agrupadas. Uma definio de estrutura forma um modelo que pode ser usado para criar variveis de estruturas. As variveis que compreendem a estrutura so chamadas membros ou atributos da estrutura. Uma ficha de cadastro de aluno, precisa-se de atributos que identifique um aluno, um aluno pode ser identificado pelo Nome, Endereo, Identidade, CPF, etc.

Estrutura ..
/* Mostrando o uso de Estrutura. */ // Definindo o tipo de dado. struct nome_estrutura { char nome[30]; char endereo[30]; char cidade[15]; int idade; char CPF[15]; }var_estrutura ; // var_estrutura do tipo nome-estrutura.
OUTRA FORMA DE DECLARAO DE ESTRTURA

struct nome_estrutura { char nome[30]; char endereo[30]; char cidade[15]; int idade; char CPF[15]; }; criando uma varivel do tipo estrutura struct nome_estrutura var_estrutura;
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 37

Note que a declarao termina com um ponto e virgula( ; ). Nome_estrutura identifica essa estrutura de dados e Var_estrutura a varivel do tipo Nome_estrutura.
#include <stdio.h> struct tipo_endereco { char rua[20]; int numero; char bairro[20]; char cidade[15]; char estado [2]; char CEP[9]; }; struct nome_estrutura { char nome[30]; struct tipo_endereco ende ; //ende uma var do tipo tipo_endereo. int idade; char CPF[15]; } var_estrutura ;

/* " . " operador de estrutura faz a conexo entre o nome da estrutura e o nome do membro. Ex.: var_estrutura.nome. nome da estrutura nome do membro da estrutura */
void main( void ) { // ler as informaes printf("\n Digite seu nome"); gets(var_estrutura.nome); printf("\n Digite nome da rua"); gets(var_estrutura.ende.rua); printf("\n Digite numero da casa"); scanf("%d",&var_estrutura.ende.numero); printf("\n Digite nome do bairro"); fflush(stdin); gets(var_estrutura.ende.bairro); printf("\n Digite idade"); scanf("%d",&var_estrutura.idade); printf("Digite numero do CPF"); fflush(stdin); gets(var_estrutura.cpf); // imprimir as informaes. puts(var_estrutura.nome); puts(var_estrutura.ende.rua); printf("%d",var_estrutura.ende.numero); puts(var_estrutura.ende.bairro); printf("%d",var_estrutura.idade); puts(var_estrutura.cpf);

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 38

Conjunto de Estruturas
Talvez o uso mais comum de estruturas seja em vetor de estruturas. Para declarar um vetor de estruturas, voc deve primeiro definir uma estrutura e, ento declarar uma varivel vetor desse tipo. Para declarar um vetor de estruturas com 500 elementos do tipo nome_estrutura.
struct nome_estrutura regs[500] #include <stdio.h> #define lim 2 struct tipo_endereco { char rua[20]; int numero; char bairro[20]; char cidade[15]; char estado [2]; char CEP[9]; }; struct nome_estrutura { char nome[30]; struct tipo_endereco int idade; char CPF[15]; }var_estrutura[lim];

ende;

/* No programa abaixo teremos um lao for que ser responsvel pela repetio de todas as informaes contidas neste bloco. */
void main( void ) { int i; for(i=0;i < lim;i++) { // ler as informaes printf("\n Digite seu nome"); gets(var_estrutura[i].nome); printf("\n Digite nome da rua"); gets(var_estrutura[i].ende.rua); printf("\n Digite numero da casa"); scanf("%d",&var_estrutura[i].ende.numero); printf("\n Digite nome do bairro"); fflush(stdin); gets(var_estrutura[i].ende.bairro); printf("\n Digite idade"); scanf("%d",&var_estrutura[i].idade); printf("Digite numero do CPF"); fflush(stdin); gets(var_estrutura[i].cpf); }

// imprimir as informaes. for( i = 0; i < lim; i++) { puts(var_estrutura[i].nome); puts(var_estrutura[i].ende.rua); printf("%d",var_estrutura[i].ende.numero); puts(var_estrutura[i].ende.bairro); printf("%d",var_estrutura[i].idade); puts(var_estrutura[i].cpf); } }
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 39

Unies
Imaginemos um caso onde tenhamos um programa muito grande em que precisaremos execut-lo sem que possamos fazer qualquer reduo em suas estruturas. Caso pudermos usar o mesmo local de memria para armazenarmos duas variveis distintas, resolveremos nosso problema.
Exemplo: union data { int dia; int mes; int ano; } ; main() { union data d; d.dia = 30; printf(%d\n,d.dia); d.mes = 3; printf(%d\n,d.mes); printf(%d\n,sizeof(d));

Argumentos argv e argc


argc : Tem o nmero de argumentos contidos nas linha de comando ( necessariamente maior ou igual a um, pois o prprio programa j considerado um argumento pelo O.S.). argv : um ponteiro que acomodar os caracteres digitados.

/* O nmero mnimo de argumentos que o programa abaixo aceitra ser dois: 1 o prprio programa executvel e o outro o arquivo solicitado.
#include <stdio.h> #include <stdlib.h> void main(int argc, char **argv ) { int x; if ( argc != 2 ) { printf("\n Este comando reg tem 2 parmetro:"); exit(1); } x = atoi(argv[1]) * 5; // a funo atoi tranforma um caracter em inteiro para multiplicar por 5. printf(" Comando = %s Valor = %d",argv[0],x); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 40

Exemplo 1: Este programa recebe 2 parmetro de linha de comando um nome e um valor e escreve na tela o nome e o valor multiplicado por 5.
#include stdio.h main( int argc, char *argv ) { char nome[10]; if (arg != 2) { printf(Digite o Nome do Arquivo e a senha \n); exit(1); } if ( !strcmp(spep,argv[1]) { printf( Senha correta \n); printf( Voc esta autorizado a utilizar este programa \n); printf( Digite seu nome \n); scanf(%s,nome) printf( Obrigado %s por utilizar nosso sistema ,nome \n); exit(1); } esle { printf( Senha INCORRETA \n); printf( Voc NO esta autorizado a utilizar este sist\n); exit(1); } Exemplo 2: Este programa recebe 2 parametro o nome e uma senha.

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 41

PONTEIROS

O correto entendimento e uso de ponteiro crtico para uma programao bem sucedida em C. H trs razes para isso: Primeiro: Os ponteiro fornecem os meios pelos quais as funes podem modificar seus argumentos; segundo: Eles so usados para suportar as rotinas de alocao dinmica de C, e terceiro: O uso de ponteiros pode aumentar a eficincia de certas rotinas Ponteiros so endereos, isto , so variveis que contm um endereo de memria. Se uma varivel contm o endereo de outra, ento a primeira (o ponteiro) aponta para a segunda. pt o ponteiro aponta para o inteiro x

Operadores
& ( i comercial ) que fornece o endereo de determinada varivel. No confundir com o operador lgico de operaes de baixo nvel, de mesmo smbolo. Atribui o endereo de uma varivel para um ponteiro. * ( asterisco ) que acessa o contedo de uma varivel, cujo endereo o valor do
ponteiro. No confundir com o operador aritmtico de multiplicao de mesmo smbolo. Devolve o valor endereado pelo ponteiro.
Exemplos ..... main() { int *pont, cont, val; cont = 100; pont = &cont; val = *pont; printf(%d,val); /* 100 */ }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 42

main() { char a,b,*p; b = c; p = &a; *p = b; printf(%c,a); }

/* c */

main() { int x, y,*px,*py; x = 100; px = &x; /* px tem o endereco de x */ py = px; /* py tem o endereco de x */ y = *py; /* y vale 100, pois recebe o contedo de x , atravs do ponteiro py */ printf(%d %d,x, y ); } #include stdio.h main() { int i, k, *pi, *pk; char a; i = 2; k = 0; puts(Qual ser o valor de k? ); pk = &k; pi = &i; *pk = i; printf(para *pk = i, temos k= %d\n, k); k = *pi; printf(para k = *pi, temos k= %d\n,k); }

PONTEIROS - CONCEITOS DE ENDEREOS Aritmtica de Ponteiros


So vlidas as operaes de soma e subtrao, sendo que seu resultado depende do tipo de varivel apontada pelo ponteiro.

Supondo que ...


int *p, x; char *q, a; se q = &a; p = &x; e ainda que ... a endereo 100 x endereos 101 / 102

q++ q apontar para o endereo 101 p++ p apontar para o endereo 103 incrementa um tipo (*p)++ incrementa o contedo do endereo apontado por p.

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 43

Este conceito particularmente importante no que se refere a matrizes pois como se sabe, matriz nada mais que um conjunto de variveis do mesmo tipo, dispostas seqencialmente em memria. Por conterem endereos, ponteiros permitem apenas as operaes de soma e subtrao. Supondo que: int i, *pi; ( pi = i ) #2340 char c, *pc; ( pc = c ) #2345 float f, *pf; ( pf = f ) #2350 Supondo ainda que pi, pc e pf apontem para i, c e f que estariam com os seguintes endereos: 2340, 2345 e 2350.
Se

pc = pc + 1, ento pc valer 2346, pois variveis caracteres possuem apenas 1 byte. pi = pi + 1, ento pi valer 2342 , pois variveis inteiras ocupam 2 bytes. pf = pf + 5, ento pf valer 2370 , pois variveis pt. flutuante ocupam quatro bytes.

Velocidade ....
O acesso aos elementos da matriz mais rpido quando feito atravs de endereos do que seria caso fosse executado pela maneira convencional, porm expresses que envolvam clculos para se obter um elemento especfico da matriz devem ser feitas preferencialmente pelo mtodo convencional, pois expresses complexas envolvendo ponteiros so processadas em velocidade semelhante quelas feitas pelo modo convencional, que apresenta a vantagem de ser mais facilmente compreendido.

MATRIZES E PONTEIROS
Em C voc pode indexar um ponteiro como se este fosse uma matriz! Exemplo ....
main() int p = for } { i,*p,vet[] = { 10, 20, 30, 40, 50}; vet; (i=0; i<5; i++) printf(%d %d \n ,vet[i],*(p+i));

main() { int i,*p,vet[5]; for (i=0; i<5; i++) { printf(Digite o %d elemento,i); scanf(%d,&vet[i]); } p = vet; for (i=0; i<4; i++) printf(%d %d %d \n ,vet[i], p[i], *(p+i)); }

Passagem de Variveis ou Valores atravs Funes


Quando desejamos que uma funo altere o valor de uma varivel da funo que a chamou, passamos para a funo chamada o endereo desta varivel (passagem de parmetro por referncia). Quando somente precisamos do valor da varivel e no pretendemos alter-lo na rotina (passagem de parmetro por valor), passamos diretamente a varivel, conforme visto a seguir:
Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 44

Passagem por Valor (a mantm seu valor)


int soma( int z) { int x = 5; x = x + z; z = 0; return(x); } main() { int a,r; printf(Digite um valor: ); scanf(%d,&a); r = soma(a); printf(%d, e %d,a,r); }

Passagem por Referncia (a muda seu valor)


int soma( int *z) int x=5; x = x + *z; *z = 0; return(x); } {

main() { int a,r; printf(Digite um valor: ); scanf(%d,&a); r = soma(&a); printf(%d, e %d,a,r); }

Uso de ponteiros em funes.


swap(int *a, int *b) int t; t = *a; *a = *b; *b = t; } main() { int a,b; a = 100; b = 20; swap(&a, &b); printf(A = %d } {

e B = %d ,a,b);

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 45

/* procedimento utilizando parmetro ( POR REFERENCIA ) */ void func100r ( int *x) { *x = *x + 100; } void multMIN(int a, int b, int *mult, int *min) { *mult = a * b; *min = ( a < b)? a: b; } void main ( void ) { int n,x,y,rx,ry, *ptx, pty; /* procedimente utilizando parametro ( POR REFERENCIA ) */ n = 50; func100r(&n); printf(" \n Valor de func100r() = %d",n); x = 3; y = 5; multMIN(x,y, &rx, &ry); printf(" \n Mult %d MIN %d ",rx,ry); x = 3; y = 5; ptx = &rx; pty = &ry; multMIN(x,y, ptx, pty); printf(" \n Mult.. %d MIN.. %d ", *ptx, *pty); }

Funo que retorna um ponteiro ...


#include <stdio.h> main() { int *pt, x ; pt = &x; *pt = 100; printf(Valor do ponteiro,*pt); } #include <stdio.h> int *retorno() { int x; return(&x); } main() { int *pt; pt = retorno(); *pt = 100; printf( Valor do ponteiro ,*pt); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 46

Entradas e Sadas em Dispositivos - Arquivos


A linguagem C no contm nenhum comando de I/O. Todas as operaes de I/O ocorrem mediante chamadas a funes da biblioteca C padro. O padro C ANSI define um conjunto completo de funes de I/O que pode ser utilizada para ler e escrever qualquer tipo de dado.

Streams
O sistema de I/O do C fornece uma interface consistente ao programador C, independente do dispositivo real que acessado. isto , o sistema de I/O de C prov um nvel de abstrao entre o programados e o dispositivo utilizado. Essa abstrao chamada de stream e o dispositivo real chamado de arquivo. O sistema de arquivo de C projetado para trabalhar com uma ampla variedade de dispositivos, incluindo terminais, acionadores de disco e acionadores de fita.

Streams de Texto
Uma stream de texto uma seqncia de caracteres. O padro C ANSI permite que uma stream de texto seja organizada em linhas terminadas por um caractere de nova linha, o caracteres e nova linha opcional.

Streams Binrias
Uma stream binria uma seqncia de bytes com uma correspondncia de um para um. no ocorrendo nenhuma traduo de caracteres.

Arquivos
Em C, um arquivo pode ser qualquer coisa, desde um arquivo de disco at um terminal ou uma impressor. Voc associa uma 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.

Funes para manipulao de arquivo:


Nome fclose() feof() ferror() fopen() fprint() fscanf() ftell() fseek() getc() outc() remove() fread() frwrite() rewind() Descrio Fecha uma fila Devolve se fim de fila Devolve Verdadeiro se um erro tiver ocorrido Abre uma fila Sada Entrada Retorna a distancia inicio/fim a posio atual do arquivo Procura um byte especificado na fila L um caracter na fila Grava um caracter na fila Apaga o arquivo ler uma quantidade de registro em um arquivo binrio Escreve uma quantidade de registro em um arquivo binrio Reposiciona o ponteiro do Arquivo em seu incio

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 47

Tabela cdigos para abertura de arquivos:


Cdigo r w a rb wb ab r+ w+ a+ r+b w+b a+b rt wt at r+t w+t a+t Descrio Abre Arquivo de Texto para Leitura Cria Arquivo de Texto para Gravao Anexa a um Arquivo de Texto Abre Arquivo Binrio para Leitura Cria Arquivo Binrio para Gravao Anexa a um Arquivo Binrio Abre Arquivo de Texto para Leitura/Gravao Cria Arquivo de Texto para Leitura/Gravao Abre ou Cria Arquivo de Texto para Leitura/Gravao Abre Arquivo Binrio para Leitura/Gravao Cria Arquivo Binrio para Leitura/Gravao Abre ou Cria Arquivo Binrio para Leitura/Gravao Idem a r Idem a w Idem a a Idem a r+ Idem a w+ Idem a a+

Funes Bsicas para Manipulao de Arquivo Texto:


Funo fclose() feof() fopen() getc() putc() r w Descrio Fecha uma fila Devolve se fim de fila Abre uma fila L um caracter na fila Grava um caracter na fila Abre Arquivo de Texto para Leitura Cria Arquivo de Texto para Gravao

#include <stdio.h> char ch; void ler ( void ) { if ( ( fp = fopen("c:\saida.txt","r")) == NULL ) { puts("no foi possvel abrir o arquivo para leitura"); exit(1); } while ( (ch = getc(fp)) != EOF ) printf("%2c",ch); fclose(fp); } void escreve ( void ) { if ( ( fp = fopen("c:\saida.txt","w")) == NULL ) { puts("no foi possvel abrir o arquivo para escrita"); exit(1); } while ( (ch = getchar()) != '.' ) putc(ch,fp); fclose(fp); } void main ( ) { escreve(); ler(); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 48

Funes Bsicas para Manipulao de Arquivo Binrio:


Funo fclose() feof() fopen() fprintf() fscanf() fread() fwrite() wb ab Descrio Fecha uma fila Devolve se fim de fila Abre uma fila Escreve um registro em um arquivo binrio tipos bsicos ( int, char, ..) Ler um registro em um arquivo binrio tipos bsicos ( int char, ... ler uma quantidade de registro em um arquivo binrio Escreve uma quantidade de registro em um arquivo binrio Cria Arquivo Binrio para Gravao Anexa a um Arquivo Binrio

#include <stdio.h> FILE *fp; void escreva2( void ) { int i; float valor; if ( ( fp = fopen("sb2.dat","wb")) == NULL ) { puts("nao foi possivel abrir o arquivo para escrita"); exit(1); } for (i=0;i<5;i++) { printf("\nDigite o salario do aluno"); scanf("%f",&valor); fprintf(fp,"%d %f ",i,valor); } fclose(fp); } void ler2( void ) { float valor; int i; if ( ( fp = fopen("sb2.dat","rb")) == NULL ) { fputs("nao foi possivel abrir o arquivo para escrita",stdin); exit(1); } while ( !feof(fp) ) { fscanf(fb2,"%d %f ",&i,&valor); printf("\n Numero = %d Valor = %5.2f",i,valor); } fclose(fp); } void main ( ) { escreva2(); ler2(); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 49

#include <stdio.h> struct aluno { int cdigo; char nome[10]; int idade; }; FILE *fp; FILE *fpb; struct aluno alu; void lerBinario( void ) { if ( ( fpb = fopen("c:\saidab.txt","rb")) == NULL ) { puts("no foi possvel abrir o arquivo para escrita"); exit(1); } while ( (fread(&alu,sizeof(alu),1,fpb)) != NULL ) { puts(alu.nome); printf("Cdigo = %d Idade = %d",alu.codigo,alu.idade); } fclose(fp); } void escreveBinario( void ) { int i; if ( ( fpb = fopen("c:\saidab.txt","wb")) == NULL ) { puts("no foi possvel abrir o arquivo para escrita"); exit(1); } for (i=0;i<2;i++) { puts("Digite o codigo do aluno"); scanf("%d",&alu.codigo); puts("Digite o nome do aluno"); fflush(stdin); gets(alu.nome); puts("Digite a idade do aluno"); scanf("%d",&alu.idade); fwrite(&alu,sizeof(alu),1,fpb); } fclose(fp); } void main ( ) { escreveBinario(); lerBinario(); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 50

#include stdio.h main(int argc, char *argv) { FILE *in, *out; char ch; if (arg != 3) { printf(Digite o Nome dos Arquivos\n); exit(1); } if ((in = fopen(argv[1],rb)) == NULL) { printf(Arquivo origem no existe\n); exit(1); } if ((out = fopen(argv[2],wb)) == NULL) { printf(Arquivo destino no existe\n); exit(1); } while (! feof(in)) putc(getc(in),out); /* esta a cpia propriamente dita */ fclose(in); fclose(out); }

// este programa remove.c e executado e recebe um parametro que sera interpretado destro do programa. #include <stdio.h> FILE *arq; void main ( int argv, char **argc) { char str[50]; if ( argv > 1 ) { if ( argv == 3 ) { remove(argc[1]); printf("\n Opcao %s para remover arquivo", argc[2]); if ( (arq = fopen(argc[1],"r")) == 0 ) printf("\n Remocao do aq %s sucesso", argc[1]); } else { arq = fopen(argc[1],"r"); if ( arq ) { fgets(str,50,arq); printf(" arquivo %s aberto com sucesso ", argc[1]); printf(" conteudo : %s ",str); } else { arq = fopen(argc[1],"w"); printf("\n arquivo %s criando com sucesso ", argc[1]); fprintf(arq,"\n arquivo %s criando ", argc[1]); } } } else printf(" parametros incorreto entre novamente"); fclose(arq); }

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 51

Programa para leitura de nome de arquivo atraves de uma funo que r ecebe este nome por referencia. #include <stdio.h> #define MAX 10 FILE *fp; void ler (int M[MAX][MAX], int *lim, char **arquivo) { int i, v, a, x, y; printf(\n %s,*arquivo); if ( ( fp = fopen(*arquivo,r) ) == NULL ) { printf(\n Arquivo no foi encontrado); exit(1); } fscanf(fp, %d %d \n,&v, &a); for ( i=0; i < a; i++) { fscanf(fp, %d %d \n,&x, &y); M[x-1][y-1] = 1; M[y-1][x-1] = 1; } *lim = v; } void imprime ( int M[MAX][MAX], int lim ) { int i, j; for ( i=0; i < lim; i++) { printf(\n); for ( j=0; j < lim; j++) { printf(%3d, M[i][j]); } } int main ( int argv, char **argc ) { int M[MAX][MAX]; int lim, i, j; if ( argv != 2 ) { printf(\n parametros incorretos); printf(\n digite o nome do programa e o nome do arquivo ); exit(1); } printf(\n %s,argc[1]); for ( i=0; i < lim; i++) { for ( j=0; j < lim; j++) { M[i][j] = 0; ler(M, &lim, &argc[1]); imprime(M, lim ); fclose(fp); return 1;

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 52

Referncias
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] Mizraghi V. V., Treinamento em Linguagem C - Vol. I Editora McGraw Hill Mizraghi V. V., Treinamento em Linguagem C - Vol. II Editora McGraw Hill Schildt, Herbert, C Completo e Total, 3 Edio Editora Makron Books Alfred V. Aho, John Hopcroft Data Structure and Algorithms Editora Addison-Wesleyn Publishing Company Ziniani, N., Projeto de Algoritmos com implementao Pascal e C, Editora Pioneiro Sedgewick. R., Algorithms in C: Fundamentals, Data Structure, Sorting, Searching Weiss M. Allen, DataStructure and Algorithm Analysis in C Horowitz Ellis, Sahni Sartaj. Fundamentals, Data Structure in Pascal, Wirth, Niklaus. Algoritmos e Estruturas de Dados, PHB Tenenbaum, Aaron M., Langsam, Yedidyah, Augenstein, Moshe J. Data Strutures Using C, McGraw-Hill 1989.

Prof.: Ciro M. Santos

Programao C / 2005-1

Verso 0.05

Pgina 53

Você também pode gostar