Exercicios Programação

Dou-te duas pistas para ambos os exercícios:

Ciclo FOR e Como usar funções ;)

Depois do que me disseste fiz isto (quanto ao exercício dos numeros primos):

Código:
//Este programa calcula todos os numeros primos num dado intervalo
#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    cout << "Este programa descobre todos os numeros primos num dado intervalo" << endl;
    cout << "\nIntroduza um numero, prima ENTER e em seguida introduza outro numero" << endl;
    cin >> a >> b;
    cout << "\nNumeros primos entre " << a << " e " << b << ":" <<endl;
    for (int y = a; y=b; y++)
    {
         for (int z =2; z <= (y/2); z++)
         {
             c = y%z;
             if (c = 0)
             {
             }
             else
             {
                 cout << y << endl;
             }
             }
    }
    cin.get();
    cin.get();
    return 0;
}
O que o programa faz escrever o numero que estiver no b infinitamente.

O problema, tenho quase a certeza que é do if, mas não sei como é que hei-de fazer, porque tenho que ir incrementando o z (segundo for) e ir testando se o numero (y) é divisivel por z, e se chegar ao fim dos z, tenho de incrementar 1 ao y (primeiro for).

Como é que resolvo este problema??


P.S. Obrigado pelas respostas!!

EDIT já corrigi isso, mas mesmo assim o programa ainda não está a funcionar.
 
Última edição:
Ainda não vi bem o teu código, mas isto saltou-me à vista:
Código:
for (int y = a; y=b; y++)
A segunda parcela é uma comparação, mas o que tens é uma atribuição. Troca y=b por y==b ;)

edit -------------------------

Esta porção de código:
Código:
for(var=x; var<=y; var++) {
  qualquer();
  coisa();
}
É equivalente a esta:
Código:
var = x;
while(var<=y) {
  qualquer();
  coisa();
  var++;
}
ou, em última instância, a esta:
Código:
var = x;
while() {
  if(var<=y) {
    qualquer();
    coisa();
    var++;
  } else {
    continue;
  }
}
E fazer um for cuja parcela condicional seja "==" só faz sentido de vez em quando, e esse não é o caso :P verifica lá se não será <= que queres pôr ;)
 
Última edição:
Obrigado pelas respostas Kayvlim, já alterei as coisa como disseste, mas o programa não funcionou e eu já desisti deste exercício...não podes por a resposta completa ao problema, porque já vi que eu não vou lá.
 
Vais chegar lá ;)
Troca
Código:
    for (int y = a; y=b; y++)
por
Código:
    for (int y = a; y[COLOR=Red]<[/COLOR]=b; y++)
e

Código:
[COLOR=Red][B] if (c = 0)[/B][/COLOR]
             {
             }
             else
             {
                 cout << y << endl;
             }
Por
Código:
if (c!=0) {
  cout << y << endl;
}

Aquela linha tem uma falha grave: uma vez mais, estás a fazer uma comparação, pelo que usas o "==" em vez do "=" ;)
 
Última edição:
Vais chegar lá ;)
Troca
Código:
    for (int y = a; y=b; y++)
por
Código:
    for (int y = a; y[COLOR=red]<[/COLOR]=b; y++)
e

Código:
[COLOR=red][B]if (c = 0)[/B][/COLOR]
             {
             }
             else
             {
                 cout << y << endl;
             }
Por
Código:
if (c!=0) {
  cout << y << endl;
}

Aquela linha tem uma falha grave: uma vez mais, estás a fazer uma comparação, pelo que usas o "==" em vez do "=" ;)


O programa ficou assim depois do que me disseste:

Código:
//Este programa calcula todos os numeros primos num dado intervalo
#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    cout << "Este programa descobre todos os numeros primos num dado intervalo" << endl;
    cout << "\nIntroduza um numero, prima ENTER e em seguida introduza outro numero" << endl;
    cin >> a >> b;
    cout << "\nNumeros primos entre " << a << " e " << b << ":" <<endl;
    for (int y = a; y <=b; y++)
    {
         for (int z =2; z <= (y/2); z++)
         {
             c = y%z;
             if (c != 0)
             {
                 cout << y << endl;
             }
             }
    }
    cin.get();
    cin.get();
    return 0;
}

Ainda não dá uma resposta correcta, mas já está melhor.

P.S. Obrigado pela ajuda e confiança e pelo tempo que te estou a fazer perder com este exercício.

P.S2. Finalmente percebi a diferença entre "=" e "=="...obrigado


EDIT: Muito obrigado pela ajuda kayvlim
 
Última edição:
Bolas, confundi-me todo :x
A minha forma de fazer as coisas é considerar que um número é primo até prova em contrário.
Aquele segundo ciclo irá dividir o número por cada um dos números entre 2 e metade dele mesmo.
Se for divisível por ALGUM deles, não é primo.
Se o ciclo for completo e o número não tenha sido divisível por qualquer um dos anteriores, é primo.

Então, na realidade, o código deve ser algo assim:

Código:
//Este programa calcula todos os numeros primos num dado intervalo
#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
[COLOR=Red]    bool primo;[/COLOR]
    cout << "Este programa descobre todos os numeros primos num dado intervalo" << endl;
    cout << "\nIntroduza um numero, prima ENTER e em seguida introduza outro numero" << endl;
    cin >> a >> b;
    cout << "\nNumeros primos entre " << a << " e " << b << ":" <<endl;

    for (int y = a; y <=b; y++)
    {
[COLOR=Red]          primo = true;[/COLOR]
          for (int z =2; z <= (y/2); z++)
          {
               c = y%z;
[COLOR=Red]               if (c == 0) {
                 primo = false;
                 continue;
               }
[/COLOR]          }
          
[COLOR=Red]          if(primo==true) {
               cout << y << endl;
          }
[/COLOR]    }
    cin.get();
    cin.get();
    return 0;
}
A vermelho, as modificações.
 
Última edição:
Alguma dica para o exercicio 1?

1 - fazer um programa que faça todas as combinações de todas as palavras de n letras do abecedário. Isto é, para 4 letras, AAAA,AAAB,AAAC,AAAD,(...),AAAZ,AABA,AABB,AABC,AABD ,(...),AABZ,(...),AAZZ,ABAA,(......),ZZZZ.

cumprimentos,
 
Alguma dica para o exercicio 1?

Este é daqueles em que se pensa muito e se escreve pouco.

Se tivesses de fazer combinações de um tamanho fixo poderias utilizar n FOR's para n letras, neste caso como o tamanho recorre-se também à recursão.

E pegando em números para as combinações ajuda como o Neptune disse.
 
Este é daqueles em que se pensa muito e se escreve pouco.

Se tivesses de fazer combinações de um tamanho fixo poderias utilizar n FOR's para n letras, neste caso como o tamanho recorre-se também à recursão.

E pegando em números para as combinações ajuda como o Neptune disse.

Concordo. A melhor solução (ou pelo menos a mais simples) será recursiva, mas parece-me também um conceito demasiado avançado o nível em que ele está ;)

E como passar isso para código? :D

Se eu te for a dar o código, estou a resolver o problema por ti. Não é esse o objectivo, pois não? Começa o teu próprio algoritmo e a partir dele eu e outros membros iremos ajudar-te a chegar à solução ;)
 
Alguma dica para o exercicio 1?
cumprimentos,

Pergunto o mesmo, no entanto já fiz isto:

Código:
//Este programa faz todas as combinações de n letras do abcedário
#include <iostream>
using namespace std;
int main()
{
    int a;
    char abc[25];
    cout << "Este programa faz todas as combinações de n letras do abcedário" << endl;
    cout << "\nIntroduza um numero:";
    cin >> a;
    abc[0]='A';
    abc[1]='B';
    abc[2]='C';
    abc[3]='D';
    abc[4]='E';
    abc[5]='F';
    abc[6]='G';
    abc[7]='H';
    abc[8]='I';
    abc[9]='J';
    abc[10]='K';
    abc[11]='L';
    abc[12]='M';
    abc[13]='N';
    abc[14]='O';
    abc[15]='P';
    abc[16]='Q';
    abc[17]='R';
    abc[18]='S';
    abc[19]='T';
    abc[20]='U';
    abc[21]='V';
    abc[22]='W';
    abc[23]='X';
    abc[24]='Y';
    abc[25]='Z';
    
    for (int z=0; z<= a; z++)
    {
        for (int n=0; n<=25; n++)
        {
        cout << abc[n] << endl;
        }
        }
    
    cin.get();
    cin.get();
    return 0;
}

Executando este programa (escrito em c++) ele repete n vezes o abecedário, só que não é esse o objectivo, por isso pedia a alguém que me desse uma dica, mas coisas simples porque ainda estou a começar.
 
Um aparte, se estás a aprender não seria melhor usar C em vez de C++? ( Não gosto nada de ver esses cout's, prefiro o "velhinho printf" :p ).

1 - Declaraste uma string com 25 posições mas usaste 26, 0 a 25 = 26 posições;

2 - Não precisas dessas linhas todas para definir o abecedário, podes fazer logo:

char abc[] = "ABCDEFGHIJKLMNROPQRKRSTUVWXYZ";

Ou então escusas de utilizares um string para guardar isto tudo e podes usar antes 'A' + n, onde n é a posição da letra. abc[n] == 'A' + n.

3 - Assim à primeira vista não estou a ver como fazer isso sem ser de forma recursiva, vou tentar fazê-lo assim.
 
Um aparte, se estás a aprender não seria melhor usar C em vez de C++? ( Não gosto nada de ver esses cout's, prefiro o "velhinho printf" :p ).

1 - Declaraste uma string com 25 posições mas usaste 26, 0 a 25 = 26 posições;

2 - Não precisas dessas linhas todas para definir o abecedário, podes fazer logo:

char abc[] = "ABCDEFGHIJKLMNROPQRKRSTUVWXYZ";

Ou então escusas de utilizares um string para guardar isto tudo e podes usar antes 'A' + n, onde n é a posição da letra. abc[n] == 'A' + n.

3 - Assim à primeira vista não estou a ver como fazer isso sem ser de forma recursiva, vou tentar fazê-lo assim.

Quanto á string eu sei que usei as 26 posições (o abcedário tem 26 letras)...já mudei um bocado o código, mas o efeito é o mesmo:


Código:
//Este programa faz todas as combinações de n letras do abcedário
#include <iostream>
using namespace std;
int a;
char abc[25];
int combina()
{
        for (int z=1; z <=a; z++)
        {
            for (int n=0; n <= 25; n++)
            {
                cout << abc[n] << endl;
                }
                }
        cin.get();
        return 0;
}
 
int main()
{
 
    cout << "Este programa faz todas as combinações de n letras do abcedário" << endl;
    cout << "\nIntroduza um numero:";
    cin >> a;
    abc[0]='A';
    abc[1]='B';
    abc[2]='C';
    abc[3]='D';
    abc[4]='E';
    abc[5]='F';
    abc[6]='G';
    abc[7]='H';
    abc[8]='I';
    abc[9]='J';
    abc[10]='K';
    abc[11]='L';
    abc[12]='M';
    abc[13]='N';
    abc[14]='O';
    abc[15]='P';
    abc[16]='Q';
    abc[17]='R';
    abc[18]='S';
    abc[19]='T';
    abc[20]='U';
    abc[21]='V';
    abc[22]='W';
    abc[23]='X';
    abc[24]='Y';
    abc[25]='Z';
    combina();
    cin.get();
    cin.get();
    return 0;
}
O que eu estava a pensar fazer era executar n vezes a função combina (ou algo do género), mas não na forma que a função está agora...se calhar crio outra função e depois com for vou executando essa função que vai executar a função combina() n vezes função.

Preciso de ajuda para isto mas o quê que achas da ideia??? Achas que são funções a mais???

Eu também ainda estou a começar e por isso ainda tenho de praticar muito para treinar a minha forma de pensar.

Quanto a começar com c em vez de c++ acho que a diferença não é muita (uma vez que não uso POO, nem classes) e a 2ª linguagem de programação que vou dar na faculdade é c++ (acho que nem sequer vou dar c...pelo menos nos 2 primeiros anos).


EDIT: obrigado por teres dito que não era necessário tantas linhas de código para criar o abcedário...para a próxima já sei (como eu fiz demora um tempo infinito).


P.S. Obrigado pela ajuda.
 
Última edição:
Quanto á string eu sei que usei as 26 posições (o abcedário tem 26 letras)...já mudei um bocado o código, mas o efeito é o mesmo:
Até podias por abc[1] que se calhar não dava erro, mas está incorrecto visto que estás a usar memória que "não te pertence". Em programas de maiores dimensões que usem frequentemente a memória basta a diferença de um valor num sítio para que o programa crashe.


Sem usar recursão pensei assim:
Se quisesse fazer uma sequência como esta mas com todos os algarismos como 01, 02... 99 seria a sequência natural dos números. Neste caso sendo 26 letras é como se fosse o mesmo mas na base 26, 0 1, 0 2,... 0 9,... 0 24, 0 25, 1 0,... 1 25, até 25 25.

Em vez de teres um ciclo que incrementa um número "normalmente", incrementas a representação do número base 26 num array.


Para combinações com muitas letras a implementação com recursão é muito mais rápida. "To iterate is human; to recurse, is divine." :D
 
O que eu fiz foi uma função que faz o "incremento" de uma certa posição.
Isto é, a sub Main chama a função Increment para incrementar a última posição "AAAA", ficando "AAAB". Isto é num ciclo.
A própria função Increment() faz a transformação de "A" para "B", da letra que está na posição passada como parâmetro da função, de modo a que, se estivermos a incrementar "AAAZ", passa para "AABA", mas faz isto por recursividade - se a última posição estiver "preenchida", ela (função) chama-se a ela mesma para incrementar a posição anterior. Assim, na situação "AZZZ", a função é chamada tantas vezes quantas necessárias para passar a "BAAA" (ela chama-se a ela mesma três vezes).

A recursão é mesmo o melhor a fazer.

"To iterate is human; to recurse, is divine." :D
Amen :D
 
Até podias por abc[1] que se calhar não dava erro, mas está incorrecto visto que estás a usar memória que "não te pertence".

Porquê que estou a usar memoria que não me pertence...se eu fizer char arr[26], não estou apenas a criar uma matriz com 27 células (não sei se é este o termo)...e depois armazeno um caracter em cada célula...certo???

O que eu fiz foi uma função que faz o "incremento" de uma certa posição.
Isto é, a sub Main chama a função Increment para incrementar a última posição "AAAA", ficando "AAAB". Isto é num ciclo.
A própria função Increment() faz a transformação de "A" para "B", da letra que está na posição passada como parâmetro da função, de modo a que, se estivermos a incrementar "AAAZ", passa para "AABA", mas faz isto por recursividade - se a última posição estiver "preenchida", ela (função) chama-se a ela mesma para incrementar a posição anterior. Assim, na situação "AZZZ", a função é chamada tantas vezes quantas necessárias para passar a "BAAA" (ela chama-se a ela mesma três vezes).

A recursão é mesmo o melhor a fazer.


Amen :D

Pelo que percebi o programa tem de ter duas funções (main() e increment()), mas acho que vou precisar de ajuda com a função increment, porque nem sequer estou a ver como é que faço isto de forma recursiva.
 
Back
Topo