• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nakuro

[C] Ajuda: Problemas no código (Resolvido)

12 mensagens neste tópico

Boas

Estou com um problema com este exercício:

Faça um programa que preencha cada posição de um vector (10 números inteiros), com 10 números introduzidos pelo utilizador, depois devera perguntar ao utilizador de deseja visualizar números primos ou não primos utilizando para isso a letras p e n respectivamente.O programa deverá então mostrar os números primos ou não primos conforme a opção dos utilizador.

Já estive a fazer o código, só que depois de introduzir os 10 números ele da erro e fecha:

#include <stdio.h>

int main()
{

int array[10], array2[10], array3[10], i,j, h, t, calc;
char esc;

calc=1;
t=0;
h=0;

for (i=0; i<=9;i++)
{
    printf ("introduza os numeros");
    scanf ("%d", &array[ i ]);

}


for (i=0; i<=9;i++)
{


    for ((j=array[ i ]);j--,calc!=0;)
    {
    calc=array[ i ]%j;
    }

    j=j+1;

    if (j==1)
    {

     array2[ t ]=array[ i ];
     t=t+1;
     }
     else
     {
     array3 [ h ]=array[ i ];
     h=h+1;
     }

     calc=1;

     }

printf ("para visualizar os numeros primos pressione P , e os nao primos pressione N");
scanf ("%c", &esc);
fflush (stdin);

if (esc=='p')
{
  for (i=0; i<t; i++)
  {
  printf ("os numeros primos são:%d\n", array2[ i ]);
  }
  }
  else
  {
   for (j=0;j<h;j++)
   {
   printf ("os numeros nao primos sao%d\n", array3[ j ]);
   }
   }

      system("PAUSE");

      return 0;

}

Agradecia uma ajuda :P

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem-vindo ao fórum nakuro! :P

Antes de mais nada tenta usar o GeSHi (Uma ComboBox que tens nos menus em acima, seleccionas a linguagem e colocas o código entre as tags) para colocar o código. Fica mais legível. :P

Quanto ao teu problema, não sei que é isso no 2º ciclo for

Tens outro for lá dentro mas podias testar se é Primo ou não através de uma condição if .

Eu refiro-me mais a esta condição:

for ((j=array[ i ]);j--,calc!=0;)

Acho que está um pouco confusa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include <stdio.h>

int main()
{

int array[10], array2[10], array3[10], i,j, h, t, calc;
char esc;

calc=1;
t=0;
h=0;


for (i=0; i<=9;i++)
{
    printf ("introduza os numeros");
    scanf ("%d", &array[ i ]);

}


for (i=0; i<=9;i++)
{
    if (array[ i ]!=1)
    {

    for ((j=array[ i ]);j--,calc!=0;)
    {
    calc=array[ i ]%j;
    }

    j=j+1;

    if (j==1)
    {

     array2[ t ]=array[ i ];
     t=t+1;
     }
     else
     {
     array3[ h ]=array[ i ];
     h=h+1;
     }

     calc=1;
        }
     }

printf ("para visualizar os numeros primos pressione P , e os nao primos pressione N");
fflush (stdin);
scanf ("%c", &esc);
fflush (stdin);

if (esc=='p')
{
  printf ("os numeros primos sao:");
  for (i=0; i<t; i++)
  {
  printf ("%d\n", array2[ i ]);
  }
  }
  else
  {
  printf ("os numeros nao primos sao:");
   for (j=0;j<h;j++)
   {
   printf ("%d\n", array3 [ j ]);
   }
   }



      system("PAUSE");
      return 0;
}

Já entendi o erro no programa, quando no preenchimento dos vectores ele ler o valor 1 crasha, tentei incluir um if no pricipio mas não resultou.

quanto ao:

for ((j=array[ i ]);j--,calc!=0;)

ta uma bocado confuso LoL, o j vai tomar o vlor da posiçõ do array, depois decrementa 1 valor a esse valor e faz a condição e o calculo.

Tou a calcular se é numero primo de uma maneira esquisita, ainda sou novo nisto :nono1:, é assim:

tenho o numero 5 ppor exemplo:

e o programa vai fazer:

5%4

5%3

5%2

5%1  se nesta a verificação for 0 então o valor do decremento é 1, que quer dizer que ele só foi divisel por 1 ao longo do programa...um bocado confuso ate pa mim :P

offtopic:uma curiosidade

Já agora hipnoted tu andas na estgf ?

eu ando lá :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

offtopic:uma curiosidade

Já agora hipnoted tu andas na estgf ?

eu ando lá :P

Eh eh ...

Yap, ando na ESTGF. :P Mas como soubeste?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

/*NOT TESTED*/

int primo(int k) {
  int i;
  char found=0;
  for (i=2;i<=k*k;i++) {
    if ((k%i)==0) {
      found=1;
      break;
    }
  }
  return (found==1)?1:0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

/*NOT TESTED*/

int primo(int k) {
  int i;
  char found=0;
  for (i=2;i<=k*k;i++) {
    if ((k%i)==0) {
      found=1;
      break;
    }
  }
  return (found==1)?1:0;
}

Não me parece muito bom para aprendizagem o uso de break´s.

Normalmente quem se está a iniciar em C e algoritmia deve evitar esse tipo de código. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

/*NOT TESTED*/

int primo(int k) {
  int i;
  char found=0;
  for (i=2;i<=k*k;i++) {
    if ((k%i)==0) {
      found=1;
      break;
    }
  }
  return (found==1)?1:0;
}

concordo com o Hipnoted, ainda para mais quando tens a variável 'found' que permite saber quando deves parar o cilco.

outro pormenor, não devia ser 'i<=sqrt(k)' em vez de 'i<=k*k'?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu ainda não tou muito familiarizado com algumas maneiras de fazer o codigo, ainda tou nos principios :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu ainda não tou muito familiarizado com algumas maneiras de fazer o codigo, ainda tou nos principios :P

É por isso mesmo que eu disse aquilo.

Se o teu professor vir um break no meio dum for corta de cima a baixo.

Warrior, não tomes isto como uma ofensa ou algo do género. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

outro pormenor, não devia ser 'i<=sqrt(k)' em vez de 'i<=k*k'?

Pois devia, ou então mais simplesmente 'i*i <= k'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, eu nao testei o código, devia ser i*i<=k sim.

Quanto ao break, é daquelas coisas.. de facto não é um hábito muito bom, mas este vem em nome da velocidade. Podemos removê-lo que o programa funciona exactamente igual, mas mais lento. Pelo outro lado, a outra alternativa, for (i=2;(i*i<=k) && (!found);i++) talvez complicasse demais..

Não deixo de concordar com vocês. Só deve usar breaks quem sabe o que está a fazer, e muitos professores cortam quando os vêm por isso mesmo.

0

Partilhar esta mensagem


Link 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