Ir ao conteúdo

Posts recomendados

Postado

Entrada:

número de ingredientes da primeira lista.

ingredientes (strings) da primeira lista.

número de ingredientes da segunda lista.

ingredientes (strings) da segunda lista.
Saída:
os ingredientes da primeira lista que não foram repetidos na segunda lista.

 

Eu fiz o seguinte código, mas não consigo imprimir os diferentes, então fiz apenas com os iguais. O que deveria ser feito para imprimir os diferentes?

 

#include <iostream>
using namespace std;
int main(){
    bool temIngredientesRep = false;
    int N,M;
    cin >> N;
    string ingredientes[N];
    
    for(int i =0;i<N;i++){
        cin >>ingredientes
    }
    cin >> M;
    string ingredientes2[M];
    
        for(int i =0;i<M;i++){
        cin >>ingredientes2
    }
    for(int i = 0; i < N;i++){
        for(int e = 0; e < M; e++){
            if(ingredientes == ingredientes2[e]){
                cout << ingredientes <<endl;
                temIngredientesRep = false;
            }
        }
    }
    if(temIngredientesRep == false){
        cout << "NADA";
    }

return 0;
}


 

 

  • Obrigado 1
Postado

@Camila Campos para listas em c++ voce deve utilizar o include <list>

 

#include <iostream>
#include <list>
#include <string>

using namespace std;


int main (){

//declarando uma lista, o tipo de dados e o nome;
list <string> primeira,segunda;
list <string>::iterator it;

//inserindo na primeira lista
primeira.push_front("Rei de copas");
primeira.push_front("Rei de espadas");
primeira.push_front("Rei de ouros");
primeira.push_front("Rei de paus");
//inserindo na segunda lista
segunda.push_front("Rei de ouros");

cout << "Tamanho da lista 1: " << primeira.size() << "\n";
cout << "Tamanho da lista 2: " << segunda.size() << "\n";


	while(primeira.front()!=segunda.front()){
		primeira.pop_front();
		if(primeira.front()==segunda.front())
	cout << "A repetida e : " << segunda.front();
}

	
}





 

  • Obrigado 1
Postado

@Camila Campos Oi, tudo bom? não sei resolver seu problema pois sou novo na área mas sei te passar algo que vai resolver a vida de quem quer te ajudar:

image.png.f93d2bfc5586fb00f15cf0c47d54e990.png

Ali onde está marcado de vermelho tu abre uma caixa para colocar seus códigos. Ou seja , quando tu clicar aparece uma caixa de codificação na frente do cursor, boa sorte!

  • Curtir 1
  • Obrigado 2
Postado
13 horas atrás, Camila Campos disse:

Entrada:

número de ingredientes da primeira lista.

ingredientes (strings) da primeira lista.

número de ingredientes da segunda lista.

ingredientes (strings) da segunda lista.
Saída:
os ingredientes da primeira lista que não foram repetidos na segunda lista.

 

Leia as listas para vetores de strings e apenas use um loop lendo os itens da primeira lista. Dentro dele para cada elemento da primeira lista você percorre a segunda até achar o cara ou ate ela terminar. Se terminou sem achar ele não está repetido na segunda e você pode mostrar. Se está passa para o próximo item na primeira lista.

 

Como faria com as listas em papel na sua mesa. Só isso.

 

8 horas atrás, herbertbahia disse:

@Camila Campos para listas em c++ voce deve utilizar o include <list>

 

Aposto que ela não pode usar essas estruturas --- containers --- de STL, como listas, vetores e filas e tal. É um exercício aparentemente sobre loops, muito básico.

 

Mas se puder usar set é o mais apropriado, certo?  Estamos falando de intersecção de conjuntos afinal. É mais intuitivo. Veja como pode ser mais fácil:

#include <iostream>
#include <set>
using namespace std;
int main()
{
    std::string lista1[8] { "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4] { "1", "3", "5", "5" };
    std::set <string> B;
    for (auto valor : lista2) B.insert(valor); // todos em A
    for (auto valor : lista1)
        if (B.find(valor) == B.end())
            cout << valor << endl;
};

Em especial porque list<> não tem .find() e set<> tem.

 

Usando dois conjuntos podia escrever:

    std::string lista1[8]{ "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4]{ "1", "3", "5", "5" };
    std::set <string> A;
    std::set <string> B;
    for (auto valor : lista1) A.insert(valor); // todos em A
    for (auto valor : lista2) B.insert(valor); // todos em B
    for (auto valor : A)
        if (B.find(valor) == B.end())
            cout << valor << endl;

Que funciona igualzinho. Mas acho que não é o propósito do exercício

 

  • Obrigado 1
Postado

Consegui resolver assim:

#include <iostream>
#include <vector>

using namespace std;

void imprimirVetor(vector<string> lista);

bool temIngrediente(const vector<string> &ingredientes, const string &ingrediente);

int main() {
    vector<string> lista1 = {"A", "B", "C", "D", "E"};
    vector<string> lista2 = {"E", "F", "G", "H", "I"};
    vector<string> unicos;

    for (auto &item : lista1) {
        if (!temIngrediente(lista2, item)) {
            unicos.push_back(item);
        }
    }

    cout << "Lista 1: ";
    imprimirVetor(lista1);
    cout << "Lista 2: ";
    imprimirVetor(lista2);
    cout << " Unicos: ";
    imprimirVetor(unicos);

    return EXIT_SUCCESS;
}

void imprimirVetor(vector<string> lista) {
    cout << "[";

    for (int i = 0; i < lista.size(); ++i) {
        cout << lista[i];

        if (i + 1 < lista.size()) {
            cout << ", ";
        }
    }

    cout << "] \n";
}

bool temIngrediente(const vector<string> &ingredientes, const string &ingrediente) {
    for (auto &item : ingredientes) {
        if (item == ingrediente) {
            return true;
        }
    }

    return false;
}

 

  • Curtir 2
Postado
31 minutos atrás, AdrianoSiqueira disse:

Consegui resolver assim:

 

Ainda acho que não dá pra usar containers nesse exercício porque é um exercício para mostrar loops aninhados, mas de vetor <string> para um char[][] de C não muda muito afinal. E :) aí seria bem como escreveu!

 

Mas se é possível pode usar <vector> então pode usar <list> e <set> e set é mais intuitivo e fácil de ler: são conjuntos afinal. E set tem find() e vector não.

 

Mas se <vector> não tem find() std::find(0 está aí. Claro que dá na mesma e então podia escrever de um jeito C++

    for (auto valor : VA)
        if (std::find(VB.begin(), VB.end(), valor) == VB.end())
            cout << valor << endl;

E assim funcionaria para VA e VB  sendo <list> <set> ou <vector> ou qualquer classe "iterable" na essência dos containers em C++.

 

Para focar no espírito STL e C++ se pode também usar for_each() e vai funcionar para qualquer classe dessas, como vector ou set ou uma classe sua mesmo, escrevendo apenas

    for_each(A.begin(), A.end(),
        [&B](auto valor) {if (std::find(B.begin(), B.end(), valor) == B.end())
        cout << valor << endl; });

por exemplo.

 

Eis 3 possíveis casos:

 

Usando vetor e find() mas funciona para qualquer container

int outroVF()
{   // usando std::find()
    std::string lista1[8]{ "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4]{ "1", "3", "5", "5" };
    std::vector <string> VA;
    for (auto valor : lista1) VA.push_back(valor); // lista1 em VA
    std::vector <string> VB;
    for (auto valor : lista2) VB.push_back(valor); // lista2 em VB

    for (auto valor : VA)
        if (std::find(VB.begin(), VB.end(), valor) == VB.end())
            cout << valor << " ";
    cout << endl;
    return 0;
};

Usando Set e .find()

int outroSet()
{
    std::string lista1[8]{ "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4]{ "1", "3", "5", "5" };
    std::set <string> A;
    std::set <string> B;
    for (auto valor : lista1) A.insert(valor); // lista1 em A
    for (auto valor : lista2) B.insert(valor); // lista2 em B
    for (auto valor : A) if (B.find(valor) == B.end())
        cout << valor << " ";
    cout << endl;
    return 0;
};

Que só funciona  se a classe tiver find()

 

Ou usando for_each(), genérica também

int outroFe()
{
    std::string lista1[8]{ "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4]{ "1", "3", "5", "5" };
    std::set <string> A;
    std::set <string> B;
    for (auto valor : lista1) A.insert(valor); // lista1 em A
    for (auto valor : lista2) B.insert(valor); // lista2 em B
    for_each(A.begin(), A.end(),
        [&B](auto valor) {if (std::find(B.begin(), B.end(), valor) == B.end())
        cout << valor << endl; });
    return 0;
};

Um teste com as 3 mostra claro

0 2 4
0 2 4
0 2 4

Como esse

#include <algorithm>
#include <iostream>
#include <set>
#include <vector>
using namespace std;

int outroFe();
int outroSet();
int outroVF();

int main()
{
    outroFe();
    outroSet();
    outroVF();
    return 0;
};

int outroSet()
{
    std::string lista1[8]{ "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4]{ "1", "3", "5", "5" };
    std::set <string> A;
    std::set <string> B;
    for (auto valor : lista1) A.insert(valor); // lista1 em A
    for (auto valor : lista2) B.insert(valor); // lista2 em B
    for (auto valor : A) if (B.find(valor) == B.end())
        cout << valor << " ";
    cout << endl;
    return 0;
};


int outroFe()
{
    std::string lista1[8]{ "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4]{ "1", "3", "5", "5" };
    std::set <string> A;
    std::set <string> B;
    for (auto valor : lista1) A.insert(valor); // lista1 em A
    for (auto valor : lista2) B.insert(valor); // lista2 em B
    for_each(A.begin(), A.end(),
        [&B](auto valor) {if (std::find(B.begin(), B.end(), valor) == B.end())
        cout << valor << " "; });
    cout << endl;
    return 0;
};


int outroVF()
{   // usando std::find()
    std::string lista1[8]{ "0", "1", "2", "3", "3", "4", "5", "5" };
    std::string lista2[4]{ "1", "3", "5", "5" };
    std::vector <string> VA;
    for (auto valor : lista1) VA.push_back(valor); // lista1 em VA
    std::vector <string> VB;
    for (auto valor : lista2) VB.push_back(valor); // lista2 em VB

    for (auto valor : VA)
        if (std::find(VB.begin(), VB.end(), valor) == VB.end())
            cout << valor << " ";
    cout << endl;
    return 0;
};

 

  • Curtir 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!