EN CONSTRUCCION

 

Los siguientes ejercicios se estudiaron en clases.

 

1.-

/* Disene un programa que:

  a.- Pida al usuario el numero de datos con lo que se va a trabajar.

  A partir e este valor, reservar espacio dinamicamente para almacenar

  esa cantidad de datos. El tipo de dato es entero.

  Luego de esto, debe imprimir un menu que ofrezca:

  1.- Ingresar un dato. Para esto debe usarse una funcion que reciba la

  direccion de la posicion de memoria reservada y

  el dato. La funcion retorna cero si todo sale bien y 1 en caso

  de ocurrir algun error.

  2.- Guardar los datos en un archivo y salir. Guardar los datos debe

  realizarse con una funcion que reciba la direccion del espacio reservado y

  el numero de elementos a guardar. Devuelve cero si todo salio bien o

  uno en caso de error. Defina una macro para el nombre del archivo en el

  que se guardaran los datos. Este nombre debe ser: entero.dat

 

  Referencie los datos en forma de punteros y en forma de arreglo.

  Imprima mensajes que muestren lo que sucede en ambos casos.

*/

 

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<ctype.h>

 

#define NOMB "entero.dat"

 

int mete(int *,int);

int guarda(int *,int);

 

int indice;

unsigned int i;

 

void main(){

      int dato, *pi;

      char ch;

      clrscr();

      printf("Para cuantos datos enteros desea reservar espacio?: ");

      scanf("%i%*c",&i);

      pi = (int *)malloc(i*sizeof(int));

      for(;;){

              printf("Que desea hacer?\n(M)eter dato\n(G)uardar y Salir\n");

              while ( (ch = tolower(getch()))!='m' && ch!='g');

              switch (ch) {

                case 'm': printf("Que dato desea agregar?: ");

                        scanf("%i%*c",&dato);

                        if (mete(pi,dato)) printf("\n No hay espacio!!!\n\n");

                  break;

                case 'g': if (guarda(pi,indice)) {

                        printf("Algun Error\n");

                        exit(1);

                  } else exit(0);

              }

      }

}

 

int mete(int *p,int a){

      if (indice>=i) return 1;

      printf("Guardare el dato %i en la posicion %i\n",a,indice);

      p[indice]=a; // *(p+indice)=a;

      printf("Guarde el dato en &p[indice]=0x%X pero observe que (p+indice)=0x%X\n",&p[indice],(p+indice));

      printf("Por lo tanto p[indice]=%i tambien puede referenciarse como *(p+indice)=%i\n",p[indice],*(p+indice));

      indice ++;

      return 0;

}

 

int guarda(int *p,int a){

      FILE *pf;

      if (pf = fopen(NOMB,"w")) {

            fwrite(p,sizeof(int),a,pf);

            return 0;

      } else {

            return 1;

      }

}

 

2.-

/* Desarrolle un programa que almacene una lista de trabajadores.

   Los datos de estos estaran contenidos en una estructura ( solo nombre ).

   Como la lista es dinamica ( no sabe cuantos trabajadores hay ) use un

   puntero a una estructura del mismo tipo en la estructura.

   Los datos se guardaran en un archivo llamado: Lista_t.dat

   Este archivo debe verificarse al inicio del programa y debe cargarse

   sus datos en la lista en caso de que exista.

   El programa debe tener un menu para:

   1.- Agregar un nuevo empleado.

   2.- Guardar los datos de la lista y salir.

   Ambas cosas deben hacerse con funciones. Con condiciones similares

   a las de EJE1.c en cuanto a valor retornado. En cuanto a los valores

   que recibe, 1: Recibe void. Procesa fin de la lista.

   pedira los datos dentro de la funcion mientras que guarda recibira

   el inicio de la lista.

   Debe haber un puntero al inicio de la lista y otro al final de la misma.

   Por conveniencia, declaremos estos como globales.

*/

 

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<ctype.h>

#include<string.h>

 

#define NOMB "lista_t.dat"

 

typedef struct list {

      char nombre[30];

      struct list *prox;

} lista;

 

lista *fin, inicio={"",NULL};

 

int mete(void);

int guarda(void);

 

 

void main(){

      char ch;

      fin=&inicio;

      clrscr();

      for(;;){

              printf("Que desea hacer?\n(M)eter dato\n(G)uardar y Salir\n");

              while ( (ch = tolower(getch()))!='m' && ch!='g');

              switch (ch) {

                case 'm': if (mete()) printf("\n     No hay espacio!!!\n\n");

                  break;

                case 'g': if (guarda()) {

                        printf("Algun Error\n");

                        exit(1);

                  } else exit(0);

              }

      }

}

 

int mete(void){

      lista *pl;

      if (!(pl = (lista *)malloc(sizeof(lista)))) return 1;

      fin->prox=pl;

      fin = fin->prox;

      printf("Introduzca el nombre: ");

      scanf("%29[^\n]",fin->nombre);

      fflush(stdin);

      fin->prox=NULL;

      return 0;

}

 

int guarda(void){

      FILE *pf;

      lista *actual=&inicio;

      if (pf = fopen(NOMB,"w")) {

            while (actual->prox){

              actual = actual->prox;

              fwrite(actual->nombre,strlen(actual->nombre)+1,1,pf);

            }

            return 0;

      } else {

            return 1;

      }

}