Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
AJUDA LINGUAGEM C
#1
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?
[Image: 78367385.jpg]
Reply
#2
epah nao percebo um car***o disso :dots:
Reply
#3
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.
[Image: celeritas_sig.png]
Reply
#4
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);
}
[Image: bottompp9.jpg]
Reply
#5
obrigado a todos, mas agora o problema já vem sobre o ponto 4.
[Image: 78367385.jpg]
Reply
#6
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_Õ
[Image: celeritas_sig.png]
Reply
#7
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
[Image: celeritas_sig.png]
Reply
#8
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:
Team Racing Knowledge

[Image: 400_small_best_promising_s.jpg]

Mac and iPhone Development
FASS Software
Reply
#9
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:
[Image: 78367385.jpg]
Reply
#10
Tás em todas JPC Barbosa.....

Uff....
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)