UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE CIENCIAS HUMANAS Y DE LA EDUCACIÓN
CARRERA DE DOCENCIA EN INFORMÁTICA
PROGRAMACIÓN ESTUDIANTE: Amancha María Elena TERCERO “U” INFORMÁTICA
SEPTIEMBRE, 2011
1.- DEFINICIONES GENERALES ARREGLOS (VECTORES Y MATRICES) Introducción. Los vectores y matrices son uno de los medios principales mediante los cuales se almacenan los datos en un programa. En esta práctica veremos todos los conceptos relativos a la creación y manejo en C de vectores, matrices y cadenas de caracteres. Un Arreglo es una estructura de datos que almacena bajo el mismo nombre (variable) a una colección de datos del mismo tipo. Los arreglos se caracterizan por: Almacenan los elementos en posiciones contiguas de memoria Tienen un mismo nombre de variable que representa a todos los elementos. Para hacer referencia a esos elementos es necesario utilizar un índice que especifica el lugar que ocupa cada elemento dentro del archivo. Acceso directo o aleatorio a los elementos individuales del arreglo. Ej: Notas[5]=15; Tipo de Arreglos Unidimensionales, también llamados Vectores o listas
2
Bidimensionales, denominados tablas o Matrices
Multidimensionales, con tres o más dimensiones
3
VECTORES Un arreglo de una dimensión (vector o lista) es un tipo de datos estructurado compuesto de un número de elementos finitos, consecutivos de tamaño fijo y elementos homogéneos. Finito indica que el arreglo tiene un número determinado de elementos. Consecutivo que se almacena en posiciones consecutivas de memoria, Tamaño Fijo significa que el tamaño del arreglo debe ser conocido en tiempo de compilación, Homogéneo significa que todos los elementos son del mismo tipo. Como hemos dicho, el vector es un arreglo de “N” elementos organizados en una dimensión donde “N” recibe el nombre de longitud o tamaño del vector.
Para hacer referencia a un elemento del vector se usa el nombre del mismo, seguido del índice (entre corchetes), el cual indica una posición en particular del vector. Por ejemplo: Vec[x] Donde: Vec………… Nombre del arreglo x…………… Numero de datos que constituyen el arreglo Cada localidad almacena un elemento del vector. En C los elementos de un vector están numerados desde 0 hasta N-1. Algunos otros lenguajes comienzan en 1.
4
Declaración de un Vector Notación algorítmica Tipo_De_Dato Nombre_Del_Vector [número_Elementos] ejemplo: entero notas[43] carácter código[4]
Notación en lenguaje C Tipo_De_Dato Nombre_Del_Vector [número_Elementos] ejemplo: int notas[43]; char código[4]; Acceso a los elementos de un Vector Para manejar cualquiera de los elementos de un vector se utilizan los subíndices. Por ejemplo para asignar un valor al primer elemento de un vector se utiliza la siguiente sentencia: números[0] = 20; El valor del subíndice puede variar entre 0 y N-1, siendo N el tamaño del vector, es decir, el número de elementos que tiene el vector. El subíndice puede ser construido utilizando expresiones aritméticas enteras. Por ejemplo: notas[x-y+1] = 18; En general para tener acceso al i-ésimo elemento de un vector se utiliza: vector[i-1] Recorrido de un Vector El Bucle For es apropiado para arrays con un índice numérico. Si no hemos definido índices a nuestro array, por defecto será numérico. Requiere tres parámetros, el primero es dónde empieza a contar, el segundo hasta cuándo, o sea el límite y el tercero las variaciones que va sufriendo la variable en cada iteración. 5
Por ejemplo: Secuencia Donde inicia el lazo
for (i=0; { notas[i] = 18; }
de
repetición de 1 en 1
i<N;
i++)
El límite o hasta donde llega el bucle
for (i=0; i<N; i++) { scanf(“%i”, num[i]); } Por ejemplo, la declaración: int A[4]; define un array de tipo entero de dimensión 4. Y ya podríamos acceder al primer componente del array por medio de: A[0], al segundo elemento por: A[1] y al último elemento por A[3]. Operaciones con Vectores 1. Lectura de un vector for (int i=0; i<N; i++) { Scanf(“%d”,&Notas[i]); } 2. Escritura de un vector for (int i=0; i<N; i++) { printf(“Notas[%d]= %d”, I, Notas[i]); } 3. Búsqueda Lineal (Secuencial) {no ordenados} Binaria para arreglos ordenados 4. Ordenamiento 6
Inserción, Selección, Burbuja o Intercambio, Shell, Quicksoft (Ordenación rápida), Ordenación por Fusión o Mezcla. 5. Inserción y Eliminación
MATRICES Una matriz es una estructura de datos, o más técnicamente, un espacio de memoria que permite almacenar una colección de elementos, todos del mismo tipo. La diferencia con los arreglos está en que, en las matrices, los elementos no están organizados linealmente sino que su organización es bidimensional, es decir, en filas y columnas. Conviene imaginar una matriz como una organización de celdas de memoria, o casillas, en cada una de las cuales se puede guardar un elemento de la colección. Además, es usual dibujarla como lo ilustra la figura siguiente:
Esta figura representa un matriz de cuatro filas (numeradas verticalmente de 0 a 3) y seis columnas (numeradas horizontalmente de 0 a 5). En cada una de las 24 celdas o casillas se puede guardar un dato. La dimensión o tamaño de una matriz es el número filas por el número de columnas. Debe ser claro entonces que la figura anterior es la gráfica de una matriz de dimensión 4x6. La numeración de las filas y las columnas determina que cada una de las casillas de una matriz tiene asociados dos números que la identifican de manera única. A estos números se les llama índice de 7
fila e índice de columna, respectivamente. En el seudolenguaje, y también en C y C++, las filas y las columnas se numeran desde 0.
Los índices se crearon para permitir que el programador se pueda referir, de forma específica y directa, a una cualquiera de las casillas de la matriz, tanto para guardar un dato en esa casilla, como para obtener el dato almacenado en ella. En el seudolenguaje, para referirse a una casilla particular de una matriz se debe seguir el siguiente formato: <NOMBRE>[<INDICE-DE-FILA>][<INDICE-DE-COLUMNA>] es decir, se debe escribir el nombre de la matriz seguido por el índice de fila y por el índice de columna, ambos entre paréntesis cuadrados, de la casilla que se quiere consultar. Declaración de una Matriz Las matrices se declaran de forma análoga, con corchetes independientes para cada subíndice. La forma general de la declaración es: Tipo nombre [número_filas] [número_columnas]; int nombre[f][c]…; donde: f,c...>= 1; Para acceder a un elemento del array multidimensional: nombre[i][j]; 8
donde: 0 <= i < f ; 0 <= j < c; La forma de acceder a los elementos de la matriz es utilizando su nombre, seguido de las expresiones enteras correspondientes a los dos subĂndices, entre corchetes. En C++ tanto los vectores como las matrices admiten los tipos de las variables escalares (char, int, long, float, doublĂŠ, etc.).
Recorrido de un matriz El recorrido de las matrices puede realizarse tanto por filas como por columnas. Para recorrer una matriz necesitamos dos bucles anidados. Por ejemplo, si se desea recorrer todos los elementos de la matriz A por filas, se escribirĂĄn dos sentencias for anidadas:
9
2.- APLICACIONES APLICACIÓN Nº 1: Enunciado Validar el ingreso de datos entre 13 y 28. Ingrese n datos dentro de un vector y visualícelos en pantalla. Análisis El programa valida el ingreso de datos por teclado con un lazo do while, esta validación está entre 13 y 28, de tal forma que se cumpla while(v[i]<13 ||v[i]>=28);para ingresar los datos al vector usamos un bucle for en donde se la sentencia gotoxy(c,f1);scanf("%d",&v[i]) permite el ingreso del vector y de igual forma para imprimir utilizamos un lazo for, pero la sentencia ahora es: gotoxy(c+20,f2);printf("%d",v[i]); usamos “%d” pues los datos son enteros y el vector a imprimir será v[i]. Finalmente el programa cierra sin antes cerrar el lazo do/while para salir o no del programa, y luego se cierra el programa void main con un getch() y la llave de cierre general. Desarrollo #include<stdio.h>
//ingreso de librerías
#include<conio.h> void main()
//inicia programa principal
{ int x,i,l,v[20],f1,f2,c,m,b;
//declaración de variables y vector de 20
elementos clrscr();
//borrado de pantalla
flushall(); do{
//lazo do para elección de salida
for(b=1;b<=80;b++)
//diseño de borde
{ gotoxy(b,3);printf("*"); gotoxy(b,50);printf("*"); } for(b=1;b<=50;b++) 10
{ gotoxy(1,b);printf("*"); gotoxy(80,b);printf("*"); } gotoxy(30,3);printf("Ingreso y Salida de Vectores"); //visualización
de
títulos gotoxy(8,5);printf("Ingrese el l¡mite: ");scanf("%d",&l);
//ingreso de
datos por teclado f1=10; f2=10; c=15; for(i=1;i<=l;i++) { do{
//lazo do para hacer la validación
gotoxy(8,8);printf("Datos de Entrada"); gotoxy(c,f1);scanf("%d",&v[i]); } while(v[i]<13 ||v[i]>=28);
//Validadción de valores
f1=f1+1; } for(i=1;i<=l;i++)
//lazo for para impresión devector
{ gotoxy(28,8);printf("Datos de salida"); gotoxy(c+20,f2);printf("%d",v[i]);
//sentencia
printf
permite
visualizar el vector [i] f2=f2+1;
//situación de filas en aumento
} gotoxy(20,44);printf("Presione 1 para continuar o ");scanf("%d",&x);
0 para salir:
//Aquí elegimos salir o no
} while(x==1);
//cierre del lazo do
}
11
Ejecuci贸n del programa
12
APLICACIÓN Nº 2: Enunciado Diseñar un programa en C que me permita ingresar n elementos en una matriz cuadrática. Análisis: Este es un problema básico, en el cual se enseña a ingresar datos en una matriz y luego imprimirla. En primer lugar damos inicio con las librerías adecuadas stdio.h y conio.h, a continuación iniciamos el programa principal void main() luego de esto abrimos la llave principal del programa, la cual se cerrará al finalizar el mismo. Inicializamos las variables y la matriz , la misma que consta de nombre de matriz y el número de filas y columnas que va encerrado entre corchetes. Para el ingreso de datos a una matriz utilizamos primero el direccionamiento gotoxy que nos da la posición en la hoja de trabajo, y segundo, a través de scanf("%d",& matriz[i][j]) ingresamos los datos deseados. Estos datos están posicionados de manera que haya espaciamiento vertical y horizontal en forma de tabla , esto lo hacemos a través del manejo de filas y columnas, para ello previamente antes de cada for colocamos el valor donde inicia la f de fila y la c de columna. El resultado del programa será la impresión de la misma matriz ingresada, para conseguir esto, utilizamos la sentencia printf("%d",matriz[i][j]), de la misma manera aquí hacemos un manejo de filas y columnas para que la impresión se vea simétrica y ordenada. Colocamos el lazo do/while sólo para que pueda escoger al final la opción de salir o seguir ingresando datos en una nueva matriz. Donde se indican las flechas se abre y cierra el programa principal. Desarrollo: # include<conio.h> //ingreso de librer¡as # include<stdio.h> void main() //se abre programa principal { int matriz[10][10],f,c,i,j,lim,op; //inicializaci¢n de variables y de matriz que tiene 10 filas y 10 columnas (cuadrática) do //se inicializa un lazo do/while para la opción salir o seguir en el programa 13
{ clrscr(); //borrado de pantalla for(i=3;i<=80;i++) //lazo for para realizar un borde { gotoxy(i,3);printf("*"); //borde horizontal superior gotoxy(i,65);printf("*"); //borde horizontal inferior } for(i=1;i<=65;i++) { gotoxy(1,i);printf("*"); //borde vertical izquierdo gotoxy(80,i);printf("*"); //borde vertical derecho } textcolor(11); //damos color al texto de membretes gotoxy(28,5);cprintf("MATRIZ CUADRATICA"); //impresión de títulos gotoxy(10,7);cprintf("ingrese el límite ");scanf("%d",&lim); //lectura de l¡mite gotoxy(8,9);cprintf("INGRESO"); gotoxy(34,9);cprintf("VISUALIZACION"); c=5; //se inicializa filas y columnas f=12; for(i=1;i<=lim;i++) //lazo for anidado para lectura de elementos de matriz { //llave de lazo for para el índice i for(j=1;j<=lim;j++) { //llave que abre lazo de segundo for para índice j gotoxy(c,f);scanf("%d",& matriz[i][j]); //scanf permite la lectura de datos de ingreso de matriz c=c+4; //se mueve columna 4 espacios a la derecha después de cada dato ingresado } //cierre de lazo j f=f+1; //salto a una fila abajo para imprimir otra fila de datos c=5; } //cierre de lazo for i c=35; //terminado el lazo regresamos a la posici¢n original de filas y columnas f=12; for(i=1;i<=lim;i++) //lazo for para la impresión de la matriz { for(j=1;j<=lim;j++) { gotoxy(c,f);printf("%d",matriz[i][j]); //printf permite la impresión de datos c=c+4; } f=f+1; c=35; }
14
gotoxy(4,19);printf("Si desea salir presione 0 caso contrario press 1 ");scanf("%d",&op); } while(op==1); //se cierra el lazo do/while getch(); } //fin de programa, cierre de programa principal
ďƒ˜ EjecuciĂłn del programa
15
APLICACIÓN Nº 3: Enunciado Diseñe un programa que me permita generar n múltiplos de cualquier factor ingresado desde teclado que se encuentre dicho factor entre 2 y 9, la matriz es de orden cuadrática se visualiza la entrada y la salida. Análisis Como otra aplicación del manejo de matrices tenemos la generación e impresión de una matriz que contiene múltiplos de un factor que ingresamos por teclado, como es normal, ingresamos las librerías útiles en esta aplicación, stdio.h y connio.h, a través de void main abrimos el programa principal, declaramos las variables tipo entero (int) y matrices de 10x10. Abrimos el primer lazo do que nos da la opción de salir o seguir dentro del programa, visualización de títulos a través de gotoxy y printf. Se ingresa por teclado el límite de la matriz y el factor a través de la sentencia scanf y &, el factor solo se tomará datos de entre 2 y 9 para esto se usa un lazo do/while cuya sentencia es while(fact<2 || fact>9); a continuación se imprime los vectores de entrada y salida con la sentencia printf. Se maneja filas y columnas recorriendo un espacio a la derecha en columnas y un espacio hacia abajo las filas, para la exacta colocación de datos que se visualizan. Se cierra el lazo do/while interno y luego el externo al último se cierra el programa general.
Desarrollo #include <conio.h> #include <stdio.h>
//incluímos librerías para ingreso e impresión de datos
void main() //iniciamos el contenido del programa { int matriz1[10][10],matriz2[10][10]; //declaración de matrices int fact,mul,op,i,j,limite,x=1,col=10,fil=10; //declaración de variables do{
//abrimos lazo d0/while para selección de salida o seguir en el programa clrscr(); //borrado de pantalla gotoxy(19,4);printf("oo-MATRIZ DE ORDEN CUADRATICA CON MULTIPLOSoo"); //visualización de títulos gotoxy(39,5);printf("MARIA AMANCHA"); 16
gotoxy(9,6);printf("INGRESE EL LIMITE ==> ");scanf("%d",&limite);//ingreso de datos enteros por teclado do{ //se abre un lazo do para selección de datos ingresados solo dentro de un rango gotoxy(36,10);printf(" "); //borrado de datos incorrectos para sobreescritura gotoxy(9,7);printf("INGRESE EL FACTOR ==> ");scanf("%d",&fact); //ingreso del factor por teclado } while(fact<2 || fact>9); //cierre del lazo do for(i=1;i<=limite;i++) //dos for anidados para la visualización de matriz de ingreso { for(j=1;j<=limite;j++) { matriz1[i][j]=fact*x; //operación de la matriz , en donde ésta es igual al producto del factor por la variable x gotoxy(col,fil);printf("%d",matriz1[i][j]); //visualización de matriz resultante x=x+1; //variable x, en aumento 1 a 1 col=col+5; //posicionamiento de columna con aumento de 5 } col=10; fil=fil+1; //las filas aumentan tambien en 1 } col=35; //regresamos a las posiciones originales de filas y columnas fil=10; for(i=1;i<=limite;i++) //dos lazos for para la impresión de matriz1 { for(j=1;j<=limite;j++) { gotoxy(col,fil);printf("%d",matriz1[i][j]); col=col+5; //avance de columnas en 5 } fil=fil+1; //avance de filas en 1 col=35; } gotoxy(10,20);printf("Presione 1 para continuar,0 para salir");scanf("%d",&op); } while(op==1); //cierre de primer lazo do getch(); }
// cierre de programa 17
Ejecución del programa
18
APLICACIÓN Nº 4: Enunciado Diseñe un programa que me permita generar múltiplos de cualquier factor ingresado desde teclado sólo en las diagonales principal y secundaria, las demás posiciones se llenan de ceros. Análisis En este programa se generará los datos en una matriz con los múltiplos de un factor ingresado por teclado. Luego de definir las librerías ya conocidas, declaramos variables y matriz, diseñamos bordes , titulamos con la ayuda de posicionamientos en pantalla hechos con gotoxy, recorremos la matriz y vamos a buscar los elementos presentes solo en la diagonal principal, para lo cual sentenciamos con la condición if(i==J), si es así, escojo estos valores y los imprimo. Caso contrario me imprime ceros. Para la diagonal secundaria debemos escoger la condición: if (i+j=n+1), con estola imprimimos; escogemos los múltiplos que a continuación les siguen a los anteriores y se imprimen en ésta, para ello recorremos la matriz con lazos for. El resto de localidades de memoria se colocan ceros. Los posicionamientos de matrices y diagonales la realizamos con el dimensionamiento de filas y columnas, las cuales varían cada vez que acaba un lazo for, ya que deben regresar a su posición normal o deben aumentar en un determinado valor para que los valores no se sobrescriban. Desarrollo #include<stdio.h> //ingreso de librerías #include<conio.h> void main() { int ma[10][10]; //Declaración de matriz int i,j,op,limite,col,fil,factor,b; //declaración de variables enteras do // lazo do/ while para salir o seguir en programa { clrscr(); // borrado de pantalla //borde// for(i=1; i<=80;i++) //diseño del borde con lazo for { gotoxy(i,1);cprintf("*"); gotoxy(i,5);cprintf("*"); 19
gotoxy(i,35);cprintf("*"); } for(i=1; i<=35;i++) { gotoxy(1,i);cprintf("*"); gotoxy(80,i);cprintf("*"); } textcolor(4); gotoxy(23,3);cprintf("oo--MATRIZ DIAGONAL CON MULTIPLOS--oo"); gotoxy(23,7);printf("**INGRESE EL LIMITE: ");scanf("%d",&limite); //ingreso de límite por teclado gotoxy(23,9);printf("**INGRESE EL FACTOR: ");scanf("%d", &factor); //ingreso del factor deseado col=15; fil=10; for(i=1;i<=limite;i++) //recorrido de la matriz { for(j=1;j<=limite;j++) { if(i==j) //condicionamos la diagonal principal { ma[i][j]=(j*factor); //matriz igualamos al producto dado gotoxy(col,fil);printf("%d",ma[i][j]); //impresión de matriz solo valores de diagonal principal } Else //sentencia de caso contrario { // ma[i][j]= gotoxy(col,fil);printf("0"); en el resto de matriz se imprime el 0 } col=col+5; } col=15; fil=fil+2; } //diagonal secundaria// col=40; //inicialización de filas y columnas fil=12; //20 fil=fil-2; col=col-5; for(i=1;i<=limite;i++) //for para impression de diagonal secundaria { j=(limite+i)*factor; //definición de índice j ma[i][j]=j; textcolor(10); gotoxy(col,fil);cprintf("%d",ma[i][j]); //visualización de matriz con su diagonal secundaria 20
col=col-5; fil=fil+2; } fil=10; //11 col=40; col=col+5; fil=fil+2; textcolor(19); gotoxy(4,24);cprintf("Mar¡a Elena Amancha"); gotoxy(5,28);printf(" Presione 1 para continuar,0 para salir");scanf("%d",&op); //Cierre de lazo do/while y selección de estado salida o seguir en programa }//cierre do// while (op==1); getch(); } // cierre de programa
Ejecución del programa
21
APLICACIÓN Nº 5: Enunciado Diseñe un programa en el que se genera una matriz de las dimensiones de límite cuya diagonal principal contenga los números pares y en la diagonal secundaria contenga los números impares el resto de posiciones de la matriz sean rellenados con ceros. Análisis El presente programa usa funciones, para ello primeramente declaramos las variables globales que nos servirán para todo el programa estas variables globales van colocadas debajo del ingreso de librerías y antes de la declaración de la primera función. En este caso mi primera función es void borde(), abrimos llaves y allí está el detalle del borde que se genera, para terminar la función cerramos la llave. Luego tenemos la función ingreso, donde van los for que me ayudan a generar o lectura de la matriz y el ingreso del límite que se caracteriza por poseer en su sentencia scanf("%d",&l), a través de ello ingreso el límite de mi vector con el cual se generará una matriz cuadrática del orden del límite. Como requisito para que se imprima la diagonal principal tenemos que los subíndices i == j, y con dos lazos for se imprime la matriz, con la condición if (i==j), designamos solo la diagonal principal en la que deben insertarse los numero pares, en la diagonal secundaria los impares y cerramos el programa al final con la función principal y haciendo el llamad a cada una de las funciones insertadas, así como; borde(), ingreso(). Desarrollo # include<conio.h> //ingreso de librerías # include<stdio.h> int i, j, fil, col,x,y,l,f,c,op; //declaración de variables globales y de matrices int matriz[10][10]; void borde() //function borde { for(i=2;i<=80;i++) //diseño del borde { textcolor(11); 22
gotoxy(i,2);cprintf("*"); gotoxy(i,45);cprintf("*"); } for(i=2;i<=45;i++) { gotoxy(2,i);cprintf("*"); gotoxy(80,i);cprintf("*"); } } void ingreso() //function ingreso { clrscr(); textcolor(11); gotoxy(15,5);cprintf("INGRESO LIMITE: ");scanf("%d",&l); //lee datos desde teclado for(f=1;f<=l;f++) //dos lazos for para ingreso de matriz { for(c=1;c<=l;c++) { matriz[f][c]=0; gotoxy(f*3+8,c*2+8);cprintf("%d", matriz[f][c]); //impresión de matriz[f][c] } } x=2; for(f=1;f<=l;f++) //lazos for para la impresión de matriz { for(c=1;c<=l;c++) { if(f==c) //condición para elegir diagonal primaria { matriz[f][c]=x; x=x+2; //x será el número par que se imprimirá en diagonal principal } gotoxy(f*3+8,c*2+8);cprintf("%d", matriz[f][c]); } } x=1; //variables auxiliaries y=l; for(f=1;f<=l;f++) //lazo for para impresión de diagonal secundaria { matriz[y][f]=x; gotoxy(y*3+8,f*2+8);printf("%d", matriz[y][f]); //visualización de valores enteros en diagonal secundaria que son los impares x=x+2; //determinan el valor impar y=y-1; 23
} } void main() //Se inicializa el programa principal { borde(l); //se llama a la función borde do { clrscr(); //borrado de pantalla ingreso(); //se llama a la función ingreso de matriz gotoxy(20,23);printf("Presione 1 para continuar y 0 para salir: ");scanf("%d",&op); // bucle do/while para elección de salir o no del programa } while(op==1); getch(); } //cierre del programa general Ejecución del programa
24
APLICACIÓN Nº 6: Enunciado Diseñe un programa que realice el producto de matrices, en donde se visualice las matrices 1 y 2 y la matriz resultante. Análisis Ingreso de librerías conocidas, declaración de variables globales y de matrices, primera función, void borde, se detalla la operación que desplegará el borde. Función void ingreso donde ingresaremos las matrices y sus elementos por teclado. Función producto donde se realiza la operación de las mismas, se imprimen tres matrices. Función main llama a todas las funciones existentes: borde(), ingreso() , producto() y las titulaciones, se cierra el lazo do/while y se cierra el programa principal.
Desarrollo #include<stdio.h> //inclusión de librerías #include<conio.h> int l,c,c1,c2,f,f1,f2,k,i,j,op,a; //declaración de variables globales int matriz1[10][10],matriz2[10][10],matriz3[10][10]; void borde() //función borde { for(i=1;i<=25;i++) //lazos for para desplegar el borde en sus cuatro lados { gotoxy(1,i);printf("@",i); gotoxy(80,i);printf("@",i); } for(i=1;i<=80;i++) { gotoxy(i,2);printf("@",i); gotoxy(i,25);printf("@",i); } } void ingreso() //función ingreso de matrices { for(i=1;i<=l;i++) { for(j=1;j<=l;j++) { 25
gotoxy(c,f);scanf("%d",&matriz1[i][j]); //lectura de datos ingresados por teclado c=c+5; } c=5; f=f+1; } for(i=1;i<=l;i++) //lazos for para la impresión de la matriz { for(j=1;j<=l;j++) { gotoxy(c1,f1);scanf("%d",&matriz2[i][j]); //posicionamiento e impresión de la matriz c1=c1+5; } c1=25; f1=f1+1; }} void producto() //función que realice el producto de las matrices { for(i=1;i<=l;i++) //lazos para la impresión de la matriz resultante { for(j=1;j<=l;j++) { matriz3[i][j]=0; for(k=1;k<=l;k++) { matriz3[i][j]=matriz3[i][j]+matriz1[i][k]*matriz2[k][j]; //operación de matrices }}} for(i=1;i<=l;i++) { for(k=1;k<=l;k++) { gotoxy(c2,f2);printf("%d",matriz3[i][k]); //impresión de matriz con dos for c2=c2+4; } c2=42; f2=f2+1; }} void main() //function principal { do { clrscr(); //borrado de pantalla borde(); //llamado a la función borde 26
c=5; c1=25; c2=42; f=10; f1=10; f2=10; gotoxy(28,3);printf("PRODUCTO DE MATRICES"); //leyendas o titulaciones gotoxy(10,5);printf("INGRESE UN LIMITE ");scanf("%d",&l); gotoxy(5,7);printf("MATRIZ1"); gotoxy(25,7);printf("MATRIZ2"); gotoxy(40,7);printf("MATRIZ RESULTANTE"); ingreso(); //llamado a función ingreso producto(); //llamado a función producto gotoxy(8,20);printf("seleccione 1 para continuar y 0 para salir ");scanf("%d",&op); } while(op==1); //cierre de lazo do/while getch(); } //cierre del programa general
Ejecución del programa
27
PROGRAMA TOMADO EN EXAMEN Enunciado Diseñe un programa utilizando Matrices y Funciones que permita: 1.- Ingresar n elementos en una matriz con datos entre 5 y 35, excluyendo las diagonales principal y secundaria, en dónde la diagonal principal se llena con la serie del Fibonnaci y la diagonal secundaria con el factorial de los números ascendentes iniciando en 3. Recorra la matriz y guarde los datos de la diagonal principal en las posiciones pares del vector y los datos de la diagonal segundaria en las posiciones impares del vector. Presente como resultado el vector origen resultante y el mismo vector preséntelo impreso en forma descendente. Análisis Declaramos variables, y librerías, de tipo entero, dentro del programa principal, colocamos el diseño del borde con lazos for. Posicionamos rotulación, a través de scanf leemos dato de límite que nos dará la pauta de la matriz a generarse. Se lee datos desde teclado pero validados entre 5 y 35 por medio de un do/ while cuya condición sería: while(matriz[i][j]<5|| matriz[i][j]>35); ingresamos matriz, con la sentencia if logramos escoger solo la diagonal principal de la matriz e imprimir en ella la serie fibonacci. Por otro lado, en la diagonal secundaria se imprimirá el factorial que empiece en 3. Los datos de las diagonales tanto primaria como secundaria son llevados a dos vectores, previamente declarados. Cada vector utiliza un lazo for para la impresión o visualización de los datos. En un nuevo vector tomamos el índice y lo condicionamos para que en las posiciones pares se imprima la serie fibonacci y en las posiciones impares los números de factorial: if(k%2==0). Con un nuevo lazo for podemos imprimir el vector resultante. Se cierra el bucle do While externo y se cierra el programa principal. Desarrollo #include <conio.h> //inclusión de librerías #include <stdio.h> void main() //inicia programa principal { int vector[10],d,a,b,c,vm1[10],matriz[10][10],matriz1[10][10], vp[10]; 28
int aux,op,i,j,limite,col=10,fil=10,k; //declaración de variables enteras, vectores y matrices do{ //abre lazo do clrscr(); //borrado de pantalla textcolor(11); clrscr(); for(i=1; i<=80;i++) //diseño de borde { gotoxy(i,1);cprintf("*"); gotoxy(i,4);cprintf("*"); gotoxy(i,20);cprintf("*"); } for(i=1; i<=20;i++) { gotoxy(1,i);cprintf("*"); gotoxy(80,i);cprintf("*"); } textcolor(10); gotoxy(33,3);cprintf("EXAMEN"); //titulación textcolor(27); gotoxy(19,6);cprintf("INGRESE EL LIMITE :==> ");scanf("%d",&limite); textcolor(14); gotoxy(10,9);cprintf("MAT. ENTRADA"); gotoxy(35,9);cprintf("D.PRINC. D. SEC."); fil=11; //inicialización de filas y columnas col=10; for(i=1;i<=limite;i++) { for(j=1;j<=limite;j++) { do{ gotoxy(col,fil); scanf(" "); gotoxy(col,fil);scanf("%d",&matriz[i][j]); matriz por teclado } while(matriz[i][j]<5|| matriz[i][j]>35); validación de datos de entrada col=col+5; //avance en columnas } col=10; fil=fil+1; //avance en filas } col=35; fil=11; for(i=1;i<=limite;i++)
//lectura de una
//cierre de lazo while para
29
{ for(j=1;j<=limite;j++) { gotoxy(col,fil);printf("%d",matriz[i][j]); dos for
//impresi贸n de matriz con
col=col+5;
//posicionamiento en columna
} fil=fil+1; col=35;
//avance en filas
} col=35; //inicio de filas y columnas fil=11; textcolor(5); a=0; b=1; c=0; for(i=1;i<=limite;i++) { for(j=1;j<=limite;j++) { if (i==j) //condici贸n para escoger solo diagonal principal { a=b; //programa para fibonacci b=c; c=a+b; matriz[i][j]=c; gotoxy(col,fil);cprintf("%d",matriz[i][j]); //impresi贸n de matriz textcolor(5); gotoxy(53,9);printf("Vec.Fibo."); vm1[j]=matriz[i][j]; //valores Fibonacci a vector gotoxy(57,fil);cprintf("%d",vm1[j]); //impresi贸n de vector Fibonacci } } fil=fil+1; //avance de filas y columna col=col+5; } col=55; fil=11; aux=limite; textcolor(25); 30
d=3; for(i=1;i<=limite;i++) //for para impresi贸n de vector factorial { d=d*i; //programa para factorial gotoxy(col-=5,fil);cprintf("%d",d); textcolor(25); gotoxy(63,9);printf("Vec.Fact."); vm1[j]=d; gotoxy(65,fil);cprintf("%d",vm1[j]); //impresi贸n de vector de factorial aux=aux-1; fil=fil+1;
//
} fil=10; for ( i=limite-1;i>=0;i--) { textcolor(12); gotoxy(45,fil+1);printf("%d",vm1[j]); //en diagonal secundaria fil=fil+1; } //textcolor(12); fil=10; k=0; vm1[j]=matriz[i][j]; //for(k=1;k<=j;k++) //{ if(k%2==0) //condici贸n para las posiciones pares { matriz[i][j]=vp[k]; vp[k]=vm1[j]; // vp[1]=1; // vp[2]=3; for(k=1;k<=j;k++) { gotoxy(70,fil);printf("%d",vp[k]); //impresi贸n de vector posiciones pares } } else { vp[k]=d; for(k=1;k<=j;k++) 31
{ gotoxy(74,fil);printf("%d", vp[k]); impares fil=fil+1; } k=k+1; } textcolor(7); gotoxy(5,23);cprintf("Presione ");scanf("%d",&op); } while(op==1); programa getch(); }
//impresión de posiciones
1
para
continuar,0
para
salir
//cierre de lazo while para salir o no del
//fin de programa principal.
Ejecución del programa
32
3.- BIBLIOGRAFÍA Apuntes teoría Programación U.T.A. http://www.mitecnologico.com/Main/ArreglosVectoresYMatrices http://codigomaldito.blogspot.com/2005/11/arreglos-o-arraysen-c.html http://www.uco.es/grupos/eatco/informatica/metodologia/cade nasyarrays.pdf http://c.conclase.net/curso/?cap=010 http://foro.noticias3d.com/vbulletin/showthread.php?t=201833 http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/clas es1/arays.htm http://webdelprofesor.ula.ve/ingenieria/gilberto/pr1/clase16.pd f
33