Comparar vetores de string de registros diferentes [RESOLVIDO]

1. Comparar vetores de string de registros diferentes [RESOLVIDO]

joao batista c souza
joao.sp28

(usa KUbuntu)

Enviado em 10/11/2018 - 21:43h

Ola galera, é a primeira vez que utilizo o Forum, então me desculpem qualquer desconforto por mim causado. É o seguinte não consigo comparar os vetores de registros diferentes e carregar em outro vetor para imprimir a diferença entre eles, se alguém puder me ajudar por favor.

 #include <iostream>

using namespace std;

typedef struct {
    char nome[100];
    
    }lista1;
    
typedef struct{
    char nome2[100];
    
   }lista2;
    
int main(){

    int total;
    cin>>total;
    
    lista1 v[total];
    for(int i=0;i<total;i++){
        
        cin.getline (v[i].nome,100);
    }
    int totalB;
    cin>>totalB;
    
    lista2 v1[totalB], v3[total];
    for(int i=0;i<totalB;i++){
        cin.getline(v1[i].nome2,100);
    }
    int p=0;
   for(int i=0;i<total;i++){
        for(int j=0;j<totalB;j++){
           if(strcmp(v[i].nome,v1[i].nome2)!=0))
            v3[i].nome++;
            p++;
        }    
    }
    for(int i=0;i<p;i++){
    cout<<v3[i].nome<<endl;
    }
return 0;
}

 



  


2. Re: Comparar vetores de string de registros diferentes

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/11/2018 - 23:59h

Prezado,

Seu programa está um tanto confuso, principalmente por ao misturar C e C++ de uma forma que você tenta usar recursos de C que ou são incompatíveis (arrays de tamanho variável) ou que são feitos de outra maneira em C++ (typedef para structs anônimas, em vez de lhes atribuir nomes e usar esses nomes como tipos).

Veja o que acontece quando se tenta compilar seu código com alertas ligados.
g++ -pedantic-errors -std=c++11 -Wall -Werror -O2 x.cc 
x.cc: In function int main()’:
x.cc:20:19: error: ISO C++ forbids variable length array v [-Wvla]
     lista1 v[total];
                   ^
x.cc:28:21: error: ISO C++ forbids variable length array v1 [-Wvla]
     lista2 v1[totalB], v3[total];
                     ^
x.cc:28:32: error: ISO C++ forbids variable length array v3 [-Wvla]
     lista2 v1[totalB], v3[total];
                                ^
x.cc:35:15: error: strcmp was not declared in this scope
            if(strcmp(v[i].nome,v1[i].nome2)!=0))
               ^~~~~~
x.cc:35:15: note: suggested alternative: strtoq
            if(strcmp(v[i].nome,v1[i].nome2)!=0))
               ^~~~~~
               strtoq
x.cc:35:48: error: expected primary-expression before ‘)’ token
            if(strcmp(v[i].nome,v1[i].nome2)!=0))
                                                ^
x.cc:41:17: error: struct lista2 has no member named nome’; did you mean nome2’?
     cout<<v3[i].nome<<endl;
                 ^~~~
                 nome2 


Eu tentei corrigir os erros de sintaxe e de símbolos indefinidos, bem como trocar recursos obsoletos do C por elementos próprios do C++, mas mesmo isso ainda tem um erro lógico que impede a compilação (e que já existia no programa original, mas não apareceu como tal porque você usou o nome errado do campo da estrutura).
#include <iostream>
#include <vector>

#include <cstring>


using namespace std;


struct lista1 {
	char nome[100];
};

struct lista2 {
	char nome2[100];
};  // XXX: Essa estrutura é quase idêntica à primeira (muda o nome do campo, mas não seu tipo ou tamanho).
    // Você realmente precisa de outro tipo de dados?


int main(){
	int total;
	cin>>total;
	vector<lista1>v(total);
	for(int i=0;i<total;i++)
		cin.getline (v[i].nome,100);

	int totalB;
	cin>>totalB;
	vector<lista2> v1(totalB), v3(total);
	for(int i=0;i<totalB;i++)
		cin.getline(v1[i].nome2,100);

	int p=0;
	for(int i=0;i<total;i++)
		for(int j=0;j<totalB;j++){
			if(strcmp(v[i].nome,v1[i].nome2)!=0)
				v3[i].nome2++;	// <--- ERRO: não se pode incrementar um array.
				             	//      O que você quis realmente fazer?
			p++;
		}

	for(int i=0;i<p;i++)
		cout<<v3[i].nome2<<endl;

	return 0;
} 


Seria interessante saber o que você realmente gostaria de fazer quando encontrar uma diferença entre as duas listas de nomes. Como está, não faz sentido.


3. Re: Comparar vetores de string de registros diferentes [RESOLVIDO]

joao batista c souza
joao.sp28

(usa KUbuntu)

Enviado em 11/11/2018 - 22:15h

Valeu, amigo pela ajuda.
Na verdade eu preciso carregar dois registros e verificar se existe nomes diferentes entre eles, se sim, imprimir quais.
Obrigado pela ajuda


4. Re: Comparar vetores de string de registros diferentes

Fernando
phoemur

(usa Debian)

Enviado em 12/11/2018 - 00:37h

Vou colocar algo aqui só para o incentivo ao uso dos algoritmos da STL.
Em um estilo mais "funcional".
*Se você mandar isso pro seu professor ele vai te dar zero

teste.cpp

#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
#include <string>

int main()
{
    using namespace std;
    
    set<string> A, B;
    int total_a, total_b;

    cout << "Digite o número e as strings do primeiro conjunto:\n";
    cin >> total_a;
    copy_n(istream_iterator<string>(cin), total_a, inserter(A, end(A)));
    
    cout << "Digite o número e as strings do segundo conjunto:\n";
    cin >> total_b;
    copy_n(istream_iterator<string>(cin), total_b, inserter(B, end(B)));
    
    cout << endl;
    
    cout << "Elementos presentes apenas em A (ausentes em B):\n";
    set_difference(begin(A), end(A), 
                   begin(B), end(B), 
                   ostream_iterator<string>(cout, "\n"));
    
    cout << endl;
    
    cout << "Elementos presentes apenas em B (ausentes em A):\n";
    set_difference(begin(B), end(B), 
                   begin(A), end(A), 
                   ostream_iterator<string>(cout, "\n"));
    
    cout << endl;
    
    cout << "Elementos presentes em ambos (A && B):\n";
    set_intersection(begin(A), end(A), 
                     begin(B), end(B), 
                     ostream_iterator<string>(cout, "\n"));
    
    cout << endl;
    
    cout << "Elementos presentes apenas em A ou em B (porém não em ambos):\n";
    set_symmetric_difference(begin(A), end(A), 
                             begin(B), end(B), 
                             ostream_iterator<string>(cout, "\n"));
    
    return 0;
}
 


Saída:

[phoemur@notebook_lenovo.darkstar ~]$g++ teste.cpp -Wall -std=c++14
[phoemur@notebook_lenovo.darkstar ~]$./a.out

Digite o número e as strings do primeiro conjunto:
5
cachorro gato coelho papagaio peixe
Digite o número e as strings do segundo conjunto:
5
cachorro gato elefante girafa slackware_linux

Elementos presentes apenas em A (ausentes em B):
coelho
papagaio
peixe

Elementos presentes apenas em B (ausentes em A):
elefante
girafa
slackware_linux

Elementos presentes em ambos (A && B):
cachorro
gato

Elementos presentes apenas em A ou em B (porém não em ambos):
coelho
elefante
girafa
papagaio
peixe
slackware_linux


Forte abraço
______________________
https://github.com/phoemur


5. Re: Comparar vetores de string de registros diferentes [RESOLVIDO]

joao batista c souza
joao.sp28

(usa KUbuntu)

Enviado em 13/11/2018 - 00:35h

Poxa valeu cara, valeu mesmo, aprender nunca é demais, acho que vou tentar usar sua logica de comparação e ver que no da. Grande abraço.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts