Mudanças entre as edições de "PR1022804 2024 1 AULA06"
(Página substituída por ' ----- link=PR1022804_2024_1_AULA05 link=PR1022804_2024_1#Aulas Imagem:icone_prox.png|link=PR1022804_2024_1...') Etiqueta: Substituído |
|||
Linha 1: | Linha 1: | ||
+ | =Estruturas de Decisão= | ||
+ | |||
+ | ;OBJETIVOS | ||
+ | |||
+ | :O aluno terá que: | ||
+ | |||
+ | :*Conhecer os operadores relacionais e lógicos na programação C; | ||
+ | :*Saber utilizar o comando de decisão "''if – else''"; | ||
+ | :*Saber utilizar o comando "''switch – case''"; e | ||
+ | :*Conhecer o tipo ''char''. | ||
+ | |||
+ | ;METODOLOGIA | ||
+ | |||
+ | :A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos E testados programas no microcomputador do laboratório de informática. | ||
+ | |||
+ | |||
+ | ;INTRODUÇÃO | ||
+ | |||
+ | :Estruturas de decisão são utilizadas, em linguagens de programação modernas, para verificar um comando e efetuar decisão sobre o mesmo. | ||
+ | :Em linguagem C podemos usar estruturas "''if – else''" e também "''switch – case''" para construir o código equivalente. | ||
+ | |||
+ | |||
+ | ==Operadores Relacionais e Lógicos== | ||
+ | |||
+ | Os operadores relacionais e lógicos são os mesmos vistos na aula anterior. | ||
+ | |||
+ | {| class="wikitable" style="background-color:#ffffff; text-align: center;" | ||
+ | |+Relacionais | ||
+ | ! style="background:#8A2BE2; color:white;" | Operador | ||
+ | ! style="background:#8A2BE2; color:white;" | Significado | ||
+ | ! style="background:#8A2BE2; color:white;" | Exemplo | ||
+ | |- | ||
+ | !style="text-align: center;" | > | ||
+ | | maior que | ||
+ | !style="text-align: center;" | A > B | ||
+ | |- | ||
+ | !style="text-align: center;" | >= | ||
+ | |maior ou igual que | ||
+ | !style="text-align: center;" | A >= -1 | ||
+ | |- | ||
+ | !style="text-align: center;" | < | ||
+ | | menor que | ||
+ | !style="text-align: center;" | B < 2 | ||
+ | |- | ||
+ | !style="text-align: center;" | <= | ||
+ | | menor ou igual que | ||
+ | !style="text-align: center;" | A <= B | ||
+ | |- | ||
+ | !style="text-align: center;" | == | ||
+ | | igual a | ||
+ | !style="text-align: center;" | B == 0 | ||
+ | |- | ||
+ | !style="text-align: center;" | != | ||
+ | |diferente de | ||
+ | !style="text-align: center;" | B != A | ||
+ | |} | ||
+ | |||
+ | |||
+ | {| class="wikitable" style="background-color:#ffffff; text-align: center;" | ||
+ | |+Lógicos | ||
+ | ! style="background:#8A2BE2; color:white;" | Operador | ||
+ | ! style="background:#8A2BE2; color:white;" | Significado | ||
+ | ! style="background:#8A2BE2; color:white;" | Exemplo | ||
+ | |- | ||
+ | !style="text-align: center;" |&& | ||
+ | |AND (E) | ||
+ | !style="text-align: center;" |(A<B) && (B!=0) | ||
+ | |- | ||
+ | !style="text-align: center;" |<nowiki>||</nowiki> | ||
+ | |OR (OU) | ||
+ | !style="text-align: center;" |(B>1)<nowiki>||</nowiki>(A==0) | ||
+ | |- | ||
+ | !style="text-align: center;" |! | ||
+ | |NOT (NÃO) | ||
+ | !style="text-align: center;" |!(A<=B) | ||
+ | |} | ||
+ | * Atenção para o uso dos parênteses. | ||
+ | |||
+ | Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos] | ||
+ | |||
+ | == Comandos de decisão ''if()'' e ''if() – else'' == | ||
+ | |||
+ | Estes comandos são também chamados de <b>Comandos de controle de fluxo</b>.<br> | ||
+ | Possibilitam ao programador alterar a sequência de execução de um programa.<br> | ||
+ | |||
+ | O comando <b>if</b> representa uma tomada de decisão do tipo '''"SE isto ENTÃO aquilo"'''.<br> | ||
+ | |||
+ | Sua forma geral é: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | |||
+ | if (condição) declaração; | ||
+ | |||
+ | if (condição){ | ||
+ | declaração1; | ||
+ | declaração2; | ||
+ | } | ||
+ | else { | ||
+ | declaração3; | ||
+ | declaração4; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | [[imagem:Fig037_MCO018703.jpg|600px|center]] | ||
+ | <center> | ||
+ | Figura 1 - Controle de Fluxo com os comandos '''if''' e '''if...else'''. | ||
+ | </center> | ||
+ | |||
+ | |||
+ | Note o uso das chaves sempre que houver mais de uma declaração. | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | |||
+ | int x; /* declaração de uma variável inteira */ | ||
+ | int y; /* declaração de uma variável inteira */ | ||
+ | |||
+ | printf ("Entre com o valor de x "); | ||
+ | scanf("%d",&x); | ||
+ | |||
+ | printf ("Entre com o valor de y "); | ||
+ | scanf("%d",&y); | ||
+ | |||
+ | if (y>x) | ||
+ | printf("MSG1:y é maior que x\n"); | ||
+ | |||
+ | |||
+ | if (y>x) | ||
+ | printf("MSG2:y é maior que x\n"); | ||
+ | else | ||
+ | printf("MSG3:y é igual ou menor que x\n"); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Outro exemplo, usando blocos: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | |||
+ | int x,y,z; /* declaração de uma variável inteira */ | ||
+ | |||
+ | printf ("Entre com o valor de x "); | ||
+ | scanf("%d",&x); | ||
+ | |||
+ | printf ("Entre com o valor de y "); | ||
+ | scanf("%d",&y); | ||
+ | |||
+ | if (y>x) | ||
+ | { | ||
+ | printf("MSG1: y é maior que x\n"); | ||
+ | z = y-x; | ||
+ | printf("MSG2: Neste caso z = %d\n", z); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf("MSG3: y é igual ou menor que x\n"); | ||
+ | z = x-y; | ||
+ | printf("MSG4: Neste caso z = %d\n", z); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA. Veja o exemplo: | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | if (2) | ||
+ | printf("expressão sempre VERDADEIRA"); | ||
+ | if ('2') | ||
+ | printf("expressão sempre VERDADEIRA"); | ||
+ | if (1-1) | ||
+ | printf("expressão sempre FALSA"); | ||
+ | if (x=1) /* um erro comum - sinal de atribuição no lugar de == */ | ||
+ | printf("expressão sempre VERDADEIRA"); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ;INDENTAÇÃO | ||
+ | |||
+ | [http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação] | ||
+ | [http://en.wikipedia.org/wiki/Indent_style Estilos] | ||
+ | |||
+ | ==Comando ''switch – case''== | ||
+ | |||
+ | O comando '''switch''' permite controlar o fluxo de um programa de forma condicional. | ||
+ | O comando testa uma expressão que deve resultar em um número inteiro. | ||
+ | Uma sequência de cláusulas ''case'' permite executar um conjunto de instruções conforme o valor da expressão. | ||
+ | |||
+ | *É uma forma de reduzir a complexidade de vários ''if...else'' encadeados. | ||
+ | *É muito utilizado em estruturas de menu. | ||
+ | |||
+ | |||
+ | ;PSEUDOCÓDIGO | ||
+ | |||
+ | Em português estruturado o comando ''escolha…caso'' equivale ao ''switch…case''. | ||
+ | |||
+ | Veja estrutura ''escolha...caso'': | ||
+ | |||
+ | <pre> | ||
+ | Escolha (Variável) | ||
+ | Inicio | ||
+ | Caso (Valor1): | ||
+ | Instruções; | ||
+ | |||
+ | Caso (Valor2): | ||
+ | Instruções; | ||
+ | |||
+ | Caso (ValorN): | ||
+ | Instruções; | ||
+ | Fim; | ||
+ | </pre> | ||
+ | |||
+ | Sintaxe do comando ''switch...case'' em linguagem C | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | switch (variável) | ||
+ | { | ||
+ | case constante1: | ||
+ | Instruções; | ||
+ | break; | ||
+ | |||
+ | case constante2: | ||
+ | Instruções; | ||
+ | break; | ||
+ | |||
+ | default | ||
+ | Instruções; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Note que esta sequência de instruções pode ser interrompida por um ''break''. | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int x=1; | ||
+ | |||
+ | void main () | ||
+ | { | ||
+ | int opcao; | ||
+ | printf("Entre com uma opção (número inteiro)\n"); | ||
+ | scanf ("%d",&opcao); | ||
+ | switch(opcao) { | ||
+ | case 1: | ||
+ | printf("opcao 1\n"); | ||
+ | break; /* o break força o encerramento da instrução*/ | ||
+ | case 2: | ||
+ | printf("opcao 2\n"); | ||
+ | x++; /* instrução demonstrativa apenas */ | ||
+ | printf("Note que pode existir ums lista de instruções\n"); | ||
+ | break; | ||
+ | case 3: | ||
+ | printf("opcao 3\n"); /* note o efeito de não ter o break */ | ||
+ | case 4: | ||
+ | printf("opcao 4\n"); | ||
+ | break; | ||
+ | case 5: | ||
+ | printf("opcao 5\n"); | ||
+ | break; | ||
+ | default: | ||
+ | printf("opcao default\n"); | ||
+ | break; /* a opção default é opcional */ | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | [[imagem:Fig038_MCO018703.jpg|600px|center]] | ||
+ | <center> | ||
+ | Figura 2 - Controle de Fluxo usando os comandos '''if( )...else if( )''' e '''switch...case'''. | ||
+ | </center> | ||
+ | |||
+ | |||
+ | ;EXEMPLO 1 | ||
+ | |||
+ | Implementar um programa de calculadora onde são fornecidos via ''scanf'' dois <br> | ||
+ | operandos reais e uma operação que pode ser uma das 4 operações. <br> | ||
+ | Com auxílio de um ''switch'' deve ser computado e mostrado o resultado da operação.<br> | ||
+ | Solução: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | void main () | ||
+ | { | ||
+ | float operando1, operando2, res; | ||
+ | char operador; | ||
+ | |||
+ | printf("Entre com operando 1\n"); | ||
+ | scanf ("%f",&operando1); | ||
+ | printf("Entre com operando 2\n"); | ||
+ | scanf ("%f",&operando2); | ||
+ | printf("Entre com operador\n"); | ||
+ | scanf (" %c",&operador); | ||
+ | |||
+ | switch(operador) { | ||
+ | case '+': | ||
+ | res = operando1 + operando2; | ||
+ | printf("Valor da soma = %f\n", res); | ||
+ | break; | ||
+ | case '-': | ||
+ | res = operando1 - operando2; | ||
+ | printf("Valor da diferença = %f\n", res); | ||
+ | break; | ||
+ | case '*': | ||
+ | res = operando1 * operando2; | ||
+ | printf("Valor do produto= %f\n", res); | ||
+ | break; | ||
+ | case '/': | ||
+ | if (operando2 != 0) { | ||
+ | res = operando1 / operando2; | ||
+ | printf("Valor da divisão = %f\n", res); | ||
+ | } else | ||
+ | printf("Divisão por zero não permitida!\n"); | ||
+ | break; | ||
+ | default: | ||
+ | printf("Operação inválida!\n"); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | ;EXEMPLO 2 | ||
+ | |||
+ | Elaborar uma função que recebe como parâmetro um número inteiro de 1 a 7. <br> | ||
+ | A função deve imprimir Domingo se o número é 1, Segunda se 2, ...<br> | ||
+ | A função deve retornar -1 caso o parâmetro esteja fora da faixa e 0 caso contrário.<br> | ||
+ | Solução: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | /* contribuição do aluno Iago */ | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int operar(int x) | ||
+ | { | ||
+ | switch(x) { | ||
+ | case 1: | ||
+ | printf("Domingo\n"); | ||
+ | break; | ||
+ | case 2: | ||
+ | printf("Segunda\n"); | ||
+ | break; | ||
+ | case 3: | ||
+ | printf("Terça\n"); | ||
+ | break; | ||
+ | case 4: | ||
+ | printf("Quarta\n"); | ||
+ | break; | ||
+ | case 5: | ||
+ | printf("Quinta\n"); | ||
+ | break; | ||
+ | case 6: | ||
+ | printf("Sexta\n"); | ||
+ | break; | ||
+ | case 7: | ||
+ | printf("Sábado\n"); | ||
+ | break; | ||
+ | default: | ||
+ | printf("-1\n"); | ||
+ | return -1; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | |||
+ | int num; | ||
+ | printf("Entre com um número:\n"); | ||
+ | scanf("%d",&num); | ||
+ | num=operar(num); | ||
+ | printf("%d\n",num); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ;EXERCÍCIO 1 | ||
+ | |||
+ | Um funcionário irá receber um aumento de acordo com o seu plano de trabalho (A,B,C e D). <br> | ||
+ | A tabela abaixo mostra o plano e o percentual de aumento: | ||
+ | |||
+ | |||
+ | {| class="wikitable" style="background-color:#ffffff; text-align: center;" | ||
+ | ! style="background:#778899; color:white;" | Plano | ||
+ | ! style="background:#778899; color:white;" | Percentual | ||
+ | |- | ||
+ | !style="text-align: center;" | A | ||
+ | !style="text-align: center;" | 5% | ||
+ | |- | ||
+ | !style="text-align: center;" | B | ||
+ | !style="text-align: center;" | 10% | ||
+ | |- | ||
+ | !style="text-align: center;" | C | ||
+ | !style="text-align: center;" | 15% | ||
+ | |- | ||
+ | !style="text-align: center;" | D | ||
+ | !style="text-align: center;" | 20% | ||
+ | |} | ||
+ | |||
+ | Faça um programa que leia o plano de trabalho e o salário atual de um funcionário<br> | ||
+ | em seguida calcule e imprima o seu novo salário. Use o comando ''switch''. | ||
+ | |||
+ | ;EXERCÍCIO 2 | ||
+ | |||
+ | Faça um programa que leia um número entre 0 e 10, e escreva este número por extenso.<br> | ||
+ | Use o comando ''switch''. | ||
+ | |||
+ | ==O switch sem o break== | ||
+ | |||
+ | Nos exemplos passados, você viu que somente um dos ''case'' era selecionado para cada operação com o uso do | ||
+ | ''break''. Se você tirar o break, o switch identifica o case que é igual a 'operacao' e todos os que estão | ||
+ | abaixo até o fim, ou até encontrar um novo break. | ||
+ | |||
+ | Execute o exemplo a seguir: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int continuar=1; | ||
+ | char opcao; | ||
+ | |||
+ | while(continuar) | ||
+ | { | ||
+ | system("clear || cls"); | ||
+ | printf("Repetir? (S/s)im (N/n)ao\n"); | ||
+ | scanf(" %c",&opcao); | ||
+ | switch(opcao) | ||
+ | { | ||
+ | case 's': | ||
+ | case 'S': | ||
+ | break; | ||
+ | |||
+ | case 'n': | ||
+ | case 'N': | ||
+ | continuar = 0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | O comando system("clear") serve para limpar a tela em sistemas operacionais do tipo Linux, e system("cls") | ||
+ | limpa a tela caso você use Windows. Então system("clear || cls") limpa a tela, independente de qual sistema | ||
+ | você esteja usando. | ||
+ | |||
+ | Nota-se que, enquanto continuar=1, o laço WHILE continua a ocorrer e só termina quando 'continuar' receber valor 0. | ||
+ | Se digitarmos 's' o primeiro case é selecionado. Como ele não tem break, o próximo também ocorre, que é o case caso | ||
+ | opcao='S'. Esse tem break. Ou seja, pra continuar a repetir basta digitar 'S' ou 's'. | ||
+ | |||
+ | Se digitar 'n', vai cair no case onde opcao='n' e onde opcao='N', pois não tem break no opcao='n'. | ||
+ | Então, 'continuar' recebe valor 0 e o laço WHILE termina. | ||
+ | |||
+ | ;EXEMPLO 1 | ||
+ | |||
+ | Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial. | ||
+ | Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3%. | ||
+ | Vamos supor que você pode atrasar, no máximo, 5 meses. | ||
+ | |||
+ | O programa pede, como entrada, dois valores: | ||
+ | - um float: com o valor de sua dívida inicial (valor_i) | ||
+ | - um inteiro: de 0 até 5, que são o número de meses de atraso. | ||
+ | |||
+ | Faça um programa em C que calcule os juros (simples) de atraso usando switch e case acumulados. | ||
+ | |||
+ | {{collapse top|bg=#E6E6FA|Solução}} | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | float valor_i, | ||
+ | valor_f; | ||
+ | int juros=0; | ||
+ | |||
+ | int meses; | ||
+ | |||
+ | printf("Qual o valor inicial da dívida: "); | ||
+ | scanf("%f", &valor_i); | ||
+ | |||
+ | printf("Você vai atrasar quantos meses [1-5]?: "); | ||
+ | scanf("%d", &meses); | ||
+ | |||
+ | switch( meses ) | ||
+ | { | ||
+ | case 5: | ||
+ | juros++; | ||
+ | case 4: | ||
+ | juros++; | ||
+ | case 3: | ||
+ | juros++; | ||
+ | case 2: | ||
+ | juros++; | ||
+ | case 1: | ||
+ | juros++; | ||
+ | break; | ||
+ | default: | ||
+ | printf("Você não digitou um valor válido de meses\n"); | ||
+ | |||
+ | } | ||
+ | printf("Juros: %d%\n",juros); | ||
+ | valor_f=( (1 + (juros/100.0))*valor_i); | ||
+ | printf("Valor final da dívida: R$ %.2f\n", valor_f); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | Caso tenha atrasado 5 meses, o valor da variável 'juros' é incrementado 5 vezes. | ||
+ | Se atrasou 4 meses, o 'juros' é incrementado 4 vezes, e assim por diante. | ||
+ | |||
+ | ;EXEMPLO 2 | ||
+ | |||
+ | Crie um programa que receba um inteiro, de 1 até 12, representando os meses do ano e retorne o número de dias do mês. | ||
+ | Use switch e não use break. Acumule os case. | ||
+ | |||
+ | {{collapse top|bg=#E6E6FA|Solução}} | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | while(1) | ||
+ | { | ||
+ | int mes,dias=27; | ||
+ | printf("\nDigite o numero do mes: "); | ||
+ | scanf("%d",&mes); | ||
+ | switch (mes) | ||
+ | { | ||
+ | case 1: | ||
+ | case 3: | ||
+ | case 5: | ||
+ | case 7: | ||
+ | case 8: | ||
+ | case 10: | ||
+ | case 12: dias++; | ||
+ | case 4: | ||
+ | case 6: | ||
+ | case 9: | ||
+ | case 11: dias=dias+2; | ||
+ | case 2: dias++; | ||
+ | } | ||
+ | printf("\nMes: %d Dias: %d",mes,dias); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | =Tipo Char= | ||
+ | |||
+ | Os caracteres são um tipo de dado chamado de '''char'''. O C trata os caracteres ('a','b','c',...) como sendo variáveis de um ''byte'' (8 ''bits''). Um ''bit'' é a menor unidade de informação que pode ser armazenada num computador. Os inteiros ('''int''') e os reais ('''float''') têm um número de ''bytes'' maior. Podem ter 2 ''bytes'' (16 ''bits''), 4 ''bytes'' (32 ''bits'') ou<br> | ||
+ | até mais. | ||
+ | |||
+ | |||
+ | [http://pt.wikipedia.org/wiki/ASCII Consulte a tabela ASCII] | ||
+ | |||
+ | |||
+ | Uma variável do tipo '''caracter''' é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de ''byte''. | ||
+ | |||
+ | |||
+ | ;EXEMPLO | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | void main () | ||
+ | { | ||
+ | char x='A',y=65,w=0x41,z; | ||
+ | |||
+ | scanf("%c",&z); | ||
+ | printf("Caracter lido = %c\n",z); | ||
+ | printf("Caracter lido = %d\n",z); | ||
+ | printf("Caracter lido = %x\n",z); | ||
+ | if (z==x) | ||
+ | printf("Iguais 1\n"); | ||
+ | if (z==y) | ||
+ | printf("Iguais 2\n"); | ||
+ | if (z==w) | ||
+ | printf("Iguais 3\n"); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | [http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado] | ||
+ | |||
+ | |||
+ | ;Como gerar os caracteres ASCII imprimíveis na Linguagem C | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | for (i = 32; i <= 126; i++) | ||
+ | { | ||
+ | printf("%c [%d]\n", i, i); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =Exercícios= | ||
+ | |||
+ | Para os exercícios abaixo, fazer o algorítimo na forma de '''pseudo-código''' e '''fluxograma''': | ||
+ | |||
+ | #Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. | ||
+ | <!-- | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | float converter_fahreiheit_para_celsius (float temp_fahr) | ||
+ | { | ||
+ | /* melhorar - retornar -1000 se o valor do parâmetro for inválido */ | ||
+ | return ((temp_fahr-32)/1.8); | ||
+ | } | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | float temperatura_fahre, resultado_celsius; | ||
+ | printf("Entre com graus Fahrenheit -> "); | ||
+ | scanf ("%f", &temperatura_fahre); | ||
+ | resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre); | ||
+ | printf("Conversao = %f\n", resultado_celsius); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | --> | ||
+ | #Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de módulo da divisão. | ||
+ | #Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos. | ||
+ | <!-- | ||
+ | <syntaxhighlight lang=c> | ||
+ | main() | ||
+ | { | ||
+ | int x,y; | ||
+ | float media; | ||
+ | |||
+ | printf("Entre com x\n"); | ||
+ | scanf("%d",&x); | ||
+ | printf("Entre com y\n"); | ||
+ | scanf("%d",&y); | ||
+ | if (x==y) | ||
+ | printf("números iguais\n"); | ||
+ | else { | ||
+ | printf("números diferentes\n"); | ||
+ | media = (x+y)/2.0; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | --> | ||
+ | #Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos. | ||
+ | <!--<syntaxhighlight lang=c> | ||
+ | main() | ||
+ | { | ||
+ | int num1,num2,num3,num4; | ||
+ | int soma1,soma2; | ||
+ | |||
+ | printf("Entre com num1\n"); | ||
+ | scanf("%d", &num1); | ||
+ | printf("Entre com num2\n"); | ||
+ | scanf("%d", &num2); | ||
+ | printf("Entre com num3\n"); | ||
+ | scanf("%d", &num3); | ||
+ | printf("Entre com num4\n"); | ||
+ | scanf("%d", &num4); | ||
+ | |||
+ | soma1 = num1+num2; | ||
+ | soma2 = num3+num4; | ||
+ | |||
+ | if(soma1<=soma2) | ||
+ | printf("Soma dos dois primeiros <= que a soma dos dois últimos\n"); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | --> | ||
+ | #Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível. | ||
+ | <!-- | ||
+ | <syntaxhighlight lang=c> | ||
+ | main() | ||
+ | { | ||
+ | float num1,num2; | ||
+ | int operacao; | ||
+ | |||
+ | printf("Entre com num1\n"); | ||
+ | scanf("%f", &num1); | ||
+ | printf("Entre com num2\n"); | ||
+ | scanf("%f", &num2); | ||
+ | |||
+ | printf("Entre com a operacao\n"); | ||
+ | scanf("%d", &operacao); | ||
+ | |||
+ | /* Esta solução pode ser otimizada - veremos | ||
+ | mais tarde */ | ||
+ | if (operacao>=1 && operacao <=4) { | ||
+ | if (operacao==1) | ||
+ | resultado = num1 + num2; | ||
+ | if (operacao==3) | ||
+ | resultado = num1 - num2; | ||
+ | if (operacao==3) | ||
+ | resultado = num1 * num2; | ||
+ | if (operacao==4) { | ||
+ | if (num2!=0) | ||
+ | resultado = num1 / num2; | ||
+ | else | ||
+ | printf("Divisao por zero\n"); | ||
+ | } | ||
+ | printf("O resultado da operacao %d é %f\n",operacao,resultado); | ||
+ | } else { | ||
+ | printf("Operacao inválida"); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | --> | ||
+ | #Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C. | ||
+ | #Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior). | ||
+ | #Implementar um programa C para converter um ângulo em radianos para graus. | ||
+ | #Implementar um programa C que recebe os 3 coeficientes de uma equação do segundo grau e então determina as raízes da mesma. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ----- | ||
+ | [[Imagem:icone_voltar.png|link=PR1022804_2024_1_AULA05]] | ||
+ | [[Imagem:icone_menu.png|link=PR1022804_2024_1#Aulas]] | ||
+ | [[Imagem:icone_prox.png|link=PR1022804_2024_1_AULA07]] | ||
Edição das 16h52min de 5 de março de 2024
Estruturas de Decisão
- OBJETIVOS
- O aluno terá que:
- Conhecer os operadores relacionais e lógicos na programação C;
- Saber utilizar o comando de decisão "if – else";
- Saber utilizar o comando "switch – case"; e
- Conhecer o tipo char.
- METODOLOGIA
- A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos E testados programas no microcomputador do laboratório de informática.
- INTRODUÇÃO
- Estruturas de decisão são utilizadas, em linguagens de programação modernas, para verificar um comando e efetuar decisão sobre o mesmo.
- Em linguagem C podemos usar estruturas "if – else" e também "switch – case" para construir o código equivalente.
Operadores Relacionais e Lógicos
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.
Operador | Significado | Exemplo |
---|---|---|
> | maior que | A > B |
>= | maior ou igual que | A >= -1 |
< | menor que | B < 2 |
<= | menor ou igual que | A <= B |
== | igual a | B == 0 |
!= | diferente de | B != A |
Operador | Significado | Exemplo |
---|---|---|
&& | AND (E) | (A<B) && (B!=0) |
|| | OR (OU) | (B>1)||(A==0) |
! | NOT (NÃO) | !(A<=B) |
* Atenção para o uso dos parênteses.
Ver Operadores Relacionais e Lógicos
Comandos de decisão if() e if() – else
Estes comandos são também chamados de Comandos de controle de fluxo.
Possibilitam ao programador alterar a sequência de execução de um programa.
O comando if representa uma tomada de decisão do tipo "SE isto ENTÃO aquilo".
Sua forma geral é:
if (condição) declaração;
if (condição){
declaração1;
declaração2;
}
else {
declaração3;
declaração4;
}
Figura 1 - Controle de Fluxo com os comandos if e if...else.
Note o uso das chaves sempre que houver mais de uma declaração.
#include <stdio.h>
void main()
{
int x; /* declaração de uma variável inteira */
int y; /* declaração de uma variável inteira */
printf ("Entre com o valor de x ");
scanf("%d",&x);
printf ("Entre com o valor de y ");
scanf("%d",&y);
if (y>x)
printf("MSG1:y é maior que x\n");
if (y>x)
printf("MSG2:y é maior que x\n");
else
printf("MSG3:y é igual ou menor que x\n");
}
Outro exemplo, usando blocos:
#include <stdio.h>
void main()
{
int x,y,z; /* declaração de uma variável inteira */
printf ("Entre com o valor de x ");
scanf("%d",&x);
printf ("Entre com o valor de y ");
scanf("%d",&y);
if (y>x)
{
printf("MSG1: y é maior que x\n");
z = y-x;
printf("MSG2: Neste caso z = %d\n", z);
}
else
{
printf("MSG3: y é igual ou menor que x\n");
z = x-y;
printf("MSG4: Neste caso z = %d\n", z);
}
}
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA. Veja o exemplo:
if (2)
printf("expressão sempre VERDADEIRA");
if ('2')
printf("expressão sempre VERDADEIRA");
if (1-1)
printf("expressão sempre FALSA");
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */
printf("expressão sempre VERDADEIRA");
- INDENTAÇÃO
Comando switch – case
O comando switch permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve resultar em um número inteiro. Uma sequência de cláusulas case permite executar um conjunto de instruções conforme o valor da expressão.
- É uma forma de reduzir a complexidade de vários if...else encadeados.
- É muito utilizado em estruturas de menu.
- PSEUDOCÓDIGO
Em português estruturado o comando escolha…caso equivale ao switch…case.
Veja estrutura escolha...caso:
Escolha (Variável) Inicio Caso (Valor1): Instruções; Caso (Valor2): Instruções; Caso (ValorN): Instruções; Fim;
Sintaxe do comando switch...case em linguagem C
switch (variável)
{
case constante1:
Instruções;
break;
case constante2:
Instruções;
break;
default
Instruções;
}
Note que esta sequência de instruções pode ser interrompida por um break.
#include <stdio.h>
int x=1;
void main ()
{
int opcao;
printf("Entre com uma opção (número inteiro)\n");
scanf ("%d",&opcao);
switch(opcao) {
case 1:
printf("opcao 1\n");
break; /* o break força o encerramento da instrução*/
case 2:
printf("opcao 2\n");
x++; /* instrução demonstrativa apenas */
printf("Note que pode existir ums lista de instruções\n");
break;
case 3:
printf("opcao 3\n"); /* note o efeito de não ter o break */
case 4:
printf("opcao 4\n");
break;
case 5:
printf("opcao 5\n");
break;
default:
printf("opcao default\n");
break; /* a opção default é opcional */
}
}
Figura 2 - Controle de Fluxo usando os comandos if( )...else if( ) e switch...case.
- EXEMPLO 1
Implementar um programa de calculadora onde são fornecidos via scanf dois
operandos reais e uma operação que pode ser uma das 4 operações.
Com auxílio de um switch deve ser computado e mostrado o resultado da operação.
Solução:
#include <stdio.h>
void main ()
{
float operando1, operando2, res;
char operador;
printf("Entre com operando 1\n");
scanf ("%f",&operando1);
printf("Entre com operando 2\n");
scanf ("%f",&operando2);
printf("Entre com operador\n");
scanf (" %c",&operador);
switch(operador) {
case '+':
res = operando1 + operando2;
printf("Valor da soma = %f\n", res);
break;
case '-':
res = operando1 - operando2;
printf("Valor da diferença = %f\n", res);
break;
case '*':
res = operando1 * operando2;
printf("Valor do produto= %f\n", res);
break;
case '/':
if (operando2 != 0) {
res = operando1 / operando2;
printf("Valor da divisão = %f\n", res);
} else
printf("Divisão por zero não permitida!\n");
break;
default:
printf("Operação inválida!\n");
break;
}
}
- EXEMPLO 2
Elaborar uma função que recebe como parâmetro um número inteiro de 1 a 7.
A função deve imprimir Domingo se o número é 1, Segunda se 2, ...
A função deve retornar -1 caso o parâmetro esteja fora da faixa e 0 caso contrário.
Solução:
/* contribuição do aluno Iago */
#include <stdio.h>
int operar(int x)
{
switch(x) {
case 1:
printf("Domingo\n");
break;
case 2:
printf("Segunda\n");
break;
case 3:
printf("Terça\n");
break;
case 4:
printf("Quarta\n");
break;
case 5:
printf("Quinta\n");
break;
case 6:
printf("Sexta\n");
break;
case 7:
printf("Sábado\n");
break;
default:
printf("-1\n");
return -1;
}
return 0;
}
void main()
{
int num;
printf("Entre com um número:\n");
scanf("%d",&num);
num=operar(num);
printf("%d\n",num);
}
- EXERCÍCIO 1
Um funcionário irá receber um aumento de acordo com o seu plano de trabalho (A,B,C e D).
A tabela abaixo mostra o plano e o percentual de aumento:
Plano | Percentual |
---|---|
A | 5% |
B | 10% |
C | 15% |
D | 20% |
Faça um programa que leia o plano de trabalho e o salário atual de um funcionário
em seguida calcule e imprima o seu novo salário. Use o comando switch.
- EXERCÍCIO 2
Faça um programa que leia um número entre 0 e 10, e escreva este número por extenso.
Use o comando switch.
O switch sem o break
Nos exemplos passados, você viu que somente um dos case era selecionado para cada operação com o uso do break. Se você tirar o break, o switch identifica o case que é igual a 'operacao' e todos os que estão abaixo até o fim, ou até encontrar um novo break.
Execute o exemplo a seguir:
#include <stdio.h>
int main()
{
int continuar=1;
char opcao;
while(continuar)
{
system("clear || cls");
printf("Repetir? (S/s)im (N/n)ao\n");
scanf(" %c",&opcao);
switch(opcao)
{
case 's':
case 'S':
break;
case 'n':
case 'N':
continuar = 0;
}
}
}
O comando system("clear") serve para limpar a tela em sistemas operacionais do tipo Linux, e system("cls") limpa a tela caso você use Windows. Então system("clear || cls") limpa a tela, independente de qual sistema você esteja usando.
Nota-se que, enquanto continuar=1, o laço WHILE continua a ocorrer e só termina quando 'continuar' receber valor 0. Se digitarmos 's' o primeiro case é selecionado. Como ele não tem break, o próximo também ocorre, que é o case caso opcao='S'. Esse tem break. Ou seja, pra continuar a repetir basta digitar 'S' ou 's'.
Se digitar 'n', vai cair no case onde opcao='n' e onde opcao='N', pois não tem break no opcao='n'. Então, 'continuar' recebe valor 0 e o laço WHILE termina.
- EXEMPLO 1
Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial. Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3%. Vamos supor que você pode atrasar, no máximo, 5 meses.
O programa pede, como entrada, dois valores: - um float: com o valor de sua dívida inicial (valor_i) - um inteiro: de 0 até 5, que são o número de meses de atraso.
Faça um programa em C que calcule os juros (simples) de atraso usando switch e case acumulados.
Solução |
---|
#include <stdio.h>
int main(void)
{
float valor_i,
valor_f;
int juros=0;
int meses;
printf("Qual o valor inicial da dívida: ");
scanf("%f", &valor_i);
printf("Você vai atrasar quantos meses [1-5]?: ");
scanf("%d", &meses);
switch( meses )
{
case 5:
juros++;
case 4:
juros++;
case 3:
juros++;
case 2:
juros++;
case 1:
juros++;
break;
default:
printf("Você não digitou um valor válido de meses\n");
}
printf("Juros: %d%\n",juros);
valor_f=( (1 + (juros/100.0))*valor_i);
printf("Valor final da dívida: R$ %.2f\n", valor_f);
}
|
Caso tenha atrasado 5 meses, o valor da variável 'juros' é incrementado 5 vezes. Se atrasou 4 meses, o 'juros' é incrementado 4 vezes, e assim por diante.
- EXEMPLO 2
Crie um programa que receba um inteiro, de 1 até 12, representando os meses do ano e retorne o número de dias do mês. Use switch e não use break. Acumule os case.
Solução |
---|
#include <stdio.h>
int main()
{
while(1)
{
int mes,dias=27;
printf("\nDigite o numero do mes: ");
scanf("%d",&mes);
switch (mes)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: dias++;
case 4:
case 6:
case 9:
case 11: dias=dias+2;
case 2: dias++;
}
printf("\nMes: %d Dias: %d",mes,dias);
}
}
|
Tipo Char
Os caracteres são um tipo de dado chamado de char. O C trata os caracteres ('a','b','c',...) como sendo variáveis de um byte (8 bits). Um bit é a menor unidade de informação que pode ser armazenada num computador. Os inteiros (int) e os reais (float) têm um número de bytes maior. Podem ter 2 bytes (16 bits), 4 bytes (32 bits) ou
até mais.
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo char, que na prática é um número inteiro de byte.
- EXEMPLO
#include <stdio.h>
void main ()
{
char x='A',y=65,w=0x41,z;
scanf("%c",&z);
printf("Caracter lido = %c\n",z);
printf("Caracter lido = %d\n",z);
printf("Caracter lido = %x\n",z);
if (z==x)
printf("Iguais 1\n");
if (z==y)
printf("Iguais 2\n");
if (z==w)
printf("Iguais 3\n");
}
- Como gerar os caracteres ASCII imprimíveis na Linguagem C
#include <stdio.h>
void main()
{
int i;
for (i = 32; i <= 126; i++)
{
printf("%c [%d]\n", i, i);
}
}
Exercícios
Para os exercícios abaixo, fazer o algorítimo na forma de pseudo-código e fluxograma:
- Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius.
- Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de módulo da divisão.
- Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.
- Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.
- Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.
- Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.
- Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).
- Implementar um programa C para converter um ângulo em radianos para graus.
- Implementar um programa C que recebe os 3 coeficientes de uma equação do segundo grau e então determina as raízes da mesma.