Foros de daboweb

MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación => Webmasters - Diseño Web - Programación - Diseño gráfico => Mensaje iniciado por: Onefree en 06 de Junio de 2004, 12:49:04 pm

Título: HACER UN PROGRAMA EN C
Publicado por: Onefree en 06 de Junio de 2004, 12:49:04 pm
Bueno soy de Tenerife y estoy estudiando módulo de grado superior de informática de desarrollo de aplicaciones, esta semana que entra tengo el examen final de programación en C bajo Windows , si la apruebo , apruebo todas las asignaturas y paso al siguiente año. Quería pedir un favor, el profesor nos dio este ejercicio y nos dijo que el del examen sería muy parecido me gustaría si alguno de ustedes, puede echarle un vistazo, seguro que para la gente que entienda es un ejercicio chorra y me gustaría tenerlo perfecto para así ir al examen seguro.
Aquí dejo el ejercicio:

Disponemos de tres ficheros binarios,uno de clientes (CLIENTES.DAT),otro de artículos y el fichero de facturas. Los artículos que pertenezcan a la misma factura tendrán el mismo número de facturas, por tanto, habrá tantos registros con el mismo Nº de Factura como artículos tenga una factura.

struct cli{ //Registro de clientes
            int Cod_Cli; //Código del artículo
            char nombre[25];
            char ciudad[25];
            }vcli;

struct art{ //Registro de artículos
            int Cod_Art; //Código del cliente
            char nom_Art[25];
            int precio;
            int existencias;
            }vart;

struct fact{
           int N_Fact; //Nº de Factura
           int Cod_Art; //Código del artículo
           int Cod_Cli; //Código del cliente
           int Can_Art; //Cantidad de artículos
           }vfact;

struct nodo{
           fact factura;
           nodo *sig;
           }*list;

Utilizando la Programación Orientada a Objetos, se pide:
- Cargar el fichero de facturas y de artículos si no existen.
- Método para dar altas en el fichero de facturas.
- Métodos para crear una lista enlazada, para lo cual leemos los datos del fichero de facturas y los pasamos a la lista, insertándolos ordenados por el Nº de Factura.
- Consultar facturas en la lista enlazada entrando el Nº de Factura. Nótese que la lista está ordenada por el Nº de Factura y que cada artículo que pertenece a la factura tiene un nodo con el mismo Nº de Factura. Los datos del cliente habrá que ir a buscarlos al fichero de clientes y se localizarán por el código del cliente que está en la factura. Lo mismo ocurrirá con los datos del artículo.

El programa debe presentar aproximadamente en el centro de la pantalla el siguiente menú:

                         APLICACIÓN DE FACTURAS

                         X- CARGAR ARTÍCULOS Y CLIENTES
                         A- ALTAS DE FACTURAS
                         L- CREAR LA LISTA ENLAZADA DE FACTURAS
                         C- CONSULTA POR EL Nº DE FACTURA

-No se puede dar de alta a una factura que no exista el artículo o el cliente.
-Utilizar la programación orientada a objetos.
-Validar los datos de entrada.
-Utilizar transferencia de parámetros en las funciones. Evitar utilizar variables globales si no está justificado.


PD: Casi que me va la vida en este ejercicio. Si no lo podeis resolver escribidme un mail , diciendome otro foro o e alguien que si me lo pueda resolver.
De corazón GRACIAS.
Título: HACER UN PROGRAMA EN C
Publicado por: Dabo en 06 de Junio de 2004, 12:53:39 pm
bienvenido amigo  :lol:


venga chicos, todo sea por el futuro de nuestro colega  :lol:  8)
Título: HACER UN PROGRAMA EN C
Publicado por: ALP en 06 de Junio de 2004, 01:30:12 pm
tienes alguna duda concreta? o se trata de todo el programa...
no es muy complejo, pero lleva tiempo

un saludo.
Título: HACER UN PROGRAMA EN C
Publicado por: Onefree en 06 de Junio de 2004, 01:41:23 pm
Sería todo el programa,  para mí si es complejo  :oops:  , y si intento hacerlo , se que no lo haría del todo bien y tardaría demasiado.
Me gustaría llegar al examen con el ejercicio perfecto, y bien aprendido.
Ya pensaríamos en una compensación para el foro cuando el ejercicio esté todo bien y completado, dado que actualmente nadie da duros a cuatro pesetas  :D
Me pasaré más a menudo por aquí , e intentaré postear y ayudar con mis mensajes  :wink:
Título: HACER UN PROGRAMA EN C
Publicado por: ALP en 06 de Junio de 2004, 05:54:26 pm
Los foros de programación están llenos de peticiones similares a la tuya. A estas alturas de curso, deberías ser capaz de hacer el programa por tí mismo.

Hay un proverbio chino que dice que si alguien tiene hambre, no le des el pez, dale la caña y enséñale a pescar.  Si alguien te responde, conseguirá que entregues un ejercicio, pero no que aprendas a resolverlo. Como todo, la programación se aprende a base de práctica. Escribiendo programas, aprenderás a solucionar por tí mismo los problemas, aprenderás a reconocer los mensajes del compilador, y lo que es más importante, te ayudará a pensar de forma analítica ante un problema real.

No dispongo de tiempo, ni tengo por costumbre resolver ejercicios de estas características, pero sí ayudar a resolverlos.

Es preferible que lo empieces, y si te atrancas en alguna cuestión o tienes alguna duda de cómo realizar un proceso, lo preguntes. De esta forma, seguro que aprendes más que estudiando el programa que ha realizado otro.

Espero no haber sido antipático con mi respuesta. Para cualquier duda que tengas, aquí estamos.

un saludo.
Título: HACER UN PROGRAMA EN C
Publicado por: Dabo en 06 de Junio de 2004, 11:10:08 pm
me parece justo por parte de ALP amigo, el te puede ayudar pero si todo el mundo quiere que le hagan el programa esto dejaria de ser divertido para el y.....es para lo que estamos  :lol:  sino, seria un rollo, se que lo entiendes

asi que empieza, ve desarrollando y te iremos ayudando


por cierto, espero que te pases por los demas foros  :wink:


que empieceeeeeeeeeee  :!:  :D
Título: HACER UN PROGRAMA EN C
Publicado por: Onefree en 06 de Junio de 2004, 11:40:41 pm
Entiendo vuestras posturas, en ningún momento me ha parecido antipático ninguno de vuestros post's .

Comprendo lo que decís sobre que no hay que darlo todo hecho sino enseñar el cómo hacerlo, pero yo me metí en el módulo de desarrollo porque es el que menos me gusta, no pretendo vivir de éste modulo, pretendo acabarlo y depsués meterme en el otro que es el que de verdad me gusta el de administración, y vivir de lo que me enseñen ahí , entonces el aprender a programar bien no me importa.

Pero bueno no pasa nada son visiones diferentes para una misma cosa.
A ver si algun colega de clase lo hace a tiempo, o consigo a alguien por ahí.

PD: A ver si le hecho una visual al resto de los foros  :wink:
Título: HACER UN PROGRAMA EN C
Publicado por: Dabo en 06 de Junio de 2004, 11:58:10 pm
Citar
A ver si le hecho una visual al resto de los foros


estas en tu casa  :wink:
Título: HACER UN PROGRAMA EN C
Publicado por: ALP en 07 de Junio de 2004, 10:10:07 pm
Onefree, si te quieres dedicar a la administración de sistemas, no pases por alto la programación. Un administrador de sistemas no tiene por qué ser un programador, pero le ayudará en su trabajo. Por ejemplo, si aprendes cómo funcionan los sockets (sólo las funciones básicas), te ayudará a comprender cómo se establecen las comunicaciones,  protocolos, puertos, etc.

Por otra parte, un administrador, tarde o temprano se tendrá que enfrentar a un script (si conoces el lenguaje C, no te será difícil dominarlos), un fichero core, un exploit, etc. Ten en cuenta también que muchos lenguajes de programación de webs (php) tienen su base en C. Si lo conoces, tienes mucho camino recorrido si quieres hacer o modificar una página dinámica.

De todos modos, si te pasan el código y tienes alguna duda, aquí estamos.

un saludo.
Título: HACER UN PROGRAMA EN C
Publicado por: jirho en 11 de Junio de 2004, 05:24:22 pm
...bien amigo tarde pero igual el programa esta sencillo...no te preocupes lo que pasa es que si es largo, pero va facil...si necesitas ayuda todavia no dudes en decirlo... :wink: ...
Título: HACER UN PROGRAMA EN C
Publicado por: Onefree en 16 de Junio de 2004, 12:46:20 pm
Bueno soy yo de nuevo, estamos a miercoles, pues el viernes pasado hice el examen de programación  y me salió mal, tuve k ir el lunes e intetar terminarlo pero no pude, total que el profesor me dijo k tenía k ir a la recuperación de hoy miercoles.
Aquí pongo un ejercicio que he hecho pero me da el sieguiente error:
<Undefined symbol insertar(lista_elementos near*) in module PROGRA~1\ENLFICH.CPP>
Aquí os dejo el código del programa si alguien puede corregirme el fallo y poner el código correcto de nuevo, se lo agradecería.
Lo necesito para ya (antes de las 14:30).


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

#define NULL 0

struct lista_elementos{
   char elem[40];        //Dato de este nodo
   struct lista_elementos *sig;    //Puntero al siguiente nodo
}vlista;

typedef struct lista_elementos nodo;   //Declaracion del tipo de estructura


int menu(void);            //Prototipo de Funcion
void crear(nodo *pt);         //Prototipo de Funcion
nodo *insertar(nodo *pt);      //Prototipo de Funcion
nodo *eliminar(nodo *pt);           //Prototipo de Funcion
void mostrar(nodo *pt);                 //Prototipo de Funcion
void fichero(nodo *pt);                 //Prototipo de Funcion
void verfichero(nodo *pt);      //Prototipo de Funcion
FILE *fp;

main(){
   nodo *prin;         //Puntero al principio de la lista
   int eleccion;         //Declaracion de variable local

   do{
      eleccion = menu();
      switch(eleccion){

      case 1:         //Crear Lista Enlazada
         prin = (nodo *) malloc(sizeof(nodo));   //Reserva de Espacio para el primer nodo
         crear(prin);
         printf("\n");
         mostrar(prin);
         continue;

      case 2:         //A¤adir un componente
         prin = insertar(prin);
         printf("\n");
         mostrar(prin);
         continue;

      case 3:       //Borrar un componente
         prin = eliminar(prin);
         printf("\n");
         mostrar(prin);
         continue;

      case 4:       //Grabar la lista a un fichero
         fichero(prin);
         continue;

      case 5:       //Ver los datos del fichero
         verfichero(prin);
         continue;

      default:       //Finalizar
         printf("\nFin de las operaciones\n");
      }
   }while (eleccion !=6);
}

int menu(void){           //Generar el Menu Principal
   int eleccion;

   do{
      printf("\n\t\t\t\tMenu Principal: \n");
      printf("\n\t\t\t1 - CREAR la lista enlazada");
      printf("\n\t\t\t2 - A¥ADIR un componente");
      printf("\n\t\t\t3 - BORRAR un componente");
      printf("\n\t\t\t4 - GRABAR la lista a un fichero");
      printf("\n\t\t\t5 - VER los datos del fichero");
      printf("\n\t\t\t6 - SALIR del programa");
      printf("\n\n\tPor favor, introduzca su seleccion (1, 2, 3, 4, 5 o 6) -> ");
      scanf("%d",&eleccion);
      if(eleccion<1 || eleccion>6)
         printf("\nERROR - Por favor, intentelo de nuevo");
   }while(eleccion<1 || eleccion>6);
   printf("\n");
   return(eleccion);
}

void crear(nodo *registro){      //Crear un lista enlazada

         //El argumento apunta al nodo actual

   printf("\nDato (escribir \'FIN'\ para terminar): ");
   scanf(" %[^\n]",registro->elem);

   if(strcmp(registro->elem,"FIN")==0)
      registro->sig = NULL;
   else{
               //Reservar espacio para el siguiente nodo
      registro->sig = (nodo *)malloc(sizeof(nodo));

               //Crear el siguiente nodo
      crear(registro->sig);
   }
   return;
}

void mostrar(nodo *registro){       //Mostrar la lista enlazada

         //El argumento apunta al nodo actual

   if(registro->sig != NULL){
      printf("\n%s",registro->elem);    //Mostrar este Dato
      mostrar(registro->sig);       //Tomar el siguiente elemento
      }
      return;
}

nodo *insetar(nodo *primero){          //A¤ade un componente a la lista enlazada;
                   //devuelve un puntero al principio de la lista modificada

         //El argumento apunta al primer nodo

   nodo *localizar(nodo *, char[]);    //Declaracion de funcion
   nodo *nuevoregistro;          //Puntero al nuevo nodo
   nodo *marca;             //Puntero al nodo anterior al buscado
   char nuevodato[40];          //Dato nuevo
   char objetivo[40];          //Dato siguiente a la nueva entrada
   printf("\nNuevo Dato: ");
   scanf(" %[^\n]", nuevodato);
   printf("\nColocar delante de (escribir \'FIN'\ si es el ultimo): ");
   scanf(" %[^\n]", objetivo);

   if(strcmp(primero->elem, objetivo) == 0){              //El nuevo nodo es el primero de la lista
      nuevoregistro = (nodo *)malloc(sizeof(nodo)); //Reservar espacio para nuevo nodo
      strcpy(nuevoregistro->elem,nuevodato);         //Asignar el nuevo dato a nuevoregistro->elem
      nuevoregistro->sig = primero;            //Asignar el puntero actual a nuevoregistro->sig
      primero = nuevoregistro;            //El nuevo puntero se convierte en el principio de la lista
   }
   else{                        //Insertar el nuevo nodo tras algún nodo existente
      marca = localizar(primero,objetivo);         //Localizar el nodo precedente del nodo objetivo

      if(marca == NULL)
         printf("\nNo se encuentra coincidencia - Pruebe de nuevo");
      else{
         nuevoregistro = (nodo *)malloc(sizeof(nodo));   //Reservar espacio para el nuevo nodo
         strcpy(nuevoregistro->elem, nuevodato);      //Asignar el nuevo dato a nuevoregistro->elem
         nuevoregistro->sig = marca->sig;      //Asignar el siguiente puntero a nuevoregistro->sig
                        marca->sig = nuevoregistro;         //Asignar el nuevo puntero a marca->sig
      }
   }
   return(primero);
}

nodo *localizar(nodo *registro, char objetivo[]){         //Localizar un nodo

            //Devuelve un puntero al nodo anterior al nodo objetivo
            //El primer argumento apunta al nodo actual
            //El segundo argumento apunta al nodo objetivo

   if(strcmp(registro->sig->elem, objetivo) ==0)         //Coincidencia encontrada
      return(registro);
   else
      if(registro->sig->sig == NULL)            //FIN de la lista
         return(NULL);
      else
         localizar(registro->sig, objetivo);   //Probar el siguiente nodo
}

nodo *eliminar(nodo *primero){   //Eliminar (borrar) un componente de la lista enlazada;
            //devuelve un puntero al principio de la lista modificada

      //El argumento apunta al primer nodo

   nodo *localizar(nodo *, char[]);   //Declaracion de funcion
   nodo *marca;            //Puntero al nodo anterior al buscado
   nodo *temp;            //Puntero temporal
   char objetivo[40];         //dato a borrar
   printf("\nDato a borrar: ");
   scanf(" %[^\n]", objetivo);

   if(strcmp(primero->elem, objetivo) ==0){//Borrar el primer nodo
      temp = primero->sig;      //Marcar el nodo siguiente al nodo objetivo
      free(primero);            //Liberar el espacio del nodo objetivo
      primero = temp;         //Ajustar el puntero al primer nodo
   }
   else{                  //Borrar otro dato distinto del primero
      marca = localizar(primero, objetivo);   //Localizar el nodo precedente del nodo objetivo

      if(marca == NULL)
         printf("\nNo se encuentra coincidencia - Pruebe de nuevo");
   else{
      temp = marca->sig->sig;      //Marcar el nodo siguiente al nodo objetivo
      free(marca->sig);      //Liberar el espacio del nodo objetivo
      marca->sig =temp;      //Ajustar el enlace para el siguiente nodo
   }
   }
   return(primero);
}

void fichero(nodo *registro){

   if ( (fp = fopen("FICHERO.DAT","ab")) == NULL){
      printf("\n FALLO A LA HORA DE ABRIRLO");
      exit(0);
   }

   if(registro->sig != NULL){
      printf("\n%s",registro->elem);    //Mostrar este Dato
      mostrar(registro->sig);       //Tomar el siguiente elemento
   }

   if(fwrite(registro->elem,sizeof(lista_elementos),1,fp)!=1){
      printf("\n ERROR DE ESCRITURA");
      exit(0);
   }
        fclose(fp);
}

void verfichero(nodo *registro){

   if ( (fp = fopen("FICHERO.DAT","ab")) == NULL){
      printf("\n FALLO A LA HORA DE ABRIRLO");
      exit(0);
   }

   fread(registro->elem,sizeof(lista_elementos),1,fp);
   while(!feof(fp)){
      printf("\nDato :  %[^\n]",registro->elem);
      fread(registro->elem,sizeof(lista_elementos),1,fp);
   }
        fclose(fp);
}

El programa es simplemente meter datos en una lista enlazada, después de creada la lista , meter datos entre medio de los ya existentes (me falla ahí), borrar datos de la lista, grabar la lista a un fichero, y ver lo grabado en el fichero.
Título: HACER UN PROGRAMA EN C
Publicado por: Onefree en 16 de Junio de 2004, 02:34:37 pm
El fallo era una mariconada me faltaba una  'r' en la funcion, de todos modos esten al tanto por si tengo k ir el viernes a terminar el ejercicio, lo traeré esta noche a mi casa para que me expliqueis dudas o para yo terminarlo aqui en mi casa y llevrlo ya el viernes acabado.
Título: HACER UN PROGRAMA EN C
Publicado por: ALP en 16 de Junio de 2004, 09:03:35 pm
ok. esperamos.
Título: HACER UN PROGRAMA EN C
Publicado por: jirho en 16 de Junio de 2004, 11:37:12 pm
...si asi de simple...cuando te salgan problemas de ese tipo es que estan usando variables, o en este caso prototipos de funciones que no estan definidas, fijate muy bien en la sintaxis que esten escritas correctamente...