NosferatuPT Posted December 30, 2009 at 09:22 PM Report Share #303305 Posted December 30, 2009 at 09:22 PM 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 🙂 Link to comment Share on other sites More sharing options...
Baderous Posted December 30, 2009 at 09:39 PM Report Share #303309 Posted December 30, 2009 at 09:39 PM 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. Link to comment Share on other sites More sharing options...
Localhost Posted December 30, 2009 at 09:40 PM Report Share #303310 Posted December 30, 2009 at 09:40 PM 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 Link to comment Share on other sites More sharing options...
NosferatuPT Posted December 30, 2009 at 10:10 PM Author Report Share #303328 Posted December 30, 2009 at 10:10 PM 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... 😛 ) 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 🙂 Link to comment Share on other sites More sharing options...
Localhost Posted December 30, 2009 at 10:26 PM Report Share #303332 Posted December 30, 2009 at 10:26 PM 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 Link to comment Share on other sites More sharing options...
NosferatuPT Posted December 30, 2009 at 10:34 PM Author Report Share #303336 Posted December 30, 2009 at 10:34 PM 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? 🙂 Link to comment Share on other sites More sharing options...
Localhost Posted December 30, 2009 at 10:52 PM Report Share #303338 Posted December 30, 2009 at 10:52 PM 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 Link to comment Share on other sites More sharing options...
Localhost Posted December 30, 2009 at 10:56 PM Report Share #303340 Posted December 30, 2009 at 10:56 PM 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 Link to comment Share on other sites More sharing options...
Localhost Posted December 30, 2009 at 11:13 PM Report Share #303346 Posted December 30, 2009 at 11:13 PM 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 Link to comment Share on other sites More sharing options...
Localhost Posted December 30, 2009 at 11:28 PM Report Share #303350 Posted December 30, 2009 at 11:28 PM 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 Link to comment Share on other sites More sharing options...
NosferatuPT Posted December 30, 2009 at 11:40 PM Author Report Share #303352 Posted December 30, 2009 at 11:40 PM 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 Link to comment Share on other sites More sharing options...
Localhost Posted December 30, 2009 at 11:48 PM Report Share #303356 Posted December 30, 2009 at 11:48 PM Ok, força nisso here since 2009 Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 11:42 AM Report Share #303392 Posted December 31, 2009 at 11:42 AM 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 Link to comment Share on other sites More sharing options...
NosferatuPT Posted December 31, 2009 at 11:46 AM Author Report Share #303393 Posted December 31, 2009 at 11:46 AM 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? 🙂 Link to comment Share on other sites More sharing options...
NosferatuPT Posted December 31, 2009 at 11:47 AM Author Report Share #303394 Posted December 31, 2009 at 11:47 AM 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ê? Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 11:58 AM Report Share #303396 Posted December 31, 2009 at 11:58 AM Não era isso que tu querias? Que ele encerrasse? Ou eu percebi mal? ? here since 2009 Link to comment Share on other sites More sharing options...
NosferatuPT Posted December 31, 2009 at 12:06 PM Author Report Share #303398 Posted December 31, 2009 at 12:06 PM 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 🙂 Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 12:17 PM Report Share #303402 Posted December 31, 2009 at 12:17 PM 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 Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 12:22 PM Report Share #303404 Posted December 31, 2009 at 12:22 PM 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 Link to comment Share on other sites More sharing options...
NosferatuPT Posted December 31, 2009 at 12:34 PM Author Report Share #303408 Posted December 31, 2009 at 12:34 PM 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? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now