Evaluacion 2 german

11

Transcript of Evaluacion 2 german

Page 1: Evaluacion 2 german
Page 2: Evaluacion 2 german

2. Al momento de ingresar a un hospital a un paciente, se le solicitan los siguientes datos:

Nombre Edad Sexo Domicilio:( calle, número, ciudad) Teléfono Seguro médico ( si verdadero y

no falso) Elabore un programa en C que pueda llevar a cabo las siguientes Operaciones: a)

Obtener el porcentaje de mujeres y hombres hospitalizadas b) Calcular el porcentaje de

pacientes que poseen seguro médico. Se tiene N=50 pacientes. Nota: use programación

modular y arreglos de registros

include <stdio.h>

#include <stdlib.h>

#include <string.h>

#ifndef __MSDOS__

#include <search.h>

#endif

#ifdef __linux__

Page 3: Evaluacion 2 german

#include <termios.h>

#include <unistd.h>

#define CLEAR_SCREEN "clear"

#define aacute "\xC3\xA1"

#define oacute "\xC3\xB3"

#define uacute "\xC3\xBA"

#define Uacute "\xC3\x9A"

int _getch ();

#else

#include <conio.h>

#define CLEAR_SCREEN "cls"

#define aacute "\240"

#define oacute "\242"

#define uacute "\243"

#define Uacute "\351"

#ifdef __MSDOS__

#define _getch getch

#endif

#endif

typedef struct TDAPaciente {

char* nombre;

char sexo;

char* domicilio;

char* telefono;

char seguro;

} Paciente;

void* arreglo_insertar (void *arreglo, size_t *tamano,

size_t size, const void *dato);

void* arreglo_quitar (void *arreglo, size_t *tamano,

size_t size, const void *dato);

void arreglo_recorrer (void *arreglo, size_t tamano,

size_t size, void *parametros, void (*funcion)(void*,

void*));

void pausar (const char *mensaje);

char* leer_linea (const char *mensaje);

char* leer_cadena (const char *mensaje, char *cadena

);

int leer_entero (const char *mensaje);

char leer_caracter (const char *mensaje);

Page 4: Evaluacion 2 german

int leer_campo (FILE *archivo, char *campo);

int comparar_paciente (const Paciente *paciente1, co

nst Paciente *paciente2);

void imprimir_paciente (Paciente *dato, int *contador

);

void imprimir_en_archivo (Paciente *dato, FILE *archi

vo);

const char *ruta = "pacientes.tsv";

int main ()

{

Paciente *pacientes = NULL;

size_t tamano=0;

Paciente *dato, paciente;

int contador=0, opcion, subopcion;

char campo[255];

FILE *archivo = fopen (ruta, "r");

if (archivo!=NULL)

{

while (leer_campo (archivo, campo))

{

paciente.nombre = strdup (campo);

leer_campo (archivo, campo);

paciente.sexo = campo[0];

leer_campo (archivo, campo);

paciente.domicilio = strdup (campo);

leer_campo (archivo, campo);

paciente.telefono = strdup (campo);

leer_campo (archivo, campo);

paciente.seguro = campo[0];

pacientes = (Paciente*) arreglo_insertar (

pacientes, &tamano, sizeof (Paciente), &paciente);

}

fclose (archivo);

}

do {

system (CLEAR_SCREEN);

printf ("MEN" Uacute "\n");

printf ("1.- Altas\n");

printf ("2.- Consultas\n");

Page 5: Evaluacion 2 german

printf ("3.- Actualizaciones\n");

printf ("4.- Bajas\n");

printf ("5.- Ordenar registros\n");

printf ("6.- Listar registros\n");

printf ("7.- Salir\n");

printf ("Seleccione una opci" oacute "n: ");

fflush (stdout);

do

opcion = _getch ();

while (opcion<'1' || opcion>'7');

printf ("%c\n\n", opcion);

if (tamano==0 && opcion!='1' && opcion!='7')

{

pausar ("No hay registros.\n");

continue;

}

if (opcion<'5')

{

paciente.nombre = leer_cadena ("Ingrese el

nombre del paciente", campo);

dato = (Paciente*) lfind (&paciente, pacie

ntes, &tamano, sizeof (Paciente), (int(*)(const void*,

const void*))comparar_paciente);

if (dato!=NULL)

{

putchar ('\n');

imprimir_paciente (dato, &contador);

}

}

if (opcion=='1' && dato!=NULL)

printf ("El registro ya existe.\n");

else if (opcion>='2' && opcion<='4' && dato==N

ULL)

printf ("\nRegistro no encontrado.\n");

else switch (opcion)

{

case '1':

paciente.nombre = strdup (campo);

paciente.sexo = leer_caracter ("Ingres

e el sexo");

paciente.domicilio = leer_linea ("Ingr

Page 6: Evaluacion 2 german

ese el domicilio");

paciente.telefono = leer_linea ("Ingre

se el telefono");

paciente.seguro = leer_caracter ("Ingr

ese el seguro");

pacientes = (Paciente*) arreglo_insert

ar (pacientes, &tamano, sizeof (Paciente), &paciente);

printf ("\nRegistro agregado

correctamente.\n");

break;

case '3':

printf ("Men" uacute " de

modificaci" oacute "n de campos\n");

printf ("1.- sexo\n");

printf ("2.- domicilio\n");

printf ("3.- telefono\n");

printf ("4.- seguro\n");

do {

subopcion = leer_entero ("Seleccio

ne un n" uacute "mero de campo a modificar");

if (subopcion<1 || subopcion>4)

printf ("Opci" oacute "n no

v" aacute "lida.\n");

} while (subopcion<1 || subopcion>4);

switch (subopcion)

{

case 1:

dato-

>sexo = leer_caracter ("Ingrese el nuevo sexo");

break;

case 2:

free (dato->domicilio);

dato-

>domicilio = leer_linea ("Ingrese el nuevo

domicilio");

break;

case 3:

free (dato->telefono);

dato-

>telefono = leer_linea ("Ingrese el nuevo telefono");

break;

Page 7: Evaluacion 2 german

case 4:

dato-

>seguro = leer_caracter ("Ingrese el nuevo seguro");

break;

}

printf ("\nRegistro actualizado

correctamente.\n");

break;

case '4':

memcpy (&paciente, dato, sizeof (Pacie

nte));

pacientes = (Paciente*) arreglo_quitar

((void**)pacientes, &tamano, sizeof (Paciente), dato)

;

free (paciente.nombre);

free (paciente.domicilio);

free (paciente.telefono);

printf ("Registro borrado

correctamente.\n");

break;

case '5':

qsort (pacientes, tamano, sizeof (Paci

ente), (int(*)(const void*,const void*))comparar_pacie

nte);

printf ("Registros ordenados

correctamente.\n");

break;

case '6':

contador = 0;

arreglo_recorrer (pacientes, tamano, s

izeof (Paciente), &contador, (void(*)(void*,void*))imp

rimir_paciente);

printf ("Total de registros:

%d.\n", contador);

break;

}

if (opcion!='7')

pausar ("");

} while (opcion!='7');

archivo = fopen (ruta, "w");

if (archivo!=NULL)

Page 8: Evaluacion 2 german

{

arreglo_recorrer (pacientes, tamano, sizeof (P

aciente), archivo, (void(*)(void*,void*))imprimir_en_a

rchivo);

fclose (archivo);

}

return EXIT_SUCCESS;

}

void* arreglo_insertar (void *arreglo, size_t *tamano,

size_t size, const void *dato)

{

char *registro;

arreglo = realloc (arreglo, size * (*tamano+1));

registro = (char*)arreglo + *tamano * size;

memcpy (registro, dato, size);

(*tamano)++;

return arreglo;

}

void* arreglo_quitar (void *arreglo, size_t *tamano, s

ize_t size, const void *dato)

{

size_t i;

char *registro = (char*)arreglo;

for (i=0; i<*tamano && dato!=registro; i++, regist

ro+=size);

if (i<*tamano)

{

for (i++; i<*tamano; i++)

{

registro+=size;

memcpy (registro-size, registro, size);

}

(*tamano)--;

arreglo = realloc (arreglo, size * (*tamano));

}

return arreglo;

}

void arreglo_recorrer (void *arreglo, size_t tamano, s

Page 9: Evaluacion 2 german

ize_t size, void *parametros, void (*funcion)(void*,vo

id*))

{

char *registro = (char*)arreglo;

if (tamano>0)

{

funcion (registro, parametros);

arreglo_recorrer (registro+size, tamano-

1, size, parametros, funcion);

}

}

int comparar_paciente (const Paciente *paciente1, cons

t Paciente *paciente2)

{

return paciente1==paciente2 ? 0 : strcmp (paciente

1->nombre, paciente2->nombre);

}

void imprimir_paciente (Paciente *dato, int *contador)

{

printf ("nombre : %s\n", dato->nombre);

printf ("sexo : %c\n", dato->sexo);

printf ("domicilio: %s\n", dato->domicilio);

printf ("telefono : %s\n", dato->telefono);

printf ("seguro : %c\n", dato->seguro);

putchar ('\n');

(*contador)++;

}

void imprimir_en_archivo (Paciente *dato, FILE *archiv

o)

{

fprintf (archivo, "%s\t", dato->nombre);

fprintf (archivo, "%c\t", dato->sexo);

fprintf (archivo, "%s\t", dato->domicilio);

fprintf (archivo, "%s\t", dato->telefono);

fprintf (archivo, "%c\n", dato->seguro);

}

char* leer_linea (const char *mensaje)

Page 10: Evaluacion 2 german

{

char linea[255];

leer_cadena (mensaje, linea);

return strdup (linea);

}

char* leer_cadena (const char *mensaje, char *cadena)

{

printf ("%s: ", mensaje);

scanf ("%[^\r\n]", cadena);

getchar ();

return cadena;

}

int leer_entero (const char *mensaje)

{

int entero;

printf ("%s: ", mensaje);

scanf ("%d", &entero);

getchar();

return entero;

}

char leer_caracter (const char *mensaje)

{

char caracter;

printf ("%s: ", mensaje);

caracter = (char)getchar();

getchar();

return caracter;

}

int leer_campo (FILE *archivo, char *campo)

{

fscanf (archivo, "%[^\t\n\r]", campo);

fgetc (archivo);

return feof (archivo) == 0;

}

void pausar (const char *mensaje)

{

Page 11: Evaluacion 2 german

printf ("%s\nPresione una tecla para continuar . .

. ", mensaje);

fflush (stdout);

_getch ();

}

#ifdef __linux__

int _getch ()

{

int ch;

struct termios oldt, newt;

tcgetattr (STDIN_FILENO, &oldt);

newt = oldt;

newt.c_lflag &= ~(ICANON | ECHO);

tcsetattr (STDIN_FILENO, TCSANOW, &newt);

ch = getchar();

tcsetattr (STDIN_FILENO, TCSANOW, &oldt);

return ch;

}