Você está na página 1de 52

Fundamentos de Programação em C: Uma Abordagem Algorítmica

“ Há sómente duas coisas que são infinitas: o


universo e a estupidez humana. Mas a respeito
do universo tenho as minhas dúvidas. ”

4 - Albert Einstein -
Comandos
de Decisão

Sumário:
4.1- Motivação
4.2- Comando Condicional Simples
4.3- Comando Condicional Composto
4.4- Comando Condicional Encadeado
4.5- Condições Compostas
4.6- Regras de Conversão
4.7- Comando Selectivo
4.8- Indentação de Programas
4.9- Exercicios Resolvidos
4.10- Exercícios Propostos
4.11-Trabalhos de Programação

55
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Este capítulo tem por finalidade estudar os vários comandos de decisão


existentes na linguagem C. Ao terminar o leitor deverá ser capaz de:

 Utilizar o comando condicional simples e composto;


 Conhecer as suas vantagens e desvantagens;
 Utilizar o comando condicional com condições compostas;
 Conhecer as suas vantagens e as desvantagens;
 Converter comandos condicionais com condições compostas em
comandos condicionais sem condições compostas e vice-versa;
 Utilizar o comando selectivo;
 Conhecer as suas vantagens e desvantagens;
 Converter programas com o comando selectivo para programas com o
comando condicional e vice-versa;
 Conhecer as boas prácticas de indentação de programas.

4.1- Motivação
Vamos mais uma vez analisar o algoritmo não numérico visto no primeiro
capítulo, que consiste em mudar o pneu de um carro.

É evidente que antes de efectuar essa operação, devemos verificar o estado do


pneu de socorro. Em função desse estado, tomamos uma decisão. Se o pneu
de socorro estiver em condições, trocamos o pneu furado, no caso contrário,
levamos o pneu de socorro à recauchutagem.

Então, o algoritmo para remover o pneu de um carro é descrito pelos seguintes


passos:

Se pneu de socorro está em condições então


Desenroscar as porcas
Levantar o carro
Remover a roda
Colocar o pneu de socorro
Enroscar as porcas
Baixar o carro
Guardar o pneu furado
senão
Levar o pneu de socorro à recauchutagem

As linguagens de programação modernas possuem comandos que permitem


seleccionar uma acção ou um conjunto de acções, dentre várias alternativas
possíveis. Esses comandos pertencem a classe das estruturas de decisão e
estão classificados por: Comando Condicional e Comando Selectivo.

56
Fundamentos de Programação em C: Uma Abordagem Algorítmica

4.2.- Comando Condicional Simples


O comando condicional simples possui à seguinte sintaxe:

if (expressão)
Bloco de comandos;

e caracteriza-se por:

1- Calcular o valor lógico da expressão;


2- Se o resultado for verdadeiro executar o bloco de comandos;
3- Se o resultado for falso executar o primeiro comando que estiver depois do
delimitador do bloco.

Em termos de linguagem algorítmica, esse comando é descrito pela seguinte


sintaxe:

se expressão lógica for verdadeira então


Bloco de comandos;

Vamos consolidar esse conceito com alguns exemplos. O primeiro consiste em


desenvolver um programa para ler as três notas de frequência de um
estudante. Mostrar a sua média e exibir uma mensagem a dizer que foi
aprovado.

Numa primeira abordagem a solução deste problema é descrita pelos


seguintes passos:

Versão 1
1- ler as três notas de frequência;
2- calcular a média do aluno;
3- imprimir a média do aluno e a mensagem;

Pelo enunciado, temos como dados de entrada as três notas de frequência, e


como informação de saída, o valor da média e a correspondente mensagem.
Sejam nota1, nota2, nota3 e mediaAluno as variáveis que representam essas
entidades. Vamos associa-las aos seus tipos de dados.

int nota1, nota2, nota3;


float mediaAluno;

Estamos em condições de refinar a versão anterior com a declaração das


variáveis e a formalização de uma acção de leitura.

Versão 2
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- calcular a média do aluno;
57
Fundamentos de Programação em C: Uma Abordagem Algorítmica

4- imprimir a média do aluno e a mensagem;

No próximo passo, vamos escrever com mais rigor, a fórmula para calcular a
média, a impressão do seu valor.

Versão 3
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- calcular mediaAluno = ( nota1 + nota2 + nota3)/3;
4- imprimir(mediaAluno);
5- imprimir a mensagem;

No próximo passo, vamos expandir a acção imprimir a mensagem. Pelo


enunciado sabemos que essa mensagem será deverá ser impressa se o
estudante tiver aprovado, ou seja, se o estudante que tiver uma média maior ou
igual a dez.

Versão 4
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- calcular mediaAluno = ( nota1 + nota2 + nota3)/3;
4- imprimir(mediaAluno);
5- se mediaAluno >= 10 então
6- imprimir("aprovado");

Como todas as linhas do nosso algoritmo estão claras e sem ambiguidade,


estamos em condições de escrever um programa em C.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf(" \n Entre com a primeira frequencia : "); scanf("%d",&nota1);
printf(" \n Entre com a segunda frequencia : ");scanf("%d",&nota2);
printf(" \n Entre com a terceira frequencia : ");scanf("%d",&nota3);
mediaAluno = (nota1 + nota2 + nota3)/3.0;
printf(" \n Media = %.2f ", mediaAluno);
if ( mediaAluno >= 10.0)
printf(" Aprovado \n");
system("PAUSE");
return 0;
}

Observe que este programa tem o seguinte funcionamento. Lê três notas. Se a


média for positiva, mostra o seu valor e a mensagem aprovado. Mas se ela for
negativa mostra apenas o seu valor.

58
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Vamos efectuar uma pequena alteração. O programa só deverá mostrar a


média e a mensagem quando o aluno estiver aprovado.

Pelo algoritmo anterior, a terceira versão deste problema é descrita pelos


seguintes pontos:

1- declarar nota1, nota2, nota3, mediaAluno;


2- ler(nota1, nota2, nota3);
3- calcular mediaAluno = (nota1+ nota2 + nota3)/3;
4- imprimir média do aluno e a mensagem;

No próximo passo vamos expandir as acções para imprimir a média e a


mensagem. Como essas informações só deverão ser mostradas quando o
aluno estiver aprovado, então essas acções devem estar subordinados a um
comando condicional.

1- declarar nota1, nota2, nota3, mediaAluno;


2- ler(nota1, nota2, nota3);
3- calcular mediaAluno = ( nota1 + nota2 + nota3 )/3;
4- se mediaAluno >= 10 então
5- inicio
6- imprimir(mediaAluno);
7- imprimir("Aprovado");
8- fim

Como todas as linhas do nosso algoritmo estão claras e sem ambiguidade,


estamos em condições de escrever um programa em C.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1,nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia : "); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia : ");scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia : ");scanf("%d",&nota3);
mediaAluno = (nota1 + nota2 + nota3)/3.0;
if ( mediaAluno >= 10.0 )
{
printf(" \n Media = %.2f ", mediaAluno);
printf(" Aprovado \n ");
}
system("PAUSE");
return 0;
}

Sempre que tivermos de executar mais do que uma acção devemos utilizar o
conceito de bloco.
59
Fundamentos de Programação em C: Uma Abordagem Algorítmica

O segundo exemplo consiste em desenvolver um programa para ler dois


números inteiros e mostrar o maior.

Numa primeira abordagem, a solução deste problema é descrita pelos


seguintes passos:

Versão 1
1- ler os números;
2- determinar o maior elemento;
3- imprimir o resultado;

Sejam a e b as variáveis que representam esses números. Assumimos que


essas variáveis são do tipo inteiro.

int a, b;

Estamos em condições de refinar a versão anterior com as seguintes acções:


declarar as variáveis, especificar uma ação de leitura e descrever um método
genérico para o determinar o maior elemento.

Versão 2
1- declarar a, b;
2- ler (a,b);
3- comparar a com b para definir o maior;
4- imprimir o maior;

No próximo passo vamos descrever com maior rigor um método para calcular o
maior elemento. Este método baseia-se nas seguintes comparações:

se a > b então
armazenar na variável max o valor de a;
se b > a então
armazenar na variável max o valor de b;

onde max é uma variável auxiliar do tipo inteiro. Então, o algoritmo será
descrito pelos seguintes passos.

Versão 3
1- declarar a, b, max;
2- ler (a,b);
3- se a > b então
4- armazenar na variável max o valor a;
5- se b > a então
6- armazenar na variável max o valor b;
4- imprimir (max);

Como todas as linhas do nosso algoritmo estão claras e sem ambiguidade,


podemos traduzi-lo para um programa em C.
60
Fundamentos de Programação em C: Uma Abordagem Algorítmica

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int a, b, max;
printf(" \n Entre com um numero inteiro: "); scanf(" %d", &a);
printf(" \n Entre com outro numero inteiro: "); scanf(" %d", &b);
if (a > b)
max = a;
if (b > a)
max = b;
printf(" \n Maior valor = %d ", max);
system("PAUSE");
return 0;
}

Será que esse programa devolve os resultados que esperamos? Vamos


analisar o seu comportamento dados maliciosos. Suponha que o utilizador
tenha digitado dois números iguais. Como a variável max não recebe nenhum
valor, o programa vai imprimir o lixo que essa variável contêm.

É da responsabilidade do programador desenvolver algoritmos que testem


todas as condições possíveis.

Apresentaremos em seguida uma versão que trata dessa condição.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int a, b;
printf(" \n Entre com um numero inteiro : "); scanf(" %d", &a);
printf(" \n Entre com outro numero inteiro : "); scanf(" %d", &b);
if (a == b)
printf(" \n Erro: valores iguais ");
if (a > b)
printf(" \n Maior valor = %d ", a);
if (b > a)
printf(" \n Maior valor = %d ", b);
system("PAUSE");
return 0;
}

4.3- Comando Condicional Composto


O comando condicional composto possui à seguinte sintaxe:
61
Fundamentos de Programação em C: Uma Abordagem Algorítmica

if (expressão)
Bloco de comandos1;
else
Blocos de comandos2;

e carateriza-se por:

1º- Calcular o valor lógico da expressão;


2º- Se o resultado for verdadeiro, executar o bloco de comandos1 e continuar o
fluxo do programa, no primeiro comando que estiver depois do delimitador
de término do bloco do comandos2;
3º- Se o resultado for falso, executar o bloco de comandos2 e continuar o fluxo
do programa, no primeiro comando que estiver depois do delimitador de
término desse bloco.

Em termos de linguagem algorítmica, esse comando é descrito pela seguinte


sintaxe:
se expressão lógica for verdadeira então
Bloco de comandos1;
senão
Bloco de comandos2;

Vamos consolidar esse conceito com alguns exemplos. O primeiro é uma


generalização de um exemplo visto na secção anterior. Agora queremos que o
programa mostre a situação escolar do estudante.

Com os conhecimentos que possuímos, este programa necessitará de dois


comandos condicionais simples, um para verificar se o estudante aprovou e um
outro para verificar se ele reprovou.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia : "); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia : "); scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia : "); scanf("%d",&nota3);
mediaAluno = (nota1 + nota2 + nota3)/3.0;
printf(" \n Media = %.2f ", mediaAluno);
if (mediaAluno >= 10.0)
printf(" Aprovado \n");
if (mediaAluno < 10.0)
printf( " Reprovado \n");
system("PAUSE");
return 0;
}
62
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Esta solução, apesar de funcionar não é eficiente. Suponhamos sem perda da


generalidade, que o estudante tenha uma média igual a treze. O programa
avalia a expressão relacional que verifica se a média é positiva. Como o
resultado é verdadeiro, mostra a mensagem "Aprovado". Mas, em seguida,
volta a avaliar a expressão relacional que verifica se a média é negativa. Como
essa comparação desnecessária, temos uma prova factual que mostra a sua
ineficiência.

Uma solução eficiente consiste em avaliar uma e apenas uma vez a expressão
relacional. Em função do valor lógico, o programa imprime a correspondente
mensagem. Vejamos a implementação dessa estratégia.

Sabemos, pela secção anterior, o segunda passo da solução deste problema é


descrito por:

Versão 2
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- calcular mediaAluno = (nota1 + nota2 + nota3) / 3;
4- imprimir a média e a mensagem;

No próximo passo, vamos expandir a acção para imprimir a média e a


corresponde mensagem. Como essa acção depende do valor da expressão
mediaAluno ≥ 10, vamos utilizar o comando condicional composto.

Versão 3

1- declarar nota1, nota2, nota3, mediaAluno;


2- ler(nota1, nota2, nota3);
3- calcular mediaAluno = (nota1 + nota2 + nota3) / 3;
4- se mediaAluno >= 10 então
5- inicio
6- imprimir(mediaAluno);
7- imprimir( "Aprovado");
7- fim
8- senão
9- inicio
10- imprimir(mediaAluno);
11- imprimir( "Reprovado");
12- fim

Vamos analisar com muito cuidado esta versão. Ela está de facto correcto. Mas
a acção para imprimir a média do aluno está repetida. Ela é executada quando
a expressão mediaAluno >= 10 for verdadeira ou falsa.

Constitui uma má practica de programação repetir a mesma acção em cada


braço do comando condicional composto.

63
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Para evitar esta redundância de código (repetição da mesma acção), devemos


colocar essa acção antes do comando condicional.

Versão 4
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- calcular mediaAluno = (nota1 + nota2 + nota3) / 3;
4- imprimir(mediaAluno);
5- se mediaAluno >= 10 então
6- imprimir( "Aprovado");
7- senão
8- imprimir( "Reprovado");

Como todas as linhas do nosso algoritmo estão claras e sem ambiguidade,


podemos traduzi-lo para um programa em C.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia : "); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia : ");scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia: ");scanf("%d",&nota3);
mediaAluno = (nota1 + nota2 + nota3)/3.0;
printf(" \n Media = %.2f ", mediaAluno);
if ( mediaAluno >= 10.0)
printf(" Aprovado \n");
else
printf(" Reprovado \n");
system("PAUSE");
return 0;
}

Quando tivermos programas que testam condições mutuamente exclusivas


devemos utilizar o comando condicional composto.

O segundo exemplo, consiste em resolver um problema que também foi visto


na secção anterior. Dado dois números inteiros, determinar o maior.

No sentido de consolidar os seus conhecimentos deixamos como exercicio o


desenvolvimento de um algoritmo. Mostraremos apenas o correspondente
programa.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
64
Fundamentos de Programação em C: Uma Abordagem Algorítmica

{
int a, b;
printf(" \n Entre com um numero inteiro : "); scanf(" %d", &a);
printf(" \n Entre com outro numero inteiro : "); scanf(" %d", &b);
if (a == b)
printf(" \n ERRO: Valores iguais ");
if (a > b)
printf(" \n Valor maximo = %d ",a);
else
printf(" \n Valor maximo = %d ",b);
system("PAUSE");
return 0;
}

Este programa devolve os resultados que esperamos? Numa simples


inspecção parece-mos que sim. Mas se o utilizador digitar dois números iguais,
por exemplo a= 5 e b= 5, o programa irá mostrar na tela a mensagem ERRO:
Valores iguais e na linha seguinte a mensagem Valor maximo = 5. Veremos
mais tarde um método eficiente para corrigir esse erro.

4.4 - Condições Compostas


As condições compostas ou composição de condições consistem na
conjunção, disjunção e negação da expressão relacional. Elas servem para
tornar os programas mais legíveis.

Vamos mais uma vez, consolidar esse conceito com uma generalização de um
exemplo estudado na secção anterior. Agora, queremos que a mensagem
"Aprovado" e a correspondente média sejam impressas, se o estudante tiver
uma média positiva e nenhuma a nota inferior a oito valores nas frequências.
Tendo em conta o desenvolvimento desse algoritmo na secção anterior, a
segunda versão é descrita por:

Versão 2
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- calcular à média do aluno;
4- imprimir média do aluno e a mensagem;

No próximo passo, vamos expandir as acções associadas ao cálculo da média.


Para calcular a média temos de verificar em primeiro lugar, qual a situação do
estudante em relação as três notas de frequências.

Versão 3
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- se nota1 > 8 e nota2 > 8 e nota3 > 8 então
4- inicio
65
Fundamentos de Programação em C: Uma Abordagem Algorítmica

5- calcular à média do aluno;


6- imprimir à média do aluno e a mensagem
7- fim

No próximo passo, vamos escrever a fórmula para cálcular a média e as


acções para imprimir o seu valor e a mensagem "Aprovado".

Versão 4
1- declarar nota1, nota2, nota3, mediaAluno;
2- ler(nota1, nota2, nota3);
3- se nota1 > 8 e nota2 > 8 e nota3 > 8 então
4- inicio
5- calcular mediaAluno = ( nota1 + nota2 + nota3)/3.0;
6- se mediaAluno >= 10 então
7- inicio
8- imprimir (mediaAluno);
9- imprimir("Aprovado");
10- fim
11- fim

Como todas as linhas são claras e precisas, vamos traduzi-lo para um


programa em C.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia : "); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia : "); scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia: "); scanf(“%d",&nota3);
if ((nota1 > 8) && (nota2 > 8) && (nota3 > 8))
{
mediaAluno = (nota1 + nota2 + nota3)/3.0;
if (mediaAluno > 10.0)
{
printf("\n Media = %.2f ", mediaAluno);
printf(" Aprovado \n");
}
}
system("PAUSE");
return 0;
}

Vamos generalizar este problema. O programa deve mostrar a situação escolar


de qualquer estudante, ou seja: o estudante estará aprovado, se possuir em
todas as frequências uma nota superior ou igual a 8 valores e uma média
superior ou igual a 10; no caso contrário estará reprovado.
66
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Acreditamos que o leitor não terá qualquer dificuldade em desenvolver esse


algoritmo. Por esse facto, apresentamos em seguida, um programa em C que é
a solução do nosso problema.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia : "); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia : "); scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia: "); scanf("%d",&nota3);
if ( (nota1 > 8) && (nota2 > 8) && (nota3 > 8) )
{
mediaAluno = (nota1 + nota2 + nota3)/3.0;
if ( mediaAluno > 10.0 )
printf(" Media = %.2f Aprovado \n",mediaAluno);
else
printf(" Media = %.2f Reprovado \n",mediaAluno);
}
else
printf(" Reprovado \n");
system("PAUSE");
return 0;
}

4.5 - Comando Condicional Encadeado


Para modelar alguns problemas reais poderemos ter a necessário de utilizar
um comando condicional composto dentro de um outro comando condicional
composto. A esse processo de aninhamento de comandos condicionais dá-se o
nome de comando condicional encadeado.

Para consolidar esse conceito, vamos estudar algumas estratégias para


implementar um programa que classifica as médias dos estudantes em função
da tabela:

Média Classificação
≤8 Reprovado
> 8 e ≤ 12 Vai a Exame
> 12 e ≤ 14 Dispensado ao Exame
> 14 Defesa de Nota

A primeira estratégia (força bruta) consiste em utilizar uma sequência de


comandos condicionais simples com condições compostas, não aninhados.
67
Fundamentos de Programação em C: Uma Abordagem Algorítmica

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia : "); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia : "); scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia: "); scanf("%d",&nota3);
mediaAluno = (nota1 + nota2 + nota3)/3.0;
printf(" \n media = %.2f ", mediaAluno);
if ( mediaAluno > 14.0)
printf(" Defesa de Nota \n");
if ( (mediaAluno > 12.0) && (mediaAluno <= 14.0))
printf(" Dispensado ao Exame \n");
if ( (mediaAluno > 8.0) && (mediaAluno <= 12.0))
printf(" Vai a exame \n");
if ( mediaAluno <= 8.0 )
printf(" Reprovado \n");
system("PAUSE");
return 0;
}

Esta solução é eficiente? Claro que não. Para provar essa afirmação, vamos
analisar o comportamento do programa com um exemplo. Suponhamos que o
estudante tenha uma média igual a dezaseis valores. Inicialmente o programa
verifica se a média é superior a catorze. Como o resultado dessa comparação
é verdadeiro o programa mostra a classificação na tela. Mas, em seguida volta
a executar as restantes comparações. Isso é um absurdo.

A segunda estratégia, que também consideramos de força bruta, consiste em


utilizar o comando condicional encadeado com condições compostas.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1,nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia :"); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia :"); scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia:"); scanf("%d",&nota3);
mediaAluno = (nota1 + nota2 + nota3)/3.0;
printf(" \n Media = %.2f ", mediaAluno);
if ( mediaAluno > 14.0)
printf(" Defesa de Nota \n");
else if ( (mediaAluno > 12.0) && (mediaAluno <= 14.0))
printf(" Dispensado ao Exame \n");
68
Fundamentos de Programação em C: Uma Abordagem Algorítmica

else if ( (mediaAluno > 8.0) && (mediaAluno <= 12.0))


printf(" Vai a Exame \n");
else
printf(" Reprovado \n");
system("PAUSE");
return 0;
}

Este programa é eficiente? Mais uma vez dizemos que não, e como prova
dessa afirmação, vamos analisar o seu comportamento com um exemplo.
Suponhamos que o estudante tenha uma média igual a treze valores.
Inicialmente o programa verifica se a média é superior a catorze valores. Como
essa comparação é falsa, o programa vai verificar se a média é superior a doze
valores e inferior ou igual a catorze valores. Mas nessa altura já sabemos que a
média é inferior ou igual a catorze valores, logo esta comparação é
desnecessária. Isto é uma prova que o programa não é eficiente.

A terceira estratégia, a mais eficiente, consiste em utilizar o comando


condicional encadeado sem condições compostas.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf(" \n Entre com a nota da primeira frequencia :"); scanf("%d",&nota1);
printf(" \n Entre com a nota da segunda frequencia :"); scanf("%d",&nota2);
printf(" \n Entre com a nota da terceira frequencia:"); scanf("%d",&nota3);
mediaAluno = (nota1 + nota2 + nota3)/3.0;
printf(" \n Media = %.2f ", mediaAluno);
if (mediaAluno > 14.0)
printf(" Defesa de Nota \n");
else if (mediaAluno > 12.0)
printf(" Dispensado ao Exame \n");
else if (mediaAluno > 8.0)
printf(" Vai a Exame \n");
else
printf(" Reprovado \n");
system("PAUSE");
return 0;
}

Não fazem parte das boas prácticas de programação utilizar condições


compostas nas expressões relacionais de um comando condicional
encadeado.

69
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Para terminar a secção vamos desenvolver um programa eficiente para


resolver o problema de determinar o maior valor entre dois números inteiros
digitados pelo utilizador.

Mais uma vez, deixamos o desenvolvimento do algoritmo como exercicio.


Mostraremos a seguir um programa em C, que resolve esse problema.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int a, b;
printf(" \n Entre com um numero : "); scanf("%d", &a);
printf(" \n Entre com outro numero : "); scanf("%d", &b);
if (a == b)
printf(" \n ERRO: valores iguais ");
else if (a > b)
printf(" \n Valor maximo = %d ",a);
else
printf(" \n Valor maximo = %d ",b);
system("PAUSE");
return 0;
}

4.6 – Regras de Conversão

Vamos estudar algumas regras para converter um comando condicional com


condições compostas num comando condicional encadeado sem condições
compostas.

Vejamos em primeiro lugar, um programa que utiliza o comando condicional


composto cuja expressão relacional baseia-se numa disjunção de condições.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
#include <ctype.h> /* incluir a função toupper() */
int main()
{
int numFilhos;
float salarioBase, bonus;
char sexo;
printf(" \n Entre com o sexo do trabalhador: "); scanf("%c",&sexo);
printf(" \n Entre com o numero de filhos :"); scanf("%d",&numFilhos);
printf(" \n Entre com o salario de base :"); scanf("%f",&salarioBase);
if ((toupper(sexo) == ‘F’) || (numFilhos != 0))
bonus = 40000;
70
Fundamentos de Programação em C: Uma Abordagem Algorítmica

else
bonus = 30000;
printf("Novo salario = %.2f",salarioBase + bonus);
system ("PAUSE");
return 0;
}

O funcionamento deste comando condicional composto é descrito pela tabela


de verdade.

sexo= ‘F’ numFilhos != 0 sexo = ‘F’ ou numFilhos != 0 Bónus


1 1 1 40.000,00
1 0 1 40.000,00
0 1 1 40.000,00
0 0 0 30.000,00

e interpretado pelas seguintes sentenças:

1ª Linha: Atribuir um bónus de 40.000,00 Kz aos trabalhadores do sexo


feminino com filhos;

2ª Linha: Atribuir um bónus de 40.000,00 Kz aos trabalhadores do sexo


feminino sem filhos;

3º Linha: Atribuir um bónus de 40.000.00 Kz aos trabalhadores do sexo


masculino com filhos.

4º Linha: Atribuir um bónus de 30.000,00 Kz aos trabalhadores do sexo


masculimo sem filhos.

Observamos pela 1ª e 2ª linha, que o valor do bónus para os trabalhadores o


sexo feminino, não depende do número de filhos. Logo essas linhas podem ser
optimizadas e o funcionamento dessa tabela pode ser descrito pelas seguintes
sentenças

Atribuir um bónus de 40.000,00 Kz aos trabalhadores do sexo feminino;

Atribuir um bónus de 40.000.00 Kz aos trabalhadores do sexo masculino


com filhos;

Atribuir um bónus de 30.000,00 Kz aos trabalhadores do sexo


masculimo sem filhos.

Como essas sentenças são mutuamente exclusivas, podem ser modeladas


pelo comando condicional encadeado, algo como:

se trabalhador do sexo feminino então


atribuir um bónus de 40.000,00;
senão
71
Fundamentos de Programação em C: Uma Abordagem Algorítmica

se trabalhador do sexo masculino então


se trabalhador possui filhos então
atribuir um bonus de 40.000,00;
senão
atribuir um bonus de 30.000,00;

Mas todo ser humano ou é do sexo masculino ou do feminino e não de um


terceiro. Em função desse príncipio de exclusão, podemos concluir que não faz
sentido verificar se um trabalhador é do sexo masculino, quando a condição de
ser do sexo feminino for falsa. Logo, o algoritmo anterior pode ser optiomizado
para:

se trabalhador do sexo feminino então


atribuir um bónus de 40.000,00;
senão
se trabalhador possui filhos então
atribuir um bonus de 40.000,00;
senão
atribuir um bonus de 30.000,00;

Estamos em condições de escrever um programa equivalênte que utiliza o


comando condicional encadeado sem condições compostas.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
#include <ctype.h> /* incluir a função toupper() */
int main()
{
int numFilhos;
float salarioBase, bonus;
char sexo;
printf(" \n Entre com o sexo do trabalhador: "); scanf("%c",&sexo);
printf(" \n Entre com o numero de filhos :"); scanf("%d",&numFilhos);
printf(" \n Entre com o salario de base :"); scanf("%f",&salarioBase);
if (toupper(sexo) == ‘F’)
bonus = 40000; /* bonus para as mulheres /*
else
if (numFilhos != 0)
bonus = 40000; /* bonus para homens com filhos */
else
bonus = 30000; /* bonus para homens sem filhos */
printf("salario final = %.2f",salarioBase + bonus);
system ("PAUSE");
return 0;
}

Vejamos mais um exemplo. Agora o nosso programa utiliza o comando


condicional composto cuja expressão relacional baseia-se numa conjunção de
condições.
72
Fundamentos de Programação em C: Uma Abordagem Algorítmica

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int numFaltas;
float salarioBase, aumento;
printf(" \n Entre com o numero de faltas :"); scanf("%d",&numFaltas);
printf(" \n Entre com o salario de base :"); scanf("%f",&salarioBase);
if ((salarioBase < 1000.00) && (numFaltas < 2))
aumento = salarioBase* 010;
else
aumento = salarioBase * 0.05;
printf("Novo salario = %.2f",salarioBase + aumento);
system ("PAUSE");
return 0;
}

O funcionamento desse comando condicional composto é descrito pela


seguinte tabela de verdade.

salario < 1000 faltas < 2 salario < 1000 e faltas < 2 Aumento
1 1 1 10%
1 0 0 5%
0 1 0 5%
0 0 0 5%

e interpretado pelas seguintes sentenças:

1ª Linha: Atribuir um aumento de 10% aos trabalhadores que têm um salário


inferior a 1.000,00 Kz e menos do que duas faltas;

2ª Linha: Atribuir um aumento de 5% aos trabalhadores que têm um salário


inferior a 1.000,00 Kz e mais do que duas faltas;

3ª Linha: Atribuir um aumento de 5% aos trabalhadores que têm um salário


superior a 1.000,00 Kz e menos do que duas faltas;

4ª Linha: Atribuir um aumento de 5% aos trabalhadores que têm um salário


superior a 1.000,00 Kz e mais do que duas faltas.

Observamos pela 3ª e 4ª linha que o trabalhador com um salário superior a


1.000,00 Kz têm um aumento de 5% independemente do número de faltas.
Logo, o funcionamento dessa tabela pode ser descrito pelas seguintes
sentenças:

Atribuir um aumento de 10% aos trabalhadores que têm um salário inferior a


1.000,00 Kz e têm menos do que duas faltas;

73
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Atribuir um aumento de 5% aos trabalhadores que têm um salário inferior a


1.000,00 Kz e têm mais do que duas faltas;

Atribuir um aumento de 5% aos trabalhadores que têm um salário superior a


1.000,00 Kz.

Apresentamos em seguida um programa equivalente ao anterior, que utiliza o


comando condional encadeado.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int numFaltas;
float salarioBase, aumento;
printf(" \n Entre com o numero de faltas : "); scanf("%d",&numFaltas);
printf(" \n Entre com o salario de base : "); scanf("%f",&salarioBase);
if (salarioBase < 1000.0)
if (numFaltas < 2)
aumento = salarioBase* 010;
else
aumento = salarioBase * 0.05;
else
aumento = salarioBase*0.05;
printf(" \n Novo salario = %.2f ",salarioBase +aumento);
system ("PAUSE");
return 0;
}

Constitui má practica de programação, efectuar comparações de igualdade


com variáveis reais.

4.7 – Comando Selectivo


Nas secções anteriores, estudamos os comandos condicionais simples e
composto. Verificamos que poderiamos utilizar esses comandos para executar
uma acção num conjunto de múltiplas condições mutuamente exclusivas. As
linguagens de programação modernas possuem um comando de selecção que
permite manipular essa tomada de decisão de forma compacta e mais
elegante. Esse comando denominado por switch-case, possui a seguinte
sintaxe:

switch (expressão)
{
case rotulo1 :
comandos1;
74
Fundamentos de Programação em C: Uma Abordagem Algorítmica

break;
case rotulo2 :
comandos2;
break;
.
.
case rotulon :
comandosn;
break;
default:
comandos;
}

onde a expressão é do tipo inteiro ou caracter e os rótuloi são constantes do


mesmo tipo da expressão.

O funcionamento desse comando é caracterizado por:

1º- Calcular o valor da expressão;


2º- Procurar o rótuloi ( 1≤ i ≤ n) tais que rotuloi = valor da expressão;
3º- Se o rótuloi for encontrado executar os comandosi.
4º- Se o rótuloi não foi encontrado, executar os comandos associado a cláusula
default (que é opcional).

Os rótulos apenas indicam o ponto onde o programa começa a executar um


conjunto de acções no interior do comando swicth. Para determinar o seu
término devemos utilizar o comando break, que ao ser acionado transfere o
fluxo de execução do programa para a primeira linha que estiver depois do
delimitador de fim de bloco.

Se não colocarmos no interior de cada rótulo um comando break, o programa


começa a executar as acções associadas ao rótulo cujo valor é igual a
expressão e continua a executar as acções de todos os rótulos cujos valores
são superiores a expressão.

Em termos de linguagem algorítmica este comando é descrito pela seguinte


sintaxe:

caso expressão seja


rotulo1 : comandos1;
rotulo2: Comandos2;
.
.
rotulon : comandosn;
caso contrário comandos;

Vejamos um exemplo ilustrativo. Desenvolva um programa para implementar


uma máquima de calcular com as operações de adição, subtração,
multiplicação e divisão no domínio real.
75
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Com base no método de refinamento sucessivo, a solução deste problema é


descrita pelos seguintes passos:

Versão 1
1- ler a operação e os operandos;
2- em função da operação
3- calcular o resultado;
4- imprimir o resultado;

Pelo enunciado, temos como dados de entrada dois números inteiros que são
os operandos e um caracter que é a operação. Como informação de saída
temos o resultado de uma operação. Sejam numero1, numero2, resultado e
operação as variáveis que representam esses valores. Vamos associa-las aos
seus tipos de dados.

float numero1, numero2, resultado;


char operacao;

Estamos em condições de refinar a versão anterior com a declaração das


variáveis e a formalização de uma acção de leitura e de impressão.

Versão 2
1- declarar numero1, numero2, resultado, operacao;
2- ler(numero1, operacao, numero2);
3- em função da operação
4- calcular o resultado;
4- imprimir (resultado);

No próximo passo, vamos escrever com mais rigor, um método para calcular o
resultado em função da operação. Como estamos em presença de um conjunto
de quatro operações mutuamente exclusivas, vamos modelar essa acção com
o comando selectivo.

Versão 3
1- declarar numero1, numero2, resultado, operacao;
2- ler(numero1, operacao, numero2);
3- caso operacao seja
'+' : calcular resultado = numero1 + numero2;
' -' : calcular resultado = numero1 - numero2;
'*' : calcular resultado = numero1 * numero2;
'/' : calcular resultado = numero1 / numero2;
4- imprimir (resultado);

O algoritmo parece que funciona. Mas o que acontece se o utilizador digitar um


caracter não permitido? Por exemplo a percentagem. Como essa situação não
foi prevista o programa devolve um valor indeterminado. Observe que para

76
Fundamentos de Programação em C: Uma Abordagem Algorítmica

esse caracter a variável resultado não recebe nenhum valor. Para corrigir esse
erro devemos utilizar a clausúla senão do comando selectivo.

Versão 4
1- declarar numero1, numero2, resultado, operacao;
2- ler(numero1, operacao, numero2);
3- caso operacao seja
'+' : imprimir (numero1 + numero2);
' -' : imprimir (numero1 - numero2);
'*' : imprimir (numero1 * numero2);
'/' : imprimir (numero1 / numero2);
caso contrário
imprimir( "ERRO: operador inválido");

Como todas as linhas do algoritmo, são claras e precisas, podemos traduzi-lo


para um programa em C.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
float numero1, numero2;
char operacao;
printf(" \n Entre com o primeiro numero inteiro:"); scanf("%f",&numero1);
printf(" \n Entre com a operação :"); scanf("%c",&operacao);
printf(" \n Entre com o segundo numero inteiro:");scanf("%f",&numero2);
switch ( operacao)
{
case '+':
printf(" \n %f ", numero1 + numero2);
break;
case '-':
printf(" \n %f ", numero1 - numero2);
break;
case '*':
printf(" \n %f ", numero1 * numero2);
break;
case '/':
printf(" \n %f ", numero1 / numero2);
break;
default :
printf("\n ERRO: Operador invalido");
}
system("PAUSE");
return 0;
}

77
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Vamos em escrever em seguida um programa equivalente com o comando


condicional encadeado.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
float numero1, numero2;
char operacao;
printf(" \n Entre com o primeiro numero inteiro:"); scanf("%f",&numero1);
printf(" \n Entre com a operação :"); scanf("%c",&operacao);
printf("\n Entre com o segundo numero inteiro:"); scanf("%f",&numero2);
if ( operacao == '+' )
printf(" \n %f ", numero1 + numero2);
else if ( operacao == '-' )
printf(" \n %f ", numero1 - numero2);
else if ( operacao == '*')
printf(" \n %f ", numero1 * numero2);
else if (operacao == '/')
printf(" \n %f ", numero1 / numero2);
else
printf(" \n ERRO: Operador invalido");
system("PAUSE");
return 0;
}

Existem alguns problemas numéricos que executam a mesma acção em várias


alternativas possíveis. Um exemplo muito simples consiste em devolver o
número de dias de um mês. Pelo calendário, os meses têm em geral 30 ou 31
dias. Mas o mês de fevereiro tem 29 dias se o ano for bissexto e 28 no caso
contrário. Vamos supor que o mês de fevereiro tem 28 dias. Então, o problema
pode ser implementado pelo seguinte programa.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int mes;
printf(" \n Entre com o mes : "); scanf("%f",&mes);
switch (mes)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
printf(" \ n mes com 31 dias");
break;
case 4: case 6: case 9: case 11:
printf(" \ n mes com 30 dias");
break;
case 2:
printf(" \ n mes com 29 dias");
78
Fundamentos de Programação em C: Uma Abordagem Algorítmica

break;
default :
printf(" \ n ERRO: mes invalido" );

}
system("PAUSE");
return 0;
}

O comando selectivo permite escrever programas mais legíveis e mais fáceis


de compreender, mas só deve ser utilizado quando o resultado das
expressões estão no domínio inteiro ou caracter.

Constitui uma boa práctica de programação, utilizar o caso default no


comando switch. Como os casos não testados explicitamente são ignorados,
o caso default faz com que o programador adopte um padrão de
programação para processar todas as condições de execepsão.

Embora os rótulos e o caso default possam ocorrer em qualquer ordem, é


considerado boa práctica de programação colocar a cláusula default no fim.

4.8 – Indentação de programas

A indentação (layout) é uma forma de representar visualmente um programa.


O seu principal objectivo é melhorar a leitura, legibilidade e interpretação.

Veremos em forma de exemplos, algumas regras para uma indentação


correcta.

No segmento de código que descrevemos em seguida, note nas diferenças de


escrita:

if (x > 0) if (x > 0)
printf("x é positivo"); printf(" x é positivo");
else else
printf("x é negativo"); printf("x é negativo");

Fácilmente se constacta que o código à direita é mais fácil de ler e


compreender do que o código à esquerda.

O segmento de código.

int temp;
79
Fundamentos de Programação em C: Uma Abordagem Algorítmica

printf(" Digite a temperatura:"); scanf(" %d",&temp);


if (temp < 30)
if (temp > 20)
printf(" \nTemperatura agradável");
else
printf(" \n Temperatura muito quente");

que tem por finalidade imprimir a mensagem "Temperatura agradável " se o


utilizador digitar um número entre 20 a 30 e " Temperatura muito quente " se o
utilizador digitar um número superior a 30. Vejamos o que aconteçe se o
utilizador digitar um valor inferior a 20. Suponhamos sem perda da
generalidade que o utilizador digitou o número 5. Pelo seu layout achamos que
nenhuma mensagem será impressa, pois vejamos. Ao executar a expressão
relacional do primeiro comando condicional, temos um valor lógico verdadeiro.
Executamos em seguida, a expressão relacional do segundo comando
condicional. Como o resultado é falso e aparentemente não temos nenhum
comando else associado, não imprimimos nenhuma mensagem.

Estamos completamente enganados. A indentação utilizada levou-nos a essa


interpretação. Mas, na linguagem C, a claúsula else está associada ao último
comando condicional. Então a mensagem "Temperatura muito quente" será
impressa sempre que esta for inferior a vinte graus.

Vamos escrever esse segmento de código de forma a obter os


resultados desejados.

int temp;
printf(" Digite a temperatura:");scanf(" %d",&temp);
if (temp < 30)
{
if (temp > 20)
printf(" \nTemperatura agradavel");
}
else
printf(" \n Temperatura muito quente");

Uma indentação correcta ajuda a tornar o código mais claro e legível, mas não
determina como o ele será executado.

Constitui uma boa práctica de programação, colocar os delimitadores de bloco


na mesma coluna. Isso ajuda a evitar a omissão de um ou de ambos.

4.9- Exercícios Resolvidos


Exemplo 4.9.1: Dado três número inteiros diferentes determinar o maior.

80
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Resolução: Numa primeira abordagem, a solução deste problema é descrita


pelos seguintes passos:

Versão 1
1- ler os três números;
2- calcular o maior;
3- imprimir o maior;

Pelo enunciado fazem parte dos dados de entradas três números inteiros
diferentes e dos dados de saída o maior deles. Vamos associar as variáveis
que representam esses números aos teus tipos de dados:

int a, b, c, max;

Estamos em condições de refinar a versão anterior com a declaração das


variáveis e a especificação de uma ação de leitura e de impressão.

Versão 2
1- declarar a, b, c, max;
2- ler (a,b,c);
3- armazenar o maior valor na variável max;
4- imprimir (max);

No próximo passo, vamos expandir a acção para armazenar o maior valor na


variável max;

1ª Estratégia: Determinar o maior elemento entre as variáveis a e b. Em


seguida, comparar esse valor que supomos que seja o maior com o conteudo
da variável c. Se esse valor for menor do que o conteúdo da variável c então c
é o maior elemento.

Versão 3
1- declarar a, b, c, max;
2- ler (a,b,c);
3- se a > b então
4- armazenar na variável max o conteudo de a;
5- senão
6- armazenar na variável max o conteudo de b;
7- se c > max então
8- armazenar na variável max o conteudo de c;
9- imprimir(max);

Como todas as linhas do nosso algoritmo são claras e precisas, vamos traduzi-
lo para um programa em C.

/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor máximo de três inteiros diferentes
Entrada : Três números diferentes
Saida : Maior
81
Fundamentos de Programação em C: Uma Abordagem Algorítmica

-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
int main()
{
int a, b, c, max;
printf(" \n Entre com o primeiro numero inteiro : "); scanf("%d",&a);
printf(" \n Entre com o segundo numero inteiro :"); scanf("%d",&b);
printf(" \n Entre com o terceiro numero inteiro :"); scanf("%d",&c);
if ( a > b)
max = a;
else
max = b;
if ( c > max)
max = c;
printf(" \n Maior valor = %d ", max);
system("PAUSE");
return 0;
}

2ª Estratégia: O maior elemento pode ser obtido comparando os elementos


dois a dois. Comparamos o conteúdo da variável a com o conteúdo da variável
b. Se o conteúdo da variável a for maior do que o conteúdo da variável b, então
comparamos o conteúdo da variável a com o conteúdo da variável c. Se o
conteúdo da variável a for maior do que o conteúdo da variável c então o maior
elemento está na variável a, no caso contrário, o maior elemento está na
variável c. Repetimos este processo para todas as combinações possíveis.
Essa estratégia é descrita pelo seguinte programa:

/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor máximo de três números inteiros
Entrada : Três números diferentes
Saida : Maior elemento
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
int main()
{
int a, b, c, max;
printf(" \n Entre com o primeiro numero inteiro : "); scanf("%d",&a);
printf(" \n Entre com o segundo numero inteiro :"); scanf("%d",&b);
printf(" \n Entre com o terceiro numero inteiro :"); scanf("%d",&c);
if (a > b)
if (a > c)
max = a;
else
max = c;
else if (b > c)
max = b;
82
Fundamentos de Programação em C: Uma Abordagem Algorítmica

else
max = c;
printf(" \n Maior Valor = %d ",max);
system("PAUSE");
return 0;
}

3ª Estratégia: Utilizar a composição de condiçoes. Sabemos que a conjunção


de duas proposições é verdadeira quando as proposições forem verdadeiras.
Então, podemos utilizar essa propriedade para determinar o valor máximo de
três variáveis diferentes. Com esta estratégia é descrita pelo seguinte
programa.

/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o valor máximo de três números inteiros
Entrada : Três números diferentes
Saida : Maior elemento
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
int main()
{
int a, b, c, max;
printf(" \n Entre com o primeiro numero inteiro : "); scanf("%d",&a);
printf(" \n Entre com o segundo numero inteiro :"); scanf("%d",&b);
printf(" \n Entre com o terceiro numero inteiro :"); scanf("%d",&c);
if ((a > b) && (a > c)) max = a;
if ((b > c) && ( b > a)) max = b;
if ((c > a) && ( c > b)) max = c;
system("PAUSE");
return 0;
}

Exemplo 4.9.2: Calcular as raízes reais da equação do segundo grau


ax2+ bx + c = 0. Para todo a, b e c desde que a ≠ 0.

Resolução: Com base na matemática elementar, as raízes de um trinómio do


segundo grau são obtidas pela fórmula de Bhaskara.

−𝑏 ∓ √𝑏𝑏−4𝑎𝑐
X=
2𝑎
para

−𝑏− √𝑏𝑏−4𝑎𝑐 −𝑏+ √𝑏𝑏−4𝑎𝑐


X1 = e X2 =
2𝑎 2𝑎

desde que b2- 4ac ≥ 0.


83
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Numa primeira abordagem, a solução deste problema pode ser descrita pelos
seguintes passos:

Versão 1
1- ler os dados;
2- calcular as raízes da solução;
3- imprimir os resultados;

Pelo enunciado, temos como variáveis de entrada: a, b, c e como variáveis de


saída x1, x2. Vamos associar essas variáveis aos seus tipos de dados com a
seguinte declaração.

int a, b, c;
float x1, x2;

Estamos em condições de refinar a versão anterior com a declaração das


variáveis e a formalização das acções de leitura e impressão.

Versão 2
1- declarar a, b, c, ,x1, x2;
2- ler (a,b,c);
3- calcular as raizes reias da solução;
4- imprimir(x1,x2);

No proximo passo vamos detalhar a acção para calcular as raizes reais da


solução. Com base na matemática elementar sabemos que um trinómio do
segundo grau tem raizes reais se o discriminate for maior ou igual a zeros.

Versão 3
1- declarar a, b, c, ,x1, ,x2;
2- ler (a,b,c);
3- calcular o valor do discriminante;
4- se discri ≥ 0 então
5- calcular as raízes reais;
6- senão
7- imprimir( "O problema não tem solução");
8- imprimir(x1,x2);

No proximo passo, vamos declarar uma variável auxiliar para armazenar o


valor do discriminatente e descrever a fórmula linear para o seu cálculo.

Versão 4
1- declarar a, b, c , x1, x2, descri;
2- ler (a,b,c);
3- calcular descri = b*b - 4*a*c;
4- se discri ≥ 0 então
5- calcular as raízes reais;
6- senão
84
Fundamentos de Programação em C: Uma Abordagem Algorítmica

7- imprimir( "O problema não tem solução");


8- imprimir(x1,x2);

No próximo passo vamos descrever com mais rigor a impressão das soluções.
As raizes só devem ser impressas se tivermos a certeza que o descriminante é
maior ou igual a zeros. Queremos com isso dizer que essa acção deve estar
contida, no bloco de acções, subordinado a condição de verdadeira dessa
compração.

Versão 5
1- declarar a, b, c , x1, x2, descri;
2- ler (a,b,c);
3- calcular descri = b*b - 4*a*c;
4- se discri ≥ 0 então
5- inicio
6- calcular as raízes reais;
7- imprimir(x1,x2);
8- fim
9- senão
10- imprimir(" Erro: Raizes complexas ");

No próximo passo, vamos descrever as fórmulas lineares para o cálculo das


raizes reias.

Versão 6
1- declarar a, b, c , x1, x2, descri;
2- ler (a,b,c);
3- calcular descri = b*b - 4*a*c;
4- se discri ≥ 0 então
5- inicio
6- calcular x1 = - b - srqt(b*b - 4*a*c);
7- calcular x1 = -b + srqt(b*b - 4*a+c);
8- imprimir(x1,x2);
9- fim
10- senão
11- imprimir(" Erro: Raizes complexas ");

Como todas as linhas do nosso algoritmo são claras e precisas, vamos traduzi-
lo para um programa em C.

/*--------------------------------------------------------------------------------------------------------
Objectivo: Resolução de uma equação do 2º grau
Entrada : Três números inteiros
Saida : Raízes da equação de 2º grau
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
85
Fundamentos de Programação em C: Uma Abordagem Algorítmica

#include <math.h> /* incluir a função sqrt() */


int main()
{
int a, b, c;
float x1, x2, descri;
printf(" \n Entre com o valor de a : "); scanf("%d",&a);
printf(" \n Entre com o valor de b :"); scanf("%d",&b);
printf(" \n Entre com o valor de c :"); scanf("%d",&c);
descri = b*b – 4*a*c;
if ( descri >= 0 )
{
x1 = ( - b - sqrt(descri) )/ 2*a;
x2 = ( - b + sqrt(descri) )/ 2*a;
printf(" \n As raízes reais do trinomio são %f e %f ", x1,x2);
}
else
printf(" \n Erro: Raizes complexas ");
system("PAUSE");
return 0;
}

O programa devolve os resultados que esperamos? É claro que não. Se o


utilizador entrar com os dados a= 0, b= 5 e c=10 o programa não funciona.
Como não temos uma equação do segundo grau e o programa deveria emitir
uma mensagem a notificar tal facto. Apresentamos em seguida uma nova
versão que testa essa condição.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
#include <math.h> /* incluir a função sqrt() */
int main()
{
int a, b, c;
float x1, x2, descri;
printf(" \n Entre com o valor de a : "); scanf("%d",&a);
printf(" \n Entre com o valor de b :"); scanf("%d",&b);
printf(" \n Entre com o valor de c:"); scanf("%d",&c);
if ( a==0 )
printf(" \n Erro: a = 0 não temos um trinomio ");
else
{
descri = b*b – 4*a*c;
if ( descri >= 0 )
{
x1 = ( - b - sqrt(descri))/ 2*a;
x2 = ( - b + sqrt(descri))/ 2*a;
printf(" \n As raízes reais do trinomio são %f e %f ", x1,x2);
}
else
86
Fundamentos de Programação em C: Uma Abordagem Algorítmica

printf(" \n Erro: Raizes complexas ");


}
system("PAUSE");
return 0;
}

Observe no layout deste algoritmo. Os comandos estão organizados de tal


forma que se consegue ver o casamento entre os delimitadores de bloco.
Consegue-se também perceber que existe uma certa organização no comando
condicional composto e na descrição dos comandos sequenciais. Eles estão
descritos por níveis de profundidade. Um programa bem identado deve ter esse
layout.

Problema 4.9.3: O Ministério da Família e da Promoção da Mulher, pretende


diminuir o fosso salarial entre homens e mulheres. Para isso, foi aprovado em
diário da República um decreto que fixa a seguinte correção de salários: Todas
as empresas deverão aumentar o salário de base das mulheres em 7%, e por
cada filho, um aumento adicional de 0.9 %. O programa deve receber a
seguinte informação: número do trabalhador, sexo, salário de base e número
de filhos.

Resolução: Numa primeira abordagem, a solução deste problema é descrita


pelos seguintes passos:

Versão 1
1- ler os dados;
2- calcular o aumento;
3- imprimir os resultados;

Pelo enunciado, fazem parte dos dados de entrada, o número do trabalhador, o


sexo, o salário de base e o número de filhos. Fazem parte da informação de
saída, o número do trabalhador e o salário final. Vamos associar essas
entidadeas as respectivas variáveis e aos seus tipos de dados:

char sexo;
float salarioBase, salarioFinal;
int numeroFilhos, codigo;

Estamos em condições de refinar a versão anterior, com a declaração das


variáveis e com a especificação de uma acção de leitura e impressão.

Versão 2
1- declarar sexo;
2- declarar salarioBase, salarioFinal;
3- declarar numeroFilhos, codigo;
4- ler (codigo, sexo, numeroFilhos, salarioBase);
5- calcular aumento salarial;
6- imprimir (codigo, salarioFinal);

87
Fundamentos de Programação em C: Uma Abordagem Algorítmica

No próximo passo vamos expandir a acção para calcular o aumento salarial.


Pelo enunciado, sabemos que esse aumento só irá afectar as trabalhadoras da
empresa e irá incidir em duas rubricas: aumento sobre o salário de base e
aumento por número de filhos. Isso leva-mos a declarar duas variáveis
auxiliares, uma para o aumento do salário de base e outra para o aumento por
número de filhos. Sejam:

float aumentoBase, aumentoPorFilho;

essas variáveis.

Versão 3
1- declarar sexo;
2- declarar salarioBase, salarioFinal, aumentoBase, aumentoPorFilho;
3- declarar numeroFilhos, codigo;
4- ler (codigo, sexo, numeroFilhos, salarioBase);
5- se sexo = ‘F’ então
6- inicio
7- calcular o aumento de base;
8- calcular o aumento por filhos;
9- fim
10- senão
11- inicio
12- armazenar zeros no aumento de base;
13- armazenar zeros no aumento por filhos;
14- fim
15- calcular o salario final;
16- imprimir(salarioFinal);

No próximo passo, vamos expandir a acção para calcular o aumento por


número de filhos.

Versão 4
1- declarar sexo;
2- declarar salarioBase, aumentoBase, aumentoPorFilho, salarioFinal;
3- declarar numeroFilhos, codigo;
4- ler (codigo, sexo, numeroFilhos, salarioBase);
5- se sexo = ‘F’ então
6- inicio
7- calcular o aumento de base;
8- se numeroFilhos > 0 então
9- calcular o aumento por filhos;
10- senão
11- armazenar zeros no aumento por filhos;
12- fim
13- senão
14- inicio
15- armazenar zeros no aumento de base;
16- armazenar zeros no aumento por filhos;
88
Fundamentos de Programação em C: Uma Abordagem Algorítmica

17- fim
18- calcular o salário final
19- imprimir (salarioFinal);

No próximo passo, vamos descrever as fórmulas lineares para o aumento de


base, aumento por filhos e salário final.

Versão 5
1- declarar sexo;
2- declarar salarioBase, aumentoBase, aumentoPorFilhos, salarioFinal;
3- declarar numeroFilhos, codigo;
4- ler (codigo, sexo, numeroFilhos, salarioBase);
5- se sexo = ‘F’ então
6- inicio
7- calcular aumentoBase = salarioBase * 0.7;
8- se numeroFilhos > 0 então
9- calcular aumentoPorFilho = 0.09*numeroFilhos*salarioBase;
10- senão
11- calcular aumentoPorFilho = 0;
12- fim
13- senão
14- inicio
15- calcular aumentoBase = 0;
16- calcular aumentoPorFilho = 0;
17- fim
18- calcular salarioFinal=salarioBase+aumentoBase+aumentoPorFilho;
19- imprimir (salarioFinal);

Como todas as linhas do nosso algoritmo são claras e precisas, vamos traduzi-
lo para um programa em C.

/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o aumento salarial dos funcionarios do sexo feminino
Entrada : Salário de base, número de filhos, número do trabalhador e sexo
Saida : Número do trabalhador e salário final
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
#include <ctype.h> /* incluir a função toupper() */
int main()
{
const char FEMININO = ‘F’;
char sexo;
float salarioBase, aumentoBase, aumentoPorFilho,salarioFinal;
int numeroFilhos, codigo;
printf("\n Entre com o numero do trabalhador:"); scanf("%d",&codigo);
printf("\n Entre com o sexo do Trabalhador :");scanf("%c",&sexo);
printf("\n Entre com o numero de Filhos :"); scanf("%d",&numeroFilhos);
89
Fundamentos de Programação em C: Uma Abordagem Algorítmica

printf("\n Entre com o Salario de Base :"); scanf("%f",&salarioBase);


if (toupper(sexo) == FEMININO)
{
aumentoBase = salarioBase * 0.7;
if (numeroFilhos > 0)
aumentoPorFilho = 0.09 * numeroFilhos*salarioBase;
else
aumentoPorFilho =0.0;
}
else
{
aumentoBase = 0.0;
aumentoPorFilho = 0.0;
}
salarioFinal= salarioBase + aumentoBase + aumentoPorFilho;
printf(" \n Numero do Trabalhador : %d ", codigo);
printf("\ n Salario Final : %.2 f ",salarioFinal);
system("PAUSE");
return 0;
}

Na Linguagem C, nunca escreva 70% como 70/100. Como 70 e 100 são


números inteiros então 70/100 é igual a zeros.

Podemos escrever um programa equivalente, mais simples e mais eficaz se


adoptarmos a seguinte estratégia: Inicialmente armazenamos zeros nas
variáveis que retratam esses aumentos salariais. Com essa acção nenhum
trabalhador tem direito a aumento. Em seguida, alteramos o conteudo dessas
variáveis para os trabalhadores que reunem as condições do problema. Esta
estratégia é implementada pelo seguinte programa.

/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o aumento salarial dos funcionarios do sexo feminino
Entrada : Salário de base, número de filhos, número do trabalhador e sexo
Saida : Número do trabalhador e salário final
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
#include <ctype.h> /* incluir a função toupper() */
int main()
{
const char FEMININO = ‘F’;
char sexo;
float salarioBase, aumentoBase=0.0, aumentoPorFilho= 0.0, salarioFinal;
int numeroFilhos, codigo;
printf("\n Entre com o numero do trabalhador:"); scanf("%d",&codigo);
printf("\n Entre com o sexo do Trabalhador :");scanf("%c",&sexo);
printf("\n Entre com o numero de Filhos :"); scanf("%d",&numeroFilhos);
90
Fundamentos de Programação em C: Uma Abordagem Algorítmica

printf("\n Entre com o Salario de Base :"); scanf("%f",&salarioBase);


if (toupper(sexo) == FEMININO)
{
aumentoBase = salarioBase * 0.7;
if (numeroFilhos > 0)
aumentoPorFilho = 0.09 * numeroFilhos*salarioBase;
}
salarioFinal = salarioBase + aumentoBase + aumentoPorFilho;
printf(" \n Numero do Trabalhador : %d ", codigo);
printf("\ n Salario Final : %.2 f ",salarioFinal);
system("PAUSE");
return 0;
}

Vamos analisar o programa mais uma vez. Será que não conseguimos
simplifica-lo? É claro que sim. Basta entender que o comando condicional

if (numeroFilhos > 0)
aumentoPorFilho = 0.09 * numeroFilhos*salarioBase;

é desnecessário. Se o número de filhos for igual a zero a expressão


aumentoPorFilho = 0.09 * numeroFilhos*salarioBase é sempre igual a zeros.
Se for diferente é claro que essa expressão devolve um valor real positivo.
Então o nosso programa pode descrito como:

/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o aumento salarial dos funcionarios do sexo feminino
Entrada : Salário de base, número de filhos, número do trabalhador e sexo
Saida : Número do trabalhador e salário final
-------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
#include <ctype.h> /* incluir a função toupper() */
int main()
{
const char FEMININO = ‘F’;
char sexo;
float salarioBase, aumentoBase=0.0, aumentoPorFilho= 0.0, salarioFinal;
int numeroFilhos, codigo;
printf("\n Entre com o numero do trabalhador:"); scanf("%d",&codigo);
printf("\n Entre com o sexo do Trabalhador :");scanf("%c",&sexo);
printf("\n Entre com o numero de Filhos :"); scanf("%d",&numeroFilhos);
printf("\n Entre com o Salario de Base :"); scanf("%f",&salarioBase);
if (toupper(sexo) == FEMININO)
{
aumentoBase = salarioBase * 0.7;
aumentoPorFilho = 0.09 * numeroFilhos*salarioBase;
}
salarioFinal = salarioBase + aumentoBase + aumentoPorFilho;
91
Fundamentos de Programação em C: Uma Abordagem Algorítmica

printf(" \n Numero do Trabalhador : %d ", codigo);


printf("\ n Salario Final : %.2 f ",salarioFinal);
system("PAUSE");
return 0;
}

Problema 4.9.4: Uma empresa de distribuição alimentar pretende oferecer um


prémio de natal aos seus trabalhadores. Essa gratificação é calculada com
base no seguinte critério: Multiplicar o total de horas em falta por três quartos e
subtrair esse valor ao total de horas extraordinárias. O valor do prémio é
atribuído com base na seguinte tabela.
𝟑 Prémio sobre o salário
Horas extraordinárias - Faltas
𝟒
> 40 50 %
> 30 mas ≤ 40 40 %
> 20 mas ≤ 30 30 %
> 10 mas ≤ 20 20 %
≤ 10 10 %

Resolução: Numa primeira abordagem, a solução deste problema é descrita


pelos seguintes passos:

Versão 1
1- ler os dados do trabalhador;
2- calcular o valor do prémio;
3- imprimir dados do trabalhador e o valor do prémio;

Pelo enunciado, fazem parte dos dados de entrada as seguintes variáveis:


número do trabalhador, número de horas extraordinárias, número de horas de
faltas e salário de base. Fazem parte da informação de saída as seguintes
variáveis: número do trabalhador e o valor do prémio. Vamos associar essas
variáveis e seus tipos de dados.

int passe, horasExtras, horasFalta;


float salarioBase, premio;

Estamos em condições de refinar a primeira versão com a declaração das


variáveis e a formalização das acções de leitura e impressão.

Versão 2
1- declarar passe, horasExtras, horasFalta;
2- declarar salarioBase, premio;
3- ler( passe, horasExtras, horasFalta);
4- calcular o valor do prémio;
5- imprimir (passe,premio);

No próximo passo, vamos expandir o cálculo do valor do prémio. O valor do


prémio depende por um lado, da diferença entre as horas extraordinárias e três

92
Fundamentos de Programação em C: Uma Abordagem Algorítmica

quatros das horas de faltas, por outro, do intervalo de horas apuradas. Seja
float horasPremio uma variável auxiliar que irá armazenar as horas apuradas.
Então, essa expanção deve ser modelada por um comando condicional.

Versão 3
1- declarar passe, horasExtras, horasFalta, horasPremio;
2- declarar salario, premio;
3- ler( passe, horasExtras, horasFalta);
4- calcular horasPremio;
5- se hora de prémio estão num determinado intervalo então
6- calcular o valor do prémio;
7- imprimir(passe,premio);

No próximo passo, vamos expandir a condição se horas de prémio estão num


determinado intervalo. Nessa expansão vamos calcular o valor do prémio em
função do intervalo de horas apuradas. Como esse valor basea-se num
conjunto de condições mutuamente exclusivas, ele deve ser modelado pelo
comando condicional encadeado sem condições compostas.

Versão 4
1- declarar passe, horasExtras, horasFalta, horasPremio;
2- declarar salario, premio;
3- ler( passe, horasExtras, horasFalta);
4- calcular horasPremio;
5- se horasPremio > 40 então
6- calcular o valor do prémio;
7- senao se horasPremio > 30 então
8- calcular o valor do prémio;
9- senão se horasPremio > 20 então
10- calcular o valor do prémio;
11- senão se horasPremio > 10 então
12- calcular o valor do prémio;
13- senão
14- calcular o valor do prémio;
15- imprimir (passe, premio);

No próximo passo, vamos descrever a fórmula linear para calcular o valor do


prémio.

Versão 5
1- declarar passe, horasExtras, horasFalta, horasPremio;
2- declarar salario, premio;
3- ler( passe, horasExtras, horasFalta);
4- calcular horaspremio= horasExtra - 3/4 *horasFalta;
5- se horasPremio > 40 então
6- calcular premio = salario * 0.5;
7- senao se horasPremio > 30 então
8- calcular premio = salario * 0.4;
9- senão se horasPremio > 20 então
93
Fundamentos de Programação em C: Uma Abordagem Algorítmica

10- calcular premio = salario * 0.3;


11- senão se horasPremio > 10 então
12- calcular premio = salario * 0.2;
13- senão
14- calcular premio = salario * 0.1;
15- imprimir (passe, premio);

Como todas as linhas do nosso algoritmo são claras e precisas, vamos


convertê-lo um programa em C.

/*--------------------------------------------------------------------------------------------------------
Objectivo: Calcular o bónus de salário pelas horas de trabalho
Entrada : Passe, horas extraordinárias, horas de faltas e salário base
Saida : Valor do prémio
--------------------------------------------------------------------------------------------------------*/
#include <stdio.h> /* incluir as funções scanf() e printf() */
#include <stdlib.h> /* incluir a função system() */
int main()
{
int passe, horasPremio, horasExtras, horasFalta;
float salario, premio;
printf("\n Entre com o numero do trabalhador:"); scanf("%d",&passe);
printf("\n Entre com as Horas Extras :");scanf("%d",&horasExtras);
printf("\n Entre com as Horas de Falta :"); scanf("%d",&horasFalta);
printf("\n Entre com o valor do Salario :"); scanf("%f",&salario);
horasPremio = (int)horasExtras – 3.0/4.0*horasFalta;
if (horasPremio > 40)
premio = salario * 0.50;
else if (horasPremio >30)
premio = salario * 0.40;
else if (horasPremio > 20)
premio = salario * 0.30;
else if (horasPremio > 10)
premio = salario *0.20;
else
premio = salario * 0.10;
printf(" \n Numero do trabalhador %d ",passe);
printf(" \n Valor do premio %.2f ", premio);
system("PAUSE");
return 0;
}

Em seguida, analisaremos o funcionamento do programa para dois casos


diferêntes:

1º Caso: O trabalhador tem 60 horas de prémio. O programa verifica se o


trabalhador tem mais do que 40 horas. Como o resultado dessa comparação é
verdadeiro, calcula o valor do prémio e imprime o resultado.

94
Fundamentos de Programação em C: Uma Abordagem Algorítmica

2º Caso: O trabalhador tem 25 horas de prémio. O programa verifica se o


trabalhador tem mais do que 40 horas. Como essa comparação é falsa, verifica
se o trabalhador tem mais do que 30 horas. Como essa comparação também é
falsa, verifica se o trabalhador tem mais do que 20 horas. Observe que nessa
comparação já temos a garantia que o trabalhador tem menos do que 30 horas.
Como essa comparação é verdadeira calcula o valor do prémio e imprime o
resultado.

Como se pode perceber, em ambos os casos, efectuamos apenas um cálculo


para determinar o valor do prémio.

Contudo, existem muitos programadores que implementam soluções pouco


eficientes para problemas desta natureza. Em vez de utilizar uma variável
auxiliar que recebe o valor das horas de prémio, eles colocam a fórmula para o
calcular das horas do prémio no comando condicional. Esta estratégia é
implementada pelo seguinte programa:

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int passe, horasExtras, horasFalta;
float salario, premio;
printf("\n Entre com o numero do trabalhador:"); scanf("%d",&passe);
printf("\n Entre com as Horas Extras :"); scanf("%d",&horasExtras);
printf("\n Entre com as Horas de Falta :"); scanf("%d",&horasFalta);
printf("\n Entre com o valor do Salario :"); scanf("%f",&salario);
if ((int)horasExtras – 3.0/4.0*horasFalta > 40 )
premio = salario * 0.50;
else if (((int)horasExtra – 3.0/4.0*horasFalta) >30 )
premio = salario * 0.40;
else if (((int)horasExtra – 3.0/4.0*horasFalta) > 20 )
premio = salario * 0.30;
else if (((int)horasExtras – 3.0/4.0*horasFalta) > 10 )
premio = salario *0. 20;
else
premio = salario * 0.10;
printf(" \n Numero do trabalhador %4d ",passe);
prinf(" \n Salario do trabalhador %.2f ", salario);
printf(" \n Valor do premio %.2f ", premio);
system("PAUSE");
return 0;
}

Vamos analizar o funcionamento do programa para o seguinte caso.


Suponhamos que o trabalhador possui apenas cinco horas para o cálculo do
prémio. Neste programa, realiza-se quatro vezes o cálculo da fórmula
horasExtras – ¾*horaFalta. Essa repetição é completamente desnecessária e
torna o programa mais lento.
95
Fundamentos de Programação em C: Uma Abordagem Algorítmica

A eficiência de um programa está intimamente relacionadoa com o número


de comparações que o programa executa. Quando menor for o número de
comparações maior será a eficiência do programa.

4.10 – Exercícios Propostos


4.10.1-Desenvolva um programa para verificar se um número digitado pelo
utilizador é par.

4.10.2-Desenvolva um programa para mostar o valor absoluto de um número


real digitado pelo utilizador.

4.10.3-Desenvolva um programa que dados dois números inteiros, mostre o


valor do maior e o do menor número.

4.10.4-Desenvolva um programa que dados dois números inteiros, mostre a


diferente entre o maior e o menor.

4.10.5-Desenvolva um programa que dado um número inteiro, mostre se esse


número é par ou impar e se é positivo, negativo ou nulo.

4.10.6-Desenvolva um programa que dados dois números, o primeiro faz


referencia a um operação e o segundo ao valor do raio. Se o primeiro número
for igual a 1, calcular a área da circunferencia, se for igual a 2 calcular o seu
perímetro, se for um número diferente mostrar uma mensagem de erro.

4.10.7-Desenvolva um programa que dados três números inteiros diferentes,


imprimir esses números em ordem crescente.

4.10.8-Desenvolva um programa que dado a idade de uma determinada


pessoa, verifica se ela pode ser doador de sangue. Todo doador deve possuir
uma idade entre 16 e 69 anos e pesar mais de 50 kg.

4.10.9- Desenvolva um programa que dada a idade de um atleta, classifique a


categoria que pertence:

Iniciados : 5 a 10 anos;
Juvenil A: 11 a 13 anos;
Junior: 14 a 17 anos;
Sênior: maiores de 18 anos.

4.10.10-Desenvolva um programa que dados três números inteiros positivos


em ordem crescente e um quarto número positivo que não segue essa regra.
imprimir esses números em ordem crescente.

96
Fundamentos de Programação em C: Uma Abordagem Algorítmica

4.10.11- Sem usar o computador, siga o funcionamento do seguinte programa


e anote a variação dos valores das variáveis. Que valor será mostrado no
ecrã? Qual o objetivo do programa.

#include <stdio.h>
int main()
{
int a,b,q,r;
printf("Inserir um inteiro positivo\n"); scanf("%d",&a);
printf("Inserir outro inteiro positivo\n"); scanf("%d",&b);
q = a/b;
r = a-b*q;
if (r == 0)
printf("%d = %d * %d\nPortanto, %d divide %d\n",a,b,q,b,a);
else
printf("%d = %d * %d + %d\n",a,b,q,r);
return 0;
}

4.10.12-Desenvolva um programa que dados quatro números I,A,B,C, onde I é


um valor inteiro positivo enquanto A, B e C são números reais. Imprimir os
números A, B e C de acordo as seguintes regras:

I Ordem dos números reais


1 A, B, e C em ordem crescente
2 A,B e C em ordem decrescente
3 O maior número entre os restantes

4.10.13-Desenvolva um programa que dadas as coordenadas de um ponto no


plano cartesiano (X,Y), determine em que quadrante esse ponto se encontra (O
quadrante é um número 1 a 4). Se o ponto estiver situado sobre um dos eixos,
imprimir o valor -1; se o ponto estiver na origem imprimir zeros.

4.10.14-Desenvolva um programa que dados três números inteiros positivos


A,B,C. Imprimir as raízes reais e imaginárias da equação do segundo grau
Ax2+Bx+C = 0.

4.10.15-Desenvolva um programa que dado o código, o ano e o preço de três


garrafas de champanhe. Imprimir o código do champanhe mais caro, o ano de
fábrico do mais barato e a diferença de preço entre o mais caro e o mais
barato.

4.10.16-O mercado de São Paulo está a fazer uma promossão de laranjas. O


seu preço varia em função da dúzia. Se o cliente comprar mais do que uma
dúzia de laranjas paga 80.00 Kz por cada duzia, mas se comprar menos do
que uma dúzia paga 100,00 Kz por essa quantidade. Desenvolva um programa
para calcular o preço a pagar em função do número de laranjas que o cliente
levar.

97
Fundamentos de Programação em C: Uma Abordagem Algorítmica

4.10.17-A jornada de trabalho é de 45 horas semanais. O funcionário que


trabalhar mais do que 45 horas, terá direito à horas extraordinárias. O valor de
cada hora extraordinária é de 30 % do valor da hora normal de trabalho. O
funcionário trabalha 22 dias por mês. Desenvolva um programa que leia o
número de horas mensais realizadas pelo trabalhador e o salário de base,
imprimir o salário mensal.

4.10.18-Desenvolva um programa que dado o salário fixo de um vendedor e o


valor de suas vendas. Sabe-se que cada vendedor, tem direito à uma comissão
de 3% sobre as vendas que forem inferiores ou iguais à 150.000,00 Kz, mais
5% sobre o valor das vendas que ultrapassarem essa diferença. Imprimir o
salário total do vendedor.

4.10.19-Numa determinada escola a prova opcional PO, substitui


obrigatóriamente a menor nota que o aluno teve nas duas provas parciais, se
esta for maior do que uma delas. Dadas as notas P1,P2 e PO, determinar o
valor da média final do aluno após consultar a prova opcional.

4.10.20- Num posto de gasolina temos a seguinte tabela de descontos:

Gasóleo Até 30 litros, um desconto 2 %


Acima de 30 litros um desconto de 3%
Gasolina Até 30 litros um desconto de 4 %
Acima de 30 Litros um desconto de 5 %
Petroleo iluminante Até 5 litros, um desconto de 2.5%
Acima dos 5 litros um desconto de 3.7 %

Sabe-se que um litro de gasolina custa 75,00 Kz, um litro de gasóleo custa
25,00 Kz e um litro de petroleo iluminante custa 15,00 Kz. Desenvolva um
programa que dado o número de litros vendidos e o tipo de combustível,
imprimir o correspondente talão para o cliente.

4.10.21-Uma frutaria está a fazer uma promoção de duas frutas tropicais, com
base na seguinte tabela:

Nome da fruta Até 5 kg Acima 5 kg


Abacaxi 250,00 Kz por Kg 200,00 por Kg
Manga 150,00 Kz por Kg 100,00 por Kg

Se o cliente comprar mais do que 8 Kg em frutas ou se o valor total da compra


ultrapassar 2.0000,00 Kz, receberá um desconto de 10 % sobre esse valor.
Desenvolva um programa que dado a quantidade de abacaxis e mangas
adquiridas pelo cliente, imprimir um talão com o valor a pagar.

4.10.22-Dado a altura e o sexo de uma pessoa, desenvolva um programa para


determinar o peso ideal. O peso ideal é determinado pela fórmula:

98
Fundamentos de Programação em C: Uma Abordagem Algorítmica

(72.7 ∗ altura) − 58 para homens


Peso = {
(62.1 x altura) − 44.7 para mulheres

4.10.23-Dada a velocidade de um automóvel e a velocidade máxima permitida


num determinado local. Com base na seguinte tabela, calcular a multa e os
pontos perdidos na carta de condução.

Velocidade do automóvel Multa Pontos


Até 10% da velocidade limite 0 0
Entre 10% e 20 % da velocidade limite 15.000,00 4
Acima de 20 % da velocidade limite 30.000,00 7

4.10.24-Num determinado hipermercado, os vendedores da secção de


eletrodomésticos recebem mensalmente um salário fixo e mais uma comissão.
Essa comissão é calculada com base no tipo e no número de televisores
vendidos. Esse cálculo obedece à seguinte tabela:

Tipo Nº Televisores vendidos Comissões


LCD Menor do que 10 5.000,00 Kz por Televisor
Maior ou igual a 10 10.000,00 Kz por Televisor
A cores Menor do que 10 2.500,00 Kz por Televisor
Maior ou igual a 10 5.000,00 Kz por Televisor

Sabe-se ainda que cada vendedor tem um desconto de 7% sobre o seu salário
fixo para segurança social. Se o seu salário total for superior ou igual a
800.000,00 Kz o vendedor sofrerá um desconto de 2% sobre esse salário,
relativo ao imposto de rendimento de trabalho. Desenvolva um programa que
dados o salário fixo de um vendedor, o número de televisores vendidos LCD e
a cores, imprimir o salário bruto e líquido. Faça um relatório perceptível ao
vendedor.

4.10.25-Dado um número com três algarismos. Obter quantos algarismos são


maiores do que cinco, qual o menor algarismo e se a soma dos valores dos
algarismos é par

4.10.26-Dado o peso (kg) e a altura (m) de uma pessoa, calcular o índice de


massa corporal (IMC) e mostrar a sua situação com base na seguinte tabela:

IMC Situação
Menos de 20 Desnutrido
𝑝𝑒𝑠𝑜 De 20 até 25 Normal
IMC =
𝐴𝑙𝑡𝑢𝑟𝑎 𝑥 𝐴𝑙𝑡𝑢𝑟𝑎 De 25 até 30 Excesso de peso
De 30 até 40 Obesidade leve
Acima de 40 Obesidade grave

4.10.27-A companhia de pulverização Avion Ltda, utiliza aeronaves para


pulverizar fazendas. Os custos de pulverização dependem do tipo de praga e
da área a pulverizar:
99
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Tipo1: pulverização contra ervas daninhas, Kz 8.000,00 por km quadrado


Tipo2: Pulverização contra gafanhotos, KZ 10.000,00 por km quadrado
Tipo3: Pulverização contra broca, KZ 15.000,00 por km quadrado
Tipo4: Pulverização contra tudo, Kz 18.000,00 por km quadrado.

Se a área pulverizada for maior do que 10 km2, o fazendeiro recebe um


desconto de 5%. Em contrapartida, qualquer fazendeiro cujo custo ultrapasse
os Kz 100.000,00 recebe um desconto de 10% sobre o valor que ultrapassar
Kz 100.000,00. Se ambos os descontos se aplicam, o relacionado com a área é
calculado em primeiro lugar. Preparar um programa que dado o código do
fazendeiro, tipo de pulverização e a área pulverizada, imprimir o código do
fazendeiro seguido do valor a pagar pelo serviço.

4.10.28-O Ministério do Ambiente tem uma relação de três fábricas altamente


poluentes. Existe um índice de poluição para regular o funcionamento dessas
fábricas. Esse índice é regulado pela tabela:

Índice de poluição Situação


> 0.05 e ≤ 0.25 Normal
> 0.25 e ≤ 0.30 Alerta
> 0.30 e ≤ 0,40 Suspender primeira indústria
> 0.40 e ≤ 0.50 Suspender as duas primeiras Indústrias
> 0.50 Suspender todas as indústrias

Desenvolva um programa que dado o índice de poluição, imprimir um relatório


com as notificações das indústrias que estão em situação de suspensão.

4.10.29-Dado um número inteiro n e quatro números inteiros a, b, c e d que


representam as extremidades dos intervalos [a, b] e [c, d], para a < b, c < d e a
< c. Determinar se n pertence sómente ao intervalo [a, b] ou sómente ao
intervalo [c, d] ou se n pertence a ambos ou se n não pertence a nenhum dos
dois. Em cada caso imprimir uma mensagem adequada.

4.10.30-Numa escola a nota de qualquer estudante é calculada com base na


média das duas melhores provas. O estudante é submetido à três provas. Se
houver notas repetidas considere a primeira. Desenvolva um programa que
dados as três notas do estudante, imprimir a sua média.

4.10.31-Dada a temperatura corporal de um ser humano. Desenvolva um


programa para mostrar o seu estado febril, sabe-se que:

Inferior a 36. º Hipotermia


Entre 36.5º a 37º Normal
Entre 37.5º a 38ª Estado febril
Mais do que 38.5º Febre

4.10.32-Dado três números inteiros positivos necessariamente diferentes.


Desenvolva um programa para calcular o maior e o menor.
100
Fundamentos de Programação em C: Uma Abordagem Algorítmica

4.10.33- Escreve um programa equivalênte sem utilização de condições


compostas.

#include <stdio.h> /* incluir as funções scanf() e printf() */


#include <stdlib.h> /* incluir a função system() */
int main()
{
int nota1, nota2, nota3;
float mediaAluno;
printf("\n Entre com a nota da primeira frequencia :"); scanf("%d",&nota1);
printf("\n Entre com a nota da segunda frequencia :");scanf("%d",&nota2);
printf("\n Entre com a nota da terceira frequencia:");scanf("%d",&nota3);
if ( (nota1 > 8) && (nota2 > 8) || (nota3 > 8) )
{
mediaAluno = (nota1 + nota2 + nota3)/3.0;
if ( mediaAluno > 10.0 )
printf(" Media = %.2f Aprovado \n",mediaAluno);
else
printf(" Media = %.2f Reprovado \n",mediaAluno);
}
else
printf(" Reprovado \n");
system("PAUSE");
return 0;
}

4.13.34-Um banco comercial está a conceder um crédito especial aos seus


clientes. Esse crédito vária em função do saldo médio no último ano.
Desenvolva um programa que dado o saldo médio de um cliente, calcule o
valor do crédito com base na seguinte tabela:

Saldo médio Percentagem


< 15.000,00 0
> 15.000 e < 35.000,00 20%
>35.000,00 e < 45.000,00 30%
> 45.000,00 40%

O seu programa deve mostrar também o saldo médio e o valor do crédito.

4.10.35-Desenvolva um programa que dado três números inteiros, determine


se eles formam um triângulo e que tipo de triangulo. Sabe-se que, se A for o
maior lado, então:

Se A ≥ B + C Nenhum triângulo é formado


Se A2 = B2 + C2 Triangulo retangulo formado
Se A2 > B2 + C2 Triangulo obtusângulo formado
Se A2 < B2 + C2 Triangulo acutângulo formado

101
Fundamentos de Programação em C: Uma Abordagem Algorítmica

4.10.36-Uma loja do tipo preço único possui artigos de três e cinco Kwanzas. A
menor venda possível sem troco é obrigatóriamente oito Kwanzas. Desenvolva
um programa que mostre como fazer uma compra superior a oito Kwanzas sem
receber o troco.

4.10.37-Desenvolva um programa que dado a hora e os minutos do início de


um jogo de futebol, imprimir as horas e minutos que o jogo termina. O jogo
pode começar num dia e terminar num outro.

4.10.38-O Hotel Paradise adoptou a seguinte política de descontos para


reserva de pacotes para a passagem de fim de ano.

Estudante 500,00 Kz de desconto


Trabalhador 250,00 Kz de desconto
Sócio 100,00 Kz de desconto
Aposentado 50,00 Kz desconto

Os descontos para estudantes, trabalhadores e sócios não são acumulativos.


O hóspede que enquadrar-se em mais do que uma categoria, receberá o maior
desconto. Os descontos para os aposentados são acumulativos. No acto da
reserva, o hóspede preenche uma ficha onde assinala a sua situação em
relação a estas categorias e se vai reservar um quarto. A reserva de quartos
custam 20.000,00 Kz, a noite de reveillon custa 50.000,00 Kz. Desenvolva um
programa para calcular o custo da passagem do ano de um determinado
cliente.

4.10.39-As vendas as prestações, estão a tornar-se uma excelente opção para


o comércio que cria a cada dia, novas promoções para tentar conquistar novos
clientes. Desenvolva um programa que recebe o preço de venda de um artigo e
calcula a sua venda com base na seguinte informação: O valor do artigo com
10 % desconto se o pagamento for à vista. Valor de cada prestação sem juros
se número prestações for menor ou igual a 5. Valor da prestação com juros de
25 % ao ano se número prestações for maior do que 5. Estamos a considerar
prestações iguais com juros simples.

4.10.40- Desenvolva um programa que leia o ano, o mês e o dia de nascimento


de uma pessoa e escreva no ecrã a idade que essa pessoa tem hoje.

4.10.41-Desenvolva um programa que dada a data de nascimento de uma


pessoa (dia,mes,ano), imprima a sua idade. O programa também deve mostrar
uma mensagem a dizer se ela tem ou não idade para votar.

4.10.42-Desenvolva um programa que leia a data do seu aniversário e imprima


o nome do seu signo Zodiaco, conforme mostra a tabela:

Signo Intervalo
Aquário 21 de Janeiro a 19 de Fevereiro
Peixes 20 de Fevereiro a 20 de Março
Áries 21 de Março a 20 de Abril
102
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Touro 21 de Abril a 20 de Maio


Gêmeos 21 de Maio a 20 de Junho
Câncer 21 de Junho a 21 de Julho
Leão 22 de Julho a 22 de Agosto
Virgem 23 de Agosto a 22 de Setembro
Libra 23 de Setembro a 22 de Outubro
Escorpiã 23 de Outubro a 21 de Novembro
Sagitário 22 de Novembro a 21 de Dezembro
Capricórnio 22 de Dezembro a 20 de Janeiro

4.10.43-Uma revista pretende comparar automóveis. Essa comparação só


pode ser realizada se os carros tiverem a mesma cilindrada e mesmo ano de
fabrico. A principal diferença reside na quantidade de combustível gasto por
kilômetro, que é determinado pela seguinte tabela:

Mais do que 18 km por litro Não presta


Entre 18 Km por litro e 14 Km por litro Razoável
Entre 13 Km por litro e 10 Km por litro Aceitável
Entre 9 Km por litro e 7 Km por litro Bom
Menos do que 7 Km por litro Excelênte

Escreva um programa que compara duas viaturas. São dados a marca, o ano
de fabrico, a cilindrada, a quantidade de quilômetros rodados e a quantidade de
litros consumidos.

4.10.44-Desenvolva um programa que dado o peso de uma encomenda, o tipo


de entrega (1= Normal, 2= Rápido, 3= Expresso) e a região onde a encomenda
será entregue (1= Sul, 2= Norte, 3= Este, 4= Oeste). Calcular o valor da
entrega da encomenda com base nas seguintes tabelas:

Peso:
Até 1 Kg 100,00 Kz
De 1kg à 5 Kg 150,00 Kz
Acima de 5 Kg 150 KZ mais 50,00 KZ por cada KG em excesso

Tipo encomenda:
Normal Adicionar 70,00 Kz
Rápida Adicionar 150,00 Kz
Expresso Adicionar 300,00 Kz

Região:
Norte Adicionar 500,00 Kz Este Adicionar 1000,00 Kz
Sul Adicionar 450,00 Kz Oeste Adicionar 1250,00 Kz

4.10.45-Desenvolva um programa que leia um determinado mês do ano e


imprima a correspondente estação do ano. Sabe-se que no himesfério sul as
estações do ano são dadas pela tabela:

103
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Mes Estação do Ano


1 Verão
2 Verão
3 Verão
4 Outono
5 Outono
6 Outono
7 Inverno
8 Inverno
9 Inverno
10 Primavera
11 Primavera
12 Primavera

Por exemplo, se o utilizador digitar o mês 3, o seu programa deve imprimir a


mensagem: A estação do ano correspondente ao mês 3 é Verão.

4.11 – Trabalhos de Programação

4.11.1-Desenvolva um programa que dado o código de um produto (número


entre 1 a 10); peso do produto em quilos; código do País de origem (número
entre 1 a 3). Calcular e imprimir o peso do produto em gramas; o preço total do
produto adequirido; o valor do imposto, sabendo que este é calculado com
base no preço total do produto e no país de origem; o valor total que deve ser
igual ao preço total mais o valor do imposto. Esse cálculo depende das
seguintes tabelas:

Código País Origen Imposto Código do produto Preço em gramas


1 0% 1 a 4 10
2 15% 5 a 7 25
3 25% 8 a 10 35

4.11.2-A nota final de um estudante é calculada a partir de três notas: Um


trabalho de laboratório, uma avaliação semestral e um exame final. A média
das três notas obedece aos seguintes pesos:

Nota Peso
Trabalho laboratório 2
Avaliação semestral 3
Exame final 5

Desenvolva um programa que dadas as três notas, imprimir a média ponderada


e o resultado da avaliação. O resultado é descrito pela seguinte tabela:

Media ponderada Avaliação


15.5 a 20.0 A
104
Fundamentos de Programação em C: Uma Abordagem Algorítmica

13.5 a 15.4 B
11.5 a 13.4 C
9.5 a 11.4 D
0 a 9.4 E

4.11.3-Desenvolva um programa para efectuar um diagnóstico médico. Para


cada paciente temos as seguintes informações:

Infecção nos pulmões 0 = Não 1 = Sim


Febre 0 = Não 1 = Sim
Nariz entupido 0 = Não 1 = Sim
Espirro 0 = Não 1 = Sim

O diagnóstico baseia-se nos seguintes critérios: o paciente tem pneumonia se


tiver infecção nos pulmões; tem gripe se não tiver infecção nos pulmões, mas
tiver apenas dois sintomas; tem resfriado se não tiver infecção nos pulmões,
mas tiver os restantes sintomas.

4.11.4-Dado uma senha com quatro algarismos. Dizemos que ela é válida,
quando não possui algarismos repetidos ou algarismos consecutivos em ordem
crescente ou decrescente. Por exemplo: a senha 1123 é inválida porque
contém algarismos consecutivos (123) repetidos; a senha 1635 válida e a
senha 5935 é inválida porque o algarismo 5 repete-se.

4.11.5-Para efeitos de segurança, o código de quaquer estudante deve possuir


um dígito de controle. Desenvolva um programa que leia o número de um
determinado estudante e a partir desse númere gere o dígito de controle de
acordo as seguintes regras:
- Multiplicar cada dígito, da esquerda para direita por 1 2 1 2 1 2 e acumular os
produtos.
- Se um dos produto for maior do que 10, somar os dígitos do produto.
- O dígito verificador será igual à 10 – último dígito do acumulado.
- Se o último dígito for igual a zeros, o dígito de controle será zero.

Por exemplo:
2 1 6 1 0 8
X X X X X X
1 2 1 2 1 2

temos:

2 + 2 + 6 + 2 + 0 + 1+ 6 = 19

Então o dígito de controle será igual à 10 – 9 = 1, e o código completo do


estudante será igual à

216108 – 1

105
Fundamentos de Programação em C: Uma Abordagem Algorítmica

4.11.6- Para evitar que os meninos de rua se tornem os criminosos do amanhã,


o Ministério da Reinserção Social, está a fomentar uma política para adopção
de uma criança. Para que essa adopção seja possível, é necessário que
qualquer casal não tenha mais do que quatro filhos e que as suas despezas
não sejam superior a 60 % da sua renda familiar. Para além disso, essa renda
deve ser superior a 20 salários mínimos. Todo casal interessado em adoptar
uma criança, deve preencher o seguinte formulário: Número do bilhete de
Identidade do chefe de família, número de filhos e renda familiar. A fórmula
para apurar as despezas familares é determinada por:

- 2.5 % do salário mínimo para alimentação de cada membro da familia


- 4.7 % do salário mínimo para saúde de cada membro da família
- 2.2 % do salário mínino para transporte de cada membro da família

106