Autor Tópico: Programa em C  (Lida 13337 vezes)

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Programa em C
« Online: 03 de Janeiro de 2013, 20:25 »
Bom preciso resolver o seguinte problema

Escreva um programa que lê um número n, e então imprime o menor número primo que é maior ou igual n, e imprime o maior primo que é menor ou igual a n.

Tentei o seguinte:

Código: [Selecionar]
#include <stdio.h>

main ()

{

 int n;
 int i;
 int j;
 int primo_maior;
 int primo_menor;
 scanf ("%d",&n);
 primo_maior == ((i%1 == 0) && (i%i == 0));
 primo_menor == ((j%1 == 0) && (j%j == 0));

 for (i = n ; i == primo_maior , i >= n ; i++)
 {
   printf ("Primo maior %d\n",i);
    for (j = n ; i == primo_menor , j <= n ; j--)
     {
         printf ("Primo menor %d\n",j);

           break;
 }
 }
 

}

Fica dando erro Exceção de ponto flutuante (imagem do núcleo gravada) alguem sabe o que e isso?

Offline Sergio Benjamim

  • Usuário Ubuntu
  • *
  • Mensagens: 2.902
    • Ver perfil
Re: Programa em C
« Resposta #1 Online: 03 de Janeiro de 2013, 20:38 »
Bom preciso resolver o seguinte problema

Escreva um programa que lê um número n, e então imprime o menor número primo que é maior ou igual n, e imprime o maior primo que é menor ou igual a n.

Tentei o seguinte:

Citar
#include <stdio.h>

main ()

{

 int n;
 int i;
 int j;
 int primo_maior;
 int primo_menor;
 scanf ("%d",&n);

// Vc não comenta seu código? Isso é importante.
// Tá dificil entender o q vc quis fazer aqui embaixo
//Vc não está confundindo atribuição (=) com comparação (==) ?

 primo_maior == ((i%1 == 0) && (i%i == 0));
 primo_menor == ((j%1 == 0) && (j%j == 0));

 for (i = n ; i == primo_maior , i >= n ; i++)
 {
   printf ("Primo maior %d\n",i);
    for (j = n ; i == primo_menor , j <= n ; j--)
     {
         printf ("Primo menor %d\n",j);

           break;
 }
 }
 

}

Fica dando erro Exceção de ponto flutuante (imagem do núcleo gravada) alguem sabe o que e isso?

dá uma olhada no meu comentário
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Re: Programa em C
« Resposta #2 Online: 03 de Janeiro de 2013, 20:49 »
Olha ai

Código: [Selecionar]
#include <stdio.h>

main ()

{

 int n;
 int i;
 int j;
 int primo_maior;
 int primo_menor;
 scanf ("%d",&n);
 primo_maior = ((i%1 == 0) && (i%i == 0)); //Função para primo maior
 primo_menor = ((j%1 == 0) && (j%j == 0)); // Função para primo menor

 for (i = n ; i == primo_maior , i >= n ; i++)   //Aqui a intenção era que o programa inicie em n e que ele imprima o primeiro numero primo
 {                                               // maior ou igual a n
   printf ("Primo maior %d\n",i);
    for (j = n ; i == primo_menor , j <= n ; j--) //Iniciar em n e imprimir o primeiro numero menor ou igual a n
     {
         printf ("Primo menor %d\n",j);

           break;   //Como eu só quero o primeiro maior e primeiro menor , assim que ele achar o valor o programa termina.
 }
 }
 

}

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Programa em C
« Resposta #3 Online: 03 de Janeiro de 2013, 21:53 »
O i e j não foram iniciados. Conselho? Apague e reanalise o problema, veja:

- Primo = um numero natural que possui 2 divisores naturais, 1 e ele mesmo. Todo numero natural (inteiro não-negativo), é divisível natural de 1 e ele mesmo.

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Re: Programa em C
« Resposta #4 Online: 04 de Janeiro de 2013, 00:08 »
Bom consegui criar o programa para verificar se o numero e primo, mas e agora como faço para escolher o primeiro maior e o primeiro menor primo em relação a n

Código: [Selecionar]
#include <stdio.h>

main ()

{
 
 int n;
 int i;
 int divisor;
 scanf ("%d",&n);
 divisor = 0;  //Numero de divisores

 for (i = 1; i <= n ; i++) //verifica o numero de divisores que N tem
 {
  if (n%i== 0)
  
    divisor++;  //cada vez que n tem um divisor, incrementa a variavel divisor
 }
  if (divisor == 2)
    printf ("Numero primo\n"); //se o numero de divisores é 2 entao e primo
  else
    printf ("Nao eh primo\n"); // se e diferente de 2 entao nao e primo

}

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Programa em C
« Resposta #5 Online: 04 de Janeiro de 2013, 08:51 »
Tá certo, mas você poderia iniciar i com 2 e ir até n-1, ai afirmava que é primo se nenhum numero fosse divisor natural. Pro restante:

- Crie um laço que vai de n até um numero grande, teste se o numero atual é primo, quebre o laço se positivo.
- Crie um laço que vai de n-1 até o inicio, teste se o numero atual é primo, quebre o laço se positivo.


-----
Em c existe o tipo inteiro sem sinal, ou seja, numero natural. É o unsigned int, que pelo padrão C99, em máquinas 32bits, vai pelo menos de 0 até 4,294,967,295.
« Última modificação: 04 de Janeiro de 2013, 09:12 por irtigor »

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Re: Programa em C
« Resposta #6 Online: 04 de Janeiro de 2013, 13:31 »
Mas tipo eu vou ter que colocar esse laço para verificar se e primo dentro desse outros dois laços , ou descarto esse laço que eu criei?

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Programa em C
« Resposta #7 Online: 04 de Janeiro de 2013, 13:50 »
Os dois que eu falei não podem ser aninhados, e dentro de cada um é necessário verificar se o numero é primo. Siga o meu conselho, reanalise o problema, não adianta sair escrevendo código se você ainda não intendeu o que foi pedido.

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Re: Programa em C
« Resposta #8 Online: 04 de Janeiro de 2013, 20:30 »
Eu entendi o problema só que nao estou conseguindo estruturar o codigo , pensei no seguinte;

1) O programa lê o numero caso ele seja primo imprimi, caso nao seja incrementa a variavel e verifica dinovo se e primo só que nao estou conseguindo fazer.

Código: [Selecionar]
#include <stdio.h>

main ()

{

 int n;
 int i;
 int j;
 int aux;
 int divisor;
 divisor = 0;

 scanf ("%d",&n);
 aux = 1;
 
 while (divisor != 2)   //Caso o numero tenha mais de 2 divisores ele executa o for dinovo, mas nao ta dando certo;
 {
  for (i = n ; aux <= i ; aux++)
  {
    if (i%aux == 0)
      divisor++;
  }
    i++;            //se o numero tem mais de 2 divisores ele incrementa o i pra testar dinovo

  }
  printf ("Primo\n");
 
 }

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Programa em C
« Resposta #9 Online: 04 de Janeiro de 2013, 21:39 »
Em pseudocódigo fica mais ou menos assim (primeira parte):

Código: [Selecionar]
leia(n)

para (i=n, i < __numero-grande_, i++) faça // Começa em N e vai subindo
    marca=0 // Zera o marcador que vai dizer se o numero é primo ou não
    para (j=2, j < i, j++) faça // Verifica se é primo
        se i%j == 0
            marca=1 // Se entrou aqui é porque o numero é divisível por um natural diferente de 1 e ele mesmo
        fim
    fim
    se marca==0 // Se a marca continua zerada, é porque é primo
        escreva "O menor número primo que é maior ou igual n, é" i
        saia-do-para
    fim
// Terminou um ciclo, continua verificando: n+1, (n+1)+1, ((n+1)+1)...
fim


------
Você tirou esse exercício da onde? Se realmente intendeu o problema, eu recomendo que volte uns capítulos do livro/apostila.
« Última modificação: 04 de Janeiro de 2013, 21:47 por irtigor »

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Re: Programa em C
« Resposta #10 Online: 04 de Janeiro de 2013, 22:09 »
Então é o seguinte eu estou cursando estatística e tenho uma disciplina obrigatoria onde tenho que aprender linguagem C, acontece que eu vou ter essa disciplina nesse primeiro semestre de 2013 só que como eu já tenho acesso ao material do curso já estou olhando e aprendendo , o problema é que esse material é extremamente básico são alguns slides que explicam de maneira resumida a linguagem C, e os exercicios não aparentam ser dos mais faceis.

Por isso já comecei a estudar , estou lendo Linguagem C Completa e total de Herbert Schildit (815 paginas) e encontrei um site onde tem video aulas sobre C também que estou usando como base para estudo.

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Programa em C
« Resposta #11 Online: 04 de Janeiro de 2013, 23:21 »
Dê uma procurada por material de lógica de programação, entenda bem e tudo vai fluir.

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Re: Programa em C
« Resposta #12 Online: 05 de Janeiro de 2013, 10:50 »
Vo da uma procurada sim, se tiver algum material pra indicar ai também é bem vindo.

Abraço

Offline Rhyu

  • Usuário Ubuntu
  • *
  • Mensagens: 95
    • Ver perfil
Re: Programa em C
« Resposta #13 Online: 06 de Janeiro de 2013, 21:31 »
Bom consegui resolver em partes aqui vai o codigo:

Código: [Selecionar]
#include <stdio.h>

main ()

{
  int n;
  int aux ;
  int i;
  int j;
  int divisor;
  int divisor2;

  scanf ("%d",&n);

  while (divisor != 2) //Enquanto numero de divisores for diferente de 2 executa o laço
  {
    divisor = 0;
    aux = 1;
    for (i = n ; aux <= i ; aux++) // Teste pra ver se e primo
    {
      if (i % aux == 0)
        divisor ++;
    }
      if (divisor == 2)  //Se for primo para
        break;
      else
      n++;     //Caso não seja primo incrementa n
  }
        printf ("Primo maior %d\n",i);



        while (divisor2 != 2)  //Enquanto numeros de divisores for diferente de 2 executa o laço
        {
          divisor2 = 0 ;
          aux = 1 ;
          for (j = n ; aux <= j ; aux++)  //Teste pra ver se e primo
          {
            if (j % aux == 0)
              divisor2++;
          }
          if (divisor2 == 2)  //Se for primo para
            break;
          else
           n--;   //Se nao for primo decrementa variavel
        }
        printf ("Primo menor %d\n",j);
}


Esta imprimindo o primeiro primo maior que n normalmente , o problema esta em imprimir o primo menor. Acho que o problema é que apos ele encontrar o numero primo maior n passa a ser primo , entao ele automaticamente imprimi , mas no caso e o primo maior. Só que nao sei como resolver isso.
« Última modificação: 06 de Janeiro de 2013, 21:34 por Rhyu »

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Programa em C
« Resposta #14 Online: 06 de Janeiro de 2013, 21:57 »
Sim, se você perde o valor digitado não tem como. Reveja o pseudocódigo, nele é um auxiliar que é incrementado, outro ponto (na mesma linha), é que eu defini um teto, você não pode incrementar indefinidamente (era essa a ideia? porque tá esquisito), os tipos possuem tamanhos.

----
Outra coisa, coloquei pra percorrer de 2 até n-1 porque é mais eficiente. Na há pra quê dividir N por 1 e ele mesmo, você sabe que vai dar certo (sempre).
« Última modificação: 06 de Janeiro de 2013, 22:03 por irtigor »