RELACIÓN DE PROBLEMAS A ENTREGAR Debido a la solicitud de varios alumnos que no pueden asistir a las clases teóricas, sólo habrán de entregarse los problemas correspondientes a las prácticas de la asignatura. Es decir, sólo habrá que entregar los problemas: • Problema 6: Práctica 2: Introducción al uso de funciones en lenguaje C: Factorización y obtención del máximo factor primo. • Problema 7: Práctica 3: Vectores y cadenas de caracteres: Ordenar los elementos de una cadena de caracteres. • Problema 8: Práctica 4: Multiplicación de matrices empleando notación vectorial. • Problema 9: publicada.) Práctica 5: Funciones de entrada/salida de ficheros (aún no PRÁCTICA 2: INTRODUCCIÓN AL USO DE FUNCIONES Práctica Introducción al Uso de Funciones en Lenguaje C 1 .- INTRODUCCIÓN Se pide realizar un programa que calcule la factorización de un número introducido desde teclado, y que presente por pantalla el máximo factor primo obtenido. Se entiende por factorización de un número, el conjunto de numeros primos por el que es divisible, incluyendo aquellos que se repiten y el 1. Ej: 20 = 1 · 2 · 2 · 5 maxfactor = 5 2 .- DESARROLLO DE LA PRÁCTICA El programa estará estructurado de la siguiente forma: a) Función main: - En ella se declararán la variable que contendrá el numero introducido desde teclado, y la variable que contendrá el máximo factor primo (maxfactor). -Desde la función main se llamará a otra función, denominada factoriza, que deberá calcular dicha factorización y modificar el contenido de maxfactor. b) Función factoriza: -La función factoriza recibirá como parámetros un número entero que se almacenará en la variable num y la dirección de la variable maxfactor que será almacenada en un puntero denominado pfactor. -La función factoriza no devuelve nada. A continuación se muestra el prototipo de la función. void factoriza(int num, int * pfactor); Se recomienda que la factorización se realice usando una función que calcule el número primo menor por el que es divisible empezando a probar con el 2. A continuación se dividirá el número original por el divisor calculado y con el número resultante se volverá a repetir el proceso. Así hasta que el número sea 1, que será justamente el divisor más pequeño. Ej: 20 -> es divisible por 2 -> 20/2 = 10 10 -> es divisible por 2 -> 10/2 = 5 5 -> es divisible por 5 -> 5/5 = 1 73 Las notas saldrán el día 21 de Junio de 2002 a las 21:00. Hoja 3/6 PRÁCTICA 2: INTRODUCCIÓN AL USO DE FUNCIONES 3. - PLANTILLA #include < > void factoriza( void factoriza(int num, int *pfactor) { ); void main(void) { int numero; int maxfactor; do { printf("Introduzca número mayor que 1:\t"); scanf( ); } while(numero<2); factoriza( printf( “ ); “, maxfactor ); } } 74 Las notas saldrán el día 21 de Junio de 2002 a las 21:00. Hoja 5/6 PRÁCTICA 3 VECTORES Y CADENAS DE CARACTERES Se quiere hacer un programa que ordene por orden alfabético los elementos de una cadena de caracteres dada (origen) y los almacene en otra cadena (destino). Ejemplo: cfaebd abcdef Para ello será necesario: 1.- Determinar el número de caracteres de la cadena. Vamos a suponer que no conocemos el número de caracteres de la cadena origen. Habrá que hacer un bucle para buscar el cero en la cadena e ir contando los elementos que forman la cadena. 2.- Comparar los caracteres. El criterio de comparación viene dado de forma automática por el código ASCII. Luego el carácter 'a' (97) es menor que 'b' (98). 3.- Ordenar los caracteres. Para ordenar los caracteres habrá que buscar el más pequeño de todos y ponerlo en primer lugar. Descartando este primer carácter para la siguiente búsqueda, daremos con el segundo más pequeño, y así sucesivamente. Existen varias formas de resolver el problema. Se permite escribir sobre la cadena origen para descartar los elementos ya ordenados. Se pide: a) Hacer el diagrama de flujo de cada una de las partes. b) Codificar el algoritmo resultante en lenguaje C. Nota: Por sencillez las cadenas de caracteres se declararán de la siguiente forma: char origen[]="cfaebd"; char destino[10]; PRÁCTICA 4: Multiplicación de Matrices con notación vectorial Práctica 4 Multiplicación de Matrices con notación vectorial 1 .- INTRODUCCIÓN Se pide realizar un programa que calcule la multiplicación de 2 matrices. Los datos de ambas matrices serán introducidos desde teclado, y el resultado de la multiplicación deberá ser mostrado en pantalla. El objetivo de la práctica es el de familiarizarse con el empleo encadenado de funciones y no el de emplear el mejor algoritmo para la multiplicación de matrices. Para la realización de la práctica son necesarios los apuntes de clase. 2 .- DESARROLLO DE LA PRÁCTICA El programa estará estructurado de la siguiente forma: a) Función main: - Se declararán los elementos necesarios para almacenar de forma estática y mediante notación vectorial, las matrices a multiplicar, la matriz resultado y los números de filas y columnas correspondientes. - Se llamará a la función leematriz para introducir los datos de la primera matriz. - Se llamará a la función leematriz para introducir los datos de la segunda matriz. - Se llamará a la función multiplicamatriz. - Se llamara a la función escribematriz. b) Función leematriz: la función leematriz recibirá la dirección de comienzo de la matriz, el número de filas y el número de columnas. Los distintos elementos de la matriz serán introducidos desde esta función. Su prototipo será: void leematriz( float * pmatriz, int nf, int nc); c) Función multiplicamatriz: la función multiplicamatriz recibirá las direcciónes de las dos matrices datos y la dirección de la matriz resultado. También recibirá los números de filas y de columnas correspondientes. Su prototipo será: void multiplicamatriz(float * pA,float * pB, float * pC,int nfC,int ncC,int num); En esta función se calculará la multiplicación de las dos matrices, y el resultado se almacenará en la matriz resultado. PRÁCTICA 4: Multiplicación de Matrices con notación vectorial Para realizar la multiplicación de matrices, se deberán emplear las siguientes funciones: 1) Producto Escalar de dos vectores, cuyo prototipo es: float prodescalar(float *pv1, float * pv2, int num); Esta función deberá ser llamada para obtener cada uno de los valores de la matriz resultante. 2) Traspuesta de una matriz, cuyo prototipo es: void trasponer(int * pB, int nf, int nc); Esta función deberá ser llamada para trasponer la matriz B. De esta forma las direcciones de comienzo de las nuevas filas, corresponderán al primer elemento de las columnas originales, pudiéndose emplear a continuación la función proescalar. d) Función escribematriz: la función escribe matriz recibirá la dirección de comienzo asignada a la matriz resultado, así como el número de filas y de columnas. Su prototipo será: void escribematriz(int * pmatriz, int nf, int nc); #include <stdio.h> void lecturamatriz(float Matriz[], int nf, int nc); void Escrituramatriz(float Matriz[], int nf, int nc); void trasponer2(float Matriz[],float Matriz2[], int nf, int nc); float prodescalar(float v1[],float v2[], int num); void multiplicamatriz(float MA[],float MB[], float MC[], int nfC, int ncC, int num); void main(void) { int nf=2,nc=2; float MatrizA[4]; /* matriz 2X2 en forma vectorial */ float MatrizB[4]; float MatrizC[4]; printf("\nIntroduzca Elementos Matriz 1\n"); lecturamatriz(MatrizA,2,2); printf("\nIntroduzca Elementos Matriz 2\n:"); lecturamatriz(MatrizB,2,2); multiplicamatriz( , , , , , ); printf("\nLa matriz resultado es:\n"); Escrituramatriz(MatrizC,2,2); } float prodescalar(float v1[],float v2[],int num) { int i; /* declarar prod */ for(i=0;i< ;i++) /* completar condición */ { /* completar */ } return prod; } void multiplicamatriz( , , , , , ) { int i,j; /* declaración de matriz nueva y llamada a la función trasponer */ for(i=0;i< ;i++) /* completar condiciones */ { for(j=0;j< ;j++) { /* Llamada a la función prodescalar */ } } } void lecturamatriz(float Matriz[], int nf, int nc) { int i,j; for(i=0;i<nf;i++) { for(j=0;j<nc;j++) { printf("Introduzca Elemento(%d,%d): ",i+1,j+1); /* Lectura Matriz */ scanf("%f",&Matriz[i*nc+j]); } } } void Escrituramatriz(float Matriz[], int nf, int nc) { int i,j; for(i=0;i<nf;i++) { for(j=0;j<nc;j++) { printf("%f ",Matriz[i*nc+j]); /* escritura matriz */ } printf("\n"); } } void trasponer2(float Matriz[],float Matriz2[], int nf, int nc) { int i,j; for(i=0;i<nf;i++) { for(j=0;j<nc;j++) { /* completar */ } } }