Está en la página 1de 15

Funes Pontuando algumas consideraes sobre o tema funes utilizando linguagem C: Funes podem ser definidas como um conjunto

ou bloco de instrues. Funes podem tambm ser chamadas de sub-rotinas. So partes do programa que realizam tarefas especficas. As bibliotecas do C contm conjuntos de funes que so largamente utilizadas na programao. As funes so verificadas e corrigidas sem precisar alterar o corpo do programa. O programa em C formado por vrias funes. A funo main obrigatria. Dentro das funes em C existem as variveis locais exclusivas para aquela funo. Existem tambm as variveis globais, definidas logo aps os includes que so utilizadas por vrias funes. Quando a funo retorna valor se utiliza o modo INT junto com um return no final. Quando a funo no retorna valor ela deve ser escrita no modo VOID. A funo s poder ser acessada atravs do recurso chamada de funo que normalmente est na funo main. Seguem vrios exemplos para tentar melhorar o entendimento. As explicaes aparecem na coluna direita No esto em forma de comentrio. Nem sempre o programa apresenta uma soluo elegante. Procura apenas ilustrar diferentes formas de fazer uma mesma coisa. Os programas foram enviados junto com as apostilas. Exemplo a) O programa abaixo calcula o cubo de um nmero inteiro qualquer. exemplo1.cpp #include <stdio.h> #include <conio.h> #include <dos.h> int cubo(int x) { return (x * x * x); } void dado() { printf ("\n\nDigite um numero inteiro\n"); } void saida() { printf ("Tecle algo para sair do programa\n"); getch(); } main () { clrscr(); int numero, resultado; dado(); scanf ("%d", &numero); resultado = cubo(numero); printf ("O cubo de %d vale %d.\n", numero, resultado); saida(); } Os includes devidos

Funo do tipo int . Necessariamente utiliza um return que pode estar ou no associado com o que a funo se presta a executar. Observe que na rotina principal utilizada a varivel numero que associada ao x. Funo do tipo void que neste caso apenas emite mensagem.

Funo do tipo void que neste caso apenas emite mensagem.

Apenas como exemplo a rotina main est na forma int. Observe que no final tem um return 0 um return qualquer obrigatrio. Observe a ordem em que as funes so chamadas e a declarao de variveis (neste caso locais)

DP-Estrutura de dados

Exemplo b) O programa abaixo calcula o cubo de um nmero inteiro qualquer. Exemplo2.cpp #include <stdio.h> #include <conio.h> #include <dos.h> int numero, resultado; Os includes devidos

As variveis numero e resultado declaradas de forma global podem ser utilizadas pelas diversas funes. Observe que a funo clculo pede o valor e executa o clculo. As variveis so globais e no precisam ser declaradas na funo.

void calculo() { scanf ("%d", &numero); resultado = numero*numero*numero; printf ("O cubo de %d vale %d.\n", numero, resultado); } void dado() { printf ("\n\nDigite um numero inteiro\n"); } void saida() { printf ("Tecle algo para sair do programa\n"); getch(); } main () { clrscr(); dado(); calculo(); saida(); }

Funo do tipo void que neste caso apenas emite mensagem.

Funo do tipo void que neste caso apenas emite mensagem.

A rotina main est na forma void. Observe a ordem em que as funes so chamadas.

DP-Estrutura de dados

Exemplo c) O programa abaixo calcula o cubo de um nmero inteiro qualquer. Exemplo3.cpp #include <stdio.h> #include <conio.h> #include <dos.h> int numero, resultado; Os includes devidos

As variveis numero e resultado declaradas de forma global podem ser utilizadas pelas diversas funes. Observe que a funo clculo uyiliza o mesmo nome da varivel da principal. As variveis so globais e no precisam ser declaradas na funo. Funo do tipo void que neste caso apenas emite mensagem.

int calculo(int numero) { resultado = numero*numero*numero; printf ("Cubo d %d = %d",numero, resultado); return resultado; } void dado() { printf ("\n\nDigite um numero inteiro\n"); } void saida() { printf ("Tecle algo para sair do programa\n"); getch(); } main () { clrscr(); dado(); scanf ("%d", &numero); calculo(numero); saida(); }

Funo do tipo void que neste caso apenas emite mensagem.

A rotina main est na forma void. Observe a ordem em que as funes so chamadas.

DP-Estrutura de dados

Exemplo d) O programa abaixo calcula as razes de uma equao de segundo grau. Exemplo4.cpp #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <dos.h> #include <math.h> int result,r1,r2; Os includes devidos

As variveis result,r1 e r2 declaradas de forma global podem ser utilizadas pelas diversas funes. Calculo do delta com base em 3 valores. Na funo pincipal esto associadas com a,b e c

int delta (int t1,int t2, int t3) { result=((t2*t2)-(4*t1*t3)); return result; } int raiz1 (int t1, int t2) { r1=(-t2+sqrt(result))/2*t1; return r1; } int raiz2 (int t1, int t2) { r2=(-t2-sqrt(result))/2*t1; return r2; } main () { int a,b,c; printf ("\nDigite A, B e C da equacao "); printf("\nA--> "); scanf("%d",&a); printf("\nB--> "); scanf("%d",&b); printf("\nC--> "); scanf("%d",&c); delta(a,b,c); printf ("\nDelta = a (%d) ",result); if (result < 0) printf "\nNao tem raizes "); else{ printf ("\nTem raizes "); raiz1(a,b); raiz2(a,b); printf ("\nRaiz 1 = a (%d) ",r1); printf ("\nRaiz 2 = a (%d) ",r2); } getch(); }

Calculo da primeira raiz. A varivel result foi calculada pela funo delta.

Calculo da segunda raiz. A varivel result foi calculada pela funo delta.

Observe as variveis locais, a, b e c e a ordem de chamada das funes.

DP-Estrutura de dados

Vetores Quando voc est programando, freqente a necessidade de trabalhar com vrios elementos de mesmo tipo. nomes (string), nmeros de matricula (nmero inteiro), idade (nmero inteiro), peso (nmero real), etc. Em muitos casos necessrio o tratamento destes dados em forma conjunta. Para isso se utiliza uma estrutura de dados chamado vetor, ou array. Faa ento uma associao do vetor com uma lista onde cada elemento referenciado por um ndice.

Quais as operaes mais comuns em uma lista? Adio Remoo Edio Listagem Pesquisa Ordenao, etc. Em uma abordagem inicial os vetores apenas recebero nmeros inteiros como elementos. A ordenao de listas tem vrias tcnicas e pela complexidade envolvida ser abordada em outros captulos. Seguem vrios exemplos para tentar melhorar o entendimento. As explicaes aparecem na coluna direita No esto em forma de comentrio. Nem sempre o programa apresenta uma soluo elegante. Procura apenas ilustrar diferentes formas de fazer uma mesma coisa. Os programas foram enviados junto com as apostilas. Exemplo a) O programa abaixo insere, lista e pesquisa elementos em um vetor. Exemplo5.cpp #include <stdio.h> #include <conio.h> main() { int vet[5]; int i, j, aux=0; clrscr(); for(i=0; i<5; i++) { printf("Entre com o %do elemento\n", i+1); scanf("%d", &vet[i]); } for(i=0; i<5; i++) { printf("Exibindo %do elemento", i+1); printf("-->%d\n", vet[i]); } Os includes devidos Funo principal. Observe a declarao obrigatria do vetor e seu limite de elementos. O vetor se chama vet e permite no mximo 5 elementos.

Carregamento do vetor. O primeiro ndice o zero e o ltimo o 4. A sintaxe vet[i]

Exibio do contedo do vetor listagem

DP-Estrutura de dados

printf("\n\nEntre com o numero a ser buscado-->"); scanf("%d", &j); for(i=0; i<5; i++) { if (j==vet[i]) {printf("Elemento esta no vetor");aux=1;} } if (aux==0) printf("Elemento nao esta no vetor"); getch(); }

Busca ou pesquisa de um elemento dentro do vetor. Foi utilizada uma varivel auxiliar de nome aux para atestar se o elemento foi ou no encontrado e emitir a mensagem devida.

Exemplo b) Atravs de funes,o programa abaixo insere, lista e pesquisa elementos em um vetor. Exemplo6.cpp

#include <stdio.h> #include <conio.h> int vet[5]; int i=-1, j,k,l,aux=0;

Os includes devidos

As variveis declaradas de forma global podem ser utilizadas pelas diversas funes. A funo insere um nico elemento no vetor. Diferente do programa anterior que carregava o vetor inteiro.

void (insere) { i=i+1; printf("Entre com o %do elemento\n", i+1); scanf("%d", &vet[i]); } void (lista) (void) { for(k=0; k<5; k++) { printf("Exibindo %do elemento", k+1); printf("-->%d\n", vet[k]); } } void (busca) (void) { printf("\n\nEntre com o numero a ser buscado-->"); scanf("%d", &j); for(l=0; l<=i; l++) { if (j==vet[l]) { printf("Elemento esta no vetor");aux=1; l=5 } } if (aux==0) printf("Elemento nao esta no vetor"); aux=0; } main() { int opcao=0;

Listagem de todo o vetor. Com o controle da varivel k. Outra possibilidade listar somente os elementos j inseridos no vetor. Neste caso k no seria menor que 5 e sim k <= i

Pesquisa de um elemento no vetor. Observe que a pesquisa se d at o valor de i.

A rotina main est na forma void.

DP-Estrutura de dados

while (opcao < 4) { printf("\n"); printf("\n"); printf("\n Oque voc quer fazer?:\n"); printf("\n1 - Inserir elementos no vetor"); printf("\n2 - Exibir os elementos"); printf("\n3 - Buscar um elemento"); printf("\nOutra entrada - Sair do programa"); printf("\n-->: "); scanf("%d",&opcao); if (opcao==1) insere(); if (opcao==2) lista(); if (opcao==3) busca(); } }

O usurio deve escolher a opo. Observe a chamada das funes. Uma melhoria simples no programa a verificao se o ndice i continua 0. Se isto ocorrer, tanto a lista quanto a busca no tem propsito. Deve se emitir a mensagem lista ainda vazia. Outro defeito a possvel entrada de valores alfanumricos que comprometem a execuo do programa.

Exerccios: 1. Escreva um programa que armazena 10 nmeros inteiros em um vetor. Depois disso o programa verifica e exibe quais so os nmeros pares maiores que 9. 2. Escreva um programa que armazena 10 nmeros inteiros em um vetor. Depois disso o programa armazena estes nmeros em outro vetor de mesmo tamanho na ordem inversa. 3. Escreva um programa que armazena 10 nmeros inteiros em um vetor. Depois disso o programa verifica e exibe qual o maior nmero e qual seu ndice no vetor.

4. Escreva um programa que armazena 8 nmeros inteiros em um vetor. Depois disso o programa exibe a mdia dos nmeros excluindo desta mdia o menor e o maior valor. 5. Escreva um programa que armazena 5 nmeros no vetor A e 5 nmeros no vetor B. Em seguida o programa verifica e exibe os nmeros que esto nos 2 vetores. Se no houver repetio deve ser exibida mensagem. 6. Escolha um dos exerccios acima e altere a resoluo utilizando funes.

DP-Estrutura de dados

Pilhas A pilha uma das estruturas de dados mais utilizadas na computao e tem como caracterstica principal a realizao das operaes em seu topo. Todas as inseres e retiradas de elementos so feitas sempre no topo. O ltimo elemento que entra o primeiro que sai, da a denominao LIFO Last In / First Out. Alm disso, a pilha uma estrutura que pode aumentar ou diminuir. So trs as operaes bsicas que ocorrem na pilha: Top: acessa o ltimo elemento da pilha. Push: insere um novo elemento na pilha. Pop: remove o elemento do topo da pilha. Esses nomes atribudos acima podem variar, mas geralmente a denominao que recebem. Observe a variao da pilha denominada P no quadro abaixo - P:[] pilha vazia. Operao Push(P,a) Push(P,b) Pop(P) Push(P,c) Top(P) Pop(P) Pop(P) Pilha a b,a a c,a c,a a c c a b Resulta

A pilha no requer movimentao de dados, j que tudo tratado em seu topo. A forma mais simples de representar a pilha portanto, a criao de um vetor com um ndice que controla seu topo. Exemplo de implementao de pilha em C++ Um primeiro exemplo de pilha e funes. #include <stdio.h> #include <conio.h> int vet[20]; int i=-1; void insere() { i=i+1; printf("Entre com o %do elemento\n", i+1); scanf("%d", &vet[i]); } void retira() { i=i-1; } void exibe() { printf("\n\nTopo da pilha-->%d",vet[i]);

DP-Estrutura de dados

} main() { int opcao=0; while (opcao < 4) { printf("\n"); printf("\n"); printf("\n Oque voce quer fazer?:\n"); printf("\n1 - Inserir elementos na pilha"); printf("\n2 - Retirar elementos da pilha"); printf("\n3 - Exibir o topo"); printf("\nOutra entrada - Sair do programa"); printf("\n-->: "); scanf("%d",&opcao); if (opcao==1) insere(); if (opcao==2) retira(); if (opcao==3) exibe(); } } O mesmo exemplo criando uma pilha de variveis alfanumricas: #include <stdio.h> #include <conio.h> int vet[20],i=-1; char nome[50] [100]; char endereco[50] [100]; void insere() { i=i+1; printf("Entre com o nome %d \n", i+1); scanf("%s", nome[i]); printf("Entre com o endereco %d \n", i+1); scanf("%s", endereco[i]); } void retira() { i=i-1; } void exibe() { printf("\n\nTopo da pilha nome -->%s",nome[i]); printf("\n endereco -->%s",endereco[i]); }

DP-Estrutura de dados

10

A partir de agora os programas exemplo vo utilizar um novo recurso chamado struct cuja idia bsica controlar um conjunto de dados como uma s entidade. No obrigatrio utilizar todos os itens do struct no programa. O exemplo abaixo mostra como utilizar o struct de uma maneira bem simples. struct cadastro { int num; char nome[20]; char curso[20]; char teste[20]; }; main() { cadastro tela; //a varivel tela do tipo cadastro tela.num = 345; strcpy(tela.nome,"Jose"); strcpy(tela.curso,"computacao"); printf("\nTestando data atual ==> \n",tela.num,tela.nome,tela.curso); system ("pause"); } Pilha com struct: #include <string.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <dos.h> struct pilha { int topo; char nomes [5][10]; }; int push (pilha &p, char aux[50]) { p.topo++; strcpy(p.nomes [p.topo], aux); return 1; } int pop (pilha &p) { p.topo--; return 1; %d %s %s

DP-Estrutura de dados

11

} int top (pilha p, char aux[50]) { strcpy(aux, p.nomes [p.topo]); return 1; } int main () { pilha p; p.topo= -1; char aux[50]; int opcao=0,I; while (opcao <= 3) { printf("\nOque quer fazer 1-Inserir 2-Retirar"); printf("\n 3-Ver o topo 4-Sair"); printf("\n--> "); scanf("%d",&opcao); if (opcao == 1) { printf ("\nDigite um nome (%d): \n",p.topo+1); scanf("%s", aux); push(p,aux); } if (opcao == 2) { top(p,aux); printf("Vou desempilhar (%d): %s\n",p.topo,aux); pop(p); } if (opcao == 3) { top(p,aux); printf("Exibindo o topo (%d): %s\n",p.topo,aux); }}}

Verificao de limites da pilha Faa uma analogia da estrutura de dados pilha com uma pilha de pneus em uma fbrica. Voc sabe que a pilha de pneus no pode crescer indefinidamente. Assim como existem limites fsicos no ambiente, existem limites de memria no computador. Para complementar e refinar o processo pode-se ento verificar os limites da pilha para, por exemplo, finalizar o processo de retirada... Observe os exemplos abaixo com struct:

DP-Estrutura de dados

12

#include <string.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <dos.h> struct pilha { int topo; char nomes [5][10]; }; int push (pilha &p, char texto[50]) { if (p.topo==4) return 0; p.topo++; strcpy(p.nomes [p.topo], texto); return 1; } int pop (pilha &p) { if (p.topo==-1) return 0; p.topo--; return 1; } int top (pilha p, char texto[50]) { strcpy(texto, p.nomes [p.topo]); return 1; } int main () { pilha p; p.topo= -1; char nomes[50]; int cont,opcao=0,i,elem=0; while (opcao <= 3) { printf("\nOque quer fazer 1-Inserir 2-Retirar"); printf("\n 3-Ver o topo 4-Sair"); printf("\n--> "); scanf("%d",&opcao); if (opcao == 1) { if (elem < 5 )

DP-Estrutura de dados

13

{ printf ("\nDigite um nome (%d): \n",p.topo+1); scanf("%s", nomes); push(p,nomes); elem++; } else printf("\nPilha Cheia"); } if (opcao == 2) { if (elem > 0) { top(p,nomes); printf("Vou desempilhar (%d): %s\n",p.topo, nomes); pop(p); elem--; } else printf("\nSem elementos"); } if (opcao == 3) { if (elem > 0) { top(p,nomes); printf("Exibindo o topo (%d): %s\n",p.topo, nomes); } else printf("\nSem elementos"); } } }

Exerccios: a) Desenvolva uma implementao que empilha e desempilha elementos em pilha utilizando as rotinas que verificam limites da pilha. Trata-se do mesmo programa exemplo deste captulo com a substituio do contador pela verificao de limites. b) Crie um programa que inverte os caracteres de uma palavra. c) Crie um programa para transformar uma expresso em notao infixa para notao ps-fixa. d) Resolva atravs de um programa uma expresso ps-fixa. e) Crie um programa que converte um nmero decimal em binrio. f) Crie um programa que converte um nmero binrio em hexadecimal.

DP-Estrutura de dados

14

Seguem programas incompletos, apenas para formao de conceitos e ajuda na resoluo dos exerccios: -Converso de decimal para binrio: #include <stdio.h> #include <conio.h> #include <stdlib.h> int vet[20]; int i=-1,resto; void insere() { i=i+1; vet[i]=resto; } void desempilha() { while (i>=0) { printf("%d ",vet[i]); i=i-1; } } main() { int n; printf("\nEntre com o numero a converter"); printf("\n-->: "); scanf("%d",&n); while (n>=1) { resto=n%2; insere(); n=int(n/2); } printf("\nConvertendo para binario:\n"); desempilha(); system("pause"); }

DP-Estrutura de dados

15

-Resoluo de expresso apresentada na forma ps-fixa. Somente soma: #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <cstring> char termo[3]; int vet[20]; int i=-1,k,aux,soma,opcao=0; void insere() { i=i+1; vet[i]=aux; } void exibe() { printf("\n\nTopo da pilha-->%d",vet[i]); system("pause");opcao=5; } main() { while (opcao < 3) { system("cls"); printf("\n\n Resolucao de expressao sem parenteses:\n"); printf("\n1 - Inserir termo da expressao"); printf("\n2 - Finalizar"); printf("\n-->: "); scanf("%d",&opcao); if (opcao==1) { printf("\n\nInsira o termo -->");scanf("%s",termo); aux=atoi(termo); if (aux != 0) insere(); if (aux == 0) { k=strcmp("+",termo); if (k == 0) { aux = vet[i]+vet[i-1];i=i-1;insere(); } } } if (opcao==2) exibe(); } }

DP-Estrutura de dados

16