Dev - C++ - Mostrar los elementos no repetidos de una matriz, AYUDAA!

 
Vista:

Mostrar los elementos no repetidos de una matriz, AYUDAA!

Publicado por Juan Cruz (6 intervenciones) el 31/03/2016 02:05:44
El programa consiste en ingresar por teclado una matriz de caracteres, luego mostrar la matriz original y la matriz con guiones en lugar de los elementos repetidos
El programa funciona cuando se repiten todos los elementos de la matriz, pero cuando hay un no repetido este se imprime varias veces con un guion al final. Nose como hacer que el elemento se imprima solo una vez!!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "iostream"
#include "string"
 
using namespace std;
 
int main()
{
	char **a;										//declaro variables
	bool sal;
	char comp,*b;
	int i=0,k,l=0,j,f=0,c=0,m=0,n=0;
 
	cout<<"Ingrese el numero de filas: ";			//ingreso por teclado las filas y columnas
	cin>>f;
	cout<<"Ingrese el numero de columnas: ";
	cin>>c;
 
	a = new char* [f];								//genero la matriz original
    for (i = 0; i < f; i++)
        a[i] = new char[c];
 
 
	b = new char [2*f*c];							//genero el vector de repeticiones
 
	for(i=0;i<2*f*c;i++)							//lleno el vector de -1
	b[i]=-1;
 
	for(i=0;i<f;i++)								//ingreso cada elemento de la matriz
	for(j=0;j<c;j++)
	{
	cout<<"Ingrese el elemento A["<<i+1<<"]["<<j+1<<"]";
	cin>>a[i][j];
	}
 
	for(i=0;i<f;i++)								//imprimo la matriz original
	{
	cout<<endl;
	for(j=0;j<c;j++)
	cout<<a[i][j]<<" ";
	}
	cout<<endl;
 
	for(i=0;i<f;i++)								//guardo en el vector los elementos repetidos 
	for(j=0;j<c;j++)
	for(k=0;k<f;k++)
	for(l=0;l<c;l++)
	if((a[i][j]==a[k][l])&&((i!=k)||(j!=l)))
	{
	b[m]=a[k][l];
	m++;
	}
 
	cout<<endl;										//imprimo el vector
	for(i=0;((i<2*f*c)&&(b[i]!=-1));i++)
	cout<<b[i]<<" ";
 
	cout<<endl;
 
	for(i=0;i<f;i++)								//imprimo la matriz sin los repetidos
	{
	cout<<endl;
	for(j=0;j<c;j++){
		k=0;
		sal=0;
		while(sal==0)
		{
		if(a[i][j]==b[k])
		{
		cout<<"- ";
		sal=1;}
		else{
		k++;
		if(b[k+1]==-1)
		cout<<a[i][j]<<" ";
		}}}}
 
 
 
	return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Mejore el codigo pero sigue sin funcionar.

Publicado por Juan Cruz (6 intervenciones) el 31/03/2016 07:12:17
ya no se repiten las letras pero me muestra un guion al final de cada letra no repetida. aca va el nuevo codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "iostream"
#include "string"
 
using namespace std;
 
int main()
{
	char **a;										//declaro variables
	bool sal;
	char comp,*b;
	int i=0,k,l=0,j,f=0,c=0,m=0,n=0;
 
	cout<<"Ingrese el numero de filas: ";			//ingreso por teclado las filas y columnas
	cin>>f;
	cout<<"Ingrese el numero de columnas: ";
	cin>>c;
 
	a = new char* [f];								//genero la matriz original
    for (i = 0; i < f; i++)
        a[i] = new char[c];
 
 
	b = new char [2*f*c];							//genero el vector de repeticiones
 
	for(i=0;i<2*f*c;i++)							//lleno el vector de 0
	b[i]=0;
 
	for(i=0;i<f;i++)								//ingreso cada elemento de la matriz
	for(j=0;j<c;j++)
	{
	cout<<"Ingrese el elemento A["<<i+1<<"]["<<j+1<<"]";
	cin>>a[i][j];
	}
 
	for(i=0;i<f;i++)								//imprimo la matriz original
	{
	cout<<endl;
	for(j=0;j<c;j++)
	cout<<a[i][j]<<" ";
	}
	cout<<endl;
 
	for(i=0;i<f;i++)								//guardo en el vector los elementos repetidos 
	for(j=0;j<c;j++)
	for(k=0;k<f;k++)
	for(l=0;l<c;l++)
	if((a[i][j]==a[k][l])&&((i!=k)||(j!=l)))
	{
	b[m]=a[k][l];
	m++;
	}
 
	cout<<endl;										//imprimo el vector
	for(i=0;i<2*f*c;i++)
	cout<<b[i]<<" ";
 
	cout<<endl;
 
	for(i=0;i<f;i++)								//imprimo la matriz sin los repetidos
	{
	cout<<endl;
	for(j=0;j<c;j++){
		k=0;
		sal=0;
		while(sal==0)
		{
		if(a[i][j]==b[k])
		{
		cout<<"- ";
		sal=1;
		}
		else{
		k++;
		if(k==f*c)
		cout<<a[i][j]<<" ";
		}}}}
 
 
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Mejore el codigo pero sigue sin funcionar.

Publicado por Martín (158 intervenciones) el 31/03/2016 08:20:26
Hola; en general, yo prefiero separar el código en funciones de pocas líneas, que si no me pierdo. Están también los más ortodoxos que no aceptan funciones con más de 20 líneas, y ponen cada función en su propio archivo. Te comento esto para que vayas haciéndote una idea de lo que dirían tus compañeros programadores si tuvieran que revisar tu código.

Y en el plan ese de separar las responsabilidades en funciones propias, te paso un ejemplo que se me ocurre que te puede servir. Empiezo suponiendo que la entrada de datos ya está resuelta (que creo que esa parte ya la tienes), y que el usuario ha entrado los datos de una matriz de caracteres de 2 filas y 3 columnas.

Y uso un botoncito que hay por acá arriba, con un este aspecto: </> y que al poner el mouse arriba me sale un cartelito diciendo "insertar código"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <map>
 
// muestra la matriz original
// teniendo en cuenta que un array de dos dimensiones
// es lo mismo que uno de una sola dimensión, 
// sólo que poniendo las filas una atrás de la otra.
void original(char* a, int f, int c)
{
	std::cout << "matriz original:\n";
	for (int i = 0; i<f; i++)	{
		for (int j = 0; j<c; j++)
			std::cout << a[i*c+j] << " ";
		std::cout << std::endl;
	}
	std::cout << std::endl;
}
 
// Muestra los elementos no repetidos de la matriz.
void no_repetidos(char* a, int f, int c)
{
	// Mira, acá uso un std::map, que es un artefacto muy práctico
	// que permite asociar una clave (key) a un valor, y 
	// que en este caso está asociando cada carácter del array
	// a la cantidad de sus ocurrencias (1 o más)
	std::map<char, int> caracteres;
	for (int i = 0; i<f; i++)
		for (int j = 0; j < c; j++)
			++caracteres[a[i*c + j]];
 
	// Y entonces, recorro cada caracter del array, y 
	// si en el map figura con una sola ocurrencia,
	// se muestra como és; si no, se escribe un guión.
	std::cout << "matriz sin repetidos:\n";
	for (int i = 0; i<f; i++) {
		for (int j = 0; j < c; j++) {
			if (caracteres.find(a[i*c + j])->second == 1) // único
				std::cout << a[i*c + j] << " ";
			else
				std::cout << "- ";
		}
		std::cout << std::endl;
	}
	std::cout << std::endl;
}
 
 
int main()
{
	const int f = 2;
	const int c = 3;
	char a[f][c] = { {'1', '2', '3'}, {'3', '5', '6'} };
 
	original(&a[0][0], f, c);
	no_repetidos(&a[0][0], f, c);
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No pude terminarlo

Publicado por Juan Cruz (6 intervenciones) el 01/04/2016 20:55:15
Al agregar la parte de ingreso de las variables el programa me ingresa cualquier simbolo, la primera fila la imprime bien pero las demas no. nose porque ocurre esto por que los codigos por separado si funcionan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <map>
 
 using namespace std;
 
// muestra la matriz original
// teniendo en cuenta que un array de dos dimensiones
// es lo mismo que uno de una sola dimensión, 
// sólo que poniendo las filas una atrás de la otra.
void original(char* a, int f, int c)
{
	std::cout << "matriz original:\n";
	for (int i = 0; i<f; i++)	{
		for (int j = 0; j<c; j++)
			std::cout << a[i*c+j] << " ";
		std::cout << std::endl;
	}
	std::cout << std::endl;
}
 
// Muestra los elementos no repetidos de la matriz.
void no_repetidos(char* a, int f, int c)
{
	// Mira, acá uso un std::map, que es un artefacto muy práctico
	// que permite asociar una clave (key) a un valor, y 
	// que en este caso está asociando cada carácter del array
	// a la cantidad de sus ocurrencias (1 o más)
	std::map<char, int> caracteres;
	for (int i = 0; i<f; i++)
		for (int j = 0; j < c; j++)
			++caracteres[a[i*c + j]];
 
	// Y entonces, recorro cada caracter del array, y 
	// si en el map figura con una sola ocurrencia,
	// se muestra como és; si no, se escribe un guión.
	std::cout << "matriz sin repetidos:\n";
	for (int i = 0; i<f; i++) {
		for (int j = 0; j < c; j++) {
			if (caracteres.find(a[i*c + j])->second == 1) // único
				std::cout << a[i*c + j] << " ";
			else
				std::cout << "- ";
		}
		std::cout << std::endl;
	}
	std::cout << std::endl;
}
 
 
int main()
{
	int f,i,j ;
	int c;
	char **a;
 
 
	std::cout << "Ingrese el numero de filas: ";			//ingreso por teclado las filas y columnas
	std::cin>>f;
	std::cout<<"Ingrese el numero de columnas: ";
	std::cin>>c;
 
	a = new char* [f];								//genero la matriz original
    for (i = 0; i < f; i++)
        a[i] = new char[c];
 
	for(i=0;i<f;i++)								//ingreso cada elemento de la matriz
	for(j=0;j<c;j++)
	{
	std::cout<<"Ingrese el elemento A["<<i+1<<"]["<<j+1<<"]";
	std::cin>>a[i][j];
	}
 
	original(&a[0][0], f, c);
	no_repetidos(&a[0][0], f, c);
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No pude terminarlo

Publicado por agustin (522 intervenciones) el 02/04/2016 11:54:40
Te estás complicando más de lo que debes. Por cierto, al usar new y no aplicarle sus respectivos delete estas dejando memoria colgada sin poderse usar, cuidado con eso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No pude terminarlo

Publicado por Martín (158 intervenciones) el 02/04/2016 18:47:36
Es que el programa y mi ejemplo usan dos formas distintas de obtener memoria para el array, y las funciones que reciben ese array tienen que cambiar de prototipo, fue error mío.

La versión que se corresponde con un puntero a puntero sería:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <map>
 
// paso del array bidimensional a como puntero a puntero
void original(char** a, int f, int c)
{
    std::cout << "matriz original:\n";
    for (int i = 0; i < f; i++)   {
        for (int j = 0; j < c; j++)
            std::cout << a[i][j] << " ";
        std::cout << std::endl;
    }
    std::cout << std::endl;
}
 
// Muestra los elementos no repetidos de la matriz.
void no_repetidos(char** a, int f, int c)
{
    // Mira, acá uso un std::map, que es un artefacto muy práctico
    // que permite asociar una clave (key) a un valor, y
    // que en este caso está asociando cada carácter del array
    // a la cantidad de sus ocurrencias (1 o más)
    std::map<char, int> caracteres;
    for (int i = 0; i < f; i++)
        for (int j = 0; j < c; j++)
            ++caracteres[a[i][j]];
 
    // Y entonces, recorro cada caracter del array, y
    // si en el map figura con una sola ocurrencia,
    // se muestra como és; si no, se escribe un guión.
    std::cout << "matriz sin repetidos:\n";
    for (int i = 0; i < f; i++) {
        for (int j = 0; j < c; j++) {
            if (caracteres.find(a[i][j])->second == 1) // único
                std::cout << a[i][j] << " ";
            else
                std::cout << "- ";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
}
 
 
int main()
{
    int f, i, j ;
    int c;
    char** a;
 
 
    std::cout << "Ingrese el numero de filas: ";            //ingreso por teclado las filas y columnas
    std::cin >> f;
    std::cout << "Ingrese el numero de columnas: ";
    std::cin >> c;
 
    a = new char* [f];                              //genero la matriz original
    for (i = 0; i < f; i++)
        a[i] = new char[c];
 
    for(i = 0; i < f; i++)                          //ingreso cada elemento de la matriz
        for(j = 0; j < c; j++) {
            std::cout << "Ingrese el elemento A[" << i + 1 << "][" << j + 1 << "]";
            std::cin >> a[i][j];
        }
 
    original(a, f, c);
    no_repetidos(a, f, c);
 
    // y como te comentaba agustín,
    // para evitar memory leaks, la memoria
    // asignada con new se libera con delete
    // y la asignada con new[], con delete[]
    // en este caso el sistema operativo va
    // a liberar la memoria por tí al terminar
    // el programa, pero de todos modos
    // es bueno adoptar la costumbre...
 
    for(i=0; i<f; i++)  // libera la memoria de cada fila
        delete[] a[i];
    delete[] a;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar