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

Programao de Computadores I1o Semestre 2008Prof.

Anibal e CassildaLAB8
O todo igual soma das partes. Euclides.

FUNES E PROCEDIMENTOS Embora sem saber, ao longo dos outros


laboratrios, j foram utilizadas funes tais como printf, scanf, getchar, putchar, dentre outras que fazem parte da biblioteca standard de C (ou seja, so obtidas ao se adquirir qualquer compilador de C tal como Dev-C++). Este laboratrio descrever como escrever funes e procedimentos, como passar parmetros e como devolver algum valor como resultado de uma funo. Os conceitos aqui detalhados so importantes para a construo de programas modulares atravs de procedimentos e funes, facilitando a manuteno e correo de programas. Alm disso, uma funo pode eliminar repetio de cdigo como no PT1. PT1: Escreva um programa que coloque na tela a seguinte sada, escrevendo uma linha com 20 asteriscos atravs de um lao for:: ******************** Nmeros entre 1 e 5 ******************** 1 2 3 4 5 ******************** #include <stdio.h> main() {

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

Programao de Computadores I1o Semestre 2008Prof. Anibal e CassildaLAB8

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.

RETORNO DE VALOR possvel que uma funo seja responsvel


por realizar uma determinada tarefa e ao final da mesma retornar UM NICO resultado armazenado em uma varivel. A devoluo de um resultado segue a sintaxe: return varivel; Para construir uma funo soma() que calcula a soma de dois nmeros inteiros necessrio saber como seria a sintaxe desejada para chamar a mesma: n = soma(3,4); printf(soma = %d \n,n); Ou seja, repare que a funo soma() deve receber como argumentos dois inteiros e devolver um resultado tambm do tipo inteiro que a soma dos argumentos:
2

Programao de Computadores I1o Semestre 2008Prof. Anibal e CassildaLAB8

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.

ESCOPO DE VARIVEIS Como observado nos programas anteriores,


variveis podem ser declaradas dentro do corpo de uma funo. Essas variveis visveis (isto conhecidas) apenas dentro da prpria funo so conhecidas como variveis locais. Se uma mesma varivel for declarada em duas funes distintas no haver qualquer tipo de problema, pois o compilador sabe qual utilizar em cada uma delas, pois apesar de terem o mesmo nome, so variveis distintas sem qualquer relao. Ou seja, o escopo, ou a rea de atuao de uma varivel, depende de em que funo ela foi declarada. Alm disso, depois de terminada a execuo de uma determinada funo, todas as suas variveis locais so destrudas. Existem tambm as variveis globais que so declaradas fora de qualquer funo e cujo escopo o programa inteiro, ou seja, todas as funes que so descritas no programa. A declarao de uma varivel global descrita no PT6. PT6: Refazer o PT5 usando variveis globais. #include <stdio.h> // Declarao de variveis int a, b, total; // Soma de dois inteiros. void soma(void) { total = a + b;

PROTTIPOS DE FUNES Em C, as funes podem ser colocadas


dentro de qualquer local do arquivo, antes ou depois de serem invocadas, antes ou depois da funo main(). Porm, uma restrio deve ser levada em considerao: PT7: Verifique o erro de compilao Conflicting types obtido no PT4 ao se colocar a declarao da funo linha() depois da funo main(). O erro que ocorre no PT7 ocasionado pelo fato de que o processo de compilao um processo seqencial que percorre todo o arquivo em que o cdigo se encontra. Durante este processo, o compilador busca o cabealho da funo linha() (ou seja, quais so os argumentos e o tipo de retorno desta funo). No caso do PT7, a funo linha invocada em main() antes de ter tido o seu cabealho declarado. Assim, o compilador cria um cabealho para a funo linha() semelhante a int linha(). Quando encontra a definio da funo linha() (cujo3

Programao de Computadores I1o Semestre 2008Prof. Anibal e CassildaLAB8

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);

CRIAO DE BIBLIOTECAS Na construo de projetos mais complexos,

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

Programao de Computadores I1o Semestre 2008Prof. Anibal e CassildaLAB8

#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

DEFINIO DE MACROS No PT5 foi definido que a funo soma


devia ter como parmetros dois nmeros inteiros. Mas, e se a funo soma fosse

Programao de Computadores I1o Semestre 2008Prof. Anibal e CassildaLAB8

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)); }

quantas vezes for necessrio. Um exemplo de aplicao da recurso dado no PT12:

RECURSO Uma funo pode chamar a si mesma

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

PE6: Refazer o PT10 usando macros.

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