Solución del Ejercicio 3 Para resolver este problema se propone recorrer el arreglo f rase y comparar cada uno de los caracteres con el carácter buscado. En caso de coincidencia, se incrementa la variable cant, la cual es la salida del procedimiento. Dado que la frase contendrá tanto mayúsculas como minúsculas debemos normalizar la comparación, es decir, siempre comparar letras mayúsculas o letras minúsculas. En nuestro caso, utilizaremos la función toupper para comparar siempre letras mayúsculas. En la Figura 1 se presenta una solución al problema. 1 #include <stdio.h> #include <string.h> 3 #include <ctype.h> #include <stdlib.h> 5 int ocurrencias (char* frase, int largo, char letra ) { 7 int cant=0; char letram = toupper(letra); 9 for (int i=0; i<largo;i++){ if (toupper(frase[i])==letram) 11 cant++; ; 13 return cant; Figura 1: Solución del ejercicio 3 En la figura 2 se presenta un procedimiento para probar la solución propuesta. Al final del documento mostraremos el programa principal que contendrá las llamadas a dichos procedimientos. 2 void ej3(){ char frase[100] = "Hoy es el dia mas hermoso de nuestra vida, querido Sancho; los obstaculos mas grandes"; 4 char letra = h ; 6 printf("la letra %c ocurre %d\n", letra, ocurrencias(frase,(unsigned)strlen(frase),letra)); Figura 2: Prueba del ejercicio 3 Instituto de Computación - Facultad de Ingeniería - UdelaR Página 1 de 6
Solución del Ejercicio 4 Una frase palíndroma es una frase que se lee igual hacia adelante que hacia atrás. Para determinar si una frase es palíndroma debemos comparar el primer carácter con el último, el segundo carácter con el penúltimo y así sucesivamente. A continuación presentamos los puntos importantes que debemos tener en cuenta para la solución: Notemos que alcanza con recorrer los carácteres hasta la mitad del largo de la frase. Para ello utilizamos la estructura de control f or y la recorrida se corta cuando encontremos una diferencia o hayamos llegado a la mitad de la frase. Dado que solo nos interesa incrementar la variable i para recorrer la frase, la estructura f or no tiene ninguna instrucción en su cuerpo. Dado que no conocemos el largo de la f rase debemos calcular su largo utilizando la función strlen. Al igual que en el ejercicio anterior, debemos tener en cuenta normalizar las letras a mayúsculas para compararlas. En la Figura 3 se presenta una solución al problema. 1 bool espalindrome(char* frase){ 3 int largo = (unsigned) strlen(frase); int i; 5 for(i=0; (i<largo/2) && toupper(frase[i]) == toupper(frase[largo-1-i]); i++); 7 return i>=largo/2; 9 ; Figura 3: Solución del ejercicio 4 En la figura 4 se presenta un procedimiento para probar la solución propuesta en donde se lee una frase ingresada por el usuario desde la entrada estándar. 1 void ej4(){ char* frase = new char[100]; 3 printf("ingrese frase: "); scanf(" %s",frase); if (espalindrome(frase)) 5 printf("es Palindrome\n"); else 7 printf("no es Palidrome\n"); 9 Figura 4: Prueba del ejercicio 4 Instituto de Computación - Facultad de Ingeniería - UdelaR Página 2 de 6
Solución del Ejercicio 7 En este ejercicio trabajaremos con matrices de M filas y N columnas representadas medianto un arreglo unidimensional de enteros de longitud M N. Parte a En la figura 5 se muestra la operación constructora de una matriz de dimensiones M N en un arreglo unidimensional. 1 int* crearmatriz(int m, int n){ return new int[m*n]; 3 ; Figura 5: Solución del ejercicio 7 - Parte a Parte b En la figura 6 se muestra la operación para asignar un valor x en la posición (i, j) de la matriz. Notemos que debemos saber la cantidad de columnas n que tiene la matriz para poder calcular su posición en el arreglo unidimensional. Vamos a considerar que los índices que nos pasan por parámetro comienzan en 1. Esto quiere decir que, por ejemplo, las posiciones de la primera fila van de (1, 1) hasta (1, n). 1 /* los indices de la matriz empiezan en 1 */ void asignarvalormatriz (int* matriz, int n, int i, int j, int x){ 3 int ini = (i-1) * n; 5 int pos = ini + j; 7 matriz[pos-1] = x; 9 Figura 6: Solución del ejercicio 7 - Parte b Parte c En la figura 7 se muestra la operación para devolver un valor de la matriz ubicado en la posición (i, j). Notemos que para este caso también debemos conocer la cantidad de columnas n que tiene la matriz. 1 int valormatriz(int* matriz, int n, int i, int j){ 3 int ini = (i-1) * n; int pos = ini + j; 5 7 ; return matriz[pos-1]; Figura 7: Solución del ejercicio 7 - Parte c Parte d En la figura 8 se muestra la operación que transpone una matriz de dimensiones M N. Instituto de Computación - Facultad de Ingeniería - UdelaR Página 3 de 6
2 4 int* transponermatriz(int* matriz, int m, int n){ int* trasp = new int[n*m]; for(int i = 0; i < m; i++) 6 for (int j = 0; j < n; j++) trasp[j*m+i] = valormatriz(matriz,n,i+1,j+1); 8 10 return trasp; Figura 8: Solución del ejercicio 7 - Partea d En la figura 9 se muestra un procedimiento que prueba las operaciones implementadas. Primeramente implementamos un procedimiento que imprime la matriz (representada en el arreglo unidimensional) en pantalla como una matriz de dos dimensiones. Notemos que debemos imprimir un salto de línea por cada nueva fila, esto es, cada vez que el iterador i sea divisible por n. Luego, implementamos el procedimiento que prueba todas las partes del ejercicio en interacción con el usuario. Instituto de Computación - Facultad de Ingeniería - UdelaR Página 4 de 6
1 void imprimirmatrizarreglo(int* matriz, int m, int n){ 3 for(int i=0;i<m*n;i++) { if (i %n==0) 5 printf("\n"); printf(" %d ",matriz[i]); 7 ; 9 void ej7(){ 11 int m,n; printf("ingrese m y n: "); 13 scanf(" %d %d", &m,&n); 15 int* matriz = crearmatriz(m,n); 17 printf("ingrese matriz como arreglo: "); for(int i=0;i<m*n;i++) 19 scanf(" %d", &matriz[i]); 21 printf("la matriz ingresada es: \n"); 23 imprimirmatrizarreglo(matriz,m,n); printf("\n"); 25 printf("(b) Ingrese los indices empezando a numerar en 1 y el valor a cambiar-> i j x :"); 27 int i,j,x; scanf(" %d %d %d",&i,&j,&x); 29 31 33 asignarvalormatriz(matriz,n,i,j,x); printf("la nueva matriz es: \n"); imprimirmatrizarreglo(matriz,m,n); 35 printf("\n"); 37 printf("ingrese los indices empezando en 1 del valor a obtener-> i j :"); scanf(" %d %d",&i,&j); 39 41 printf("el valor de la celda es: 43 printf("(c) La matriz transpuesta es : "); 45 int* traspm = transponermatriz(matriz,m,n); 47 imprimirmatrizarreglo(traspm,n,m); printf("\n"); 49 %d\n", valormatriz(matriz,n,i,j)); 51 ; Figura 9: Prueba del ejercicio 7 Instituto de Computación - Facultad de Ingeniería - UdelaR Página 5 de 6
Programa Principal En la figura 10 se muestra el programa principal que invoca a los procedimientos que prueban las operaciones implementadas. El usuario ingresa el numero de ejercicio que desea probar. 1 3 int main() { int ej; 5 printf("ejecutar Ejercicio: "); scanf(" %d", &ej); 7 switch (ej) { case 3: ej3();break; 9 case 4: ej4();break; case 7: ej7(); break; 11 default:printf("ejercicio No Implementado\n"); 13 15 return 1; Figura 10: Programa Principal Instituto de Computación - Facultad de Ingeniería - UdelaR Página 6 de 6