Ejercicios en C++
1) Matriz Mágica de 3x3
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
bool esMagica(int matriz[3][3], int largo);
/*
*
*/
int main(int argc, char** argv) {
int matriz[3][3];
int i, j;
int largo = 3;
/**
*
* Llenar la matriz
*/
for (i = 0; i < largo; i++) {
for (j = 0; j < largo; j++) {
cout << "\nIngrese el valor de Matriz[" << i << "][" << j << "]: ";
int valor;
cin >> valor;
matriz[i][j] = valor;
}
}
if (esMagica(matriz, 3)) {
cout << "\n La matriz es magica" << endl;
} else {
cout << "\n La matriz NO es magica" << endl;
}
return 0;
}
bool esMagica(int matriz[3][3], int largo) {
bool ok = false;
int i;
if (largo == 3) {
int sumaFilaUno = 0;
int sumaFilaDos = 0;
int sumaFilaTres = 0;
int sumaColumnaUno = 0;
int sumaColumnaDos = 0;
int sumaColumnaTres = 0;
int sumaDiagonalUno = 0;
int sumaDiagonalDos = 0;
// Suma de la Fila 1
for (i = 0; i < largo; i++) {
sumaFilaUno = sumaFilaUno + matriz[0][i];
}
// Suma de la Fila 2
for (i = 0; i < largo; i++) {
sumaFilaDos = sumaFilaDos + matriz[1][i];
}
// Suma de la Fila 3
for (i = 0; i < largo; i++) {
sumaFilaTres = sumaFilaTres + matriz[2][i];
}
// Suma de la Columna 1
for (i = 0; i < largo; i++) {
sumaColumnaUno = sumaColumnaUno + matriz[i][0];
}
// Suma de la Columna 2
for (i = 0; i < largo; i++) {
sumaColumnaDos = sumaColumnaDos + matriz[i][1];
}
// Suma de la Columna 3
for (i = 0; i < largo; i++) {
sumaColumnaTres = sumaColumnaTres + matriz[i][2];
}
// Suma Diagonal 1
sumaDiagonalUno = (matriz[0][0] + matriz[1][1] + matriz[2][2]);
sumaDiagonalDos = (matriz[2][0] + matriz[1][1] + matriz[0][2]);
if (sumaFilaUno == sumaFilaDos) {
if (sumaFilaTres == sumaFilaDos) {
if (sumaFilaTres == sumaColumnaUno) {
if (sumaColumnaUno == sumaColumnaDos) {
if (sumaColumnaTres == sumaColumnaDos) {
if (sumaColumnaTres == sumaDiagonalUno) {
if (sumaDiagonalUno == sumaDiagonalDos) {
ok = true;
}
}
}
}
}
}
}
} else {
cout << "\nSolo soporta matrices de 3x3" << endl;
}
return ok;
}
2) Operaciones con Matrices (Calculadora de Matrices)
#include <iostream>
#include <cstdlib>
using namespace std;
/**
* Función que determina la selección de un usuario
* @return
*/
int menuPrincipal();
/**
* Limpia la pantalla, llamando a comandos de sistema operativo.
*/
void limpiarPantalla();
/**
int** crearMatriz(int filas, int columnas);
int** llenarMatriz(int filas, int columnas);
/**
* Imprime una matriz en pantalla.
* @param matriz Puntero a la matriz.
* @param filas Cantidad de Filas.
* @param columnas Cantidad de Columnas.
*/
void imprimirMatriz(int** matriz, int filas, int columnas);
/**
* Elimina la memoria usada por la matriz.
* @param matriz Puntero a la matriz.
* @param filas Cantidad de Filas.
* @param columnas Cantidad de Columnas.
*/
void eliminarMatriz(int** matriz, int filas, int columnas);
/**
* Realiza una suma de matrices.
* @param primera Primera Matriz.
* @param filasPrimera Filas de la primera matriz.
* @param columnasPrimera Columnas de la primera matriz.
* @param segunda Segunda Matriz.
* @param filasSegunda Filas de la segunda Matriz.
* @param columnasSegunda columnas de la segunda Matriz.
* @param filasRespuesta Cantidad de filas de respuesta.
* @param columnasRespuesta Cantidad de columnas de respuesta.
* @return Una Matriz
*/
int**
sumarMatrices(int** primera, int filasPrimera, int columnasPrimera,
int** segunda, int filasSegunda, int columnasSegunda, int
*filasRespuesta, int *columnasRespuesta);
/**
* Realiza una resta de matrices.
* @param primera Primera Matriz.
* @param filasPrimera Filas de la primera matriz.
* @param columnasPrimera Columnas de la primera matriz.
* @param segunda Segunda Matriz.
* @param filasSegunda Filas de la segunda Matriz.
* @param columnasSegunda columnas de la segunda Matriz.
* @param filasRespuesta Cantidad de filas de respuesta.
* @param columnasRespuesta Cantidad de columnas de respuesta.
* @return Una Matriz
*/
int**
restarMatrices(int** primera, int filasPrimera, int columnasPrimera,
int** segunda, int filasSegunda, int columnasSegunda, int
*filasRespuesta, int *columnasRespuesta);
/**
* Multiplica la matriz por un escalar
* @param escalar Número a Multiplicar
* @param primera Matriz
* @param filasPrimera Filas
* @param columnasPrimera columnas
* @return una Matriz de Resultado
*/
int**
multiplicarEscalarMatrices(int escalar, int** primera, int
filasPrimera, int columnasPrimera, int *filasRespuesta, int
*columnasRespuesta);
/**
* Realiza una multiplicación de matrices.
* @param primera Primera Matriz.
* @param filasPrimera Filas de la primera matriz.
* @param columnasPrimera Columnas de la primera matriz.
* @param segunda Segunda Matriz.
* @param filasSegunda Filas de la segunda Matriz.
* @param columnasSegunda columnas de la segunda Matriz.
* @param filasRespuesta Cantidad de filas de respuesta.
* @param columnasRespuesta Cantidad de columnas de respuesta.
* @return Una Matriz
*/
int**
multiplicarMatrices(int** primera, int filasPrimera, int
columnasPrimera, int** segunda, int filasSegunda, int columnasSegunda,
int *filasRespuesta, int *columnasRespuesta);
/**
* Cuerpo del programa.
* @param argc Cantidad de argumentos pasados por la línea de comandos
* @param argv Matriz con los argumentos de la línea de comandos.
* @return Un código de Salida
*/
int main(int argc, char** argv) {
int seleccion = 99;
int numero;
int filasUno, filasDos, filasResultado;
int columnasUno, columnasDos, columnasResultado;
int **uno, **dos, **resultado;
while (seleccion != 0) {
// Selecciono una opción
seleccion = menuPrincipal();
switch (seleccion) {
case 0:
limpiarPantalla();
cout << "\n Tarea computacional desarrollada por Guillermo Salazar Molina" << endl;
break;
case 1:
// Llenamos Matriz uno
limpiarPantalla();
cout << "\nLlenando matriz UNO" << endl;
cout << "\n Ingrese la cantidad de filas: ";
cin >> filasUno;
cout << "\n Ingrese la cantidad de Columnas: ";
cin >> columnasUno;
uno = llenarMatriz(filasUno, columnasUno);
imprimirMatriz(uno, filasUno, columnasUno);
break;
case 2:
// Llenamos Matriz dos
limpiarPantalla();
cout << "\nLlenando matriz DOS" << endl;
cout << "\n Ingrese la cantidad de filas: ";
cin >> filasDos;
cout << "\n Ingrese la cantidad de Columnas: ";
cin >> columnasDos;
dos = llenarMatriz(filasDos, columnasDos);
imprimirMatriz(dos, filasDos, columnasDos);
break;
case 3:
imprimirMatriz(uno, filasUno, columnasUno);
break;
case 4:
imprimirMatriz(dos, filasDos, columnasDos);
break;
case 5:
resultado = sumarMatrices(uno, filasUno, columnasUno, dos, filasDos,
columnasDos, &filasResultado, &columnasResultado);
imprimirMatriz(resultado, filasResultado, columnasResultado);
break;
case 6:
resultado = restarMatrices(uno, filasUno, columnasUno, dos, filasDos,
columnasDos, &filasResultado, &columnasResultado);
imprimirMatriz(resultado, filasResultado, columnasResultado);
break;
case 7:
limpiarPantalla();
cout << "\nIngrese un escalar: ";
cin >> numero;
resultado = multiplicarEscalarMatrices(numero, uno, filasUno,
columnasUno, &filasResultado, &columnasResultado);
imprimirMatriz(resultado, filasResultado, columnasResultado);
break;
case 8:
limpiarPantalla();
cout << "\nIngrese un escalar: ";
cin >> numero;
resultado = multiplicarEscalarMatrices(numero, dos, filasDos,
columnasDos, &filasResultado, &columnasResultado);
imprimirMatriz(resultado, filasResultado, columnasResultado);
break;
case 9:
resultado = multiplicarMatrices(uno, filasUno, columnasUno, dos,
filasDos, columnasDos, &filasResultado, &columnasResultado);
imprimirMatriz(resultado, filasResultado, columnasResultado);
break;
default:
cout << "Opción invalida" << endl;
break;
}
}
eliminarMatriz(uno, filasUno, columnasUno);
eliminarMatriz(dos, filasDos, columnasDos);
eliminarMatriz(resultado, filasResultado, columnasResultado);
return 0;
}
int menuPrincipal() {
int seleccion = 99;
/**
*
* Iteramos hasta que se seleccione una opción válida.
*/
while (seleccion < 0 || seleccion > 9) {
cout << "\n\t Bienvenido a la calculadora de matrices" << endl;
cout << "1\t - Llenar Matriz uno." << endl;
cout << "2\t - Llenar Matriz dos." << endl;
cout << "3\t - Imprimir Matriz uno." << endl;
cout << "4\t - Imprimir Matriz dos." << endl;
cout << "5\t - Sumar Matrices (uno + dos)." << endl;
cout << "6\t - Restar Matrices (uno - dos)." << endl;
cout << "7\t - Multiplicar Matriz UNO por un escalar." << endl;
cout << "8\t - Multiplicar Matriz DOS por un escalar." << endl;
cout << "9\t - Multiplicar Matrices (uno * dos)." << endl;
cout << "0\t - Salir." << endl;
cout << "Seleccione una opcion: ";
cin >> seleccion;
}
return seleccion;
}
void limpiarPantalla() {
if (system("CLS")) {
system("clear");
}
}
int** crearMatriz(int filas, int columnas) {
int** matriz = NULL;
int i, j;
if (filas > 0) {
if (columnas > 0) {
/**
* Una matriz es un arreglo de arreglos, la estrategia es definir
* un arreglo del largo de las filas.
*/
matriz = new int*[filas];
for (i = 0; i < filas; i++) {
// Por cada fila, definimos un arreglo del largo de columnas.
matriz[i] = new int[columnas];
for (j = 0; j < columnas; j++) {
// Relleno con 0
matriz[i][j] = 0;
}
}
}
}
return matriz;
}
int** llenarMatriz(int filas, int columnas) {
int** matriz = NULL;
int i, j;
if (filas > 0) {
if (columnas > 0) {
/**
* Una matriz es un arreglo de arreglos, la estrategia es definir
* un arreglo del largo de las filas.
*/
matriz = new int*[filas];
for (i = 0; i < filas; i++) {
// Por cada fila, definimos un arreglo del largo de columnas.
matriz[i] = new int[columnas];
for (j = 0; j < columnas; j++) {
int valor;
cout << "\n Ingrese el valor para la posicion [" << i << "][ " << j << " ]:";
cin >> valor;
matriz[i][j] = valor;
}
}
}
}
return matriz;
}
void imprimirMatriz(int** matriz, int filas, int columnas) {
int i, j;
limpiarPantalla();
if (matriz != NULL) {
if (filas > 0) {
if (columnas > 0) {
cout << "\n Imprimiendo MATRIZ " << endl;
for (i = 0; i < filas; i++) {
cout << endl;
for (j = 0; j < columnas; j++) {
int valor = matriz[i][j];
cout << "[" << valor << " ]";
}
}
cout << endl;
} else {
cout << "\nMatriz con valor para columnas invalido" << endl;
}
} else {
cout << "\nMatriz con valor para filas invalido" << endl;
}
} else {
cout << "\nMatriz NULA o invalida" << endl;
}
}
void eliminarMatriz(int** matriz, int filas, int columnas) {
if (matriz != NULL) {
if (filas > 0) {
if (columnas > 0) {
for (int i = 0; i < filas; i++) {
// Recorremos las filas y borramos los arreglos internos.
delete [] matriz[i];
}
// Eliminamos la referencia externa.
delete [] matriz;
}
}
}
}
int**
sumarMatrices(int** primera, int filasPrimera, int columnasPrimera,
int** segunda, int filasSegunda, int columnasSegunda, int
*filasRespuesta, int *columnasRespuesta) {
int** resultado = NULL;
int i, j;
if (filasPrimera == filasSegunda && columnasPrimera == columnasSegunda) {
*filasRespuesta = filasPrimera;
*columnasRespuesta = columnasPrimera;
resultado = crearMatriz(filasPrimera, columnasPrimera);
for (i = 0; i < filasPrimera; i++) {
for (j = 0; j < columnasPrimera; j++) {
resultado[i][j] = primera[i][j] + segunda[i][j];
}
}
} else {
cout << "\nNo se cumplen las condiciones para la suma de matrices." << endl;
*filasRespuesta = 0;
*columnasRespuesta = 0;
}
return resultado;
}
int**
restarMatrices(int** primera, int filasPrimera, int columnasPrimera,
int** segunda, int filasSegunda, int columnasSegunda, int
*filasRespuesta, int *columnasRespuesta) {
int** resultado = NULL;
int i, j;
if (filasPrimera == filasSegunda && columnasPrimera == columnasSegunda) {
*filasRespuesta = filasPrimera;
*columnasRespuesta = columnasPrimera;
resultado = crearMatriz(filasPrimera, columnasPrimera);
for (i = 0; i < filasPrimera; i++) {
for (j = 0; j < columnasPrimera; j++) {
resultado[i][j] = primera[i][j] - segunda[i][j];
}
}
} else {
cout << "\nNo se cumplen las condiciones para la resta de matrices." << endl;
*filasRespuesta = 0;
*columnasRespuesta = 0;
}
return resultado;
}
int**
multiplicarEscalarMatrices(int escalar, int** primera, int
filasPrimera, int columnasPrimera, int *filasRespuesta, int
*columnasRespuesta) {
int** resultado = NULL;
int i, j;
if (filasPrimera > 0 && columnasPrimera > 0) {
*filasRespuesta = filasPrimera;
*columnasRespuesta = columnasPrimera;
resultado = crearMatriz(filasPrimera, columnasPrimera);
for (i = 0; i < filasPrimera; i++) {
for (j = 0; j < columnasPrimera; j++) {
resultado[i][j] = primera[i][j] * escalar;
}
}
} else {
cout << "\nNo se cumplen las condiciones para la multiplicacion escalar de matrices." << endl;
*filasRespuesta = 0;
*columnasRespuesta = 0;
}
return resultado;
}
int**
multiplicarMatrices(int** primera, int filasPrimera, int
columnasPrimera, int** segunda, int filasSegunda, int columnasSegunda,
int *filasRespuesta, int *columnasRespuesta) {
int** resultado = NULL;
int i, j, k;
if (columnasPrimera == filasSegunda) {
*filasRespuesta = filasSegunda;
*columnasRespuesta = columnasPrimera;
resultado = crearMatriz(filasPrimera, columnasPrimera);
for (i = 0; i < filasPrimera; i++) {
for (j = 0; j < columnasSegunda; j++) {
for (k = 0; k < columnasPrimera; k++) {
resultado[i][j] = resultado[i][j] + (primera[i][k] * segunda[k][j]);
}
}
}
} else {
cout << "\nNo se cumplen las condiciones para la multiplicacion de matrices." << endl;
*filasRespuesta = 0;
*columnasRespuesta = 0;
}
return resultado;
}
No hay comentarios:
Publicar un comentario