Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

NosferatuPT

Dúvida: Parar uma sequencia quando os 2 ultimos numeros se repetirem

Mensagens Recomendadas

NosferatuPT

Olá a todos =)

O programa que tenho para fazer é:

"Escreva um programa que leia uma sequência de números inteiros terminada por dois números consecutivos iguais. O programa escreve, então, a média dos números da sequência."

Eu presumo que tenho de fazer algo do género: while(num != qualquer coisa) scanf("%d",&num). Certo?

Agora.. não consigo achar o qualquer coisa.

Como é que consigo fazer com que ele pare se os números se repetirem?

Não quero que me digam o código.. apenas expliquem =P

Obrigado :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Tens de, a cada leitura, ter o último valor lido guardado, para poderes compara-lo com o valor da leitura e determinar se os 2 valores são iguais. Se forem, páras a leitura, senão, actualizas o tal valor guardado com o valor que leste e prossegues.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Bem aí como no loop menciona a variável que vai receber os números podes meter uma flag, ou seja, se o usuário digitar algum número "especial" tu encerras o loop, do género:

int num;
while(num != -99){
  scanf("%d", &num);
}

Para comparares os números fazes:

int num1,num2;
while(num1 != num2){
   scanf("%d %d", &num1, &num2);
}

EDIT: Talvez seja melhor um do while, porque senão ele vai ver logo na primeira vez se são iguais.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Tens de, a cada leitura, ter o último valor lido guardado, para poderes compara-lo com o valor da leitura e determinar se os 2 valores são iguais. Se forem, páras a leitura, senão, actualizas o tal valor guardado com o valor que leste e prossegues.

Obrigado Baderous! Ficou percebido. Mas a minha experiência ainda não me deixa transmitir isso automaticamente para código :)

Bem aí como no loop menciona a variável que vai receber os números podes meter uma flag, ou seja, se o usuário digitar algum número "especial" tu encerras o loop, do género:

int num;
while(num != -99){
  scanf("%d", &num);
}

Mas eu aqui não quero um numero "especial".. quero 2 números iguais xD (Se calhar até deste uma grande ajuda mas não estou a perceber... :P )

Para comparares os números fazes:

int num1,num2;
while(num1 != num2){
   scanf("%d %d", &num1, &num2);
}

EDIT: Talvez seja melhor um do while, porque senão ele vai ver logo na primeira vez se são iguais.

#include<stdio.h>
main()
{
      int num,soma;
      float media;
      
      printf("Introduza um numero inteiro: ");
      scanf("%d",&num);
      
      do
        { scanf("%d",&num);
        }
        while (num != num);
        
    soma = num;
    media = num/2;
    
    printf("A media e: %f\n",media);
    
    system("pause");
}

Até tenho vergonha de o mostrar... porque eu sei que as partes finais não fazem muito sentido... xD

Agradecia mais uma ajudinha please :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Esse código está errado. Uma variável só comporta um numero de cada vez. Ao meteres um novo valor em num o antigo desaparece. Se souberes o que são vectores faz o seguinte, vai preenchendo o vector com a soma dos dois valores (cada soma em cada posição) no final fazes o mesmo para fazeres a média das somas.

EDIT: Se quiseres um código para te ajudar a perceber melhor eu ponho aqui,,.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Esse código está errado. Uma variável só comporta um numero de cada vez. Ao meteres um novo valor em num o antigo desaparece. Se souberes o que são vectores faz o seguinte, vai preenchendo o vector com a soma dos dois valores (cada soma em cada posição) no final fazes o mesmo para fazeres a média das somas.

EDIT: Se quiseres um código para te ajudar a perceber melhor eu ponho aqui,,.

Pois.. com vectores ficava mais fácil. Mas este exercício está na parte dos ciclos.. depois dos ciclos vêm funções e só depos vectores :)

Será que consegues fazer-me o do..while, pf? :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Bem acho que este código (que ainda não está completo) é o que precisas. Agora tenta descobrir como é que vais comparar os valores, não quero dizer tudo senão não vais aprender.

#include <stdio.h>

int main(void){
int num1=0, num2=1,soma=0,i=0;
while(num1 != num2){
	printf("num1: ");
	scanf("%d", &num1);
	soma = num1 + soma;
	i++;
}
int media= soma/i;
printf("%d\n", media);
return (0);
}

p.s. Se estiveres com dúvidas diz


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Atenção que nesse caso o código não está correcto, falta aí um pequeno passo que quero que tu descubras, esse código que eu pûs vai perguntar pelo número para sempre.

Edit: Tenta perceber porque é que o teu code está mal. O que ele estava a fazer era a dividir o último número que puseste por dois.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Mais uma atenção para te ajudar, não te limites a olhar para o meu código, modifica-o e experimenta, não penses que a estrutura do meu código está correcta, tens de aplicar às tuas necessidades.

Edit: Para o exercício era metade da dificuldade se fosse trabalhado com arrays porque dava para comparar melhor os valores, fazer a média, resumindo, era mais fácil.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Só por curiosidade, está aqui a solução com arrays, fiz da maneira mais simples que pude para perceberes. Claro que se meteres mais de 100 valores pára mas é só para perceberes como é mais fácil fazer com arrays:

#include <stdio.h>

int main(void){
int array[100];
int i=0,soma=0,cont=0;
for(i=0; i<100; i++){
	printf("Numero: ");
	scanf("%d", &array[i]);
	soma = soma + array[i];
	cont++;
	if(array[i] == array[i-1]) break;
}
int media = soma / cont;
printf("%d\n", media);
return (0);
}

O code anterior é muito mau mas é só para perceberes, ele é mau porque quando chegas a 100 valores pára.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Mais uma atenção para te ajudar, não te limites a olhar para o meu código, modifica-o e experimenta, não penses que a estrutura do meu código está correcta, tens de aplicar às tuas necessidades.

Edit: Para o exercício era metade da dificuldade se fosse trabalhado com arrays porque dava para comparar melhor os valores, fazer a média, resumindo, era mais fácil.

Localhost, muito obrigado.

Eu agora já não posso estar mais aqui a trabalhar, mas amanhã já dou uma vista de olhos e tenho a certeza que vou descobrir :)

Isto até é giro... mas com muito treino é que parece fácil =P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Olá, vou-te deixar aqui a solução do teu problema, eu fiz aquilo do array com aquela solução porque pensei que era mais fácil, se fosse um problema assim para mim eu não utilizava mas pensei que era mais fácil de compreender para ti além de ser uma solução ineficiente.

Solução:

#include <stdio.h>

int main(void){
int num1=0,num2=0,soma=0,i=0; //é sempre uma boa ideia inicializar as variáveis.
do{
	num2 = num1; //aqui está o segredo, a ordem das coisas
	printf("Numero que quer: "); 
	scanf("%d", &num1);
	soma += num1; // abreviatura para soma = soma + num1
	i++; // variável que vai conter o número por que se vai dividir
}while(num1 != num2);
printf("A media dá: %d\n", soma/i);//escusas de ter a variável média
return 0;
}

Edit: Como vês não utilizei o loop while, porque é impossivel (parece-me) neste caso, eu tinha feito de proposito ontem para te pôr a pensar porque se pusesse um do while tu ias testar pôr a atribuição em vários lugares até te dar certo, por isso, experimenta sempre muitas maneiras, nao te limites nunca a apenas uma estruturação de código e quando já tens o código feito tenta melhorá-lo!


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Já consegui perceber +- o que escreves-te e saí-me com isto:

#include <stdio.h>

int main(void){
    
    int num,i=0,soma=0,media=0;
    
    do
        {  printf("Introduza um numero: ");
           scanf("%d",&num);
           soma = soma + num1;
           i++;
        }
    while(num != (i-1)); 

        
        media = soma/i;
        
        printf("A media e:%d\n",media);
        
        return(0);
}

Isto não dá bem porque ele não pára quando eu repito os números.

Eu pensei assim: "Eu quero que ele pergunte sempre ao utilizador por um número enquanto esse número não for repetido logo a seguir. O i é o que me parece que vai controlar isto... certo? Mas é que o i vai contar apenas o número d vezes que faço a operação, correcto? E eu queria saber ler, por exemplo, quando o i fosse igual a 4 (4ª vez que repete o ciclo) o número que o utilizador colocou nessa altura. Para depois poder comparar com o i anterior (o i-1) para saber se os números seriam iguais.

Faço-me entender?  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Olá, vou-te deixar aqui a solução do teu problema, eu fiz aquilo do array com aquela solução porque pensei que era mais fácil, se fosse um problema assim para mim eu não utilizava mas pensei que era mais fácil de compreender para ti além de ser uma solução ineficiente.

Solução:

#include <stdio.h>

int main(void){
int num1=0,num2=0,soma=0,i=0; //é sempre uma boa ideia inicializar as variáveis.
do{
	num2 = num1; //aqui está o segredo, a ordem das coisas
	printf("Numero que quer: "); 
	scanf("%d", &num1);
	soma += num1; // abreviatura para soma = soma + num1
	i++; // variável que vai conter o número por que se vai dividir
}while(num1 != num2);
printf("A media dá: %d\n", soma/i);//escusas de ter a variável média
return 0;
}

Edit: Como vês não utilizei o loop while, porque é impossivel (parece-me) neste caso, eu tinha feito de proposito ontem para te pôr a pensar porque se pusesse um do while tu ias testar pôr a atribuição em vários lugares até te dar certo, por isso, experimenta sempre muitas maneiras, nao te limites nunca a apenas uma estruturação de código e quando já tens o código feito tenta melhorá-lo!

Envia-mos uma mensagem ao mesmo tempo  :)

Beeem... eu não percebi ainda o num2. Então não vai ser sempre igual ao num1?...

EDIT: Quando eu corro o programa, depois de o compilar, ele encerra quando os números inseridos são repetidos... porquê?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Não era isso que tu querias? Que ele encerrasse? Ou eu percebi mal?  😲

O objectivo é apresentar o valor da média. E ele, mal acabo de repetir o mesmo número, vai abaixo :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

LOL, isso aí é porque eu estou em Linux, tu como estás em Windows tens de acrescentar o system("pause"); no final do programa (antes do return (0)) para ele esperar.

Estás a confundir tudo! Tens de perceber que tu não podes guardar dois valores numa variável, já te tinha dito isso no teu outro code e agora tu mudaste a variável em que fizeste isso, vou tentar explicar. Tu dizes no teu programa que enquanto o (i-1) for diferente do num, ora bem o que tu estás a dizer na verdade não é que queres comparar o número anterior digitado pelo usuário mas sim o número de vezes em que ele vai -1 ou seja, se ele for no número 1 o que tu dizes é se o num for igual a 0 termina o programa eis que 1-1 = 0, a tua confusão é não estares a perceber que não podes guardar dois números numa variável apenas! Por isso é que eu utilizei arrays para perceberes melhor mas parece que só te confundi.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tens várias coisas mal no teu programa. Primeiro a variável num1 nunca foi declarada (acho que é uma confusão com a num):

soma = soma + num1;
e depois é aquela coisa do i que te expliquei aí no post anterior.

Tu vais sempre de precisar de uma variável que guarde o numero anterior daí o meu num2 e eles não vão ser sempre iguais porque eu faço a atribuição no inicio do loop ou seja, depois ele vai pedir ao usuário um número, se o número for diferente ele continua, se for igual pára, tenta fazer o seguinte, lê em voz alta o que achas que vai acontecer na primeira vez que ele entrar no loop, e lembra-te que no do while ele só verifica depois de fazer o que tem de fazer.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Tens várias coisas mal no teu programa. Primeiro a variável num1 nunca foi declarada (acho que é uma confusão com a num): e depois é aquela coisa do i que te expliquei aí no post anterior.

Tu vais sempre de precisar de uma variável que guarde o numero anterior daí o meu num2 e eles não vão ser sempre iguais porque eu faço a atribuição no inicio do loop ou seja, depois ele vai pedir ao usuário um número, se o número for diferente ele continua, se for igual pára, tenta fazer o seguinte, lê em voz alta o que achas que vai acontecer na primeira vez que ele entrar no loop, e lembra-te que no do while ele só verifica depois de fazer o que tem de fazer.

Bem, acho que já percebi tudinho :)

Muito obrigado!

É suposto eu trabalhar em linux também... mas não me está a apetecer. Estou a utilizar o dev-c++. O system ("pause") não se deve utilizar :) Mas realmente com ele funciona.. mas porque é que com getchar(); no fim não funciona?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tem de ser o getch penso eu mas isso está na biblioteca conio.h o que não faz parte do Ansi-C, aconselho-te mesmo a usares o system("pause"); Já agora, que vi que gostas de pensar, faz o seguinte programa. Pede ao usuário uma string e depois vira-a ao contrário. Se tiveres dúvidas avisa, não vale batota  :)

Exemplo: Input: hello; Output: olleh


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NosferatuPT

Ah, desculpa esqueci-me se ainda não trabalhas com strings nao vais saber fazer isto  :bored:

Uii... obrigado :)

hihi... poizé.. ainda não. Isso é a seguir aos vectores. Mas quando o souber fazer, faço :) Agora estou a estudar funções e ainda hoje passo para os vectores :P

(já os demos +- nas aulas mas eu ainda estava a estudar a matéria para trás... gosto de demorar-me mais um bocadinho... o raio do Bolonha é que tem de estar sempre contra mim xD...gost de me por a andar depressa )

Muito obrigado mais uma vez =)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Ah, e quanto ao system("pause"), se te disseram que não podias usar só foi pelo facto da compatibilidade com Linux acho eu mas existe uma cena que eu já não me lembro como é mas que vou procurar que é com macros que verifica se o SO é windows ou Linux e que muda consoante o SO.

Eu vou procurar e depois meto aqui.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.