linguagem c - usp

Upload: alexandre-govea

Post on 11-Oct-2015

80 views

Category:

Documents


0 download

TRANSCRIPT

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