Escolar Documentos
Profissional Documentos
Cultura Documentos
1. A LINGUAGEM
C (ANSI C)
C uma linguagem de programao de finalidade geral que permite economia de expresso, modernos fluxos de controle e estruturas de dados e um rico conjunto de operadores. Kernighan & Ritchie 1978
Declaraes Globais Prottipos de Funes /*tipo de retorno e tipo dos parmetros */ int main( ) /* funo principal marca o incio da execuo do programa*/ { declaraes de variveis locais; comandos; .... return (0); } Tipo funo1 (declarao de parmetros) { declaraes locais; comandos; } ....... Tipo funoN (declarao de parmetros) { declaraes locais; comandos; }
Computao I
incio {algoritmo que calcula o permetro e a rea de uma circunferncia de raio R (fornecido pelo usurio)} inteiro: R; real: Perm, Area, PI; PI 3.14159; imprima(Entre com o valor do raio:); leia(R); Perm 2 * PI * R; Area PI*R**2; imprima(O permetro da circunferncia de raio,R,,Perm); imprima(e a rea ,Area); fim
/* programa que calcula o permetro e a rea de uma circunferncia de raio R (fornecido pelo usurio)*/ #include <stdio.h> /* inclui diretivas de entrada-sada*/ #include <math.h> /*inclui diretivas das funes matemticas*/ int main( ) { int R; float Perm, Area, PI; PI = 3.14159; printf(Entre com o valor do raio:); scanf( %d,&R); Perm = 2 * PI * R; Area = PI* pow(R,2); printf(O permetro da circunferncia de raio %d %.2f \n,R,Perm); printf(e a rea %.2f,Area); return (0); }
Computao I
float armazena nos com ponto flutuante em preciso simples (at 6 ou 7 dgitos significativos dependendo da mquina) Ex: 6.5 -12.4 1.2e-3 -0.00013 double armazena nmeros com ponto flutuante em preciso dupla (at 15 ou 16 dgitos significativos dependendo da mquina) Ex: 0.51231298967 -1.3e-15
1.4. Modificadores
unsigned armazena nmero sem sinal (positivo) Ex unsigned int short reduz os limites de variao Ex . short int long amplia os limites de variao Ex. long int tipo usado em funes para indicar parmetros ou valores de retorno vazio Ex int funo-soma( ) Tabela de variveis, intervalos de variao e total alocado na memria Tipo de dados Variao Total de Bytes Utilizados char 0 a 255 1 int -32768 a 32767 2 short int -128 a 127 1 unsigned int 0 a 65535 2 long int -4294967296 a 4294967296 4 float Aprox. 6 casas decimais 4 double Aprox. 12 casas de preciso 8 0
1.5. Expresses em C
Computao I
1.6 Constantes em C
Representam valores fixos inteiros ou caracteres 1.6.1 Constantes Inteiras
Constantes Decimais algarismos decimais (0 9) Ateno: no iniciam por 0 Ex. 10 -98 Constantes Octais algarismos octais (0 7) Iniciam por 0 Ex. 073 064 01234
1000005
As constantes inteiras podem ser modificadas com os tipos unsigned e long Ex 10U constante inteira decimal (sem sinal) 010U constante inteira octal (sem sinal unsigned) 10000000000L constante inteira decimal (com sinal e do tipo long) 1.6.2 Constantes de Ponto Flutuante constante em preciso simples (float) : 0.023F constante em preciso dupla (double): -0.5e-15 1.6.3 Constantes Alfanumricas
1.2e-4F 1.24e-8
3.4f 1.2
1.6.4 Constantes
Computao I
1.7 Variveis em C
As variveis armazenam informaes que podem ser alteradas ao longo do programa. Todas as variveis devem ser declaradas antes de serem usadas. 1.7.1 Declarao de Variveis: A declarao de uma varivel envolve a definio do tipo e do identificador A declarao da varivel associa uma rea reservada na memria (total de bytes depende do tipo declarado) ao nome da varivel (identificador). Ex: int QLAT; char Sexo; float area;
1.7.2 Regras para Identificao de Variveis O identificador deve comear por Letra: a a z ou A a Z ou _ (sublinhado) A seguir podem vir letras, _ Ex
algarismos de 0 a 9
Total_de_latas,
_x1,
Nota2,
nota2
Computao I
1.8 Operadores em C
1.8.1 Operador de Atribuio: = Ex: A =10; Ex: float B; int a,b,c,d; B = 2.4F; a=b=c=d=1; 1.8.2 Operadores Aritmticos: +, - , *, /, % Soma: + Subtrao: Produto algbrico: * Diviso: / Resto da diviso: % ... float X; int A,B,C,D; A=10; B=15; C = A+B-2; D = B%A; X = B/A; X = B/2; X= B/2.0f;
Ex:
1.8.3 Operadores Relacionais: >, <, >=, <=, ==, != Maior: > Menor: < Maior ou igual: >= Menor ou igual: <= Igual: == Diferente: != Ex: 5 > 10 4<2 a == 97 char a,b; a = c; b = c; a == b a == b
Computao I
7 1.8.3
Interseo (e) : && Unio (ou): Negao (no): ! So usados para combinar expresses relacionais compostas Resultam em 0 (falso) e >0 (verdadeiro) Ex: int contador =1; char letra = s;
!(
1.8.5 Operadores de Incremento e Decremento: ++, - Incremento: ++ Decremento: - Incremento/decremento pr-fixado : ++x ou --x incrementa/decrementa e depois usa Incremento/decremento ps-fixado: x++ ou x-usa e depois incrementa/decrementa Ex: B = 0; A = ++B; /* pr-fixado*/ C = - -A;
B= 0; A = B++; /* ps-fixado*/ C = A--; Quais os valores de A, B e C aps a execuo dos comandos sequenciais ? 1.8.6 Operadores Compostos de Atribuio: += -= *= /= %= I += 2; I = I+2; X += Y+1; X = X+Y+1; X *= 3; X = X*3; X *= Y+1; X = X*(Y+1); Y %= 2; Y = Y % 2;+
Computao I
+ ++ ! ~ sizeof (type) * / % + << >> < <= > >= == != & ^ | && || ? : = *= /= %= += = &= ^= |= operadores de atribuio direita p/ esquerda <<= >>= ________________________________________________________________ , operador vrgula esquerda p/ direita ______________________________________________________________________
Chamada de funo referncia a elemento de vetor ref. a membro de estrutura esquerda p/ direita apontada por um ponteiro referncia a membro de estrutura___________________ menos (unrio) mais (unrio) incremento decremento negao lgica complemto de um direita p/ esquerda tamanho ocupado por um objeto converso - cast________________________________ multiplicao diviso esquerda p/ direita resto da diviso ___________________________ adio subtrao esquerda p/ direita_ deslocamento esquerda deslocamento direita esquerda p/ direita_ menor que moenor ou igual maior que esquerda p/ direita maior ou igual__________________________________ igual a diferente de esquerda p/ direita_ AND bit a bit esquerda p/ direita_ XOR bit a bit esquerda p/ direita_ OR bit a bit esquerda p/ direita_ AND Lgico esquerda p/ direita_ OR Lgico esquerda p/ direita_ condicional direita p/ esqueda__
Computao I
Computao I
10
2. Funes de Entrada-Sada em C
entrada padro teclado: leia(..) scanf(..) sada padro tela : imprima(..) printf(..) 2.1 A funo printf Sintaxe da chamada printf("expresso de controle", lista de argumentos); Expresso de controle caracteres impressos na tela + cd. de formatao dos argumentos
Lista de argumentos: expresses, variveis ou constantes Cd. de formao da var. Nfilhos (int decimal)
Algoritmo: Em C: ou
printf("O valor da varivel %d", Y ); /*se Y int*/ printf("O valor da varivel %f", Y ); /*se Y float*/
/*programa exemplo do uso da funo printf*/ Imprime com 6 casas dec. #include<stdio.h> int main( ) { int N=2; char Letra ='a'; float X = 2.5f; double Z=3.5e-10; printf("O primeiro valor impresso uma constante decimal %d",15); printf("O valor da primeira varivel declarada e inicializada %d",N); printf("O valor da segunda varivel declarada e inicializada %c",Letra); printf("O valor da primeira varivel de ponto flutuante (prec. Simples) %f",X); printf("O valor da segunda varivel de ponto flutuante (prec. Dupla) %f",Z); printf("O valor da segunda varivel de ponto flutuante (prec. Dupla) %.11f",Z); printf("O valor da expresso que soma 4 ao valor de N %d", N+4); printf("As variveis utilizadas (declaradas e inicializadas) foram N=%d, \ Letra=%c, X=%f, Z=%.11f", N,Letra,X,Z); return (0); } Computao I Myriam Regattieri Delgado CEFET/PR
11
s c a n f
%c %i %d %o %x %u %ld %f %lf %e %g %s
Caractere simples (char) Inteiro com sinal (int) Inteiro Decimal (int) Inteiro Octal (int) Inteiro Hexadecimal (int) Inteiro sem sinal (unsigned) Decimal longo Ponto flutuante (float e double) Ponto flutuante longo (double) Notao cientfica (mantissa e expoente) %e ou %f ( o mais curto) Cadeia de caracteres
%% imprime o sinal de porcentagem ___________________________________________________________ Cdigos Especiais Caractere Significado Valor ASCII (dec) ___________________________________________________________ \a Campainha 7 \b Retrocesso (Backspace) 8 \t TAB - horizontal 9 \v TAB - vertical 11 \n Nova Linha 10 \f Salta Pgina de Formulrio 12 \r Retorno do Carro 13 \ Aspas 34 \ Apstrofo (`) 39 \? Interrogao (?) 63 \\ Barra Invertida (\) 92 \0 Nulo 0 ___________________________________________________________
Computao I
12
/************************************************** Programa exemplo de constantes e variaveis em C ilustra a formatacao da funcao printf para alguns tipos da dados basicos ***************************************************/
#include <stdio.h> /* inclui definicoes basicas p/ I/O */ #define CONST_EX 50 /* nomeacao da constante 50 */ int main( ) { int vi; /* declaracao das variaveis */ char vc; float vx; double vy; vi = CONST_EX; /* atribuicao de valores */ vc = 'm'; vx = -10.3f; vy = 0.023; printf("Exemplo de constante CONST_EX = %d \n",CONST_EX); printf("Exemplo de variavel int vi = %i \n", vi); printf("Exemplo de variavel char vc = %c \n", vc); printf("Exemplo de variavel float vx = %f \n", vx); printf("Exemplo de variavel double vy = %f \n", vy); /* ou %lf */ vi = 10; printf("variavel int (decimal) vi = %d \n",vi); printf("variavel int (hexadecimal) vi = %x \n",vi); printf("variavel int (octal) vi = %o \n",vi); return (0); }
Computao I
13
Printf( ) com Inteiros #include <stdio.h> int main( ) { int vari = 2; float varx = 2.4f; printf(Exemplos : vari = %d, varx = %f \n, vari,vard); printf(A porcentagem da populao %d %% \n,85); return (0); } sada do programa Exemplos : vari = 2, varx = 2.4 A procentagem da populao 85 % Tamanho de Campos printf(total = %2d \n,100); printf(total = %4d \n,100); printf(total = %5d \n,100);
Ex:
sada : total = 100 total = 100 total = 100 Complementos com zeros esquerda printf(total = %04d \n,21); printf(total = %06d \n,21);
Ex:
Computao I
14
Printf( ) com Ponto Flutuante #include <stdio.h> int main( ) { printf(%4.2f\n,3456.78f); printf(%3.2f\n,3456.78f); printf(%3.1f\n,3456.78f); printf(%10.3f\n,3456.78f); return (0); } sada do programa
3456 .78 3456 .78 3456 .8 3456 .780
Alinhamento Direita Ex: printf(%10.2f %10.2f %10.2f\n,8.0,15.3,584.13); printf(%10.2f %10.2f %10.2f\n,834.0,1500.55,4890.21); sada : .00 834.00 15.30 1500.55 584.13 4890.21
Alinhamento Esquerda Ex: printf(%-10.2f %-10.2f %-10.2f\n,8.0,15.3,584.13); printf(%-10.2f %-10.2f %-10.2f\n,834.0,1500.55,4890.21); sada : 8.00 834.00 15.30 1500.55 584.13 4890.21
Computao I
15
2.2 A funo scanf Sintaxe da chamada scanf("expresso de controle", lista de argumentos); Expresso de controle caracteres lidos do teclado + cd. de formatao dos argumentos
Lista de argumentos: endereos das variveis a serem lidas Operador de Endereo da varivel Nfilhos
Letra=%c, X=
16
3. Estruturas de Seleo em C
3.1 Seleo Simples Algoritmo: se <condio for V> ento comando1; {ou bloco de comandos}; fim se Exemplos: leia(A); se A> 0 ento imprima(OK); A A +1; scanf(%d,&A); if (A> 0) { printf(OK \n); A = A +1; } Linguagem C: if (condio !=0) /*no falsa (verdad.)*/ { comando1; /*ou bloco de comandos/*; }
fim se
/* Exemplo de um programa com seleo simples */ #include <stdio.h> int main( ) { char entrada; scanf(%c,&entrada); if (entrada == f || entrada == F) //aqui NO tem ponto-e-vrgula { printf(Voce pressionou a tecla para finalizar \n); printf(Fim do programa); } printf(O valor da varivel fornecida %c, entrada); return (0); }
Computao I
17
3.2 Seleo Composta Algoritmo: se <condio for V> ento comando1; {ou bloco} seno comando2; {ou bloco} fim se Exemplos: leia(A); se A> 0 ento imprima(OK); A A +1; seno imprima(Erro); fim se
Linguagem C: if (condio !=0) /* no falsa*/ { comando1; /*ou bloco*/ } else { comando2; /* ou bloco*/ } scanf(%d,&A); if (A> 0) { printf(OK \n); A = A +1; } else printf(erro);
/* como neste caso o else s tem 1 comando no precisa de chaves*/
#include <stdio.h> int main( ) { char entrada; scanf(%c,&entrada); if (entrada == f || entrada == F) //aqui NO tem ponto-e-vrgula { printf(Voce pressionou a tecla para finalizar \n); printf(Fim do programa); } else // aqui NO tem ponto-e-vrgula { printf(Voce NAO digitou a tecla para finalizar \n); printf(Continuando a execuo do programa \n); } printf(O valor da varivel fornecida %c, entrada); return (0); }
Computao I
18
Computao I
19
3.4 Seleo de Mltipla Escolha escolha X caso E1: Comando1; {ou bloco} caso E2: Comando2; {ou bloco} : caso EN; ComandoN; {ou bloco} caso contrrio: ComandoM; {ou bloco} fim escolha switch(X) {
case E1: Comando1; {ou bloco}; break; case E2: Comando2; {ou bloco}; break; : case EN: ComandoN; {ou bloco}; break; default: ComandoM; {ou bloco}; break;
Exemplos: Incio {Algoritmo para criacao e teste de um MENU} caractere: op; leia(op); escolha(op) caso c : imprima(copiando arquivo); {comandos p/ copiar} caso a: imprima(apagando arquivo); {comandos p/ apagar} caso d: imprima(criando diretrio); {comandos p/ criar dir} caso f: imprima(formatando disquete); {comandos p/ formatar} caso contrrio: imprima(saindo do programa); {comandos para fim escolha fim #include <stdio.h> /* programa para criacao e teste de um MENU*/ int main ( ) { char op; printf("Entre com a opcao:"); aqui NO tem scanf(%c, &op); ponto-e-vrgula switch (op) { case c : printf(copiando arquivo\n); /*comandos p/ copiar*/; break; case a: printf (apagando arquivo\n); /*comandos p/ apagar*/; break; case d: printf (criando diretrio\n); /*comandos p/ criar dir*/; break; case f: printf (formatando disquete\n); /*comandos p/ formatar*/; break; default: printf(saindo do programa\n); break; } return (0); }
Computao I
20
4. Estruturas de Repetio em C
4.1 Repetio com teste no incio do lao Estrutura: enquanto while while (condio) /* condio verdadeira
{ ou no falsa*/
comando1; : comando N; }
Exemplo: A varivel de controle deve ser inicializada antes do incio do lao de repetio e modificada dentro do lao /*programa que imprime o quadrado e o cubo de uma srie de valores inteiros at que se digite 0*/ #include<stdio.h> #include<math.h> int main ( ) { int I; printf(Entre com um valor inteiro: ); scanf(%d,&I); /* var. de controle inicializada*/ while(I!=0) /* condio de execuo: var de controle I 0 */ { printf(%d | %f | %f\n, I, pow(I,2), pow(I,3) ); printf(Entre com um valor inteiro: ); scanf(%d,&I); /* var de controle modificada*/ } return (0); }
Computao I
21
4.2 Repetio com teste no fim do lao Estrutura: repita do-while /* faa-enquanto*/
repita <condio for V> faa comando1; : comando N; at <condio for V>
Exemplo: A varivel de controle pode ser modificada dentro do lao, mas como o teste feito no fim, a condio de parada no deve ser executada /*programa que imprime o quadrado e o cubo de uma srie de valores inteiros at que se digite 0*/ #include <math.h> #include<stdio.h> int main ( ) { int I; do { printf(Entre com um valor inteiro: ); scanf(%d,&I); /* var de controle modificada*/ if (I != 0) printf(%d | %f | %f \n, I, pow(I,2), pow(I,3) ); } while(I!=0); /* condio de execuo: I 0 */ return (0); }
Computao I
22
4.3 Repetio com varivel de controle incremental para Varivel de comando1; : comando N; fim para ValInic at ValFin passo P faa
for (Varivel = ValInic; Varivel <= ValFin; Varivel = Varivel +P) { comando1; : comando N; }
Exemplo:
/*programa que imprime o quadrado e o cubo de conjunto de 100 valores inteiros */ #include<math.h> #include<stdio.h> int main ( ) { int C, I; for (C=1;C<=100;C=C+1) aqui NO tem ponto-e-vrgula { printf(Entre com um valor inteiro: ); scanf(%d,&I); printf(%d | %f | %f \n, I, pow(I,2), pow(I,3) ); } return (0); }
Computao I
23 Algoritmo -> C : Estruturas de Repetio Estrutura Enquanto - Faa inicio real : MA, {mdia anual de um dado aluno} ACM, {acumulador} MAT; {media anual da turma} inteiro : CON; {contador} ACM 0; CON 0; leia (MA); enquanto MA -1 faa {teste da condio, se e falsa -> termina lao} ACM ACM + MA; CON CON + 1; leia (MA); fim enquanto MAT ACM / CON; imprima( A media anual da turma de,CON,alunos ,MAT); fim Laos de Repetio : While (Linguagem C) #include <stdio.h> int main( ) { float MA, /*mdia anual de um dado aluno */ ACM, /* acumulador */ MAT; /* media anual da turma */ int CON; /* contador */ ACM = 0; CON = 0; scanf ( %f ,&MA); while (MA != -1) /*teste da condio */ { ACM = ACM + MA; CON = CON + 1; scanf ( %f ,&MA); } MAT = ACM / CON; printf (media anual da turma de %d alunos = %2.1f ,CONT,MAT); return (0); }
Computao I
24
Estrutura Repita - At inicio real : MA, {mdia anual de um dado aluno} ACM, {acumulador} MAT; {media anual da turma} inteiro : CON; {contador} ACM 0; CON 0; repita leia (MA); se MA -1 ento ACM ACM + MA; CON CON + 1; fim se at MA = -1 {teste da condio de parada- se condio verdadeira -> finaliza o lao} MAT ACM / CON; imprima( A media anual da turma de,CON,alunos ,MAT); fim Laos de Repetio : Do-While (Linguagem C) #include <stdio.h> int main( ) { float MA, /*mdia anual de um dado aluno */ ACM, /* acumulador */ MAT; /* media anual da turma */ int CON; /* contador */ ACM = 0; CON = 0; do { scanf ( %f ,&MA); if (MA != -1) { ACM = ACM + MA; CON = CON + 1; } } while (MA != -1); /*teste da condio - se condio falsa -> abandona*/ MAT = ACM / CON; printf (media anual da turma de %d alunos = %2.1f ,CONT,MAT); return(0); }
Computao I
25 Estrutura Para - Faa inicio real : MA, {mdia anual de um dado aluno} ACM, {acumulador} MAT; {media anual da turma} inteiro : CON; {contador} ACM 0; para CON de 1 at CON<=50 passo 1 faa leia (MA); ACM ACM + MA; fim para MAT ACM / CON; imprima( A media anual da turma de,CON,alunos ,MAT); fim Laos de Repetio : for (Linguagem C) #include <stdio.h> int main( ) { float MA, /*mdia anual de um dado aluno */ ACM, /* acumulador */ MAT; /* media anual da turma */ int CON; /* contador */ ACM = 0; for(CON = 1; CON <= 50; CON = CON + 1) { scanf ( %f ,&MA); ACM = ACM + MA; } MAT = ACM / 50; printf (media anual da turma de %d alunos = %2.1f ,50,MAT); return (0); }
Computao I
26
5. Estruturas de Dados em C
Tipos Primitivos de Dados em C: char, int, float, double As estruturas de dados definem como os tipos primitivos sero organizados. Exemplos: Vetores, Matrizes, Registros, Listas, Filas, etc... O programa a seguir calcula a mdia das notas para uma turma de 40 alunos: #include<stdio.h> int main ( ) { float MedAlun, AcumMed, MedTur; int ContAlun; AcumMed = 0; for(ContAlun=1;ContAlun<=40;ContAlun++) { scanf(%f, &MedAlun); /*le a media de cada aluno*/ AcumMed = AcumMed + MedAlun; } MedTur = AcumMed/40.0f; printf(A media da turma de 40 alunos e = %.2f\n,MedTur); return (0); }
Como alterar o algoritmo para que o total de alunos N(conhecido previamente pelo usurio) possa ser fornecido ? Como calcular o total de alunos acima da mdia ? Como entrar com o nome de cada aluno ? Como guardar as parciais de cada aluno para o calculo da media de cada aluno e depois o calculo da media da turma ?
Computao I
27
Para calcular a quantidade de notas acima da mdia necessria a comparao da mdia de cada aluno MedAlun com a varivel MedTur. Observaes: a) no desenvolvimento do programa sem o uso de vetores, as mdias de cada aluno foram guardadas em uma nica varivel MedAlun. b)Ao final do processo de repetio s teremos o valor da ltima mdia lida (MedAlun para o 40o aluno ou N-simo aluno) Como fazer para solucionar este problema ? Soluo 1) utilizar uma varivel para cada aluno Obs. invivel para um nmero fixo grande de alunos ou quando se quer alterar o total de alunos a cada execuo Soluo 2) utilizar um vetor para guardar as mdias de cada aluno e depois de calculada a MedTur comparar esta com cada mdia que foi guardada no vetor
Computao I
28
Como atribuir 8.5 nota do 1 aluno e 9.3 nota do ltimo aluno? Como atribuir nota do 3 aluno a mdia da nota dos dois primeiros?
Computao I
29
5.1.1 Vetores Numricos Recebem valores inteiros, de ponto flutuante (prec. Simples) e de ponto flutuante (prec. Dupla) Declarao e Inicializao (feitas conjuntamente) int Vet[4] = {0,0,0,0}; /* inicializa todos com 0*/ int Vet[4] = {-1,-1}; /* inicializa os dois primeiros elementos com -1*/ float V[3] = {1.0f, 1.1f, 1.5f}; /* incializa todos com const. tipo float*/ int A[ ] = {0,0,0,0,0,0,0,0}; /* a dimenso assume o tamanho da inic.*/ A declarao e inicializao conjuntas til para vetores de dimenso reduzida Atribuio As atribuies devem ser feitas elemento a elemento 1. Atribuio feita pelo programa int vetorA[10]; ou VetorA[0] = 0; VetorA[1]= 0; .... VetorA[9] = 0; 2. Atribuio feita pelo usurio int vet[10]; scanf(%d,&vet[0]); scanf(%d,&vet[9]); ou int C, vet[10]; for (C=0;C<=9;C++) scanf(%d,&vet[C]); int C, vetorA[10]; for (C=0;C<=9;C++) vetorA[C] = 0;
Computao I
30
5.1.2 Vetores de Caracteres: Strings As variveis do tipo vetor de caracteres (strings) so declaradas como char vet[DimMax]; Recebem um conjunto de valores do tipo char denominados constantes strings Ex. Maria, Av. 7 de Setembro. Todo vetor de caracteres (string) em C deve terminar com o caractere nulo \0 que indica o fim da string (nenhum caractere aps este considerado) Declarao e inicializao (feitas conjuntamente) char Nome[6] = {M,a,r,i,a, \0 }; char Ender[20] ={A,v, ., ,7, ,d, e, ,S,e,t,e,m,b,r,o,\0 }; char cidade[15 ] = Curitiba; Atribuio As atribuies podem ser feitas elemento a elemento 1. Atribuio elemento a elemento feita pelo programa char fruta[5]; fruta[0] = p; fruta[1]= e; fruta[2] = r; fruta[3] = a; fruta[4]= \0; int C; char vetorABCD[27]; for (C=0;C<=25;C++) vetorABCD[C] = C+97; vetorABCD[26] = \0 ;
ou
2. Atribuio elemento a elemento feita pelo usurio char Nome[6]; scanf(\n%c,&Nome[0]); scanf(\n%c,&Nome[4]); Nome[5]='\0'; int C; char vetorLetras[10]; for (C=0;C<=8;C++) { scanf(\n %c,&vetorLetras[C]); } vetorLetras[C]=\0;
Computao I
31
/* Programa Exemplo de vetores de inteiros e vetores de caracteres (strings) Programa l 3 notas e o nome do aluno (caractere a caractere) e Calcula e Imprime(caractere a caractere) o nome e a mdia das 3 notas */ #include <stdio.h> int main ( ) { char letra_nome[15]; /* 1 4 letras + '\0'*/ float nota[3], soma, media; int indice; soma = 0.0f; printf("Entre com as notas do aluno \n"); for(indice=0; indice<3;indice++) { scanf("%f", ¬a[indice]); soma = soma+nota[indice]; } media = soma/3.0f; printf("Entre com as letras do nome do aluno \n"); for(indice=0; indice<15;indice++) {/* l uma letra de cada vez (o usurio TEM que entrar com 15 letras)*/ scanf("\n%c", &letra_nome[indice]); } letra_nome[15] = '\0'; printf("A media do(a) aluno(a) "); for(indice=0; indice<15;indice++) printf("%c", letra_nome[indice]); printf("foi %2.2f\n",media); return (0); } Desvantagem: como fazer quando os nomes tiverem menos ou mais de 15 letras ? As strings permitem que, ao invs de se atribuir um valor a um elemento de cada vez, a atribuio seja feita num nico passo.
Computao I
32
3. Atribuio de todo o vetor feita pelo programa Este tipo de atribuio pode ser feito pela funo strcpy(...); cujo prottipo est em <string.h> Exemplo: #include<stdio.h> #include<string.h> int main( ) { char fruta[5], vetorABCD[27], Nome[15], Ender[50]; strcpy(fruta,pera); /* equiv a fruta = pera */ strcpy(Nome,Maria); /* equiv a Nome = Maria */ strcpy(Ender,Av. 7 de Setembro); /* equiv a Ender = Av. 7 de Setembro */ strcpy(vetorABCD,abcdefghijklmnopqrstuvwxyz); /* a funo strcpy j inclui o \0 no final*/ printf(A fruta e %s \n O nome e %s \n,fruta,Nome); printf(O endereo e %s \n e o abecedrio e %s \n,Ender,vetorABCD); return (0); } 4.Atribuio de todo o vetor feita pelo usurio gets(Nome_vetor) /* mais utilizada */ ou scanf(%s,&Nome_vetpr[0]); ou scanf(%s,Nome); /* menos utilizadas*/ /* as funes scanf com %s e gets j incluem o \0 no final mas scanf no aceita espao porque considera-o como finalizador (elimina o que vier depois)*/ Exemplos: gets(fruta); gets(Nome); gets(Ender);
Computao I
33
Funes de manipulao de strings: leitura: scanf(%s,varstr); /* prottipo em <stdio.h> NO aceita espao*/ gets(varstr); /* prottipo em <string.h> */
impresso: printf(%s \n,varstr); /* prottipo em <stdio.h> */ puts(varstr); /* prottipo em <string.h> imprime e j salta linha*/
manipulao: /* todas com prottipo em <string.h> */ strcpy(varstr,str2); /* copia a constante ou varivel string str2 na varivel varstr*/ strlen(str); /* calcula o tamanho (sem contar o \0 ) da var. ou constante string */ strcat(varstr1,str2); /* une as duas strings varstr1+str2*/ strcmp(str1,str2) /* compara as duas strings e retorna */ < 0 se str1 < str2 (ordem alfab) = 0 se str1 = str2 > 0 se str1 > str2 (ordem alfab)
Exemplos: char vetletras[101]; /* vetor que armazena letras (max 100 + \0)
gets(vetletras); /* l o vetor de uma vez s e j inclui o \0 no lugar do \n*/ scanf(%s,vetletras); /* idem anterior mas no aceita nomes com espao*/ printf(%s,vetletras); /* imprime o vetor todo de uma vez */ puts(vetletras); /* idem anterior e j pula linha no final*/ strlen(vetletras); /* calcula o tamanho (sem contar o \0 ) do vetor vetletras */ strcpy(vetletras,myriam); /* copia a string myriam no vetor vetletras */ strcat(vetletras,myriam); /* adiciona a string myriam ao vetor vetletras */ strcmp(vetletras,myriam) /*compara o vetor vetletras com a string myriam*/ retorna 0 se vetletras for igual a myriam retorna <0 se vetletras for anterior no alfabeto o por exemplo qualquer nome iniciando c/ a letra a l (< m)
retorna >0 se vetletras for posterior no alfabeto o por exemplo qualquer nome iniciando c/ a letra n-z (> m)
Computao I
34
/* Alteracao do programa anterior para ler e imprimir como string */ #include <stdio.h> #include<string.h> int main ( ) { char nome[51]; /* at 50 letras + '\0'*/ float nota[3], soma, media; int indice; soma = 0.0f; printf("Entre com as notas do aluno \n"); for(indice=0; indice<3;indice++) { scanf("%f", ¬a[indice]); soma = soma+nota[indice]; } media = soma/3.0f; printf("Entre com o nome do aluno (max de 4 letras) \n"); scanf(\n); /* limpar memria do teclado para ler character*/ gets(nome); printf("A media do(a) aluno(a) %s foi %2.2f\n",nome,media); return (0); } gets(nome) strcpy(nome,Joana); pois strcpy copia a constante string Joana no vetor nome ao passo que gets(nome) atribui uma string qualquer (definida pelo usurio) ao vetor nome.
A diferena entre gets e strcpy similar diferena entre scanf(%i, &N); N =2;
pois no segundo caso, atribui-se a constante 2 varivel N ao passo que no primeiro caso, atribui-se um valor qualquer (definido pelo usurio) varivel N.
Computao I
35
Como guardar as parciais (total de 2) de cada aluno para o clculo da mdia do aluno e depois o clculo da mdia da turma ?
Computao I
36
Computao I
37
5.2.1 Matrizes Numricas Recebem valores do tipo int, float, double Declarao e Inicializao (feitas conjuntamente) int Mat[2][4] = {{0,0,0,0}, {0,0,0,0}}; /* inicializa todos com 0*/ int MAT[3][5] = {{-1,-1,-1,-1,-1}}; /* inicializa s a 1a. linha com -1*/ float M[2][2] = {{1.0f, 1.1f},{1.5f,-0.9f}}; /* inicializa com const. tipo float*/ int A[3 ][3] = {{0,0,0},{0,0,0}}; /* a dimenso assume o tamanho da inic. 2x3*/ til para matrizes de dimenso reduzida Atribuio As atribuies devem ser feitas elemento a elemento 1. Atribuio feita pelo programa int matA[2][5]; matA[0][0] = 0; matA[0][1]= 0; .... matA[0][4] = 0; matA[1][0]= 0; .... matA[1][4] = 0; ou ou int L,C, matA[2][5]; for (L=0;L<=1;L++) for (C=0;C<=4;C++) matA[L][C] = 0;
2. Atribuio feita pelo usurio int matA[2][5]; scanf(%d,&matA[0][0]); scanf(%d,&matA[1][4]); int L,C, matA[2][5]; ou for (L=0;L<=1;L++) for (C=0;C<=4;C++) scanf(%d,&matA[L][C]);
Computao I
38
5.2.2 Matrizes de Caracteres (Matriz de Strings) As variveis do tipo matriz de caracteres (strings) so declaradas como char vet[DimMax1][DimMax2] ... [DimMaxN]; Recebem (em cada linha) uma string de caracteres Cada linha da matriz de caracteres deve terminar com o caractere nulo \0 Declarao e inicializao (feitas conjuntamente) char Nome[3][6] ={{M,a,r,i,a, \0 },{J,o,e,l, \0 },{A,n,a, \0 }}; char Ender[2][21] ={ {A,v, ., ,7, ,d, e, ,S,e,t,e,m,b,r,o,\0 }, {R,u, a, ,P,e,r,n,a,m,b,u,c,o,\0 } } ; char cidades[2][51] = {Curitiba,Campinas}; Atribuio As atribuies podem ser feitas elemento a elemento 1. Atribuio elemento a elemento feita pelo programa char frutas[3][5]; frutas[0][0] = p; frutas[0][1]= e; frutas[0][2] = r; frutas[0][3] = a; frutas[0][4]= \0; frutas[1][0]= u; Matriz frutas ou p u e v r a a \0 \0
2. Atribuio elemento a elemento feita pelo usurio char Nome[4][6]; scanf(\n%c,&Nome[0][0]); scanf(\n%c,&Nome[0][4]); char Letras[5][10]; int L,C; ou for (L=0;L<=4;L++) { for (C=0;C<=8;C++) { scanf(\n %c,&Letras[L][C]); } Letras[L][C] = \0 ; }
Computao I
39
char frutas[3][5];
strcpy(frutas[0],pera); /* copia a string pera na 1 linha */ strcpy(frutas[1],uva); /* copia a string uva na 2 linha */ strcpy(frutas[2],kiwi); /* copia a string kiwi na 3 linha */ /* lembrando que o prottipo de strcpy(..) est em string.h*/
char Nomes[4][6] scanf(\n); gets(Nomes[0]); scanf(\n); gets(Nomes[3]); ou char Nomes[5][31]; int J; for (J=0;J<=4;J++) { printf(Entre com o nome (mx. de 30 caracteres)\n); scanf(\n); gets(Nomes[J]); }
Computao I
40
Exemplos: Funes de Manipulao de Strings com Matrizes char matletras[10][101]; /* armaz conj de palavras (max 10) cada uma c/ max 100 letras + \0)*/
gets(matletras[3]); /* l a 4 palavra de uma vez s e j inclui o \0 no lugar do \n*/ scanf(%s,matletras[3]); /* idem anterior mas no aceita nomes com espao*/ printf(%s,matletras[3]); /* imprime 4 palavra toda de uma vez */ puts(matletras[3]); /* idem anterior e j pula linha no final*/ strlen(matletras[2]); /* calcula o tamanho (sem contar o \0 ) da 3 palavra da mat*/ strcpy(matletras[2],joana); /* copia a string joana na 3 palavra da mat*/ strcat(matletras[2],joana); /* adiciona a string joana na 3 palavra da mat */ strcmp(matletras[2],joana) /*compara a 3 palavra da mat com a string joana*/ retorna 0 se a 3 palavra da matriz for igual a joana retorna <0 se 3 palavra da matriz for anterior no alfabeto o por exemplo qualquer nome iniciando c/ a letra a i (< j)
retorna >0 se 3 palavra da matriz for posterior no alfabeto o por exemplo qualquer nome iniciando c/ a letra k-z (> j)
#include<stdio.h> #include<string.h> Int main( ) { char mat[2][50]; int resp1, resp2, resp3; strcpy(mat[0], "Banana"); strcpy(mat[1],"Pera"); resp1 = strcmp(mat[0],mat[1]); resp2 = strcmp(mat[0],mat[0]); resp3= strcmp(mat[1],mat[0]); printf("%i %i %i\n", resp1,resp2,resp3); return (0); } /* imprime -1 0 1 na tela */
Computao I
41
INFORMATIVO
Exemplo Alocao de Vetores e Matrizes Declarao de Vetores e Esquemtico da Memria DECLARAO int a; float b; int vetor[5]; a b vetor[0] vetor[1] . . vetor[4] MEMRIA ALOCADA (2 bytes) (4 bytes)
Total Alocado : 2 + 4 + (2 *5) = 16 bytes Declarao de Matrizes e Esquemtico da Memria DECLARAO MEMRIA ALOCADA
int mat[5][3]; . .
(3* 2 bytes) (3* 2 bytes) (3* 2 bytes) (3* 2 bytes) (3* 2 bytes)
Computao I
42
6. Modularizao - Funes em C
As funes facilitam a elaborao e o entendimento de programas em C Como exemplo das facilidades que as funes podem trazer, considere o programa em C que calcula o fatorial de um nmero inteiro fornecido pelo usurio: #include <stdio.h> int main( ) { int N,Numero; long int Fat; printf(Entre com o valor do Numero); scanf(%d,&Numero); N=Numero; if(N<0) printf(No existe fatorial de %d (valor negativo) \n,Numero); else{ if(N==0 ) Fat = 1; /* fatorial de 0 por definio igual a 1 */ else { Fat = N; /*incio do clculo do fatorial*/ while(N > 1) { Fat = Fat*(N-1); N=N-1; } /*fim do clculo do fatorial*/ } printf(O fatorial de %d e igual a %ld \n,Numero,Fat); } return (0); } Como calcular a combinao de N elementos P a P ?
N CP =
N! P!( N P )!
Soluo 1) Via repetio de cdigo (menos indicada) Soluo 2) Utilizando uma funo para o clculo do fatorial Comb = FuncFat(N) / ( FuncFat(P)*FuncFat(N-P));
Computao I
43 /* Soluo 1: Programa para o clculo de Combinao de N elementos tomados P a P Com repetio de cdigo (Sem utilizao de Mdulos ) */ #include<stdio.h> int main( ) { int N,P,X,COMB; long int FAT1, FAT2, FAT3; scanf(%d %d,&N,&P); if (N < P) printf(Combinao indefinida\n ); else if(N < 0 P < 0) printf (No existe cominao de nmeros negativos\n); else { X = N; /*Calcula Fatorial de N em FAT1*/ if (X == 0) FAT1 = 1; else {FAT1 = X; while (X > 1) { FAT1 =FAT1 * (X-1); X--; } } X = P; /*Calcula Fatorial de P em FAT2*/ if (X == 0) FAT2 = 1; else {FAT2 = X; while (X > 1) { FAT2 =FAT2 * (X-1); X--; } } X = N-P; /*Calcula Fatorial de (N-P) em FAT3*/ if (X == 0) FAT3 = 1; else {FAT3 = X; while (X > 1) { FAT3 =FAT3* (X-1); X--; } } COMB = (FAT1) /(FAT2 * FAT3); printf (Combinacao = %i \n ,COMB); } return (0); }
Computao I
44
Na liguagem C as funes oferecem um meio de decompor repetidamente um problema em problemas menores. Um programa grande pode ser escrito como uma coleo de funes onde cada uma executa uma tarefa especfica.
45
Todas a funes precisam de um prottipo Funes de biblioteca: constam em <XXX.h> Nossas Funes: especificadas aps os include
O incio da execuo da funo acontece quando a funo chamada em algum ponto do programa.
A partir da chamada a execuo transferida para a DEFINIO da funo. A funo apenas ir ser executada corretamente se todos os comandos necessrios para isto estiverem presentes na sua definio. #include <stdio.h> /* Prottipo da funo printf */ #include <math.h> /* Prottipo da funo pow*/
test_num(int);
int main ( ) { int I=12; float x = -2.4f;
printf(%f \n, x ); /* chamada a printf*/ printf(%d | %f | %f \n, I, pow(I,2), pow(I,3) ); /* chamada a printf*/ test_num(I); /* chamada a test_num*/ return (0); }
test_num(int X) /* definio da funo test_num*/ { if (X%2==0) printf(%i par, X); /* chamada a printf*/ else printf(%i impar, X); /* chamada a printf*/
}
Computao I
46
6.2.1 Prottipo das funes (declarao) tipo bsicos + modificadores ou Ex: menu( ); nome_da_funo(tipo dos argumentos); mesma regra para nome das variveis ou lista dos tipos de todos
os argumentos recebidos pela funo
test_num(int);
6.2.3 Definio das funes tipo nome_da_funo(declarao dos parmetros) { Declarao das variveis locais Comandos; declarao de todos os
argumentos recebidos pela funo } /*Na definio da funo, os argumentos recebidos so armazenados em
variveis denominadas de parmetros*/ Exemplo: test_num(int X) { if (X%2==0) printf(%i par, X); else printf(%i impar, X); }
Computao I
47
6.3. Funes de biblioteca As funes de biblioteca mais comuns so: printf usada para imprimir valores na tela prottipo: consta no arquivo <stdio.h> chamada: a chamada funo printf pode ocorrer no main ou em qualquer outra funo do programa Ex. printf(%f,y); definio: a funo printf j vem pronta para ser utilizada (no temos acesso ao
cdigo fonte desta funo). Portanto, no temos acesso definio dela.
scanf usada para entrada de dados pelo usurio prottipo: consta no arquivo <stdio.h> chamada: a chamada funo scanf pode ocorrer no main ou em qualquer outra funo do programa. Ex. scanf(%i&a); definio: a funo scanf j vem pronta para ser utilizada (no temos acesso ao
cdigo fonte desta funo). Portanto, no temos acesso definio dela.
pow usada para o clculo de potncia x ^y prottipo: consta no arquivo <math.h> chamada: a chamada funo pow pode ocorrer no main ou em qualquer outra funo do programa Ex. pow(10,3); definio: a funo pow j vem pronta para ser utilizada (no temos acesso ao
cdigo fonte desta funo). Portanto, no temos acesso definio dela.
clsrscr usada para limpar a tela prottipo: consta no arquivo <conio.h> chamada: a chamada funo clrscr pode ocorrer no main ou em qualquer outra funo do programa Ex. clrscr( ); definio: a funo clrscr j vem pronta para ser utilizada (no temos acesso ao
cdigo fonte desta funo). Portanto, no temos acesso definio dela.
Para as nossas funes, precisamos incluir tambm os comandos necessrios para que a tarefa seja executada, isto , incluir a definio
Computao I
48
Exemplo de Funes em C Declarao ou Prottipo, Chamada, e Definio de Funes #include <stdio.h> /* Prottipo da funo printf */ imp_mens1( ); /* Prottipo da funo imp_mesn1 */ imp_mens2(int); /* Prottipo da funo imp_mens2 */ imp_mens3(int, float); /* Prottipo da funo imp_mens3 */ int main ( ) { int I; float x = -2.4f; /* definio da funo main */
I = 12; imp_mens1( ); /*chamada da funo imp_mesn1*/ imp_mens2(I); /*chamada da funo imp_mens2*/ imp_mens3(I,x); /*chamada da funo imp_mens3*/ return (0); } imp_mens1 ( ) /*definio da funo imp_mesn1*/ { printf( O valor da constante e %d \n, 10); /*chamada printf*/ } imp_mens2 (int var) { printf( O valor da var recebida c/ argumento e %d \n, var); /*chamada printf*/ printf( O valor da constante e %d \n, 10); /*chamada printf*/ } imp_mens3 (int var1, float var2) { printf( Os valores das var recebidas como arg sao %d e %2.2f\n, var1,var2); printf( O valor da constante e %d \n, 10); /*chamada printf*/ } /*definio da funo imp_mens2*/ /*definio da funo imp_mens2*/
Computao I
49
A funo somente executada no ponto onde ocorre a CHAMADA Se no h nenhuma chamada, a funo NO EXECUTADA. A funo main chamada pelo compilador e um exemplo de funo que chama outras no programa. Na funo main temos as chamadas s funes que ns mesmos implementamos, as chamadas s funes de biblioteca (ex: printf, scanf, pow) No exemplo anterior temos o seguinte esquema de chamadas de funes imp_mens1 main imp_mens2 imp_mens3 printf printf printf
Refaa o programa anterior para que as chamadas das funes siga as estruturas mostradas a seguir e o resultado seja o mesmo do programa original printf main imp_mens2 imp_mens3 imp_mens1 printf printf
printf
Computao I
50
prottipo que consta no arquivo stdio.h chamada que pode ocorrer em qualquer ponto do programa e marca o incio da execuo da funo
Aquilo que fornecemos para a funo denominado argumento na chamada vem sempre aps o nome da funo e entre parnteses.
Exemplo: #include <stdio.h> /* este arquivo contm o prottipo da funo printf*/ int main( ) { char L='A'; float x=2.5f; int A=2,B=3; CHAMADA
O primeiro argumento a string "imprimindo %d, %c, %f e %i" que determina a formatao do que ser impresso, ou seja, como a lista de parmetros ser impressa O segundo argumento uma constante inteira, cujo valor 10 passado para a funo O terceiro argumento uma varivel do tipo char, cujo valor 'A' passado para a funo O quarto argumento uma varivel do tipo float, cujo valor 2.5 passado para a funo O quinto argumento uma expresso, cujo valor 5 passado para a funo
Computao I
51
test_num(int X) { if (X%2==0) printf(%i par, X); else printf(%i impar, X); } Funo test_num Tipo da funo: Declarao dos parmetros: int X Comandos: seleo composta (if-else) e duas chamadas a printf
Computao I
52
1. Os resultados retornados pelas funes podem ser armazenados em outras variveis. Exemplo: A = pow(Y,2); 2. Utilizados diretamente em expresses. Exemplo: B = pow(Y,2)+pow(Z,3); 3. Ou utilizados na chamada a outras funes. Exemplo: printf(%f,pow(X,4)); 6.6.2 Funes Definidas pelo Programador
Como elaborar as nossas prprias funes para que retornem um resultado para outras funes que a chamam? a) Declarar o tipo retornado pela funo (no prottipo e na definio) b) Retornar o resultado atravs do comando RETURN. c) Armazenar/utilizar o resultado sob uma 3 formas detalhadas em 5.6.1 Exemplo: #include <stdio.h> /* este arquivo contm o prottipo da funo printf*/ int MDC(int,int); /* prottipo da funo MDC*/ int main( ) { int v1, v2, u; scanf(%i %i,&v1,&v2); MaxDivCom=MDC(v1,v2); printf(O maximo divisor comum entre %i e %i e %i, v1,v2, MaxDivCom); return (0); } int MDC(int u, int v) /*incio da definio da funo MDC*/ { int temp; while(v!=0) { temp = u%v; u =v; v = temp; } return(u); /* Este comando return(u) equivale a fazer MCD = u */}
Computao I
53
int main( ) { int I; float RAIZ; scanf(%d,&I); printf(O valor lido foi %d \n,I); X=2; RAIZ=pow(X,1.0/2); printf(A raiz quadrada de %d %f\n,X,RAIZ); m1( ); m2( ); printf( X=%d, RAIZ=%f \n,X,RAIZ); return (0); } m1( ) { printf(O valor da varivel global X era %d \n,X); X = 3; printf(O valor da varivel global X foi alterado para %d \n,X); } m2( ) { int A=10; float RAIZ; printf(O valor da varivel local A %d \n,A); RAIZ = pow(X,1.0/2); printf(A raiz quadrada de %d %f\n,X,RAIZ);
m2 { A RAIZ }
Computao I
54
6.7.1 Uso de Variveis Globais: O uso de variveis globais acontece quando as funes do programa no recebem nenhum argumento ou no retornam nenhum valor (tipo de retorno = ) /* Exemplo de Programa que calcula o fatorial de um nmero utilizando variveis GLOBAIS */ #include<stdio.h> int N; /* declaracao da variavel global N*/ long int Fat; /* declaracao da variavel global Fat*/ fatorial( ); /* prototipo da funcao fatorial (no retorna valor e no recebe argumento ) */
int main( ) { printf(Entre com um valor inteiro: ); scanf(%d,&N); fatorial( ); return (0); } fatorial( ) { int Numero=N; if(Numero>=0) { if(Numero==0 ) Fat = 1; /* definio de fatorial de 0*/ else { Fat = Numero; while(Numero > 1) { Fat = Fat*(Numero-1); Numero--; } } printf(O fatorial de %d e igual a %ld \n,N,Fat); } else printf(No existe fatorial de %d (valor negativo) \n,N); }
Computao I
55
6.7.2 Uso de Variveis Locais: O uso de variveis locais acontece quando as funes do programa recebem argumentos e/ou retornam algum valor (trocam informaes) /* Exemplo de Programa que calcula o fatorial de um nmero utilizando somente variveis LOCAIS */ #include<stdio.h> long int fatorial(int); /* prototipo da funcao fatorial (retorna valor e recebe argumento) */ int main( ) { int N; /* declaracao da variavel local N*/ long int F; /* declaracao da variavel local F */ printf(Entre com um valor inteiro: ); scanf(%d,&N); F = fatorial( N); //F = Fat; if (F != -1) printf(O fatorial de %d e %ld \n,N,F); else printf(No existe fatorial de numero negativo \n); return (0); } long int fatorial(int X) { long int Fat; if(X>=0) { if(X==0 ) Fat = 1; /* definio de fatorial de 0*/ else { Fat = X; while(X > 1) { Fat = Fat*(X-1); X--; } } return(Fat); } else return(-1); }
Computao I
56
Exemplos de Programas com Funes (Parte I) /********************************************** Exemplo I-A: funo que recebe argumentos e retorna Valor (utilizao de variveis LOCAIS) tipo_retornado : char tipo dos parmetros : int *************************************************/ #include <stdio.h> char testa_sinal(int ); int main( ) { int i; /* variveis locais de main */ char resp; do { printf("Entre com um valor inteiro positivo \n"); scanf("%d",&i); resp = testa_sinal(i); }while(resp=='n'); return (0); } char testa_sinal(int a) { char sinal; /* varivel local cujo valor ser retornado a funo main */ if(a>=0) { sinal = 'p'; printf("Valor OK \n"); } else { sinal = 'n'; printf("Valor nao permitido\n"); } return(sinal); }
Computao I
57
/************************************************************
Exemplo I-B: funo que recebe argumentos e retorna modulo do argumento
tipo_retorna : float tipo dos parmetros : float ***********************************************************/ include <stdio.h> float modulo(float ); int main( ) { float f1,f2,res; int i1; f1 = -12.4f; f2 = -4.2f; i1 = -3; res = modulo(f1); printf("f1 = %2.2f, |f1| = %2.2f\n",f1,res); res = modulo(f1) + modulo(f2); printf("A soma de |f1| + |f2| e' %2.2f\n",res); res = modulo((float) i1); printf("Cast de argumento inteiro e' %2.2f \n",res); res = modulo(i1); printf("Conversao de argumento inteiro %2.2f \n",res); printf("divisao por inteiro : %2.2f \n",modulo(-6.0)/4); return (0); } float modulo(float x) { if(x<0) x = -x; return(x); }
Computao I
58
Exemplo I-C: Geral #include <stdio.h> /* contem prottipos e definies bsicas de entrada/sada */ #include <conio.h> /* contem prottipo da funo getch */ int func1( ); /*prottipos globais das funes definidas no programa */ func2(int); float y; /* variavel global */ int main( ) { int p,var; printf("\n***********Funcao main************\n"); printf("Entre com um valor inteiro : \n"); scanf("%d",&p); printf("variavel local p da funcao main = %d\n",p); y=12.5f; printf("Variavel global y = %3.3f \n",y); printf("Transfere comando para func1 \n"); var = func1( ); printf("\nNovamente funcao main \n"); printf("retorno da funcao func1 e' %d \n",var); printf("Termina a execucao\n"); getch( ); /* espera qualquer valor lido do teclado */ return (0); } int func1( ) { int f1,arg=2,retorno_func1; /* variveis locais de func1 */ printf("***********Funcao func1************\n"); printf("Entre com um numero\n"); scanf("%d",&f1); printf("variavel local f1 = %d\n",f1); printf("variavel local arg = %d passada como argumento \ para a funcao func2\n",arg); printf("trasfere comando para func2\n"); func2(arg); printf("\nNovamente funcao func1\n"); printf("variavel global y = %3.3f\n",y); retorno_func1 = f1; printf("retorna para main o valor de f1 = %d \n",f1); return(retorno_func1); }
Computao I
59
func2(int parm_x) { int f2=4; printf("***********Funcao func2************\n"); printf("variavel local f2 = %d \n",f2); printf("variavel global y = %3.3f \n",y); printf("recebeu de func1 como argumento, o valor %d \n",parm_x); }
Entradas via teclado : 100 200 Sada do Programa : ***********Funcao main************ Entre com um valor inteiro : variavel local p = 100 Variavel global y = 12.500 Transfere comando para func1 ***********Funcao func1************ Entre com um numero variavel local f1 = 200 variavel local arg = 2 passada como argumento para a funcao func2 trasfere comando para func2 ***********Funcao func2************ variavel local f2 = 4 variavel global y = 12.500 recebeu de func1 como argumento, o valor 2 Novamente funcao func1 variavel global y = 12.500 retorna para main o valor de f1 = 200 Novamente funcao main retorno da funcao func1 e' 200 Termina a execuo
Computao I
60
b)Transferncia de Argumentos por Referncia (passagem por referncia): Neste caso o endereo da varivel passado na chamada da funo. Com isso, a funo pode acessar a rea de memria da varivel, alterar o seu contedo e as alteraes passam a ser visveis para todas as outras funes que utilizam estas variveis. Exemplo: int N; float P; scanf(%d %f, &N,&P); Neste caso os endereos das variveis N e P so passados para a funo scanf que pode alterar o contedo destas variveis, e outras funes (como a main por exemplo) conseguem perceber estas alteraes.
Computao I
61
6.8.1 Passagem por Valor: Prottipo, Definio e Chamada Na passagem por valor, os prottipos, definio e chamada das funes acontecem como os exemplos mostrados anteriormente (a funo s pode alterar localmente os contedos das variveis): Prottipo das funes tipo nome_da_funo(tipo dos parmetros); Definio das funes tipo nome_da_funo(declarao dos parmetros); { Declarao das variveis locais Comandos; } Chamada das funes
nome_da_funo(lista dos argumentos); Exemplo #include <stdio.h> func_ex_chamada_por_valor(int, float ); Prottipo
int main( ) { int a=2; float y=3.5f; /* variveis locais de main */ func_ex_chamada_por_valor(a,y); Chamada printf(%d %f \n , a, y); /* imprime 2 e 3.500000*/ return (0) ; } func_ex_chamada_por_valor(int a, float y) Definio { int c=3; float z=4.6f; a = a+2; y = y+2.5f; printf(Variaveis locais: c=%d, z=%f \n,c,z); printf(Variveis cujos valores foram recebidos de main: \ e foram alterados localmente a=%d, y=%f \n,a,y); }
Computao I
62
6.8.2 Passagem por Referncia: Prottipo, Definio e Chamada Na passagem por referncia, os prottipos, definio e chamada das funes so alterados para troca de endereos das variveis ao invs dos valores das variveis (a funo pode alterar globalmente o contedo das variveis): Prottipo das funes tipo nome_da_funo(tipo dos parmetros seguidos por *); Definio das funes tipo nome_da_funo(declarao dos parmetros -ponteiros); { Declarao das variveis locais Comandos; /* todo acesso ao contedo da varivel ponteiro deve ser feito acrescentando-se o * */ } Chamada das funes
nome_da_funo(lista dos endereos dos argumentos); Exemplo #include <stdio.h> func_ex_chamada_por_refer(int *, float *); int main( ) { int a=2; float y=3.5f;
Prottipo
func_ex_chamada_por_refer(int *a, float *y) Definio { int c=3; float z=4.6f; *a = *a+2; Acesso ao contedo *y = *y+2.5f; Acesso ao contedo printf(Variaveis locais: c=%d, z=%f \n,c,z); printf(Variveis cujos valores foram recebidos de main: \ e foram alterados globalmente a=%d, y=%f \n,*a,*y); }
Computao I
63
Exemplos de Programas com Funes (Parte II) Nos Exemplos a seguir todas as variveis declaradas so do tipo LOCAL E entre as funes existe passagem por valor e/ou referncia /********************************************** Exemplo II-A: funcao que recebe argumentos (A,B, e C) e os endereos dos argumentos X e Y que guardaro as razes da equao tipo_retornado : int (flag que indica se existem razes reais) tipo dos parmetros : valores e endereos ***************/ #include <stdio.h> #include <math.h> int calcula_raiz(float, float, float, float *, float * ); int main( ) { int resp; char continua; /* variveis locais de main */ float A,B,C,X1,X2; /* variveis locais de main */ do { printf("Entre com os valores A, B e C da eq. do seg. grau\n"); scanf("%f %f %f, &A, &B, &C); resp = calcula_raiz(A,B,C,&X1,&X2); if (resp != -1) printf(As razes so X1 = %.2f e X2 = %.2f \n,X1,X2); else printf(No existem razes reais \n); printf(Digite (n) ou (N) para parar e qq. Letra para continuar\n); scanf(\n%c,&continua); }while(continua!='n' && continua!= N ); return (0); } int calcula_raiz(float A, float B, float C, float *X1, float *X2) { float delta; delta = B*B 4*A*C; if (delta < 0) return(-1); /* no existem razes reais */ else { *X1 = -B + sqrt(delta)/(2*A); /* sqrt calc. Raiz quadrada*/ *X2 = -B - sqrt(delta)/(2*A); return(1); } }
Computao I
64
Exemplo II-B: funcao que recebe como argumentos os endereos de duas variveis e troca os seus valores tipo_retornado : tipo dos parmetros : endereos das variveis *******************/ #include <stdio.h> troca( float *, float * ); int main( ) { char continua; /* varivel local de main */ float A,B,C; /* variveis locais de main */ do { printf("Entre com os valores A, B e C a serem ordenados\n"); scanf("%f %f %f, &A, &B, &C); /* Armazena menor em A se necessrio*/ if (A > C && B > C) troca(&A,&C); else if(A > B && B < C) troca(&A,&B); /* Armazena intermedirio B se necessrio */ if (B >C) troca(&B,&C); printf(Os valores ordenados so %.2f %.2f %.2f \n,A,B,C); printf(Digite (n) ou (N) para parar e qq. Letra para continuar\n); scanf(\n%c,&continua); }while(coninua!='n' && continua!= N ); return (0); } troca(float *X, float *Y) { float auxiliar; auxiliar = *X; *X = *Y; *Y = auxiliar; }
Computao I
65
#include <stdio.h> //EXEMPLO DE FUNCOES: VARIAVEL GLOBAL float area = -1.0; area_quadrado(); area_triang_ret(); int main() { int opcao = -1; printf("Clculo de reas. \n"); printf("0 - rea de um quadrado. \n"); printf("1 - rea de um tringulo ret. \n"); printf("Informe sua opo: \n"); scanf("%d", &opcao); switch(opcao) { case 0: area_quadrado(); break; case 1: area_triang_ret(); break;
default: printf("Opcao invlida! \n"); } printf("O calculo da rea : %f \n", area); return 0; area_quadrado() { float lado = 0.0; printf("Informe o valor do lado \n"); scanf("%f", &lado); area = lado * lado; area_triang_ret() { float lado1 = 0.0; float lado2 = 0.0; printf("Informe o valor do primeiro lado \n"); scanf("%f", &lado1); printf("Informe o valor do segundo lado \n"); scanf("%f", &lado2); area = (lado1 * lado2)/2;
Computao I
66
#include <stdio.h> //EXEMPLO DE FUNCOES: RETORNO E VARIAVEIS LOCAIS float area_quadrado(); float area_triang_ret(); int main() { int opcao = -1; float area = -1.0; printf("Clculo de reas. \n"); printf("0 - rea de um quadrado. \n"); printf("1 - rea de um tringulo ret. \n"); printf("Informe sua opo: \n"); scanf("%d", &opcao); switch(opcao) { case 0: area = area_quadrado(); break; case 1: area = area_triang_ret(); break;
default: printf("Opcao invlida! \n"); } printf("O clculo da rea : %f \n", area); return 0; } float area_quadrado() { float lado = 0.0; float result = 0.0; printf("Informe o valor do lado \n"); scanf("%f", &lado); result = (lado * lado); return result; } float area_triang_ret() { float lado1 = 0.0; float lado2 = 0.0; float result = 0.0; printf("Informe o valor do primeiro lado \n"); scanf("%f", &lado1); printf("Informe o valor do segundo lado \n"); scanf("%f", &lado2); result = (lado1 * lado2)/2; return result; }
Computao I
67
#include <stdio.h> //EXEMPLO DE FUNES: PASSAGEM POR VALOR float area_quadrado(float); float area_triang_ret(float, float); int main() { int opcao = -1; float area = -1.0; printf("Clculo de reas. \n"); printf("0 - rea de um quadrado. \n"); printf("1 - rea de um tringulo ret. \n"); printf("Informe sua opo: \n"); scanf("%d", &opcao); switch(opcao) { case 0: {float lado = 0.0; printf("Informe o valor do lado \n"); scanf("%f", &lado); area = area_quadrado(lado);} break; {float lado1 = 0.0; float lado2 = 0.0; printf("Informe o valor do primeiro lado \n"); scanf("%f", &lado1); printf("Informe o valor do segundo lado \n"); scanf("%f", &lado2); area = area_triang_ret(lado1, lado2);} break;
case 1:
default: printf("Opcao invlida! \n"); } printf("O clculo da rea : %f \n", area); return 0;
float area_quadrado(float lado) { float result = 0.0; result = (lado * lado); return result; } float area_triang_ret(float lado1, float lado2) { float result = 0.0; result = (lado1 * lado2)/2; return result;
Computao I
68
} #include <stdio.h> //EXEMPLO DE FUNCOES: PASSAGEM POR REFERENCIA area_quadrado(float, float *); area_triang_ret(float, float, float *); int main() { int opcao = -1; float area = -1.0; printf("Clculo de reas. \n"); printf("0 - rea de um quadrado. \n"); printf("1 - rea de um tringulo ret. \n"); printf("Informe sua opo: \n"); scanf("%d", &opcao); switch(opcao) { case 0: {float lado = 0.0; printf("Informe o valor do lado \n"); scanf("%f", &lado); area_quadrado(lado, &area);} break; case 1: {float lado1 = 0.0; float lado2 = 0.0; printf("Informe o valor do primeiro lado \n"); scanf("%f", &lado1); printf("Informe o valor do segundo lado \n"); scanf("%f", &lado2); area_triang_ret(lado1, lado2, &area);} break;
default: printf("Opcao invlida! \n"); } if ((0 == opcao)||(1 == opcao)) { printf("O clculo da rea : %f \n", area); } return 0; } { } { } area_quadrado(float lado, float *area) *area = (lado * lado); area_triang_ret(float lado1, float lado2, float *area) *area = (lado1 * lado2)/2;
Computao I
69
m1 { I } m2 { A Vet[0] Vet[4] }
Computao I
70
Quando um elemento do Vetor passado como parmetro, a passagem segue as regras de variveis simples.
a) Transferncia de Elementos por Valor: int N; float P[10]={2,4,6,8,10,12,14,16,18,20}; for (N=0;N<10;N++) printf(%.2f , P[N]); Neste caso o valor de cada elemento P[N] do vetor P passado para printf #include<stdio.h> /* Programa exemplo de passagem por valor*/ int testa_par_acima10_elem(int); /*prottipo da funo*/ int main( ) { int I,resp,cont_par=0, cont_acima10=0,Vet[50]; for (I=0;I<50;I++) { scanf(%d,&Vet[I]); resp = testa_par_acima10_elem(Vet[I]); /*passagem por valor */ switch(resp) { case 1: cont_acima10++; break; case 2: cont_par++; break; case 3: cont_acima10++; cont_par++; break; } } for (I=0;I<50;I++) printf(Vet[%d]=%d \n,I,Vet[I]); printf(Deste vetor %d elemento(s) so par e %d esto acima de 10 \n,cont_par,cont_acima10); return (0); } int testa_par_acima10_elem(int a) /* o valor do elemento recebido */ { if (a%2==0) { if(a>10) return(3); /*se par e acima de 10 retorna flag 3*/ else return(2); /* se par retorna flag 2*/ } else if(a>10) return(1); /* se maior do que 10 retorna flag 1*/ else return(0); /* caso contrario retorna flat 0*/ } b) Transferncia de Elementos por Referncia:
Computao I
71
int N; float P[10]; for (N=0;N<10;N++) scanf(%f, &P[N]); Neste caso o endereo de cada elemento P[N] do vetor P passado para scanf #include<stdio.h> /*Programa Exemplo de Passagem por referencia*/ int soma_2_par_acima10_elem(int *); /*prottipo da funo*/ int main( ) { int I,resp,cont_par=0, cont_acima10=0,Vet[50]; for (I=0;I<50;I++) { scanf(%d,&Vet[I]); resp = soma_2_par_acima10_elem(&Vet[I]); /*passagem por referncia */ switch(resp) { case 1: cont_acima10++; break; case 2: cont_par++; break; case 3: cont_acima10++; cont_par++; break; } } for (I=0;I<50;I++) printf(Vet[%d]=%d \n,I,Vet[I]); printf(Deste vetor %d elemento(s) so par e %d esto acima de 10 \n,cont_par,cont_acima10); return (0); } int soma_2_par_acima10_elem(int *a) /* o endereo do elemento recebido */ { if (*a%2==0) { *a=*a+2; /*se par soma 2*/ if(*a>10) return(3); /*se par e acima de 10 retorna flag 3*/ else return(2); /* se par retorna flag 2*/ } else if(*a>10) return(1); /* se maior do que 10 retorna flag 1*/ else return(0); /* caso contrario retorna flat 0*/ }
Computao I
72
int main( ) { int I,resp,cont_par=0, cont_acima10=0,Vet[50]; le_soma_2_par_acima10_vet(Vet,&cont_par,&cont_acima10); for (I=0;I<50;I++) printf(Vet[%d]=%d \n,I,Vet[I]); printf(Deste vetor %d elemento(s) so par e %d esto acima de 10 \n,cont_par,cont_acima10); return (0); } l_soma_2_par_acima10_vet(int Vet[],int *cont_par, int *cont_acima10) { int I; for (I=0;I<50;I++) { scanf(%d,&Vet[I]); if (Vet[I]%2==0) { Vet[I] =Vet[I]+2; *cont_par= *cont_par+1; } if(Vet[I]>10) *cont_acima10= *cont_acima10+1; } }
Computao I
73
int main( ) { int L,I,Mat[2][5]; for(L=0;L<2;L++) for (I=0;I<5;I++) { scanf(%d,&Mat[L][I]); M[L][I] = 0; } m1( ); m2( ); for(L=0;L<2;L++) for (I=0;I<5;I++) printf(Mat[%d][%d]=%d M[%d][%d]= %d \n, L, I, Mat[L][I], L, I, M[L][I]); return (0); } m1( ) { int L,I; for(L=0;L<2;L++) for (I=0;I<5;I++) M[L][I] = 2*(L+I); } m2( ) { int a,A,Mat[2][5]={{0,0,0,0,0},{1,2,3,4,5}}; for(a=0;a<2;a++) for (A=0;A<5;A++) printf(%d ,Mat[a][A]); }
m1 { I }
m2 { a A Mat[0][0]..Mat[1][4] }
Computao I
74
Computao I
75
b) Transferncia de Elementos por Referncia: int N,M; float P[3][4]; for (N=0;N<3;N++) for(M=0;M<4;M++) scanf(%f, &P[N][M]); O endereo de cada elemento P[N][M] da matriz P passado para scanf #include<stdio.h> int soma_2_par_acima10_elem(int *);
/*prottipo da funo*/
int main( ) { int L,I,resp,cont_par=0, cont_acima10=0,Mat[10][50]; for (L=0;L<10;L++) for (I=0;I<50;I++) { scanf(%d,&Mat[L][I]); resp = soma_2_par_acima10_elem(&Mat[L][I]); /*passagem por refer */ switch(resp) { case 1: cont_acima10++; break; case 2: cont_par++; break; case 3: cont_acima10++; cont_par++; break; } } for (L=0;L<10;L++) for (I=0;I<50;I++) printf(Mat[%d][%d]=%d \n,L,I,Mat[L][I]); printf(%d elemento(s) so par e %d so > 10 \n,cont_par,cont_acima10); return (0); } int soma_2_par_acima10_elem(int *a) /* o endereo do elemento recebido */ { if (*a%2==0) { *a=*a+2; /*se par soma 2*/ if(*a>10) return(3); /*se par e acima de 10 retorna flag 3*/ else return(2); /* se par retorna flag 2*/ } else if(*a>10) return(1); /* se maior do que 10 retorna flag 1*/ else return(0); /* caso contrario retorna flat 0*/ }
Computao I
76
int main( ) { int L,I,resp,cont_par=0, cont_acima10=0,Mat[10][50]; for(L=0;L<10;L++) le_soma_2_par_acima10_vet(Mat[L],&cont_par,&cont_acima10); for(L=0;L<10;L++) for (I=0;I<50;I++) printf(Mat[%d][%d]=%d \n,L,I,Mat[L][I]); printf(%d elemento(s) so par e %d so > 10 \n,cont_par,cont_acima10); return (0); } le_soma_2_par_acima10_vet(int Vet[ ],int *cont_par, int *cont_acima10) { int I; for (I=0;I<50;I++) { scanf(%d,&Vet[I]); if (Vet[I]%2==0) { Vet[I] =Vet[I]+2; *cont_par= *cont_par+1; } if(Vet[I]>10) *cont_acima10= *cont_acima10+1; }}
Computao I
77
int main( ) { int L,I,resp,cont_par=0, cont_acima10=0,Mat[10][50]; le_soma_2_par_acima10_mat(Mat,&cont_par,&cont_acima10); for(L=0;L<10;L++) for (I=0;I<50;I++) printf(Mat[%d][%d]=%d \n,L,I,Mat[L][I]); printf(%d elemento(s) so par e %d so > 10 \n,cont_par,cont_acima10); return (0); } le_soma_2_par_acima10_mat(int Mat[][50],int *cont_par, int *cont_acima10) { int L,I; for(L=0;L<10;L++) for (I=0;I<50;I++) { scanf(%d,&Mat[L][I]); if (Mat[L][I]%2==0) /* se par soma 2 e retorna flag 2*/ { Mat[L][I] =Mat[L][I]+2; *cont_par= *cont_par+1; } if(Mat[L][I]>10) *cont_acima10= *cont_acima10+1; } }
Computao I
78
#include <stdio.h> //EXEMPLO DE FUNCOES E MATRIZES: VARIAVEIS GLOBAIS #include <math.h> int opcao = -1; float area = -1.0, coord[4][2]={{0,0},{0,0},{0,0},{0,0}}; le_coordenadas(); area_quadrado(); area_triang_ret(); int main() { printf("Clculo de reas. \n"); printf("0 - rea de um quadrado. \n"); printf("1 - rea de um tringulo ret. \n"); printf("Informe sua opo: \n"); scanf("%d", &opcao); le_coordenadas(); switch(opcao) { case 0: area_quadrado(); break; case 1: area_triang_ret(); break; default: printf("Opcao invlida! \n"); } printf("O calculo da rea : %f \n", area); return 0; } le_coordenadas() { int totpontos, i; if (opcao == 0) totpontos=4; else if(opcao ==1) totpontos = 3; for(i=0;i<totpontos;i++) { printf("informe o %o par de coordenadas", i+1); scanf(%f,%f,&coord[i][0], &coord[i][1]); } } area_quadrado() { float L1, L2; L1 = sqrt(pow(coord[1][0]-coord[0][0],2)+ pow(coord[1][1]-coord[0][1],2)); L2 = sqrt(pow(coord[2][0]-coord[3][0],2)+ pow(coord[2][1]-coord[3][1],2)); area = L1 * L2; } area_triang_ret() { float L1, L2; L1 = sqrt(pow(coord[1][0]-coord[0][0],2)+ pow(coord[1][1]-coord[0][1],2)); L2 = sqrt(pow(coord[1][0]-coord[2][0],2)+ pow(coord[1][1]-coord[2][1],2)); area = (L1 * L2)/2; }
Computao I
79
#include <stdio.h> //EXEMPLO DE FUNCOES E MATRIZES: VARIAVEIS LOCAIS #include <math.h> le_coordenadas(float [4][2], int); float calcula_area(float [4][2], int); float calcula_distancia(float [4][2],int, int); int main() { int opcao = -1; float area = -1.0, coord[4][2]={{0,0},{0,0},{0,0},{0,0}}; printf("Clculo de reas. \n"); printf("0 - rea de um quadrado. \n"); printf("1 - rea de um tringulo ret. \n"); printf("Informe sua opo: \n"); scanf("%d", &opcao); le_coordenadas(coord, opcao); area = calcula_area(coord, opcao); printf("O calculo da rea : %f \n", area); return 0;
le_coordenadas(float coord[4][2], int opcao) { int totpontos, i; if (opcao == 0) totpontos=4; else if(opcao ==1) totpontos = 3; for(i=0;i<totpontos;i++) { printf("informe o %o par de coordenadas", i+1); scanf(%f,%f,&coord[i][0], &coord[i][1]); } } float calcula_area(float coord[4][2], int opcao) { float result; if (opcao==0) result = calcula_distancia(coord,1,0) * calcula_distancia(coord,2,3); else if (opcao==1) result = (calcula_distancia(coord,1,0)* calcula_distancia(coord,1,2))/2; } return result;
float calcula_distancia(float coord[4][2], int p1, int p2) { float d; d = sqrt(pow(coord[p1][0]-coord[p2][0],2)+ pow(coord[p1][1]-coord[p2][1],2)); return d; }
Computao I