Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Estrutura de um programa em C
-----------------------------
Capituto 1
Um programa em C tem a seguinte estrutura:
declaracao de pre'-processamento
declaracao de variaveis globais(=externas)
declaracao de variaveis;
comandos;
funcoes;
Um funcao em C e' sempre definida entre um abre chave ({) e um fecha chave (}).
Portanto a funcao main(), por exemplo, tem um { e um } que define quais os
comandos ou funcoes que devem ser executados dentro dele.
As funcao main() pode chamar outras funcoes, que por sua vez podem chamar
a si mesma ou a outras. Em C, costumamos trabalhar sempre com funcoes pequenas
para facilitar a programacao e a compreenssao do programa.
{
declaracao de variaveis;
comandos;
funcoes;
}
nome da funcao ---------> E' o nome pelo qual a funcao sera' chamada.
tipos dos parametros ---> Se houver parametros, entao o tipo dos parametros
deve ser declarado.
/*
Exemplo 1:*/
main()
{
printf("Este 1. programa em C contem somente a funcao main()\n");
main()
{
printf("\nVoce esta' na funcao main()\n");
printf("Este exemplo simula como e' chamada uma funcao.\n\n");
funcao1()
{
printf("\t Voce esta' na funcao 1\n");
printf("\t Bem vindo a funcao 1\n\n");
}
#endif
/*
Exemplo 3:
*/
#ifdef ex3
main()
{
printf("\nVoce esta' na funcao main()\n");
printf("Este exemplo simula como a funcao 1 chama a funcao2.\n\n");
funcao1();
funcao1()
{
printf("\t Voce esta' na funcao 1\n");
printf("\t Bem vindo a funcao 1\n\n");
funcao2()
{
printf("\t\t Voce esta' na funcao 2\n");
printf("\t\t Voce chegou a funcao 2 com sucesso. Parabens.\n\n");
}
#endif
3
Capituto 2
/**********************************************************************
FUNCOES DE BIBLIOTECA
**********************************************************************
1 - getchar() -> le um caracter da entrada padrao ate' um ENTER.
Exemplo:*/
#ifdef ex1
main()
{
char c;
clrscr();
printf("digite um caracter : ");
c = getchar();
printf("o caracter digitado e': %c",c);
}
#endif
/*
2 - putchar() -> imprime um caracter na saida padrao.
Exemplo:*/
#ifdef ex2
main()
{
char c;
clrscr();
printf("digite um caracter : ");
c = getchar();
printf("o caracter digitado e': ");
putchar(c);
}
#endif
/*
Exemplo:*/
#ifdef ex3
main()
{
char c[128];
clrscr();
printf("digita um string via teclado : ");
gets(c);
printf("a string digitada e': %s",c);
}
#endif
/*
4 - puts() -> escreve uma serie de caracteres na saida padrao.
Exemplo:*/
#ifdef ex4
main()
{
char c[128];
clrscr();
puts("digita um string via teclado : ");
gets(c);
printf("a string digitada e': ");
puts(c);
4
}
#endif
/*
5 - printf() -> escreve caracteres formatados na saida padrao.(no caso video)
Exemplos:*/
#ifdef ex5
main()
{
clrscr();
printf("exemplos dos codigos de formatacao\n");
printf("A letra e': %c\n\n", 'A');
printf("A letra e': %c\n\n", 65);
printf("A idade do usuario: %d peso: %d altura: %d\n\n", 41, 80 , 178);
printf("O preco do item e': %f\n\n", 572.34);
printf("A area do circulo e' %e\n\n", 2 * 3.14159 * 2.0031);
printf("Exibir 0.1234 resulta em %g\n\n", 0.1234);
printf("Exibir 0.00001234 resulta em %g\n\n", 0.00001234);
printf("O nome da minha faculdade e' %s\n\n","Fatec Baixada Santista");
printf("Exibindo 42000 como int sem sinal %u\n", 42000);
/*
E' possivel tambem indicar o tamanho do campo, justificacao (a direita ou
a esquerda) e o numero de casas decimais(precisao. Para isto usa-se codigos
colocados entre o % e a letra que indica o tipo de formatacao.
Exemplo:
Exemplos:*/
#ifdef ex6
main()
{
clrscr();
printf("12345678901234567890 regua\n"); /* regua */
/* campos numericos */
5
printf("%d\n",512); /* sem justificacao e tamanho de campo*/
printf("%6d\n",512); /* justifica a direita c/ tam = 6 */
printf("%-6d\n",512); /* justifica a esquerda c/ tam = 6 */
/* campos alfanumericos */
printf("\n12345678901234567890 regua\n"); /* regua */
printf("%s\n","FATEC"); /* sem justificacao e tamanho de campo*/
printf("%10s\n","FATEC"); /* justifica pela direita c/ tam = 10 */
printf("%-10s\n","FATEC");/* justifica pela esquerda c/ tam = 10 */
/*
OBS.:
1 - A leitura do dado deve ser armazenada no endereço de memória que o
computador alocou para a variável declarada. Por isso o operador &
é utilizado nesta função, armazenando o valor informado pelo usuário
no correto endereço de memória onde tal variável foi criada pelo
computador.
Exemplo: */
#ifdef ex7
main()
{
char letra;
clrscr();
printf("digite uma letra: ");
scanf("%c",&letra);
printf("a letra digitada e': %c",letra);
}
#endif
#ifdef ex8
main()
{
char a[255];
clrscr();
printf("digite uma string: \n");
scanf("%s",a);
printf("a string digitada e': %s",a);
}
#endif
6
#ifdef ex9
main()
{
int d;
float f;
unsigned u;
float e;
float g;
clrscr();
printf("digite um numero inteiro: ");
scanf("%d",&d);
printf("o numero digitada e': %d",d);
/**********************************************************************
EXERCICIOS
**********************************************************************
10 20 30 40 50
12345678901234567890123456789012345678901234567890
Rui Rui
Rui Rui
Rui
Capitulo 3
/**********************************************************************
TIPO DE VARIAVEIS EM C
**********************************************************************
1 - Tipos de variaveis
Exemplo:
*/
#ifdef ex1
main()
{
7
char a = 'z'; /* variavel tipo caracter */
int b = 3000; /* variavel tipo inteira */
float c = 1456.753; /* variavel tipo ponto flutuante */
double d = 9987.453; /* variavel tipo ponto flutuante dupla precisao */
clrscr();
printf("imprimi o conteudo das variavel tipo:\n");
printf("\tcaracter --------------------------> %c\n",a);
printf("\ttipo inteira ----------------------> %d\n",b);
printf("\tponto flutuante precisao simples --> %f\n",c);
printf("\tponto flutuante dupla precisao ----> %lf\n",d);
}
#endif
/*
2 - Qualificadores de variaveis
Inteiro curto sem sinal -> unsigned short int ou unsigned short
faixa de valores -> 0 a 65535
Inteiro longo sem sinal -> unsigned long int ou unsigned long
faixa de valores -> 0 a 4.294.967.295
Exemplo:
*/
#ifdef ex2
main()
{
short int a = 10000;
long int b = 100000;
clrscr();
printf("imprimi o conteudo da variavel tipo inteiro com os qualificadores\n");
printf("\t inteiro curto ------------> %hd\n",a);
printf("\t inteiro longo ------------> %ld\n",b);
printf("\t caracter sem sinal -------> %u %c \n",c,c);
printf("\t inteiro sem sinal -------> %u\n",d);
printf("\t inteiro curto sem sinal --> %hu\n",e);
printf("\t inteiro longo sem sinal --> %lu\n",f);
}
#endif
/*
3 - Nomes de variaveis
Existe 4 regras basicas para se dar um nome a uma variavel, sao elas:
a) Todo nome de variavel deve comecar por uma letra ou o caracter sublinha(_).
8
b) Os caracteres seguintes podem ser letras, numeros ou o caracter sublinha.
E' usual em C utilizar letras minusculas para nome de variaveis e letras
maiusculas para constantes simbolicas.
c) O numero de digitos que tem significado para o compilador sao 8, mas
o nome pode ter qualquer tamanho.
d) Existem certas palavras reservadas que formam a linguagem C que nao podem
ser utilizadas. Sao elas:
4 - Declaracao de variaveis
Exemplo:
*/
#ifdef ex3
main()
{
int dentro = 20; /* variavel declarada dentro da funcao (local) */
int var = 30; /* variavel que sera' passada como informacao para a funcao*/
clrscr();
printf("imprimi a variavel fora %d\n",fora);
printf("imprimi a variavel dentro %d\n",dentro);
imp(var1)
int var1; /* variavel recebida como parametro na funcao imp */
{
puts("\t voce esta' na funcao imp que vai imprimir no video o conteudo da");
printf("\t variavel par recebida como parametro que e' %d\n",var1);
}
#endif
/*
Isto define a Classe de armazenamento de uma variavel.
a) Automaticas ou locais
sao variaveis declaradas dentro de uma funcao e sem especificao quanto
a classe de armazenamento. A palavra chave auto e' opcional. Elas so'
existem durante a execucao da funcao.
b) Externas ou globais
sao variaveis declaradas fora de qualquer funcao, o que torna seu valor
acessivel a todas as funcoes do modulo em que ocorre a sua definicao.
Elas existem durante todo o processamento.
c) Estaticas
As variaveis estaticas podem ser locais ou globais.
Estaticas locais -> sao declaradas dentro de uma funcao e tem sua memoria
alocada em tempo de compilacao. Estas tem o mesmo tempo de vida das externas
porem estao restritas a funcao na qual foram declaradas.
Estaticas globais -> Sao declaradas fora de qualquer funcao e sao visiveis
apenas no arquivo onde foram definidas, ficando inacessiveis aos outros
modulos que porventura venham a ser ligados a este. Uma funcao tambem pode
9
ser declarada estatica sendo visivel apenas ao arquivo onde se encontra.
d) Registradores
Sao variaveis declaradas dentro de uma funcao que quando possivel o
compilador coloca em registradores da CPU e nao em memoria. Normalmente
usamos estas declaracao em variaveis muito utiliza no programa.
Exemplo:
*/
#ifdef ex4
int fora = 25000;
static long fora1 = 2000000;
main()
{
unsigned dentro = 45000;
static long dentro1 = 4000000;
register int reg = 30000;
clrscr();
printf("imprime o conteudo da variavel fora %d\n",fora);
printf("imprime o conteudo da variavel static fora %ld\n",fora1);
printf("imprime o conteudo da variavel dentro %u\n",dentro);
printf("imprime o conteudo da variavel static dentro %ld\n",dentro1);
printf("imprime o conteudo da variavel register int reg %d\n",reg);
}
#endif
/*
6 - Constantes
Constantes em C referem-se a valores fixos que nao podem ser alterados pelo
programa. Elas podem ser de qualquer tipo e sao utilizados para inicializar
os varios tipos de variaveis vistos acima.
#ifdef ex5
main()
{
int z = 20000;
int y = 25000;
clrscr();
printf("imprime o conteudo da variavel z \t %d\n",z);
printf("imprime o conteudo da variavel y %d \b\b\b",y);
getchar();
printf("imprime os caracteres especiais \\ e \'\r");
}
/**********************************************************************
EXERCICIOS
**********************************************************************
10 20 30 40 50 60
12345678901234567890123456789012345678901234567890123456789012345 regua
10
short long unsigned
float double char
4 - Escreva um programa que recebe via teclado os valores limites sem sinal para
as variaveis do tipo char, int e long int e imprima-os no video.
5 - Escreva um programa que recebe via teclado os valores limites sem sinal para
as variaveis do tipo float e double e imprima-os no video.
Capitulo 4
/**********************************************************************
MATRIZES OU VETORES DE DADOS
**********************************************************************
1. Compreendendo o que sao matrizes ou vetores
Muitas vezes nos programas, e´ necessário que uma variavel contenha muitos valores.
Por exemplo, uma variavel nota pode controlar as "notas" obtidas por 100 alunos em
um exame. Da mesma maneira, uma variavel "salarios" pode controlar os salarios de
cada funcionario em uma empresa.
Uma vetor e´ um conjunto de dados que pode armazenar multiplos valores do mesmo
tipo. Por exemplo, pode-se criar uma vetor que contenha 100 valores do tipo int
e um segundo vetor com 25 valores do tipo float. O que fica claro e´ que todos
os valores que voce atribui a um vetor tem que ser do mesmo tipo.
2.Definicao
Vetores sao variaveis compostas que agrupam dados do mesmo tipo que sao
referenciadas atraves de um indice.
3.Declaracao de vetores
Para declarar um vetor, precisa-se especificar o tipo de dados desejado (tal como
int, float ou double), bem como o tamanho do vetor. Para especificar o tamanho de um
vetor,coloca-se o numero de elementos que o vetor pode armazenar dentro de
colchetes apos o nome do vetor.
nome_variavel -> e´o nome pelo qual o vetor vai ser referenciado
Exemplo:
*/
int notas [100]; /*declara um vetor de nome notas do tipo int que pode armazenar
100 notas de exame */
float salarios [50]; /*declara um vetor de nome salarios do tipo float, que pode
armazenar 50 salários */
/*
Outro detalhe importante e´que em C nao ha verificacao de limites nos vetores.
Isto significa que e´possivel ultrapassar o fim de um vetor e escrever em outras
variaveis, ou mesmo em trechos de codigo de programa. E´tarefa do programador
fazer com que os indices dos vetores estejam sempre dentro dos limites
estabelecidos pela declaracao de tamanho do vetor.
Exemplo:
/*
Observando os exemplos podemos notar que o n. do elemento e´um a mais que
a referencia entre colchetes. Isso acontece por que em C as refencias ou indices
comecam em 0 e a referencia do ultimo elemento e´o tamanho do vetor -1.
5.Inicializacao de vetores
Um vetor so' pode ser inicializado se declarado como uma variavel global
ou static.
#ifdef ex1
int f[10]={1,2,3,4,5,6,7,8,9,10}; /* variavel global do tipo inteira*/
/* tamanho declarado explicitamente */
main()
{
clrscr();
printf("Os numeros sao: ");
printf(" %d",f[0]);
printf(" %d",f[1]);
printf(" %d",f[2]);
printf(" %d",f[3]);
printf(" %d",f[4]);
printf(" %d",f[5]);
printf(" %d",f[6]);
printf(" %d",f[7]);
printf(" %d",f[8]);
printf(" %d",f[9]);
}
#endif
#ifdef ex2
main()
{
clrscr();
printf("Os numeros sao: ");
printf(" %d %d %d %d %d %d %d %d %d %d",f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9]);
}
#endif
#ifdef ex3
main()
{
float f[10]; /* declara tamanho do vetor e tipo*/
12
clrscr();
printf("Os numeros sao: \n");
printf(" %f\n",f[0]);
printf(" %f\n",f[1]);
printf(" %f\n",f[2]);
printf(" %f\n",f[3]);
printf(" %f\n",f[4]);
printf(" %f\n",f[5]);
printf(" %f\n",f[6]);
printf(" %f\n",f[7]);
printf(" %f\n",f[8]);
printf(" %f\n",f[9]);
}
#endif
/*
Como foi visto, um vetor e´ uma variavel que pode armazenar multiplos valores
do mesmo tipo. Nos exemplos apresentados, os vetores consistiram de uma fileira
de dados. No entanto, a Linguagem C permite vetores bi, tri e multidimensionais.
O melhor modo de visualizar uma matriz bidimensional e´com uma tabela com linhas
e colunas. Se um vetor contem tres dimensoes, visualize-a como varias páginas,
cada uma das quais contendo uma tabela bidimensional.
Exemplo:
Exemplo:
linhas colunas
int tabela [2] [3] = {{1,2,3}, {4,5,6}};
linha 1 linha 2
Exemplo:
*/
#ifdef ex4
int tabela [2] [3] = {{10,20,30}, {40,50,60}}; /* vetor bidimensional*/
main()
{
clrscr();
clrscr();
/*
8. Serie de caracteres ou strings
String e´um vetor do tipo char que armazena um serie de caracteres terminado
pelo carater finalizador \0. Traduzindo, string e´uma serie de caracteres, onde
cada um deste caracteres ocupa um byte de memoria, sao armazenados em sequencia e com
o ultimo byte sendo o finalizador \0. Cada caracter e´ um elemento independente do
vetor e portanto pode ser acessado por meio de um indice.
Exemplo:
9. Inicializando strings
Lembrando que qualquer vetor pode ser inicializado se for uma variavel global ou
static.Com as strings nao e´diferente. Podemos inicializar um vetor de strings de
2 formas:
1 - Inicializando letra por letra como nos vetores numerico. Neste caso, o finalizador
14
deve ser colocado explicitamente.
Exemplo:
*/
#ifdef ex6
char f[]={'A','B','C','D','E','F','G','H','I','J'};
/* variavel externa do tipo caracter, com inicializacao letra por letra
Aqui nao tem finalizador. Sem contar o n. de caracteres*/
main()
{
clrscr();
printf("As letras sao: \n");
printf(" %c",f[0]);
printf(" %c",f[1]);
printf(" %c",f[2]);
printf(" %c",f[3]);
printf(" %c",f[4]);
printf(" %c",f[5]);
printf(" %c",f[6]);
printf(" %c",f[7]);
printf(" %c",f[8]);
printf(" %c",f[9]);
}
#endif
#ifdef ex7
char f[10]={'Z','Y','X','W','V','U','T','S','R','Q'};
/* idem ao anterior. Contando o n. de elementos do vetor. */
main()
{
clrscr();
printf("As letras sao: \n");
printf(" %c %c %c %c %c %c %c %c %c %c",f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9]);
}
#endif
/*
2 - Inicializando como string. Neste caso o finalizador e´colocado automaticamente.
Lembrando ainda que o finalizador tabem e´um caracter, portanto ocupa uma posicao
no vetor.
Exemplo:
*/
#ifdef ex8
main()
{
/* variavel static local do tipo caracter. Sem contar o n. de caracteres*/
clrscr();
printf(" As letras sao: \n");
printf(" %c",f[0]);
printf(" %c",f[1]);
printf(" %c",f[2]);
printf(" %c",f[3]);
printf(" %c",f[4]);
printf(" %c",f[5]);
printf(" %c",f[6]);
printf(" %c",f[7]);
printf(" %c",f[8]);
printf(" %c\n\n",f[9]);
#endif
#ifdef ex9
15
char f[11]="zyxwvutsrq";
/* idem ao anteiror. Contando o n. de caracteres.*/
main()
{
clrscr();
printf(" As letras sao: \n");
printf(" %c",f[0]);
printf(" %c",f[1]);
printf(" %c",f[2]);
printf(" %c",f[3]);
printf(" %c",f[4]);
printf(" %c",f[5]);
printf(" %c",f[6]);
printf(" %c",f[7]);
printf(" %c",f[8]);
printf(" %c\n\n",f[9]);
/*
10. Um vetor de strings
Anteriormente nos estudamos vetores com mais de uma dimensao. Uma string e´um vetor
unidimensional. Portanto, se juntarmos um conjunto de strings num unico vetor teremos
um vetor bidimensional.
Exemplo:
char semana [7] [14]; vetor do tipo char com 7 linha(string) e 14 colunas(as
strings com no maximo 14 caracteres
Para aceesar uma string no vetor de strings usa-se apenas o primeiro índice do vetor.
nome_da_variável [num_de_strings];
Exemplo:
exemplo:
Exemplo:
*/
#ifdef ex10
char semana [7] [14] = { "Domingo" ,
"Segunda-feira",
"Terca-feira",
"Quarta-feira",
"Quinta-feira",
"Sexta-feira",
16
"Sabado",
};
main()
{
clrscr();
}
#endif
#ifdef ex11
char semana [7] [14] = { "Domingo" ,
"Segunda-feira",
"Terca-feira",
"Quarta-feira",
"Quinta-feira",
"Sexta-feira",
"Sabado",
};
main()
{
clrscr();
}
/**********************************************************************
EXERCICIOS
**********************************************************************1 - Escreva um
programa que tenha os vetores com as inicializacoes abaixo e
imprima-os no video.
10 20 30 40 50 60
123456789012345678901234567890123456789012345678901234567890 regua
string1 string2 string3
10 20 30 40 50
12345678901234567890123456789012345678901234567890 regua
int long unsigned
float double
int long unsigned
float double
int long unsigned
float double
Capitulo 5
/**********************************************************************
ESTRUTURA DE DADOS
**********************************************************************
1. Definicao
Estrutura e' uma variavel composta, formada por uma ou mais variaveis,
possilvelmente de tipos diferentes, colocadas juntas sob um unico nome.
2. Declaracao de estruturas
Somente com esta declaracao nenhuma variável foi criada ainda. Somente o tipo
do dado foi definido. Para declarar uma variável com essa estrutura, usa-se o
seguinte formato:
struct nome_estrutura nome_variavel; -> define o nome da variavel que tem a forma
da estrutura definida anteriormente.
tipo nome_variavel;
Exemplo:
int calendario;
Por analogia de sintaxe, temos a declaracao de uma variavel do tipo estrutura como:
Exemplo:
struct data
{
int dia;
int mes;
int ano;
int dia_ano;
};
2 - se declara a variavel
nome_variavel.membro
Exemplo:
calendario.dia
calendario.mes
calendario.ano
calendario.dia_ano
4. Inicializacao de estruturas
Uma estrutura so' pode ser inicializado se declarado como uma variavel global
ou static local.
Porem se a inicializacao for elemento por elemento, desta pode ser automatica
ou local.
Exemplos: */
18
#ifdef ex1
struct data {
int dia;
int mes;
int ano;
int dia_ano;
};
main()
{
clrscr();
printf("\nProclamacao da Independencia: ");
printf("%d/",calendario.dia);
printf("%d/",calendario.mes);
printf("%d, ",calendario.ano);
printf("%d\n",calendario.dia_ano);
}
#endif
#ifdef ex2
struct data {
int dia;
int mes;
int ano;
int dia_ano;
};
main()
{
static struct data calendario = {15,11,1889,319}; /*variavel static local*/
clrscr();
printf("\nProclamacao da republica: ");
printf("%d/",calendario.dia);
printf("%d/",calendario.mes);
printf("%d, ",calendario.ano);
printf("%d\n",calendario.dia_ano);
}
#endif
#ifdef ex3
struct data {
int dia;
int mes;
int ano;
int dia_ano;
};
main()
{
struct data calendario; /*variavek local */
clrscr();
printf("\nFundacao de Santos: ");
printf("%d/",calendario.dia);
printf("%d/",calendario.mes);
printf("%d, ",calendario.ano);
printf("%d\n",calendario.dia_ano);
}
#endif
/*
Uma estrutura dentro de outra estrutura nada mais e' que uma variavel composta
dentro de outra variavel composta pois, as estruturas podem ser compostas por
qualquer tipo de variavel.
Para acessar os membros de uma estrutura dentro de outra estrutura usamos o mesmo
operador ponto(.) referenciando estes da esuqerda para a direita e do mais externo
19
para o mais interno no seguinte formato:
nome_variavel.nome_variavel.membro
Para se inicializar uma estrutura dentro de outra estrutura tambem vale os mesmos
conceitos das estruturas simples.
Exemplo:*/
#ifdef ex4
struct relogio{
int hora;
int minutos;
int segundo;
};
struct data {
int dia;
int mes;
int ano;
int dia_ano;
struct relogio tempo; /* declaracao de uma variavel tipo estrutura de nome
"tempo" dentro de outra variavel tipo estrutura */
};
/*
struct data calendario = {7,9,1822,250,20,50,10};
outra forma para inicializar a variavel tipo estrutura de nome "tempo"
dentro da variavel calendario */
main()
{
clrscr();
printf("\nA data e': ");
printf("%d/",calendario.dia);
printf("%d/",calendario.mes);
printf("%d, ",calendario.ano);
printf("%d ",calendario.dia_ano);
#endif
/*
Exemplo:
struct data {
int dia;
int mes;
int ano;
int dia_ano;
char nome_mes[9]; declara um matriz tipo caracter de nome "nome_mes"
com 9 elementos dentro de uma estrutura
};
Exemplo:*/
#ifdef ex5
struct data {
int dia;
int mes;
int ano;
int dia_ano;
char nome_mes[9];
20
};
main()
{
clrscr();
printf("\nProclamacao da republica: ");
printf("%d/",calendario.dia);
printf("%d/",calendario.mes);
printf("%d, ",calendario.ano);
printf("%d - ",calendario.dia_ano);
printf("%s\n",calendario.nome_mes); /* imprime nome_mes com string*/
/*
7. Vetor de estruturas
Exemplo:
definicao da estrutura:
struct data {
int dia;
int mes;
int ano;
int dia_ano;
char nome_mes[10];
};
declaracao do vetor
Exemplo:
calendario[0].dia -> busca o elemento de indice 0 do vertor de
estrutura e o membro dia deste elemento
Exemplo: */
#ifdef ex6
struct data {
int dia;
int mes;
int ano;
int dia_ano;
char nome_mes[10];
};
main()
{
clrscr();
21
printf("\nProclamacao da Independencia: ");
printf("%d/",calendario[0].dia);
printf("%d/",calendario[0].mes);
printf("%d, ",calendario[0].ano);
printf("%d - ",calendario[0].dia_ano);
printf("%s\n",calendario[0].nome_mes);
}
#endif
/*
8. Typedef
A Linguagem C permite definir explicitamente novos nomes de tipos de dados
usando-se a palavra reservada typedef. Nao se cria um novo tipo de dado, mas,
ao contrario, define-se um novo nome para um tipo existente. Ele tambem
auxilia na documentacao do seu codigo por permitir nomes descritivos para
tipos de dados padroes.
Exemplo:
typedef int inteiro;
typedef float flutuante;
#ifdef ex7
struct data{
int dia;
int mes;
int ano;
int dia_ano;
};
main()
{
clrscr();
printf("\nProclamacao da Independencia: ");
printf("%d/",calendario.dia);
printf("%d/",calendario.mes);
printf("%d ",calendario.ano);
printf("%d\n",calendario.dia_ano);
}
/**********************************************************************
EXERCICIOS
**********************************************************************
1 - Escreva um programa que tem uma estrutura da dados com os membros
abaixo e inicialize-a com algum conteudo. Imprima estes conteudos no
video.
char int float double long int
unsigned char unsigned int unsigned long
Capitulo 6
/**********************************************************************
COMANDOS
**********************************************************************
Toda linguaguem de programacao para computador precisa oferecer um minimo de
tres formas basicas de controle:
1- if
O comando "if" representa uma tomada de decisao do tipo "SE isto ENTAO aquilo".
- if (expressao)
declaracao;
- if (expressao)
{
declaracao;
declaracao;
}
Exemplo: */
#ifdef ex1
main()
{
char ch;
clrscr();
if(ch == 'r')
printf("\nVoce digitou a tecla r");
getchar();
}
#endif
#ifdef ex2
main()
23
{
char ch;
clrscr();
if(ch == 'r')
{
printf("\nVoce digitou a tecla r");
printf("\nparabens voce acertou");
}
getchar();
}
#endif
/*
2 - if - else
o comando "if-else" e' uma expansao do comando "if". No comando "if" so' se excuta
a declaracao ou declaracoes se a expressao for verdadeira(== 1). O comando "else"
permite executar outra declaracao ou declaracoes se a expressao for falsa(== 0).
Resumindo, se a expressao for verdadeira(== 1) executa-se as declaracoes antes do
"else", se a expressao for falsa(== 0) executa-se as declaracoes depois do "else".
- if (expressao)
declaracao1;
else
declaracao2;
- if (expressao)
{
declaracao1;
declaracao1;
}
else
{
declaracao2;
declaracao2;
}
Exemplo: */
#ifdef ex3
main()
{
char ch;
clrscr();
if(ch == 'r')
printf("\nVoce digitou a tecla r");
else
printf("\nVoce nao digitou a tecla r");
getchar();
}
#endif
#ifdef ex4
main()
{
char ch;
clrscr();
if(ch == 'r')
{
printf("\nVoce digitou a tecla r");
printf("\nparabens voce acertou");
}
else
{
printf("\nVoce nao digitou a tecla r");
printf("\nque azar voce errou");
}
getchar();
}
/*
3 - if-else aninhados ou encadeados
- if (expressao 1)
declaracao1;
else
if (expressao 2)
declaracao2;
else
declaracao3;
- if (expressao 1)
{
declaracao1;
declaracao1;
}
else
if(expressao 2)
{
declaracao2;
declaracao2;
}
else
{
declaracao3;
declaracao3;
}
Exemplo:*/
#ifdef ex5
main()
{
int opcao;
int valor;
clrscr();
printf ("Converter: \n");
printf ("1: decimal para hexadecimal\n");
printf ("2: hexadecimal para decimal\n");
printf ("\nInforme sua opcao: ");
scanf ("%d", &opcao);
if (opcao == 1)
{
printf ("\nInforme o valor em decimal: ");
scanf ("%d", &valor);
printf ("%d em hexadecimal e: %x", valor, valor);
}
else if (opcao == 2)
{
printf ("\nInforme o valor em hexadecimal: ");
scanf ("%x", &valor);
printf ("%x em decimal e: %d", valor, valor);
25
}
else
{
printf ("\nA opção escolhida e' invalida.");
}
getchar();
getchar();
}
#endif
/*
4 - switch
Pode muitas vezes substituir o comando "if" por um comando "switch". Mas sem
duvida alguma, o mais importante dos dois comando e' o "if", mas o comando
switch tem aplicacoes valiosas. Vale lembrar que devemos procurar usar o comando
certo no local certo. Isto assegura um codigo limpo e de facil entendimento.
switch (variavel)
{
case constante_1:
declaração_1;
break;
case constante_2:
declaração_2;
break;
.
.
.
case constante_n:
declaração_n;
break;
default
declaração_default;
}
1) O comando “switch” difere do comando "if” porque “switch” so' pode testar
igualdade, enquanto “if” pode avaliar uma expressao logica ou relacional;
2) Duas constantes “case” no mesmo “switch” não podem ter valores iguais.
Porem, um comando “switch” incluído em outro “switch” mais externo pode
ter as mesmas constantes “case”.
5 - break
O comando “break” que voce viu logo apos a linha de comando do “case”,e' chamado
de comando de desvio, onde ele realiza um desvio incondicional.O “case” sera'
executado ate' que o comando “break” ou o fim do “switch” seja alcançado.
Quando o comando “break” e' alcancado o programa salta para a declaracao seguinte
ao final do “switch” (o fecha chave }). Caso nao tivessemos inserido o “break” o
programa continuaria testando os demais “cases” e poderia causar um erro no
programa.
O comando "break" tem uma segunda aplicacao. Ele tambem e' utilizado com os comandos
de controle de repeticao que veremos mais adiante.
Exemplo:*/
#ifdef ex6
main()
{
int opcao;
int valor;
26
clrscr();
printf ("Converter: \n");
printf ("1: decimal para hexadecimal\n");
printf ("2: hexadecimal para decimal\n");
printf ("\nInforme sua opcao: ");
scanf ("%d", &opcao);
switch(opcao)
{
case 1 :
{
printf ("\nInforme o valor em decimal: ");
scanf ("%d", &valor);
printf ("%d em hexadecimal e': %x", valor, valor);
break;
}
case 2 :
{
printf ("\nInforme o valor em hexadecimal: ");
scanf ("%x", &valor);
printf ("%x em decimal e': %d", valor, valor);
break;
}
default:
{
printf ("\nA opcao escolhida e' invalida.");
}
}
getchar();
getchar();
}
#endif
#ifdef ex7
main()
{
char x;
clrscr();
printf("digite uma letra --> ");
x = getchar();
getchar();
switch(x)
{
case 'f' : printf("voce digitou a letra f\n\n");
case 'a' : printf("voce digitou a letra a\n\n");
case 't' : printf("voce digitou a letra t\n\n");
case 'e' : printf("voce digitou a letra e\n\n");
case 'c' : printf("voce digitou a letra c\n\n");
default : printf("esta letra nao existe\n\n");
}
getchar();
}
#endif
/*
6 - goto
O "goto" e' o ultimo comando de controle de fluxo. Ele pertence a uma classe
a parte: a dos comandos de salto incondicional. O 'goto" realiza um salto
para um local especificado. Este local é determinado por um label ou rotulo.
O comando "goto" deve ser utilizado com parcimonia, pois o abuso no seu uso
tende a tornar o codigo confuso. O "goto" nao e' um comando necessario, podendo
sempre ser substituído por outras estruturas de controle. Porém, em algumas
situacoes muito especificas o comando "goto" pode tornar um programa mais facil
de se entender se ele for bem empregado.
label:
goto label;
Exemplo: */
#ifdef ex8
main()
{
int conta = 1;
27
clrscr();
printf("imprime os numeros de 1 a 100\n\n");
rotulo:
printf("%d ", conta++);
if (conta <= 100)
goto rotulo;
getchar();
}
#endif
/**********************************************************************
Os comandos de controle de repeticao permite que um conjunto de instrucoes seja
executados ate que uma condicao seja encontrada. Os comandos sao: for, while e
do - while.
7 - for
declaracao;
Exemplo:*/
#ifdef ex9
main()
{
int x;
clrscr();
for (x = 1; x <= 23; x++)
printf ("este e' o valor da variavel de controle x: %d \n", x);
getchar();
}
#endif
#ifdef ex10
main()
{
int i;
clrscr();
for (i = 0; i <= 20; i++)
{
printf ("Este e' o valor de i: %d ", i);
printf (" e i ao quadrado e': %d\n", i * i);
}
getchar();
}
#endif
#ifdef ex11
/*
Imprime todos os primos entre 2 e 100
usa um for dentro de outro for
*/
main()
{
int i,n;
28
clrscr();
printf("imprime os n. primos de 2 a 100\n\n");
/*
8 - Laco infinito ou loop infinito
Um comando "for" sem a expressao 2 ou seja, sem teste logico, e' sempre verdade.
Isso caracteriza um loop infinito. Normalmente o loop infinito nao tem as 3
expressoes de controle.
declaracao;
for (;;)
declaracao;
Exemplo:*/
#ifdef ex12
main()
{
clrscr();
for ( ; ; )
printf ("Este laco sera' executado para sempre.\n");
}
#endif
/*
9 - break
Lembrando que ja' vimos o comanado "break" quando estudamos o comando "switch".
Aqui temos outra aplicacao do comando "break". Ele forca a saida incondicional
de um laco. Este laco pode ser infinito ou nao.
Exemplo:*/
#ifdef ex13
main()
{
char ch;
int cont = 0;
clrscr();
printf("digite uma letra ate' sair do loop\n");
for ( ; ; )
{
ch = getchar(); //lê um caractere
getchar();
if (ch == 'a' )
break; //sai do laço
cont = cont + 1;
}
printf ("\nVoce acertou que e'a letra 'a' depois de %d tentativas\n",cont);
getchar();
}
#endif
/*
10 - while
Em muitos casos, os programas precisam repetir uma ou mais declaracoes ate' que
o laco atenda a uma condicao especifica que nao envolva necessariamente uma
contagem.
while (condicao)
declaracao;
while (condicao)
{
declaracao;
declaracao;
}
Assim como no "for", o comando 'while" sem a condicao logica gera um loop
infinito, pois esta sera' sempre verdade.
while ()
declaracao;
Exemplo:*/
#ifdef ex14
main()
{
char ch;
clrscr();
printf("digite uma letra ate' sair do loop\n");
while (ch != 'a' )
ch = getchar(); //lê um caractere
#ifdef ex15
/* calcula o quadrado de um numero */
main()
{
double y,x;
double fat;
clrscr();
printf("digite um numero: ");
scanf("%lf",&x);
getchar();
fat = 1;
y = 1;
while (y < x)
{
y = y + 1;
fat = fat * y;
}
getchar();
}
#endif
/*
11 - do - while
do
{
declaracao;
}while (condicao);
do
{
declaracao;
declaracao;
}while (condicao);
Exemplo:*/
#ifdef ex16
main()
{
int num;
clrscr();
#ifdef ex17
main()
{
double y,x;
double fat;
char tecla;
clrscr();
do
{
printf("\ndigite um numero: ");
scanf("%lf",&x);
getchar();
fat = 1;
y = 1;
while (y < x)
{
y = y + 1;
fat = fat * y;
}
/*
12 - continue
Exemplos:*/
#ifdef ex18
main()
{
int x,y;
y=0;
clrscr();
do
{
printf("\nTentativa %d \n- digite um numero: ",y+1);
scanf("%d",&x);
y = y + 1;
if (x % 2)
continue;
printf("\t\to numero %d e' par\n",x);
}while(y < 5);
printf("\n\nfim");
getchar();
getchar();
}
#endif
#ifdef ex19
main()
{
int x,y;
clrscr();
for(y = 1;y < 6;y++)
{
printf("\ntentativa %d \n- digite um numero: ",y);
scanf("%d",&x);
if (!(x % 2))
continue;
printf("\t\to numero %d e' impar\n",x);
}
printf("\n\nfim");
getchar();
getchar();
}
/**********************************************************************
EXERCICIOS
**********************************************************************
1 - Reescreva o programa do exercicio 1 de vetores utilizando os 3 comandos
de loop while, do-while e for para os 3 vetores. são 9 loops.
7 - Considerando o alfabeto, escreva um programa para receber via teclado uma letra
e mostrar, com as mensagens "vogal minuscula", "vogal maiuscula","consoante
minuscula", "consoante maiuscula", em qual categoria ela se encaixa. Utilize o
comando switch.
32
Capitulo 7
/**********************************************************************
PONTEIROS OU APONTADORES
**********************************************************************
1. Como funciona os ponteiros?
Um ponteiro tambem tem tipo. Veja: quando voce anota o endereco de um amigo voce
o trata diferente de quando voce anota o endereco de uma empresa. Apesar do
endereco dos dois locais ter o mesmo formato (rua, umero, bairro, cidade, etc.)
eles indicam locais cujos conteudos são diferentes. Entao os dois enderecos sao
ponteiros de tipos diferentes.
p f
-------------------------------->
| |
-------------------------------------------------------------------
....| xxx | xxx | 308 | ...... | xxx | xxx | ´i´ | xxx | ....
-------------------------------------------------------------------
$100 $101 $102 $306 $307 $308 $309
2. Definicao
Ponteiro e' uma variavel que, diferentemente das outras, nao contem o valor
de um dado, mas aponta para o endereco de outra variavel que o contem.
3. Declaracao de ponteiros
tipo *nome_variavel;
exemplos:
char *pc; declara um ponteiro do tipo char de nome pc
int *pi; declara um ponteiro do tipo int de nome pi
float *pfl; declara um ponteiro do tipo float de nome fl
unsigned *pu; declara um ponteiro do tipo unsigned de nome pd
ponteiro = &nome_variavel;
Exemplos:
declaracao de variaveis
char a = ´p´;
int b =700;
float c = 9.777;
unsigned d = 4000000007;
variavel = *ponteiro
Exemplos:
#ifdef ex1
main()
{
char *pc,w,a = 'p';
int *pi,x,b =700;
float *pf,y,c = 9.777;
unsigned *pu,z,d = 65007;
clrscr();
getchar();
}
#endif
#ifdef ex2
main ()
{
int num;
int *p;
num = 55;
p = # /* atribui o endereco da variavel num ao ponteiro p*/
clrscr();
#ifdef ex3
main()
{
int rx;
int *p;
rx = 200;
p = ℞ /* atribui o endereco da variavel num ao ponteiro p*/
clrscr();
getchar();
}
#endif
/*
6. Ponteiros para estruturas
Podemos utilizar ponteiros para estruturas assim como usamos para variaveis
simples(int,char,...). Uma estrutura e' um tipo de dado como os outros, por isso tambem
podemos utilizar ponteiros para elas.
Exemplo:
struct data *p; declaramos um ponteiro "p" para a estrutura de
nome data
ponteiro = &nome_variavel;
Exemplo:
p = &calendario;
Fazendo uma analogia com as variaveis simples, observamos que as 2 declaracoes acima sao
identicas. Vamos a um exemplo comparando as declaracoes.
variaveis simples
int *p, x, y;
p = &x;
estruturas
struct data *pc, calendario;
pc = &calendario;
A diferenca vem quando queremos buscar os dados da variavel. No caso das variaveis simples
buscamos assim:
y = *p;
y = (*p).dia;
(*ponteiro).elemento;
Exemplo:*/
#ifdef ex4
struct data {
int dia;
35
int mes;
int ano;
int dia_ano;
char nome_mes[9];
};
main()
{
struct data *p;
clrscr();
getchar();
}
#endif
/*
Mas raramente encontramos referencias feitas a um campo de uma estrutura com
uso explicito do operador *. O acesso a um campo de uma estrutura por meio de
um ponteiro para a dada estrutura e' tão comum, que um operador especial foi definido pela
Linguagem C realiza esta tarefa. Ele é o ->, chamada de operador seta. Ele e' formado
utilizando-se o sinal de menos(-) seguido por um sinal de maior que(>). O operador seta e'
usada no lugar do operador ponto, quando se acessa um campo da estrutura utilizando-se um
ponteiro para a variavel estrutura.
No nosso exemplo:
y = p -> dia;
Exemplo:*/
#ifdef ex5
struct data {
int dia;
int mes;
int ano;
int dia_ano;
char nome_mes[9];
};
main()
{
struct data *p;
clrscr();
p=&calendario;
getchar();
}
#endif
/*
7. Aritmetica de ponteiros
- Igualar 2 ponteiros
36
Se temos dois ponteiros p1 e p2 podemos iguala'-los fazendo p1=p2. Repare que
estamos fazendo com que p1 aponte para o mesmo lugar que p2.
Se voce incrementa um ponteiro do tipo char* ele anda 1 byte na memoria (lembrete:
char ocupa 1 byte na memoria) e se voce incrementa um ponteiro
do tipo double* ele anda 8 bytes na memoria(lembrete: double ocupa 8 bytes na memoria). O
decremento funciona semelhantemente. Supondo que p é um ponteiro, as operações são escritas
como:
Lembrando que estamos falando de operacoes com ponteiros e nao de operacoes com o
conteúdo das variaveis para as quais eles apontam.
Obs.: porque usamos o operador parenteses? por que tanto o operador soma quando o operador
incrementa tem prioridade maior que o operador conteudo (*).
Exemplo:
*/
#ifdef ex6
main()
{
static int z[5]={5,10,15,20,25};
int *p;
int b;
clrscr();
/*
- Somar ou subtrar valores inteiros dos ponteiros
Exemplo:
#ifdef ex7
main()
{
static int z[5]={5,10,15,20,25};
int *p,*p1;
37
int b;
clrscr();
p=&z[0];
/*
-Podemos ainda atribuir um end. de memoria determinado direto a um ponteiro.
Isto porem e' perigoso quando nao se conhece o hardware e firmware da maquina
que se esta utilizando.
exemplo:
px=0xf853; o ponteiro "px" aponta para o end. f853(hexa) da memoria
/*
8. Ponteiros e vetores
O relacionamento entre ponteiros e vetores e' tao estreito que deveriam ser
tratados juntos.
E'importante lembra que um vetor e' um conjunto de posicoes contiguas de memoria ocupando
varios bytes, ao passo que um ponteiro e' constituido normalmente de 2 ou 4 bytes que servem
para armazenar o end. da variavel apontada.
exemplo:
int z[20]; declara um vetor "z" com 20 posicoes
int *p; declara um ponteiro para uma variavel tipo inteira
O formato para acessar os elementos do vetor como vimos no capitulo de vetores e':
nome da variavel[indice];
O formato para acessar o mesmo elemento utilizando o ponteiro e aritmetica de ponteiros e':
*(ponteiro + indice);
E temos mais uma forma para acessar o mesmo elemento que equivale a:
ponteiro[indice];
Esta forma e' possivel por que se o ponteiro aponta para um elemento no vetor e o indice
soma o numero de elementos para o qual se quer aponta, lembrando que o ponteiro leva em
conta o tipo de variavel apontada, entao esta expressão e' equivale a expresao da
aritmetica de ponteiro.
#ifdef ex8
main()
{
static int z[5]={1,2,3,4,5}; /* declara um vetor de 5 elementos*/
int *p; /* declara um ponteiro int */
int b;
38
clrscr();
#ifdef ex9
main()
{
static int z[5]={10,20,30,40,50}; /* declara um vetor de 5 elementos*/
int *p; /* declara um ponteiro int */
int b;
clrscr();
#ifdef ex10
main()
{
static int z[5]={100,200,300,400,500}; /* declara um vetor de 5 elementos*/
int *p; /* declara um ponteiro int */
int b;
clrscr();
for(b=0;b <5 ;b++)
{
p=&z[b]; /* atribui ao ponteiro "p" o end. de cada
um dos elementos do vetor "z" */
printf("exibe o conteudo do %d. elemento do vetor z = %d\n",b+1,*p);
}
getchar();
}
#endif
#ifdef ex11
main()
{
static int z[5]={1000,2000,3000,4000,5000}; /* declara um vetor de 5 elementos*/
int *p; /* declara um ponteiro int */
int b;
clrscr();
p=&z[0]; /* atribui ao ponteiro "p" o end. do 1. elemento do vetor "z"*/
#ifdef ex12
main()
{
static int z[5]={6000,7000,8000,9000,10000};
int *p;
int b;
clrscr();
p=&z[0]; /* atribui ao ponteiro "p" o end. do 1. elemento do vetor "z"*/
#ifdef ex13
main()
{
static char z[16]="teste de string";
char *p;
int b;
clrscr();
p=&z[0]; /* atribui ao ponteiro "p" o end. do 1. elemento do vetor "z"*/
#ifdef ex14
main()
{
static char *p ="string com ponteiro";
int b;
clrscr();
tipo *nome_variavel[n._elementos];
exemplos:
char *pc[5]; vetor de ponteiros para caracter
int *pont[10]; vetor de ponteiros para inteiro
float *fl[20]; vetor de ponteiros para pto. flut.
struct data *prt[30]; vetor de ponteiros para estruturas
exemplo:
p[2]=&x; atribui ao 3. elementos do vetor de ponteiros
"p" o end. da variavel "x"
#ifdef ex15
main()
40
{
int x;
char *z[5]; /* declara um vetor de ponteiros */
z[0] = &a[0];
z[1] = &b[0];
z[2] = c;
z[3] = d;
z[4] = e;
clrscr();
for(x=0;x <5 ;x++)
{
printf("imprime o conteudo do %d. elemento do vetor z = %s\n",x,z[x]);
}
getchar();
}
#endif
#ifdef ex16
main()
{
int x;
char *z[5];
/* inicializa o vetor de ponteiros */
clrscr();
#ifdef ex17
main()
{
char *psemana [7] = { "Domingo" ,
"Segunda-feira",
"Terca-feira",
"Quarta-feira",
"Quinta-feira",
"Sexta-feira",
"Sabado",
};
clrscr();
/**********************************************************************
EXERCICIOS
**********************************************************************
1 - Imprima no video os mesmos conteudos do exercicio 1 de vetores porem
utilizando ponteiros.
10 20 30 40 50 60
41
123456789012345678901234567890123456789012345678901234567890
int long unsigned
float double
Capitulo 8
/**********************************************************************
FUNCOES
**********************************************************************
1 - Conceito de funcao
2 - Definicao
Funcao e' um conjunto de instrucoes e declaracoes desenhadas para cumprir uma determinada
tarefa e referenciada por um nome.
A principal razao para usar funcoes e' dividir uma tarefa em outras pequenas tarefas que
simplificam e organizam o programa como um todo.
Outra razao para escrever funcoes e' a de reduzir o tamanho do programa. Qualquer sequencia
de instrucoes ou declaracoes que apareca no programa mais de uma vez e' candidata a se
transformar em uma funcao.
Uma funcao e' escrita no programa uma unica vez mas pode ser executado muitas vezes durante
a execucao do programa.
A funcao, uma vez desenvolvida e testada, passa a ser completamente transparente ao usuario,
que so' necessita saber sua utilidade, as informacoes de entradas e infomacoes de saida,
podendo abster-se de todos os detalhes de sua implementacao. Um exemplo disso sao as funcoes
printf, scanf, gets, puts que temos utilizado sem saber como foram construidas.
Chamar uma funcao e' desviar o fluxo do programa para que uma tarefa seja executada.
Terminada esta tarefa chamada, o fluxo do programa retorna para a declaracao seguinte a da
chamada da funcao.
Varias funcoes, como o printf(), sao desenvolvidas pelo fabricante do compilador e juntadas
ao programa pelo linkeditor. Sao as chamadas funcoes de biblioteca. Podemos tambem escrever
nossas proprias funcoes no programa.
nome_da_funcao(parametros);
Exemplo:
printf("teste");
soma(a,b);
A estrutura de uma funcao em C e' semelhante a estrutura da funcao main(). A unica diferenca
e' que a funcao main() tem um nome especial.
{
declaracao de variaveis;
comandos;
funcoes;
}
tipos dos parametros ---> Se houve parametros, entao o tipo das variaveis
destes deve ser declarado.
Exemplo:*/
#ifdef ex1
main()
{
clrscr();
imprimir_mensagem();
imprimir_mensagem()
{
printf("\t\t Voce esta' na funcao 1\n");
printf("\t\t esta funcao foi chamada pela funcao main()\n");
printf("\t\t fim da funcao 1\n\n");
}
#endif
/*
3 - Passagem de parametros
Neste metodo, quando uma funcao e' chamada, a função que chamou faz copias dos valores a
serem enviados para a funcao chamada. Dessa forma os valores originais nao podem ser
alterados, pois a funcao chamada manipula apenas as copias dos mesmos. Na funcao chamada sao
criadas variaveis do mesmo tipo da funcao que chamou que guardarao a copia destes valores.
Lembrando que as variaveis que recebem os parametors ou informcoes da funcao que chamou e as
que estao dentro da funcao chamada sao variaveis locais. Portanto, quando a execucao da
funcao se encerra as variaveis sao destruidas ou seja, o seu conteudo e' perdido.
Exemplo:*/
#ifdef ex2
clrscr();
troca(a,b);
soma(a,b);
getchar();
}
/* funcao troca valores */
troca(x,y)
int x,y;
{
int c;
printf("\tfuncao troca()\n");
43
printf("\ttroca os valores da variaveis x e y que sao\n");
c = x;
x = y;
y = c;
c = i + j;
printf("\tfuncao soma()\n");
/*
Como vimos, quando passamos parametros ou informacoes por valor, a funcao chamada cria novas
variaveis do mesmo tipo dos parametros ou informacoes passados e copia nelas os valores
passados pela funcao que chamou.
Na passagem de parametros ou informacoes por refencencia a funcao que chama passa para a
funcao chamada o endereco das variaveis. A funcao chamada cria variaveis para receber esses
enderecos ou seja cria ponteiros que devem ser do mesmo tipo das variaveis que estao sendo
passada.
Diferentemente da passagem de parametros por valor onde nao podemos alterar os valores das
variaveis que sao passadas para a funcao chamada, aqui os conteudos
originais ou seja das variaveis da funcao que chama podem ser alterados.
Lembrando que atraves dos ponteiros podemos acessar o conteudos da variaveis de maneira
indireta.
*/
#ifdef ex3
clrscr();
troca(&a,&b);
getchar();
}
troca(p1,p2)
int *p1,*p2;
{
int c;
printf("\tfuncao troca()\n");
c = *p1;
*p1 = *p2;
*p2 = c;
44
}
#endif
#ifdef ex4
main()
{
int z[10],i;
clrscr();
display(z);
display(pont)
int *pont;
{
int i;
printf("\tfuncao display\n");
printf("\timprime na tela os valores do vetor z via o ponteiro \n");
printf("\tpont que aponta para o 1. elemento do vetor\n");
#ifdef ex5
struct data {
int dia;
int mes;
int ano;
int dia_ano;
char nome_mes[10];
};
main()
{
struct data *prt;
clrscr();
prt=&calendario;
imp(prt);
imp(pont)
struct data *pont;
{
printf("\tfuncao imp()\n");
4 - Retorno de funcao
Uma funcao chamada pode retornar um valor ou nenhum a funcao que a chamou.
Para retornar uma valor a funcao que chamou utilizamos o comando return.
A utilizacao do comando return e' opcional quando nao ha' retorno de valor.
Exemplo: */
#ifdef ex6
main()
{
int a,b,c;
a = 100;
b = 200;
clrscr();
c = soma(a,b);
soma(x,y)
int x,y;
{
int z;
z = x + y;
return(z);
}
#endif
/*
- Definindo o tipo do valor de retorno
Os valores devolvidos pelo comando return sao inteiros por default como no exemplo anterior.
Quando nao existe valor devolvido, se a funcao que chamou estiver esperando algum valor
recebera lixo e pode ocorrer erro de logica nao detectavel pelo compilador.
As funcoes podem devolver valores nao inteiros. Para isto devemos especificar
claramente o tipo de retorno na funcao chamada e declarar tambem este mesmo tipo
na funcao de chamada.
tipo_de_retorno funcao();
Exemplo:*/
#ifdef ex7
main()
{
float a,b,c;
46
float soma();
a = 3957.779;
b = 43558.357;
clrscr();
c = soma(a,b);
float soma(x,y)
float x,y;
{
float z;
z = x + y;
return(z);
}