Академический Документы
Профессиональный Документы
Культура Документы
Anibal e CassildaLAB8
O todo igual soma das partes. Euclides.
int i; // Cabealho for (i = 1; i <=20; i++) putchar(*); putchar(\n); puts(Numeros entre 1 e 5); for (i = 1; i <=20; i++) putchar(*); putchar(\n); // Escrita dos nmeros for (i = 1; i <=5; i++) printf(%d\n,i); for (i = 1; i <=20; i++) putchar(*); putchar(\n); } Como pode ser observado no PT1, o conjunto de cdigo que escreve a linha de asteriscos na tela repetido trs vezes. Para evitar isto, basta criar uma funo que imprime 20 asteriscos cada vez que invocada. Para tanto necessrio conhecer a sintaxe de uma funo que dada por: tipo identificador(argumentos) { declarao de variveis; corpo da funo; } onde: tipo: tipo de valor retornado pela funo. identificador: nome da funo.
argumentos: lista de variveis (tipo e identificador) utilizadas pela funo, separados por vrgulas. declarao de variveis: variveis internas da funo. corpo da funo: seqncia de comandos a serem executados pela funo. A primeira linha de uma funo, tipo identificador(argumentos), tambm chamada de cabealho de uma funo e serve para indicar quais e quantos so os argumentos de uma funo, bem como o tipo de retorno. PT2: Reescreva o programa PT1, usando uma funo de nome linha. #include <stdio.h> void linha(void) { int i; for (i=1; i <= 20; i++) putchar('*'); putchar('\n'); } main() { int i; linha(); /* Escreve uma linha */ puts("Numeros entre 1 e 5"); linha(); // mais uma linha for (i=1; i <=5; i++) printf("%d\n",i); linha(); //ltima linha. }
1
Observe que a palavra void significa vazio e foi utilizada para indicar que nenhum argumento enviado ou retornado pela funo. Isto equivale a utilizar uma funo sem nenhum parmetro, porm se isto fosse feito, ento, no ambiente do Dev-C++ o usurio teria que ter selecionado um compilador C para o projeto. Com a palavra void o programa ir rodar usando tanto um compilador C como um compilador C++. Uma funo cujo tipo retornado void usualmente chamada de procedimento. Os argumentos tambm podem ser chamados de parmetros e eles nada mais so do que variveis locais funo a que pertencem. Um parmetro automaticamente iniciado com o valor enviado pelo programa invocador. No caso do PT2 nenhum parmetro passado ou retornado, pois o tipo void est presente. Uma modificao interessante na funo linha() do PT2 fazer com o nmero de asteriscos seja especificado como argumento, como dado no PT3. PT3: Modifique a funo linha() do PT2 tal que o nmero de asteriscos seja um argumento da mesma. Depois, escreva na tela o seguinte desenho: *** ***** *** #include <stdio.h> void linha(int num) { int i; for (i=1; i <= num; i++) putchar('*');
putchar('\n'); } main() { linha(3); linha(5); linha(3); } Observe que no PT3 a chamada da funo linha() dentro da funo main() (linha(3); por exemplo) recebe apenas um parmetro (no caso o valor 3, 5 e 3) cujo tipo (int) coincide com o tipo do argumento da funo linha(). PT4: Alterar o PT3 de forma que a funo linha() tenha como argumentos o nmero de vezes que um caractere ser impresso e qual o caractere a ser impresso. 1: #include <stdio.h> 2: 3: void linha(int num, char ch) 4: { 5: int i; 6: for (i=1; i <= num; i++) 7: putchar(ch); 8: putchar('\n'); 9: } 10: 11: main() 12: { 13: linha(3,+); 14: linha(5,*); 15: linha(3,-); 16: }
Observe que nos PT2, PT3 e PT4 a linha onde declarada a funo (linha 3) NO termina com ponto-e-vrgula (;). Alm disso, o nmero e o tipo dos parmetros enviados para uma funo (linhas 13, 14 e 15)deve ser igual ao que especificado no cabealho de uma funo (linha 3). No PT4 o cabealho da funo linha (void linha(int num, char ch), linha 3) definiu dois parmetros: um do tipo int e outro tipo char e a chamada da funo em main() cumpriu esta especificao (linha(3,+), linha 13). PE1: Modifique o PT4 para que seja pedido para o usurio, em main(), o nmero de caracteres num e o caractere impresso ch.
int soma(int x, int y) { int res; res = x + y; return res; } Repare que a soma de x e y colocada na varivel tipo int res e este valor que ser depois o resultado retornado da funo soma (atravs do comando return res;). PT5: Construir um programa que utiliza a funo soma() anteriormente discutida. # include <stdio.h> // Devolve a soma de dois inteiros int soma(int c, int d) { return c+d; } main() { int a, b, total; a = 1; b = 2; total = soma(a,b); printf(soma = %d,total); } PE2: Construa uma funo dobro que retorna duas vezes o valor do argumento que uma varivel inteira. PE3: Generalize o PE2 e construa uma funo int multip(int a, int b); que retorna o resultado de a*b (tambm inteiro).
PE4: Construa uma funo Max que retorna o maior valor entre dois nmeros inteiros.
} main() { a = 1; b = 2; soma(); printf(soma = %d,total); } Sempre que possvel evite o uso de variveis globais, pois isto torna difcil de encontrar erros e alterar funcionalidades do programa.
cabealho void linha()), o compilador pensa que so duas funes distintas (pois devolvem tipos diferentes) mas com o mesmo nome. Como em C no podem existir duas funes com o mesmo nome, o compilador apresenta erro e termina o processo de compilao. Observe que se linha devolvesse um inteiro no haveria qualquer problema (como o caso da funo int soma() no PT5). Para resolver este problema necessrio especificar ao compilador os cabealhos das funes, que sero utilizadas no programa, aps os #includes. PT8: Consertar o PT7. #include <stdio.h> void linha(int num, char ch); main() { int i; linha(3,'+'); linha(5,'*'); linha(3,'-'); } void linha(int num, char ch) { int i; for (i=1; i <= num; i++) putchar(ch); putchar('\n'); } Quando o cabealho seguido de ponto-evrgula (;) identifica toda a estrutura da
funo (nome, parmetros e tipo de retorno) e chamado de prottipo de uma funo. O prottipo de uma determinada funo deve ser colocado apenas antes da sua invocao. No entanto, uma boa prtica de programao colocar os cabealhos de todas as funes antes do cdigo da primeira funo, como por exemplo: // Incluso das bibliotecas. #include <......> // Prottipos das funes. void f1(int n, char ch); int max(int n1, int n2); main() { } void f1(int n, char ch) { } int max(int n1, int n2) { } O objetivo do prottipo de uma funo indicar ao compilador quais os seus parmetros, Assim, as seguintes linhas so equivalentes para o compilador: int max(int n1, int n2); int max(int, int);
o nmero de funes pode crescer e pode ser necessrio separar em arquivos distintos novas funes. Alm disso, pode ser interessante que funes semelhantes estejam presentes nos mesmos arquivos. Observe como exemplo a biblioteca math.h que contm funes matemticas como seno (y=sin(x)), exponenciao (t=pow(x,y)), dentre outras. Na verdade, nestes casos, so criados dois arquivos distintos. Um deles, cuja extenso .h, armazena os prottipos das funes. Noutro, cuja extenso .c, fica armazenada a implementao das funes cujos prottipos foram definidos no arquivo .h. Para utilizar as novas funes basta adicionar o arquivo .h ao programa principal atravs da diretiva de compilao: #include <nome_da_biblioteca.h>.
PT9: Criar uma biblioteca de nome linhaout composta por duas funes: void linha(int num, char ch): Imprime num vezes na tela o caractere ch em uma mesma linha. Aps a impresso, deve pular uma linha. void barra(int num): Imprime num vezes o caractere * na tela. Aps a impresso, deve pular uma linha. Tarefa 1: Crie um novo projeto e selecione a opo Console Application. O programa ir utilizar a biblioteca a ser criada empregando comandos contidos no corpo da funo main() tal como dado no seguinte cdigo do arquivo de nome main.cpp: #include <stdio.h> 4
#include "linhaout.h" main() { int i; linha(3,'+'); linha(5,'-'); barra(3); barra(5); system("pause"); } Tarefa 2: Criar o arquivo linhaout.c. Passo 1: Criar um novo arquivo fonte, clicando em Arquivo/Novo/Arquivo Fonte, e confirmar a adio da nova unidade ao projeto atual. Passo 2: Digitar o seguinte cdigo: #include <stdio.h> #include linhaout.h // Impresso de caracteres em uma linha. void linha(int num, char ch) {int i; for (i=1; i <= num; i++) putchar(ch); putchar('\n'); } // Impressao de * num vezes. void barra(int num) {int i; for (i=1; i <= num; i++) putchar('*'); putchar('\n'); } Passo 3: Clicar em Arquivo/Salvar. No campo Nome do Arquivo digite linhaout.c e no campo Salvar tipo como
selecione C source files (*.c). Depois aperte o boto Salvar. Tarefa 3: Criar um arquivo .h. Passo 1: Criar um novo arquivo fonte, clicando em Arquivo/Novo/Arquivo Fonte e confirmar a adio da nova unidade ao projeto atual. Passo 2: Digitar o seguinte cdigo: #ifndef LINHAOUT_H #define LINHAOUT_H void linha(int num, char ch); void barra(int num); #endif Passo 3: Clicar em Arquivo/Salvar. No campo Nome do Arquivo digite linhaout.h e no campo Salvar tipo como selecione Header files (*.h, *.hpp, *.rh, *.hh). Depois aperte o boto Salvar. Observe que a nova biblioteca adicionada atravs do comando #include "linhaout.h". Observe que este comando usa ao invs de <>, pois o mesmo indica que a nova biblioteca (linhaout.h) s precisa ser procurada no diretrio do projeto, no sendo necessrio procurar em outros diretrios tais como c:\DevCpp\include ou c:\Dev-Cpp\include como ocorre caso <> seja usada.
invocada de acordo com o seguinte programa: PT10: Testar o PT5 para nmeros tipo flutuante. #include <stdio.h> #include <stdlib.h> int soma(int a, int b) { return a + b; } main() { int a,b,c; double d,e,f; a = 1; b = 3; d = 1.1; e = 3.2; c = soma(a,b); f = soma(d,e); printf("soma(int) = %d \n", c); printf("soma2(float) = %f \n", f); system("PAUSE"); } Qual ser o resultado de c e f? O valor da varivel c est correto e da varivel f? Uma possvel soluo para que o programa imprima os valores corretos das variveis c e f modificar os parmetros da funo soma() para o tipo float. Observe que neste caso ocorrer o fenmeno de cast implcito quando o comando c = soma(a,b) for executado.
5
PE5: Criar uma funo somaf() no PT10 para aceitar parmetros float e assim imprimir corretamente os valores de c e f. Uma alternativa utilizao de macros. Macros so definies que aceitam parmetros. Sua sintaxe dada por:: #define NOME_MACRO (EXPRESSO) Para exemplificar a seguinte macro fornece o maior entre dois valores: #define MAX(x,y) (((x)>(y)) ? (x) : (y)) As macros devem ser colocadas logo aps os comandos #include e antes dos prottipos das funes. PT11: Construa um programa que mostre o valor mximo entre dois valores a partir de uma macro. #define MAX(x,y) (((x) > (y)) ? (x) : (y) ) main() { int a,b; float c,d; a = 1; b= 3; c = 5.5; d = 4.4; printf(Max = %d \n,MAX(a,b)); printf(Max = %d \n,MAX(c,d)); }
num o nmero a ser verificado e o retorno igual a 1 (verdadeiro) se num for mpar e 0 (falso) se num for par. PB3: Escreva uma funo: int x_isdigit(char ch) que verifica se um determinado caractere um digito ou no. Escreva, tambm, um programa que teste esta funo. PB4: Escreva e teste uma funo que devolve o valor absoluto de x: int Abs(int x). PB5: Escreva e teste uma funo que calcula o valor presente lquido (VPL) para n anos, taxa t e definido atravs da seguinte frmula:
PT12: Crie uma funo que chama a si mesma e calcula o valor do fatorial de um nmero. Use o fato que: n!= n * (n 1)! e que 0! = 1. #include <stdio.h> int fatorial(int n) { int valor; if (n == 1) return 1; else valor = n * fatorial(n-1); return valor; } main() { int n; printf(Entre com n:); scanf(%d,&n); printf(Fatorial(%d)=%d\n,n,fatorial(n)); }
VPL =
1 1 1 + +L+ 2 (1 + t ) (1 + t ) (1 + t ) n
A sintaxe da funo : float VPL(float x, float n, float t). PB6: Escreva e teste uma funo que devolve o maior entre trs valores e cuja sintaxe dada por: float max(float x, float y, float z). PB7: Escreva e teste uma funo recursiva que devolve a soma acumulada de inteiros de 1 at n. Exemplo: somaI(3)=6=1+2+3. PB8: Escreva e teste uma funo recursiva que devolve o produto de inteiros de 1 at n. Exemplo: prodI(3)=6=1*2*3.
6
PROGRAMAS BSICOS
PB1: Criar um programa que tenha uma funo principal e uma funo que calcula o fatorial de um nmero n (sem recurso). PB2: Criar um programa que imprime os n primeiros impares e que para isso verifica se um nmero impar ou no atravs de uma funo: int verificarImpar(num), onde