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

FunesemC

Prof.IltonLBarbacena Aula7

FunesemC
A linguagem C dispe de construes (abstraes) que auxiliam o projeto de programas de maneira topdown. Quando uma funo chamada o usurio no precisa se preocupar como a computao realizada. importante saber o que a funo faz (qual o resultado da execuo de uma funo) e tambm como se usa a funo. Criando funes, um programa C pode ser estruturado em partes relativamente independentes que correspondem as subdivises do problema. Funes permitem dividir um longo programa em sees nomeadas, de forma que as sees possam ser reutilizadas ao longo do programa. As funes aceitam parmetros e retornam um resultado. Funes de C podem aceitar um nmero ilimitado de parmetros. Em geral, a linguagem C no se preocupa em qual ordem voc coloca suas funes no programa, contanto que o nome da funo seja conhecido pelo compilador antes de ser invocado. A importncia da biblioteca em C imensa, pois ela nos poupa de muita programao. Uma vez que as funes j esto prontas dentro da biblioteca, basta importar tal biblioteca e utilizar a funo desejada.

2/24

FunesemC
Em geral as funes esto em alguma biblioteca (outro arquivo) ou dever estar escritas no mesmo arquivo do programa fonte. A diretiva de #include faz parte do prprocessamento do cdigo fonte e indica, antes mesmo de compilar, os parmetros necessrios para ser criado ou carregado no caso de incluso de bibliotecas, para criar o arquivo executvel (programa final). O pr processamento indicado pelo caractere sharp (#) no inicio da linha, que indica uma macro, e deve ser usado, no incio dos programas. A importao de uma biblioteca caracterizado pela diretiva include (incluir) seguido da biblioteca entre os sinais de menor (<) e maior (>), para as bibliotecas padres. Opcionalmente, podese utilizar aspas {nome.h} para delimitar o nome da biblioteca, e neste caso, a biblioteca deve estar na pasta de trabalho. O nome da biblioteca, pode incluir, tambm, o caminho completo do arquivo (path). Existem diferenas entre a importao de bibliotecas de C e de C++. Apesar de muitos compiladores de C++ suportarem as bibliotecas de C, nenhum compilador exclusivamente de C, suporta bibliotecas de C++. Em C, a importao de bibliotecas simples, bastando acrescentar uma linha para cada biblioteca, no incio do cdigo fonte, com um include e o nome da biblioteca seguido de ponto h {#nome.h}, que a extenso do arquivo da biblioteca que vem da palavra inglesa HEADER (cabealho). Se voc esquecerse de colocar o # o programa no ser compilado. Ex: #include <stdio.h>
3/24

Bibliotecasdefunes
As bibliotecas, onde esto implementadas as funes, podem ter as seguintes origens: Bibliotecas que acompanham o compilador (padro); Bibliotecas elaboradas pelo usurio; Bibliotecas compradas de empresas; Bibliotecas gratuitas baixadas da internet; Bibliotecas fornecidas por fabricantes de hardware: arduno; Bibliotecas padro da linguagem C A padronizao destas bibliotecas passaram para vrias etapas, e nem sempre os compiladores seguem 100% destes padres estabelecidos; As mais conhecidas so: stdio.h, stdlib.h, string.h, time.h, type.h, conio.h, etc; Vejam os detalhes aqui: http://www.cplusplus.com/reference/ Vejam exemplos destas funes: printf(), scanf(), getchar(), sqrt(). So funes de uma biblioteca padro (do C ). Voc no sabe como elas foram escritas, mas j viu como utilizlas. Ou seja, voc sabe o nome das funes e quais informaes especficas voc deve fornecer a elas (valores que devem ser passados para as funes) para que a funo produza os resultados esperados. Quando nos referirmos a uma funo a maneira utilizada que o nome da funo seguido de ( ).
4/24

Bibliotecasdefunes
Exemplo de utilizao da biblioteca padro: Verificar se 2 nmeros so primos e multiplica um pelo outro, se o forem
#include <stdio.h> int main() { int n1, n2, j, prod = 0; printf("\n ==== Verifica se 2 numeros sao primos =====\n"); printf("\n Entre com 2 numeros inteiros: "); scanf (" %d %d", &n1, &n2); /* Se for indicado 1, 0 ou negativo, nao sao primos */ if ( n1 >= 2 && n2 >= 2) { /* Testa se n1 primo */ j = n1 - 1; while ((j > 1) && (n1 % j != 0)) j = j - 1; if( j == 1) { /* n1 eh primo */ /* Testa se n2 primo */ j = n2 - 1; while ((j > 1) && (n2 % j != 0)) j = j - 1; if( j == 1) /* n2 eh primo */ prod = n1 * n2; } } if (prod) printf("\n Numeros primos, com PRODUTO = %d\n", prod); else printf("\n Numeros nao primos \n\n"); } // se j chegar a 1 => n1 eh primo

Um dos benefcios mais bvios de usar funes que podemos evitar repetio de cdigo. Em outras palavras, se voc quiser executar uma operao mais de uma vez, voc pode simplesmente escrever a funo uma vez e utilizla diversas vezes ao invs de escrever o mesmo cdigo vrias vezes. Outro benefcio que se voc desejar alterar ou corrigir alguma coisa mais tarde, mais fcil alterar em um nico lugar. 5/24

Bibliotecasdefunes
Exemplo de utilizao da biblioteca padro: Verso 2: Verificar se 2 nmeros so primos e multiplica um pelo outro, se o forem
#include <stdio.h> int ehPrimo(int n) { int j; j = n - 1; while ((j > 1) && (n % j != 0)) j = j - 1; if (j == 1) return 1; else return 0; } // salvar como teste.h // eh primo int main() { int n1, n2, prod = 0, ep1, ep2; printf("\n ==== Verifica se 2 numeros sao primos =====\n"); printf("\n Entre com 2 numeros inteiros: "); scanf (" %d %d", &n1, &n2); /* Se for indicado 1, 0 ou negativo, nao sao primos */ if ( n1 >= 2 && n2 >= 2) { ep1 = ehPrimo(n1); /* Verifica se n1 eh primo */ ep2 = ehPrimo(n2); /* Verifica se n2 eh primo */ if (ep1 != 0 && ep2 != 0) prod = n1 * n2; } if (prod) printf("\n Numeros primos, com PRODUTO = %d\n", prod); else printf("\n Numeros nao primos \n\n"); return 1; }

Nesta verso foi utilizada uma funo para verificar se um numero primo, e chamada 2 vezes, evitando a repetio de cdigo; int ehPrimo(int n) => passa parmetro e retorna parmetro
6/24

Declaraodefunes
tipo_retornado nome_funcao (lista_de_parametros) { comando1; comando 2; .... comandon; } O nome da funo como aquele trecho de cdigo ser conhecido dentro do programa. Para definir esse nome, valem, basicamente, as mesmas regras para se definir uma varivel. A lista de parmetros deve possuir o tipo e o nome das variveis passados, separadas por vrgula.

Local de declarao de uma funo:


Deve ser declarada entes de ser usada, portanto antes do main(); Opcionalmente podese usar o prottipo de funo para indicar que a mesma est escrita mais na frente; Ex: int ehPrimo(int) ou int ehPrimo(int f)

7/24

Declaraodefunes
tipo_retornado nome_funcao (lista_de_parametros) { comando1; comando 2; .... comandon; } O nome da funo como aquele trecho de cdigo ser conhecido dentro do programa. Para definir esse nome, valem, basicamente, as mesmas regras para se definir uma varivel. A lista de parmetros deve possuir o tipo e o nome das variveis passados, separadas por vrgula. Toda funo tambm pode ser do tipo void, no retornando nada, e no receber nenhum parmetro tambm.

Local de declarao de uma funo:


Deve ser declarada entes de ser usada, portanto antes do main(); Opcionalmente podese usar o prottipo de funo para indicar que a mesma est escrita mais na frente; Ex: int ehPrimo(int); ou int ehPrimo(int f);

Prottipodefuno:
tiponome(tiponome1,tiponome2,...,tiponomeN);
8/24

FUNESCOMRETORNODEVALOR
Se a funo no for do tipo void, ento ela dever retornar um valor. O comando return utilizado para retornar esse valor para o programa. return expressao; A expresso da clusula return tem que ser compatvel com o tipo de retorno declarado para a funo.
int maior (int x,int y){ if(x>y) returnx; else returny; } void imprime_log(floatx){ if(x<=0) return ; //fim printf(Log=%fnn ,log(x)); }//void

int soma(int x,int y){ return (x+y); }

O valor retornado por uma funo no pode ser um array. a linguagem C no suporta a atribuio de um array para outro. Por esse motivo, no se pode ter como retorno de uma funo um array.
9/24

RETORNODEUMARRAYINDIRETAMENTE
A atribuio entre duas variveis de estrutura faz com que os contedos das variveis contidas dentro de uma estrutura sejam copiado para outra estrutura. Desse modo, tornase possvel retornar um array desde que o mesmo, esteja dentro de uma estrutura.

#include<stdio.h> #include<stdlib.h> structvetor{ charnome[20]; intidade; intaltura;//vetorcontem3variaveis }; structvetorretorna_array(){ structvetorv={"MariaSilva",28,175};// inicializav returnv;//retornaumaestrutura };

int main (){ struct vetorvet =retorna_array();//le valores printf("\n\n==Exemploderetornodearray usandoestruturas==\n");; printf("\nNome:%s,idade=%3danos,altura=%5dcm\n\n", vet.nome,vet.idade,vet.altura); system("pause"); return 1; }

10/24

PASSAGEMDEVALORES
Passagem por Valor / Padro em C
Ao passar o valor, feita uma cpia do mesmo na funo, e ao retornar, o valor fica inalterado e a cpia do mesmo deletada;

Passagem por Referncia


Na passagem de parmetros por valor, as funes no podem modificar o valor original de uma varivel passada para a funo. Mas existem casos em que necessrio que toda modificao feita nos valores dos parmetros dentro da funo, sejam repassados para quem chamou a funo.

Umexemplobastantesimplesdissoafunoscanf:sempre quedesejamosleralgodoteclado,passamosparaafuno scanf onomedavarivelondeodadoserarmazenado.Essa variveltemseuvalormodificadodentrodafunoscanf e seuvalorpodeseracessadonoprogramaprincipal.


11/24

PASSAGEMDEVALORES
#include <stdio.h> #include <stdlib.h> int main ( ) { int x = 5; printf ("\n Antes do scanf : x = %5d", x ) ; printf ("\n Digite um numero : " ) ; scanf("%d", &x ) ; printf (" \n\tDepois do scanf : x = %5d\n\n", x ) ; system ("pause") ; return 0; }

12/24

PASSAGEMPORREFERNCIA

Na passagem de parmetros por referncia no se passa para a funo os valores das variveis, mas sim os endereos das variveis na memria. Toda vez que a varivel passada por referncia for usada dentro da funo, o operador * dever ser usado na frente do nome da varivel. Na chamada da funo necessrio utilizar o operador & na frente do nome da varivel que ser passada por referncia. Na passagem de uma varivel por referncia necessrio usar o operador * sempre que se desejar acessar o contedo da varivel dentro da funo.

13/24

PASSAGEMDEVALORES
PorValor
#include<stdio.h> #include<stdlib.h> void Troca(int a,int b){ int temp ; temp =a; a=b; b=temp ; printf ("\n\tDentrodafuncao :%de%d",a,b); } } int main (){ int x=2; int y=3; printf ("\nAntes:%de%d",x,y); Troca(x,y); printf ("\nDepois:%de%d\n\n",x,y); system("pause"); return 0; } } int main (){ int x=2; int y=3; printf ("\nAntes:%de%d",x,y); Troca(&x,&y);//porreferencia printf ("\nDepois:%de%d\n\n",x,y); system("pause"); return 0;

PorReferncia

#include<stdio.h> #include<stdlib.h> void Troca(int*a,int*b){ int temp ; temp =*a;//valor *a=*b; *b=temp ; printf ("\n\tDentrodafuncao :%de%d",*a,*b);

14/24

PASSAGEMDEARRAYSCOMOPARMETROS
Para utilizar arrays como parmetros de funes alguns cuidados simples so necessrios. Alm do parmetro do array que ser utilizado na funo, necessrio declarar um segundo parmetro (em geral uma varivel inteira) para passar para a funo o tamanho do array separadamente.
#include<stdio.h> #include<stdlib.h> void imprime_matriz(int m[][2],int n){ int i,j; for(i=0;i<n;i++) for(j=0;j<2;j++) printf ("%5d",m[i][j]); } int main (){ int v[5]={11,25,36,44,55}; printf("\n===Imprimearray ====\n\n\n"); imprime(v,5); printf("\n\n"); system("pause"); return 0; } } int main (){ int mat [3][2] ={{11,25},{36,44},{55,99}}; printf("\n===Imprimearray ====\n\n\n"); imprime_matriz(mat ,3); printf("\n\n"); system("pause"); return 0;

#include<stdio.h> #include<stdlib.h> void imprime(int *n,int m){ int i; for(i=0;i<m;i++) printf ("%5d",n[i]); }

15/24

OPERADORSETAEMESTRUTURAPORREFERNCIA
O operador seta > e utilizado quando uma referncia para uma estrutura (struct) passada para uma funo; O operador seta > substitui o uso conjunto dos operadores * e . no acesso ao campo de uma estrutura passada por referncia para uma funo.

struct ponto{ int x,y; }; void atribui(struct ponto*p){ (*p).x=10; (*p).y=20; }

struct ponto{ int x,y; }; void atribui(struct ponto*p){ p>x=10; p>y=20; }

16/24

FUNESRECURSIVAS
Uma funo que dita recursiva aquela que invoca ela mesma. Neste caso necessrio um cuidado especial para no cairmos em um looping infinito. Exemplo:
CrieumprogramaemCquepeaumnmerointeiroaousurioeretorne asomadetodososnmerosde1atonmeroqueousuriointroduziu (ouseja:1+2+3+...+n).Utilizerecursividade. Vamoscriarumafuno soma(int n): Sen=5,essafunodeveretornar:soma(5)=5+4+3+2+1 Sen=4,essafunodeveretornar:soma(4)=4+3+2+1 Sen=3,essafunodeveretornar:soma(3)=3+2+1 Sen=2,essafunodeveretornar:soma(2)=2+1 Sen=1,essafunodeveretornar:soma(1)= 1 Ento: soma(n)=n+(n1)+(n2)+(n3)+....+1
17/24

FUNESRECURSIVAS
funo soma(long n)
#include<stdio.h> #include<windows.h> longsoma(longn) { if(n==1) return1; else return(n+soma(n1)); }
int main() { int n=9; charst[20]; while(n>0){ system("cls");//limpaatela printf("\n===Somade1aovalordigitado====\n\n"); printf("Digiteuminteiropositivo:"); fflush(stdin);//eliminabufferdoteclado gets(st); n=atol(st);//veroqueretorna if (n>0) printf("\tSoma:%8ld\n",soma(n)); Sleep(3000);//3seg } printf("\nFimdoPrograma\n\n"); system("pause"); return 1; } 18/24

ARGUMENTOSargc eargv
A funo main() como todas as funes podem ter parmetros. Como a funo main() sempre a primeira a ser executada, os parmetros que ela recebe so fornecidos pela linha de comando ou pelo programa que iniciou a sua execuo. No caso da funo main() so usados dois argumentos especiais int argc e char **argv. O primeiro argumento, argc, uma varivel inteira que indica quantos argumentos foram fornecidos para a funo. Observar que argc vale sempre pelo menos 1, porque o nome do programa sempre o primeiro argumento fornecido ao programa. O outro parmetro um vetor de cadeias de caracteres, e portanto, caso sejam fornecidos nmeros, estes devem ser convertidos para o formato requerido. Cada um dos argumentos do programa um elemento deste vetor. void main (int argc,char*argv[])
19/24

ARGUMENTOSargc eargv
O valor de argc sempre maior ou igual a 1. char *argv[]: tratase de um ponteiro para uma matriz de strings. Cada uma das string contidas nesta matriz um dos parmetros com os quais a funo main() foi chamada na linha de comando. Ao todo, existem argc strings guardadas em argv. A string guardada em argv[0] sempre aponta para o nome do programa (lembrese, o nome do programa contado como argumento da funo).
#include<stdio.h> #include<stdlib.h> int main (int argc ,char*argv []){ int i; printf ("\n====Parametros argc eargv dafuncao main()====\n\n"); if(argc ==1) printf("\nNenhumparametro passadoparaoprograma:\n\t%s",argv [0]); else { printf ("\nParametros passadosparaoprograma:%s:",argv [0]); for(i=1;i<argc ;i++) printf ("\n\tParametro %d:%s",i,argv [i]); } printf ("\n\n"); system("pause"); return 0; } //compilaroprograma //irnoprompt,ondeestaoexecutvelgerado,eentar comocomando: //prog.exe455667

20/24

Atividades:
Elaborar os programas que se segue para o ambiente CodeBlocks. Enviar apenas um arquivo compactado contendo as duas pastas com os fontes. Os arquivos fontes devero possuir seu nome e data, em forma de comentrio. Nome do arquivo compactado a enviar: seu_nome_atv_26_Ago_2013.zip Enviar para o email: ilton.barbacena@gmail.com Assunto: 3eletronica_g1

Arquivo com as atividades: https://dl.dropboxusercontent.com/u/7940146/atividade_Tec_26Ago2013.txt

21/24

Bibliografia
http://www.cprogressivo.net/p/obasicodalinguagemc.html http://www.cprogressivo.net/2013/02/OqueeparaqueserveecomousaredeclararfuncaoemC.html https://app.box.com/s/km8lctpn1arjv11s58ml http://www.cplusplus.com/reference/clibrary/ http://www.tiexpert.net/programacao/c/index.php http://linguagemc.com.br/bibliotecas/ http://informatica.hsw.uol.com.br/programacaoemc7.htm http://www.inf.ufpr.br/nicolui/grad/ci067/Docs/NotasAula/notas1_Programa_c_cao_Basica_em_.html http://www.samueldiasneto.com/c_bas/index.htm http://www.ime.usp.br/~pf/algoritmos/ http://equipe.nce.ufrj.br/adriano/c/apostila/texfiles/apostilaC.pdf http://www.esj.eti.br/Apostilas/DicasAlgoritmosLinguagemC_v15.pdf https://dl.dropboxusercontent.com/u/7940146/lingc/atrasos_c.txt https://dl.dropboxusercontent.com/u/7940146/lingc/delay.txt

22/24