Ir ao conteúdo
  • Cadastre-se

C - Duvida sobre laco de repeticao while


Stroligo

Posts recomendados

Ola!

Bom dia, boa tarde e boa noite.  :D

 

Eu estou iniciando meu aprendizado e estou seguindo uma apostila sobre logica de programacao. Atualmente estou na parte de lacos de repeticao while e do/while e estou com uma duvida. 

Cheguei num exercicio onde insiro dois valores numericos (int ou float) e realizo a media aritmetica, então eu preciso criar um while que pare de repetir assim que eu entrar com um dado diferente de um valor numerico (%d ou %f), então tentei da seguinte forma:

 

while ((nota 1 = %f) || (nota2 = %f) || (nota1 = %d) || (nota2 = %d)) {....}

obs: as variaveis foram declaradas em formato float.

 

Constatei que nao funcionava, e tentei de outra forma:

 

while ((nota1 >= 0) || (nota2 >= 0) || (nota1 <= 0) || (nota1 <= 0) || (nota1 = 0) || (nota2 = 0)) {....}

 

A principio, o programa compilou direitinho e rodou, e eu inseria os valores (notas) so que na hora que eu precisava finalizar o while para terminar de calcular as medias e prosseguir com o programa veio o problema, qualquer valor %c que eu entrava ele bugava e repetia a frase do printf milhares de vezes ate eu fechar o programa. Eu ate tentei entrar com um if com as mesmas expressoes do while e caso acontecesse eu dava um comando (return0), e dessa vez eu colocava duas notas e o programa terminava sem executar o laco de repeticao.

 

Se alguem puder me ajudar, ficaria extremamente grato.

abraços!

Link para o comentário
Compartilhar em outros sites

1) Você está usando "%f" e "%d", que não são variáveis, mas sim, máscaras de formatação para definição de tipos em linguagem C.

Por exemplo:

int numero;scanf("%d", &numero); // Função que faz leitura da interface de entrada (teclado), tratando o conteúdo lido como sendo do tipo inteiro ("%d") e armazenando na variável "numero".

Perceba os 3 pontos que precisam estar condizentes, ou seja, terem como base o mesmo tipo:

  - O valor informado pelo usuário,

  - A máscara de formatação,

  - O tipo da variável.

 

Logo, para fazer comparações, é necessário, no mínimo, dois valores (conteúdos).

Esse conteúdo pode ser através de uma variável ou definido diretamente no código (valor estático).

Pode exemplo:

while( numero != 0 );

Utilizei o valor contido na variável que recebeu o valor definido pelo usuário (exemplo anterior) e comparei com um valor estático (zero). Novamente, mantendo a mesma base de comparação, que neste caso é o tipo inteiro.

 

O tipo "float":

A linguagem C permitide que o valor recebido seja um inteiro e armazenado diretamente numa variável "float", porém, a forma como será armazenada na variável (que não visível ao programador, de maneira direta), será diferente.

O contrário (converter de "float" para inteiro), daí a coisa complica um pouco. Não entrarei na explicação nesse momento, para não confundir.

Exemplo sobre a explicação do "float":

Valor digitado pelo usuário: 2 (número inteiro) Formato do valor armazenado numa variável do tipo inteiro: 2Formato do valor armazenado numa variável do tipo "float": 2.0

Em matemática, o "ponto zero" não faz diferença, mas na programação, sim.

 

2) Sinal de atribuição e comparação.

Exemplo:

valor2 = valor1; // Atribui (mesmo que copiar) conteúdo da variável "valor1" em "valor2" if ( valor2 == valor1 ); // Faz a comparação entre as variáveis e retorna o resultado dessa comparação (VERDADEIRO se forem iguais, caso contrário, FALSO)if ( valor2 != valor1 ); // É a inversão da comparação anterior (FALSO se forem iguais, caso contrário, VERDADEIRO) if ( valor2 >= valor1 ); // Compara se "valor2" é maior ou igual a "valor1"if ( ( valor2 > valor1 ) || ( valor2 == valor1 ) ); // Tem o mesmo resultado que a comparação anterior, porém, feito de uma maneira diferente.

OBS: As explicações acima é para programação em nível inicial.

 

Espero que ajude.

 

Att

Link para o comentário
Compartilhar em outros sites

Sim, obrigado pela resposta, me esclareceu algumas coisas mas acho que nao ficou claro a minha duvida. No primeiro caso (quando utilizei o %d no lugar da variavel) ja imaginei que daria errado por esse motivo, mas nao custava tentar. 

O segundo caso deu parcialmente certo, no entanto deu o erro que deu. voce explicou muito bem o porque do erro, das comparacoes e tal, mas minha duvida e:

Como fazer essa comparacao, onde uma variavel que e declarada como int/float e recebe um valor char?

No caso eu queria que o programa terminasse ao receber uma letra em vez de numero.

Por isso fiz o while que funcionaria enquanto o valor recebido estivesse entre qualquer valor numerico ( (num>=0) || (num<0) )

Espero que minha duvida esteja clara agora

 

Vou deixar o codigo aqui pro caso de nao ter ficado claro, com o codigo provavelmente vai entender a logica que to usando e o proposito disso:

#include <stdio.h>#include <stdlib.h>#include <math.h>int main (){    float nota1, nota2,media;    int apv=0,rpv=0;        while ((nota1 >= 0) || (nota2 >= 0) || (nota1 <= 0) || (nota2 <= 0) || (nota1 = 0) || (nota2 = 0)) {            printf("Insira as duas notas ...: ");            scanf(" %f %f", &nota1, &nota2);            media = (nota1+nota2)/2;            if (media < 60) {                printf("REPROVADO\n\n\n");                rpv++;            }            else {                printf("APROVADO\n\n\n");                apv++;            }        }        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n..........DADOS COLETADOS.......... ");        printf("\n\nAprovados .......: %d",apv);        printf("\nReprovados ......: %d\n\n", rpv);        printf("................FIM................\n\n");        return(0);}
Link para o comentário
Compartilhar em outros sites

1) No seu "if()" tem: "(nota1 = 0) || (nota2 = 0)"

Isso é atribuição de valor (comentário 2 em meu post anterior).

É isso mesmo o que quer neste "if()"?

 

2) Também no "if()", a comparação que está sendo feita:

(nota1 >= 0) OU (nota1 <= 0) OU (nota1 == 0) // Retorna sempre verdadeiro

(nota2 >= 0) OU (nota2 <= 0) OU (nota2 == 0) // Retorna sempre verdadeiro

 

3) Não é necessário utilizar a lib "math.h" para operações simples.

 

No mais, seu código está correto..

 

Validar se o conteúdo lido é realmente um inteiro, é preciso armazenar em char e depois validar com a tabela ASCII.

Em C, todo valor char, internamente é um inteiro.

Por exemplo:



char letra = '2';
 
printf("valor char: %c\nvalor inteiro: %d\n", letra, letra);


Saída:



valor char: 2
valor inteiro: 50


 

Os valores numéricos em "char", vai do valor decimal 48 a 57.

 

Conversão de "char" para "float", o princípio é o mesmo, apenas atentando para onde está a vírgula e poder fazer a separação das casas na hora da conversão.

Link para o comentário
Compartilhar em outros sites

Caro amigo, acho que não sou um expert como o colega que postou esse monte de dicas antes mas acho que se você colocar aquilo que você quer que o usuário leia e aquilo que o programa vai ler(printf e scanf do que você quer colocar), antes do laço de repetição, acho que o seu loop vai parar. Lembrando que o laço "while" testa a condição antes de iniciar o laço, diferente do laço "do while" que testa a condição depois da passagem pelo laço, fazendo com que a condição seja testada pelo menos uma vez.

int main (){float nota1, nota2,media;int apv=0,rpv=0;/*Aqui neste trecho do código, coloque as instruções printf e scanf da mesma forma que estão escritas abaixo do laço while.*/printf("Insira as duas notas ...: ");scanf(" %f %f", &nota1, &nota2);while ((nota1 >= 0) || (nota2 >= 0) || (nota1 <= 0) || (nota2 <= 0) || (nota1 = 0) || (nota2 = 0)) {printf("Insira as duas notas ...: ");scanf(" %f %f", &nota1, &nota2);media = (nota1+nota2)/2;

Mas se o seu programa é para soma de médias das notas, acho que não existiriam notas negativas... 

Ou para facilitar coloque uma instrução de parada para o usuário pedindo para que ele digite x quando desejar encerrar... 

Espero que isso acabe com o loop que está dando...

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...