Você está na página 1de 23

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

Capítulo
5 Estruturas de Decisão
“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”

- Albert Einstein -

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. Estes comandos pertencem à uma classe de estruturas de decisão, e
estão classificados por: Comando Condicional e Comando Selectivo.

5.1 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 de fim de 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;

Exemplo 1: desenvolva para ler as três notas de frequência de um estudante,


mostrar na tela a sua média, e exibir uma mensagem a dizer que o estudante foi
aprovado.

Resolução: com base no método de refinamento sucessivo, uma possível


solução para este problema pode ser descrita pelos seguintes passos:

Versão 1

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 42


Fundamentos de Programação em C: Uma Abordagem Algorítmica
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;
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, e as acções necessárias para mostrar na tela
a mensagem "aprovado".

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- se mediaAluno >= 10.0 então
6- imprimir ("aprovado");

Como todas as linhas do algoritmo estão claras e não possuem qualquer


ambiguidade, o processo de refinamento termina, e podemos codificá-lo para um
programa na linguagem 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);
Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 43
Fundamentos de Programação em C: Uma Abordagem Algorítmica
mediaAluno = (nota1 + nota2 + nota3) /3.0;
printf ("\n Media = %.2f ", mediaAluno);
if ( mediaAluno >= 10.0 )
printf ("aprovado \n");
system ("PAUSE");
return 0;
}

Observe que o funcionamento deste programa caracteriza-se por: ler as três


notas do estudante; Se a média for positiva, mostrar o seu valor e a mensagem
aprovado; Mas se a média for negativa o programa mostra apenas o seu valor.
É evidente que nenhuma pauta tem essa apresentação. Então vamos efectuar
algumas alterações ao programa de tal modo que ele mostre apenas as linhas
dos estudantes que estão em condições de aprovar, ou seja, a média e a
mensagem quando o aluno estiver aprovado.

Esta alteração é muito simples, basta colocar a impressão da média e a


impressão da mensagem aprovado, no bloco de comandos subordinado a
condição verdadeira da expressão relacional mediaAluno ≥ 10.0.

#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 instrução devemos utilizar
os delimitadores de bloco.

Exemplo 2: desenvolva um programa para ler dois números inteiros


necessariamente diferentes e mostrar o maior.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 44


Fundamentos de Programação em C: Uma Abordagem Algorítmica
Resolução: Numa primeira abordagem, uma possível solução para este
problema pode ser 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 declaração das


variáveis, e a especificação uma ação de leitura. Para além disso, também
faremos uma descrição genérica de um método 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 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 algoritmo estão claras e não possuem qualquer


ambiguidade, o processo de refinamento termina, e podemos codificá-lo para um
programa na linguagem C.

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


Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 45
Fundamentos de Programação em C: Uma Abordagem Algorítmica
#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;
}

Exemplo 3: desenvolva um programa para ler dois números inteiros, que podem
ser iguais, e mostrar o maior.

Resolução: Antes de iniciarmos o desenvolvimento deste programa, vamos


estudar o programa anterior com mais detalhe. O que acontecerá se o utilizador
digitar dois números iguais. O programa mostrará o valor correcto? È evidente
que não. Observe que a variável max não recebeu nenhum valor durante a
execução do programa, logo o programa mostrará a mensagem Maior valor =
???, onde ??? é o valor do lixo residual que está contido nessa variável.

Fazem parte das boas practicas de programação desenvolver algoritmos que


testem todas as condições possíveis.

Apresentaremos em seguida uma versão que trata desse erro.

#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");

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 46


Fundamentos de Programação em C: Uma Abordagem Algorítmica
return 0;
}

Exemplo 4: desenvolva um programa para ler um número inteiro positivo com


no máximo três algarismos, separar o algarismo das unidades, das dezenas e
das centenas.

Resolução: numa primeira abordagem, uma possível solução para este


problema pode ser descrita pelos seguintes passos:

Versão 1
1- ler o numero inteiro;
2- separar unidades, dezenas e centenas;
3- imprimir o resultado;

Sejam n, unidade, dezena e centena as variáveis que representam o número


lido, as casas das unidades, das dezenas e das centenas. Vamos assumir que
essas variáveis são do tipo inteiro.

int n, unidade, dezena, centena;

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


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

Versão 2
1-declarar n, unidade, dezena, centena;
2-ler (n);
3-separar unidades, dezenas e centenas;
4-imprimir o resultado;

No próximo passo, vamos descrever o método para verificar se o numero é


positivo e possui no máximo três algarismos.

Versão 3
1- declarar n, unidade, dezena, centena;
2- ler (n);
3- se n < 0 então
4- início
5- imprimir mensagem de erro;
6- terminar o programa;
7- fim
8- se n > 999 então
9- início
10- imprimir mensagem de erro;
11- terminar o programa;
12- fim
13- separar unidades, dezenas e centenas;
14- imprimir o resultado;

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 47


Fundamentos de Programação em C: Uma Abordagem Algorítmica
No próximo passo, vamos descrever um método para separar as unidades, as
dezenas e as centenas desse número. Pela aritmética dos números inteiros,
sabemos que podemos obter o último algarismo de um número se utilizarmos a
operação do resto da divisão inteira.

Por exemplo, se n = 495, a casa das unidades é obtida pela operação:

495%10 = 5

e a casa das dezenas é obtida pelas operações:

495/10 = 49 e 49% 10 = 9

para terminar, a casa das centenas, é obtida pela operação:

49 / 10 = 4

então a próxima versão pode ser descrita por:

Versão 4
1- declarar n, unidade, dezena, centena;
2- ler (n);
3- se n < 0 então
4- início
5- imprimir mensagem de erro;
6- sair do programa;
7- fim
8- se n > 999 então
9- início
10- imprimir mensagem de erro;
11- sair do programa;
12 fim
13-calcular unidade = n % 10;
14-calcular n = n/10;
15-calcular dezena = n% 10;
16-calcular centena = n/10;
17-imprimir(unidade, centena, dezena);

Como todas as linhas do algoritmo estão claras e não possuem qualquer


ambiguidade, o processo de refinamento termina, e podemos codificá-lo para um
programa na linguagem C.

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


#include <stdlib.h> /* incluir a função system() */
int main()
{
int n, unidade, dezena, centena;
printf ("\n Entre com um numero inteiro: ");
scanf ("%d", &n);
Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 48
Fundamentos de Programação em C: Uma Abordagem Algorítmica
if (n < 0)
{
printf (“\n Erro: o numero deve ser positivo”);
system ("PAUSE");
return 0; /* sair do programa */
}
if (n > 999)
{
printf (“\n Erro: o numero deve ser menor ou igual a 999”);
system ("PAUSE");
return 0; /* sair do programa */
}
unidade = n%10;
n = n/10;
dezena = n%10;
centeza = n/10;
printf (“Centena= %d”, centena);
printf (“Dezenas = %d”, dezena);
prinft (“Unidades = %d”, unidade);
printf (“\n”);
system (“PAUSE”);
return 0;
}

4.2 Comando Condicional Composto


O comando condicional composto possui à seguinte sintaxe:

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;
Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 49
Fundamentos de Programação em C: Uma Abordagem Algorítmica
senão
Bloco de comandos2;

Exemplo 1: desenvolva um programa para ler as três notas de um estudante,


calcule a média e mostre a sua situação escolar.

Resolução: com os conhecimentos que temos, este programa necessitará de


dois comandos condicionais simples. Um para verificar se o estudante aprovou
e outro para verificar se ele reprovou, algo como:

#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;
}

Esta solução, apesar de funcionar não é eficiente, pois vejamos: 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
comparação desnecessária, ou melhor redundante, temos uma prova que o
programa não é eficiente.

Um programa eficiente avalia uma e apenas uma vez a expressão relacional, e


em função do seu valor lógico, imprime a correspondente mensagem. Vejamos
a implementação dessa estratégia.

Sabemos pela secção anterior, que a segunda versão do método de refinamento


sucessivo é descrita por:

Versão 2
1- declarar nota1, nota2, nota3, mediaAluno;
Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 50
Fundamentos de Programação em C: Uma Abordagem Algorítmica
2- ler (nota1, nota2, nota3);
3- calcular a média do aluno;
4- imprimir média do aluno e a mensagem;

No próximo passo, vamos descrever com mais rigor, o cálculo da média, a sua
impressão, e as acções necessárias para mostrar a mensagem "Aprovado" ou
"Reprovado". Como essas acções são mutuamente exclusivas, se uma for
realizada a outra não será, elas podem ser modeladas pelo comando condicional
composto.

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

Como todas as linhas do algoritmo estão claras e não possuem qualquer


ambiguidade, o processo de refinamento termina, e podemos codificá-lo para um
programa na linguagem 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;
}

Sempre que tivermos programas que testam condições mutuamente


exclusivas devemos utilizar o comando condicional composto.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 51


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

Exemplo 2: desenvolva um programa para ler dois números e determinar o


maior.

Resolução: no sentido de consolidar os conhecimentos do leitor, deixamos


como exercicio o desenvolvimento do algoritmo com a aplicação do método de
refinamento sucessivo. Mostraremos apenas o correspondente programa na
linguagem C.

#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 ");
system ("PAUSE");
return 0;
}
if ( a > b )
printf ("\n Valor maximo = %d “, a);
else
printf ("\n Valor maximo = %d “, b);
system ("PAUSE");
return 0;
}

4.3 Condições Compostas


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

Exemplo 1: desenvolva um programa para ler as três notas de frequência de um


estudante, calcular a média e mostrar a sua situação académica. O estudante
está 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.

Resolução: como acreditamos que o leitor não terá qualquer dificuldade em


desenvolver esse algoritmo, apresentamos em seguida, um programa em C que
é uma possível solução para esse problema.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 52


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);
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.4 Comando Condicional Encadeado


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

Exemplo 1: dado três números inteiros diferentes, determinar o maior.

Resolução: Numa primeira abordagem, uma possível solução para este


problema pode ser 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 da informação de saída o maior deles. Vamos associar as variáveis
que representam esses números aos teus tipos de dados:

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 53


Fundamentos de Programação em C: Uma Abordagem Algorítmica
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 máximo 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 algoritmo estão claras e não possuem qualquer


ambiguidade, o processo de refinamento termina, e podemos codificá-lo para um
programa na linguagem C.

#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

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 54


Fundamentos de Programação em C: Uma Abordagem Algorítmica
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
conteúdo da variável a é o maior elemento, no caso contrário, o conteúdo da
variável c é o maior elemento. Repetimos este processo para todas as
combinações possíveis. Essa estratégia é descrita pelo seguinte programa:

#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;
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.

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

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 55


Fundamentos de Programação em C: Uma Abordagem Algorítmica
#include <stdlib.h> /* incluir a função system() */
int main()
{
int a, b, 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;
else if ( b > c )
max = b;
else
max = c;
printf ("\n Valor maximo = %d ",max);
system("PAUSE");
return 0;
}

Exemplo2: desenvolva um programa que dados três números inteiros positivos,


verificar se eles são os lados de um triângulo retângulo.

Resolução: com base na geometria plana, sabemos que num triângulo


retângulo o quadrado da hipotenusa é igual a soma dos quadrados dos lados,
ou seja:
Hipotenusa2 = Lado12 + lado22

Numa primeira abordagem, uma possível solução para este problema pode ser
descrita pelos seguintes passos:

Versão 1
1- ler os lados do triângulo;
2- verificar se é triangulo retângulo;
3- imprimir o resultado;

Pelo enunciado, temos como variáveis de entrada os três lados do retângulo e


como informação de saída temos uma mensagem a dizer se é ou não um
triângulo retângulo. Vamos associar essas variáveis aos seus tipos de dados
com a seguinte declaração.

int lado1, lado2, lado3;

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 lado1, lado2, lado3;
Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 56
Fundamentos de Programação em C: Uma Abordagem Algorítmica
2- ler (lado1, lado2, lado3);
3- verificar se é triângulo rectângulo;
4- imprimir mensagem;

No próximo passo, vamos expandir a acção para verificar se temos pelo menos
um lado, cujo quadrado é igual a soma dos quadrados dos restantes, ou seja, se
temos um triângulo retângulo.

1ª Estratégia: muito simples e consiste na aplicação do teorema do triângulo


rectângulo a todos os lados.

Versão 3
1- declarar lado1, lado2, lado3;
2- ler (lado1, lado2, lado3);
3- se lado1*lado1 = lado2*lado2 + lado3*lado3 então
4- imprimir (“É triângulo rectângulo”);
5- senão se lado2*lado2 = lado1*lado1 + lado3*lado3 então
6- imprimir (“É triângulo rectangulo”);
7- senão se lado3*lado3 = lado1*lado1 + lado2*lado2 então
8- imprimir (“É triângulo rectângulo”);
9- senão imprimir (“Não é triângulo retângulo”);

Como todas as linhas do algoritmo estão claras e não possuem qualquer


ambiguidade, o processo de refinamento termina, e podemos codificá-lo para um
programa na linguagem C.

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


#include <stdlib.h> /* incluir a função system() */
int main()
{
int lado1, lado2, lado3;
printf ("\n Entre com o lado1: ");
scanf ("%d", &lado1);
printf ("\n Entre com o lado2:");
scanf ("%d", &lado2);
printf ("\n Entre com o lado3:");
scanf ("%d", &lado3);
if (lado1*lado2 = lado2*lado2 + lado3*lado3)
printf (“\n Eh triangulo rectangulo”);
else if (lado2*lado2 = lado1*lado1 + lado3*lado3 )
printf (“\n Eh triangulo rectangulo “);
else if (lado3*lado3 = lado1*lado1 + lado2*lado2)
printf (“\n Eh trangulo rectangulo “)
else
printf (“\n Não eh triangulo rectangulo”);
system (“PAUSE”);
return 0;
}

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 57


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

Exemplo 3: 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.

Numa primeira abordagem, uma possível solução para este 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 três números inteiros que
podem ser declarados pelas variáveis a, b e c. Como Informação de saída temos
as raízes da solução, que podem ser declaradas pelas variáveis x1 e x2. Mas,
necessitamos de uma variável auxiliar para calcular o valor do descriminante.
Vamos associar essas variáveis aos seus tipos de dados com a seguinte
declaração.

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

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


declarar as variáveis, formalizar as acções de leitura e de impressão, e descrever
um método genérico para calcular as raizes do trinómio.

Versão 2
1- declarar a, b, c, x1, x2, descri;
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);

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 58


Fundamentos de Programação em C: Uma Abordagem Algorítmica
Mas esta versão é pouco precisa. Só devemos mostrar as raízes reais se o
descriminante for não negativo, no caso contrário, deveremos notificar o
utilizador com uma mensagem de erro. Isto leva-nos ao seguinte refinamento.

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

Mas as raízes reais podem ser iguais se o descriminante for igual a zeros e
diferentes se este for positivo. Isso leva-nos ao seguinte refinamento

Versão 4
1- declarar a, b, c, x1, x2, descri;
2- ler (a, b, c);
3- calcular o valor do discriminante;
4- se discri = 0 então
5- início
6- calcular as raízes reais iguais;
7- imprimir os resultados;
8- fim
9- senão se discri > 0 então
10- início
11- calcular as raízes reais diferentes;
12- imprimir os resultados;
13- fim
14- senão
15- imprimir(" Erro: Raizes complexas ");

Acreditamos que o leitor não tenha qualquer dificuldade em escrever a fórmula


de Bhaskara na representação linear. Por esse facto, podemos considerar que
todas as linhas deste algoritmo estão claras e não possuem qualquer
ambiguidade, como consequência, o processo de refinamento deve terminar, e
podemos codificar esse algoritmo para um programa na linguagem C.

#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;

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 59


Fundamentos de Programação em C: Uma Abordagem Algorítmica
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.0 )
{
x1 = x2 = - b / 2*a;
printf ("\n Raizes reais iguais %f ", x1);
}
else if ( descri > 0.0 )
{
x1 = ( - b - sqrt(descri))/ 2*a;
x2 = ( - b + sqrt(descri))/ 2*a;
printf ("\n Raizes reais diferentes %f e %f ", x1,x2);
}
else
printf ("\n Erro: Raizes Complexas ");
system("PAUSE");
return 0;
}

O programa está correcto? É evidente que não. Se o utilizador digitar por


exemplo os dados a = 0, b = 5 e c =10. Como a = 0 não temos uma equação do
segundo grau, e o programa deverá emitir uma mensagem a notificar tal facto.
Faça como exercício as correcções necessárias para eliminar esse erro.

Observe na indentação deste programa. 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.

Exemplo 4: desenvolva um programa para determinar a situação do estudante


em função da seguinte tabela

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

Resolução: vamos aproveitar essa oportunidade, para estudar várias


estratégias de resolver esse problema e discutir a sua eficiência.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 60


Fundamentos de Programação em C: Uma Abordagem Algorítmica
1ª-Estratégia: utilizar uma sequência de comandos condicionais simples com
condições compostas, não aninhados.

#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, apesar de funcionar não é eficiente. 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 e
inaceitável em programação.

2ª-Estratégia: 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);

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 61


Fundamentos de Programação em C: Uma Abordagem Algorítmica
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 = %f ", mediaAluno);
if ( mediaAluno > 14.0 )
printf ("Defesa de nota \n");
else if ( (mediaAluno > 12.0) && (mediaAluno <= 14.0) )
printf (" Dispensado ao exame \n");
else if ( (mediaAluno > 8.0) && (mediaAluno <= 12.0) )
printf (" Vai a exame \n");
else if ( médiaAluno < 8.0 )
printf (" reprovado \n");
system ("PAUSE");
return 0;
}

Este programa também não é eficiente, pois vejamos: suponhamos sem perda
da generalidade, 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. Com base nesse raciocínio podemos concluir que quanto menor
for a nota mais operações desnecessárias são realizadas, e isso é uma prova
irrefutável da ineficiência do programa.

3ª-Estratégia: 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 )

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 62


Fundamentos de Programação em C: Uma Abordagem Algorítmica
printf (" Dispensado ao exame \n");
else if ( mediaAluno > 8.0 )
printf (" Vai a exame \n");
else
printf (" reprovado \n");
system ("PAUSE");
return 0;
}

Com esse tipo de solução, o programa realiza o número mínimo de comparações


para qualquer nota, tornando-se desse modo, na estratégia optima para essa
classe de problemas.

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


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

5.5 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. Para uma
melhor compreensão deste assunto, daremos alguns exemplos.

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


escrita:

if (x > 0) if ( x > 0 )
printf("x eh positivo"); printf (" x eh positivo");
else else
printf("x eh negativo"); printf ("x eh 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 a, b;
printf ("Digite a temperatura:");
scanf ("%d", &temp);
if ( temp < 30 )
if ( temp > 20 )
printf ("\nTemperatura agradavel");
else
printf ("\n Temperatura muito quente");

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


digitar um número entre 20 a 30 graus; " Temperatura muito quente " se o
utilizador digitar um número superior a 30 graus.
Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 63
Fundamentos de Programação em C: Uma Abordagem Algorítmica

Vejamos o que aconteçe se o utilizador digitar um valor inferior a 20 graus.


Suponhamos sem perda da generalidade que o utilizador digitou o número 5.
Pelo 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 reescrever esse segmento de código de forma a obter os resultados


esperados.

int a, b;
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.

Fazem parte das boas práticas de programação, colocar os delimitadores de


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

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 64

Você também pode gostar