Clipper On Line • Ver Tópico - Ajuda em Linguagem C
Página 1 de 2

Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 08:58
por trooper7
Olá pessoal, tudo beleza!?

Bom, preciso fazer uma lista de exercícios para a faculdade, em que há o seguinte problema:

Escrever os números primos entre 100 e 200 bem como a soma desses números


A única coisa que consegui até agora foi fazer o cálculo dos números primos...
#include <stdio.h>
#include <conio.h>

int main (void){
    int i, soma;
    printf("\nNumeros primos entre 100 e 200:\n\n", i);
    for(i=100; i<=200; i++){
        if (i % 2 != 0)
        {
           printf("%d\n", i);
           }
           }
           soma=i+1;
           printf("E a soma de todos eles eh: %d", soma); // Aqui mora o problema!
    getch();
   

}

Mas estou me embananando na hora da soma!

Tentei de várias maneiras, mas está difícil... :(Neg

Agradeço muito quem puder me ajudar nessa, galera!

Um grande abraço a todos! ;D

Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 10:10
por Pablo César
Achei mudar como desse jeito, veja se é isso:

#include <stdio.h>
#include <conio.h>

int main (void){
    int i, soma;
    printf("\nNumeros primos entre 100 e 200:\n\n", i);
    for(i=100; i<=200; i++){
        if (i % 2 != 0)
        {
           printf("%d\n", i);
           soma=soma+i;
        }
    }
    printf("E a soma de todos eles eh: %d", soma); // Aqui mora o problema!
    getch();
}

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 10:20
por trooper7
Nossa!
Perfeito Pablo!
Maravilha amigão! Deu certinho!

A minha variável soma estava fora do if e contando +i... rs

Muito obrigado!
E vamos aos outros exercícios agora... :'( kkk

Abraços!

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 10:36
por Maligno
Detalhe: você está considerando como primo o número que for ímpar. Mas nem todos ímpares são primos. Entre 100 e 200 há vários ímpares não-primos. Veja a lista completa, nessa faixa:

101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197 e 199.

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 11:14
por trooper7
Olá maligno!

Realmente, estou pegando apenas os números ímpares no intervalo [100, 200]... :/
Acho que estou penando na verificação se o número é primo ou não!

Segue meu código:
#include <stdio.h>
#include <conio.h>

int main (void){
    int i, soma;
    printf("\nNumeros primos entre 100 e 200:\n\n", i);
    for(i=100; i<=200; i++)
    {
        if (i % 2 != 0)
        {
           printf("%d\n", i);
           soma=soma+i;
        }
    }
    printf("E a soma de todos eles eh: %d", soma);
    getch();
}

Se puder me ajudar a resolver, agradeço muito!

Abraço!

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 11:35
por Maligno
Nunca fiz isso. Felizmente nunca precisei. Mas não parece ser tão difícil. A única forma de resolver o problema é estudá-lo. Na net tem tudo o que precisa. Não acredito que vá ter qualquer dificuldade. Veja na Wikipedia. Acho que lá já deve ter tudo.

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 11:45
por trooper7
Opa Maligno!

Acho que agora consegui...

#include <stdio.h>
#include <conio.h>

int main (void){
    int i, soma;
    printf("\nNumeros primos entre 100 e 200:\n\n", i);
    for(i=100; i<=200; i++)
    {
        if (i%1==0 && i%i==0)
        {
           printf("%d\n", i);
           soma=soma+i;
        }
    }
    printf("E a soma de todos eles eh: %d", soma);
    getch();
}


Claro, um número só é considerado primo quando é divisível por 1 e por ele mesmo... então é só colocar isso na condicional!

if (i%1==0 && i%i==0)


Muito obrigado pela ajuda, galera!
Ultimamente ando tão cheio de coisas na cabeça, que essas "bobeiras" acabam passando despercebidas! rs

Mais uma vez obrigado!

Abraços! ;D

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 11:52
por Maligno
Acho que você vai precisar elaborar um pouco mais esse código. Tome por exemplo o número 121. Ele é divisível por 1 e por ele mesmo. No entanto, ele também é divisível por 11. Não é primo, mas passa no seu código como se fosse.

Dica: sempre que fizer algum código, faça o possível para provar que ele está errado. :)

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 13:07
por trooper7
Puts! :%
Todo número é divisível por 1 e por ele mesmo... porém os números primos obedecem SOMENTE esta condição!

E do jeito que coloquei no meu programa, ela irá imprimir na tela todos os números contidos entre 100 e 200, que sejam divisíveis por 1 e por eles mesmos, ou seja, imprime tudo! ¬¬'

Nossa, consciliando tarefas do serviço com trabalho da faculdade... nossa, é complicado! Tô ficando louco! rs

Mas obrigado pela observação Maligno! Vou tentar elaborar melhor esse programa!

Abraço!

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 13:42
por trooper7
Caramba!
Acho que AGORA eu consegui...

#include <stdio.h>
#include <conio.h>

int primo(int b)
{
    int i, count = 0;
    for(i=1;i<b+1;i++)
    {
          if((b % i) == 0)
          {
                count++;
          }
    }

    if(count == 2)
    {
          return 1;
    }
    else
    {
          return 0;
    }
}

int main()
{
    int i, soma;
    printf("\nNumeros primos entre 100 e 200!\n\n");
    for(i=100;i<=200;i++)
    {
          if(primo(i) == 1)
          {
                printf("%d\n", i);
                soma=soma+i;
          }
    }
    printf("\nE a soma de todos eles eh: %d", soma);
    getch();
}


Pesquisei, rachei a cabeça, e acho que agora está tudo conforme! o/ kkk

Valeu pela força!

Abraços!

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 14:06
por Maligno
Claro que são poucos números. Mas se fosse um volume grande de dados, a performance poderia ser comprometida pelo código redundante. Então resolvi fatorar o seu código, a título de ilustração. Não precisa mudar o que já fez.

#include <stdio.h>
#include <conio.h>

int primo(int b) {
    int i, count = 0;
    for(i=2; i<=b; i++) if(!(b%i)) count++;
    return (count<2);
}

int main() {
    int i, soma;
    printf("\nNumeros primos entre 100 e 200!\n\n");
    for(i=100; i<=200; i++) {
        if (primo(i)) {
            printf("%d\n",i);
            soma += i;
        }
    }
    printf("\nE a soma de todos eles eh: %d", soma);
    getch();
}


Lembre-se: em C e C++, o zero é sempre falso e qualquer valor diferente de zero é verdadeiro. Essa característica ajuda a economizar código e melhora a performance, já que dispensa uma comparação.

Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 21:45
por Pablo César
Maligno escreveu:Detalhe: você está considerando como primo o número que for ímpar.
Puts... como passou por alto isso ! Olhe que tinha entendido mas não me deparei nesse "pequeno" detalhe... rsrs
Fiquei empolgado em responder, ainda com a pressa que tinha para me preparar e ir ao dentista... acabei não atentando a esse detalhe. Ainda bem que aqui sempre podemos contar com o nosso benemérito colega Maligno. Desculpem, não foi má vontade... foi distração mesmo. Mas o importante que foi resolvido.

se fosse um volume grande de dados, a performance poderia ser comprometida pelo código redundante.
Mas ainda acho Maligno que a sua fatoração só sintetizou a quantidade de linha mas manteve o mesmo procedimento que o Thiago fez por ultimo. Estou errado ?

Também não sei, se seria conveniente verificar a possibilidade de inclusão do único número par que é primo, isto é, o número 2. Claro que sabemos que logo de cara, essa faixa não inclui o 2 mas talvez seja necessário colocar em váriáveis, ou melhor dito, permitir a parametrização do número inicial e final para que a função fosse mais flexível, aceitando números ou faixa de números variáveis, daí sim caberia fazer a comparação de faixa inicio e fim se está incluso o número dois e checar os valores se está em modo ascendentes (primeiro_parametro <= segundo_parametro) por exemplo.

Ahh mas acho que eu ja estou sendo chato... se foi fixo essa faixa, então esqueça o 2...

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 22:18
por Maligno
sua fatoração só sintetizou a quantidade de linha mas manteve o mesmo procedimento

Sim, o procedimento é o mesmo de antes. Mas como eu disse, a eliminação de uma comparação numa malha que possa eventualmente manipular porrilhões de números, pode fazer uma notável diferença de perfomance. Mas foi só uma sugestão para projetos futuros. Fatorar código é sempre uma boa idéia, um hábito saudável. Até o limite da legibilidade, claro.

único número par que é primo, isto é, o número 2.

Repare que o enunciado do problema exclui o número 2, já que pede apenas os valores entre 100 e 200.

Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 22:21
por Pablo César
Tá cerrrto !

Re: Ajuda em Linguagem C

MensagemEnviado: 17 Mai 2010 23:09
por Maligno
Enquanto tomava banho lembrei de um detalhe: todo número é divisível por 1. Então fatorei mais um pouco e economizei uma iteração da malha.

Tá vendo? Você não foi o único que se distraiu. :) Quando não se tem compromisso com o problema, que é bem o nosso caso, há o risco de deixarmos escapar algum detalhe.

Ajuda em Linguagem C

MensagemEnviado: 23 Out 2011 11:46
por jwilton
Pessoal, boa tarde.

Sou novo aqui no fórum e estou com uma dúvida que parece ser simples mas que para mim, que estou começando a usar liguagem c, está sendo complicado.
Estou usando um GPS no meu trabalho de conclusão de curso e precisava lê-lo usando programação em C. As sentenças enviados pelo GPS são NMEA e o compilador que estou usando é o gcc (Linux). Gostaria de saber como acesso a porta serial usando gcc para ler os dados do gps?

Agradeço a todos.