Ir ao conteúdo
  • Cadastre-se

C++ Imprimir strings diferentes <vetor>


Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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