Ir ao conteúdo
  • Cadastre-se

C++ Registros e vetores em c++


Posts recomendados

Em uma galáxia muito distante, a Primeira Ordem decidiu pressionar seus recrutadores de Stormtroopers de cada planeta para conseguir aumentar rapidamente seu exército. Para fazer isso, eles resolveram fazer um levantamento a fim de descobrir de quais planetas vinham as maiores contribuições para suas tropas.

Você foi recrutado pelos generais para o levantamento e para isso deve fazer um programa que leia um vetor de registros com os dados dos Stormtroopers. Cada registro deve ter os campos: nome, planeta de origem e número de batalhas que o Stormtrooper participou. O programa deverá então calcular, para cada planeta, o número de Stormtroopers que vieram de lá e a quantidade média de batalhas que eles participaram (guardando essas informações de cada planeta em um registro). Por fim, o programa deverá exibir o vetor de registros com os dados dos planetas.

Obs1: os nomes dos planetas devem aparecer na ordem em que aparecem na entrada.

Obs2: nomes dos Stormtroopers e dos planetas não possuem espaço.

Obs3: para soluções em Python o programador deve utilizar uma estrutura de dados apropriada no lugar dos registros.

Entradas:

Quantidade de Stormtroopers que serão avaliados.

Sequência de valores para os registros de Stormtroopers, seguindo a ordem: nome, planeta de origem e número de batalhas.

Saídas:

Sequência dos valores dos registros de dados dos planetas, seguindo a ordem: nome do planeta, número de Stormtroopers e número médio de batalhas que eles participaram (separados por um único espaço).

 

Nesse exercício, como eu faço pra pegar as informaçoes dos planetas e calcular as outputs, sendo que eu posso dar entrada em um nome de planeta qualquer, e o programa precisa funcionar para qualquer nome de planeta colocado nas entradas.

Link para o comentário
Compartilhar em outros sites

Você só precisa ir lendo as entradas e acumulando nos registros de planetas. os troopers só são tratados por volume mas só para calcular a média. Como vi usar a mesma ordem da entrada dos planetas não precisa nem por em ordem: apenas vai gravando no vetor de registros de planetas. 

 

Faça um programa antes só pra ler os dados e mostrar os registros ao final e vai entender com mais facilidade.

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

Em 04/07/2020 às 11:38, vitor.assuncao disse:

e para isso deve fazer um programa que leia um vetor de registros com os dados dos Stormtroopers

 

Mas
 

Em 04/07/2020 às 11:38, vitor.assuncao disse:

Cada registro deve ter os campos: nome, planeta de origem e número de batalhas que o Stormtrooper participou


E

 

Em 04/07/2020 às 11:38, vitor.assuncao disse:

O programa deverá então calcular, para cada planeta, o número de Stormtroopers que vieram de lá e a quantidade média de batalhas que eles participaram (guardando essas informações de cada planeta em um registro)


Então tem a história toda. Que falta?

 

Você tem um livro? Seu curso adota um livro? Sugiro muito ir atrás disso se não tem um. É importante.

 

Se não sabe mesmo como fazer sugiro muito buscar um livro sobre C++.

 

Veja por exemplo

typedef struct
{
    char    nome[30];
    int     id_planeta; // o planeta
    unsigned int    numero_de_batalhas;
}   Stormtrooper;

typedef struct
{
    int     id_planeta; // comparar nomes pra que?
    char    nome[30];
    unsigned int    numero_de_troopers;
    unsigned int    total_de_batalhas;
}   Planeta;

Isso é só o que está escrito lá.

 

Como seria um vetor de planetas? 

    Planeta         planeta[30]; // 30 planetas


Pois é. Sabe alocar memória? O tal operador new? Assim poderia ir criando o vetor planeta a planeta


Como declarar um planeta pra testar?

    Planeta um  { 0, "Dune", 3, 113 };
    Planeta dois{ 1, "Pandora", 14, 456 };

Usando planetas famosos!

 

De volta ao programa

 

Se leu bem o enunciado, sabe que não há uso para a primeira struct{}. Coloquei só pra exemplo. Faça o simples: imagine um arquivo:

Storm1234-3,Dune,1
Storm1234-5,Dune,12
Storm1-1,Pandora,10
Storm1-22,Dune,100
Jhonny,Pandora,12

onde tem o nome, planeta de origem e o número de batalhas dos Stormtroopers

 

Claro que é bobagem perguntar o número, basta ler a lista toda e ir colocando nos planetas. Mas para não mexer no sagrado enunciado você pergunta pro usuário ou recebe na linha de comando esse número, e vai ler em "tropa.txt" que é muito, mas muito mesmo, mais fácil e lê esses dados aí até dar o número.

 

Não precisa por em vetor nenhum essa lista: vetor é o que tem na entrada. Apenas vai usar isso pra calcular a média de batalhas dos stormtroopers em cada planeta. Não precisa sequer ter um campo para a média.

 

Como manter a ordem dos planetas para a saída
 

Isso é fácil: basta não fazer nada. O primeiro planeta vai ter id 0 o segundo id 1 e a vida segue. Os dados não precisam nem estar em ordem: se o planeta é novo aumenta o id e coloca na posição N no vetor. Se o planeta já está lá você só vai lá e soma o trooper e as batalhas pra calcular a média no final.

 

No exemplo claro que Dune vai ser 0 e Pandora vai ser 1 e ao final Dune vai ter 113 batalhas e 3 troopers... Para a média que tal apenas dividir 113 por 3?

 

Um programa com esses dados

Planeta 0: "Dune" Stromtroppers: 3 Total de batalhas: 113 Media de batalhas: 37.6667

Para

#include <iostream>
using namespace std;

typedef struct
{
    char    nome[30];
    int     id_planeta; // o planeta
    unsigned int    numero_de_batalhas;
}   Stormtrooper;

typedef struct
{
    int     id_planeta; // comparar nomes pra que?
    char    nome[30];
    unsigned int    numero_de_troopers;
    unsigned int    total_de_batalhas;
}   Planeta;

int main()
{
    Planeta         planeta[30];
    Planeta um  { 0, "Dune", 3, 113 };
    Planeta dois{ 1, "Pandora", 14, 456 };

    cout << "Planeta " << um.id_planeta << ": " <<
        "\"" << um.nome << "\"" <<
        " Stromtroppers: " << um.numero_de_troopers <<
        " Total de batalhas: " << um.total_de_batalhas <<
        " Media de batalhas: " <<
            (double)um.total_de_batalhas/um.numero_de_troopers <<
        endl;

    planeta[0] = um;
    planeta[1] = dois;
    planeta[3] = um;
    planeta[4] = planeta[0];

};

Entendeu melhor?

Link para o comentário
Compartilhar em outros sites

Acho que sim. Faça algo objetivo agora. Apenas declarou tudo vazio. Eu te mostrei como.

 

  • usou robos e planetas mas a struct define um único robo e um unico planeta. Porque plural?
  • se mudou a terminologia clássica para usar robos porque usou n_troopers e não n_robos ?
  • evite declarar mais de uma variável por linha. Não ajuda em nada e conforme o programa cresce só atrapalha
  • não use o mesmo nome para struct e instâncias. Não leva a nada. Muita gente usa prefixos ou a primeira letra em maiúscula

 

 

Link para o comentário
Compartilhar em outros sites

@vitor.assuncao Você pode usar uma struct com estes registros,

 

typedef struct trooper{
    string nome;
    string planeta;
    int batalhas;
}Trooper;

Como os nomes dos planetas podem repetir durante o input, uma forma de totalizar e exibir as saídas é com dois loops sendo que o interno pode procurar o planeta e atribuir os valores que serão usados para calcular.

for(i=0;i<quantidade;i++){
    planeta=t[i].planeta;
    
    if(planeta!=""){
        total = qtd = 0;
        for(int n=0;n<quantidade;n++){
            if(planeta == t[n].planeta){
                total+=t[n].batalhas;
                t[n].planeta="";
                qtd++;
            }
        }
    }
}

As variáveis total e qtd podem ser usadas para calcular a média e a variável planeta na condicional para exibir os cálculos de cada planeta.

 

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...