sou iniciante meu professor ainda não ensinou a usar o "while". [RESOLVIDO]

1. sou iniciante meu professor ainda não ensinou a usar o "while". [RESOLVIDO]

Juliano Güntzel Melo
JulianoMelo

(usa Outra)

Enviado em 07/04/2016 - 17:02h

Na apostila q meu professor enviou tinha o seguinte problema q não consegui resolver ainda.
Faça um programa que solicite ao usuário para digitar valores numéricos inteiros positivos. Encerre a entrada de dados quando for digitado um número negativo ou zero. Calcule a média dos números positivos digitados.
Me ajudem, tentei fazer mais não funcionou.
#include<stdio.h>
#include<conio.h>
main()
{
int a,b,c,d,e;
while(a>0)
{printf(" digite um numero:");
scanf("%d",&a);
b=a;
c=b;
d=c;
e=d+a;
}
{printf(" %d",e);}
getch();
}
Nunca tive programação antes, e tudo q sei até agora foi meu professor q ensinou, as bibliotecas até agora só aprendi a usar essas duas, stdio e a outra conio, e o getch() ele nos ensinou a usar para q o programa espere um comando por tecla antes de sumir o resultado do programa da tela. o main() no inicio do programa, não me lembro pra q serve só sei q foi assim q aprendi, a usar ele sempre no inicio.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/04/2016 - 17:39h

Eu estava escrevendo uma resposta para sua terceira mensagem, mas tive parar para resolver outro assunto, e a discussão avançou. Como algumas das dicas ainda podem ser válidas, coloco-a em destaque abaixo, antes de prosseguir.

Você deveria ligar todas as opções de diagnóstico do compilador. Fazendo isso, ele provavelmente emitiria alertas para você de que você usou uma operação de comparação (operador ==, dois sinais de igual) em contexto em que o resultado acabava sendo descartado. Você provavelmente quis usar o operador de atribuição = (apenas um sinal de igual).

Além disso, você continua cometendo o erro de começar o laço de repetição com um valor indefinido na variável de controle.


Você contornou o problema da variável de controle indefinida, só que o fez de forma torta (definir um valor dummy em vez de pensar num modo de já começar com um valor realista). Infelizmente introduziu o erro de valor indefinido também com a variável soma.

Habilitar sempre todos os alertas do compilador é bom por isso, também. Possivelmente o seu compilador avisaria que você tentou operar com o valor de soma antes de o definir, se as opções de diagnóstico de código perigoso estivessem ligadas.

Note que mesmo que você corrija o valor inicial de soma, seu programa vai imprimir uma média arredondada para baixo. Quando os dois operandos da divisão são inteiros, o resultado da divisão será inteiro, mesmo que o destino da atribuição seja uma variável de ponto flutuante. Ou você transforma o tipo de soma em ponto flutuante, ou explicitamente converte pelo menos um dos operandos da divisão para ponto flutuante (se converter um só, o outro seja convertido automaticamente).

NOTA:
Como terceira opção, você assume que trabalha mesmo com divisão inteira, e fim de papo. Desse modo, seus usuários simplesmente terão de aceitar que a média de 1 e 2 será 1, em vez de 1.5, e a de 4, 4 e 5 será 4, em vez de 4.33333333333....


Seu programa precisa de exatamente três variáveis para funcionar. A variável media é desnecessária, pois você pode calcular a média só na hora de a imprimir.

Eu não sou muito afeito a dar resposta pronta, mas essa resposta já veio, em parte, com as dicas do pherde. Assim sendo, permita-me mostrar a melhor técnica para fazer seu laço de repetição.

int parcela, n_parcelas;
n_parcelas=0;
while(1){
printf("Digite a %dª parcela (0 ou negativo para encerrar): ", n_parcelas+1);
if(scanf("%d", &parcela)!=1 || parcela<=0)
break;
soma+=parcela;
n_parcelas++;
}


NOTA:
Algumas pessoas dirão que essa forma é feia ou que viola os princípio de programação estruturada, sugerindo, em vez disso, a forma abaixo.

int parcela, n_parcelas;
n_parcelas=0;
printf("Digite a 1ª parcela (0 ou negativo para encerrar): ");
while(scanf("%d", &parcela)==1 && parcela>0){
soma+=parcela;
n_parcelas++;
printf("Digite a %dª parcela (0 ou negativo para encerrar): ", n_parcelas+1);
}


Essa forma fica até uma linha mais curta, mas duplica código, e não ganha absolutamente nada em eficiência. De todo modo, ela ainda seria melhor do que o que você fez.


3. Re: white

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/04/2016 - 17:36h

A primeira pergunta é: por que razão o seu tópico tem o título “white” (que significa “branco”)?

Como se calcula uma média? Por acaso não é a divisão entre o valor acumulado das parcelas pelo número de parcelas? Eu não vi você acumular nada nem contar o número de parcelas durante o laço de repetição no seu programa.

Aliás, o laço de repetição está quebrado, também. Você começa comparando a com zero, mas na primeira interação você ainda não sabe quanto vale a, porque não lhe atribuiu ainda valor nenhum. Então você tem pouco mais de 50% de chances de o loop não executar nenhuma vez (considerando que pode haver valores aleatórios na memória e que metade dos possíveis valores inteiros é negativa).

E há outros problemas, ainda, como a declaração de main() que viola o padrão, a falta do "\n" após a impressão do número (antes é que não precisa), e o nefasto uso de <conio.h> e getch().


4. sou iniciante meu professor ainda não ensinou a usar o "while".

Juliano Güntzel Melo
JulianoMelo

(usa Outra)

Enviado em 08/04/2016 - 09:18h

obrigado por me ajudar, realmente eu to bem perdido nesse programa, até agora as coisas q programei foram bem simples, e por isso não sei fazer muita coisa ainda. Mas acho q se eu tiver umas dicas de quem já sabe programar posso conseguir resolver o problema.


5. Re: sou iniciante meu professor ainda não ensinou a usar o "while". [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/04/2016 - 13:37h

Eu já lhe dei as dicas de que você precisa para corrigir seu programa, mas deixe-me colocá-las numa forma mais direta:

- garantir que a variável de controle do loop tem um valor válido antes de ser testada na condição de controle;

- ter uma variável que acumule os valores válidos lidos (dividendo no cálculo da média);

- ter uma variável que conte o número de repetições (divisor no cálculo da média).


E você talvez queira tomar alguns cuidados adicionais:

- se o usuário não entrar nenhum valor válido (por exemplo, digitar zero ou negativo já na primeira iteração do loop), você deveria evitar o cálculo da média (se não o fizer, pode acabar tentando dividir zero por zero, o que pode não ser muito legal);

- pode corrigir a forma de declaração da função main() (o padrão diz que ela deve ser declarada explicitando o tipo de retorno, que é sempre int, e os argumentos que quer receber; assim sendo, ou você diz “int main(void)”, se não quiser argumentos, ou “int main(int argc, char **argv)”, para receber do ambiente de execução uma lista de strings (argv) e o contador de quantos elementos há nessa lista (argc));

- se você quiser que a média dos valores 1 e 2 resulte em 1.5, em vez de 1, não deve trabalhar com divisão inteira (no mínimo, deve converter o acumulador para float ou double na hora da divisão);

- pode suprimir aquele getch() inútil e a referência ao cabeçalho não-padronizado <conio.h>.


6. Média dos números digitados

Juliano Güntzel Melo
JulianoMelo

(usa Outra)

Enviado em 08/04/2016 - 15:30h

Não sei oq ta acontecendo a média da sempre 0.0!
#include<stdio.h>
int main(void)
{
int a,b,c,d,e;
float M;
d=0;
a=1;
e=0;
while(a>0)
{
printf("Digite um numero:"); scanf("%d",&a);
e++;
d==c+a;
c==b+a;
b==0+a;
}
M==d/e;
{
printf("A media dos numeros digitados eh: %.1f",M);}
}


7. Re: sou iniciante meu professor ainda não ensinou a usar o "while". [RESOLVIDO]

Fernando Eckhardt Valle
pherde

(usa Slackware)

Enviado em 08/04/2016 - 15:54h

Cara, teu problema não é C, mas sim lógica! Tem que estudar um pouquinho de lógica! Pense: teu programa deve receber infinitos valores do usuário e tirar a média desses valores, como fazer isso com while?

A lógica básica é essa:
enquanto(a>0){
soma = soma + a;
b++;
}
media = soma/b;



8. Média dos números digitados

Juliano Güntzel Melo
JulianoMelo

(usa Outra)

Enviado em 08/04/2016 - 16:24h

Primeiramente obrigado pela ajuda, acho q ja ta quase bom o programa, só falta dar o resultado certo, eu digitei 1 e depois 2 e 0 pra terminar aí o resultado da média de 1 e 2 foi 47.0 Acho q deu algo errado.
#include<stdio.h>
int main(void)
{
int a,b,soma;
float media;
a=1;
b=0;
while(a>0)
{
printf("Digite um numero:"); scanf("%d",&a);
soma = soma+a;
b++;
}
media = soma/b;
{
printf("A media dos numeros digitados eh: %.1f",media);}
}


9. Re: sou iniciante meu professor ainda não ensinou a usar o "while". [RESOLVIDO]

André Rodrigues
andremuerto

(usa Slackware)

Enviado em 08/04/2016 - 16:39h

inicialize a variável soma. Ela deve estar indo com lixo que está prejudicando a conta.

Coloque antes do while algo como "soma = 0";


10. Re: sou iniciante meu professor ainda não ensinou a usar o "while". [RESOLVIDO]

Fernando Eckhardt Valle
pherde

(usa Slackware)

Enviado em 08/04/2016 - 17:05h

De acordo com sua lógica:

Você digita 0 (zero), o b será incrementado, e ai então o while irá parar. Ou seja, a média está sendo calculada errada pois irá dividir sempre por uma valor '1 a mais' que o correto. Acerte isso.


11. Média dos números digitados

Juliano Güntzel Melo
JulianoMelo

(usa Outra)

Enviado em 08/04/2016 - 17:56h

Tudo certo, obrigado gente funcionando perfeitamente o programa, média de 1 e 2 resultado 1.5
#include<stdio.h>
int main(void)
{
int a,b;
float media,soma;
a=1;
b=-1;
soma=0;
while(a>0)
{
printf("Digite um numero:"); scanf("%d",&a);
soma = soma+a;
b++;
}
media = soma/b;
{
printf("A media dos numeros digitados eh: %.1f",media);}
}


12. Re: sou iniciante meu professor ainda não ensinou a usar o "while". [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/04/2016 - 18:01h

Acima eu já expliquei o porquê. Não adianta mudar o tipo da variável que vai receber o resultado da divisão: enquanto dividendo e divisor continuarem sendo ambos inteiros, a divisão produzirá um resultado inteiro. Você tem de alterar o tipo do resultado, e isso se dá com a alteração de tipo dos operandos.

int int_op1=1, int_op2=2;
double dbl_op1=1.0, dbl_op2=2.0;

double result1, result2, result3, result4, result5, result6, result7;

result1=int_op1/int_op2; // result1==0.0, porque a divisão inteira dá 0, e esse 0 é que é convertido em double.
result2=dbl_op1/dbl_op2; // result2==0.5, porque os dois operandos são double, logo o resultado é double.
result3=int_op1/dlb_op2; // result3==0.5, porque o fato de um dos operandos ser double faz com que o outro,
// que é inteiro, seja convertido implicitamente para double.
result4=dbl_op1/int_op2; // result4==0.5, porque o fato de um dos operandos ser double faz com que o outro,
// que é inteiro, seja convertido implicitamente para double.
result5=(double)int_op1/(double)int_op2; // result5==0.5, porque os dois operandos são double (convertidos),
// logo o resultado é double.
result6=(double)int_op1/int_op2; // result6==0.5, porque o fato de um dos operandos ser double faz com que,
// o outro, que é inteiro, seja convertido implicitamente para double.
result7=int_op1/(double)int_op2; // result7==0.5, porque o fato de um dos operandos ser double faz com que,
// o outro, que é inteiro, seja convertido implicitamente para double.




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts