Linguagem C - USP
-
Upload
alexandre-govea -
Category
Documents
-
view
75 -
download
0
Transcript of Linguagem C - USP
Linguagem C IME/USP
Linguagem CDepartamento de Cincia da ComputaoIME/USP
Comando de repetio while
Sintaxewhile (condio) comando
onde comando pode corresponder a uma instruo simples ou a uma seqncia de instrues entre chaves separados por " ; " e condio uma expresso lgica, cujo resultado pode ser verdadeiro ou falso.
DescrioEnquanto a condio for verdadeira, o comando repetido. O comando pode ser apenas uma instruo do C ou um bloco de instrues entre chaves.
Por exemplo, seja x uma varivel inteira. O segmento de programa abaixo simplesmente subtrai 1 de x, 5 vezes (note que o comando 'x = x-1;' repetido 5 vezes).
x=5;while (x > 0){x = x -1;}printf("valor de x = %d\n",x);A figura abaixo mostra graficamente o fluxo de execuo desses comandos. Para entender esse diagrama, cada retngulo representa um bloco de instrues, que so executadas seqencialmente, um bloco de cada vez, de cima para baixo. O primeiro comando, a atribuio x = 5 (a varivel x recebe o valor 5), executado antes do while.
Nessa representao grfica, blocos retangulares podem ser encaixados, como pode ser visto no bloco correspondente ao while. Esse comando testa a condio (x>0) e se ela for verdadeira, executa os comandos do sub-bloco associado, que nesse caso contem apenas a atribuio x = x - 1. Observe a seta na coluna esquerda do bloco do while. Ela indica que ao terminar o sub-bloco, a condio do while precisa ser testada novamente. Assim, o sub-bloco repetido enquanto a condio do while for verdadeira, e s quando a condio for falsa, o while termina, e a instruo seguinte executada (no caso, o printf).
NOTA: para que o seu programa termine, voc precisa garantir que a condio do while seja alterada de alguma forma. Caso contrrio, o programa entra em "looping infinito".
Exemplos comentados:Exemplo 1: Dada uma seqncia de nmeros inteiros, calcular os seus quadrados.Soluo:Uma soluo possvel pode ser descrita de modo informal como:
0 - imprima uma mensagem para o usurio saber o que fazer1 - leia o primeiro nmero da seqncia na varivel num2 - enquanto num for diferente de zero faa:2.1 calcule quadrado = num * num2.2 imprima o valor de quadrado2.3 leia o prximo nmero da seqncia na varivel num3. fim
O funcionamento do programa pode ser entendido tambm pelo diagrama abaixo:
Em geral, mais simples desenhar o diagrama e, quando voc estiver certo de que ele funciona, sua "traduo" para a linguagem C simples, basta copiar o esqueleto de um programa em C visto anteriormente, e preencher as lacunas. O programa em C ficaria:#include #include
int main () {/* declaracoes */int num; /* variavel utilizada para leitura da sequencia */int quad; /* variavel que armazena o quadrado de um numero */
/* programa */printf("Digite uma sequencia terminada por zero\n");scanf("%d", &num);
while (num != 0) /* os simbolos '!=' significam diferente */{quad = num * num ;printf ("O quadrado de %d = %d\n", num, quad);scanf("%d", &num);}
/* fim do programa */system ("pause");return 0;}NOTA: programao exige muita ateno a detalhes. Porm, como o nmero de comados bastante limitado, no to difcil assim aprender uma linguagem de programao. Programar porm pode ser considerado difcil por alguns, pois o problema precisa ser decomposto e descrito de modo formal. Vamos resolver vrios exerccios para que voc desenvolva o raciocnio para decompor os problemas.
Exemplo 2:Dada uma seqncia de nmeros inteiros terminada por zero, calcular a somatria dos nmeros da seqncia.
SoluoPara melhor entender o problema, vamos ver um exemplo concreto de entrada e sada. Para a entrada2 3 -4 5 0a sada deve ser 6 (2 + 3 - 4 + 5).
Uma forma possvel para resolver esse problema imaginar uma varivel que armazena as somas parciais. Essa varivel deve iniciar com o valor zero, e para cada nmero da seqncia, ser somada com mais esse nmero, at o final da seqncia. Assim, para o exemplo acima, o valor de soma torna-se 2 aps processar o primeiro elemento da seqencia (soma-se o 2), 5 aps o segundo (soma-se o 3), 1 aps o terceiro (soma-se o 4), e assim at o final.
O diagrama abaixo ilustra um rascunho usando nossa pseudo linguagem de blocos:
Traduzindo esse esboo para C temos:#include #include
int main () {/* declaracoes */int num; /* variavel utilizada para leitura da sequencia */int soma; /* variavel que armazena a soma da sequencia */
/* programa */printf("Digite uma sequencia terminada por zero\n");scanf("%d", &num);
while (num != 0) /* os simbolos '!=' significam diferente */{soma = soma * num ;scanf("%d", &num);}
printf("Soma da sequencia = %d \n", soma);/* fim do programa */system ("pause");return 0;}
Exemplo 3:Vamos alterar um pouco o enunciado do exemplo anterior, para:Dado um nmero inteiro positivo, calcular a soma de seus dgitos.Por exemplo, para o nmero 1234, a sada deve ser 1+2+3+4 = 10.SoluoA primeira pergunta seria: como a gente pode separar um dgito do nmero, para podermos calcular a soma? A resposta o operador resto, que utilizamos tambm na aula dirigida do compilador Dev-C++ para determinar nmeros pares e mpares. Lembre-se que o resultado de 7%3 1, pois 7 = 2 * 3 + resto, onde resto = 1; e o resultado de 7 / 3 2.
A idia geral , separar o dgito mais a direita, atualizar a soma, e tratar o prximo digito, at que todos os digitos sejam somados. O rascunho abaixo ilustra essa idia:
Observe que a varivel dgito recebe o valor do dgito mais a direita de num (digito = num % 10) dentro do comando enquanto (while), e a seguir o nmero modificado para que ele perca o digito processado (num = num / 10). A tabela abaixo ilustra a execuo desse programa, mostrando o que acontece com as variveis para o nmero 123:
Comentrionumdigito soma
antes do enquanto1230
dentro de enquanto: digito = num % 103
num = num / 1012
soma = soma + digito3
condio do enquanto verdadeira
digito = num / 102
num = num / 101
soma = soma + digito5
condio verdadeira
digito = num / 101
num = num / 100
soma = soma + digito6
condio do enquanto falsa, fim do loop
Traduzindo o pseudo cdigo para C:#include #include
int main ( ){/* Declaracoes */int num, soma, digito;printf ("Entre com um numero: ");scanf ("%d", &num);
soma = 0;while (num != 0) /* enquanto houver digitos para processar */{digito = num % 10; /* pega o digito mais a direita */num = num / 10; /* atualiza o numero, mantedo apenas os digitos no processados */soma = soma + digito; /* atualiza a soma dos digitos */}
printf ("Soma dos digitos: %d.\n", soma);system("pause");return 0;}
Eloiza Sonoda
Comando de deciso - if then else
Sintaxe:h duas variaes do comando if:
1 - if (condio) comando-if else comando-else
2 - if (condio) comando-if
Descrio:Os comandos if e if-else so instrues que permitem a execuo condicional de outros comandos.
Na forma completa, if-else, o comando-if executado quando a condio verdadeira, caso contrrio, o comando-else executado. A figura abaixo ilustra um bloco em pseudo-linguagem grfica que corresponde ao comando if-else:
H ocasies em que o else desnecessrio, e por isso a linguagem C permite a outra construo if (sem o else) desse comando. No diagrama, o bloco comando-else (quando a condio falsa), se torna vazio, ou seja, no existem comandos para serem executados.
ExemplosExemplo 1:escreva um programa que leia 2 nmeros inteiros e imprima o maior.SoluoA simplicidade desse programa permite observar o uso do comando if-else. Para isso, vamos utilizar 2 variveis para armazenar os valores de entrada, e outra para armazenar o maior valor. Um rascunho pode ser observado no diagrama da figura abaixo:
Traduzindo o diagrama para C temos:#include #include
int main (){int num1, num2, maior;printf("Entre com 2 numeros inteiros");scanf("%d %d", &num1, &num2);
if (num1 > num2)maior = num1;elsemaior = num2;
printf("O maior numero e: %d", maior);system("pause");return 0;}Observe que basta comparar num1 com num2 para sabermos qual o maior.
Exemplo 2:escreva um programa que leia 3 nmeros inteiros distintos e os imprima em ordem crescente.
Soluo:
a idia bsica comparar os nmeros, porm, h vrias formas de faz-lo.Como h apenas 3 nmeros, podemos testar todas as possibilidades da seguinte forma (apenas um trecho do programa):/* assuma que as variveis num1, num2 e num3 j estejam carregadas */if (num1