• Miércoles 20 de Noviembre de 2024, 14:35

Autor Tema:  ¿cómo Se Introducen Funciones Dentro De Otras?  (Leído 2165 veces)

Sepharat

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
¿cómo Se Introducen Funciones Dentro De Otras?
« en: Martes 3 de Febrero de 2004, 21:46 »
0
Hola, soy estudiante de 1º de ingenieria informatica y ando un poco liado con los lenguajes de programacion. Hasta ahora me he acostumbrado mas a pascal que ha C y hay cosas que hago en el primero y que no se como hacer en el segundo. Uno de esos problemas es el uso de procedimientos dentro de otros procedimientos. En concreto una de las practicas consiste en realizar un programa que opere con dos matrices dadas por el usuario. Quiero incluir en un procedimiento llamado "menu" el resto de procedimientos de manera que, segun introduzcas una de las opciones, realice el procedimiento deseado. Al no saber como hacerlo, lo tengo incluido en la funcion main() pero me gustaria cambiarlo de lugar. Añado el codigo para ver si alguien me sabe decir como hacerlo, las partes en las que tengo el problema estan resaltadas con varios espacios en blanco y una frase entre asteriscos. Hay otro par de dudas que me gustaria que alguien me resolviera; en el mismo procedimiento menu tengo un bucle while que hace que se repita un mensaje de error cuando se introduce una opcion no valida. El problema es que no me funciona. Se que es porque no tengo bien puesta la condicion unida con && pero no se como es. Tambien tengo otro procedimiento al final del codigo que ni siquiera se si esta bien escrito y que me gustaria saber como implementar. Se trata de preguntar al usuario si desea realizar otra operacion al finalizar la anterior
Me ha quedado un poco largo pero bueno, espero que alguien me pueda ayudar
Saludos




/*Programa que realiza varias operaciones sobre dos matrices introducidas por el usuario*/

#include <stdio.h>
#define N 2

void leer_matrices (int a1[][N], int a2[][N]); /*Pide al usuario valores para las matrices*
/
void visualizar_A (int a1[][N]); /*Visualiza la matriz A*/
void visualizar_B (int a2[][N]); /*Visualiza la matriz B*/
void menu (int *op);/*Menú de operaciones con las matrices*/
      /*Operaciones con las matrices*/
void sumar_matrices (int a1[][N], int a2[][N], int a3[][N]);
void traspuesta (int a1[][N]);
void visualizar_filas (int a1[][N]);
void visualizar_columnas (int a1[][N]);
void elemento_mayor (int a1[][N], int *max);
void visualizar_mayor (int *max);
void posicion_mayor (int a1[][N], int max);
     /*Opción de realizar otra operación o salir del programa*/
void repetir (char *resp);

main ()
{

int opcion; /*Variable para elegir opción*/
int A[N][N], B[N][N], C[N][N];/*Matrices a introducir y matriz suma*/
int max;/*Variable en la que se guardará el elemento mayor de la matriz A*/
char resp;/*Variable para la respuesta a la función repetir*/
leer_matrices (A,B);
visualizar_A (A);
visualizar_B (B);
elemento_mayor (A,&max);
menu (&opcion);


               ***********Esta es la parte que quiero introducir en el
               procedimiento menu*****************************


switch (opcion)
{
case 1:sumar_matrices (A,B,C);
break;
case 2:traspuesta (A);
break;
case 3:visualizar_filas (A);
break;
case 4:visualizar_columnas (A);
break;
case 5:visualizar_mayor (&max);
break;
case 6:posicion_mayor (A,max);
break;
case 7:break;
}

               *******************Hasta aqui****************
}

void leer_matrices (int a1[][N], int a2[][N])
{
int i,j,valor;
printf ("Introduzca los valores de la primera matriz\n\n");
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
{
printf ("Introduzca el valor [%d][%d]\n",i,j);
scanf ("%d",&valor);
a1[j] = valor;
}
}
printf ("Introduzca los valores de la segunda matriz\n\n");
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
{
printf ("Introduzca el valor [%d][%d]\n",i,j);
scanf ("%d",&valor);
a2[j] = valor;
}
}
}

void visualizar_A (int a1[][N])
{
int i,j;
printf ("Matriz A:\n\n");
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
{
printf ("%4d",a1[j]);
}
printf ("\n");
}
printf ("\n");
}

void visualizar_B (int a2[][N])
{
int i,j;
printf ("Matriz B:\n\n");
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
printf ("%4d",a2[j]);
printf ("\n");
}
printf ("\n");
}



          ******************* Este es el procedimiento en el que
          quiero meter la parte que resalte antes****************



void menu (int *op)
{
int opcion;
printf ("************* M E N U ****************\n\n");
printf (" 1.- Sumar matrices \n");
printf (" 2.- Traspuesta de A \n");
printf (" 3.- Visualizar A por filas \n");
printf (" 4.- Visualizar B por filas \n");
printf (" 5.- Elemento mayor de A \n");
printf (" 6.- Posición del elemento mayor de A \n");
printf (" 7.- Salir \n\n");
printf (" Introduzca una opción: ");
scanf ("%d",&opcion);
printf ("\n");

         **********Aqui iria la parte que tengo en main*************
 
         **********Y aqui empieza el bucle que no me funciona********
while ((opcion<=0) && (opcion>=8))
{
printf ("Ha introducido una opción no valida\n");
printf ("Vuelva a introducir una opción: ");
scanf ("%d",&opcion);
printf ("\n");
}
*op = opcion;
printf ("\n");
}

void sumar_matrices (int a1[][N], int a2[][N], int a3[][N])
{
int i,j;
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
a3[j] = a1[j] + a2[j];
}
printf ("Valor de la matriz C:\n\n");
for (i = 1; i<= N; i++)
{
for (j = 1; j<= N; j++)
printf ("%4d",a3[j]);
printf ("\n");
}
printf ("\n");
}

void traspuesta (int a1[][N])
{
int i,j;
printf ("Matriz traspuesta de A:\n\n");
for (i = 1; i <= N; i++)
{
for (j = 1; j<= N; j++)
printf ("%4d",a1[j]);
printf ("\n");
}
printf ("\n");
}

void visualizar_filas (int a1[][N])
{
int i,j;
for (i = 1; i <= N; i++)
{
printf ("Fila %d =>",i);
for (j = 1; j <= N; j++)
printf ("%4d",a1[j]);
printf ("\n");
}
printf ("\n");
}

void visualizar_columnas (int a1[][N])
{
int i,j;
for (i = 1;i <= N; i++)
{
printf ("Columna %d =>",i);
for (j = 1; j <= N; j++)
printf ("%4d",a1[j]);
printf ("\n");
}
printf ("\n");
}

void elemento_mayor (int a1[][N], int *max)
{
int i,j;
*max = a1[1][1];
for (i = 1; i<= N; i++)
{
for (j =1; j<= N; j++)
{
if (a1[j] > *max)
*max = a1[j];
}
}
}

void visualizar_mayor (int *max)
{
printf ("El elemento mayor de A es %d",*max);
printf ("\n");
}
void posicion_mayor (int a1[][N],int max)
{
int i,j;
for (i = 1; i <= N; i++)
{
for (j = 1; j<= N; j++)
if (a1[j] >= max)
{
printf ("La posición del elemento mayor de A es [%d][%d]",i
,j);
}
}
printf ("\n");
}


       **********Este es el procedimiento que no se como introducir*********


void repetir (char *resp)
{
printf ("¿Desea realizar otra operación (s/n): ");
while (*resp != 's')
{
printf ("¿Desea realizar otra operación? (s/n): ");
scanf ("%c",&resp);
}
}

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #1 en: Martes 3 de Febrero de 2004, 23:16 »
0
Hola, aki tienes un ejemplo de como hacerlo:

Código: Text
  1.  
  2. void menu (int *op)
  3. {
  4. do
  5. {
  6. clrscr(); //borrar pantalla
  7. printf (&#34;************* M E N U ****************&#092;n&#092;n&#34;);
  8. printf (&#34; 1.- Sumar matrices &#092;n&#34;);
  9. printf (&#34; 2.- Traspuesta de A &#092;n&#34;);
  10. printf (&#34; 3.- Visualizar A por filas &#092;n&#34;);
  11. printf (&#34; 4.- Visualizar B por filas &#092;n&#34;);
  12. printf (&#34; 5.- Elemento mayor de A &#092;n&#34;);
  13. printf (&#34; 6.- Posición del elemento mayor de A &#092;n&#34;);
  14. printf (&#34; 7.- Salir &#092;n&#092;n&#34;);
  15. printf (&#34; Introduzca una opción: &#34;);
  16. scanf (&#34;%d&#34;,op);
  17. printf (&#34;&#092;n&#34;);
  18. if(*op&#60;1 || *op&#62;7)
  19. {
  20. printf (&#34;Ha introducido una opción no valida&#092;n&#34;);
  21. printf(&#34;Vuelva a introducir la respuesta&#34;);
  22. Sleep(1000); //temporizador de espera 1seg
  23. }
  24. }while(*op&#60;1 || *op&#62;7);
  25.  
  26. }
  27.  
  28.  

Espero que esté bien....  Si no quieres hacer el "switch" dentro de la main la puedes hacer dentro de la función opcion... los prototipos de las funciones los has creado de tipo global, por tanto podrás llamar a las distintas funciones desde donde quieras (no sé si es lo que querías...).
Sobre lo de repetir el programa hasta que el usuario quiera salir puedes hacer lo siguiente:

Código: Text
  1.  
  2. void main()
  3. {
  4. int op;
  5. ....
  6. do
  7. {
  8.  menu(&op);
  9.  ....
  10.  ....
  11. }while(op!=7);
  12. ....
  13. ....
  14. }
  15.  
  16.  

De esta manera sencilla el programa se estará realizando hasta que el usuario pulse un 7.
O también puedes hacerlo con un mensaje:

Código: Text
  1.  
  2. void main()
  3. {
  4. char opc;
  5. ...
  6. do{
  7. ...
  8.  do{
  9.   clrscr();//limpiar pantalla
  10.   printf(&#34;Desea realizar otra operacion? (s-n): &#34;);
  11.   scanf(&#34;%c&#34;,&opc);
  12.   opc=tolower(opc);//pone en minúsculas las letras
  13.  }while(opc!='s' && opc!='n');
  14.  
  15. }while(opc=='s');
  16. ....
  17. }
  18.  
  19.  
  20.  
En fin... espero ke te sea de ayuda.
Un saludo :kicking:
No hay tonto más molesto que el ingenioso.

dadevil_g

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #2 en: Miércoles 4 de Febrero de 2004, 05:04 »
0
Según mi profe de lenguajes de programación... NO se pueden introducir funciones dentro de otras esto es posible ?  :huh:
Salu2....  \"UN PROBLEMA A LA VEZ\"; empieza por lo sencillo, luego te verás haciendo lo imposible.

mabrev

  • Miembro MUY activo
  • ***
  • Mensajes: 126
    • Ver Perfil
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #3 en: Miércoles 4 de Febrero de 2004, 08:24 »
0
Hola:

  Sí que se pueden introducir funciones dentro de otras, sobretodo si quieres que ciertas funciones sean solo visibles dentro de una función determinada (como las variables locales). Tu profesor tal vez ha querido decir que no se debe, ya que puede dificultar el posterior mantenimiento de la aplicación.

Saludos.

Sepharat

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #4 en: Miércoles 4 de Febrero de 2004, 11:01 »
0
Con lo de introducir funciones dentro de otras si, me referia a introducir el switch dentro de la funcion menu. Lo preguntaba porque, a la hora de ponerlo ahi, no se que variables tengo que poner en la llamada a cada funcion. Probe primero asi:
Código: Text
  1.  
  2.               *********Asi defini los procedimientos con sus variables**********
  3.  
  4. void visualizar_A (int a1[][N]); /*Visualiza la matriz A*/
  5. void visualizar_B (int a2[][N]); /*Visualiza la matriz B*/
  6. void menu (int *op);/*Menú de operaciones con las matrices*/
  7. /*Operaciones con las matrices*/
  8. void sumar_matrices (int a1[][N], int a2[][N], int a3[][N]);
  9. void traspuesta (int a1[][N]);
  10. void visualizar_filas (int a1[][N]);
  11. void visualizar_columnas (int a1[][N]);
  12. void elemento_mayor (int a1[][N], int *max);
  13. void visualizar_mayor (int *max);
  14. void posicion_mayor (int a1[][N], int max);
  15. /*Opción de realizar otra operación o salir del programa*/
  16. void repetir (char *resp);
  17.  
  18.  
  19.          **********Asi defini las variables***********
  20. main ()
  21. {
  22.  
  23. int opcion; /*Variable para elegir opción*/
  24. int A[N][N], B[N][N], C[N][N];/*Matrices a introducir y matriz suma*/
  25. int max;/*Variable en la que se guardará el elemento mayor de la matriz A*/
  26. char resp;/*Variable para la respuesta a la función repetir*/
  27.  
  28.         ***********Y asi las use dentro de la funcion**********
  29. void menu (int *op)
  30. {
  31. int opcion;
  32. printf (&#34;************* M E N U ****************&#092;n&#092;n&#34;);
  33. printf (&#34; 1.- Sumar matrices &#092;n&#34;);
  34. printf (&#34; 2.- Traspuesta de A &#092;n&#34;);
  35. printf (&#34; 3.- Visualizar A por filas &#092;n&#34;);
  36. printf (&#34; 4.- Visualizar B por filas &#092;n&#34;);
  37. printf (&#34; 5.- Elemento mayor de A &#092;n&#34;);
  38. printf (&#34; 6.- Posición del elemento mayor de A &#092;n&#34;);
  39. printf (&#34; 7.- Salir &#092;n&#092;n&#34;);
  40. printf (&#34; Introduzca una opción: &#34;);
  41. scanf (&#34;%d&#34;,&opcion);
  42. printf (&#34;&#092;n&#34;);
  43.  
  44. switch (opcion)
  45. {
  46. case 1:sumar_matrices (A,B,C);
  47. break;
  48. case 2:traspuesta (A);
  49. break;
  50. case 3:visualizar_filas (A);
  51. break;
  52. case 4:visualizar_columnas (A);
  53. break;
  54. case 5:visualizar_mayor (&max);
  55. break;
  56. case 6:posicion_mayor (A,max);
  57. break;
  58. case 7:break;
  59. }
  60. }
  61.  
  62.  

En este caso puse las variables con el nombre con el que las defini dentro de main pero me decia al compilarlo que era la primera vez que se declaraban las variables.
Luego probe a cambiar A,B,C por a1,a2,a3 que es como las tengo en las funciones y me decia lo mismo. Y luego con a1[][N],a2[][N],a3[][N] y seguia diciendome lo mismo

mabrev

  • Miembro MUY activo
  • ***
  • Mensajes: 126
    • Ver Perfil
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #5 en: Miércoles 4 de Febrero de 2004, 12:55 »
0
Hola:

  Una posible solución es que declares las variables dentro de la función menú en vez de en main, ya que parece que sólo vas a usarlas dentro de menú, de no ser así, otra cosa que puedes hacer es declarar las variables A, B y C como globales.

Espero que te sirva.

Saludos.

Sepharat

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #6 en: Jueves 5 de Febrero de 2004, 18:17 »
0
Sí que me funciono pero ahora tengo otro problema. No me funciona la función clrscr(). ¿Alguien sabe xq es?
Saludos y gracias por las preguntas de antes

mabrev

  • Miembro MUY activo
  • ***
  • Mensajes: 126
    • Ver Perfil
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #7 en: Jueves 5 de Febrero de 2004, 20:27 »
0
Hola:

  Si no recuerdo mal la función clrscr() no funciona en entornos Unix, a falta de una solución más elegante puedes utilizar:
Código: Text
  1. system(&#34;clear&#34;);
  2.  

Espero que te sea de ayuda.

Saludos.

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: ¿cómo Se Introducen Funciones Dentro De Otras?
« Respuesta #8 en: Jueves 5 de Febrero de 2004, 23:23 »
0
Siii mabrev!!! Y no sabes de cuantos apuros me ha sacado a mi!!!!

No será muy elegante, pero para borrar la pantalla el final de tu main... es la mejor opción :D

Nos vemos  :hola:
Core Dumped
zirrus.es