elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
22 Agosto 2008, 05:54  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  Ayuda! Passar programa a ficheros!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Ayuda! Passar programa a ficheros!  (Leído 140 veces)
miquel-88

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda! Passar programa a ficheros!
« en: 28 Mayo 2008, 23:05 »

Hola cracks! Que tal?
Les explico mi problema, estoy estudiando un ciclo formativo superior de Desenvolupador de sistemas informaticos y en la assignatura de programacion c++ nos han mandado un trabajo que trata de hacer una agenda electronica utilitzando ficheros. El caso esque nos hemos quedado sin tiempo y no se ha dado el tema en clase, y me he quedado sin tiempo para aprender a hacerlo tambien ya que la fecha de entrega de tal es el martes y estoy lleno de examenes.

Les adjunto el programa ( "los printf" estan en catalan, he passado todos los comentarios a castellano) y si algun experto me pudiera hacer los arreglos mágicos para que guardara los datos en un archivo lo agradeceria mucho!!

Un saludo y gracias!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 20
void introdueix (struct agenda *p);
void esborrar (struct agenda *e);
void mostradora (struct agenda c);
void menu ();
void validar (struct agenda *v);
void pausar ();

   
   struct agenda
   {
      char nom[20];
      char cognom_primer[20];
      char cognom_segon[20];
      long telefon;
      int valid;
   };

int num=0;
int w=-1;
void main ()
{

   int comp, opcio, xivato, i;
   char cadena[20];
   char cadena2[20];
   struct agenda listin[DIM];
   long temp;

   for (i=0; i<20; i++) //Con este for se ponen todos los contactos como validos desde un principio.
      validar( &listin);
   
   do{
   
   menu();   
   scanf("%d",&opcio);//Elijo la opcion del switch
   

   fflush(stdin);
   system("cls");

   switch(opcio)
   {
      case 1:// introducir contactos
         introdueix( &listin[num]);         
      break;
   
      case 2://borrar contactos
         printf("Introdueix el nom del contacte que vols esborrar: ");
         gets(cadena);
         fflush(stdin);
         printf("\nIntrodueix l'apellit del contacte que vols esborrar: ");
         gets(cadena2);
         fflush(stdin);

         xivato=0;
         
         for (i=0; i<w; i++)
         {
            
            if ((strcmp(cadena, listin.nom)==0) && (strcmp(cadena2, listin.cognom_primer)==0))//Compara el nom i cognom introduit amb els de tots els contactes
            {   if (listin.valid==1)
               {
                  esborrar(&listin);
                  printf("\nEl contacte de nom %s  i apellit %s ha sigut esborrat.\n", cadena, cadena2);
               }
               xivato=0;
            }
            else
            xivato=1;
         }
         if (xivato==1) printf("\nNo hi ha cap contacte amb aquest nom.\n");   
         pausar();
      break;
      
      case 3://Mostrar todos los contactos de la agenda
         printf("\n           AGENDA\n");
         for (i=0; i<w; i++)
         {   
            mostradora (listin);
         }
         
         pausar();
      break;

      case 4://Buscar un contacto x el nombre
         printf("Introdueix el nom del contacte que vols buscar: ");
         gets(cadena);
         fflush(stdin);
         
         xivato=0; //Utilizo la variable xivato como "trampilla" para mostrar la frase no hay ningun contacto...
         
         for (i=0; i<w; i++)
         {
            comp=strcmp(cadena, listin.nom);//Compara el nombre introducido con todos los nombres
            if (comp==0)
            {   
               mostradora (listin);
               xivato=0;
            }
            else
            xivato=1;
         }
         if (xivato==1) printf("\nNo hi ha cap contacte amb aquest nom.\n");
         pausar();
      break;
      
      case 5://Busca un contacte por el cognom
         printf("Introdueix el cognom del contacte que vols buscar: ");
         gets(cadena);
         fflush(stdin);
         
         xivato=0;
         
         for (i=0; i<w; i++)
         {
            comp=strcmp(cadena, listin.cognom_primer);//Compara el cognom introducido con todos los cognoms

            if (comp==0)
            {   
               mostradora (listin);
               xivato=0;
            }
            else xivato=1;
         }
         if (xivato==1) printf("\nNo hi ha cap contacte amb aquest cognom.\n");
         pausar();
      break;

      case 6://Busca un contacto por su telefono
         printf("Introdueix el telefon del contacte que vols buscar: ");
         scanf("%ld", &temp);
          fflush(stdin);
         xivato=0;

         for (i=0; i<w; i++)
         {
            if (temp==listin.telefon)//Compara el valor introducido con todos los telefonos
            {
               mostradora (listin);

               xivato=0;
            }
            else xivato=1;
         }
         if (xivato==1) printf("\nNo hi ha cap contacte amb aquest telefon.\n");
         pausar();   
      break;

   }
   }while(opcio!=7);


   printf("\n\n              C0pYriGHt_by_M&k3\n\n\n");

}


void introdueix (struct agenda *p) //Funcion para introducir contactos
{
   if(num<=20)
   {
      printf("\nIntrodueix el nom del contacte:");
      gets(p->nom);
      printf("Introdueix el primer cognom del contacte:");
      gets(p->cognom_primer);
      printf("Introdueix el segon cognom del contacte:");
      gets(p->cognom_segon);
      printf("Introdueix el telefon del contacte:");
      scanf("%ld", &p->telefon);
      fflush(stdin);
      p->valid=1;
      num++;
      w=num;
   }
   pausar();
}

//Funcion para borrar contactos
void esborrar (struct agenda *e)
{
   
   e->valid=0;


}

//Funcion para mostrar los datos de un contacto
void mostradora (struct agenda c)
{
   if (c.valid==1)
   {
      printf("\nNom: %s", c.nom);
      printf("\nCognom: %s", c.cognom_primer);
      printf("\nSegon cognom: %s", c.cognom_segon);
      printf("\nTelefon: %ld\n", c.telefon);
   }
}

// Funcion para mostrar el menu
void menu ()
{
   printf("   *******************************************************");
   printf("\n   *                                                     *");
   printf("\n   *    Si vols entrar un nou contacte prem 1            *");
   printf("\n   *    Si vols esborrar un contacte prem 2              *");
   printf("\n   *    Si vols mostrar tota l'agenda prem 3             *");
   printf("\n   *    Si vols cercar un contacte pel nom prem 4        *");
   printf("\n   *    Si vols cercar un contacte pel cognom prem 5     *");
   printf("\n   *    Si vols cercar un contacte per telefon prem 6    *");
   printf("\n   *    Si vols sortir prem 7.                           *");
   printf("\n   *                                                     *");   
   printf("\n   *******************************************************\n");
   printf("   OPCIO: ");
}

//Funcion para validar un contacto
void validar (struct agenda *v)
{
   v->valid=0;
}

//Funcion para dar una pausa antes de volver a mstrar el menu
void pausar ()
{
   printf("\n\nPrem la tecla ENTER per continuar...");
   system("pause>null");
   system("cls");
}




En línea
Flakito81

Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Ayuda! Passar programa a ficheros!
« Respuesta #1 en: 31 Mayo 2008, 19:00 »

Pues considero que los fallos que tienes son de principiante y para estar acabando el curso ya tendrías que saber hacer algo asi.
1- validar supongo que lo que hace es inicializar todos los campos para comenzar a trabajar con el, en ese caso lo que tienes q hacer es pasarle el vector y recorrerlo poniendo el campo valid a cero.
Código
void validar (struct alumnos *p)
{
  int i;
  for (i = 0; i < DIM; i++)
     p[i].valid = 0;
}
 
La llamada sería:
Código
   validar(listin);
 
Y no tendrías que poner el bucle
2- En la funcion es borrar marcas como borrado un regristro, por tanto has de pasarle el registro en cuestion
Código
void esborrar (struct alumnos *p)
{
  p->valid = 0;
}
 
La llamada saria:
Código
esborrar (&listin[i]);
 
Como esborrar y validar sin el fondo hacen lo mismo puedes sustituir validar por esborrar pasandole todas las posicion, es decir el codigo que pongo a continuacion hace lo mismo que la funcion validar
Código
   int i;
 for (i = 0; i < DIM; i++)
    esborrar(&listin[i]);
 
3- La funcion que introduce los alumnos está mal y no comentaré todos los fallos que tiene, una alternativa sería:
Código
void IntroducirAlumnos( struct alumnos *p)
{
  int i;
  for (i = 0; i < DIM; i++)
 {
     printf("\nIntrodueix el nom del contacte:");
     gets(p[i]nom);
     printf("Introdueix el primer cognom del contacte:");
     gets(p[i].cognom_primer);
     //--resto de codigo
 }
}
 
Si kieres modificar la condicion del bucle y cambiarlo por un do while o un while podrias.
4- Dudo que conozcas el sentido de los indices en los arrays. No hay ni una sola vez que los uses bien. El sentido de los bucles es precisamente recorrer el vector/array.
Si pones por ejemplo:
Código
for (i = 0; i < 10; i++)
  if (listin.activar == 1)
     printf ("activado");
 
Lo que vas a tener es 10 veces la misma salida ya que no estas cambiandoel indice. por definicion el nombre de un array te lleva al primer elemento del mismo y eso es lo que haces, no te muevesdel primer elemento.

Con ello te quiero explicar que si kieres buscar un nombre has de recorrer el array
Código
for (i=0; i<w; i++)
{
  if ((strcmp(cadena, listin[i].nom)==0)  &&
      (strcmp(cadena2, listin[i].cognom_primer)==0))
  {
     //--lo que vaya en el if
  }
}//fin for
 
4.1 El uso del xivato está confuso. Solucion:
Código:
xivato=0;
BUSCAMOS EN TODO EL ARRAY
    SI (es el nombre que buscamos) HACEMOS
    {
        esborrar(&listin[i]);
        xivato = 1;
     }
SI xivato == 0 HACEMOS
   escribimos ("No esta en la lista");
5- Para los casos de buscar se hace de forma análoga, la diferencia es que en vez de marcar como borrado listaras una informacion y en vez de buscar por el nombre y apellido lo haras por el nombre o por el campo que sea.

6- Si tienes problemas para saber como pasar el vector a las funciones lo único que has de hacer es declararlo como global.
7- Usa funciones para buscar, asi será mas claro el código
8- Declarar variables globales tan solo sería el vector. Si el vector tiene 20 registros y solo hay 5 en uso y no kieres recorrer los 20 tan solo has de avanzar en el vector hasta encontrar el 0 lo que indicaria que el resto de las posciones estan vacias. Para ello has de cambiar la forma de marcar los registros borrardos por ejemplo marcandolos con -1. Cuando vayas a introducir nuevos registros lo haras en las posiciones marcadas con 0 o -1.
Código
   while (listin[i].activ != 0 && listin[i].activ != -1 && i < DIM)
     i++;
  if ( i == DIM)
     printf ("vector lleno\n");
 else
    IntroducirAlumno(listin[i]);
 
Si declaras el vector como global solo le pasarias el indice
9- Ahorra la variable comp ya puedes hacer la evaluacion con un if, al igual que en el caso borrar.

Un saludo!

PD: No he compilado el codigo asi que es posible que tenga algun pekeño error que seguro sabras resolver sin problema, pero de no ser asi pregunta nuevamente
En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  





Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC