Escolar Documentos
Profissional Documentos
Cultura Documentos
Capítulo
7 Subprogramas
“ Não se mede o valor de um homem 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. ”
- Charles Chaplin -
6.1 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, e que é executado quando for acionado po invocado por
um outro programa.
Todo o subprograma deve ser identificado por um nome, que obedece as regras
de construção de identificadores, para além disso, o nome de um subprograma
deve mostrar de forma inequívoca a tarefa que esse subprograma realiza.
Segundo Deitel (2011) “Se não conseguirmos escolher um nome conciso para
um determinado subprograma, é porque este subprograma realiza muitas tarefas
diferentes, e a melhor solução, consiste em fragmenta-lo em subprogramas mais
simples”.
Qualquer sequência de instruções que aparece mais do que uma vez num
programa deve ser implementada como um subprograma.
Directivas de pré-processamento
Protótipo de funções
Definição de funções
Função principal
que será estudada em detalhe nas próximas secções, com excepção das
directivas de pré-processamento, que já foram vistas num dos capítulos
anteriores.
onde
tipo: representa um tipo elementar de dados;
nome: uma variável que satisfaz as regras de construção de variáveis;
Por definição, uma função é um subprograma que importa vários valores através
dos parâmetros e exporta um e apenas um valor através do valor de retorno.
return;
return expressão;
return (expressão);
Para efeito de notação, utilizaremos a palavra retorna para mostrar que a função
exporta um e apenas um valor através do valor de retorno.
Embora uma função retorna um e apenas um valor, ela pode conter no seu corpo
vários comandos return, mas apenas um desses comandos será executado. Por
exemplo, a função:
Observação: O tipo de dados de uma função deve ser igual ao tipo de dados
que essa função retorna e não o contrário.
float grausFahr;
...
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;
}
6.8 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 de dados da função principal era feita pelo teclado através
da função scanf(), e a saída era feita 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.
Com base no método de refinamento sucessivo, uma possível solução para este
problema, pode ser descrita pelos seguintes passos:
1- declarar variáveis;
2- ler os expoentes x e y;
3- ler as bases a e b;
4- Calcular potência de x elevado a a;
int a, b;
float x, y, s;
No próximo passo vamos identificar as acções que devem ser escritas como
subprogramas (funções em C) e implementa-las de forma independente.
O subprograma para ler a base, que denominamos por lerBase(), não recebe
nenhum valor via parâmetro, mas retorna um número real. Uma possível solução
para este problema, pode ser descrita pelos seguintes passos:
1- declarar a base;
2- imprimir (“Entre com o valor da base:”);
3- ler (base);
4- retornar base;
1- declarar o expoente;
2- repetir infinitamente
3- inicio
4- imprimir (“Entre com o valor do expoente:”);
5- ler (expoente);
6- se expoente > 0 então abandonar;
7- imprimir (“Erro: valor do expoente inválido”);
8- fim
9- retornar expoente;
1 se y = 0
xy = {
x (y−1) x se y > 0
Então, uma possível solução para este problema, pode ser descrita pelos
seguintes passos:
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los para um programa na
linguagem C.
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor da expressão xa + yb + (x − y)a+b para a > 0 e b > 0
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf( ) scanf( ) */
#include <stdlib.h> /* incluir a funcao system( ) */
/*-------------------------------------------------------------------------------------------------------
Protótipo de funções
-------------------------------------------------------------------------------------------------------*/
int lerExpoente ();
float lerBase ();
float potencia (int base , float expoente);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler o valor da Base
Recebe: Nada
Retorna: Número real
-------------------------------------------------------------------------------------------------------*/
float lerBase ()
{
float valor;
printf (" \n Entre com o valor da base:");
scanf ("%d", &base);
return valor;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler o valor do expoente
Recebe: Nada
Retorna: Número inteiro positivo
-------------------------------------------------------------------------------------------------------*/
int lerExpoente ()
{
int valorExpoente;
while (1)
{
printf (" \n Entre com o valor do expoente:");
scanf ("%d", &valorExpoente);
if (valorExpoente > 0 ) break;
printf (“\n Erro: Valor do expoente invalido”);
}
return valor;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a potencia
Recebe: base e expoente
Retorna: valor da potencia
-------------------------------------------------------------------------------------------------------*/
float potencia (float base, int expoente)
{
float pot = 1.0 ;
int i ;
for (i = 0 ; i < expoente ; i++)
pot *= base ;
return pot;
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
int a , b;
float x , y, s;
a = lerBase();
b = lerBase ();
x = lerExponte ();
y = lerExpoente ();
s = potencia(x , a) + potencia( y , b) + potencia ((x-y), (a+b));
printf (" \n Valor da Expressao = %f ", s );
system ("PAUSE");
return 0;
}
Criamos duas funções para ler os dados, uma para ler a base e outra para ler o
expoente. Mas essa forma de implementação de código não viola as boas
prácticas de programação? Se fizermos uma análise profunda, veremos que
essas funções tornam o programa mais fácil de ler e de compreender, e para
além disso, uma dessas funções garante que o expoente para o calculo dessa
expressão é positivo, logo, ela dá uma maior consistência ao código. Isso é uma
prova que não violamos as boas prácticas de programação.
Com base no método de refinamento sucessivo, uma possível solução para este
problema pode ser descrita pelos seguintes passos:
1- declarar SENTINELA;
2- declarar variáveis;
3- ler lado1;
4- enquanto lado1 ≠ SENTINELA faça
5- início
6- ler lado2;
7- calcular a área;
8- calcular o perímetro;
9- imprimir os resultados;
10- ler lado1;
11- fim
No próximo passo vamos identificar as acções que devem ser escritas como
subprogramas e implementa-las de forma independente.
1- declarar lado1;
2- repetir infinitamente
3- início
4- imprimir (“ Entre com primeiro lado do retângulo:”);
5- ler (lado1);
6- se lado1 >= 0 então abandonar;
7- imprimir (“Erro: valor do primeiro lado inválido”);
8- fim
9- retornar lado;
1- declarar lado2;
2- repetir infinitamente
3- início
4- imprimir (“Entre com o segundo lado do retângulo:”);
5- ler (lado2);
6- se lado2 > 0 então abandonar;
7- imprimir (“Erro: valor do segundo lado inválido”);
8- fim
9- 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;
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los para um programa na
linguagem C.
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a área e o perímetro de um retângulo.
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() e scanf() */
#include <stdlib.h> /* incluir a funcao system() */
#define SENTINELA 0
/*-------------------------------------------------------------------------------------------------------
Protótipo de funções
-------------------------------------------------------------------------------------------------------*/
int lerLado1( );
int lerLado2( );
float calcularArea (int lado1, int lado2);
float calcularPerimetro (int lado1, int lados2);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler o primeiro lado do retângulo
Recebe: Nada
Retorna: Número inteiro não negativo
-------------------------------------------------------------------------------------------------------*/
int lerLado1 ( )
{
int lado1;
while (1)
{
printf (" \n Entre com o primeiro lado do retangulo: ");
scanf ("%d", &lado1);
if ( lado1 >= 0 ) break;
printf (“\n Erro: Valor do primeiro lado invalido”);
}
return lado1;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler o segundo lado do retângulo
Recebe: Nada
Retorna: Número inteiro positivo
-------------------------------------------------------------------------------------------------------*/
int lerLado2 ( )
{
int lado2;
while (1)
{
printf (" \n Entre com o segundo lado do retangulo: ");
scanf ("%d", &lado2);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a área do retângulo
Recebe: Lados do retângulo
Retorna: Área
-------------------------------------------------------------------------------------------------------*/
float calcularArea (int lado1, int lado2)
{
return (lado1 * lado2);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o perímetro
Recebe: Lados do retângulo
Retorna: Perímetro
-------------------------------------------------------------------------------------------------------*/
float calcularPerimetro (int lado1, int lado2)
{
return 2 * (lado1 + lado2);
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
int x , y;
float perimetro , area;
x = lerLado1 ( );
while ( x != SENTINELA )
{
y = lerLado2 ( );
area = calcularArea (x , y);
perimetro = calcularPerimetro (x , y);
printf (" \n Perimetro= %d Area = %d ", perimetro, area);
x = lerLado1 ( );
}
system("PAUSE");
return 0;
}
int main ()
{
int x , y;
float perimetro , area;
while (( x = lerLado1( )) != SENTINELA )
{
y = lerLado2 ();
printf (" \n %d %d ", calcularArea (x , y) , calcularPerimetro (x , y));
}
system("PAUSE");
return 0;
{
1 1 1 1
hn = 1 + + + +…+ para n≥ 1
2 3 4 𝑛
Com base no método de refinamento sucessivo, uma possível solução para este
problema pode ser descrita pelos seguintes passos:
1-declarar variáveis;
2-ler número inteiro n;
3-calcular harmónico;
4-imprimir resultados;
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.
retorna o harmónico desse número. Uma possível solução para este problema
pode ser descrita pelos seguintes passos:
1- declarar h , i;
2- inicializar h com zeros;
3- para i de 1 até n passo 1 faça
4- adicionar a h o valor 1/i;
2- retornar h;
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los para um programa escrito
na linguagem C.
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor da Série Harmónica
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() e scanf() */
#include <stdlib.h> /* incluir a função system() */
/*-------------------------------------------------------------------------------------------------------
Protótipo de funções
-------------------------------------------------------------------------------------------------------*/
int lerNumero ();
float harmonico (int n);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler um número inteiro
Recebe: Nada
Retorna: Número inteiro não negativo digitado pelo utilizador
-------------------------------------------------------------------------------------------------------*/
int lerNumero ()
{
int numero;
while (1)
{
printf (" \n Entre com um numero inteiro positivo: " );
scanf ("%d", &numero );
if ( numero > 0) break;
printf (" \n Erro: numero invalido" );
}
return numero;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor da série harmónica
Recebe: Número inteiro positivo
Retorna: Valor da série
-------------------------------------------------------------------------------------------------------*/
float harmonico (int n)
{
float h = 0.0 ;
int i ;
for ( i = 1 ; i <= n ; i++)
h += 1.0/i;
return h;
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
float h;
int n;
n = lerNumero ();
h = harmonico(n);
printf (“ \n Valor harmonico de %d igual a %f ”, n , h);
system (“PAUSE”);
return 0;
}
Com base no método de refinamento sucessivo, uma possível solução para este
problema pode ser descrita pelos seguintes passos:
1- declarar variáveis;
2- ler número inteiro n;
3- para p de 0 até n passo 1 faça
4- início
5- calcular combinação de n p a p;
6- imprimir resultado;
7- fim
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- início
5- multiplicar fat por i;
6- armazenar o resultado da operação anterior em fat;
7- fim;
8- retornar fat;
1- declarar comb;
2- calcular comb = factorial(n) / (factorial(p) * factorial (n-p));
3- retornar comb;
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los para um programa escrito
na linguagem C.
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular as combinações de n p a p
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() e scanf() */
#include <stdlib.h> /* incluir a funcao system() */
/*-------------------------------------------------------------------------------------------------------
Protótipo de funções
-------------------------------------------------------------------------------------------------------*/
int lerNumero ();
int factorial (int n);
float combinação (int n , int p);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler um número inteiro
Recebe: Nada
Retorna: Número inteiro não negativo digitado pelo utilizador
-------------------------------------------------------------------------------------------------------*/
int lerNumero ()
{
/* Faça como exercício */;
}
/*-------------------------------------------------------------------------------------------------------
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: 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) ) );
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
int n , p;
n = lerNumero();
for (p = 0 ; p <= n ; p++)
printf (" \n %d ", combinacao(n , p) );
system ("PAUSE");
return 0;
}
6.10 Procedimentos
Por definição, um procedimento é um subprograma que não retornam nenhum
valor via valor de retorno.
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.
Com base no método de refinamento sucessivo, uma possível solução para este
problema pode ser descrita pelos seguintes passos:
1- declarar SENTINELA;
2- declarar variáveis;
3- ler o passe;
4- enquanto passe ≠ SENTINELA faça
5- início
6- ler hora e minuto da entrada;
7- converter essas horas para minutos;
8- ler hora e minuto da saída;
9- converter essas horas para minutos;
10- calcular a diferença de tempo;
11- imprimir resultados;
12- ler passe;
13- fim
#define SENTINELA 0
O subprograma para ler o passe, que denominamos por lerPasse(), não recebe
nenhum valor através dos parâmetros, e retorna um número inteiro positivo.
Deixamos como exercício a implementação desse algoritmo.
1- declarar tempoEmMinutos;
2- calcular tempoEmMinutos = horas* 60 + minutos;
3- retornar tempoEmMinutos;
1- declarar diferencaTempo;
2- calcular diferencaTempo = tempoSaida - tempoEntrada;
3- retornar diferencaTempo;
1- imprimir (passe);
2- imprimir (diferencaTempo);
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los para um programa na
linguagem C.
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o número de horas de trabalho por dia de cada empregado.
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir a função printf() e scanf() */
#include <stdlib.h> /* incluir a funcao system() */
/*-------------------------------------------------------------------------------------------------------
Protótipo de funções
-------------------------------------------------------------------------------------------------------*/
int lerNumeroPasse ();
int converteTempo (int h , int m);
int diferencaTempo (int entrada , int saida);
void imprimir (int passe , int horasNoServico);
/*-------------------------------------------------------------------------------------------------------
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);
}
/*-------------------------------------------------------------------------------------------------------
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);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler um número do passe do funcionário
Recebe: Nada
Retorna: Número do passe
-------------------------------------------------------------------------------------------------------*/
int lerNumeroPasse ()
{
int passe;
while (1)
{
printf (" \n Entre com um numero do passe do trabalhador: " );
scanf ("%d", &passe );
if ( passe > 0) break;
printf (" \n Erro: numero do passe invalido" );
}
return passe;
}
/*-------------------------------------------------------------------------------------------------------
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;
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
int passe , minutoEntrada , minutoSaida , tempoNoServico , hora , minutos;
while ((passe = lerNumeroPasse ( )) != SENTINELA )
{
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;
}
int main ()
{
int passe , minutoEntrada , minutoSaida , hora , minutos;
while (passe = lerNumeroPasse() != SENTINELA )
{
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;
}
Este tipo de comunicação, entrada de dados via parâmetros e saída via comando
valor de retorno, é a mais comum nas linguagens de programação modernas, e
denomina-se por passagem por valor.
e uma possível função principal que acciona este 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
O que está errado? O erro não está no código do procedimento, mas na forma
de passagem de parâmetros. O procedimento deve receber através dos
parâmetros formais dois valores, e devolver através dos mesmos parâmetros os
seus conteúdos trocados.
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;
}
Fazem parte das boas práticas de programação, passar por valor, todos os
parâmetros que não vão ser modificados durante a execução de um
subprograma.
Não fazem parte das boas práticas de programação utilizar variáveis globais no
interior de um subprograma.
uma variável local com o mesmo nome. Quando a função calcularMedia() for
accionada, qualquer referência a variável media está associada a variável local.
No interior dessa função essa variável global torna-se inacessível.
Resolução: uma versão já 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 do aluno ≠ SENTINELA) faça
5- início
6- ler nota do projecto1;
7- ler nota do projecto2;
8- ler nota do projecto3;
9- calcular média dos projectos;
10- classificar nota do aluno;
11- imprimir uma linha da pauta;
12- ler número do aluno;
13- fim
#define SENTINELA 0
No próximo passo vamos identificar as acções que devem ser resolvidas como
subprogramas e implementa-las de forma independente.
1- declarar media;
2- media = 0.2 * projecto1 + 0.3 * projecto2 + 0.5 * projecto3;
3- retornar media;
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los para um programa em C.
/*-------------------------------------------------------------------------------------------------------
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);
char classificarEstudante (float mediaprojectos);
void imprimirLinha (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;
while (1)
{
printf (" \n Entre com o numero do estudante:");
scanf (" %d", &passe);
if (passe >= 0) break;
printf ("\n Numero do passe invalido");
}
return passe;
}
/*-------------------------------------------------------------------------------------------------------
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 nº /d projecto:", numProjecto));
scanf ("%d", ¬a));
if (nota >= 0 && nota <= 20) break;
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 imprimirLinha (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);
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
int numero , projecto1 , projecto2 , projecto3;
float mediaprojecto;
char classificacao;
while ( numero = lerNumeroEstudante ( ) != SENTINELA )
{
projecto1 = lerNotaProjecto(1);
projecto2 = lerNotaProjecto(2);
projecto3 = lerNotaProjecto(3);
mediaprojecto = calcularMedia (projecto1, projecto2, projecto3);
classificacao = classificarEstudante (mediaprojecto);
imprimirLinha (numero , mediaprojecto , classificacao);
}
system("PAUSE");
return 0;
}
1- declarar variáveis;
2- ler identificação do fazendeiro;
3- enquanto identificação ≠ SENTINELA faça
4- inicio
5- ler tipo pulverização;
6- ler área pulverizada;
7- calcular custo do serviço;
8- calcular desconto sobre a área;
9- calcular desconto sobre o preço;
10- atualizar custo do serviço;
int identificação;
float areaPulverizada , custoServico;
int tipoPulverizacao;
#define SENTINELA 0
#define ERVADANINHA 1
#define GAFANHOTOS 2
#define BROCAS 3
#define TUDO 4
1- Erva Daninha
2- Gafanhotos
3- Broca
4- Tudo
1- declarar desconto;
2- se areaPulverizada > 10.00 então
3- calcular desconto = custoServico * 5 %;
4- senão
5- atribuir zeros a desconto;
6- retornar desconto;
1- declarar custo;
2- se tipoPulverizacao = ERVADANINHA então
3- custo = 8000 x areaPulverizada;
4- senão se tipoPulverizacao = GAFANHOTOS então
5- custo = 10000 x areaPulverizada;
6- senão se tipoPulverizacao = BROCAS então
7- custo = 150000 x areaPulverizada;
8- senão
9- custo = 180000 x areaPulverizada;
10- retornar o custo;
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los 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
#define TUDO 4
/*-------------------------------------------------------------------------------------------------------
Protótipos de funções
-------------------------------------------------------------------------------------------------------*/
int lerDadosFazendeiro ();
int lerTipoPulverizacao ();
float lerAreaPulverizada ();
void imprimirFatura (float custo , int identificacao);
float calcCustServico (int tipoPulverizacao , float areaPulverizada);
float calcDescArea (float custoServico, float areaPulverizada);
float calcDescPreco (float custoServico);
float actualizarCusto (float custoServico, float desconto);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler dados do Fazendeiro
Recebe: Nada
Retorna: Número da identificação do fazendeiro;
-------------------------------------------------------------------------------------------------------*/
int lerDadosFazendeiro ()
{
/* Fica como exercício */
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: através de um menu, selecionar o tipo de pulverização
Recebe: Nada
Retorna:Tipo de Pulverização
-------------------------------------------------------------------------------------------------------*/
int lerTipoPulverizacao ()
{
/* Fica como exercício */
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler a área pulverizada
Recebe: Nada
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o desconto com base na área pulverizada
Recebe: Custo do serviço e a área pulverizada
Retorna: Valor do desconto
-------------------------------------------------------------------------------------------------------*/
float calcDescArea (float custoServico, float areaPulverizada)
{
float desconto;
if (areaPulverizada > 10.00 )
desconto = custoServico * 0.05;
else
desconto = 0.0;
return desconto;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o desconto com base no custo do serviço (preço)
Recebe: Custo do serviço
Retorna: Valor do desconto
-------------------------------------------------------------------------------------------------------*/
float calcDescPreco (float custoServico)
{
float excedente, desconto;
if (custoServico > 100000.00 )
excedente = custoServico – 1000000.00
else
excedente = 0.0;
desconto = excedente * 0.10;
return desconto;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir fatura
Recebe: Custo do serviço, identificação
Devolve: Nada
-------------------------------------------------------------------------------------------------------*/
void imprimirFatura (float custoServico , int identificacao)
{
printf (" \n Codigo do fazendeiro %d ", identificacao);
printf (" Valor a pagar %.2f ", custoServico);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Actualizar o Custo
Recebe: Custo do serviço e o valor do desconto
Retorna: Custo do serviço actualizado
-------------------------------------------------------------------------------------------------------*/
float actualizarCusto (float custoServico , float desconto)
{
return (custoServico – desconto);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o custo do serviço
Recebe: Tipo de pulverizaçao, área Infectada
Retorna: Valor do custo do serviço
-------------------------------------------------------------------------------------------------------*/
float calCustServico (int tipopulverizacao , float areainfectada)
{
float custo;
if (tipopulverizacao == ERVADANINHA)
custo = 8000 * areaInfectada;
else if (tipopulverizacao == GAFANHOTOS)
custo = 10000 * areaInfectada;
else if (tipopulverizacao == BROCAS)
custo = 15000* areaInfectada;
else
custo = 18000 x areaInfectada;
return custo;
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
int tipo , identificacao;
float area , custo, descontoArea, descontoPreco;
while ((identificacao = lerDadosFazendeiro () ) != SENTINELA)
{
tipo = lerTipoPulverizacao ();
area = lerAreaPulverizada ();
custo = calcCustServico (tipo , area);
descontoArea = calcDescArea (custo, area);
descontoPreco = calcDescPreco(custo);
custo = actualizaCusto (custo, descontoPreco + descontoArea);
imprimirFatura (custo, identificacao);
}
system("PAUSE");
return 0;
Para além disso, o programa deverá imprimir o valor total de multas aplicadas.
1- declarar variáveis;
2- inicializar total arrecadado;
3- ler número da carta de condução;
4- enquanto número da carta de condução ≠ SENTINELA faça
5- inicio
6- ler velocidade do carro;
7- ler velocidade limite;
8- calcular velocidade em excesso;
9- se é infractor então
10- inicio
11- calcular percentagem da velocidade em excesso;
12- calcular valor da multa;
13- calcular valor arrecadado;
14- imprimir multa na tela;
15- fim
16- ler número da carta de condução;
17- fim
18- imprimir total do valor arrecadado;
Como dados de saída temos dois mapas. O primeiro é uma listagem com o
número da carta de condução e o valor da multa. Essa informação está
associada a variável:
float valMulta;
float TotValArrecadado;
#define SENTINELA 0
1- imprimir (valArrecadado);
Como todas as linhas dos algoritmos estão claras e não possuem qualquer
ambiguidade, estamos em condições de converte-los para um programa na
linguagem C.
/*-------------------------------------------------------------------------------------------------------
Objectivos: imprimir um relatório com o valor das multas e os pontos perdidos na
carteira de motoristas dos 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
/*-------------------------------------------------------------------------------------------------------
Protótipos de funções
-------------------------------------------------------------------------------------------------------*/
int lerCartaConducao ();
int lerVelCarro ();
int lerVelLimite ();
int isInfractor(int velCarro , int velLimite);
int velExcesso (int velCarro , int velLimite);
float percentVelocidade (int velExcesso , int velLimite);
float valDaMulta (float percent);
float valArrecadado (float valMulta , float valTotMultas);
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler número da carta de condução
Recebe: Nada
Retorna: Número da carta de condução
-------------------------------------------------------------------------------------------------------*/
int lerCartaConducao ()
{
/* faca como exercício */
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Verificar se é infrator
Recebe: velocidade do carro e velocidade limite
Retorna: verdadeiro ou falso
-------------------------------------------------------------------------------------------------------*/
int isInfrator (int velCarro , int velLimite)
{
if (velCarro <= velLimite)
return FALSE;
else
return TRUE;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler velocidade do carro
Recebe: Nada
Retorna: Velocidade do carro
-------------------------------------------------------------------------------------------------------*/
int lerVelCarro ()
{
int velocidade;
while (1)
{
printf (" \n Entre com a velocidade do carro: ");
scanf ("%d", &velocidade);
if (velocidade > 0) break;
printf ( “\n Erro: Velocidade não permitida “);
}
return velocidade;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Ler velocidade limite
Recebe: Nada
Retorna: Velocidade limite
-------------------------------------------------------------------------------------------------------*/
int lerVelLimite ()
{
int velocidade;
while (1)
{
printf (" \n Entre com a velocidade limite : ");
scanf ("%d",&velocidade);
if (velocidade > 0 ) break;
printf ( “\n Erro: Velocidade limite não permitida “);
}
return velocidade;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a velocidade em excesso
Recebe: velocidade do carro e a velocidade limite
Retorna : Velocidade em excesso
-------------------------------------------------------------------------------------------------------*/
int velExcesso (int velCarro , int velLimite)
{
return velCarro - velLimite;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular a percentagem da velocidade em excesso
Recebe: Velocidade em excesso e a velocidade limite
Retorna: Percentagem dessa velocidade
-------------------------------------------------------------------------------------------------------*/
float percentVelocidade (int velExcesso , int velLimite)
{
return (velExcesso * 100.00) / velLimite;
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor da multa
Recebe: Percentagem
Retorna: Valor da multa
-------------------------------------------------------------------------------------------------------*/
float valorDaMulta (float percent)
{
float multa;
if (percent <= 10.0)
multa = 0.0;
else if (percent <= 20.0)
multa = 15000.0;
else
multa = 30000.0;
return multa;
/*-------------------------------------------------------------------------------------------------------
Objectivo: Actualizar o total de multas arrecadadas
Recebe: valor da Multa e o valor total de multas arrecadas
Retorna : total de multas actualizado
-------------------------------------------------------------------------------------------------------*/
float valArrecadado ( float valMulta , float valTotMultas);
{
return (valTotMultas + valMulta);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir uma linha com os dados de uma multa
Recebe: Carta condução e o valor da multa
Retorna: Nada
-------------------------------------------------------------------------------------------------------*/
void imprimirMulta (int carta , float valMulta)
{
printf (" \n Numero carta Conducao %d ", carta);
printf (" \n Valor da multa %12.2f ", valMulta);
}
/*-------------------------------------------------------------------------------------------------------
Objectivo: Imprimir uma linha com o valor arrecadado
Recebe: Valor total de multas
Retorna: Nada
-------------------------------------------------------------------------------------------------------*/
void totArrecadado ( float valTotMultas)
{
printf (" \n Valor total das multas %.2f ", valTotMultas);
}
/*-------------------------------------------------------------------------------------------------------
Função principal
-------------------------------------------------------------------------------------------------------*/
int main ()
{
int carta , velCarro , velLimite , velExcesso , percent;
float valMulta , valTotMultas = 0.0;
while ((carta = LerCartaConducao()) != SENTINELA )
{
velCarro = lerVelCarro();
velLimite = lerVelLimite()
if (isinfrator (velCarro , velLimite) == TRUE)
{
velExcesso = velExcesso(velCarro ,velLimite );
percent = percentVelocidade (velExcesso , velLimite);