![]() |
|
AJUDA LINGUAGEM C - Printable Version +- SimRacing Portugal Forum (https://www.simracingportugal.net/forum) +-- Forum: Geral (https://www.simracingportugal.net/forum/forumdisplay.php?fid=5) +--- Forum: Geral (https://www.simracingportugal.net/forum/forumdisplay.php?fid=85) +--- Thread: AJUDA LINGUAGEM C (/showthread.php?tid=2216) Pages:
1
2
|
AJUDA LINGUAGEM C - Alexandre Caetano - 13-11-2007 ora bem... Eu tenho já a base do trabalho. O trabalho é em linguavem C à base de números primos e preciso de ajuda para o resolver. Ora... Eu tenho isto: Array#include <stdio.h> int main (void){ int menu, n, i,p; while (menu !=0){ printf ("1 - Introduza novo numero\n"); printf ("2 - Primo?\n"); printf ("3 - Lista de primos\n"); printf ("4 - Maior primo\n"); printf ("5 - Conta pares de primos gemeos\n"); printf ("0 - Sair\n"); printf ("Opção:"); scanf ("%d",&menu); if (menu==0) printf ("bye bye\n"); if (menu==1){ printf ("Numero: "); scanf ("%d",&n); } if (menu==2){ p=0; for (i=2 ; i<=n ; i++) { if ((n%i)==0) p=p+1; } if (p==2) printf("Numero primo\n"); else printf("Não primo\n"); } /*fim do menu=2*/ if (menu==3){ p=0; for (i=2 ; i<=n ; i++) { if ((n%i)==0) p=p+1; if (p==2){ while (p<n){ printf (" %d \n",p++); }} } } } /*fim do while*/ return 0; }[/quote] Mas quando tenho menu==3 queria que ele me dissesse os nums primos até ao numero que inserirmos no menu==1. Alguém me pode ajudar? AJUDA LINGUAGEM C - Jonny_Bazokaton - 13-11-2007 epah nao percebo um car***o disso :dots: AJUDA LINGUAGEM C - diospiro_verde - 13-11-2007 Só vi meio por alto a tua função, mas pelo que pude observar, a expressão que usas para determinar o "grau de parentesco" do número é esta: Arrayif (menu==2){ p=0; for (i=2 ; i<=n ; i++) { if ((n%i)==0) p=p+1; } if (p==2) printf("Numero primo\n"); else printf("Não primo\n"); } /*fim do menu=2*/[/quote] Se percebi correctamente a pergunta que fizeste, a solução seria aplicar a mesma expressão a todos os números naturais menores ou iguais do que o número que foi introduzido, será que algo deste género resultaria? for(int x=1;x<=n;x++) <- inicializamos a variável x (neste caso foi declarada já dentro do "for", mas depois fazes como preferires ou como foi ensinado nas aulas) que usamos para avaliar se o número verifica as condições. { p=0; <- por cada ciclo fixamos este valor em zero, para verificar quantas vezes o número é divisível por outro menor. for(int i=1;i<=x;i++) { <- na tua função, o valor mínimo de i=2, mas não deveria ser 1? Porque p=2 só se verifica quando o número é divisível por ele próprio e por 1 (ou seja, quando é primo). if((x%i)==0) <- esta expressão, suponho, devolve o resto da divisão inteira e compara o resultado com 0. p++; } if(p==2) printf("%d\n",x); } Há formas mais práticas e rápidas de conseguir o mesmo resultado, mas tudo depende do que foi ensinado nas aulas. Nunca estudei C, por isso espero não te ter induzido em erro. AJUDA LINGUAGEM C - Sandro Costa - 13-11-2007 Epá, eu posso estar a errar mas não tenho maneira de comprovar o que estou a dizer por isso, aqui vai disto. Estes dois bocados de codigo que tens são um pouco estranhos, a meu ver. parece que estás a complicar o não tanto complicado. for (i=2 ; i<=n ; i++) { (isto é um ciclo for, como deves saber. que, pelo que dizes aqui começa em 2 e vai até quando i for <= a n... a minha pergunta é, queres mesmo que comece em 2? não será melhor for (i=0, i<n, i++)?) if ((n%i)==0) (isto compara na 1ª volta do ciclo o teu n com 2... até aqui tudo bem.. se der resto 0 a dividir por 2 já não é primo, logo não precisas de na 2ª volta dividir por 3... não tem mta logica, acho. Mas pronto, eu tb tou um pouco ferrugento nisto e não tenho muito tempo. Experimenta: p=1; While (p<n){ p=p+1; if ((p%2)!=0) print( "%d \n",p); } AJUDA LINGUAGEM C - Alexandre Caetano - 13-11-2007 obrigado a todos, mas agora o problema já vem sobre o ponto 4. AJUDA LINGUAGEM C - diospiro_verde - 13-11-2007 ArrayEpá, eu posso estar a errar mas não tenho maneira de comprovar o que estou a dizer por isso, aqui vai disto. Estes dois bocados de codigo que tens são um pouco estranhos, a meu ver. parece que estás a complicar o não tanto complicado. for (i=2 ; i<=n ; i++) { (isto é um ciclo for, como deves saber. que, pelo que dizes aqui começa em 2 e vai até quando i for <= a n... a minha pergunta é, queres mesmo que comece em 2? não será melhor for (i=0, i<n, i++)?) if ((n%i)==0) (isto compara na 1ª volta do ciclo o teu n com 2... até aqui tudo bem.. se der resto 0 a dividir por 2 já não é primo, logo não precisas de na 2ª volta dividir por 3... não tem mta logica, acho. Mas pronto, eu tb tou um pouco ferrugento nisto e não tenho muito tempo. Experimenta: p=0; While (p<n){ p=p+1; if ((p%2)==0) print( "%d \n",p); }[/quote] Há várias formas de fazer isto, mas parece-me que a ideia do Alexandre é obter o resto da divisão inteira de n por todos os números naturais iguais ou menores que esse para assim verificar se o número é primo, algo que só acontece quando p=2 (quando o número é divisível apenas por si próprio e por 1), já que a variável p é incrementada sempre que a divisão dá resto zero. Pareceu-me que faz sentido o valor mínimo de i ser 1, já que a divisão por zero é irrelevante e, dentro desta lógica, é necessário dividir o número por ele próprio para obter o valor correcto de p, assim o ciclo não poderia cessar antes de n. o_Õ AJUDA LINGUAGEM C - diospiro_verde - 13-11-2007 Arrayobrigado a todos, mas agora o problema já vem sobre o ponto 4.[/quote] Ora, no ponto quatro vai testando os números todos de n até 1, já que vamos testando os números por ordem descrescente, o primeiro que for primo, será o maior. :D AJUDA LINGUAGEM C - Félix Simões - 14-11-2007 A minha proposta já com o ponto 4 implementado: Array#include <stdio.h> #include <math.h> int num_primo( int num ) { int n; num = abs( num ); if( num == 0 ) { return 0; } if( num == 1 ) { return 1; } for ( n=2; n<num; n++ ) { if( (num % n) == 0 ) return 0; // não é número primo } return 1; // é número primo } int main( void ) { // regra de ouro: inicializar sempre as variáveis // é preferível declarar cada variável na sua linha // evita erros e facilita a manutenção int menu = -1; int num = 0; int num_tmp = 0; while( menu != 0 ) { printf ("\n1 - Introduza novo numero\n"); printf ("2 - Primo?\n"); printf ("3 - Lista de primos\n"); printf ("4 - Maior primo\n"); printf ("5 - Conta pares de primos gemeos\n"); printf ("0 - Sair\n"); printf ("Opção:"); scanf ("%d",&menu); if( menu == 0 ) { printf( "bye, bye!\n\n" ); return 0; } if( menu == 1 ) { printf( "\nNumero?: " ); scanf("%d", &num); } if( menu == 2 ) { if( num_primo( num ) ) printf( "Número %d é primo!", num ); else printf( "Número %d não é primo!", num ); } if( menu == 3 ) { if( abs(num) > 0 ) { printf( "\n\nListagem de números primos de 1 a %d.", num ); printf( "\n" ); for( num_tmp = 1; num_tmp <= num; num_tmp++ ) { if( num_primo( num_tmp ) ) printf( "%d\n", num_tmp ); } } else printf( "\n\nO número tem que ser maior que 0." ); } if( menu == 4 ) { if( abs( num ) > 0 ) { for( num_tmp = num; num_tmp > 0; num_tmp-- ) { if( num_primo( num_tmp ) ) { printf( "O maior número primo de 1 a %d é %d.", num, num_tmp ); break; } } } else printf( "\n\nO número tem que ser maior que 0." ); } } }[/quote] Espero que ajude... :blink1: AJUDA LINGUAGEM C - Alexandre Caetano - 14-11-2007 Obrigado a todos, mas o trabalho já está concluido e entregue. Um obrigado especial ao JPC Barbosa que "praticamente" me fez o trabalho todo.:lol: AJUDA LINGUAGEM C - Miguel Madureira - 14-11-2007 Tás em todas JPC Barbosa..... Uff.... |