Dev - C++ - Ayuda con practico de c++

 
Vista:

Ayuda con practico de c++

Publicado por Franco (2 intervenciones) el 25/10/2015 20:41:07
Hola nesecito mucha ayuda gente!tengo que hacer un trabajo practico para subir esta noche y no se como hacerlo..alguien podria ayudarme y hacerlo porfavor?lo veo muy dificil..desde ya muchas gracias..este es el enunciado:

Realice un programa en C++, con las siguientes características:

1) Se deberán ingresar desde teclado una secuencia de N columnas de 4 elementos enteros cada una. Los mismos deberán almacenarse en una matriz de 4 filas por M columnas, donde M es una constante global. Antes de ingresar los datos se deberá ingresar el valor de N y validar que no supere el valor de M.



Ej.

Ingresar cantidad de columnas (N): 4

Ingresar datos: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7

Matriz a generar

1 5 9 4

2 6 1 5

3 7 2 6

4 8 3 7

2) Una vez cargada la matriz, mediante la función "parimpar", deberá determinar que cantidad de números en la matriz son pares, que cantidad son impares, y que cantidad son 0s e imprimir en pantalla los resultados. Esta función, devuelve un 0 si el elemento enviado es 0, un 1 si es impar y un 2 si es par.

Prototipo de la función: int parimpar(int);

Ej.

Cantidad de elementos pares: 7

Cantidad de elementos impares: 9

Cantidad de elementos nulos: 0

3) Luego a través de la función filas; deberá determinar el promedio total de los valores mayores que 0, que estén en las filas pares, y las filas impares, para luego imprimir los resultados en pantalla. Los argumentos de la función son la matriz, y la cantidad de columnas.

Prototipo de la función: void filas(int[][], int);

Ej.

Promedio de elementos mayores que 0 en filas pares: 4.625

Promedio de elementos mayores que 0 en filas impares: 4.5

4) Por ultimo deberá determinar la suma de los elementos mayores que 0 de cada columna y guardarlos en un arreglo. El cual deberá imprimirse en pantalla y guardarse en un archivo cuyo nombre indicara el usuario.

Ej.

Indique nombre de archivo para almacenar la siguiente información: "resultados.txt"

Suma de los elementos mayores que cero de cada columna
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
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++

Ayuda con practico de c++

Publicado por aguml (522 intervenciones) el 25/10/2015 22:24:58
Y tu código?
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

Ayuda con practico de c++

Publicado por Tito (3 intervenciones) el 26/10/2015 00:09:29
pude hacer la primera parte de lo que te pide, no se me ocurre la funcion para lo del parimpar


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
#include <iostream>
#include <iomanip>
using namespace std;
const int M=4;
 
int main()
{
	int N=0;
	cout<<"Ingrese numero de filas para su matriz"<<endl<<endl;
	cin>>N;
	cout<<endl;
 
	int M1 [N][M];
 
	for (int f=0;f<N;f++)
	{
		for (int c=0;c<M;c++)
			cin>>M1[f][c];
		cout<<endl;
	}
 
	for (int f=0;f<N;f++)
	{
		for (int c=0;c<M;c++)
			cout<<setw (4)<<M1[f][c];
		cout<<endl;
	}
 
	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: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con practico de c++

Publicado por aguml (522 intervenciones) el 26/10/2015 00:22:38
Para saber si es par o impar se usa el cálculo del modulo entre 2. O sea:
1
2
3
4
5
6
if (array [i][j]==0)
   ceros++
else if (array [i][j]%2==0)
   pares++;
else
   impares++;
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

Ayuda con practico de c++

Publicado por Tito (3 intervenciones) el 26/10/2015 00:43:51
Pero si es un contador de pares impares y elementos nulos no deberia usarse un for en todo caso ? y como seria la funcion entonces?
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
Imágen de perfil de emma

Ayuda con practico de c++

Publicado por emma (2 intervenciones) el 26/10/2015 03:13:20
Lograste terminarlo?Subi lo que hiciste para verlo.
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++

Ayuda con practico de c++

Publicado por aguml (522 intervenciones) el 26/10/2015 08:00:40
Una función para eso no tiene misterio:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void parimpar (int *array, int filas, int columnas, int *pares,  int *impares, int *nulos)
{
   *pares=0;
   *impares=0;
   *nulos=0;
   for (i=0;i<filas;i++)
      for (j=0;j <columnas;j++)
         if (array [i][j]==0)
            *nulos++
         else if (array [i][j]%2==0)
            *pares++;
         else
            *impares++;
}
Sí te fijas veras que filas y columnas los paso como valor y pares, impares, y nulos los paso como referencia. Eso es así porque necesito retornar las tres y haciéndolo por referencia modifico su valor y al salir de la función no se pierde mientras que filas y columnas al salir de la función, aunque los modifique dentro de ella no cambiarían su valor al salir porque realmente lo que le estoy pasando es una copia cuyo ámbito es solo la función.
Para usarla:
1
2
3
4
int array [5][5];
int p,i,n;
...
paresimpares ((int*)array, 5, 5, &p, &i, &n);
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

Ayuda con practico de c++

Publicado por Franco (2 intervenciones) el 26/10/2015 10:59:02
Como quedaría el codigo completo? No me doy cuenta donde ubicar lo de par-impar...
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

Ayuda con practico de c++

Publicado por Tito (3 intervenciones) el 26/10/2015 11:38:51
asi quedaria esta parte entonces, lo acomode de forma que quede mas prolijo, lo que si me da error en el array M1 y no se porque me dice como que no esta declarada la variable

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
#include <iostream>
#include <iomanip>
using namespace std;
const int M=4;
void parimpar (int *array, int filas, int columnas, int *pares,  int *impares, int *nulos);
 
int main()
{
	int N=0;
	cout<<"Ingrese numero de filas para su matriz"<<endl<<endl;
	cin>>N;
	cout<<endl;
	if(N>M)
		cout<<"El valor ingresado es mayor que el numero de columnas"<<endl;
	else
		cout<<"ingrese un nuevo numero: ";
		cin>>N;
 
	cout<<endl;
 
	int M1 [N][M];
 
	for (int f=0;f<N;f++)
	{
		for (int c=0;c<M;c++)
			cin>>M1[f][c];
		cout<<endl;
	}
 
		for (int f=0;f<N;f++)
	{
		for (int c=0;c<M;c++)
			cout<<setw (4)<<M1[f][c];
		cout<<endl;
	}
 
	int PAR,IMPAR,NULOS;
	parimpar ((int*)M1, N, M, &PAR, &IMPAR, &NULOS);
 
	system("pause");
	return 0;
}
 
void parimpar (int *array, int filas, int columnas, int *pares,  int *impares, int *nulos)
{
   *pares=0;
   *impares=0;
   *nulos=0;
	for (int i=0;i<filas;i++)
	{
		for (int j=0;j <columnas;j++)
		{	if (M1 [i][j]==0)
    	                *nulos++;
    		else if (M1 [i][j]%2==0)
        		*pares++;
        	else
        		*impares++;
		}
	}
}
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++

Ayuda con practico de c++

Publicado por agustin (522 intervenciones) el 26/10/2015 13:14:23
Tito no puedes crear un array estatico a partir de una variable, tiene que ser a partir de una constante y N no es constante. Si quieres hacer eso tienes que usar malloc o calloc en C o new en C++.

Prueba esto:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <stdio.h>
#include <string.h>
#define M 4 //Columnas
#define FILAS 4
 
void rellenarArray(int filas, int columnas, int array[][M]);
int paresimpares(int valor);
void filas(int array[][M], int columnas);
void suma(int array[][M], int columnas);
 
int main()
{
   int array[FILAS][M]={0};
   int N;
   int c,f,retorno;
   int pares=0,impares=0,nulos=0;
 
   printf("Ingresa el numero de columnas(N): ");
   scanf("%d",&N);
 
   if(N > 0 && N <= M){
      rellenarArray(FILAS, N, array);
 
      for (c=0;c<N;c++)
         for (f=0;f<FILAS;f++)
            switch(paresimpares(array[f][c])){
               case 0:
                  nulos++;
                  break;
               case 1:
                  impares++;
                  break;
               case 2:
                  pares++;
                  break;
            }
      printf("Cantidad de elementos pares: %i\nCantidad de elementos impares: %i\nCantidad de elementos nulos: %i\n",pares,impares,nulos);
      filas(array,N);
      suma(array,N);
   }else{
      printf("\nEl valor introducido no es valido\n");
   }
   return 0;
}
 
void rellenarArray(int filas, int columnas, int array[][M])
{
   int x,y;
   for(x=0;x<columnas;x++){
      for(y=0;y<filas;y++){
         printf("Introduce el valor para array[%i][%i]: ",y,x);
         scanf("%i",&array[y][x]);
      }
   }
}
 
int paresimpares(int valor)
{
   int retval;
 
   if(valor == 0)
      retval=0;
   else if(valor%2 == 0)
      retval=2;
   else
      retval=1;
 
   return retval;
}
 
void filas(int array[][M], int columnas)
{
   float promedioFilasPares=0,promedioFilasImpares=0;
   int x,y;
 
   for(y=0;y<FILAS;y++){
      for(x=0;x<columnas;x++){
         if(y%2==0){
            if(array[y][x] > 0){
               promedioFilasPares += array[y][x];
            }
         }else{
            if(array[y][x] > 0){
               promedioFilasImpares += array[y][x];
            }
         }
      }
   }
   promedioFilasPares /=FILAS;
   promedioFilasImpares /=FILAS;
   printf("Promedio de elementos mayores que 0 en filas pares: %f\n", promedioFilasPares);
   printf("Promedio de elementos mayores que 0 en filas impares: %f\n", promedioFilasImpares);
}
 
void suma(int array[][M], int columnas)
{
   FILE *archivo;
   char nombre[1024]={0}, salida[1000]={0}, sig[25];
   int sumaCol;
   int arraySumas[M]={0};
   int x,y;
 
   printf("Introduce el nombre para el archivo de salida: ");
   fflush(stdin);
   fgets(nombre,1023,stdin);
   nombre[strlen(nombre)-1]='\0';
   archivo=fopen(nombre,"w");
   if(archivo != NULL){
      for(x=0;x<columnas;x++){
         sumaCol=0;
         for(y=0;y<FILAS;y++){
            if(array[y][x] > 0){
               sumaCol += array[y][x];
               if(y < FILAS - 1){
                     sprintf(sig, "%i + ",array[y][x]);
                     strcat(salida,sig);
               }else{
                  sprintf(sig,"%i = %i",array[y][x],sumaCol);
                  strcat(salida,sig);
               }
            }
         }
         printf("Suma de elementos mayores que 0 en la columna %i: %s\n", x, salida);
         fprintf(archivo,"Suma de elementos mayores que 0 en la columna %i: %s\n", x, salida);
         memset(salida,'\0',1000);
         arraySumas[x]=sumaCol;
      }
      for(x=0;x<columnas;x++){
         printf("Suma de elementos mayores que 0 en la columna %i: %i\n", x, arraySumas[x]);
         fprintf(archivo,"Suma de elementos mayores que 0 en la columna %i: %i\n", x, arraySumas[x]);
      }
      fclose(archivo);
   }
}

La funcion de sumar las columnas no tengo muy claro a que se refiere con eso de "guardarlos en un array" ¿guardar las sumas de cada columna en un array? ¿guardar los valores que no sean 0 de cada columna en un array?...
Yo lo resuelvo de dos maneras parecidas pero diferente en la misma funcion.
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

Ayuda con practico de c++

Publicado por Andres (2 intervenciones) el 26/10/2015 13:29:00
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include<iostream>
#include<fstream>
#include<string>
 
using namespace std;
const int M = 100;
int k=0, i=0;
int parimpar(int );
void filas(int Ma[4][M], int a);
void guardararchivo(string nombre, int Ma[4][M], int N);
int main()
{
	int Ma[4][M], Au, Par=0, Imp=0, C=0, N=101;
	string nombre;
	while(N>M || N<=0)
	{
		cout<<"Ingrese la cantidad de columnas para la matriz: ";
		cin>>N;
		if(N>M || N<=0)
			cout<<"Matriz fuera de rango, favor de reintentar."<<endl;
	}
	for(k=0; k<N;k++)
	{
		for(i=0;i<4;i++)
		{
			cout<<"Ingrese el valor "<<i<<" de la columna "<<k<<": ";
			cin>>Ma[i][k];
		}
	}
 
	cout<<"La matriz ingresada es: "<<endl;
 
	for(i=0;i<4;i++)
	{
		for(k=0; k<N;k++)
		{
			cout<<Ma[i][k]<<" ";
		}
		cout<<endl;
	}
 
	for(i=0;i<4;i++)
	{
		for(k=0;k<N;k++)
		{
			Au=Ma[i][k];
			if((parimpar(Au))==0)
				C++;
			else if((parimpar(Au))==1)
				Imp++;
			else
				Par++;
		}
	}
	cout<<"Pares: "<<Par<<endl<<"Impares: "<<Imp<<endl<<"Ceros: "<<C<<endl;
 
	filas(Ma,N);
 
	cout<<"Indique nombre de archivo para almacenar la siguiente información: ";
	cin>>nombre;
	guardararchivo(nombre,Ma, N);
 
	system("pause");
	return 0;
}
 
int parimpar(int Au)
{
 
	if(Au==0)
		return 0;
	else if(Au%2!=0)
		return 1;
	else
		return 2;
 
}
void filas(int Ma[4][M], int a)
{
	float PrP=0, PrI=0;
	int AuxI=0, AuxP=0;
	for(i=0;i<4;i++)
	{
		for(k=0; k<a;k++)
		{
			if(Ma[i][k]>0)
			{
				if((i)%2==0)
				{
					PrP+=Ma[i][k];
					AuxP++;
				}
				else
				{
					PrI+=Ma[i][k];
					AuxI++;
				}
			}
		}
	}
	PrI=(PrI/AuxI);
	PrP=(PrP/AuxP);
	if(AuxI>0)
		cout<<"Promedio de elementos mayores que 0 en filas pares: "<<PrP<<endl;
	else
		cout<<"No hay elementos mayores a 0 en las filas pares"<<endl;
	if(AuxP>0)
		cout<<"Promedio de elementos mayores que 0 en filas impares: "<<PrI<<endl;
	else
		cout<<"No hay elementos mayores a 0 en las filas impares"<<endl;
	return;
}
 
void guardararchivo(string nombre, int Ma[4][M],int a)
{
	ofstream arch1;
	int suma;
	arch1.open(nombre.c_str());
	cout<<"Suma de los elementos mayores que cero de cada columna"<<endl;
	arch1<<"Suma de los elementos mayores que cero de cada columna"<<endl;
	if (!arch1.good())
	{
		cout<<endl<<"Error al momento de crear el archivo.";
		return;
	}
	for(k=0; k<a;k++)
	{
		suma=0;
		for(i=0;i<4;i++)
		{
			if(Ma[i][k]>0)
			{
				suma+=Ma[i][k];
			}
		}
		cout<<suma<<" ";
		arch1<<suma<<" ";
	}
	arch1.close();
	return;
}

Es lo que hice yo Tito, no muy optimizado como ya te dije, pero corre y funciona
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