Você está na página 1de 52

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

4

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 -

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

Comandos de Decisã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

seguintes passos:

primeira

abordagem

a

solução

deste

problema

é

descrita

pelos

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>

#include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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>

#include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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;

}

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

seguintes passos:

primeira

abordagem,

Versão 1

a

solução

deste

1- ler os números;

2- determinar o maior elemento;

3- imprimir o resultado;

problema

é

descrita

pelos

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

*/

/* incluir a função system()

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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>

#include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

/* incluir as funções scanf() e printf() */

*/

/* incluir a função system()

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> #include <stdlib.h> int main()

/* incluir as funções scanf() e printf() */

*/

/* incluir a função system()

{

 

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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 )

}

Aprovado \n",mediaAluno);

else printf(" Media = %.2f Reprovado \n",mediaAluno);

printf(" Media = %.2f

}

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> int main()

/* incluir a função toupper()

*/

{

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

masculimo sem filhos.

30.000,00

Kz

aos

trabalhadores

do

sexo

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> int main()

/* incluir a função toupper()

*/

{

}

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; else if (numFilhos != 0) bonus = 40000; else bonus = 30000;

printf("salario final = %.2f",salarioBase + bonus); system ("PAUSE"); return 0;

/* bonus para as mulheres /*

/* bonus para homens com filhos */

/* bonus para homens sem filhos */

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> int main()

 

/* incluir a função system()

 

*/

{

 

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> #include <stdlib.h> int main()

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

{

 

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 rotulo 1 :

comandos 1 ;

74

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

break; case rotulo 2 :

comandos 2 ; break;

.

.

case rotulo n :

}

comandos n ; break;

default:

comandos;

onde a expressão é do tipo inteiro ou caracter e os rótulo i 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ótulo i ( 1≤ i ≤ n) tais que rotulo i = valor da expressão; 3º- Se o rótulo i for encontrado executar os comandos i . 4º- Se o rótulo i 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 rotulo 1 : comandos 1 ; rotulo 2 : Comandos 2 ;

.

.

rotulo n : comandos n ; 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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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 correcta.

exemplos, algumas regras para uma indentação

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

escrita:

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

if (x > 0) printf(" x é positivo"); else 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

resultados desejados.

segmento

de

código

de

forma

a

obter

os

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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

Saida

: Três números diferentes : Maior elemento

--------------------------------------------------------------------------------------------------------*/

#include <stdio.h>

#include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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

max = a; else

(a > c)

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

Saida

: Três números diferentes : Maior elemento

--------------------------------------------------------------------------------------------------------*/

#include <stdio.h> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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

max = a;

if ((b > c) && ( b > a)) max = b; if ((c > a) && ( c > b)) max = c; system("PAUSE"); return 0;

if ((a > b) && (a > c))

}

Exemplo 4.9.2: Calcular as raízes reais da equação do segundo grau ax 2 + 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.

para

X 1 =

−− √−4

2

desde que b 2 - 4ac 0.

X =

e

− ∓ √−4

2

X 2 =

−+ √−4

2

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

float x1, x2;

a, b, c;

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 raizes reias.

descrever as fórmulas lineares para o cálculo das

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> #include <stdlib.h>

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

85

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

#include <math.h> int main()

{

/* incluir a função sqrt()

*/

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> int main()

/* incluir a função sqrt()

*/

{

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> int main()

/* incluir a função toupper()

*/

{

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> int main()

/* incluir a função toupper()

*/

{

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> int main()

/* incluir a função toupper()

*/

{

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.

Horas extraordinárias -

Faltas

Prémio

sobre o salário

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

2-

3-

4-

5-

6-

7-

declarar passe, horasExtras, horasFalta, horasPremio; declarar salario, premio; ler( passe, horasExtras, horasFalta); calcular horasPremio; se hora de prémio estão num determinado intervalo então calcular o valor do prémio; 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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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> #include <stdlib.h> int main()

{

/* incluir as funções scanf() e printf() */

/* incluir a função system()

*/

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

Ax 2 +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.