Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Augusto Stroligo

C - laco de repeticao while

Recommended Posts

Ola!

Bom dia, boa tarde e boa noite. biggrin.png

 

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, ainda nao aprendi vetores e matrizes (a proxima aula) 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!

Compartilhar este post


Link para o post
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: 2
Formato 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

Compartilhar este post


Link para o post
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);
}

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha eu não sou bem um expert na verdade so sei ate onde você esta(estruturas de reptição)mas acho que o programa deveria ser assim:

#include <stdio.h>

int main ()
{
float nota1, nota2,media;
int apv=0,rpv=0;

while ((nota1 > 0) || (nota2 >0))
        {
printf("Insira as duas notas (0 e 0 p/ finalizar)...: ");
scanf(" %f %f", &nota1, &nota2);
media = (nota1+nota2)/2;

if (media == 0)
{
    break;
}
else if (media < 60.0)
            {
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);
} 

a unica coisa que eu fiz foi mudar a codição while,para uma um pouco melhor,adicionei o if"break;" que serve para finalizar o laço quando o usuario digitar "0 e 0";não sei pq,se você digitar o float com "," ele ira fazer o loço infinito com todas as afirmações mas se for com "." ele rodara normalmente;assim 20,0 35,0 daram erro mas 20.0 35.0 iram funcionar,ainda sou novato como você por isso não sei a causa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No padrão americano, utilizam o ponto como separador de campo inteiro e fracionário.

E também é o mais comum vir como padrão em nossas linguagens de programação.

 

Para modificar isso:

 

#include <locale.h>
 
int main(void)
{
    setlocale(LC_ALL, "");
 
(...) // Seu programa
 

Essa chamada acima, fará que com o idioma padrão seja o mesmo do sistema operacional.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.