martes, 23 de junio de 2015

Matriz por vector en lenguaje C

En esta entrada de tutoriales en C aprenderemos a programar funciones conjuntamente con matrices, las mismas que son enviadas por el método de paso por dirección; es decir, los cambios realizadas en las funciones a estas matrices se vera reflejada en el punto de invocación (main) alterando así la información que estas matrices mantienen.


Enunciado del problema a resolver     

Ejercicio realizado en C, el cual permite ingresar una matriz de M x N elemenos y multiplicar por un Vector, para este ejercicio se utilizan funciones las cuales van a invocarse varias veces para aprovechar su re-utilización. 

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>

int leer_entero(char mensaje[50], int min, int max)
{
 int dato;
 do
 {
  printf("%s",mensaje);
  scanf("%d",&dato);
 }
 while(dato<min||dato>max);
 
 return dato; 
}
 
void leer_matriz(int m[50][50],int f,int c)
{
 srand(time(NULL));
 for(int i=0;i<f;i++)
 {
  for(int j=0;j<c;j++)
  {
   m[i][j]=1+rand()%(100);
  }
 }
}

void leer_arreglo(int v[50], int numero)
{
 srand(time(NULL));
 for(int i=0;i<numero;i++)
 {
  v[i]=1+rand()%(10);
 }
}

void multiplicar(int m[50][50], int f, int c, int v[50], int numero, int resultado[50])
{
 int acumulador;
 
 for(int i=0;i<f;i++)
 {
  acumulador=0;
  for(int j=0;j<c;j++)
  {
   acumulador=acumulador+(m[i][j]*v[j]);
  }
  resultado[i]=acumulador;
 } 
}

void imprimir_matriz(int m[50][50], int f, int c)
{
 printf("\n\n----Matriz---\n\n");
 for(int i=0;i<f;i++)
 {
  for(int j=0;j<c;j++)
  {
   printf("%3d\t",m[i][j]);
  }
  printf("\n");
 }
}

void imprimir_arreglo(int v[50], int numero)
{
 printf("\n\n----Vector---\n\n");
 for(int i=0;i<numero;i++)
 {
  printf("%3d\t",v[i]);
 }
}

int main()
{
 int matriz[50][50];
 int vector[50];
 int resultado[50];
 
 int filas=leer_entero("Ingrese el numero de filas: ",1,50);
 int columnas=leer_entero("Ingrese el numero de columnas :",1,50);
 int tamano_vector=leer_entero("Ingrese el tamaño del vector: ",1,50);
 
 leer_matriz(matriz,filas,columnas);
 imprimir_matriz(matriz,filas,columnas);
 leer_arreglo(vector,tamano_vector);
 imprimir_arreglo(vector,tamano_vector);
 
 if(columnas==tamano_vector)
 {
  multiplicar(matriz,filas,columnas,vector,tamano_vector,resultado);
  imprimir_arreglo(resultado,filas);
 }
 else
 {
  printf("\n\nNo se puede multiplicar, no sea ignorante.");
 }
 
 getch();
 return 0;
}


Cualquier duda escriba un comentario para poder despejarla, 

Matrices en lenguaje C/C++ con funciones

Vamos a realizar un programa con funciones el cual permita ingresar datos en una matriz y calcule la matriz simétrica y antisimétrica:

#include<stdio.h>
#include<conio.h>

int leer_entero(char mensaje[50],int min, int max){
 int dato;
 do{
  printf("%s\n",mensaje);
  scanf("%d",&dato);
 }while(dato<min||dato>max);
 return dato;
}

float leer_float(char mensaje[50],float min, float max){
 float dato;
 do{
  printf("%s\n",mensaje);
  scanf("%f",&dato);
 }while(dato<min||dato>max);
 return dato;
} 


void leer_matriz(float m[50][50],int fila,int col){
 for(int f=0;f<fila;f++){
  for(int c=0;c<col;c++){
           m[f][c]=leer_float("Ingrese un valor: ",-32768.0,32767.0);   
  }
 }
 
}

void imprimir_matriz(float m[50][50],int fila,int col){
 
 for(int f=0;f<fila;f++){
  for(int c=0;c<col;c++){
   printf("%8.2f",m[f][c]);
  }
  printf("\n");
 }
}

void obtener_simetrica(float m[50][50],int fila, int col,float s[50][50]){
         for(int f=0;f<fila;f++)
         {
          for(int c=0;c<col;c++){
           s[f][c]=(m[f][c]+m[c][f])/2.0;
          }
         }
}

void obtener_antisimetrica(float m[50][50],int fila, int col,float a[50][50]){
         for(int f=0;f<fila;f++)
         {
          for(int c=0;c<col;c++){
           a[f][c]=(m[f][c]-m[c][f])/2.0;
          }
         }
}

int main(){
 float matriz[50][50];
 float simetrica[50][50];
 float antisimetrica[50][50];
 int fila,columna;
 
 fila=leer_entero("Ingrese el numero de filas: ",1,50);
 columna=fila; //las filas y columnas deben ser iguales en matiz cuadrada
 
 printf("lectura de matriz\n");
 leer_matriz(matriz,fila,columna);
 printf("Impresion matriz original\n");
 imprimir_matriz(matriz,fila,columna);
 obtener_simetrica(matriz,fila,columna,simetrica);
 printf("Impresion matriz simetrica\n");
 imprimir_matriz(simetrica,fila,columna);
 obtener_antisimetrica(matriz,fila,columna,antisimetrica);
 printf("Impresion matriz antisimetrica\n");
 imprimir_matriz(antisimetrica,fila,columna);
 
}