Você está na página 1de 37

Introduo Computao

ENGENHARIAS
Prof. Eng. Denis Contini

CAPTULO 1 Introduo
A linguagem C foi implementada primeiramente por Dennis Ritchie em um computador DEC PDP-11 que utilizava o sistema operacional UNIX. Ela teve origem na linguagem B, inventada por Ken Thompson na dcada de 70, a qual teve origem na linguagem BCPL. As primeiras verses da linguagem C foram fornecidas com o sistema operacional UNIX. Com o advento dos microcomputadores, surgiram vrias implementaes da linguagem C, ocasionando algumas diferenas entre elas. Em 1983 o ANSI (rgo de padronizao norte americano) estabeleceu um comit para criar um padro para a linguagem C, a qual ficou conhecida como ANSI C. A linguagem C voltada principalmente para implementar softwares bsicos de suporte e apoio como: sistemas operacionais, programas montadores e compiladores, editores de texto, gerenciadores de impresso, banco de dados e utilitrios de modo geral. uma linguagem considerada de mdio nvel, pois combina elementos de linguagem de alto nvel com a funcionalidade da linguagem assembly. C permite a manipulao de bits, bytes e endereos. Uma das principais vantagens de C sua grande portabilidade. Isso significa que fica fcil migrar um programa escrito em C de uma plataforma de Hardware e sistema operacional para outras. uma linguagem estruturada assim como o Pascal e, a principal caracterstica de uma linguagem estruturada a utilizao de blocos. Um bloco um conjunto de instrues que esto ligadas logicamente. A linguagem C baseia- se no conceito de blocos construtivos. Os blocos construtivos so denominados funes. Um programa C , portanto, uma coletnea de uma ou mais funes. Assim, para escrever um programa C, primeiro deve-se criar as funes para depois junt-las. Uma funo uma sub-rotina formada por uma ou mais declaraes C, que executa uma ou mais subtarefas.

1.1 A FUNO main( )


Todo programa em C um conjunto de funes, inclusive o programa principal que tem um identificador reservado denominado main( ). A funo main( ) especial por ser a primeira a ser chamada quando seu programa executado. Significa o incio de seu programa. obrigatria a existncia de main( ) em algum ponto do programa, para que o compilador C consiga determinar onde iniciar a execuo. A forma bsica de um programa em C a seguinte:

/* definies de pr-processamento */ ... /* declaraes de variveis globais */ ... void main( ) { /* declaraes de variveis locais */ ... /* corpo do programa principal */ ... } /* definio de outras funes */ ... Exemplo de um programa em C: /* Este programa mostra a mensagem Hello World!! na tela */ #include <stdio.h> void main(){ printf("Hello World!!\n"); }

Observaes: 1) A declarao #include serve para referenciar arquivos de bibliotecas. No exemplo acima a biblioteca referenciada a <stdio.h>, a qual a biblioteca padro para as funes de I/O (Entrada/Sada) e que contm a funo printf( ) utilizada no corpo da funo main( ); 2) Os blocos so delimitados por abre-chave "{", para indicar o incio do bloco e fecha-chave "}" para indicar o fim do bloco; 3) A linguagem C sensvel ao case, ou seja, a linguagem diferencia letras maisculas de letras minsculas. Assim, todo comando de C deve ser escrito em letras minsculas;

4) printf( ) no um comando de C e sim uma funo de sada de dados que se encontra na biblioteca padro stdio.h; 5) 6) Os comentrios na linguagem C devem estar entre /* ..... */; Toda funo em C pode receber parmetros e retornar valores. Portanto, deve-se declarar qual o 2

tipo do valor retornado pela funo. A funo main( ) tambm poder receber valores passados na linha de comando ou retornar valores., entretanto, no caso da funo main( ), em geral ela no retorna valores. Para dizer ao compilador que uma funo no retornar valores, utiliza-se a declarao void. Um segundo programa em C: /*Este programa solicita um nome via teclado e imprime o nro. de caracteres digitados.*/ #include <stdio.h> #define MAX 15 /*Define uma constante chamada MAX igual a 15*/ char cadeia[MAX]; /*Vetor global de MAX posies de caracteres*/ void main() { int i = 15; puts("Digite um nome com no mximo 14 caracteres"); gets(cadeia); while (cadeia[i] != \0) i++; printf("Esta cadeia tem %d caracteres\n", i); }

1.2 IDENTIFICADORES
Os identificadores nomeiam as variveis, as constantes, tipos das variveis, funes e at mesmo o controle do fluxo de um programa escrito em C. A construo de um identificador em C muito parecida com a regra de outras linguagens, principalmente com o Pascal: a) o conjunto de caracteres que podem compor um identificador so letras maisculas e minsculas, sublinha ( _ ) e dgitos; b) todo identificador comea com letra ou sublinha ( _ );

c) como j foi dito anteriormente, em C os caracteres maisculos so diferentes dos minsculos. Portanto, o identificador X1 diferente do identificador x1; d) o nmero de caracteres significativos de um identificador depende do compilador utilizado. Por exemplo, o Turbo C 2.0 os 32 primeiros caracteres so significativos, ou seja, pode-se usar at 32 caracteres para diferenciar um identificador de outro. Exemplificando, temos que os identificadores a seguir: Var_Contadora_Tempo_Cpu_Program1; Var_Contadora_Tempo_Cpu_Program2; so considerados diferentes pelo Turbo C 2.0. Por outro lado, os identificadores a seguir: Var_Contadora_Tempo_Cpu_Programa1; Var_Contadora_Tempo_Cpu_Programa2; so considerados iguais, pois seus 32 primeiros caracteres so idnticos. e) no se deve utilizar como identificadores nenhuma das palavras-chave em C, as quais so 3

listadas a seguir:

1.3 DECLARAO DE VARIVEIS


A declarao de variveis em C deve obedecer ao seguinte formato: <tipo> lista_de_identificadores_de_variveis; Por exemplo: int Contador; int i, j, x; charopcao; Para declarar uma varivel em C pode-se usar os tipos primitivos pr-determinados pela linguagem. Para tal considere a tabela: Tipo Primitivo Char Int Float Double Void Bytes de Memria 1 2 4 8 0 Escala de Valores -127 a 127 -32.767 a 32.767 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 Sem valor

Os tipos primitivos de dados podem ser modificados pelos modificadores de tipos, os quais se aplicam a todos os tipos primitivos com exceo do tipo void. So eles: short long unsigned signed A utilizao de um modificador junto a um tipo primitivo, influenciar a quantidade de bytes de memria utilizada pela varivel e tambm a escala, conforme definido no padro C ANSI e descrito na tabela a seguir:

Os valores da tabela acima podem mudar de acordo com a arquitetura de Hardware e do compilador utilizado. Portanto, costuma-se restringir seu uso aos modificadores unsigned (aplicado aos tipos char e int), signed (aplicado ao tipo char) e long (aplicado ao tipo int). Exemplos: int i; short int x; unsigned char j; unsigned long int dado; O tipo void tambm chamado tipo vazio, no contm nenhum valor. Ou seja, o conjunto de valores assumidos pelo tipo void vazio, logo no existem variveis deste tipo. Ele usado para passagem de parmetros nulos para funes, para indicar que as funes no retornam valores e na criao de ponteiros genricos. Embora seja usado para representar caracteres, o tipo char tambm armazena valores. Isso porque em C um caractere (como uma letra por exemplo), representado por seu valor ASCII. Exemplo: void main( ) { char ch; /*Declara ch como tipo char*/ ch='a'; /*Atribui o caractere a para a varivel ch*/ ch=ch+1; /* OK! pois o valor decimal de ch 65 */ printf("\caractere representado por ch=%c, cujo valor ASCII =%d",ch,ch); } A execuo do programa acima mostrar na tela a seguinte mensagem: Caractere representado por ch=b, cujo valor ASCII =66

Os tipos float e double so reservados para tratar nmeros que exigem preciso numrica utilizando a notao de ponto flutuante . Neste tipo de notao, os valores so armazenados na memria em duas partes, denominadas mantissa e expoente. Por exemplo, o nmero 12345 em notao de ponto flutuante representado por .12345e5, onde o nmero que segue o (e) o expoente, e .12345 o valor do nmero. Seu armazenamento na memria feito da seguinte maneira:

Na linguagem C, no existe o tipo lgico (como por exemplo, no PASCAL existe o tipo Boolean), mas existem valores lgicos. Foi convencionado que 0 falso e qualquer valor no nulo verdadeiro. Exemplo: void main( ) { int flag; flag=1; /*Atribui-se 1 para a varivel flag para sinalizar VERDADEIRO*/ if (flag) printf("\n VERDADEIRO, pois flag 1, que um valor diferente de zero"); flag=0; /*Atribui-se ZERO para a varivel flag para sinalizar FALSO*/ if (flag) printf("\n Verdadeiro"); /*No ser executado*/ else printf("\n FALSO, pois flag ZERO"); }/*fim da funo main*/

1.3.1 Inicializao de Variveis em tempo de Declarao


Em C, existe a possibilidade de declararmos uma varivel e inicializ-la com um certo valor, um valor inicial. Veja:

void main( ) { int cont=0; float taxa=1.2, taxa_anual=1.4; char opcao='A';

printf("\n Valordecont = %d", cont); printf("\n Valorde taxa = %f", taxa); printf("\n Valorde taxa_anual=%f", taxa_anual); printf("\n Valor de opcao=%c", opcao); } /*Fim funo main*/

1.4 OPERADORES
1.4.1. Operador de Atribuio: atribui um valor a uma varivel. usado o smbolo =. Exemplo: void main( ) { int a, b = 10, c, d; a = b * 2; c = d = a; printf("\n a=%d \n b=%d \n c=%d \n d=%d", a,b,c,d); } /*Fim funcao main*/

1.4.2. Operadores Aritmticos:


+ * % Adio Subtrao Multiplicao / Diviso Mdulo - retorna o resto da diviso inteira

O operador / (diviso) quando aplicado a variveis inteiras, nos fornece o resultado da diviso inteira; quando aplicado a variveis em ponto flutuante nos fornece o resultado da diviso "real". O operador % fornece o resto da diviso de dois inteiros. Exemplo: void main( ) { int a,b,c,d; a = 10; b = c = a*2; d = c%a; printf("\n a=%d \n b=%d \n c=%d \n d=%d",a,b,c,d); } /*Fim main*/ Parnteses podem ser utilizados para forar o clculo de uma expresso numa determinada ordem. Exemplos: a + (b / 2) a * 2) + 1 (((a*2) + 1)*2)+1)*2+1) Uma expresso como a + b * c ser calculada como a + ( b * c ) porque o clculo da mesma leva em 7

conta a precedncia entre os operadores. Em C essa precedncia definida da seguinte forma (para os operadores aritmticos): *, / , % maior precedncia +, - menor precedncia

1.4.3. Operadores de incremento (++) e decremento (- -): estes operadores quando aplicados a uma varivel, incrementam (++) em 1 ou decrementam (- -) em 1 o valor da varivel. Exemplo: void main( ) { int a=0,b=1; a++; /*Equivalente a fazer: a=a + 1 */ b--; /*Equivalente a fazer: b=b - 1 printf("\n Valor de a=%d \n Valor de b=%d", a,b); }/*Fim main*/ Estes operadores trabalham em dois modos: o ps-fixado, quando o operador vem depois da varivel e o pr-fixado, quando o operador vem antes da varivel. A diferena entre os dois modos que: no ps-fixado o valor da varivel usada e depois seu valor incrementado (ou decrementado); no pr-fixado o valor da varivel incrementado (ou decrementado) antes de seu valor ser usado. Exemplo: main( ) { int x, y = 0; x = y++ ; /*Aps a execuo as variveis tero os valores: x=0 e y=1 */

*/

printf("\n Pos-incremento: valor de x=%d, valor de y=%d",x,y); y=0; x= ++y; /*Aps a execuo as variveis tero os valores: x=1 e y=1 */ printf("\nPre-incremento: valor de x=%d, valor de y=%d",x,y); y=1; x = y--; /*Aps a execuo as variveis tero os valores: x=1 e y=0 */ printf("\nPos-decremento: valor de x=%d, valor de y=%d",x,y); y=1; x= --y; /*Aps a execuo as variveis tero os valores: x=0 e y=0 */ printf("\nPre-decremento: valor de x=%d, valor de y=%d",x,y); } 8

1.4.4. Operadores Relacionais


Como j foi dito anteriormente, na linguagem C no existe tipo lgico, mas existem valores lgicos. Para as expresses que resultam em um valor lgico, ficou convencionado que quando o valor retornado pela expresso for 0(zero) significa FALSO e quando for 1(um) significa VERDADEIRO. Os sinais usados para expressar as relaes so:

Exemplo: void main( ) { int verdadeiro, falso; verdadeiro = (15 < 20); falso = (15 == 20); printf("\n VERDADEIRO=%d, FALSO=%d, verdadeiro, falso); }

1.4.5. Operadores Lgicos


Os operadores lgicos so: && | ! para lgica and para lgica or para lgica not

1.5. Abreviaes de operaes de atribuio Existe a possibilidade de reduzirmos ou abreviarmos algumas operaes onde o resultado da operao ser atribudo a um de seus operandos. Por exemplo: a += b a -= b a *=b a/= b a %= b a +=3 o mesmo que a = a + b o mesmo que a = a - b o mesmo que a = a * b o mesmo que a = a / b o mesmo que a = a % b o mesmo que a = a + 3

1.6. FUNES de ENTRADA e SADA


Como a linguagem C manipulada e estruturada sob a forma de funes, para que possamos efetuar uma entrada ou uma sada de dados ser necessrio o uso de funes. No entanto so muitas as funes que efetuam tais operaes, e as principais se encontram em uma biblioteca chamada <stdio.h>.

1.6.1. printf( )
Tem a finalidade de enviar um conjunto de caracteres para a sada padro (Monitor). A sintaxe da funo : int printf( "expresso de controle", lista de argumentos) O valor int retornado pela funo o tamanho da string impressa. Para imprimir expresses (ou variveis) devemos efetuar a formatao de acordo com os valores desejados na impresso. Assim, usam-se as seguintes formataes: %s Para imprimir String %c Para caracteres %d Para decimal %i Para int %f Para float %x Para hexadecimal %e Para notao cientfica %o Para octal %u Para decimal sem sinal %Id Para decimal longo %If Para flutuante longo Exemplo: #include <stdio.h> #include <conio.h> void main ( ) { int car = 'A'; printf(" O caractere %c \n ", car); printf(" E' em decimal %d \n", car); printf(" e em hexadecimal %x \n", car); printf("Nro. de bytes que ocupa na memoria=%d \n", sizeof(car)); }/*Fim main*/ Como percebe-se foi usado um caractere especial " \n " que significa um <ENTER> aps a impresso. Existem outros como:

10

1.6.2. scanf( )
Tem a finalidade de ler um conjunto de caracteres contidos no buffer do teclado. Para a leitura dos valores deve-se formatar cada valor de entrada. A sintaxe similar sintaxe da funo printf( ). scanf( "expresso de controle", lista de argumentos) Exemplo: #include <stdio.h> main( ) { char nome[25]; int idade; printf("\n Entre com seu Nome:"); fflush(stdin); scanf("%s",nome); printf("Entre com sua idade:"); fflush(stdin); scanf("%d",&idade); printf("\n Ol %s, voce tem %d anos!", nome, idade); } Observaes: 1) O smbolo & utilizado para expressar o endereo de memria da varivel que vai armazenar o valor entrado. Quando o valor entrado uma string (vetor de caracteres) no necessrio colocar o &, pois a linguagem C j trata uma string pelo endereo de seu primeiro caractere; 2) Como a leitura feita no buffer do teclado necessrio limp-lo antes de efetuar uma entrada, para isto utiliza-se a funo: fflush (stdin); /* stdin a entrada padro que no caso o teclado */ 3) A funo scanf( ) no consegue fazer a leitura de uma string que contenha espao em branco entre as palavras. Por exemplo, considere a execuo do programa anterior como a seguir: Entre com seu nome: Janaina Macdonald Entre com sua idade: 25 Ola Janaina, voce tem 25 anos! Verifique que o sobrenome (Macdonald) foi ignorado pela funo scanf( ). Portanto, ela no recomendada para entrada de cadeia de caracteres.

1.6.3. puts( )
Tem a finalidade de enviar uma string para a sada padro. Aps imprimir a string, puts( ) j posiciona o cursor na prxima linha. Exemplo: #include <stdio.h> void main ( ) { char nome[7]="Antonio"; puts("Esta uma string !"); 11

puts(nome); }

1.6.4. gets( )
Faz a leitura de uma string. Exemplo: #include <stdio.h> #include <conio.h> void main ( ) { char nome [30]; puts ("\n Digite o seu nome: "); fflush(stdin); gets (nome); printf ("\n Oi ... %s !", nome); getch(); }

1.6.5. putchar( )
Tem a finalidade de imprimir um caractere na sada padro na posio do cursor. Aps a impresso o cursor permanece na posio seguinte ao caractere impresso. Exemplo: # include <stdio.h> void main ( ) { char ch='A'; putchar(ch); putchar(65); /*Ser putchar ('B'); }

mostrado na tela o caractere cujo cdigo ASCII 65*/

1.6.6. getchar( )
L da entrada padro um caractere. Exemplo: # include <stdio.h> void main ( ) { unsigned int car; printf (" \n Digite um caractere :"); fflush(stdin); car = getchar( ); printf (" \n O caractere digitado = %c \n ", car); }

12

1.6.7. getche( )
L um caractere da entrada padro, ecoando-o na tela. A diferena desta funo para a funo getchar(), que com getche() no necessrio digitar <ENTER> aps digitar o caractere. Exemplo: #include <stdio.h> void main( ) { char ch; printf("\n Digite algum caractere: "); fflush(stdin); ch=getche( ); printf("\n A tecla digitada foi %c.", ch); }

1.6.8. getch( )
L um caractere da entrada padro, porm no ecoa o caractere na tela. Esta funo recomendada quando deve-se esconder as teclas digitadas (no caso de senhas) ou deve-se tratar a tecla antes de ecoar na tela (no caso de editores de texto, por exemplo). OBS: Existem muitas outras funes de entrada e sada de dados, pertencentes a diversas bibliotecas. Para us-las basta consultar o Help do Turbo C da Borland quanto aos formatos e estruturas. 1.7. Exerccios 1) Analise os seguintes programas e diga o que ser impresso na tela ao serem executados: a) void main( ) { int A, B; A = 1; B = 2; printf("%d", B); B = 5; printf("\n%d e %d", A, B); } b) void main( ){ int a = 3, b = 2, c; c = b + a; printf("%i\n", c); b = 1; printf("%i %i\n", b, c); c = b + a; printf("%d %d % d", a,b,c); } void main( ) { int A, B; A = 1; B = 1 + A; A = 1 + B; B = A + 1; printf("%d", A); A = 2 * B; printf("%d, %d", A,B); }

c)

void main( ) { int A=1, B, C; B = 2; C=A; B=C; A=B; Printf(%i - %i - %i, A,B,C); }

d)

2) Escreva um programa para ler um valor numrico inteiro (do teclado) e escrever o seu antecessor. 3) Elabore um programa que leia 2 valores int ( x e y) e calcule o resto da diviso de x por y. 13

4) Elabore um programa que leia 2 valores int (x e y) e calcule a mdia aritmtica entre entre eles. 5) Faa um programa para ler a base e a altura de um tringulo. Em seguida, escreva a rea do mesmo. Obs.: rea = ( Base * Altura ) / 2 6) Dado o Nome, preo de compra (PC) e o preo de venda (PC) de uma mercadoria, imprima o nome da mercadoria e o lucro obtido com a venda da mesma. 7) Faa um programa para solicitar a entrada de uma idade em anos e imprima a idade em dias, em horas, em minutos e em segundos. 8) O preo de um automvel calculado pela soma do preo de fbrica com o preo dos impostos (45% do preo de fbrica) e a percentagem do revendedor (28% do preo de fbrica). Faa um programa que leia o nome do automvel e o preo de fbrica e imprima o nome do automvel e o preo final. 9) Uma firma contrata um encanador a R$ 20,00 por dia. Crie um programa que solicite o nmero de dias trabalhados pelo encanador e imprima a quantia lquida que dever ser paga, sabendo-se que so descontados 8% para imposto de renda. 10) Faa um programa que permita o usurio digitar: Nome, salrio bruto e o percentual de acrscimo de um funcionrio qualquer. Aps, imprima no vdeo o nome digitado, salrio bruto e o salrio lquido. 11) Faa um programa que permita o usurio digitar: Nome, quantidade de horas trabalhadas, o valor pago por hora de trabalho e o percentual de desconto de um funcionrio qualquer. Aps, imprima no vdeo o nome digitado, salrio bruto e o salrio lquido. 12) Em uma fbrica trabalham uma quantidade X de homens e uma quantidade Y de mulheres. Faa um programa que permita o usurio digitar estas quantidades, e aps a entrada destes dados imprima: Total de pessoas que trabalham nesta fbrica, o percentual de homens e o percentual de mulheres com relao ao total de funcionrios.

14

CAPTULO 2 Controle de Fluxo de Programa


O controle do fluxo de programa especifica qual a sequncia de instrues que devem ser processadas.

2.1 Bloco de Comandos


Os blocos de comandos em C so formados pelos caracteres abre-chaves "{" para expressar o incio e fecha-chaves "}" para o fim do bloco. { comando_1; comando_2; ... comando_n; } 2.2 Comando if Sintaxe: comando; if (condio)

2.3 Comando if ... else Sintaxe: comando1; else comando2; if (condio)

A filosofia de se construir blocos dentro de um comando de fluxo de dados semelhante a linguagem Pascal, assim, se aps o comando if ou o comando else for necessrio utilizar dois ou mais comandos preciso usar { e } para agrupar os comandos a eles pertencentes. Exemplos: #include <stdio.h> #include <conio.h> void main () { int a,b,c, max; printf("\n Digite trs nmeros fflush(stdin); scanf("%d%d%d", &a, &b, &c); if (a >= b) if (a >= c) max = a; else max = c; else if (b >= c) max = b; else

:");

15

max = c; printf("\n O maior = %d ", max); getch(); } #include <stdio.h> #include <conio.h> void main () { int num; printf ("Digite um numero: "); scanf ("%d",&num); if (num>10) printf ("\n\nO numero e maior que 10"); if (num==10) { printf ("\n\nVoce acertou!\n"); printf ("O numero e igual a 10."); } if (num<10) printf ("\n\nO numero e menor que 10"); getch(); }

2.4 Comando switch ... case


Sintaxe: switch (var_auxiliar) { case const1 : comando 1; case const2 : comando 2; case const3 : comando 3; .... default : comando default; } Exemplo: #include <stdio.h> #include <conio.h> void main( ) { int soma = 0; i = 3; switch ( i ) { case 1 : soma + = 5; break; case 2 : soma + = 4; break; case 3 : soma + = 3; break; case 4 : soma + = 2; break; case 5 : soma + = 1; break; default : printf("\n Valor no previsto."); } printf("\n O resultado = %i ", soma ); getch(); }

16

Observaes: 1) o comando switch avalia a expresso ou valor de varivel entre parnteses, aps a palavra switch, e compara seu valor com os rtulos dos casos. A expresso ou varivel entre parnteses deve ser de valor do tipo inteiro ou caractere; 2) cada caso deve ser uma constante do tipo inteiro ou caractere. No permitido usar varivel; 3) pode haver uma ou mais instrues seguindo cada case. Estas instrues no necessitam estar entre chaves; 4) se um case for igual ao valor da expresso ou varivel, a execuo comea nele. Ou seja, os cases abaixo tambm sero executados. (Cuidado!!). Para evitar esse problema utiliza-se o comando break no final de cada case. O break causa uma sada imediata do switch; 5) se nenhum case for satisfeito e existir um case default, a execuo comear nele. O case default opcional. Exemplo: /* Calculadora com quatro operaes: adio, subtrao, Multiplicao e Diviso*/ #include <stdio.h> void main( ) { float num1, num2; char op; while(1) { /*sempre verdadeiro*/ printf("Digite um numero, operador, numero: "); scanf("%f%c%f", &num1, &op, &num2); switch(op) { case +: printf(" = %f", num1 + num2); break; case -: printf(" = %f", num1 - num2); break; case *: case x: printf(" = %f", num1 * num2); break; case /: case \\: printf(" = %f", num1 / num2); break; default: printf("Operador desconhecido"); } printf("\n\n"); } }

2.5 Comando while


Sintaxe: while ( expresso ) comando; 17

O comando ser executado se a expresso for diferente de zero e repete a execuo enquanto a expresso for diferente de zero. Exemplo: #include <stdio.h> void main ( ) { char tecla; int i; printf ("\n Digite um caractere. <Q> para interromper: "); while ( (tecla = getch( )) != 'Q') { printf("\n Voce digitou: %c ", tecla); printf("\nDigite um caractere. <Q> para interromper. "); } i = 0; while (i < 10) { printf ("\n %i ", i); i++; } }

2.6 Comando do ... while


Sintaxe: do { comando1; comando2; ... comandon; } while (expresso); O comando do ... while executa os comandos do bloco de comandos e logo em seguida, volta a executar o comando se a expresso for diferente de zero. a diferena entre o comando while e o do ... while que este executa o lao pelo menos uma vez. Exemplo: #include <stdio.h> void main ( ) { char tecla; int i; printf ("\n Digite um caractere. <Q> para interromper: "); do { printf ("\nDigite um caractere. <Q> para interromper. "); tecla = getch( ); printf("\n Voce digitou: %c ", tecla); } while ((tecla != 'Q') || (tecla != 'q')); i = 0; 18

do { printf ("\n %i ", i); i++; } while (i < 10); }

2.7 Comando for


Sintaxe: for ( <inicializao> ; < expresso > ; <operao> ) comando; O comando for composto por trs partes: a) inicializao: esta regio reservada para inicializar nenhuma ou mais variveis. Cada inicializao dever se separada por vrgulas; b) expresso: a condio para a continuao do for. Se a expresso for diferente de zero (verdadeiro), o comando executado, se for omitido a expresso, ela sempre assumir 1(sempre verdadeiro); c) operao: depois de executar o comando feita uma determinada operao (em geral, um incremento ou decremento), que definida nesta regio. Se for necessrio executar mais do que uma operao, estas devem estar separadas por vrgulas. Exemplo: #include <stdio.h> void main ( ) { int i, j; for ( i = 0; i < 10; i ++) printf (" %d", i); for (i = 1, j = 0; i + j < 20 ; i++ , j++) printf ("\n %d %d %d ", i,j, i + j ); } Observaes: 1) qualquer uma das partes do for pode conter vrias instrues separadas por vrgula; 2) podemos usar caracteres ao invs de inteiros. Por exemplo: #include <stdio.h> void main( ) { char ch; for (ch='a'; ch<='z'; ch++) printf("\n O valor ASCII de %c %d.", ch,ch); } 3) podemos usar chamadas a funes em qualquer das partes do for. Por exemplo: #include <stdio.h> 19

void main( ) { char ch; for (ch=getch( ); ch!='Q' && ch!='q' ; ch=getch( )) printf("\n O caractere digitado foi: %c",ch); } 4) qualquer uma das 3 partes do for pode ser omitida, mas os ponto-e-vrgula devem permanecer. Se a parte de inicializao ou incremento forem omitidas, elas sero simplesmente desconsideradas. J a condio de teste, quando omitida permanecer sempre verdadeira, caracterizando um lao infinito. Por exemplo: #include <stdio.h> void main( ) { char ch; for ( ; (ch=getch( )) != 'q' ; ) printf("%c", ch+1); } Exemplo: #include <stdio.h> void main( ) { for ( ; ; ) printf("\n Lao Infinito \n); }

2.8. Exerccios
1) Calcule a mdia aritmtica das 3 notas de um aluno e mostre, alm do valor da mdia, uma mensagem de "Aprovado", caso a mdia seja igual ou superior a 7, ou a mensagem "reprovado", caso contrrio. 2) Elaborar um programa que l 3 valores a,b,c e os escreve. A seguir, encontre o maior dos 3 valores e o escreva com a mensagem: " XX = maior numero ". 3) Faa um programa que leia um n inteiro e mostre uma mensagem indicando se este nmero par ou mpar, e se positivo ou negativo. 4) Tendo como dados de entrada a altura e o sexo de uma pessoa ('M' masculino ou 'F' feminino). Construa um algoritmo que calcule seu peso ideal, utilizando as seguintes frmulas: - para homens: (72.7*h)-58 - para mulheres: (62.1*h)-44.7 5) Um vendedor precisa de um algoritmo que calcule o preo total devido por um cliente. O programa deve receber o cdigo de um produto e a quantidade comprada e calcular o preo total, usando a tabela abaixo. Mostre uma mensagem no caso de cdigo invlido.

20

6) Uma empresa conceder um aumento de salrio aos seus funcionrios, varivel de acordo com o cargo, conforme a tabela abaixo. Faa um algoritmo que leia o salrio e o cargo de um funcionrio e calcule o novo salrio. Se o cargo do funcionrio no estiver na tabela, ele dever, ento, receber 40% de aumento. Mostre o salrio antigo, o novo salrio e a diferena.

7) Escrever um programa que l o nmero de identificao, as 3 notas obtidas por um aluno nas 3 verificaes e a mdia dos exerccios que fazem parte da avaliao. Calcular a mdia de aproveitamento, usando a frmula: MA = (Nota1 + Nota2 x 2 + Nota3 x 3 + ME )/7 A atribuio de conceitos obedece a tabela abaixo:

O programa deve escrever o nmero do aluno, suas notas, a mdia dos exerccios, a mdia de aproveitamento, o conceito correspondente e a mensagem: APROVADO se o conceito for A,B ou C e REPROVADO se o conceito for D ou E. 8) Uma competio esportiva envolve trs provas: Prova1: Tiro, aprovado com percentual de erro < 7% Prova2: Salto Triplo, aprovado se o salto e maior que 12m Prova3: Resistencia, aprovado se >= 50.000m NOTA: 10 se passou nas trs 9 se passou na 1 e 2 8 se passou na 1 7 demais casos Elabore um programa que o usurio entre com os resultados de cada uma das 3 provas e d a nota final do atleta. 9) Faa um programa que leia um nmero que represente um determinado ms do ano. Aps a leitura escreva por extenso qual o ms lido. Caso o nmero digitado no esteja na faixa de 1..12 escreva uma mensagem informando o usurio do erro da digitao. (usar o comando SWITCH) 10) Elabore um programa C que simule uma calculadora, lendo dois operandos inteiros ( x e y) e uma operao (+ - * / e %). Imprima a resposta. 11) Aperfeioe sua calculadora programando o operador # que ser o valor de x elevado a y. 12) Escrever um programa que l 5 valores para a, um de cada vez, e conta quantos destes valores so 21

negativos, escrevendo esta informao. 13) Escreva um programa que calcule a mdia dos nmeros digitados pelo usurio, se eles forem pares. Termine a leitura se o usurio digitar zero (0). 14) Suponha que para cada aluno de sua sala exista uma ficha contendo o nome e a idade do aluno. Supondo que existam 25 alunos, faa um programa que determine quantos alunos tem idade maior que 18. 15) A prefeitura de uma cidade fez uma pesquisa entre seus habitantes, coletando dados sobre o salrio e nmero de filhos. A prefeitura deseja saber: a) mdia do salrio da populao; b) mdia do nmero de filhos; c) maior salrio; d) percentual de pessoas com salrio at R$500,00. O final da leitura de dados se dar com a entrada de um salrio negativo. 16) Construir um programa que calcule a mdia aritmtica de vrios valores inteiros positivos, lidos externamente. O final da leitura acontecer quando for lido um valor negativo. 17). Escreva um programa que leia 10 valores e encontre o maior e o menor deles. Mostre o resultado. 18) Uma empresa deseja aumentar seus preos em 20%. Faa um programa que leia o cdigo e o preo de custo de cada produto e calcule o preo novo. Calcule tambm, a mdia dos preos com e sem aumento. Mostre o cdigo e o preo novo de cada produto e, no final, as mdias. A entrada de dados deve terminar quando for lido um cdigo de produto negativo. 19) Escrever um programa que l 10 valores, um de cada vez, que conta quantos deles esto no intervalo [10,20] e quantos deles esto fora do intervalo, escrevendo estas informaes. 20) Faa um programa para ler o peso (massa) e altura de um nmero indeterminado de pessoas e, calcular e imprimir o seu IMC, junto com uma mensagem indicando a categoria em que ela se enquadra. O algoritmo deve parar de ler dados quando for digitado o valor 0 para o peso. Utilize a tabela abaixo como referncia para interpretar o resultado do clculo do IMC. IMC < 20 - pessoa abaixo do peso ideal; 20 IMC 25 - pessoa com peso ideal; 25 < IMC 30 - pessoa acima do peso ideal; IMC > 30 - pessoa obesa.

Dado: IMC = massa da pessoa em kg (altura em m) 21) Tem-se um conjunto de dados contendo a altura e o sexo (masculino, feminino) de 50 pessoas. Fazer um programa que calcule e imprima: a) A maior e a menor altura do grupo; b) A mdia de altura das mulheres; c) o nmero de homens.

22

CAPTULO 3 Estruturas de Dados


3.1 Vetores e Matrizes
Um vetor ou uma matriz definida como um conjunto ordenado que contm um nmero fixo de elementos, que devem ser do mesmo tipo. A sintaxe para declarao de um vetor a seguinte: <tipo> <identificador_da_varivel> [ <tamanho> ] A declarao de matrizes segue a mesma sintaxe, informando o tamanho de cada dimenso: <tipo> <identificador_da_varivel> [ <tamanho1> ] [ <tamanho2> ] ... [<tamanhN>] Exemplos: int idades[30]; /* idades um vetor contendo 30 idades, onde a primeira 0 e a ltima 29 */ float mat[5][5]; /* mat uma matriz contendo 5 linhas por 5 colunas (0 a 4 para linhas e colunas) */ Para utilizarmos matrizes e vetores em programas sempre ser necessrio o uso de ndices, que representam as posies em que se deseja acessar (operar). Na linguagem C o ndice comea sempre em zero. Exemplo de vetor (ou matriz unidimensional): #include <stdio.h> void main ( ) { int vet[50]; char i; printf ( "\n Digite os elementos do vetor : \ n "); for ( i = 0; i < 30 ; i++) { printf ("\n elemento [ %d ] = ", i); scanf ("%i", &vet[ i ] ); } for ( i = 29; i > = 0; i--) printf (" % i " , vet[ i ] ); } Exemplo de matriz: #include <stdio.h> #include <conio.h> void main () { int mtrx [20][10]; 23

int i,j,count; count=1; for (i=0;i<20;i++) for (j=0;j<10;j++) { mtrx[i][j]=count; count++; printf("\nLinha:%d Col:%d INT:%d",i,j,mtrx[i][j]); } getch(); } No exemplo acima, a matriz mtrx preenchida, sequencialmente por linhas, com os nmeros de 1 a 200.

3.1.1 Inicializao
Podemos inicializar matrizes, assim como podemos inicializar variveis. A forma geral de uma matriz como inicializao : tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN] = {lista_de_valores}; A lista de valores composta por valores (do mesmo tipo da varivel) separados por vrgula. Os valores devem ser dados na ordem em que sero colocados na matriz. Abaixo vemos alguns exemplos de inicializaes de matrizes: float vect[6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 }; int matrx[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; char str[10] = { 'J', 'o', 'a', 'o', '\0' }; char str[10] = "Joao"; char str_vect[3][10] = { "Joao", "Maria", "Jose" } O primeiro demonstra inicializao de vetores. O segundo exemplo demonstra a inicializao de matrizes multidimensionais, onde matrx est sendo inicializada com 1, 2, 3 e 4 em sua primeira linha, 5, 6, 7 e 8 na segunda linha e 9, 10, 11 e 12 na ltima linha. No terceiro exemplo vemos como inicializar uma string e, no quarto exemplo, um modo mais compacto de inicializar uma string. O quinto exemplo combina as duas tcnicas para inicializar um vetor de strings. Repare que devemos incluir o ; no final da inicializao.

3.1.2 Inicializao sem especificao de tamanho


Podemos, em alguns casos, inicializar matrizes das quais no sabemos o tamanho a priori. O compilador C vai, neste caso verificar o tamanho do que voc declarou e considerar como sendo o tamanho da matriz. Isto ocorre na hora da compilao e no poder mais ser mudado durante o programa, sendo muito til, por exemplo, quando vamos inicializar uma string e no queremos contar quantos caracteres sero necessrios. Alguns exemplos: char mess[] = "Linguagem C: flexibilidade e poder."; int matrx[][2] = { 1,2,2,4,3,6,4,8,5,10 }; No primeiro exemplo, a string mess ter tamanho 36. Repare que o artifcio para realizar a inicializao sem especificao de tamanho no especificar o tamanho! No segundo exemplo o valor no especificado ser 5. 24

3.2 Strings
Em particular um vetor de caracteres terminado com o caractere '\0' conhecida como string de caracteres. Declarao: char nome[30]; char rua[25]; Entre colchetes escrevemos o nmero mximo de caracteres que a string poder armazenar, os ndices que acessam cada posio variam de 0 ao total entre colchetes menos 1. Devemos lembrar que o tamanho da string deve incluir o '\0' final. A biblioteca padro do C possui diversas funes que manipulam strings. Estas funes so teis pois no se pode, por exemplo, igualar duas strings: string1=string2; Exemplo: /*Calcula a media das notas de alunos*/ #include <stdio.h> #define ALUNOS 3 /*Constante que define o nro de alunos*/ #define NOTAS 4 /*Constante que define o nro de notas por aluno*/ main( ) { char aluno[ALUNOS][30]; /*Armazena os nomes dos alunos*/ float notas[ALUNOS][NOTAS]; /*Armazena as notas dos alunos*/ float medias[ALUNOS]; /*Armazena as medias dos alunos*/ int i,j; /*Entrada dos dados*/ for (i=0;i<ALUNOS;i++) { printf("\n Nome do ALUNO[%d]=",i); fflush(stdin); gets(aluno[i]); for (j=0;j<NOTAS;j++) { printf(" -->NOTA[%d]=",j); fflush(stdin); scanf("%f",&notas[i][j]); } } /*Calculo das medias*/ for (i=0; i<ALUNOS ; i++){ medias[i]=0; for (j=0; j<NOTAS; j++) medias[i]=medias[i] + notas[i][j]; medias[i]=medias[i]/NOTAS; } /*Impressao dos resultados*/ for (i=0; i<ALUNOS; i++) { printf("\n Aluno:%s",aluno[i]); 25 /* NAO faca isto */

printf("\n Notas: "); for (j=0; j<NOTAS; j++) printf("%2.2f ", notas[i][j]); printf("\n Media= %2.2f", medias[i]); } }

3.3 Funes que manipulam strings


Todas as funes abaixo discutidas pertencem a biblioteca padro <string.h>.

3.3.1 Funo strlen( )


Retorna o nmero de caracteres de uma string qualquer, no levando em conta o caractere nulo '\0'. Sintaxe: int strlen(string); Exemplo: # include <stdio.h> # include <string.h> void main () { char nome [40]; printf("\n Digite um nome :"); fflush(stdin); gets(nome); printf ("\n O nome digitado tem %d letras.", strlen(nome)); }

3.3.2 Funo strcat( )


Adiciona a string origem no fim da string destino, armazenando a concatenao (string_destino + string_orgem) na string destino. Sintaxe: strcat(str_destino, str_origem) Exemplo: # include <stdio.h> # include <string.h> void main () { char nome [40]; char titulo [20] = "Sr. "; printf("\n Digite um nome:"); fflush(stdin); gets(nome); strcat(titulo,nome); /*Faz a seguinte concatenao: titulo=titulo+nome*/ puts(titulo); } 26

3.3.3 Funo strcmp( str1,str2 )


A funo strcmp() compara a string1 com a string2. Se as duas forem idnticas a funo retorna zero. Se elas forem diferentes a funo retorna no-zero. Um exemplo da sua utilizao: #include <stdio.h> #include <string.h> int main () { char str1[100],str2[100]; printf ("Entre com uma string: "); gets (str1); printf ("\n\nEntre com outra string: "); gets (str2); if (strcmp(str1,str2)) printf ("\n\nAs duas strings so diferentes."); else printf ("\n\nAs duas strings so iguais."); return(0); }

3.3.4 Funo strcpy (str1,str2)


Atribui (copia) o valor de str2 para str1. Sempre que for necessrio atribuir uma string a uma varivel do tipo string, dever ser usada esta funo. #include <stdio.h> #include <string.h> void main() { char str1[100],str2[100],str3[100]; printf ("Entre com uma string: "); gets (str1); strcpy (str2,str1); /* Copia str1 em str2 */ strcpy (str3,"Voce digitou a string "); /* Copia "Voce digitou a string" em str3 */ printf ("\n\n%s%s",str3,str2); }

3.4 Estruturas - struct


Struct permite declarar um conjunto de tipos diferentes de variveis. Uma estrutura de dados na linguagem C, um aglomerado de campos, ou tipos de dados, que representam uma estrutura de informao. Exemplo: struct endereco { char nome[30]; char rua[20]; int numero; } reg; 27

Neste exemplo, a varivel reg do tipo struct endereco. Assim, para acessar cada campo em separado deve-se usar o nome da varivel seguido de um ponto (.) e o nome do campo. reg.nome , reg.rua , reg.numero Exemplo: # include <stdio.h> void main ( ) { struct pessoa { char nome[30]; int idade ; }; struct pessoa moca = {"Sonia", 16}; printf ("\n Nome da moca: %s", moca.nome); printf ("\n Idade: %d ", moca.idade); } /*Fim main*/ Considerando que estruturas representam novos tipos de dados, todas as operaes e declaraes realizadas com os tipos predefinidos da linguagem tambm podero ser realizadas com as estruturas. Dessa forma, variveis, vetores e matrizes tambm podem ser declaradas como sendo do tipo estrutura. Exemplo: struct produto { int codigo; char descrio[30]; } estoque[10]; ou struct produto { int codigo; char descrio[30]; }; produto estoque[10]; Para acessar os campos do vetor de estruturas: estoque[5].codigo = 38;

3.5 Exerccios
1) Elabore um programa que leia um vetor contendo 10 idades (int) e imprima a idade mais velha e a idade mais nova do vetor. 2) Elabore um programa que inicialize um vetor de 50 posies de inteiros (os valores devem ser lidos atravs do teclado) e, em seguida, calcule e imprima a soma desses elementos. 3) Faa um programa que leia um nmero positivo n (< 50) e n valores inteiros em um vetor. O programa deve imprimir os elementos do vetor que so maiores que 10 e, informar quantos so estes elementos. 28

4) Construa um programa que leia dois vetores A e B e, gere um terceiro vetor C, formado pela soma dos dois outros (A e B). 5) Faa um programa que leia os preos de uma mercadoria, obtidos por uma pesquisa em 30 casas comerciais. O algoritmo deve determinar quantas dessas casas esto com o preo abaixo da mdia. 6) Elabore um programa que leia uma matriz quadrada 3 x 3 e imprima os valores contidos na diagonal principal, bem como a soma destes elementos. 7 - Faa um programa que carregue uma matriz 3x3 com nmeros reais e receba um valor, digitado pelo usurio, calcule e mostre a matriz resultante da multiplicao do nmero digitado por elemento da matriz. 8 - Faa um programa que carregue uma matriz 3 x 4 com nmeros inteiros, calcule e mostre quantos elementos dessa matriz so maiores que 30 e, em seguida, monte uma segunda matriz com os elementos diferentes de 30. No lugar do nmero 30 da segunda matriz coloque o nmero zero. 9 - Faa um programa que receba as vendas semanais (de um ms) de cinco vendedores de uma loja e armazene essas vendas em uma matriz. Calcule e mostre: o total de vendas do ms de cada vendedor; o total de vendas de cada semana (todos os vendedores juntos); o total de vendas do ms. 10) Elabore um programa em C que declare um vetor de 10 elementos, onde cada elemento uma estrutura (struct) contendo: nome 30 caracteres. rua 20 caracteres numero int fone 15 caracteres Leia o vetor e, em seguida, solicite ao usurio que digite um nome qualquer. Se o nome estiver no vetor, mostre ao usurio onde esta pessoa mora com o se telefone. Caso o nome no esteja no vetor, emitir uma mensagem. 11) Elabore um programa que leia o nome, a matrcula e a nota de 15 alunos de uma turma. O algoritmo dever calcular e imprimir a mdia geral da turma e o nome e nota daqueles que apresentarem nota menor que a mdia. 12) Elabore um programa que cadastre os dados (nome, sexo, estado civil, cargo e salrio) dos funcionrios de uma empresa (no mximo 30). O algoritmo dever calcular e imprimir: Quantos funcionrios so do sexo masculino; Quantos so do sexo feminino; Quantos so casados.

13) Uma loja de mveis mantm um cadastro de suas mercadorias. Para cada mercadoria, tem-se: nome do mvel, preo de compra e preo de venda. Elabore um programa que calcule e imprima o lucro obtido por essa loja se forem vendidas todas as suas mercadorias. 29

14) Uma empresa de pesquisa distribuiu um questionrio solicitando as seguintes informaes dos entrevistados: Sexo, nvel de escolaridade (1- Analfabeto, 2- Primrio, 3- Ensino Mdio, 4- Nvel superior), salrio. Elabore um programa que armazene esses dados e, calcule e imprima: Quantas pessoas do sexo feminino tm nvel superior; Quantas pessoas analfabetas ganham menos de R$400,00; Quantas mulheres e quantos homens ganham acima de R$2500,00.

15) O Departamento de trnsito do estado anotou dados de vrios acidentes ocorridos no ltimo ano. Para cada motorista envolvido no acidente, tem-se as seguintes informaes: - Idade; - Sexo (M - Masculino, F - Feminino) - Procedncia ( 0 - Capital, 1 - Interior, 2 - Outro estado); Com base nesses dados, elabore um programa que leia os dados de todos os acidentes ocorridos neste ano ( atualmente so 60 acidentes) e calcule e imprima: a) A porcentagem de motoristas com menos de 21 anos; b) O nmero de mulheres que so da capital; c) O nmero de motoristas do interior que tm idade maior que 60 anos;

30

CAPTULO 4 Criando Funes Particulares


Como j sabemos, um programa em C nada mais do que uma coletnea de funes, gerenciadas por um ou mais programas. Para criar nossas prprias funes devemos definir o mdulo a qual pertencero, definir um prottipo e ento referenci-las. Lembre-se que uma funo sempre retorna valor. Uma funo no C tem a seguinte forma geral: tipo_de_retorno nome_da_funo (declarao_de_parmetros) { corpo_da_funo } O tipo-de-retorno o tipo de varivel que a funo vai retornar. O default o tipo int, ou seja, uma funo para qual no declaramos o tipo de retorno considerada como retornando um inteiro. A declarao de parmetros uma lista com a seguinte forma geral: tipo nome1, tipo nome2, ... , tipo nomeN Repare que o tipo deve ser especificado para cada uma das N variveis de entrada. na declarao de parmetros que informamos ao compilador quais sero as entradas da funo (assim como informamos a sada no tipo-de-retorno). O corpo da funo a sua alma. nele que as entradas so processadas, sadas so geradas ou outras coisas so feitas.

4.1 O Comando return


O comando return tem a seguinte forma geral: return valor_de_retorno; ou return; Digamos que uma funo est sendo executada. Quando se chega a uma declarao return a funo encerrada imediatamente e, se o valor de retorno informado, a funo retorna este valor. importante lembrar que o valor de retorno fornecido tem que ser compatvel com o tipo de retorno declarado para a funo. Uma funo pode ter mais de uma declarao return. Isto se torna claro quando pensamos que a funo terminada quando o programa chega primeira declarao return. Veja um exemplo de uso do return: Exemplo: #include <stdio.h> #include <conio.h> int Quadrado (int a) { return (a*a); } void main () 31

{ int num; printf ("Entre com um numero: "); scanf("%d",&num); num=Quadrado(num); printf ("\n\nO seu quadrado vale: %d\n",num); getch(); }

4.2 Prottipos de Funes


At agora, nos exemplos apresentados, escrevemos as funes antes de escrevermos a funo main(). Isto , as funes esto fisicamente antes da funo main(). Isto foi feito por uma razo. Imagine-se na pele do compilador. Se voc fosse compilar a funo main(), onde so chamadas as funes, voc teria que saber com antecedncia quais so os tipos de retorno e quais so os parmetros das funes para que voc pudesse gerar o cdigo corretamente. Foi por isto as funes foram colocadas antes da funo main(): quando o compilador chegasse funo main() ele j teria compilado as funes e j saberia seus formatos. Mas, muitas vezes, no poderemos nos dar ao luxo de escrever nesta ordem. Muitas vezes teremos o nosso programa espalhado por vrios arquivos. Ou seja, estaremos chamando funes em um arquivo que sero compiladas em outro arquivo. Como manter a coerncia? A soluo so os prottipos de funes. Prottipos so nada mais, nada menos, que declaraes de funes. Isto , voc declara uma funo que ir usar. O compilador toma ento conhecimento do formato daquela funo antes de compil-la. O cdigo correto ser ento gerado. Um prottipo tem o seguinte formato: tipo_de_retorno nome_da_funo (declarao_de_parmetros); onde o tipo-de-retorno, o nome-da-funo e a declarao-de-parmetros so os mesmos que voc pretende usar quando realmente escrever a funo. Repare que os prottipos tm uma ntida semelhana com as declaraes de variveis. Vamos implementar agora o exemplo anterior com algumas alteraes e com prottipos: #include <stdio.h> #include <conio.h> float Quadrado (float a); int main () { float num; printf ("Entre com um numero: "); scanf("%f",&num); num=Quadrado(num); printf ("\n\nO seu quadrado vale: %f\n",num); getch(); } float Square (float a) { return (a*a); } 32

Exemplo2: # include <stdio.h> int maximo ( int, int ); /* prottipo da funao mximo */ void main ( ) { int a,b; printf ("\n Digite dois valores :"); fflush(stdin); scanf ("%d %d", &a,&b); printf ("\n o maior = %d ", maximo(a,b)); /* chamada funo maximo*/ } /*Fim main*/ /* declarao da funo maximo */ int maximo(int x, int y) { if (x >= y) return x; else return y; } /* Fim maximo */

4.3 O Tipo void


Agora vamos ver o nico tipo da linguagem C que no detalhamos ainda: o void. Em ingls, void quer dizer vazio e isto mesmo que o void . Ele nos permite fazer funes que no retornam nada e funes que no tm parmetros! Podemos agora escrever o prottipo de uma funo que no retorna nada: void nome_da_funo (declarao_de_parmetros); Numa funo, como a acima, no temos valor de retorno na declarao return. Alis, neste caso, o comando return no necessrio na funo. Podemos, tambm, fazer funes que no tm parmetros: tipo_de_retorno nome_da_funo (void); ou, ainda, que no tem parmetros e no retornam nada: void nome_da_funo (void); ou void nome_da_funo ( ); Um exemplo de funes que usam o tipo void: #include <stdio.h> #include <conio.h> void Mensagem (void); void main () { Mensagem(); printf("\nDiga de novo:\n"); Mensagem(); getch(); 33

} void Mensagem (void) { printf ("Ola! Eu estou vivo.\n"); } Se quisermos que a funo retorne algo, devemos usar a declarao return. Se no quisermos, basta declarar a funo como tendo tipo-de-retorno void.

4.4 Passagem de Parmetros


H duas formas de se passar parmetros para funes. A primeira delas pass-los por valor. Esse mtodo copia o valor dos argumentos nos parmetros formais da funo. Com este mtodo, as alteraes realizadas nos parmetros da funo no surtiro efeito nas variveis utilizadas para chamar a funo. A segunda maneira passar argumentos por referncia. Com este mtodo, o endereo de cada argumento copiado nos parmetros da funo. Isso significa que as alteraes feitas nos parmetros afetam a varivel utilizada para chamar a funo. Veja exemplo: # include <stdio.h> void troca ( int *, int *) ; /* prottipo da funo troca */ void main ( ) { int a = 45 , b = 21; int *pont; pont = &a; printf ( " O valor de *pont = %d e de b = %d \n", *pont, b); troca (pont, &b); printf ( " O valor de *pont = %d e de b = %d \n", *pont, b); } void troca (int *i, int *j) { int temp; temp = *i; *i = *j; *j = temp; }

4.5 Vetores como Argumentos de Funes


Quando vamos passar um vetor como argumento de uma funo, podemos declarar a funo de trs maneiras equivalentes. Seja o vetor: int matrx [50]; e que queiramos pass-la como argumento de uma funo func(). Podemos declarar func() das trs maneiras seguintes: 34

void func (int matrx[50]); void func (int matrx[]); void func (int *matrx); Nos trs casos, teremos dentro de func() um int* chamado matrx. Ao passarmos um vetor para uma funo, na realidade estamos passando um ponteiro. Neste ponteiro armazenado o endereo do primeiro elemento do vetor. Isto significa que no feita uma cpia, elemento a elemento do vetor. Isto faz com que possamos alterar o valor dos elementos do vetor dentro da funo.

4.6 Exerccios
1) Construir um programa que calcula o cubo de um nmero inteiro. O clculo do cubo ser feito utilizando-se uma funo. 2) Elabore um programa que calcula o maior de dois nmeros dados. O clculo do maior nmero ser feito utilizando-se uma funo com parmetros. 3) Refaa o exerccio anterior sem usar parmetros. 4) Faa uma funo que recebe um valor inteiro e verifica se o valor positivo ou negativo. A funo deve retornar um valor booleano. 5) Faa uma funo que receba trs notas de um aluno como parmetro e retorna o conceito, conforme a tabela abaixo:

6) Escreva uma funo que determine o quadrante que uma linha extrada da origem reside. A determinao do quadrante feita usando o ngulo que a linha faz com eixo positivo x como segue:

Nota: Se o ngulo exatamente 0, 90, 180 ou 270 graus, a linha correspondente no reside em nenhum quadrante, mas fica em cima de um eixo. Para esta situao, sua funo deve retornar 0. Um ngulo invlido deve resultar no retorno do valor -1. 7) O dono de uma fazenda de morangos fez um trato com um grupo de estudantes: eles podem catar quantos morangos quiserem. Quando eles tiverem terminado de catar, os morangos sero pesados. A fazenda ficar com 50% dos morangos e os estudantes devero dividir o resto igualmente entre eles. Usando essa informao, faa uma funo chamada morango( ) que receba o nmero de estudantes e o total de quilos (em 35

gramas) como parmetros de entrada e retorne o nmero aproximado de morango que cada um receber. Assuma que cada morango pesa aproximadamente 20 gramas. 8) Faa uma funo que receba um vetor X de 15 nmeros inteiros, por parmetro, e retorne a quantidade de valores pares em X. 9) Faa uma funo que receba um vetor X de 20 nmeros reais, por parmetro, e retorne a soma dos elementos de X. 10) Faa uma funo que receba, por parmetro, um vetor A de 15 nmeros inteiros e substitua todos os valores negativos de A por zero.

36

Você também pode gostar