tomasfdel

Estructuras I Práctica 1

Mar 24th, 2017
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.94 KB | None | 0 0
  1.     ///EJERCICIO 1:
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. void bubble_sort(float arreglo[], size_t longitud) {
  7.     int iter, i;
  8.     for (iter = 0 ; iter < longitud - 1 ; iter++) {
  9.         for (i = 0 ; i < longitud - iter - 1; i++) {
  10.             if (arreglo[i] > arreglo[i + 1]) {
  11.                 float aux = arreglo[i];
  12.                 arreglo[i] = arreglo[i + 1];
  13.                 arreglo[i + 1] = aux;
  14. }}}}
  15.  
  16. float mediana(float *arreglo, size_t longitud){
  17.     float *nuevo = (float*) malloc (sizeof(float)*longitud);
  18.     int i;
  19.  
  20.     for(i=0; i<longitud;i++)
  21.         nuevo[i]=arreglo[i];
  22.     bubble_sort(nuevo,longitud);
  23.  
  24.     if(longitud%2)
  25.         return nuevo[longitud/2];
  26.     else
  27.         return (nuevo[longitud/2-1] + nuevo[longitud/2])/2;}
  28.  
  29.  
  30.  
  31. int main(){
  32.     float a[]={5,4,1,2,3}, b[]={4.1,0,-1,9};
  33.     printf("%f\n%f",mediana(a,5),mediana(b,4));
  34.     return 0;
  35. }
  36.  
  37.  
  38. ///EJERCICIO 2
  39. /// No hice la parte B porque no sabía cuáles operaciones contar.
  40.  
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43.  
  44. int string_len (char* str){
  45.     int i;
  46.     for(i=0;str[i]!='\0';i++);
  47.     return i;}
  48.  
  49.  
  50. void string_reverse(char* str){
  51.     char aux;
  52.     int i,j;
  53.     for(i=0,j=string_len(str)-1;i<j;i++,j--){
  54.         aux=str[i];
  55.         str[i]=str[j];
  56.         str[j]=aux;}}
  57.  
  58.  
  59. size_t string_concat(char* str1, char* str2, size_t max){
  60.     int i, largoStr1=string_len(str1),largoStr2=string_len(str2);
  61.     for(i=0;i<largoStr2 && largoStr1+i<max;i++)
  62.         str1[largoStr1+i]=str2[i];
  63.     str1[largoStr1+i]='\0';
  64.     return i;}
  65.  
  66.  
  67. int string_compare(char* str1, char* str2){
  68.     int i, largoStr1=string_len(str1);
  69.     for(i=0;i<largoStr1 && tolower(str1[i])==tolower(str2[i]);i++);
  70.     if (tolower(str1[i])<tolower(str2[i]))
  71.         return -1;
  72.     if (tolower(str1[i])==tolower(str2[i]))
  73.         return 0;
  74.         return 1;}
  75.  
  76.  
  77. int string_subcadena(char* str1, char* str2){
  78.     int i,j,largoStr1=string_len(str1),largoStr2=string_len(str2), flag=1;
  79.     for(i=0;i<=largoStr1-largoStr2;i++){
  80.         if(str1[i]==str2[0]){
  81.             flag=1;
  82.             for(j=0;j<largoStr2;j++)
  83.                 if(str1[i+j]!=str2[j]){
  84.                     flag=0;
  85.                     break;
  86.                 }
  87.              if(flag) return i;
  88.         }
  89.     }
  90.     return -1;}
  91.  
  92.  
  93. void string_cat(char* str1, char* str2){
  94.     int i, largoStr1=string_len(str1),largoStr2=string_len(str2);
  95.     for(i=0;i<largoStr2;i++)
  96.         str1[largoStr1+i]=str2[i];
  97.     str1[largoStr1+i]='\0';}
  98.  
  99.  
  100. void string_unir(char* arregloStrings[], size_t capacidad, char* sep, char* res){
  101.     int i, largoSep=string_len(sep);
  102.     res[0]='\0';
  103.     string_cat(res,arregloStrings[0]);
  104.     for(i=1;i<capacidad;i++){
  105.         string_cat(res,sep);
  106.         string_cat(res,arregloStrings[i]);
  107.     }
  108. }
  109.  
  110.  
  111. int main(){
  112.     char a1[]="Hoi", a2[]="Pepe", a3[]="The", a4[]="Frog", b[]=" ";
  113.     char *a[]={a1,a2,a3,a4};
  114.     char c[]="Lalalala";
  115.     string_unir(a,4,b,c);
  116.     printf("%s",c);
  117.     return 0;
  118. }
  119.  
  120.  
  121. /// EJERCICIOS 3 Y 4
  122.  
  123. #include <stdio.h>
  124. #include <stdlib.h>
  125.  
  126. typedef struct {
  127. int* direccion;
  128. size_t capacidad;
  129. } ArregloEnteros;
  130.  
  131.  
  132. ArregloEnteros* arreglo_enteros_crear(size_t capacidad){
  133.     ArregloEnteros* dir = (ArregloEnteros*) malloc (sizeof(ArregloEnteros));
  134.     dir->capacidad=capacidad;
  135.     dir->direccion = (int*) malloc (sizeof(int)*capacidad);
  136.     return dir;}
  137.  
  138.  
  139. void arreglo_enteros_destruir(ArregloEnteros* arreglo){
  140.     free(arreglo->direccion);
  141.     free(arreglo);}
  142.  
  143.  
  144. int arreglo_enteros_leer(ArregloEnteros* arreglo, size_t pos){
  145.     return arreglo->direccion[pos];}
  146.  
  147.  
  148. void arreglo_enteros_escribir(ArregloEnteros* arreglo, size_t pos, int dato){
  149.     arreglo->direccion[pos]=dato;}
  150.  
  151.  
  152. size_t arreglo_enteros_capacidad(ArregloEnteros* arreglo){
  153.     return arreglo->capacidad;}
  154.  
  155.  
  156. void arreglo_enteros_imprimir_en_pantalla(ArregloEnteros arreglo){
  157.     int i;
  158.     for(i=0;i<arreglo.capacidad;i++)
  159.         printf("%d\n", arreglo.direccion[i]);}
  160.  
  161.  
  162. void arreglo_enteros_ajustar(ArregloEnteros* arreglo, size_t capacidad){
  163.     arreglo->direccion = realloc (arreglo->direccion, sizeof(int) * capacidad);
  164.     arreglo->capacidad = capacidad;}
  165.  
  166.  
  167. void arreglo_enteros_insertar(ArregloEnteros* arreglo, size_t pos, int dato){
  168.     int i;
  169.     if(pos<arreglo->capacidad){
  170.     arreglo_enteros_ajustar(arreglo, arreglo->capacidad+1);
  171.     for(i=arreglo->capacidad-1;i>pos;i--)
  172.         arreglo->direccion[i]= arreglo->direccion[i-1];
  173.  
  174.     arreglo->direccion[pos] = dato;
  175.     }}
  176.  
  177. void arreglo_enteros_eliminar(ArregloEnteros* arreglo, size_t pos){
  178.     int i;
  179.  
  180.     for(i=pos;i<(arreglo->capacidad-1);i++)
  181.         arreglo->direccion[i]=arreglo->direccion[i+1];
  182.  
  183.     arreglo_enteros_ajustar(arreglo, arreglo->capacidad-1);}
  184.  
  185.  
  186. int main(){
  187.     ArregloEnteros* inicio=arreglo_enteros_crear(10);
  188.     int i;
  189.     for(i=0;i<inicio->capacidad;i++){
  190.         arreglo_enteros_escribir(inicio,i,i);
  191.     }
  192.     arreglo_enteros_imprimir_en_pantalla(*inicio);
  193.  
  194.     for(i=0;i<5;i++)
  195.         arreglo_enteros_insertar(inicio, i, i-9);
  196.  
  197.     printf("\n\n");
  198.     arreglo_enteros_imprimir_en_pantalla(*inicio);
  199.  
  200.     for(i=5;i<8;i++){
  201.         arreglo_enteros_eliminar(inicio, i);
  202.     }
  203.     printf("\n\n");
  204.     arreglo_enteros_imprimir_en_pantalla(*inicio);
  205.  
  206.     arreglo_enteros_destruir(inicio);
  207.     return 0;
  208. }
  209.  
  210.  
  211. ///EJERCICIO 5
  212.  
  213. #include <stdio.h>
  214. #include <stdlib.h>
  215.  
  216. typedef struct{
  217.     float **arreglo;
  218.     size_t alto, ancho;
  219.     }Matriz_bi;
  220.  
  221.  
  222. typedef struct{
  223.     float *arreglo;
  224.     size_t alto, ancho;
  225.     }Matriz_uni;
  226.  
  227.  
  228. ///Funciones de Matriz_bi
  229. Matriz_bi* matriz_bi_crear(size_t alto, size_t ancho){
  230.     int i;
  231.     Matriz_bi* puntero = (Matriz_bi*) malloc (sizeof(Matriz_bi));
  232.     puntero->alto = alto;
  233.     puntero->ancho = ancho;
  234.     puntero->arreglo = (float **) malloc (sizeof(float *) * alto);
  235.     for(i=0; i<alto; i++)
  236.         puntero->arreglo[i] = (float *) malloc (sizeof(float) * ancho);
  237.     return puntero;}
  238.  
  239.  
  240. void matriz_bi_destruir (Matriz_bi* matriz){
  241.     int i;
  242.     for(i=0; i<matriz->alto; i++)
  243.         free(matriz->arreglo[i]);
  244.     free(matriz->arreglo);
  245.     free(matriz);}
  246.  
  247.  
  248. void matriz_bi_escribir (Matriz_bi* matriz, size_t fila, size_t columna, float dato){
  249.     if(fila < matriz->alto && columna < matriz->ancho)
  250.         matriz->arreglo[fila][columna]=dato;}
  251.  
  252.  
  253. void matriz_bi_mostrar (Matriz_bi matriz){
  254.     int i,j;
  255.     for(i=0;i<matriz.alto;i++){
  256.         for(j=0;j<matriz.ancho;j++)
  257.             printf("%f\t",matriz.arreglo[i][j]);
  258.         printf("\n");
  259.     }
  260. }
  261.  
  262. void matriz_bi_intercambiar_filas (Matriz_bi* matriz, size_t fila1, size_t fila2){
  263.     if(fila1<matriz->alto && fila2<matriz->alto){
  264.         int i;
  265.         float auxiliar;
  266.         for(i=0;i<matriz->ancho;i++){
  267.             auxiliar = matriz->arreglo[fila1][i];
  268.             matriz->arreglo[fila1][i] = matriz->arreglo[fila2][i];
  269.             matriz->arreglo[fila2][i] = auxiliar;
  270.         }
  271.     }
  272. }
  273.  
  274.  
  275. Matriz_bi* matriz_bi_sumar (Matriz_bi* matriz1, Matriz_bi* matriz2){
  276.     if (matriz1->ancho == matriz2->ancho && matriz1->alto == matriz2->alto){
  277.         Matriz_bi * matrizSuma = matriz_bi_crear(matriz1->alto, matriz1->ancho);
  278.         int i, j;
  279.         for(i=0, j=0; i < matrizSuma->alto; j++){
  280.             matrizSuma->arreglo[i][j] = matriz1->arreglo[i][j] + matriz2->arreglo[i][j];
  281.             if( j == matrizSuma->ancho-1){
  282.                 i++;
  283.                 j=-1;
  284.             }
  285.         }
  286.         return matrizSuma;
  287.     }
  288.     return NULL;
  289. }
  290.  
  291.  
  292. Matriz_bi* matriz_bi_multiplicar (Matriz_bi* matriz1, Matriz_bi* matriz2){
  293.     if (matriz1->ancho == matriz2->alto){
  294.         Matriz_bi * matrizProd = matriz_bi_crear(matriz1->alto, matriz2->ancho);
  295.         int i, j, indiceProducto;
  296.         float acumulador;
  297.         for(i=0, j=0; i < matrizProd->alto; j++){
  298.             acumulador=0;
  299.             for(indiceProducto = 0; indiceProducto < matriz1->ancho; indiceProducto++)
  300.                 acumulador += matriz1->arreglo[i][indiceProducto] * matriz2->arreglo[indiceProducto][j];
  301.             matrizProd->arreglo[i][j] = acumulador;
  302.             if( j == matrizProd->ancho-1){
  303.                 i++;
  304.                 j=-1;
  305.             }
  306.         }
  307.         return matrizProd;
  308.     }
  309.     return NULL;
  310. }
  311.  
  312.  
  313.  
  314.  
  315. ///Funciones de Matriz_uni
  316. Matriz_uni* matriz_uni_crear (size_t alto, size_t ancho){
  317.     Matriz_uni* puntero = (Matriz_uni*) malloc (sizeof(Matriz_uni));
  318.     puntero->alto = alto;
  319.     puntero->ancho = ancho;
  320.     puntero->arreglo = (float *) malloc (sizeof(float) * ancho * alto);
  321.     return puntero;}
  322.  
  323.  
  324. void matriz_uni_destruir (Matriz_uni* matriz){
  325.     free(matriz->arreglo);
  326.     free(matriz);}
  327.  
  328.  
  329. void matriz_uni_escribir (Matriz_uni* matriz, size_t fila, size_t columna, float dato){
  330.     if(fila < matriz->alto && columna < matriz->ancho)
  331.             matriz->arreglo[matriz->ancho*fila + columna] = dato;}
  332.  
  333.  
  334. void matriz_uni_mostrar (Matriz_uni matriz){
  335.     int i;
  336.     for(i=0;i<(matriz.alto * matriz.ancho); i++){
  337.         printf("%f\t",matriz.arreglo[i]);
  338.         if(i%matriz.ancho == matriz.ancho-1)
  339.             printf("\n");}}
  340.  
  341.  
  342. void matriz_uni_intercambiar_filas (Matriz_uni* matriz, size_t fila1, size_t fila2){
  343.     if(fila1<matriz->alto && fila2<matriz->alto){
  344.         int i;
  345.         float auxiliar;
  346.         for(i=0;i<matriz->ancho;i++){
  347.             auxiliar = matriz->arreglo[matriz->ancho * fila1 + i];
  348.             matriz->arreglo[matriz->ancho * fila1 + i] = matriz->arreglo[matriz->ancho * fila2 + i];
  349.             matriz->arreglo[matriz->ancho * fila2 + i] = auxiliar;
  350.         }
  351.     }
  352. }
  353.  
  354.  
  355. Matriz_uni* matriz_uni_sumar (Matriz_uni* matriz1, Matriz_uni* matriz2){
  356.     if (matriz1->ancho == matriz2->ancho && matriz1->alto == matriz2->alto){
  357.         Matriz_uni * matrizSuma = matriz_uni_crear(matriz1->alto, matriz1->ancho);
  358.         int i;
  359.         for(i=0; i < matrizSuma->alto * matrizSuma->ancho; i++)
  360.             matrizSuma->arreglo[i] = matriz1->arreglo[i] + matriz2->arreglo[i];
  361.         return matrizSuma;
  362.     }
  363.     return NULL;
  364. }
  365.  
  366.  
  367. Matriz_uni* matriz_uni_multiplicar (Matriz_uni* matriz1, Matriz_uni* matriz2){
  368.     if (matriz1->ancho == matriz2->alto){
  369.         Matriz_uni * matrizProd = matriz_uni_crear(matriz1->alto, matriz2->ancho);
  370.         int i, indiceProducto;
  371.         float acumulador;
  372.         for(i=0; i < matrizProd->alto * matrizProd->ancho; i++){
  373.             acumulador=0;
  374.             for(indiceProducto = 0; indiceProducto < matriz1->ancho; indiceProducto++)
  375.                 acumulador += matriz1->arreglo[i / matrizProd->ancho + indiceProducto] * matriz2->arreglo[i % matrizProd->ancho + indiceProducto * matrizProd->ancho];
  376.             matrizProd->arreglo[i] = acumulador;
  377.         }
  378.         return matrizProd;
  379.     }
  380.     return NULL;
  381. }
  382.  
  383.  
  384.  
  385. int main(){
  386.     int i;
  387.     Matriz_bi* matricita_bi = matriz_bi_crear(2,3), *matricita_bi2 = matriz_bi_crear(3,5), *matricita_bi_suma, *matricita_bi_producto;
  388.     Matriz_uni* matricita_uni = matriz_uni_crear(2,3), *matricita_uni2 = matriz_uni_crear(3,5), *matricita_uni_suma, *matricita_uni_producto;
  389.  
  390.     for(i=0;i<6;i++){
  391.         matriz_bi_escribir(matricita_bi, i/3, i%3, i*2);
  392.         matriz_uni_escribir(matricita_uni, i/3, i%3, i*2);}
  393.  
  394.     for(i=0;i<15;i++){
  395.         matriz_bi_escribir(matricita_bi2, i/5, i%5, i*10);
  396.         matriz_uni_escribir(matricita_uni2, i/5, i%5, i*10);}
  397.  
  398.  
  399.  
  400.     printf("MATRIZ BIDIMENSIONAL: \n");
  401.     matriz_bi_mostrar(*matricita_bi);
  402.  
  403.     printf("\nDespués de los swaps: \n");
  404.     matriz_bi_intercambiar_filas(matricita_bi, 0, 2);
  405.     matriz_bi_intercambiar_filas(matricita_bi, 1, 0);
  406.     matriz_bi_mostrar(*matricita_bi);
  407.  
  408.     printf("\nSumada con sí misma: \n");
  409.     matricita_bi_suma = matriz_bi_sumar (matricita_bi, matricita_bi);
  410.     matriz_bi_mostrar(*matricita_bi_suma);
  411.  
  412.     matricita_bi_producto = matriz_bi_multiplicar(matricita_bi,matricita_bi);
  413.     if (matricita_bi_producto == NULL) printf("\nNo permite multiplicar una matriz rectangular con si misma.\n");
  414.     printf("\nMatriz 1: \n");
  415.     matriz_bi_mostrar(*matricita_bi);
  416.     printf("\nMatriz 2: \n");
  417.     matriz_bi_mostrar(*matricita_bi2);
  418.     printf("\nEl producto de ellas es: \n");
  419.     matricita_bi_producto = matriz_bi_multiplicar(matricita_bi,matricita_bi2);
  420.     matriz_bi_mostrar(*matricita_bi_producto);
  421.  
  422.  
  423.  
  424.  
  425.     printf("\n\nMATRIZ UNIDIMENSIONAL: \n");
  426.     matriz_uni_mostrar(*matricita_uni);
  427.  
  428.     printf("\nDespués de los swaps: \n");
  429.     matriz_uni_intercambiar_filas(matricita_uni, 0, 2);
  430.     matriz_uni_intercambiar_filas(matricita_uni, 1, 0);
  431.     matriz_uni_mostrar(*matricita_uni);
  432.  
  433.     printf("\nSumada con sí misma: \n");
  434.     matricita_uni_suma = matriz_uni_sumar (matricita_uni, matricita_uni);
  435.     matriz_uni_mostrar(*matricita_uni_suma);
  436.  
  437.     matricita_uni_producto = matriz_uni_multiplicar(matricita_uni,matricita_uni);
  438.     if (matricita_uni_producto == NULL) printf("\nNo permite multiplicar una matriz rectangular con si misma.\n");
  439.     printf("\nMatriz 1: \n");
  440.     matriz_uni_mostrar(*matricita_uni);
  441.     printf("\nMatriz 2: \n");
  442.     matriz_uni_mostrar(*matricita_uni2);
  443.     printf("\nEl producto de ellas es: \n");
  444.     matricita_uni_producto = matriz_uni_multiplicar(matricita_uni,matricita_uni2);
  445.     matriz_uni_mostrar(*matricita_uni_producto);
  446.  
  447.  
  448.     matriz_bi_destruir(matricita_bi);
  449.     matriz_bi_destruir(matricita_bi2);
  450.     matriz_bi_destruir(matricita_bi_suma);
  451.     matriz_bi_destruir(matricita_bi_producto);
  452.     matriz_uni_destruir(matricita_uni);
  453.     matriz_uni_destruir(matricita_uni2);
  454.     matriz_uni_destruir(matricita_uni_suma);
  455.     matriz_uni_destruir(matricita_uni_producto);
  456. }
  457.  
  458.  
  459.  
  460. /* EJERCICIO 5-B
  461. La matriz unidimensional necesita de menos punteros para su utilización, aunque la implementación de algunas funciones
  462. puede resultar más engorrosa, además que necesita alocar todos los datos consecutivos en la memoria.
  463. La matriz bidimensional requiere de una mayor cantidad de memoria dado que necesita un puntero para cada fila.
  464. Sin embargo, cada una de las filas puede estar en lugares de la memoria diferentes a las demás.
  465. */
Add Comment
Please, Sign In to add comment