# Ansi c. Agenda, nº de telefono y nombre. Problemas



## Not (Mar 4, 2011)

Buenas tardes a todos ya es viernes, y vuelven los problemas.

Pues los problemas creo que son algo complicado, muchas cosas nuevas y poca práctica.

El siguiente programa debe hacer lo siguiente:

- Guardar un nombre y su nº de telefono.
- Buscar un nombre y asociarle su nº correspondiente de telefono.
- Buscar un ºn de telefono y asociarle su nombre.


Aqui dejo el código fuente.
Primero leer los problemas abajo.

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

void guardar ();
void BuscarNombre ();
void BuscarTelefono ();

int main ()
{ 
    int i;
    int a;
    char agenda [20][60];
    long telefono [20];
    int posicion=0;
    printf ("Elige una de las siguientes opciones.\n");
    printf ("Pulse 0 para guardar un Contacto y su Nº de telefono\n");
    printf ("Pulse 1 para buscar un nombre.\n");
    printf ("Pulse 2 para buscar un Telefono\n");
    scanf ("%d", &a);
    switch (a)
    {
      case 0:
           //funcion guardar
           guardar (agenda [20],&telefono, &posicion); 
           break;
      case 1:
           //funcion buscar nombre
           BuscarNombre (agenda [20],&telefono, &posicion);
           break;
      case 2:
           //funcion buscar tlfn 
           BuscarTelefono (agenda [20],&telefono, &posicion);         
           break; 
      case 3:
           for (i=0;i<20;i++)
           printf ("%c", agenda [i]);        
     } 
     system ("pause");   
    
}

void guardar (char agenda [] [60], long *telefono, int *posicion)
{
     char  fin [4];

      do
      {        
          printf ("Dame un nombre");
          scanf ("%s", &agenda [*posicion]);
          printf ("Dame ahora, el numero de telefono correspondiente");
          scanf ("%ld", &telefono [*posicion]);
          (*posicion)++;
          printf ("Para salir pulse fin");
          scanf ("%c", &fin);
          
        if (fin=="fin")
             break; 
       } 
       while ((*posicion)<20);

   return; 
     
}
```



(Utilizo Dev++)
Solo he puesto la función guardar pues es la 1ª que me da problemas.

Bien pues el primer problema es que me he dado cuenta que no me guarda los nombres que yo le introduzco (desconozco el motivo).

El siguiente es que, se supone que el usuario no tiene porque guardar 20 nombres seguidos, y elegir cuando terminar, pues para eso puse el if (fin=="fin") break; Pues tampoco funciona.

Además solo me deja introducir 4 nombres con su nº de telefono correspondiente.

Lo primero muchas gracias por leerme.
Si alguien ve el problema y puede ayudarme se lo agradezco mucho.

Un saludo.


----------



## Unikfriend (Mar 4, 2011)

Hi again Not,
que mal que es viernes por la noche y tienes tarea pendiente jijiji,
en este programa todas las operaciones son en memoria?
todavia no utilizas archivos?


----------



## Not (Mar 4, 2011)

Hola Unikfriend pues si, siempre con tarea

Pues no sé a que te refieres con archivos.
Pero solo podemos usar punteros (si te refieres a eso).
un abrazo..


----------



## Unikfriend (Mar 4, 2011)

para empezar creo que te falta un while que te este preguntando 
por una la opcion hasta que ya no quieras.
veo que tienes la opcion 3 como ver lista,
tendrias que agregar una opcion 4 para salir del while y
terminar el programa. no se si me entiendes.


----------



## Not (Mar 4, 2011)

Entiendo el while que pregunte si quiere volver a hacerlo, pero no entiendo porque se salta el scanf (para terminar).

La opcion 3 era para ver si guardaba los nombres, pero no los guarda (salen simbolos raros).

La opcion 4 la entiendo pero nose como hacerlo.

Otra posibilidad sería guardar un nombre y volver al menu principal, pero no sé como volver al menu sin salir del programa.

Perdona Unikfriend el fallo era sencillo, tenia %c en vez de %s


----------



## Unikfriend (Mar 4, 2011)

para empezar hay que ser mas positivo, jijii eso hace gran diferencia,
empiezas con lo que si sabes, el codigo que posteas no se hizo solo,
de algun lado lo sacaste. Te voy ayudar un poco pero tienes que echarles
mas ganas, prueba esto.

void guardar (char *pAgenda, long *pTelefono, int *pPosicion)
{
if(*pPosicion>=20)return;
printf ("\nDame un nombre:");
scanf ("%s", pAgenda);
printf ("Dame el numero de tel:");
scanf ("%ld", pTelefono);
(*pPosicion)++;
}

int main ()
{
int i;
int a;
char agenda [20][60];
long telefono [20];
int posicion = 0;
for (i=0;i<20;i++)
{
 for (a=0;a<60;a++)agenda _[a] = 0; 
 telefono  = 0;
}
a = 0;
while(a!=4)
{
 printf ("Elige una de las siguientes opciones.\n");
 printf ("Pulse 0 para guardar un Contacto y su Nº de telefono\n");
 printf ("Pulse 1 para buscar un nombre.\n");
 printf ("Pulse 2 para buscar un Telefono\n");
 printf ("Pulse 3 para ver Lista\n");
 printf ("Pulse 4 para Terminar\n");
 scanf ("%i", &a);
 switch (a)
 {
 case 0:
           //funcion guardar
           guardar (&agenda[posicion][0], &telefono[posicion], &posicion); 
           break;
     case 1:
   //funcion buscar nombre
//           BuscarNombre (agenda [20],&telefono, &posicion);
   break;
 case 2:
   //funcion buscar tlfn
//   BuscarTelefono (agenda [20],&telefono, &posicion);
   break;
 case 3:
   for (i=0;i<5;i++)
   printf ("%s, %ld::\n", agenda ,telefono);
   system ("pause");
 }
}
}

_


----------



## Not (Mar 4, 2011)

Unikfriend tus programas siempren funcionan, ahora viene comprender cada paso, si no de poco me sirve tu ayuda. gracias 

Voy a por un poco de café, y a leer esto tranquilamente.

gracias de nuevo


----------



## Unikfriend (Mar 4, 2011)

lamentablemente no siempre funcionan 
me pregunto por que sera?


----------



## Dr. Zoidberg (Mar 4, 2011)

Seguimos sin estudiar el lenguaje, no?
Por que no lees el libro que te recomendé hace tiempo?
Estas cometiendo errores MUY SERIOS por no preocuparte siquiera en leer :enfadado:

```
...
char fin[4];   //OK. Esto es un string.

/*[COLOR=Red][B]scanf("%c", fin);[/B][/COLOR]    Esto está MAL. No podés usar %c para leer un string!!!!*/
scanf([B]"%s"[/B], fin);      // Así está bien

[COLOR=Red]/* [B]if(fin== "fin")[/B][/COLOR]         Esto está PESIMO!!!! Así no se comparan los strings!!! */
if( strcmpi( fin, "fin" ) == 0 )   // Así está bien
   break;
```


----------



## Not (Mar 14, 2011)

Buenas tardes, disculparme por no responder en este tiempo he estado haciendo otros programas (con éxito).

Después de este tiempo, conozco un poco más el funcionamiento de las funciones, y el paso de variables hacia ellas, pero a la hora de usar punteros me lio, sobre todo con los array's bidimensionales, y lamentablemente debo usarlos.

Estoy intentando hacer un pequeño programa para ver como funciona, fijandome en Unikfriend, pero me arroja fallo (invalid type argument of unary)
dejo el codigo:


```
void funcion (char *agenda, int *posicion);
int main ()
{
    char agenda [20] [60];
    int posicion=0;
    
    funcion (&agenda[posicion][0]);
    
    system ("pause");    
}
void funcion (char *agenda, int *posicion)
{
     printf ("%s", *agenda [*posicion]);
     
     system ("pause");
}
```

Se que el printf de la funcion no va a mostrar nada, ¿en que me equivoco?.
Muchas gracias.


----------



## Unikfriend (Mar 14, 2011)

Hi again Not,
Este programa se complementa con el anterior?
para que sirve la funcion "funcion"? pregunto porque no la estas llamando..


----------



## Not (Mar 14, 2011)

perdona la llamada tiene que ser a "funcion" no a "guardar", pero me sigue dando error y no sé porque.
un saludo

Unikfriend intento entender el funcionamiento de los punteros, con tu ayuda anterior.
gracias


----------



## Unikfriend (Mar 14, 2011)

Hi not,
void funcion (char *nom)
{
 printf ("name:%s\n", nom );
}
void guardar (char *pAgenda)
{
 printf ("\nDame un nombre:");
 scanf ("%s", pAgenda);
 funcion (pAgenda);
}
int main ()
{
 char agenda [20] [60];
 int posicion=0;
 unsigned char *nom;    //declarar nom como un apuntador a una direccion
        //de memoria que sera tratada como usigned char
 unsigned char Texto[]= "Hello."; //declarar Texto como un vector unidimensional de longitud 6
        //y lo inicializa con "Hello."
 nom = &Texto[0];    //establecer que nom apunte a la direccion en memoria de Texto[0]
 printf("%s\n",nom);    //imprimir como una cadena de caracteres los datos en memoria
        //iniciando en la direccion a la que apunta nom hasta encontrar un nulo
 *nom = 'B';     //colocar una 'B' en la direccion de memoria a la que apunta nom
 printf("%c\n",*nom);   //imprimir como caracteres el dato en memoria iniciando en
        //la direccion almacenada en nom
 nom++;      //incrementar en uno la direccion a la que apunta nom
 printf("%s\n",nom);    //imprimir como una cadena de caracteres los datos en memoria
        //iniciando en la direccion a la que apunta nom hasta encontrar un nulo
 nom++;      //incrementar en uno la direccion a la que apunta nom
 printf("%s\n",nom);    //imprimir como una cadena de caracteres los datos en memoria
        //iniciando en la direccion a la que apunta nom hasta encontrar un nulo

 guardar (&agenda[posicion][0]);
 system ("pause");
}


----------



## Not (Mar 14, 2011)

Unikfriend has dado en el clavo, muchas gracias, cuando tenga el resultado lo subo.

Muchas gracias y un saludo


----------

