Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Questões resolvidas sobre laço WHILE em C

Vamos agora resolver as questões sobre o laço WHILE, que havíamos proposto no artigo anterior de nosso curso de C.

Se não conseguiu, leia a solução e tente mais uma vez.
Somente se conseguir, ou depois de muito tentar, é que você deve ver o código.

Clique aqui e saiba como obter seu certificado de programação C! Entre já no Mercado de Trabalho!



Apostila C Progressivo - Solução das questões sobre o laço WHILE

0. Programa em C dos patinhos da Xuxa
Xuxa, a rainha dos baixinhos, criou uma música que tem o seguinte formato:

n patinhos foram passear
Além das montanhas
Para brincar
A mamãe gritou: Quá, quá, quá, quá
Mas só n-1 patinhos voltaram de lá.

Que se repete até nenhum patinho voltar de lá.
Ao final, todos os patinhos voltam:

A mamãe patinha foi procurar
Além das montanhas
Na beira do mar
A mamãe gritou: Quá, quá, quá, quá
E os n patinhos voltaram de lá.


Inicialmente, perguntamos ao usuário quantos patinhos ele quer que a mamãe pata tenha. Armazenaremos esse valor na variável inteira 'duck'.
Vamos usar também outra variável inteira, a 'count', que recebe o mesmo valor da 'duck', mas será alterada dentro do laço while.

Após isso entramos em um while, que, enquanto o valor de 'count' for maior que 1, exibe o trecho inicial da música.
Nesse trecho inicial, basta substituirmos 'n' por 'count', e 'n-1' por 'count - 1'.

Quando count for 1, o laço while termina. Depois do while, a mamãe nota que nenhum patinho voltou, e depois vai buscar eles.
Código C:
#include <stdio.h>

int main()
{
        int duck,
            count;

        printf("Quantas patinhos a mamae Pata tem? ");
        scanf("%d", &duck);

        count = duck;
        while( count > 1)
        {
            printf("%d patinhos foram passear\n", count);
            printf("Além das montanhas\n");
            printf("Para brincar\n");
            printf("A mamãe gritou: Quá, quá, quá, quá\n");
            printf("Mas só %d patinhos voltaram de lá.\n\n", count-1);

            count--;
        }

        printf("1 patinho foi passear\n");
        printf("Além das montanhas\n");
        printf("Para brincar\n");
        printf("A mamãe gritou: Quá, quá, quá, quá\n");
        printf("Mas nenhum patinho voltou de lá.\n\n");

        printf("A mamãe patinha foi procurar\n");
        printf("Além das montanhas\n");
        printf("Na beira do mar\n");
        printf("A mamãe gritou: Quá, quá, quá, quá\n");
        printf("E os %d patinhos voltaram de lá.\n", duck);
}




1. Escreva um aplicativo em C mostra todos os números ímpares de 1 até 100.

Essa é bem simples. Basta percorrermos os números de 1 até 100, e fazer um teste condicional IF dentro do laço WHILE, para exibir somente aqueles números que são ímpares, ou seja, aqueles números que deixam resto 1 quando divididos por
Código C:
#include <stdio.h>

int main()
{
        int count = 1;

        while(count <= 100)
        {
            if(count%2 == 1)
                printf("%d ",count);

            count++;
        }
}


2. Escreva um aplicativo em C mostra todos os números pares de 1 até 100. 
Esse não precisa nem de código, basta você alterar apenas um número do exercício anterior.


3. Escreva um aplicativo em C que recebe inteiro e mostra os números pares e ímpares (separados, em duas colunas), de 1 até esse inteiro.

Como o primeiro número é ímpar (1), os ímpares serão exibidos primeiro. Após cada ímpar damos o espaço de um TAB (\t), e na mesma linha imprimimos o par, e logo em seguinte o caractere new line (\n).
Código C:
#include <stdio.h>

int main()
{
        int num,
            count = 1;

        printf("Digite um numero: ");
        scanf("%d", &num);

        printf("IMPARES \tPARES\n");

        while(count <= num)
        {
            if(count%2 == 1)
                printf("    %d \t",count);
            else
                printf("    \t %d\n", count);

            count++;
        }
}


4.Escreva um programa que pergunte ao usuário quantos alunos tem na sala dele.
Em seguida, através de um laço while, pede ao usuário para que entre com as notas de todos os alunos da sala, um por vez.
Por fim, o programa deve mostrar a média, aritmética, da turma.


Para resolver este exercício, vamos precisar de várias variáveis de apoio.
A variável 'total' vai receber o número total de alunos em uma sala.
A variável 'count' será a que vai mudar dentro do laço WHILE. E ela começa do primeiro aluno e termina no último.
A cada iteração do laço while, pedimos uma nota, que é somada a variável do tipo float 'soma'.
A média aritmética é dada por essa soma (de todas as notas), dividida pelo número de alunos na sala.
Assim, nosso programa em C fica:
Código C:
#include <stdio.h>

int main()
{
        int total,
            count = 1;
        float nota,
              soma=0.0;

        printf("Numero de alunos na sala: ");
        scanf("%d",&total);

        while(count <= total)
        {
            printf("Nota do aluno %d: ",count);
            scanf("%f",&nota);

            soma = soma + nota;

            count++;
        }

        printf("Media da turma: %.2f", soma/total);
}



5. Achar o maior, menor, média e organizar números ou seqüências são os algoritmos mais importantes e estudados em Computação. Em C não poderia ser diferente.
Em nosso curso, obviamente, também não será diferente.

Escreva um programa em C que solicita 10 números ao usuário, através de um laço while, e ao final
mostre qual destes números é o maior.

Vamos usar a nossa velha e conhecida variável 'count' pra contar de 1 até 10 no laço while.
Inicialmente, também, criamos a variável 'maior', que irá armazenar o maior número. Inicializamos ela com valor 0.

A cada iteração do laço while pedimos um número ao usuário, e armazenamos sempre na variável 'num'.
Em seguida fazemos uma comparação com o teste condicional IF ELSE para saber se esse número digitado é maior que o 'maior'. Se for, é porque esse número é o maior que já foi digitado, então fazemos com a variável 'maior' receba o valor desse 'num'.

Caso o 'num' não seja maior que 'maior', nada acontece e 'maior' continua armazenando o maior número.

Veja como ficou nossa solução em C:
Código C:
#include <stdio.h>

int main()
{
        int maior=0,
            num,
            count=1;

        while (count <= 10)
        {
            printf("Digite o numero %d: ", count);
            scanf("%d", &num);

            if( num > maior)
                maior=num;

            count++;
        }

        printf("Maior: %d", maior);
}


6. Escreva um programa em C que solicita 10 números ao usuário, através de um laço while, e ao final mostre os dois maiores números digitados pelo usuário.

Os dois primeiros números são armazenados fora do laço while.
Em seguida, é feita uma lógica simples entre esses dois para saber qual vai ser o maior e qual vai ser o segundo maior.

Agora que já temos os números certos nas variáveis 'maior' e 'segundo_maior', vamos ao laço WHILE que vai pedir do número 3 até o número 10.

Após o número ser inserido, ele vai ser armazenado na variável 'num'.
Agora vamos aos testes:
1. Primeiro checamos se 'num' é maior que 'maior', se for, é porque esse número será o novo número maior, e o antigo maior número temos que colocar na variável 'segundo_maior'.
2. Caso não seja maior que 'maior', pode ser que ele seja maior que 'segundo_maior' e fazemos o teste.
Se for, somente o 'segundo_maior' muda de valor.

E se 'num' não for maior que 'maior' nem 'segundo_maior', nenhuma alteração é feita.
Código C:
#include <stdio.h>
 
int main(main)
{
        int maior,
            segundo_maior,
            num,
            count=3;
 
        printf("Digite o numero 1: "); scanf("%d", &maior);
        printf("Digite o numero 2: "); scanf("%d", &num);
 
        if(maior > num)
            segundo_maior = num;
        else
        {
            segundo_maior = maior;
            maior = num;
        }
 
 
        while (count <= 10)
        {
            printf("Digite o numero %d: ", count);
            scanf("%d", &num);
 
            if(num > maior)
            {
                segundo_maior = maior;
                maior = num;
            }
            else
                if(num > segundo_maior)
                    segundo_maior = num;
 
            count++;
        }
 
        printf("Maior: %dn", maior);
        printf("Segundo maior: %dn", segundo_maior);
 
        return 0;
}
 


7. Escreva um programa que lê o tamanho do lado de um quadrado e imprime um quadrado daquele tamanho com asteriscos. Seu programa deve funcionar para quadrados com lados de todos os tamanhos entre 1 e 20.

Por exemplo, para lado igual a 5:
*****
*****
*****
*****
*****


Note que sempre existirão 'lado * lado' asteriscos. Vamos usar o while para imprimir todos os 'lado*lado' asteriscos.
Note também que a cada 'lado' asteriscos, ocorre uma quebra da linha.

No exemplo do lado=5: quando chegamos no asterisco de número 5, não imprimimos somente '*', mas '*\n'
O mesmo para o asterisco de número 10, pro de número 15, ...e pro de número 20
Ou seja, após o asterisco múltiplo de 5 ser impresso na tela, devemos colocar uma quebra da linha.

Como chamamos números que são múltiplos de 'lado'? Ora, pelo módulo (ou resto da divisão).
Código C:
#include <stdio.h>

int main()
{
        int lado,
            count=1;

        printf("Lado do quadrado: ");
        scanf("%d", &lado);

        while( count <= lado*lado)
        {
            if(count % lado == 0)
                printf("*\n");
            else
                printf("*");

            count++;
        }


}


8. Escreva um programa que lê o tamanho do lado de um quadrado e imprime um quadrado daquele tamanho com asteriscos e espaços em branco. Seu programa deve funcionar para quadrados com lados de todos os tamanhos entre 1 e 20.
Para lado igual a 5:
*****
*    *
*    *
*    *
*****

Primeiro vamos imprimir a primeira linha, que tem 'lado' asteriscos com um while.
Fazemos o mesmo para a última linha.

Agora vamos imprimir as linhas que não são completamente preenchidas de asteriscos, as que tem espaços em branco.
Note que essas linhas possuem um asterisco na primeira e na última posição.

Antes nós imprimíamos lado*lado caracteres. Agora, como tiramos duas linhas, vamos imprimir só 'lado*(lado-2)' linhas.

Se o caractere que formos imprimir for o primeiro da fila, imprimimos '*'.
Para sabermos isso, basta fazer um teste para ver se o contador (que vai de 1 até lado*(lado-2)) deixa resto 1 quando dividido por 'lado'.

Se for o último asterisco da linha, devemos imprimir '*\n', pois irá pular de linha.
Para detectar esse último asterisco, basta ver que é o caractere que, quando dividido por 'lado', deixa resto 0.

Se não for o primeiro nem o último caractere, imprimimos um espaço em branco: ' '
Código C:
#include <stdio.h>

int main()
{
        int lado,
            count=1;

        printf("Lado do quadrado: ");
        scanf("%d", &lado);

        //Imprimindo a primeira linha
        while(count<=lado)
        {
            printf("*");
            count++;
        }
        printf("\n");

        count=1;
        while( count <= lado*(lado-2))
        {
            if( (count%lado == 1))
                printf("*");
            else
                if( (count%lado == 0))
                    printf("*\n");
                else
                    printf(" ");

            count++;
        }

        //Imprimindo a primeira linha
        count=1;
        while(count<=lado)
        {
            printf("*");
            count++;
        }
        printf("\n");


}


9. Escreva um programa que pergunta um número ao usuário, e mostra sua tabuada completa (de 1 até 10).

Primeiro pedimos um número ao usuário, e fazemos com que esse número seja multiplicado por 1, por 2, ...até por 10.
Esse número que muda (1, 2, 3, ...,10), será gerado pelo laço while e uma variável de apoio 'count':
Código C:
#include <stdio.h>

int main()
{
        int num,
            count=1;

        printf("Digite um numero: ");
        scanf("%d", &num);

        while(count <= 10)
        {
            printf("%d * %d = %d\n", num, count, num*count);
            count++;
        }
}


10. Se você lembrar bem, quando estudamos as variáveis do tipo caractere, char, dissemos que, na verdade, ela eram representadas por inteiros de 0 até 255.
Mostre a tabela completa do código ASCII.

Basta usarmos o laço while e uma variável de apoio para imprimirmos todos os números, de 0 até 255.
Mas ao invés de mostrar o número com o '%d', vamos usar '%c', pois assim iremos mostrar o caractere correspondente a cada número desses.
Código C:
#include <stdio.h>

int main()
{
        int count=0;

        while(count <= 255)
        {
            printf("%d = %c\n", count, count);
            count++;
        }
}

22 comentários:

Unknown disse...

Olha o meu código pegou de boa e não precisei fazer essa parte:

printf("Digite o numero 1: "); scanf("%d", &maior);
printf("Digite o numero 2: "); scanf("%d", &num);

if(maior > num)
segundo_maior = num;
else
{
segundo_maior = maior;
maior = num;
}


Vou postar meu código aqui,pois não sei se está certo...Então se estiver errado fala ai.

#include
#include

int main()
{
setlocale(LC_ALL,"portuguese");

int maior,
maior2,
num,
i;

maior = 0;
maior2 = 0;

printf("--------- Solicite 10 Números ---------\n\n");

while (i <= 9)
{
printf("Digite o %d numero: ", i);
scanf("%d",&num);
i++;

if(num > maior)
{
maior2 = maior;
maior = num;
}

else
{
if(num > maior2)
{
maior2 = num;
}
}
}

printf("\n\nMaior Número: %d \tSegundo Maior: %d",maior, maior2);
return(0);
}

Anônimo disse...

Tem alguns que podem ser usado com o laço For em vez do While e boa parte dos programadores preferem o For do que o While

Unknown disse...

No exercicio 4 é preciso dar o comando de que apenas as notas acima de 0.0 e abaixo de 10.0 serão aceitas. Onde e como seria colocado esse comando? Obrigado!

Ernandes disse...

Legal, consegui até criar um programa que mostra os números ímpares e pares no intervalo de 2 números definidos pelo usuário... valew pela ajuda.

Lindomar Souza disse...

OLHEM COMO EU RESOLVI O EXERCÍCIO 1 E DEU CERTO (CÓDIGO ABAIXO)

#include

int main()
{
int A = 1;

while(A <= 100)
{
printf("%d\n", A);
A = A + 2;
}
}

The Boss disse...

O exerc 6 nao pode ser assim?

#include

int main(void)
{
int i=1,num, maior=0,posicao,maior1=0;

while (i<= 10)
{
printf("Digite o %d numero: ", i);
scanf("%d",&num);
if (num > maior){
maior1=maior;
maior=num;
posicao =i;
}
i++;
}
printf("O maior num e: %d que estava na %d posicao \n",maior,posicao);
printf("O segundo maior num e: %d ",maior1);
return 0;
}

ignorem a parte da posiçao estava a iventar!

Jhosef disse...

Galera olhem o meu código eu fiz a o exercícios um e dois praticamente juntos:
#include
int main ()
{

int x = 1;

while(x<100){
if (x%2!=0)
printf("%d\n",x);
x++;

}
system("pause");
}

no "if (x%2!=0)" é so mudar o ! para outro igual!!!!

joagostini disse...

Olá
No exercício 6 - pegar 10 números e dizer os dois maiores - a solução dada não contém erro, mas se o usuário puser dois números iguais, ambos correspondentes ao maior valor da serie, o resultado são dois números iguais como sendo o primeiro e segundo maiores. Como disse, isso não é erro, mas considerando que dois números iguais são como um só, apresento a minha solução para o exercício, considerando 2 números iguais coo um só.
#include
#include
#include
#include

int main()
{
setlocale(LC_ALL,"");
int m1,m2,num,a=0,i=0;
char pegaEnter;
while(i<10){
printf("Digite o %dº número: ",++a);
scanf("%d",&num);
pegaEnter=getchar();
if(i==0) m1=num;
if(i==1) m2=num;
{
if(num>m1) {
m2=m1;
m1=num;
}
else {if(num>m2 && num!=m1) {
m2=num;
}
}
++i;}
}

printf("Maior número 1= %d\n",m1);
printf("Maior número 2= %d\n",m2);

return 0;
}

geilson.mecatronica@gmail.com disse...

Cara...eu sinceramente gosto muito desse curso. É tudo tão organizado e bem planejado, que com certeza tem professor de PROGRAMAÇÃO babando pelos cantos da boca. As brincadeiras são simples e discretas, mas o conteúdo é digno de PREMIO. Parabéns.

Unknown disse...

Desafio todos a achar o erro desse programa.

#include

int main()
{
int maior, segundo_maior, num, cont=3;

printf ("\n Digite o 1.numero: ");
scanf ("%d", &maior);


printf ("\n Digite o 2.numero: ");
scanf ("%d", &num);

if (maior > num)

segundo_maior = num;

else
{
segundo_maior = maior;
maior = num;
}

while (cont <= 10)
{
printf ("\n Digite o %d.numero: ", cont);
scanf ("%d", &num);

if (num > maior)
{
segundo_maior = maior;
maior = num;
}
else
if(num > segundo_maior);
segundo_maior = num;

cont++;
}

printf ("\n O maior numero digitado e: %d", maior);
printf ("\n O segundo maior numero digitado e: %d", segundo_maior);

return 0;
}

Anônimo disse...

Na 7 meu codigo ficou bem diferente e eu gostaria de compartilhar aqui. Ao invés de usar o if com o operador de resto eu usei um while dentro de outro e dois contadores. um while fazia a linha de asteriscos e o outro pulava linhas caso a linha do outro estivesse completa zerando o contador do outro while. É dificil de explicar mas vou colocar o codigo aqui :p

#include
int main(void)

{
int lado;
int cont1 = 1;
int cont2 = 1;

printf("Insira o tamanho do lado em unidades de *: ");
scanf("%d",&lado);
printf("\n");

while(cont1 <= lado)
{

while(cont2 <= lado)
{
printf("*");
cont2++;
}

printf("\n");

cont1++;
cont2 = 1;
}
}

Anônimo disse...

a questão 5 só funciona pra números positivos, corrijam isso

Diário de um Hiperativo disse...

3) Crie um algoritmo chamado Estacoes. Este algoritmo deve ler uma data e armazenar na variável mês um número entre 1 e 12, correspondendo a um dos meses do ano. No final, você deve imprimir uma mensagem conforme o exemplo:

"A estação do ano correspondente ao mês 3 é Verão"

Considere a estação prevalente para cada mês:
a) Janeiro (1): Verão
b) Fevereiro (2): Verão
c) Março (3): Verão
d) Abril (4): Outono
e) Maio (5): Outono
f) Junho (6): Outono
g) Julho (7): Inverno
h) Agosto (8): Inverno
i) Setembro (9): Inverno
j) Outubro (10): Primavera
k) Novembro (10): Primavera
l) Dezembro (10): Primavera

Diário de um Hiperativo disse...

3) Crie um algoritmo chamado Estacoes. Este algoritmo deve ler uma data e armazenar na variável mês um número entre 1 e 12, correspondendo a um dos meses do ano. No final, você deve imprimir uma mensagem conforme o exemplo:

"A estação do ano correspondente ao mês 3 é Verão"

Considere a estação prevalente para cada mês:
a) Janeiro (1): Verão
b) Fevereiro (2): Verão
c) Março (3): Verão
d) Abril (4): Outono
e) Maio (5): Outono
f) Junho (6): Outono
g) Julho (7): Inverno
h) Agosto (8): Inverno
i) Setembro (9): Inverno
j) Outubro (10): Primavera
k) Novembro (10): Primavera
l) Dezembro (10): Primavera

Unknown disse...

Blogger thiagowesley.sjc@gmail.com disse...


é so digitar um vírgula que buga o programa .

você teria que colocar


if (exnum == , ){

printf ("virgula não é um numero");

}

Unknown disse...

E ae Czoeiros!
Tem que prestar muita atenção na questão da tabela ASCII. A variável que será incrementada deve ser INT e não CHAR. Por alguma razão (que desconheço), o laço se torna infinito e a zorra toda trava. (Eu cometi a burrice de declarar a variável como char, hihihi, tive de reiniciar o Win). Mas taí, parabéns pro pessoal do Curso C Progressivo! Curso ótimo e grátis!

Anônimo disse...

#include
#include
#include
/*
7. Quadrado de asteriscos
Escreva um programa que lê o tamanho do lado de um quadrado e imprime um quadrado
daquele tamanho com asteriscos. Seu programa deve funcionar para quadrados com
lados de todos os tamanhos entre 1 e 20.
Para lado igual a 5:
*****
*****
*****
*****
*****
*/
int main()
{
int num,cont=0,cont2=0;
setlocale(LC_ALL,"portuguese");
system("color F0");
printf("Digite um número entre 1 e 20:\n\n");
scanf("%d",&num);
printf("\n");
if(num>=1&&num<=20)
{
while(cont
Essa foi um pouco tensa, mas consegui :D

Anônimo disse...

galera to precisando de uma ajuda

escreva um programa em c que pede para o usuario entrar com um numero correspondente a quantidade de nomes que serão definidos (entra 5 e 10) peça para o usuario entrar com os nomes, e coloque os nomes digitados em ordem alfabetica na tela com os numeros de letras que cada nome possui

tentei algumas formas de strcmp,if,else....
não consegui

Ana disse...

Para resolver a questão 5 fiz um programa que funciona com numeros inteiros positivos e negativos!

#include
int main (void)
{
int count=1, x, y;
printf("Qual o maior numero dos 10 numeros?\n");
printf("Digite um numero:\n");
scanf("%d", &x);
while (count<=9)
{
printf("Digite um numero:\n");
scanf("%d", &y);
if(x<=y)
{
x=y;
}
count++;
}
printf("O maior numero eh %d", x);
return 0;
}

Ana disse...

A resolução do exercício 8 tem uma gralha. Quando se pede um quadrado de um lado aparece isto:
*
*
Isto resolve-se se antes do código que imprime a última linha se colocar um if(lado>=2)

Anônimo disse...

#include
#include

int main(){

int i = 1, primeiroMaior = 0, segundoMaior = 0;
int numero, posicao1, posicao2;

while(i <= 10){

printf("Digite o %d numero: ", i);
scanf("%d", &numero);

if(numero > primeiroMaior){
segundoMaior = primeiroMaior;
primeiroMaior = numero;
posicao1 = i;

}else if(numero > segundoMaior)
segundoMaior = numero;
posicao2 = i;

i++;
}

printf("\nPrimeiro maior: %d", primeiroMaior);
printf("\n A posicao do maior numero: %d", posicao1);

printf("\n\nSegundo maior: %d", segundoMaior);
printf("\nposicao do menor numero: %d", posicao2);

return 0;
}

Rikelme disse...

#include
#include

int main(){

int i = 1, primeiroMaior = 0, segundoMaior = 0;
int numero, posicao1, posicao2;

while(i <= 10){

printf("Digite o %d numero: ", i);
scanf("%d", &numero);

if(numero > primeiroMaior){
segundoMaior = primeiroMaior;
primeiroMaior = numero;
posicao1 = i;

}else if(numero > segundoMaior)
segundoMaior = numero;
posicao2 = i;

i++;
}

printf("\nPrimeiro maior: %d", primeiroMaior);
printf("\n A posicao do maior numero: %d", posicao1);

printf("\n\nSegundo maior: %d", segundoMaior);
printf("\nposicao do menor numero: %d", posicao2);

return 0;
}