Ir ao conteúdo
  • Cadastre-se

C++ problema folha de são paulo c++


Posts recomendados

Olá@João Victor Souza Carli !

 

Acredito que para resolver o problema você deve primeiro isolar as vogais das consoantes nos nomes das estrelas, depois disso testar para cada até achar aquela cujo o produto é igual a 75. Note que cada vogal já tem um valor natural associado. Assim o produto de vogais é um produto numérico.

 

Exemplo.: {  SIRIUS  }={ 3*3*8 }= { 72 }

 

Certo.

Link para o comentário
Compartilhar em outros sites

Fibonacci é apenas uma menção dos valores numéricos das vogais do problema.

Lembra? São 5 as vogais e os 5 primeiros números da sequência.

 

Imagina que as vogais são códigos para os números { 1,2,3,5,8 }

 

Implemente um algoritmo que percorre um certa string.

 

Agora modifique-o para além de percorrer testar se a posição atual no índice da string tem uma vogal

 

Agora modifique-o, além de percorrer e testar, o algoritmo realiza o produtório sempre que na posição atual do índice for positivo para vogal. Use estruturas de decisão para decodificar as vogais por números.

 

Num é fácil?

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@João Victor Souza Carli Sim, muito tipo isso!

 

Nossa foi quase! Esse algoritmo faz a somatória; o resultado é quantidade de vogais na string (* s).

Para o problema estamos interessados no acumulo de produtos (produtório), para além de contar quantas ocorrências vocálicas.

 

Pode muito reaproveitar as estruturas, só modifique o bloco if, pois nele, far-se-á para resolver o problema o produtório dos valores numéricos atribuídos as vogais do enunciado.

 

👍

 

Link para o comentário
Compartilhar em outros sites

@João Victor Souza Carli Sim, não está certo ainda, mas é isso!

 

Lembre-se antes que possa determina o produto é necessário fazer a "decodificação" de vogais para números.

O problema associa, por exemplo, a letra A o valor 1, assim cada A equivale a 1, a vogal E temos o 2; logo cada E equivale a 2,... por último temos a vogal U que vale 8; logo cada ocorrência de U vale 8, logo contu*8 é igual a parte de U no problema.

 

Saco!?

Link para o comentário
Compartilhar em outros sites

@João Victor Souza Carli 🙊 0 é o elemento neutro!

 

Cada unidade de contx é um expoente de x.

 

Demostrando uma resposta. Observa logo abaixo a partir do post #8

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    char estrela [30]= {'\0'};

    int i, conta= 0, conte= 0, conti= 0, conto= 0, contu= 0;
    int produtorio= 1;


    puts("Digite um estrela");
    fgets(estrela,30,stdin);

    for (i= 0; i < strlen(estrela); ++i) {
            switch (tolower(estrela [i])) {
                    case 'a': ++conta; break;
                    case 'e': ++conte; break;
                    case 'i': ++conti; break;
                    case 'o': ++conto; break;
                    case 'u': ++contu; break;
            }
    }

    puts("\n");

    /* DETERMINANDO O PRODUTÓRIO */
    /* Note que contX é o expoente de base X */

    while (conta --> 0) produtorio*= (1);
    while (conte --> 0) produtorio*= (2);
    while (conti --> 0) produtorio*= (3);
    while (conto --> 0) produtorio*= (5);
    while (contu --> 0) produtorio*= (8);

    /* DETERMINANDO O PRODUTÓRIO */

    printf("Produtorio %d\n", produtorio);
    return 0;
}

 

 

Link para o comentário
Compartilhar em outros sites

39 minutos atrás, João Victor Souza Carli disse:

Na parte do while porque colocou --> ?

Parte do exercício é multiplicar as n ocorrências de uma vogal pelo o valor associado.

 

quando escrevo contX --> 0, estou dizendo que se contX tem um valor maior que 0, então subtrai 1 e continue o laço de repetição!

 

É a junção, por falta de espaço na indentação, do operador unário de pós-decremento (--) e o operador lógico binário maior que (>)

 

Certo!

 

adicionado 1 minuto depois

Também lembra o operador de calculo em limites quando dizemos que x --> 0, estou dizendo que x tende a 0.

 

É bem isso que acontece aí, se x é 0, o laço para.

Link para o comentário
Compartilhar em outros sites

@MB_ No programa em questão que estamos discutindo você escreve uma palavra e ele vai contar as vogais e multiplicar elas e mostrar o valor, eu queria tipo: Digitar o valor da multiplicação e ele me retornar a palavra , mais precisamente o contrario, entende?

Link para o comentário
Compartilhar em outros sites

@João Victor Souza Carli A sim claro! Entendo. 

 

Entretanto, isso não faz sentido! Compreenda que teria de digitar as palavras de qualquer maneira, pois só assim o algoritmo seria capaz de decidir quais 6 palavras (astros) tem aquele produto informado.

 

De qualquer forma terias de escrever todas elas antes. Já para mim, faz muito mais sentido como está. Contudo, nada lhe impede de estudar o caso e dar uma resposta sozinho a sua maneira.

 

Certo!

 

 

Link para o comentário
Compartilhar em outros sites

Em 14/08/2019 às 12:44, João Victor Souza Carli disse:

@MB_ Eu digo tipo, ao invés de digitar o nome do planeta ou da estrela , eu digitar um numero, ai ele com esse numero ele vai formando uma palavra ta ligado ?

 

 


Sim. Basta programar isso, o inverso do enunciado de certa forma: 72 por exemplo é 2 x 2 x 2 x 3 x 3, 8x9. Então você vai usando os fatores primos do numero e procurando na tabela de palavras. Quando achar uma palavra que dá esse total você mostra e encerra. Note que pode haver, lógico, mais de uma solução dependendo dos valores dos pesos para cada letra. No enunciado por exemplo E= 2 e U= 8... SIRIUS vale 72 mas ESIRIESE também já que 8 = 2x2x2, ou um U vale 3 E no nosso caso. Se quiser mesmo fazer isso abra um novo tópico e escrevemos juntos a função.

 

Note que se isso é para ser resolvido em C++ E se espera algo de C++ e em geral um código simples em C ajustado para compilar em C++ pode estar potencialmente correto mas não ensinar nada em termos de C++ e valer menos pontos... Tenho visto muitos exemplos assim aqui no Forum.

 

De volta ao tema:

 

Muitas vezes esses problemas para iniciantes mostram informações que nada tem a ver com a solução, apenas para distrair o aluno e ver se ele consegue focar no que tem realmente a ver com o problema e descartar as informações supérfluas. Nesse caso aqui temos sistemas estelares, engenheiros, sequencia de Fibonacci e tal :D

E temos um problema a ser resolvido em C++. Vou deixar uma possível maneira de implementar isso

 

Em geral vale muito a pena pensar no que estamos tentando resolver antes de ir escrever um programa e esse aqui é um caso:

  • A sequencia de Fibonacci não tem nada a ver com o problema
  • Temos apenas algumas palavras e um critério para gerar um número, que vamos chamar de produto, a partir das letras dessa palavra: de acordo com o enunciado apenas as vogais tem um valor, que vamos chamar de peso.
  •  Na primeira palavra que tiver o produto esperado terminamos com um destino identificado.
  • Se nenhuma das palavras tiver esse produto, ficamos sem destino. Nesse caso, uma espaçonave com engenheiros Perdidos No Espaço :D 
  • O enunciado tem uma sequência de palavras para testar, uma tabela de pesos e um produto esperado, 75.

Voltando ao Ensino Fundamental: fatores primos
Pois é: temos 75 engenheiros e um conjunto de fatores --- pesos --- para gerar um produto. Lembrando da infância na escola, temos que 75 é divisível por 3: 75=3x25. E temos que 25 é divisível por 5: 25=5x5. Então escrevendo 75 como produto de fatores primos, 75 = 3x5x5. E olhando o enunciado temos que I vale 3 e O vale 5 e já sabemos que a palavra que a gente quer só pode ter 2 vogais: O e I. E tem que ter dois O. Sem programar nada. Só olhando. E vemos lá PROCION no enunciado, com o esperado valor 75.

 

Mais do ensino fundamental: Aritmética
Temos que na multiplicação multiplicar qualquer coisa por 1 dá na mesma: então se todas as nossas letras da tabela tivessem peso 1 o produto seria sempre... 1. O nome chique de escrever isso é que 1 é o elemento neutro da multiplicação.

1*X = X para qualquer X

Porque #$%#%$# de motivo isso importa?

Simples: temos sempre uma tabela de pesos e um produto. Nesse nosso caso AEIOU = 1,2,3,5 e 8 na ordem. Por exemplo, o produto para "AEIOU" seria 240 = 1x2x3x5x8 e como a gente já viu para "PROCION" por exemplo seria 5x3x5 = 75, e a gente espera que nosso programa mostre isso. E usando o peso 1 para qualquer valor fora da tabela fiuca mais fácil de calcular o produto, como vamos ver

 

Escrevendo em C++

Em C++ tem lá os objetos e tal. Podemos pensar então em uma classe Tabela  --- o objeto --- e ela precisa ter:

  • - uma tabela de pesos para as letras. As letras que não estão na tabela tem peso padrão 1 e assim não mudam o produto, como vimos acima.
  • - um total de itens na tabela para poder controlar a pesquisa

Algo assim: 

class Tabela
{
private:
    int total_de_items;
    int* pesos;
    char* letras;
...
}

É tudo que precisamos: o total de itens, os pesos e as letras;

E o que eu posso querer saber? Para uma certa palavra, qual o produto?

 

Algo assim: 

    int produto(string elemento)
    {
        cout << "calculando valor para a palavra " << elemento << endl;
        int produto = 1;
        // para cada letra da palavra ultiplica a letra pelo peso dela
        // se esta na tabela, ou por 1
        for (int i = 0; i < elemento.length(); i++)
        {
            produto = produto * fator_letra(elemento[i]);
        }    // end for
        cout << "produto = " << produto << endl;
        return produto;
    }    // end produto()

E eu chamo assim:

produto("palavra"); e a função retorna o produto para essa palavra considerando a tabela da classe. Para a tabela do enunciado, produto("palavra") retorna 1, pois 1x1x1=1. A vantagem de usar objetos (classes) é que eu posso mudar a tabela ou as palavras e continua tudo funcionando: o método da classe usa as letras e os pesos da classe e sempre funciona.

E essa função fator_letra() faz o que? 
simplesmente retorna o peso para a letra: no caso da tabela do enunciado, retorna por exemplo 8 para fator_letra('U') e retorna 1 para fator_letra('X'). E o código? pode ser assim:

    int fator_letra(char a_letra)
    {
        for (int i = 0; i < total_de_items; i++)
        {
            if (letras[i] == a_letra) return pesos[i];
        }
        return 1;

    }    // end fator_letra()

Isso é só pra ficar mais fácil de ler o código do método produto()

Algo mais?

Bem, seria legar ter uma função para mostrar o que tem na tabela, assim não precisamos ficar imaginando se o construtor está certo ou não...

    void mostra()
    {
        cout << "Tabela com " << total_de_items << " items" << endl;
        cout << "Eis os pesos para as " << total_de_items << " letras" << endl;
        for (int i = 0; i < total_de_items; i++)
        {
            cout << letras[i] << "=" << pesos[i] << endl;
        }    // end for
    }    // end mostra()


E como eu construo uma coisa dessas em C++? Usando um construtor para a classe Tabela,  que pega exatamente esses valores que declramos, algo assim:

 

    Tabela(int n, int* peso, string as_letras)
    {
        cout << "Criando uma tabela de pesos com " <<
            n <<
            " letras (para '" <<
            as_letras << "')" <<
            endl;
        total_de_items = n;
        pesos = new int[n];
        letras = new char[n];
        for (int i = 0; i < n; i++)
        {
            letras[i] = as_letras[i];
            pesos[i] = peso[i];
        }    // end for
    }

Um exemplo? claro: uma tabela com 4 pesos para X=3, Y=5, Z=7 e T=11 poderia ser usada assim em main:

int pesos_1 = { 3, 5, 7, 11 };
Tabela exemplo_1(4,pesos_1,"XYZT");
exemplo_1.mostra();
exemplo_1.produto("PARA UM VALOR QUALQUER");

E iria mostrar isso na tela:

Criando uma tabela de pesos com 4 letras (para 'XYZT')
Tabela com 4 items
Eis os pesos para as 4 letras
X=3
Y=5
Z=7
T=11
calculando valor para a palavra PARA UM VALOR QUALQUER
produto = 1

 

E para a tabela do enunciado? Assim:

    int pesos_folha[] = { 1,2,3,5,8 };
    Tabela teste_folha(5, pesos_folha, "AEIOU");
    teste_folha.mostra();
    teste_folha.produto("PARA UM VALOR QUALQUER");
    teste_folha.produto("Clube do Hardware");
    teste_folha.produto("SIRIUS");
    teste_folha.produto("PROCION");

E iria mostrar isso na tela:

Criando uma tabela de pesos com 5 letras (para 'AEIOU')
Tabela com 5 items
Eis os pesos para as 5 letras
A=1
E=2
I=3
O=5
U=8
calculando valor para a palavra PARA UM VALOR QUALQUER
produto = 5120
calculando valor para a palavra Clube do Hardware
produto = 160
calculando valor para a palavra SIRIUS
produto = 72
calculando valor para a palavra PROCION
produto = 75

Para o enunciado, Um método em C++ escrito assim:

bool desafio_folha(int n_engenheiros)
{
    int pesos_folha[] = { 1,2,3,5,8 };    // os pesos do enunciado
    string sistemas_estelares[] =        // os sistemas estelares
    {
        "SIRIUS",
        "LALANDE",
        "PROCION",
        "CENTAURI",
        "BARNARD"
    };
    Tabela folha = Tabela(5, pesos_folha, "AEIOU");    // cria tabela com as letras e pesos

    cout << "--------------------" << endl;
    cout << "desafio_folha(): procurando destino para espaconave com " <<
        n_engenheiros <<
        " engenheiros" <<
        endl;

    int sistema = 0;
    do
    {
        if (folha.produto(sistemas_estelares[sistema]) == n_engenheiros)
        {
            cout <<
                "Local de Chegada identificado:" <<
                sistemas_estelares[sistema] <<
                endl;
            return true;
        }
        sistema = sistema + 1;
    } while (sistema < 5);
    return false;
}    // end desafio_folha()

podia ser usado em main() assim:

    if (desafio_folha(75) == true)
    {
        cout << "Destino localizado" << endl;;
    }
    else
    {
        cout << "Sem destino: Engenheiros perdidos" << endl;;
    }

e mostraria

--------------------
desafio_folha(): procurando destino para espaconave com 75 engenheiros
calculando valor para a palavra SIRIUS
produto = 72
calculando valor para a palavra LALANDE
produto = 2
calculando valor para a palavra PROCION
produto = 75
Local de Chegada identificado:PROCION
Destino localizado

O código em main() para testar esses exemplos todos:

int main()
{
    int pesos_1[] = { 3,5,7,11 };
    Tabela exemplo_1(4, pesos_1, "XYZT");
    exemplo_1.mostra();
    exemplo_1.produto("PARA UM VALOR QUALQUER");

    int pesos_folha[] = { 1,2,3,5,8 };
    Tabela teste_folha(5, pesos_folha, "AEIOU");
    teste_folha.mostra();
    teste_folha.produto("PARA UM VALOR QUALQUER");
    teste_folha.produto("Clube do Hardware");
    teste_folha.produto("SIRIUS");
    teste_folha.produto("ESIRIESE");
    teste_folha.produto("PROCION");

    if (desafio_folha(75) == true)
    {
        cout << "Destino localizado" << endl;;
    }
    else
    {
        cout << "Sem destino: Engenheiros perdidos" << endl;;
    }

    return 0;
};// end main()

E mostra na tela:

Criando uma tabela de pesos com 4 letras (para 'XYZT')
Tabela com 4 items
Eis os pesos para as 4 letras
X=3
Y=5
Z=7
T=11
calculando valor para a palavra PARA UM VALOR QUALQUER
produto = 1
Criando uma tabela de pesos com 5 letras (para 'AEIOU')
Tabela com 5 items
Eis os pesos para as 5 letras
A=1
E=2
I=3
O=5
U=8
calculando valor para a palavra PARA UM VALOR QUALQUER
produto = 5120
calculando valor para a palavra Clube do Hardware
produto = 160
calculando valor para a palavra SIRIUS
produto = 72
calculando valor para a palavra ESIRIESE
produto = 72
calculando valor para a palavra PROCION
produto = 75
Criando uma tabela de pesos com 5 letras (para 'AEIOU')
--------------------
desafio_folha(): procurando destino para espaconave com 75 engenheiros
calculando valor para a palavra SIRIUS
produto = 72
calculando valor para a palavra LALANDE
produto = 2
calculando valor para a palavra PROCION
produto = 75
Local de Chegada identificado:PROCION
Destino localizado

Espero que tenha ajudado a entender uma importante diferença de usar objetos assim: só por declarar a variável

t como sendo do tipo Tabela eu já posso construir a tabela e chamar os métodos mostra() e produto() já acertados para cada variável tabela. Isso se chama instância: t é uma instância de Tabela.

int pesos_t[] = { 3,5,7,11,13,26,30,1 };
Tabela t(8, pesos_t, "ABCDEFGH");

E eu posso escrever t.mostra() e t.produto("TESTE") e vai funcionar certinho. E misturar várias tabelas no mesmo programa sem ter que mudar uma linha de código.

 

Se quiser ver um programa completo me avise e eu posto aqui a seguir. Está muito comprido esse texto já

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...