[Curso] Introducción a la programación en C (XIII)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

[Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

<< Anterior Siguiente >>

"El ordenador es sólo un idiota rapidísimo" - Anónimo

Localidad de variables

Con localidad o visibilidad de variables, nos referimos a qué partes del código reconocen una variable. Las variables declaradas dentro de una función sólo son reconocidas por dicha función. Por ejemplo:

Código: Seleccionar todo

int funcionA(void)
{
   int a = 0;
   return a;
}

int funcionB(void)
{
   a = 1;
   return a;
}

Esto nos daría un error de compilación, ya que el compilador no sabría decir qué es a para funcionB. Es decir, las declaraciones de las variables son locales, y por tanto sólo se pueden considerar dentro del ámbito de la función.

Se llaman variables globales a las que no están declaradas dentro de ninguna función. Estas variables son accesibles desde cualquier parte del programa. Por ejemplo:

Código: Seleccionar todo

int a;

int funcionB(void)
{
   a = 1;
   return a;
}

int main(int argc, char* argv[])
{
   a = 0;
   print("%d\n", a);
   print("%d\n", funcionB());
   return 0;
}

Esto es perfectamente válido y compila sin problemas porque a es global. Si hubiésemos declarado otra variable local a en funcionB, ésta pasaría por encima de la a global, es decir, la variable a global no podría ser referenciada por funcionB, sino que todas los accesos a a se referirán a la a local, no la global.

No se recomienda el uso de variables globales ya que pueden ser origen de errores muy difíciles de detectar y corregir.

Recursividad

Bueno, empezamos con las cosas serias sobre funciones. Éste es de los temas que más le cuesta entender a la gente, y con razón.

Se llama recursividad a cualquier proceso que implique que una misma función se llame a sí mismo un número determinado de veces. Es un concepto parecido al bucle, y que generalmente realiza la misma función, pero la recursividad queda más bonita y elegante, aunque generalmente suele ser más lenta que un bucle.

Existen lenguajes de programación que se basan masivamente en la recursividad, como por ejemplo Haskell o LISP, que se basan en una filosofía de programación llamada funcional, en contraste con C que es imperativo.

Veamos un ejemplo de función recursiva, por ejemplo el cálculo de un número factorial (que ya vimos en el tema anterior):

Código: Seleccionar todo

// Calcula el factorial de un número por recursividad
unsigned long factorial(unsigned long n)
{
   // Si n es 1 o 0, el factorial es 1
   if (n <= 1)
      return n;
   // Si n es > 1, n! = n * (n-1)!
   else
      return n * factorial(n-1);
}

Como vemos, el código es muchísimo más corto y sencillo, y no se usan variables locales a la función factorial().

Os dejo con algunos ejercicios para este tema. No debéis utilizar variables locales en las funciones recursivas.

  • Implementar un programa que busca el número máximo en un vector de 20 enteros con signo introducidos por el usuario usando recursividad.
  • Implementar un programa que busca el número máximo en un vector de 20 enteros con signo aleatorios (el signo de cada elemento también debe ser aleatorio) usando recursividad.
  • Implementar un programa que eleva un número a una potencia, ambos dados por el usuario, usando una sola función recursiva.
  • Implementar un programa que sume los elementos de un array usando funciones recursivas.
  • Implementar un programa que sume sólo los elementos pares de un array usando funciones recursivas.
  • La secuencia de números de Fibonacci es 0,1,1,2,3,5,8,13,21... Implementar un programa que use una función recursiva que calcule la secuencia de Fibonacci hasta un número máximo dado por el usuario.
  • Implementar la agenda telefónica de los temas anteriores usando recursividad en lugar de los bucles de búsqueda. Añadir una función de búsqueda recursiva de número y/o nombre de forma recursiva. A ver quién hace el mejor motor de búsqueda :D

Si conseguís entender la recursividad, habréis dado un gran paso adelante en la comprensión de funciones, y de la programación en general.

Para ser sincero, no espero que muchos entendáis esto, pero tengo esperanzas en que alguno sí lo haga ;)

Suerte y al toro.

<< Anterior Siguiente >>
Imagen

Avatar de Usuario
Dante
Enteradillo
Enteradillo
Mensajes: 42
Registrado: 28 May 2010, 01:51

Re: [Curso] Introducción a la programación en C (XII)

Mensaje por Dante »

m0skit0 creo que te equivocaste de numero, es el XIII no el XII.

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XII)

Mensaje por ~Rdavid~ »

Que bien que te hayas animado a seguir, lastima que yo este apunto de comenzar exámenes finales del cole y no tengo mucho tiempo pero apenas los termine seguiré de fijo :oki:
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

Dante escribió:m0skit0 creo que te equivocaste de numero, es el XIII no el XII.

Cierto, corregido, gracias :oki:
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

Bueno aquí de nuevo con las practicas :tongue:

Aquí te dejo el primero, que espero que sea lo que pedías xD, los demás los hago cuando vea que errores tenga para no estar volviendo a hacer los mismos errores :D

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

//Funcion para escribir y sacar el numero maximo del array
int num_maximo(int i, int mayor)
{
      int vec[20];
      //Para que se dentenga cuando i es igual 20
      if(i!=20)
      {
            printf("Numero %d: ",i+1);
            scanf("%d", &vec[i]);
            if(vec[i]>mayor)
            {
                  mayor = vec[i];
            }
            
            i++;
            
      }
      else
      {
            return mayor;
      }
      //Utilizamos denuevo la funcion de forma recursiva
      mayor = num_maximo(i,mayor);
      
}
      
//Funcion principal
int main(int argc, char *argv[])
{
      int mayor=0, i=0, vec_mayor;
      
      
      printf("Escribe 20 numeros\n");
      
      //Le asiganamos el valor de retorno de la funcion num_maximo
      vec_mayor = num_maximo(i,mayor);
      
      //Lo imprimimos
      printf("El numero mayor del array es %d\n",vec_mayor);   
      
      return 0;
}

Espero que haya captado lo de recursividad porque la verdad esta dificil :tongue:

Saludos.

Edit: veo que el foro no quiso formatear mi código que ya estaba formateado :tiro:

Edit: Ya se ve formateado
Última edición por ~Rdavid~ el 26 Nov 2010, 14:06, editado 2 veces en total.
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

No está mal ;) Intenta que las funciones hagan una tarea lo más concreta posible. Estaría mejor que pusieras una función para rellenar el array y otra para buscar el máximo.

Ánimo, que la recursividad parece complicada, pero cuando le pillas el truco es coser y cantar. Si te gusta esa forma de programar te puedo aconsejar algunos lenguajes funcionales (que se basan en recursividad a saco) muy interesantes ;)
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

Ánimo, que la recursividad parece complicada, pero cuando le pillas el truco es coser y cantar. Si te gusta esa forma de programar te puedo aconsejar algunos lenguajes funcionales (que se basan en recursividad a saco) muy interesantes ;)


Tienes razón, cada vez le voy agarrando mejor el truco, los lenguajes pues me gustaría aprender más pero por el momento ocupo dominar bien C :lol:

No está mal ;) Intenta que las funciones hagan una tarea lo más concreta posible. Estaría mejor que pusieras una función para rellenar el array y otra para buscar el máximo.


Lo e echo como me sugeriste y de paso te dejo el segundo ejemplo, después pongo los demás.

Primero

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int vec[20];

int num_maximo(int i, int mayor)
{
      //Para que se dentenga cuando i es igual 20
      if(i!=20)
      {
            if(vec[i]>mayor)
            {
                  mayor = vec[i];
            }
            
            i++;
            
      }
      else
      {
            return mayor;
      }
      //Utilizamos denuevo la funcion de forma recursiva
      mayor = num_maximo(i,mayor);
      
}

void rellenar_vector(int i)
{
      //Para que se dentenga cuando i es igual 20
      if(i!=20)
      {
            printf("Numero %d: ",i+1);
            scanf("%d", &vec[i]);
            
            i++;
            
            //Utilizamos denuevo la funcion de forma recursiva
            rellenar_vector(i);
      }
      
      
}
      
      

int main(int argc, char *argv[])
{
      int mayor=0, i=0, vec_mayor;
   
      
      printf("Escribe 20 numeros\n");
   
      rellenar_vector(i);
      vec_mayor = num_maximo(i,mayor);
      
      
      printf("El numero mayor del array es %d\n",vec_mayor);   
      
      return 0;
}



Segundo

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int vec[20];

//Funcion para buscar el numero mayor del array
int num_maximo(int i, int mayor)
{
      //Para que se dentenga cuando i es igual 20
      if(i!=20)
      {
            if(vec[i]>mayor)
            {
                  mayor = vec[i];
            }
            
            i++;
            
      }
      else
      {
            return mayor;
      }
      
      mayor = num_maximo(i,mayor);
      
}

//Funcion para rellenar el vector de numeros aleatorios
void vector_aleatorio(int i)
{
      //Para que se dentenga cuando i es igual 20
      if(i!=20)
      {              //Rellenamos el vector con numero aleatorios negativos y positivos
            vec[i]= (rand()%40)-20;
            printf("Numero %d: %d\n", i+1, vec[i]);
            
            i++;
            
            
            vector_aleatorio(i);
      }
      
      
}
      
      
//Función principal
int main(int argc, char *argv[])
{
      int mayor=0, i=0, vec_mayor;
      
                //Iniciamos la funcion de numeros aleatorios con el reloj
      srand(time(NULL));   
      
      printf("Vector de 20 números aleatorios\n");
   
      vector_aleatorio(i);
      vec_mayor = num_maximo(i,mayor);
      
      
      printf("El numero mayor del array es %d\n",vec_mayor);   
      
      return 0;
}


Edit: Tercero

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

//Funcion para calcular la potencia de un numero de forma recursiva
int potencia_de_numero(int num, int poten,int i, int result)
{
      //Para que se dentega cuando i sea igual a la potencia indicada
      if(i != poten)
      {   
            result= result * num;
            i++;
            result = potencia_de_numero(num,poten,i,result);
      }
      
      
      return result;
}
      

int main(int argc, char *argv[])
{
      int i=0, num, poten,result=1;

      printf("Escribe un numero a elevar: ");
      scanf("%d", &num);
      printf("Escribe una potencia: ");
      scanf("%d", &poten);
   
      //Imprime la potencia
      printf("El numero %d elevado a %d es %d\n", num, poten,potencia_de_numero(num,poten,i,result));
      
      return 0;
      
}


Cuarto

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int vec[50];

//Funcion para sumar los numeros de un array
int sumar_array(int i, int result)
{      
      //Para que se dentenga cuando llegue a 50
      if(i != 50)
      {
            result = result + vec[i];
            i++;
            
            result = sumar_array(i,result);
      }
      
      return result;
}

//Rellenamos el array con numero aleatorios
void vector_aleatorio(int i)
{
      //Para que se dentenga cuando llegue a 50
      if(i!=50)
      {
            vec[i]= (rand()%100)-50;
            printf("Numero %d: %d\n", i+1, vec[i]);
            
            i++;
            
            
            vector_aleatorio(i);
      }
      
      
}

//Funcion principal
int main(int argc, char *argv[])
{
      int result =0, i=0;
      
      vector_aleatorio(i);
      
      //Imprimimos la suma del array
      printf("La suma del array es: %d\n",sumar_array(i,result));
      
      return 0;
}
Imagen

Avatar de Usuario
pspCaracas
Moderador Global
Moderador Global
Mensajes: 3080
Registrado: 03 Sep 2009, 03:29
Ubicación: Buenos Aire - Argentina
Contactar:

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por pspCaracas »

Buen curro...

Espero leer algún día sobre librerías, y cross-commpiling, que con lo que me está tocando lidiar en el curro :laughing:

De momento sigo los cursos y espero que me sirvan para el curro, y por qué no, para la scene :geek:
http://farm3.static.flickr.com/2497/3983880148_f5ae0aaab2_o.png

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

Buen trabajo, pero tengo pegas :mrgreen:

Primero, segundo y cuarto ejercicio: no uses variables globales, jamás, a menos que no haya ninguna otra alternativa. Como pista de diré que si pasas un vector a una función como argumento, si modificas sus elementos, se quedan modificados al salir de la función (es decir, no aplica la localidad de función que vimos anteriormente). Esto es debido a que un vector es un puntero, algo que explicaré en el próximo capítulo ;)

Tercero:

Código: Seleccionar todo

int potencia_de_numero(int num, int poten,int i, int result)

Demasiados argumentos. Intenta hacerlo con int potencia_de_numero(int base, int exponente). Recuerda que puedes crear tantas funciones como consideres.
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

Perdona la inactividad es que mi pc esta mala pero ahora ya puedo seguir con esto, los primero 6 ya los había echo hace rato, ahí te dejo el 7.

primero

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

//Funcion para calcular el numero maximo
int num_maximo(int i, int mayor, int vec[])
{
      //Para que se detenga cuando i llegue a 20
      if(i!=20)
      {
            if(vec[i]>mayor)
            {
                  mayor = vec[i];
            }
            
            i++;
            
      }
      else
      {
            return mayor;
      }
      
      //Lo reutilizamos de forma recursiva
      mayor = num_maximo(i,mayor, vec);
      
}

//Funcion para rellenar el vector
void rellenar_vector(int i, int vec[])
{
      //Para que se detenga cuando i llegue a 20
      if(i!=20)
      {
            printf("Numero %d: ",i+1);
            scanf("%d", &vec[i]);
            
            i++;
            
            //Lo reutilizamos de forma recursiva
            rellenar_vector(i,vec);
      }
      
      
}
      
      
//Funcion principal
int main(int argc, char *argv[])
{
      int mayor=0, i=0, vec_mayor;
      int vec[20];
      
      printf("Escribe 20 numeros\n");
   
      rellenar_vector(i,vec);
      vec_mayor = num_maximo(i,mayor,vec);
      
      //imprimimos el resultado
      printf("El numero mayor del array es %d\n",vec_mayor);   
      
      return 0;
}


Segundo

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


//Funcion para calcular el numero maximo
int num_maximo(int i, int mayor, int vec[])
{
      //Para que se detenga cuando i llegue a 20
      if(i!=20)
      {
            if(vec[i]>mayor)
            {
                  mayor = vec[i];
            }
            
            i++;
            
      }
      else
      {
            return mayor;
      }
      
      mayor = num_maximo(i,mayor, vec);
      
}

//Funcion para rellenar el vector
void vector_aleatorio(int i, int vec[])
{
      
      if(i!=20)
      {
            //Rellenamos el vector aleatoriamente con el reloj
            vec[i]= (rand()%40)-20;
            printf("Numero %d: %d\n", i+1, vec[i]);
            
            i++;
            
            //Lo reutilizamos de forma recursiva
            vector_aleatorio(i,vec);
      }
      
      
}
      
      
//Funcion principal
int main(int argc, char *argv[])
{
      int mayor=0, i=0, vec_mayor;
      int vec[20];
      
      srand(time(NULL));   
      
      printf("Vector de 20 números aleatorios\n");
   
      vector_aleatorio(i,vec);
      vec_mayor = num_maximo(i,mayor,vec);
      //imprimimos el resultado
      printf("El numero mayor del array es %d\n",vec_mayor);   
      
      return 0;
}


Tercero

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

//Funcion para calcular la potencia de un numero de forma recursiva
int potencia(int base, int expo)
{
      int result = 1;
      
      //Si el exponente es 0 resgresa uno
      if(expo==0)
      {
            return 1;
      }
      else
      {       //se va reduciendo el exponente en uno
            result= potencia(base,expo-1) * base;
      }
      
      
      return result;
}
      
//Funcion principal
int main(int argc, char *argv[])
{
      int base, expo;

      printf("Escribe un numero a elevar: ");
      scanf("%d", &base);
      printf("Escribe una potencia: ");
      scanf("%d", &expo);
   
      //Imprime la potencia
      printf("El numero %d elevado a %d es %d\n", base, expo,potencia(base,expo));
      
      return 0;
      
}


Cuarto

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


//Funcion para sumar los numeros de un array, max se puede omitir y poner un numero especifico para tener menos argumentos
int sumar_array(int i, int result,int vec[],int max)
{      
      //Para que se dentenga cuando llegue a max
      if(i != max)
      {
            result = result + vec[i];
            i++;
            
            result = sumar_array(i,result,vec,max);
      }
      
      return result;
}

//Rellenamos el array con numero aleatorios
void vector_aleatorio(int i, int vec[], int max)
{
      //Para que se dentenga cuando llegue a 50
      if(i!=max)
      {
            vec[i]= (rand()%100)+1;
            printf("Numero %d: %d\n", i+1, vec[i]);
            
            i++;
            
            
            vector_aleatorio(i,vec,max);
      }
      
      
}

//Funcion principal
int main(int argc, char *argv[])
{
      int result =0, i=0,max;
      printf("Especifique el tamaño del array: ");
      scanf("%d", &max);

      int vec[max];
      srand(time(NULL));   
      vector_aleatorio(i,vec,max);
      
      //Imprimimos la suma del array
      printf("La suma de los elementos del array es: %d\n",sumar_array(i,result,vec,max));
      
      return 0;
}


Quinto

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//Funcion para sumar los numeros de un array, max se puede omitir y poner un numero especifico para tener menos argumentos
int sumar_array(int i, int result,int vec[],int max)
{      
      //Para que se dentenga cuando llegue a max
      if(i != max)
      {
            if(vec[i]%2==0)
            {
                  result = result + vec[i];
            }      
            i++;
            result = sumar_array(i,result,vec,max);
      }
      
      return result;
}

//Rellenamos el array con numero aleatorios pares e impares
void vector_aleatorio(int i, int vec[], int max)
{
      //Para que se dentenga cuando llegue a 50
      if(i!=max)
      {
            vec[i]= (rand()%100)+1;
            if(vec[i]%2==0)
            {
                  printf("Numero %d: %.2d Par\n", i+1, vec[i]);
            }
            else
            {
                  printf("Numero %d: %.2d Impar\n", i+1, vec[i]);
            }
            i++;
            
            
            vector_aleatorio(i,vec,max);
      }
      
      
}

//Funcion principal
int main(int argc, char *argv[])
{
      int result =0, i=0,max;
      printf("Especifique el tamaño del array: ");
      scanf("%d", &max);

      int vec[max];
      srand(time(NULL));
      vector_aleatorio(i,vec,max);
      
      //Imprimimos la suma del array
      printf("La suma de los elementos pares del array es: %d\n",sumar_array(i,result,vec,max));
      
      return 0;
}


Sexto

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

//Funcion fibonacci
double Fibonacci(int num)
{
      //Si es 0 ó 1 regresa el mismo valor
      if(num ==0||num==1)
      {
               return num;
         }
         else
         {
               return Fibonacci(num - 1) + Fibonacci(num - 2);
         }
}


//Funcion principal
int main(int argc, char *argv[])
{
      int num;

      printf("Escriba el numero maximo: ");
      scanf("%d", &num);

      // Imprime el fibonacci de num
      printf("El termino %d de Fibonacci es: %.0lf\n", num, Fibonacci(num));
}


Por cierto te falto un 1 adelante en la secuencia de Fibonacci :tongue:

Ultimo
Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Struct que contiene las variables de cada entrada
struct Entradas
{
      int tel;
      char nombre[30];
      int accesos;
         
};

struct Entradas agenda[20];

//Funcion que muestra el menu y regresa la opcion que se escogió
int menu(int opcion, int libre)
{
      system("clear");
      printf("               Menu\n\n");
      printf("Presione 1 para crear una nueva entrada, libres [%d]\n", libre);
      printf("Presione 2 para ver las entradas\n");
      printf("Presiona 3 para editar una entrada\n");
      printf("Presiona 4 para borrar una entrada\n");
      printf("Presiona 5 para salir\n");
            
      scanf("%d", &opcion);
      
      return opcion;
}

//Funcion registra una nueva entrada regresando el id
int nueva_entrada(int id)
{                  
      printf("Escribe el nombre: ");
      scanf("%s",agenda[id].nombre);
      printf("Escribe el numero de telefono: ");
      scanf("%d", &agenda[id].tel);
      agenda[id].accesos=1;
      printf("Su ID es: %d\n", id);
      printf("Presione enter para regresar al menu\n");
      system("read foo");
   
      return id;
}

//Funcion que imprime las id accesadas y regresa la id escogida
int seleccionar_id(int id, int escog)
{
      //Utiliza la recursividad mientras id sea menor que 20
      if(id<20)
      {
            if(agenda[id].accesos!=0)
                  {
                        printf("%d ", id);
                        id++;
                        
                        seleccionar_id(id,escog);
                  }
      }

         
      printf("\nID: ");
      scanf("%d", &escog);
      
      return escog;
}

//Funcion para ver el id escogido
void ver_id(int escog)
{
      if(agenda[escog].accesos == 0||escog<0||escog>20)
      {
            printf("ID erronea\n Presione enter para regresar al menu\n");
            system("read foo");
      }
      else
      {
            printf("Nombre: %s\n",agenda[escog].nombre);
            printf("Telefono: %d\n\n", agenda[escog].tel);
            printf("Presione enter para regresar al menu\n");
            system("read foo");
      }
}

//Funcion para editar un id escogido
void editar_id(int escog)
{
      if(agenda[escog].accesos == 0||escog<0||escog>20)
      {
            printf("ID erronea\n Presione enter para regresar al menu\n");
            system("read foo");
      }
      else
      {
            printf("Nombre: %s\n",agenda[escog].nombre);
            printf("Telefono: %d\n\n", agenda[escog].tel);
                  
                  
              printf("Escriba el nuevo nombre: ");
            scanf("%s", agenda[escog].nombre);
            printf("Escriba el numero de telefono: ");
            scanf("%d", &agenda[escog].tel);
            printf("\n");
            printf("Presione enter para regresar al menur\n");
            system("read foo");
      }
}


//Funcion que sale del programa al pulsar 5
int menu_salir(int opcion, int salir)
{
      if(opcion!=5)
      {
            printf("No has presionado ninguna de las opciones\n");
            printf("Presione enter para regresar al menur\n");
            system("read foo");   
      }
      else
      {
            printf("Saliendo...\n");
            salir = 0;
            return salir;
      }
}   

//Funcion que le da el valor de 0 a todos los accesos
void accesibilidad(int i)
{   
      //Utiliza la recursividad mientras id sea menor que 20
      if(id<20)
      {   
            agenda[i].accesos = 0;   
            id++;
            accesibilidad(i);
      }

}

//Funcion principal
int main(int argc, char *argv[])
{
      int libre = 20;
      int salir =1;
      int id=0, escog,i;
      int opcion;
      
      accesibilidad(i);
      
      //Permite que el menu se repita hasta que se desee salir
      while(salir==1)
      {
            
            opcion = menu(opcion, libre);
            
            //Switch con para iniciar cada opcion del menu
            switch(opcion)
            {
               case 1:
                  //Si no hay entradas libres regresa al menu
                  if(libre==0)
                  {
                        printf("No quedan entradas disponibles\n Presiona enter para regresar al menu");
                        system("read foo");
                  }
                  else
                  {
                        
                        id=nueva_entrada(id);
                        id++;
                        libre--;
                  }
                  
                  break;
               
               case 2:
                  
                  printf("Seleccione una de las siguientes IDs: ");
                  escog = seleccionar_id(id, escog);
                  //Si la id no ha sido accedida o es < que 0 o > que 20 regresa la menu
                  if(agenda[escog].accesos == 0||escog<0||escog>20)
                  {
                        printf("ID erronea\n Presione enter para regresar al menu\n");
                        system("read foo");
                  }
                  ver_id(escog);
                  break;
                  
               case 3:
                  escog = seleccionar_id(id, escog);
                  editar_id(escog);
                  
                  break;
                  
               case 4:
                  escog = seleccionar_id(id, escog);
                  //Si la id no ha sido accedida o es < que 0 o > que 20 regresa la menu
                  if(agenda[escog].accesos == 0||escog<0||escog>20)
                  {
                        printf("ID erronea\n Presione enter para regresar al menu\n");
                        system("read foo");   
                  }
                  else
                  {
                        printf("Nombre: %s\n",agenda[escog].nombre);
                        printf("Telefono: %d\n\n", agenda[escog].tel);
                        
                        libre++;
                        agenda[escog].accesos = 0;
                        printf("ID borrado\n");
                        escog--;
                        printf("Presione enter para regresar al menur\n");
                        system("read foo");         
                  }
                  
                  break;
                  
               default:
                  //Sala del programa al pulsar 5
                  salir = menu_salir(opcion, salir);
                  break;
            }
      }

      return 0;
}



Saludos!
Imagen

Responder