Capitulo 6 Subprogramas
Capitulo 6 Subprogramas
6
pelas suas roupas ou pelos seus bens, o
verdadeiro valor de um homem é o seu
carácter, suas ideias e a nobreza de
seus ideais. ” SubProgramas
- Charles Chaplin -
Sumário:
6.1- Motivação
6.2- Conceitos
6.3-Estrutura de um Programa
6.4- Definição das Funções
6.5-Declaração de Funções
6.6- Valor de Retorno
6.7-Função Principal
6.8- Chamada da Função
6.9- Parâmetros
6.10- Chamada de uma Função por Outra
6.11- Procedimentos
6.12- Passagem de Parâmetros
6.13- Variáveis Locais e Globais
6.14- Exercícios Resolvidos
6.15- Exercícios Propostos
6.16-Trabalhos de Programação
174
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Este capítulo tem por objectivo ensinar a desenvolver subprogramas para serem
incorporados em programas de médio porte, tornando desse modo, o
desenvolvimento do software mais fácil e fléxivel. No seu término o leitor deverá
ser capaz de:
6.1 - Motivação
Um dos aspectos fundamentais da programação é a decomposição de um
programa em vários subprogramas. Essa decomposição tem por objectivo
diminuir a complexidade do problema, partindo-o em partes mais simples.
Cada subprograma tem por finalidade resolver um problema específico, que será
posteriormente integrado no programa atravêz de um subprograma principal.
𝐦
m!
( )=
p!(m−p)!
𝐩
Versão 1
1- Calcular m!;
2- Calcular p!;
3- Calcular (m-p)!;
4- Calcular a combinação;
175
Fundamentos de Programação em C: Uma Abordagem Algorítmica
6.2 - Conceitos
Entendemos por subprogramas, um segmento de código com uma estrutura
muito semelhante à de um programa, que tem por objectivo resolver um
problema específico.
Todo o subprograma deve ser identificado por um nome. Esse nome deve
mostrar de forma clara a tarefa que esse subprograma realiza. Se não
conseguirmos escolher um nome conciso para um determinado subprograma é
porque ele realiza muitas tarefas diferentes. A melhor solução é dividir esse
subprograma em vários subprogramas mais simples.
176
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Qualquer sequência de instruções que aparece mais do que uma vez num
programa é um forte candidato para ser um subprograma.
Segundo Deitel (2011), as funções não devem ser maior do que uma página. O
ideal é que elas tenham no máximo o tamanho de meia página. Essa práctica de
programação facilita a reutilização do software.
Directivas de pré-processamento
Declaração das funções
Definição das funções
Função principal
onde
tipo: Representa um tipo elementar de dados.
177
Fundamentos de Programação em C: Uma Abordagem Algorítmica
178
Fundamentos de Programação em C: Uma Abordagem Algorítmica
return;
return expressão;
return (expressão);
float fahrenheit(int c)
{
return (9.0/5.0*c + 32);
}
Embora uma função retorna um e apenas um valor, ela pode conter no seu corpo
vários comandos return, mas apenas um será executado. Por exemplo, a
função:
recebe um número inteiro e retorna o valor verdadeiro se o número for par e falso
no caso contrário.
Como uma função termina quando acionarmos um dos comandos return, então
podemos escrever uma função equivalente com o comando condicional simples.
O tipo de dados de uma função deve ser igual ao tipo de dados retornado pelo
comando return.
179
Fundamentos de Programação em C: Uma Abordagem Algorítmica
float grausFahr;
.
.
grausFahr = fahrenheit(32); /* Chamada da função */
.
int main()
{
int r, s;
printf ( "\n Entre com um numero inteiro r: " ); scanf ( "%d%,&r );
printf ( "\n Entre com um numero real s:" ); scanf ( "%f",&s );
printf ( "\n valor da soma %f", soma(r,s) ); /* chamada da função */
return 0;
}
180
Fundamentos de Programação em C: Uma Abordagem Algorítmica
soma(4 , 3.14);
soma(a + 3 , (b + 7)/ 2);
6.9 - Parâmetros
Os parâmetros são os canais de comunicação entre a função e o exterior. Que
tipo de informações devem circular nesses canais?
Vimos que a entrada e a saída de dados da função principal era feita pelo
teclado, através da função scanf() e pelo monitor através da função printf().
Isso quer dizer que normalmente, note que está escrito normalmente, não
devemos colocar a função scanf() e a função printf() nessas funções.
1- declarar SENTINELA;
2- declarar variáveis;
3- ler lado1;
4- enquanto lado1 ≠ SENTINELA faça
5- inicio
6- se lado1 ≤ 0 então
7- imprimir("Erro: Lado do retângulo inválido");
181
Fundamentos de Programação em C: Uma Abordagem Algorítmica
8- senao
9- inicio
10- ler lado2;
11- se lado2 ≤ 0 então
12- imprimir(" Erro: Lado do retângulo inválido")
13- senão
14- inicio
15- calcular a área;
16- calcular o perímetro;
17- imprimir resultados;
18- fim
19- fim
20- ler lado1;
21- fim
#define SENTINELA 0
No próximo passo vamos identificar as acções, que devem ser escritas como
subprogramas. Para cada subprograma, a metodologia prevê o estudo da
comunicação com o exterior e o algoritmo que implementa esse subprograma.
1- declarar lado;
2- imprimir (" Entre um lado do retangulo : "); ler (lado);
3- retornar lado;
1- declarar lado;
2- imprimir (" Entre com o outro lado do retangulo:"); ler (lado);
3- retornar lado;
182
Fundamentos de Programação em C: Uma Abordagem Algorítmica
1- declarar lado;
2- imprimir ( "Entre com o lado%d do retangulo:",numeroDoLado);
3- ler (lado);
4- retornar lado;
1- declarar area;
2- calcular area = lado1 * lado2;
3- retornar area;
1- declarar perimetro;
2- calcular perimetro = 2 x ( lado1 + lado2);
3- retornar perimetro;
/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular a área e o perímetro de um retângulo.
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() scanf() */
#include <stdlib.h> /* incluir a funcao stdlib.h */
#define SENTINELA 0
/*--------------------------------------------------------------------------------------------------------
Protótipo de funções
--------------------------------------------------------------------------------------------------------*/
int lerLado (int numeroDoLado);
float calcularArea (float lado1, float lado2);
float calcularPerimetro (float lado1, float lados2);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler um lado do retângulo
Recebe: Número do lado
Retorna: Valor do lado digitado pelo utilizador
--------------------------------------------------------------------------------------------------------*/
int lerDado (int numeroDoLado)
183
Fundamentos de Programação em C: Uma Abordagem Algorítmica
{
int lado;
printf ("\n Entre com um lado%d do retangulo :",&numeroDoLado);
scanf ("%d",&lado);
return lado;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a área do retângulo
Recebe: Lados do retângulo
Retorna: Área
--------------------------------------------------------------------------------------------------------*/
float calcularArea (float lado1, float lado2)
{
return (lado1 * lado2);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o perímetro
Recebe: Lados do retângulo
Retorna: Perímetro
--------------------------------------------------------------------------------------------------------*/
float calcularPerimetro (float lado1, float lado2)
{
return 2 * (lado1 + lado2);
}
/*--------------------------------------------------------------------------------------------------------
Função principal
--------------------------------------------------------------------------------------------------------*/
int main()
{
float x, y, perimetro, area;
x = lerLado (1);
while ( x != SENTINELA )
{
if ( x <= 0 )
printf (" \n Erro: Lado do retangulo invalido");
else {
y = lerLado (2);
if ( y <= 0 )
printf (" \n Erro: Lado do retangulo invalido");
else {
perimetro = calcularArea (x,y);
area = calcularPerimetro (x,y);
printf (" \n Perimetro= %d Area = %d ", perimetro, area);
}
}
x = lerLado (1);
}
184
Fundamentos de Programação em C: Uma Abordagem Algorítmica
system("PAUSE");
return 0;
}
1 1 1 1
h=1+ + + +…+ para n≥ 1
2 3 4 𝑛
Em termos gerais, o algoritmo que resolve este problema pode ser descrito pelos
seguintes passos:
1- declarar variáveis;
2- ler um número inteiro n;
3- se n < 1 então
4- imprimir (“ Erro: número inválido”);
5- senão
6- inicio
7- calcular hormónico do número;
8- imprimir resultados;
9- fim
int n;
float h;
No próximo passo vamos identificar as acções que devem ser escritas como
subprogramas e implementa-las de forma independente.
1- declarar h, i;
2- inicializar h com zeros;
3- para i de n até 1 passo -1 faça
4- calcular h = h + 1/i;
2- retornar h;
185
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor da Série Harmónica
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() scanf() */
#include <stdlib.h> /* incluir a funcao stdlib.h */
/*--------------------------------------------------------------------------------------------------------
Protótipo de funções
--------------------------------------------------------------------------------------------------------*/
int lerNumero ();
float harmonico (int n);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor da série harmónica
Recebe: Número inteiro positivo
Retorna: Valor da série
--------------------------------------------------------------------------------------------------------*/
int harmonico (int n)
{
float h = 0.0;
int i;
for ( i = n; i >= 1; i--)
h += 1/i;
return h;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler um número inteiro
Recebe: Nada
Retorna: Número digitado pelo utilizador
--------------------------------------------------------------------------------------------------------*/
int lerNumero ()
{
int numero;
printf ( "\n Entre com um numero inteiro positivo:" ); scanf ( "%d",&numero );
return numero;
}
/*--------------------------------------------------------------------------------------------------------
Função principal
--------------------------------------------------------------------------------------------------------*/
int main ()
{
float h;
int n;
n = lerNumero ();
186
Fundamentos de Programação em C: Uma Abordagem Algorítmica
if ( n < 1 )
printf (“\n Erro: Numero invalido”);
else
{
h = harmonico(n);
printf(“\n Valor harmonico de %d igual a %f ”,n, h);
}
system(“PAUSE”);
return 0;
}
int main ()
{
int n;
if ( n = lerNumero () < 1
printf (“\n Erro: Numero invalido”);
else
printf (“\n Valor harmonico de %d igual a %f ”,n, harmonico(n) );
system(“PAUSE”);
return 0;
}
Mais uma vez enfatizamos que: " a documentação deve mostrar de forma sucinta
o objectivo de cada função e a comunicação que elas têm com o exterior. Não
se fica a perder tempo em descrever como essas funções resolvem o problema.
Se o leitor por ventura quiser conhecer esses pormenores, deverá ter a
competência para ler o código (feofiloff 09) ".
A maior parte das linguagens de programação permitem que uma função seja
invocada por uma outra. Mas para que essa comunicação seja possível é
necessário implementar em primeiro lugar, a função que é invocada.
187
Fundamentos de Programação em C: Uma Abordagem Algorítmica
1- declarar variáveis;
2- ler um número inteiro n;
2- se n < 0 então
3- imprimir (" Erro: O número deve ser positivo ");
4- senão
5 - inicio
6- para p de 0 até n passo 1 faça
7- inicio
8- calcular combinação de n p a p;
9 imprimir resultado;
10- fim
11- fim
Pelo enunciado, temos como entidade de entrada dois números inteiros positivos
e, como entidade de saída, os valores das respectivas combinações. Isso
permite-nos declarar às seguintes variáveis:
int n, p, comb;
No próximo passo vamos identificar as acções que devem ser resolvidas como
subprogramas e implementa-las de forma independente.
1- declarar fat, i;
2- inicializar fat com 1;
3- para i de 1 até n passo 1 faça
4- Multiplicar fat por i;
5- retornar fat;
Agora, vamos pegar nesse algoritmo para desenvolver um algoritmo que calcula
a combinação de n p a p.
1- declarar comb;
2- calcular comb = factorial(n) / (factorial(p) * factorial (n-p));
3- retornar comb;
188
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular as combinações de n p a p
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() scanf() */
#include <stdlib.h> /* incluir a funcao stdlib.h */
/*--------------------------------------------------------------------------------------------------------
Protótipo de funções
--------------------------------------------------------------------------------------------------------*/
int lerNumero ();
int factorial (int n);
float combinação (int n, int p);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o factorial de um número inteiro
Recebe: Número inteiro
Retorna: Factorial desse número
--------------------------------------------------------------------------------------------------------*/
int factorial (int n)
{
int i, fat;
for ( fat = 1, i = 1; i <= n; i++)
fat += i;
return fat;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler um número inteiro
Recebe: Nada
Retorna: Valor do número inteiro
--------------------------------------------------------------------------------------------------------*/
int lerNumero ()
{
int numero;
printf ("\n Entre com um numero inteiro positivo:"); scanf ("%d",&numero);
return numero;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a combinação de n p a p
Recebe: Valor de n e valor de p
Retorna: Combinação de n p a p
--------------------------------------------------------------------------------------------------------*/
float combinacao (int n, int p)
{
return ( factorial(n)/( factorial(r)*factorial(n-r) ) );
189
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*--------------------------------------------------------------------------------------------------------
Função principal
--------------------------------------------------------------------------------------------------------*/
int main()
{
int n, p;
if (n = lerNumero() <= 0 )
printf (" \n Erro: Numero deve ser positivo ");
else {
for (p = 0; p <= n; p++)
printf (" \n %d ",combinacao(n,p));
}
system ("PAUSE");
return 0;
}
6.11- Procedimentos
Entendemos por procedimentos funções que não retornam nenhum valor via
comando return. Na linguagem C os procedimentos são conhecidos como
funções do tipo void e, possuem a seguinte sintaxe:
Nas funções do tipo void o comando return não é obrigatório. Uma função sem
o comando return termina quando for encontrado o delimitador de fim de blocos.
1- declarar SENTINELA;
2- declarar variáveis;
3- ler passe do trabalhador;
190
Fundamentos de Programação em C: Uma Abordagem Algorítmica
#define SENTINELA 0
1- declarar tempoEmMinutos;
2- calcular tempoEmMinutos = horas* 60 + minutos;
3- retornar tempoEmMinutos;
1- declarar diferencaTempo;
2- calcular diferencaTempo = tempoSaida - tempoEntrada;
191
Fundamentos de Programação em C: Uma Abordagem Algorítmica
3- retornar diferencaTempo;
1- imprimir (passe);
2- imprimir (diferencaTempo);
/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o número de horas de trabalho por dia de cada empregado.
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() scanf() */
#include <stdlib.h> /* incluir a funcao stdlib.h */
/*--------------------------------------------------------------------------------------------------------
Protótipo de funções
--------------------------------------------------------------------------------------------------------*/
int lerNumeroPasse ();
int converteTempo (int h, int m);
int diferencaTempo (int entrada, int saida);
void imprimir (int passe, int diferencatempo);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler um número do passe do funcionário
Recebe: Nada
Retorna: Número do passe
--------------------------------------------------------------------------------------------------------*/
int lerNumeroPasse ()
{
int numero;
printf("\n Entre com um numero inteiro positivo:"); scanf("%d",&numero);
return numero;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Converter as horas e os minutos para minutos
Recebe: Horas e minutos
Retorna: Minutos
--------------------------------------------------------------------------------------------------------*/
int converteTempo (int h, int m)
{
return ( h* 60 + m);
}
192
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular os minutos de trabalho
Parâmetros: Minutos de entrada e minutos e saída
Valor de retorno: Tempo em minutos
--------------------------------------------------------------------------------------------------------*/
int diferencaTempo (int entrada, int saida)
{
return saida - entrada;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir a assiduidade do empregado
Parâmetros: Passe do trabalhador e horas no serviço
--------------------------------------------------------------------------------------------------------*/
void imprimir (int passe, int horasNoServico)
{
printf("\n Trabalhador com o passe %d :", passe);
printf("\n esteve na Empresa %d:",horasNoServico);
}
/*--------------------------------------------------------------------------------------------------------
Função principal
--------------------------------------------------------------------------------------------------------*/
int main()
{
int passe, minutoEntrada, minutoSaida, tempoNoServico, hora, minutos;
while (passe = lerNumeroPasse () != SENTINELA )
{
if (passe <= 0)
printf("Erro: Numero do passe invalido");
else {
printf("\n Digite hora de entrada (hora:minutos) : " );
scanf(" %d : %d ",&hora,&minutos);
minutoEntrada = converteTempo (hora,minutos);
printf("\n Digite hora de saida (hora:minutos) : " );
scanf(" %d : %d ",&hora,&minutos);
minutoSaida = converteTempo (hora,minutos);
tempoNoServico = diferencaTempo (minutoEntrada,minutoSaida);
imprimir ( passe, tempoNoServico);
}
}
system("PAUSE");
return 0;
}
193
Fundamentos de Programação em C: Uma Abordagem Algorítmica
int main ()
{
int passe, minutoEntrada, minutoSaida, hora, minutos;
while (passe = lerNumeroPasse() != SENTINELA )
{
if (passe <= 0)
printf("Erro: Numero do passe invalido");
else {
printf("\n Digite hora de entrada (hora:minutos) : " );
scanf(" %d : %d ",&hora,&minutos);
minutoEntrada = converteTempo(hora,minutos);
printf("\n Digite hora de saida (hora:minutos) : " );
scanf(" %d : %d ",&hora,&minutos);
minutoSaida = converteTempo (hora,minutos);
imprimir ( passe, diferencaTempo(minutoEntrada,minutoSaida));
}
}
system("PAUSE");
return 0;
}
Fazem parte das boas prácticas de programação, utilizar sempre que for possível
a passagem por valor.
194
Fundamentos de Programação em C: Uma Abordagem Algorítmica
e a função principal que activa esse procedimento pode ser descrita por:
int main()
{
int x,y;
printf(" \n Entre com dois numeros inteiros:");
scanf(" %d %d ", &x,&y);
prinf(" \n Antes da troca x = %d e y= %d ",x,y);
troca (x,y); /* Chamada da função */
printf(" \n Depois da troca x= %d e y= %d ",x,y);
return 0;
}
Antes da troca x= 5 e y = 9
Depois da troca x= 5 e y= 9
195
Fundamentos de Programação em C: Uma Abordagem Algorítmica
m = &cont;
q = *m;
armazena o conteúdo de cont na variável q. Logo q terá o valor 150, porque 150
é o valor de está armazenado nessa posição de memória.
int main()
{
int x,y;
printf(" \n Entre com dois numeros inteiros: ");
scanf(" %d %d ", &x,&y);
printf(" \n Antes da troca x = %d e y= %d ",x,y);
troca(&x,&y); /* chamada da Função */
printf(" \n Depois da troca x= %d e y= %d ",x,y);
return 0;
}
196
Fundamentos de Programação em C: Uma Abordagem Algorítmica
#include <stdio.h>
#include <math.h>
int equacao2Grau (double a, double b, double c, double *x1, double *x2)
{
double delta;
if (a == 0.0 && b == 0.0) /* Não é uma equação*/
return -3;
if (a == 0.0) /*É uma equação do 1. Grau */
{ *x1 = -c / b; return -2; }
delta = b*b - 4*a*c;
if (delta < 0) /* Se delta < 0 , raízes não são reais */
return -1;
if (delta == 0) /* Se delta = 0, raízes reias iguais */
{ *x1 = *x2 = -b / (2*a); return 0; }
*x1 = (-b + sqrt(delta))/(2*a); /* se delta > 0, raízes reais diferentes */
*x2 = (-b - sqrt(delta))/(2*a);
return 1;
}
Fazem parte das boas prácticas de programação, passar por valor, todo o
parâmetro que não vai ser modificado durante a execução de um
subprograma.
197
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Não fazem parte das boas prácticas de programação utilizar variáveis globais
no interior de um subprograma.
198
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Resolução: Uma versão refinada para este problema pode ser descrita pelos
seguintes passos:
1- declarar SENTINELA;
2- declarar variáveis;
3- ler número do aluno;
4- enquanto (número ≠ SENTINELA) faça
5- inicio
6- se número ≤ 0 então
7- imprimir("Número do estudante invalido");
8- senao
9- inicio
10- carregar as notas dos projectos;
11- calcular a média dos projectos;
12- classificar nota do aluno;
13- imprimir uma linha da pauta;
14- fim
15- ler número do aluno;
16- fim
#define SENTINELA 0
199
Fundamentos de Programação em C: Uma Abordagem Algorítmica
No próximo passo vamos identificar as acções que devem ser resolvidas como
subprogramas e implementa-las de forma independente.
1- projecto(1) = lerNota(1);
2- projecto(2) = lerNota(2);
3- projecto(3) = lerNota(3);
1- declarar media;
2- media = 0.2 * projecto1 + 0.3 * projecto2 + 0.5 * projecto3;
3- devolver media;
200
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*--------------------------------------------------------------------------------------------------------
Objectivo: Imprimir uma pauta com as notas dos estudantes de uma turma.
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
#define SENTINELA 0
/*--------------------------------------------------------------------------------------------------------
Protótipo de funções
--------------------------------------------------------------------------------------------------------*/
float calcularMedia (int projecto1, int projecto2, int projecto3);
int lerNumeroEstudante ();
int lerNotaProjecto (int numProjecto);
void carregarNotas (int *projecto1, int *projecto2, int *projecto3);
char classificarEstudante (float mediaprojectos);
void imprimir (int passe, float media, char classe);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a média
Recebe: Notas dos três projectos
Retorna: Média
--------------------------------------------------------------------------------------------------------*/
float calcularMedia (int projecto1, int projecto2, int projecto3)
{
return ( 0.2 * projecto1 + 0.3 * projecto2 + 0.5 * projecto3 );
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler o número do estudante
Recebe: Nada
Retorna: Número do passe do estudante
--------------------------------------------------------------------------------------------------------*/
int lerNumeroEstudante ()
{
int passe;
printf("\n Entre com o numero do estudante :"); scanf(" %d",&passe);
return passe;
}
201
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler a nota de um projecto
Recebe: Número do Projecto
Retorna: A nota desse projecto
--------------------------------------------------------------------------------------------------------*/
int lerNotaProjecto (int numProjecto)
{
float nota;
while (1)
{
printf("\Entre com a nota do projecto nº %d :",numProjecto));
scanf("%d",¬a));
if (nota >= 0 && nota <= 20)
break;
else
printf("\n Erro: Nota invalida");
}
return nota;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Selecionar a Classificação do estudante
Recebe: Média dos projectos
Retorna: Classificação do aluno
--------------------------------------------------------------------------------------------------------*/
char classificarEstudante(float media)
{
if (media > 15 ) return 'D';
if (media > 8 ) return 'E';
return 'R';
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir uma linha da pauta
Recebe: Passe, media, classificacao
Devolve: Nada
--------------------------------------------------------------------------------------------------------*/
void imprimir(int passe, float media, char classificacao)
{
printf("\n Estudante com o passe %d :", passe);
printf(" \n Media dos projectos %.2f ",media);
printf(" \n Classicacao de %c ",classificacao);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Carregar as notas dos projectos
Recebe: Nada
Devolve: Notas dos três projectos
--------------------------------------------------------------------------------------------------------*/
202
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*--------------------------------------------------------------------------------------------------------
Função principal
--------------------------------------------------------------------------------------------------------*/
int main ()
{
int numero, projecto1, projecto2, projecto3;
float mediaproject;
char classificacao;
while ( numero = lerNumeroEstudante () != SENTINELA )
{
if ( numero < 0 )
printf("\n Erro: Numero do estudante invalido");
else {
carregarNotasProject (&projecto1,&projecto2,&projecto3);
mediaproject = calcularMedia (projecto1,projecto2,projecto3);
classificacao = classificarEstudante (mediaproj);
imprimir (numero,mediaproject,classificar);
}
}
system("PAUSE");
return 0;
}
203
Fundamentos de Programação em C: Uma Abordagem Algorítmica
1- declarar as variáveis
2- ler identificação do fazendeiro;
3- enquanto identificação ≠ SENTINELA faça
4- inicio
5- se identificação ≤ 0 então
6- imprimir ("Número de identificação invalido");
7- senão
8- inicio
9- ler Tipo de pulverização;
10- ler área pulverizada;
11- calcular custo do serviço;
12- se área > 10 km2 então
13- inicio
14- calcular desconto sobre o área;
15- atualizar custo;
16- fim
17- se custo > 100,000.00 kz então
18- inicio
19- calcular desconto sobre o custo;
20- atualizar custo;
21- fim
22- fim
23- imprimir a factura;
24- ler identificação do fazendeiro;
25- fim
int identificacao;
float area, custo;
int tipo;
#define SENTINELA 0
204
Fundamentos de Programação em C: Uma Abordagem Algorítmica
1- declarar desconto;
2- calcular desconto = custoPulverizacao * 5%;
3- retornar desconto;
1- declarar custoDaPulverizacao;
2- calcular custoDaPulverizacao = custoDaPulverizacao - desconto;
3- retornar custoDaPulverizacao;
1- declarar custo;
2- se tipoPulverizacao = ervas daninhas então
3- custo = 8000 x área;
4- senão se tipoPulverizacao = gafanhotos então
5- custo = 10000 x área;
6- senão se tipoPulverizacao = broca então
7- custo = 150000 x área;
8- senão
9- custo = 180000 x área;
205
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Como todas as linhas do nosso algoritmo estão claras e não possuem qualquer
ambiguidade, estamos em condições de converter o algoritmo para um programa
em C.
/*--------------------------------------------------------------------------------------------------------
Objectivo: Imprimir uma factura com os custos de serviço de pulverização
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
#define SENTINELA 0
#define ERVADANINHA 1
#define GAFANHOTOS 2
#define BROCAS 3
/*--------------------------------------------------------------------------------------------------------
Protótipos de funções
-------------------------------------------------------------------------------------------------------*/
int lerDadosFazendeiro ();
int lerTipoPulverizacao ();
float lerareaPulverizada ();
void imprimir (float custo, int identificacao);
float custoServico (int tipoPraga, float areaPulverizada);
float descontoArea (float custoServico);
float descontroPreco (float custoServico);
float actualizarCusto (float desconto, float custoServico);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler dados do Fazendeiro
Recebe: Nada
Retorna: Número da identificação do fazendeiro;
--------------------------------------------------------------------------------------------------------*/
int lerDadosFazendeiro ()
{
int identificacao;
printf(" \n Identificacao do fazendeiro : "); scanf("%d",& identificacao);
return identificacao;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler o tipo de pulverização
206
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Recebe: Nada
Retorna:Tipo pulverização
--------------------------------------------------------------------------------------------------------*/
int lerTipoPulverizacao ()
{
/* Fica como exercício */
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler a área pulverizada
Recebe: Nada
Retorna: Área pulverizada
--------------------------------------------------------------------------------------------------------*/
int lerAreaPulverizada ()
{
/* Fica como exercício */
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o desconto com base na área pulverizada
Recebe: Custo da pulverização
Retorna: Valor do desconto
--------------------------------------------------------------------------------------------------------*/
float descontoArea (float custoServico)
{
return custoServico * 0.05;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o desconto com base no custo do serviço
Recebe: Custo da pulverização
Retorna: Valor do desconto
--------------------------------------------------------------------------------------------------------*/
float descontoPreco (float custoServico)
{
return (custoServico - 100000.0) * 0.10;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir fatura
Recebe: Custo do serviço, identificação
Devolve: Nada
--------------------------------------------------------------------------------------------------------*/
void imprimir (float custoServico, int identificacao)
{
printf(" \n Codigo do fazendeiro %d ", identificacao);
printf(" Valor a pagar %.2f ",custoServico);
}
207
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*-------------------------------------------------------------------------------------------------------
Objectivo: Actualizar o Custo
Recebe: Custo da pulverização
Retorna Custo atualizado
--------------------------------------------------------------------------------------------------------*/
float actualizarCusto (float custoServico, float desconto)
{
return custoServico -= desconto;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o custo do serviço
Recebe: Tipo de pulverização, área Infectada
Retorna: Valor do custo do serviço
--------------------------------------------------------------------------------------------------------*/
float custoServico (int tipoPraga,float areainfectada)
{
float custo;
if (tipoPraga == ERVADANINHA)
custo = 8000 * areaInfectada;
else if (tipoPraga == GAFANHOTOS)
custo = 10000 * areaInfectada;
else if (tipoPraga == BROCAS)
custo = 15000* areaInfectada;
else
custo = 18000 x areaInfectada;
return custo;
}
/*--------------------------------------------------------------------------------------------------------
Função principal
--------------------------------------------------------------------------------------------------------*/
int main()
{
int praga, identificacao;
float area, custo;
while (identificacao = lerDadosFazendeiro () != SENTINELA)
{
if (identificacao <= 0)
printf("\n Erro: Numero de identificacao invalido");
else {
praga = lerTipoPulverizacao ();
area = lerAreaPulverizada ()
custo = custoServico (praga,area);
if (area > 10.00)
custo = actualizarCusto (custo , descontoArea (custo));
if ( (int)custo > 1000000 )
custo = actualizarCusto (custo , descontoPreco(custo));
imprimir (custo,identificacao);
}
208
Fundamentos de Programação em C: Uma Abordagem Algorítmica
}
system("PAUSE");
return 0;
}
Para além disso, o programa deverá imprimir o valor total das multas.
1- declarar as variáveis;
2- inicializar contadores e acumuladores;
3- ler o número da carta de condução;
4- enquanto número da carta de condução != SENTINELA faça
5- inicio
6- se número da carta ≤ 0 então
7- imprimir("\n Erro: velocidade do carro inválida");
8- senão
9- inicio
10- carregar dados da velocidade;
11- calcular a velocidade em excesso;
12- calcular a percentagem da velocidade em excesso;
13- calcular o valor da multa;
14- calcular os valor de pontos perdidos;
15- acumular o valor da multa e o número de multas;
16- imprimir uma linha no tela;
17- fim
18- ler número da carta de condução;
19- fim
20- imprimir totais
209
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Como dados de saída temos dois mapas. O primeiro é uma listagem com o
número da carta de condução, pontos retirados e o valor da multa. Essa
informação está associadas as variáveis:
int totalPontos;
float valorMulta;
int numeroMultas;
float valorTotalMultas;
#define SENTINELA 0
210
Fundamentos de Programação em C: Uma Abordagem Algorítmica
211
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*--------------------------------------------------------------------------------------------------------
Objectivos: imprimir um relatório com o valor das multas e os pontos perdidos
na carteira de motoristas infractores. No fim do relatório adicionar uma linha com
as estatísticas
-------------------------------------------------------------------------------------------------------*/
##include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
#define SENTINELA 0
#define TRUE 1
#define FALSE 0
/*--------------------------------------------------------------------------------------------------------
Variáveis Globais
------------------------------------------------------------------------------------------------------*/
int cartaConducao, velocidadeCarro, velocidadeLimite;
int numeroMultas = 0;
float valorTotalMultas = 0.0;
/*--------------------------------------------------------------------------------------------------------
Protótipos de funções
-------------------------------------------------------------------------------------------------------*/
void lerCartaConducao ();
void carregarVelocidades ();
int velocidadeExcesso ();
int percVelocidade (int excesso, int limite);
float valorDaMulta (int percentagem);
int pontosAPerder ( int pontosPerdidos);
void ActualizarContadores (float valorMulta);
void linhaMapa ( float valorMulta, int numeroPontos);
void linhaTotais ();
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler número da carta de conduçao
--------------------------------------------------------------------------------------------------------*/
void lerCartaConducao ()
{
printf("\n Entre com o numero da carta: "); scanf("%d",&cartaConducao);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler e validar velocidades no instante de actuação
--------------------------------------------------------------------------------------------------------*/
void lerVelocidades ()
{
printf("\n Entre com a velocidade limite :"); scanf("%d",&velocidadeLimite);
printf("\n Entre com a velocidade carro :"); scanf("%d",&velocidadeLimite);
212
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*-------------------------------------------------------------------------------------------------------
Objectivo: Validar as velocidades da infracção
--------------------------------------------------------------------------------------------------------*/
void validaVelocidades ()
{
if (velocidadeCarro < velocidadeLimite)
return FALSE;
else
return TRUE;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a velocidade em excesso
Retorna : Velocidade em excesso
--------------------------------------------------------------------------------------------------------*/
int velocidadeExcesso ( )
{
return velocidadeCarro - velocidadeLimite;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a percentagem da velocidade em excesso
Recebe: Velocidade em excesso
Retorna: Percentagem dessa velocidade
--------------------------------------------------------------------------------------------------------*/
int perVelocidade (int excesso)
{
return (excesso * 100) / velocidadeLimite;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor da multa
Recebe: Percentagem
Retorna: Valor da multa
--------------------------------------------------------------------------------------------------------*/
213
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular os pontos a perder
Recebe: Percentagem
Retorna: Pontos perdidos
--------------------------------------------------------------------------------------------------------*/
int pontosAPerde r(int percentagem)
{
float pontosPerdidos;
if (percentagem <= 10)
pontosPerdidos = 0;
else if (percentagem <= 20)
pontosPerdidos = 4;
else
pontosPerdidos = 7;
return pontosPerdidos;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Actualizar o total geral de multas e o total geral de pontos perdidos.
Recebe: Pontos perdidos, valor da Multa
--------------------------------------------------------------------------------------------------------*/
void actualizarContadores ( float valorMulta );
{
numeroMultas + = 1;
valorTotalMultas += valorMulta;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir uma linha de detalhe
Recebe: Carta condução, valor da multa e pontos perdidos
--------------------------------------------------------------------------------------------------------*/
void linhaLinha (int cartaConducao, float valorMulta, int pontosPerdidos)
{
printf(" \n Numero carta Conducao %d", cartaConducao);
printf(" \n Valor da multa %12.2f ", valorMulta);
printf(" \n Pontos perdidos %2d ", pontosPerdidos);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir a linha de Estatística
--------------------------------------------------------------------------------------------------------*/
void linhaTotais ()
{
printf(" \n Numero total de multas %4d "; numeroMultas);
printf(" \n Valor total das multas %.2f ",valortotalMultas);
}
214
Fundamentos de Programação em C: Uma Abordagem Algorítmica
/*--------------------------------------------------------------------------------------------------------
Função principal
--------------------------------------------------------------------------------------------------------*/
int main ()
{
int carta, pontos, percentagem;
float excesso, Multa;
while (carta = LerCartaConducao() != SENTINELA )
{
if (carta <= 0)
printf("\n Erro: numero da carta invalido);
else {
lerVelocidades();
if (validaVelocidade() == TRUE)
{
excesso = velocidadeExcesso( );
percentagem = pecVelocidade(excesso);
multa = valorDaMulta(percentagem);
pontos = pontosAPerder(percentagem);
actualizarContadores(multa);
imprimirLinha(carta,multa,pontos);
}
else
printf("\Erro: Dados das velocidades inválidos");
}
}
imprimirTotais();
system("PAUSE");
return 0;
}
215