Apostila C
275 pág.

Apostila C


DisciplinaMétodos e Técnicas de Programação22 materiais161 seguidores
Pré-visualização45 páginas
cad;
podemos agora declarar uma varia´vel deste tipo usando apenas a palavra
cad:
cad c;
O comando typedef pode ser combinado com a declarac¸a\u2dco
de um tipo definido pelo programador (struct, union, etc)
em uma u´nica instruc¸a\u2dco.
Tome como exemplo a struct cadastro declarada anteriormente:
typedef struct cadastro{
char nome[50];
int idade;
char rua[50];
int numero; } cad;
Note que a definic¸a\u2dco da estrutura esta´ inserida no meio do comando do
typedef formando, portanto, uma u´nica instruc¸a\u2dco. Ale´m disso, como es-
tamos associando um novo nome a nossa struct, seu nome original pode
ser omitido da declarac¸a\u2dco da struct:
typedef struct {
char nome[50];
int idade;
char rua[50];
int numero; } cad;
154
O comando typedef deve ser usado com cuidado pois ele
pode produzir declarac¸o\u2dces confusas.
1 #include <s t d i o . h>
2 #include <s t d l i b . h>
3 typedef unsigned i n t p o s i t i v o s [ 5 ] ;
4 i n t main ( ) {
5 p o s i t i v o s v ;
6 i n t i ;
7 for ( i = 0 ; i < 5; i ++){
8 p r i n t f ( \u2018 \u2018 D i g i t e o va lo r de v[%d ] : \u2019 \u2019 , i ) ;
9 scanf ( \u2018 \u2018%d \u2019 \u2019 ,&v [ i ] ) ;
10 }
11
12 for ( i = 0 ; i < 5; i ++)
13 p r i n t f ( \u2018 \u2018 Va lor de v[%d ] : %d\n \u2019 \u2019 , i , v [ i ] ) ;
14
15 system ( \u2018 \u2018 pause \u2019 \u2019 ) ;
16 return 0;
17 }
No exemplo acima, o comando typedef e´ usado para criar um sino\u2c6nimo
(positivos) para o tipo \u201carray de 5 inteiros positivos\u201d (unsigned int [5]).
Apesar de va´lida, essa declarac¸a\u2dco e´ um tanto confusa ja´ que o novo nome
(positivos) na\u2dco da´ nenhum indicativo de que a varia´vel declarada (v) seja
um array e nem seu tamanho.
155
8 FUNC¸O\u2dcES
Uma func¸o\u2dces nada mais e´ do que um blocos de co´digo (ou seja, declarac¸o\u2dces
e outros comandos) que podem ser nomeados e chamados de dentro de
um programa. Em outras palavras, uma func¸a\u2dco e´ uma sequ¨e\u2c6ncia de co-
mandos que recebe um nome e pode ser chamada de qualquer parte do
programa, quantas vezes forem necessa´rias, durante a execuc¸a\u2dco do pro-
grama.
A linguagem C possui muitas func¸o\u2dces ja´ implementadas e no´s temos utili-
zadas elas constantemente. Um exemplo delas sa\u2dco as func¸o\u2dces ba´sicas de
entrada e sa\u131´da: scanf() e printf(). O programador na\u2dco precisa saber qual
o co´digo contido dentro das func¸o\u2dces de entrada e sa\u131´da para utiliza´-las.
Basta saber seu nome e como utiliza´-la.
A seguir, sera\u2dco apresentados os conceitos e detalhes necessa´rios para um
programador criar suas pro´prias func¸o\u2dces.
8.1 DEFINIC¸A\u2dcO E ESTRUTURA BA´SICA
Duas sa\u2dco as principais razo\u2dces para o uso de func¸o\u2dces:
\u2022 estruturac¸a\u2dco dos programas;
\u2022 reutilizac¸a\u2dco de co´digo.
Por estruturac¸a\u2dco dos programas entende-se que agora o programa sera´
constru\u131´do a partir de pequenos blocos de co´digo (isto e´, func¸o\u2dces) cada
um deles com uma tarefa especifica e bem definida. Isso facilita a compre-
ensa\u2dco do programa.
Programas grandes e complexos sa\u2dco constru\u131´dos bloco a
bloco com a ajuda de func¸o\u2dces.
Ja´ por reutilizac¸a\u2dco de co´digo entende-se que uma func¸a\u2dco e´ escrita para
realizar uma determinada tarefa. Pode-se definir, por exemplo, uma func¸a\u2dco
para calcular o fatorial de um determinado nu´mero. O co´digo para essa
func¸a\u2dco ira´ aparecer uma u´nica vez em todo o programa, mas a func¸a\u2dco
que calcula o fatorial podera´ ser utilizadas diversas vezes e em pontos
diferentes do programa.
156
O uso de func¸o\u2dces evita a co´pia desnecessa´ria de trechos
de co´digo que realizam a mesma tarefa, diminuindo assim
o tamanho do programa e a ocorre\u2c6ncia de erros.
Em linguagem C, a declarac¸a\u2dco de uma func¸a\u2dco pelo programador segue a
seguinte forma geral:
tipo retornado nome func¸a\u2dco (lista de para\u2c6metros){
seque\u2c6ncia de declarac¸o\u2dces e comandos
}
O nome func¸a\u2dco e´ como aquele recho de co´digo sera´ conhecido dentro do
programa. Para definir esse nome, valem, basicamente, as mesmas regras
para se definir uma varia´vel.
Com relac¸a\u2dco ao local de declarac¸a\u2dco de uma func¸a\u2dco, ela deve ser definida
ou declarada antes de ser utilizada, ou seja, antes da cla´usula main, como
mostra o exemplo abaixo:
Exemplo: func¸a\u2dco declarada antes da cla´usula main.
1 #include <s t d i o . h>
2 #include <s t d l i b . h>
3
4 i n t Square ( i n t a ) {
5 return ( a\u2217a ) ;
6 }
7
8 i n t main ( ) {
9 i n t num;
10 p r i n t f ( \u2018 \u2018 Entre com um numero : \u2019 \u2019 ) ;
11 scanf ( \u2018 \u2018%d \u2019 \u2019 , &num) ;
12 num = Square (num) ;
13 p r i n t f ( \u2018 \u2018O seu quadrado vale : %d\n \u2019 \u2019 , num) ;
14 system ( \u2018 \u2018 pause \u2019 \u2019 ) ;
15 return 0;
16 }
Pode-se tambe´m declarar uma func¸a\u2dco depois da cla´usula main. Nesse
caso, e´ preciso declarar antes o proto´tipo da func¸a\u2dco:
157
tipo retornado nome func¸a\u2dco (lista de para\u2c6metros);
O proto´tipo de uma func¸a\u2dco, e´ uma declarac¸a\u2dco de func¸a\u2dco que omite o corpo
mas especifica o seu nome, tipo de retorno e lista de para\u2c6metros, como
mostra o exemplo abaixo:
Exemplo: func¸a\u2dco declarada depois da cla´usula main.
1 #include <s t d i o . h>
2 #include <s t d l i b . h>
3 / / p r o t o´ t i p o da func¸a\u2dco
4 i n t Square ( i n t a ) ;
5
6 i n t main ( ) {
7 i n t num;
8 p r i n t f ( \u2018 \u2018 Entre com um numero : \u2019 \u2019 ) ;
9 scanf ( \u2018 \u2018%d \u2019 \u2019 , &num) ;
10 num = Square (num) ;
11 p r i n t f ( \u2018 \u2018O seu quadrado vale : %d\n \u2019 \u2019 , num) ;
12 system ( \u2018 \u2018 pause \u2019 \u2019 ) ;
13 return 0;
14 }
15
16 i n t Square ( i n t a ) {
17 return ( a\u2217a ) ;
18 }
Independente de onde uma func¸a\u2dco seja declarada, seu funcionamento e´
basicamente o mesmo:
\u2022 o co´digo do programa e´ executado ate´ encontrar uma chamada de
func¸a\u2dco;
\u2022 o programa e´ enta\u2dco interrompido temporariamente, e o fluxo do pro-
grama passa para a func¸a\u2dco chamada;
\u2022 se houver para\u2c6metros na func¸a\u2dco, os valores da chamada da func¸a\u2dco
sa\u2dco copiados para os para\u2dcmetros no co´digo da func¸a\u2dco;
\u2022 os comandos da func¸a\u2dco sa\u2dco executados;
\u2022 quando a func¸a\u2dco termina (seus comandos acabaram ou o comando
return foi encontrado), o programa volta ao ponto onde foi interrom-
pido para continuar sua execuc¸a\u2dco normal;
158
\u2022 se houver um comando return, o valor dele sera´ copiado para a
varia´vel que foi escolhida para receber o retorno da func¸a\u2dco.
Na figura abaixo, e´ poss\u131´vel ter uma boa representac¸a\u2dco de como uma cha-
mada de func¸a\u2dco ocorre:
Nas sec¸o\u2dces seguintes, cada um dos itens que definem uma func¸a\u2dco sera\u2dco
apresentados em detalhes.
8.1.1 PARA\u2c6METROS DE UMA FUNC¸A\u2dcO
Os para\u2c6metros de uma func¸a\u2dco e´ o que o programador utiliza para passar a
informac¸a\u2dco de um trecho de co´digo para dentro da func¸a\u2dco. Basicamente,
os para\u2c6metros de uma func¸a\u2dco sa\u2dco uma lista de varia´veis, separadas por
v\u131´rgula, onde e´ especificado o tipo e o nome de cada para\u2c6metro.
Por exemplo, a func¸a\u2dco sqrt possui a seguinte lista de
para\u2c6metros: float sqrt(float x);
Em linguagem C, a declarac¸a\u2dco dos para\u2c6metros de uma func¸a\u2dco segue a
seguinte forma geral:
tipo retornado nome func¸a\u2dco (tipo nome1, tipo nome2, ... ,
tipo nomeN){
seque\u2c6ncia de declarac¸o\u2dces e comandos
}
159
Diferente do que acontece na declarac¸a\u2dco de varia´veis,
onde muitas varia´veis podem ser declaradas com o mesmo
especificador de tipo, na declarac¸a\u2dco de para\u2c6metros de uma
func¸a\u2dco e´ necessa´rio especificar o tipo de cada varia´vel.
1 / / Declarac¸a\u2dco CORRETA de para\u2c6metros
2 i n t soma( i n t x , i n t y ) {
3 return x + y ;
4 }
5
6 / / Declarac¸a\u2dco ERRADA de para\u2c6metros
7 i n t soma( i n t x , y ) {
8 return x + y ;
9 }
Dependendo da func¸a\u2dco, ela pode possuir nenhum para\u2c6metro. Nesse caso,
pode-se optar por duas soluc¸o\u2dces:
\u2022 Deixar a lista de para\u2c6metros vazia: void imprime ();
\u2022 Colocar void entre pare\u2c6nteses: void imprime (void).
Mesmo se na\u2dco houver para\u2c6metros na func¸a\u2dco, os
pare\u2c6nteses ainda sa\u2dco necessa´rios.
Apesar das duas declarac¸o\u2dces estarem corretas, existe uma diferenc¸a en-
tre elas. Na primeira declarac¸a\u2dco, na\u2dco e´ especificado nenhum para\u2c6metro,
portanto a func¸a\u2dco pode ser chamada passando-se valores para ela. O o
compilador na\u2dco ira´ verificar se a func¸a\u2dco e´ realmente chamada sem argu-
mentos e a func¸a\u2dco na\u2dco conseguira´ ter acesso a esses para\u2c6metros. Ja´ na
segunda