diff --git a/Examen1/Estadisticos.txt b/Examen1/Estadisticos.txt new file mode 100644 index 0000000..e10264b --- /dev/null +++ b/Examen1/Estadisticos.txt @@ -0,0 +1,7 @@ +Media: 4.955432 +Mediana: 5.031065 +Moda: 4.162632 +Desviacion Estandar: 0.280655 +Minimo: 4.162632 +Maximo: 5.636707 +Distancia Intercuartil: 0.554859 diff --git a/Examen1/Examen 1 TDA (1).pdf b/Examen1/Examen 1 TDA (1).pdf new file mode 100644 index 0000000..758a33b Binary files /dev/null and b/Examen1/Examen 1 TDA (1).pdf differ diff --git a/Examen1/Examen 1 TDA.pdf b/Examen1/Examen 1 TDA.pdf new file mode 100644 index 0000000..1a05932 Binary files /dev/null and b/Examen1/Examen 1 TDA.pdf differ diff --git a/Examen1/Examen.exe b/Examen1/Examen.exe new file mode 100644 index 0000000..cddf792 Binary files /dev/null and b/Examen1/Examen.exe differ diff --git a/Examen1/controlador.c b/Examen1/controlador.c new file mode 100644 index 0000000..4411757 --- /dev/null +++ b/Examen1/controlador.c @@ -0,0 +1,43 @@ +// +// controlador.c +// +// +// Created by Mauricio de Garay, Bernardo García and Fernando Tapia on 29/09/2020. +// +#include "controlador.h" +#define TRUE 1 +#define FALSE 0 + + +/* Function prototypes. */ +/* +* La función Principal se encarga de controlar el flujo de programa, ya que ésta es la encargada de conectar a los módulos de vista y modelo, así como revisar las validaciones. +* +* +* @params + +* +* @returns + void + +*/ +void controlador_Principal() +{ + char nombreArch[50]; + int Validacion; + Validacion=FALSE; + do + { + nombreArch[0]=0; + vistaSolicitarDatos(nombreArch); + strcat(nombreArch, ".csv"); + Validacion=pipesDoesFileExist(nombreArch); + if(Validacion==FALSE) + { + printf("ERROR: No existe el archivo llamado %s.\n", nombreArch); + } + } + while(Validacion==FALSE); + modeloPrincipal(nombreArch); + vistaDesplegarDatos(); +} diff --git a/Examen1/controlador.h b/Examen1/controlador.h new file mode 100644 index 0000000..f19b025 --- /dev/null +++ b/Examen1/controlador.h @@ -0,0 +1,45 @@ +// +// controlador.h +// +// +// Created by Mauricio de Garay, Bernardo García and Fernando Tapia on 29/09/2020. +// +#include +#include +#include +#include +#include +#include "vista.h" +#include "modelo.h" +#ifndef controlador_h +#define controlador_h +#ifndef controlador_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +/* Función del módulo. */ +/* +* El módulo controlador se encarga de controlar el flujo de programa, ya que ésta es la encargada de conectar a los módulos de vista y modelo, así como revisar las validaciones. +* +* +*/ +/* Function prototypes. */ +/* +* La función Principal se encarga de controlar el flujo de programa, ya que ésta es la encargada de conectar a los módulos de vista y modelo, así como revisar las validaciones. +* +* +* @params + +* +* @returns + void + +*/ +EXTERN void controlador_Principal(); + +#undef controlador_IMPORT +#undef EXTERN +#endif \ No newline at end of file diff --git a/Examen1/controlador.o b/Examen1/controlador.o new file mode 100644 index 0000000..39ea6f6 Binary files /dev/null and b/Examen1/controlador.o differ diff --git a/Examen1/data.csv b/Examen1/data.csv index a6eeb05..ba235b9 100644 --- a/Examen1/data.csv +++ b/Examen1/data.csv @@ -1,4 +1,3 @@ -,0 0,5.077850806 1,5.11361086 2,5.013413304 diff --git a/Examen1/data_statistic.csv b/Examen1/data_statistic.csv new file mode 100644 index 0000000..b062c7c --- /dev/null +++ b/Examen1/data_statistic.csv @@ -0,0 +1,3 @@ +4.000000 4 +5.000000 45 +6.000000 1 diff --git a/Examen1/main.c b/Examen1/main.c new file mode 100644 index 0000000..798145d --- /dev/null +++ b/Examen1/main.c @@ -0,0 +1,5 @@ +#include "controlador.h" +int main() +{ + controlador_Principal(); +} \ No newline at end of file diff --git a/Examen1/main.o b/Examen1/main.o new file mode 100644 index 0000000..db34fc4 Binary files /dev/null and b/Examen1/main.o differ diff --git a/Examen1/modelo.c b/Examen1/modelo.c new file mode 100644 index 0000000..f159593 --- /dev/null +++ b/Examen1/modelo.c @@ -0,0 +1,239 @@ +// modelo.c +// +// +// Created by Mauricio de Garay on 08/10/2020 +// +#include "modelo.h" + +#include + +void modeloPrincipal(char NombreArchivo[]); +DatosCSV* modeloLeerDatosArchivo(char NombreArchivo[]); +DatosCSV* modeloObtenerDatosHistograma(DatosCSV *DatosOrigen); +/* Function prototypes. */ + + +/* +* La función modeloPrincipal se encarga de controlar el flujo del modelo. +* +* +* @params + NombreArchivo: el nombre del archivo donde están los datos +* +* @returns + + +*/ +void modeloPrincipal(char NombreArchivo[]) +{ + DatosCSV *Datos, *DatosHistograma; + Datos=modeloLeerDatosArchivo(NombreArchivo); + DatosHistograma=modeloObtenerDatosHistograma(Datos); + FILE * Archivo; + Archivo=pipesOpenFile("write", "data_statistic.csv"); + int tamano=DatosHistograma[0].tamano; + pipesWriteFile(tamano, DatosHistograma, Archivo); + fclose(Archivo); + free(Datos); + free(DatosHistograma); +} +/* Function prototypes. */ + + +/* +* La función modeloLeerDatosArchivo se encarga de Leer los datos del archivo y retornarlos como array. +* +* +* @params + NombreArchivo: el nombre del archivo donde están los datos +* +* @returns + + +*/ +DatosCSV* modeloLeerDatosArchivo(char NombreArchivo[]) +{ + FILE *Archivo; + DatosCSV *Datos; + Archivo=pipesOpenFile("read", NombreArchivo); + Datos=pipesReadCSV(Archivo); + fclose(Archivo); + return Datos; +} +/* Function prototypes. */ + + +/* +* La función modeloObtenerDatosHistograma de hacer los cálculos estadísticos. +* +* +* @params + NombreArchivo: el nombre del archivo donde están los datos +* +* @returns + + +*/ +DatosCSV* modeloObtenerDatosHistograma(DatosCSV DatosOrigen[]) +{ + float Media, Mediana, Moda, std, min, max, intercuartil; + int i; + float suma=0; + Media=0; + int tamano=DatosOrigen[0].tamano; + for(i=0; iDatosOrigen[j].valor) + { + temp=DatosOrigen[j].valor; + DatosOrigen[j].valor=DatosOrigen[i].valor; + DatosOrigen[i].valor=temp; + } + } + } + + if(tamano%2==0) + { + Mediana=DatosOrigen[tamano/2].valor; + } + else + { + + Mediana=(DatosOrigen[(int)(tamano/2)].valor+DatosOrigen[(int)(tamano/2)+1].valor)/2; + } + float Numeros[100], Repeticiones[100]; + int totalnumeros=0, bandera=0; + for(i=0; iMaxRep) + { + MaxRep=Repeticiones[i]; + Moda=Numeros[i]; + } + } + float sumastd=0; + for(i=0; imax) + { + max=DatosOrigen[i].valor; + } + } + int noventacinco=tamano*0.95; // %95 + int venticinco=tamano*0.25; // %25 + intercuartil=DatosOrigen[noventacinco].valor-DatosOrigen[venticinco].valor; + DatosCSV *Final; + int totalnumeroshisto=0; + int NumerosHisto[100], Frecuencia[100]; + char stringcast[10]; + int numerocast; + for(i=0; i +#include +#include +#include +#include "pipes.h" +#include "struct.h" +#define TRUE 1 +#define FALSE 0 +#ifndef modelo_h +#define modelo_h +#ifndef modelo_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +/* Función del módulo. */ +/* +* El módulo modelo se encarga de obtener los datos del CSV con apoyo de pipes, hacer los cálculos estadísticos y posteriormente escribir el archivo final (con ayuda de pipes) +* +* +*/ + + +/* Function prototypes. */ + + +/* +* La función modeloPrincipal se encarga de controlar el flujo del modelo. +* +* +* @params + NombreArchivo: el nombre del archivo donde están los datos +* +* @returns + + +*/ +EXTERN void modeloPrincipal(char NombreArchivo[]); + +#undef modelo_IMPORT +#undef EXTERN +#endif \ No newline at end of file diff --git a/Examen1/modelo.o b/Examen1/modelo.o new file mode 100644 index 0000000..86a3082 Binary files /dev/null and b/Examen1/modelo.o differ diff --git a/Examen1/pipes.c b/Examen1/pipes.c new file mode 100644 index 0000000..d36ede9 --- /dev/null +++ b/Examen1/pipes.c @@ -0,0 +1,148 @@ +// +// pipes.c +// +// +// Created by Mauricio de Garay on 29/09/2020. +// +#include +#include +#include +#include +#include "struct.h" +#define TRUE 1 +#define FALSE 0 + + + +/* Function prototypes. */ + + +/* +* La función openFile se encarga de retornar un filepointer con un nuevo archivo de tipo que recibe. +* +* +* @params + ReadOrWrite: string indicando el modo con el que se desea abrir el archivo. +* +* @returns + *FILE fpointer + +*/ +FILE* pipesOpenFile(char ReadOrWrite[], char Nombre[]) +{ + if((strcasecmp(ReadOrWrite, "write")==0)==TRUE) + { + return (fopen(Nombre, "wt")); + } + else + { + return (fopen(Nombre, "rt")); + + + } +} +/* +* La función writeFile se encarga de escribir un archivo CSV con los arreglos que recibe. +* +* +* @params + int rows + DatosCSV[] DatosHistograma + FILE * fpointer +* +* @returns +*/ +void pipesWriteFile(int rows, DatosCSV DatosHistograma[], FILE *fpointer) +{ + int i; + for(i=0; i +#include +#include +#include +#include "struct.h" +#define TRUE 1 +#define FALSE 0 +#ifndef pipes_h +#define pipes_h +#ifndef pipes_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +/* Función del módulo. */ +/* +* El módulo pipes se encarga de abrir y escribir el archivo csv con los resultados, y además de establecer la conexión con GNUPlot y graficar este archivo. +* +* +*/ + + +/* Function prototypes. */ + + +/* +* La función openFile se encarga de retornar un filepointer con un nuevo archivo de tipo escritura. +* +* +* @params + +* +* @returns + *FILE fpointer + +*/ +EXTERN FILE* pipesOpenFile(char ReadOrWrite[], char Nombre[]); +/* +* La función writeFile se encarga de escribir un archivo CSV con los arreglos que recibe. +* +* +* @params + int rows + DatosCSV[] DatosHistograma + FILE * fpointer +* +* @returns +*/ +EXTERN void pipesWriteFile(int rows, DatosCSV DatosHistograma[], FILE *fpointer); + +/* +* La función openGnuPlot se encarga de retornar un pipepointer que tenga una conexión establecida con GNUPlot. +* +* +* @params + +* +* @returns + FILE * gnupointer + +*/ +EXTERN FILE* pipesOpenGnuPlot(); + +/* +* La función pipesGraphGnuPlot se encarga de graficar en GNUPlot los datos que tenga en un archivo. +* +* +* @params + gnupointer + NombreArch +* +* @returns +*/ +EXTERN void pipesGraphGnuPlot(FILE * gnupointer, char NombreArch[]); +/* +* La función pipesDoesFileExist se validar si existe un archivo con el nombre que recibe. +* +* +* @params + NombreArch: El nombre del archivo a validar +* +* @returns + TRUE si existe, FALSE si no. +*/ +EXTERN int pipesDoesFileExist(char NombreArch[]); +/* +* La función pipesReadCSV lee datos en formato .csv y lee un arreglo de una estructura con campos indice y valor. +* +* +* @params + fpointer: apuntador de archivo a leer. +* +* @returns + Datos: Datos leídos. +*/ +EXTERN DatosCSV* pipesReadCSV(FILE* fpointer); +#undef pipes_IMPORT +#undef EXTERN +#endif \ No newline at end of file diff --git a/Examen1/pipes.o b/Examen1/pipes.o new file mode 100644 index 0000000..a2b651c Binary files /dev/null and b/Examen1/pipes.o differ diff --git a/Examen1/struct.h b/Examen1/struct.h new file mode 100644 index 0000000..705fa67 --- /dev/null +++ b/Examen1/struct.h @@ -0,0 +1,10 @@ +#ifndef struct_h +#define struct_h +struct Def_Struct +{ + int indice; + float valor; + int tamano; +}; +typedef struct Def_Struct DatosCSV; +#endif diff --git a/Examen1/vista.c b/Examen1/vista.c new file mode 100644 index 0000000..2e5aa76 --- /dev/null +++ b/Examen1/vista.c @@ -0,0 +1,93 @@ +// vista.c +// +// +// Created by Mauricio de Garay on 08/10/2020 +// +#include "vista.h" +/* Función del módulo. */ +/* +* El módulo vista se encarga de obtener el nombre del archivo del usuario y además desplegar el histograma al final del programa. +* +* +*/ + + +/* Function prototypes. */ + + +/* +* La función vistaSolicitarDatos se encarga de pedirle un nombre de archivo al usuario +* +* +* @params + NombreArchivo: el nombre del archivo donde están los datos +* +* @returns + + +*/ +char Menu(); +void vistaSolicitarDatos(char NombreArchivo[]) +{ + system("clear"); + char op, cont; + do + { + op=Menu(); + switch (op) + { + case '1': + printf("Dime el nombre de tu archivo sin extension:\n "); + fgets(NombreArchivo, 70, stdin); + NombreArchivo[strlen(NombreArchivo)-1]=0; + fflush(stdin); + return; + break; + case '2': + exit(100); + break; + default: + printf("Error: Opcion invalida\n"); + printf("Presiona enter para continuar...\n"); + scanf("%c", &cont); + fflush(stdin); + break; + } + /* code */ + } while (op!='2'); + + + +} +/* +* La función vistaDesplegarDatos se encarga de desplegarle el histograma al usuario. +* +* +* @params + +* +* @returns + + +*/ + void vistaDesplegarDatos() +{ + FILE * gnupointer; + gnupointer=pipesOpenGnuPlot(); + printf("Histograma:\n"); + pipesGraphGnuPlot(gnupointer, "data_statistic.csv"); + printf("Nota: Se creo un archivo de texto 'Estadisticos.txt' con todos los estadisticos (media, mediana, moda, std, min, max, distancia intercuartil).\n"); + fflush(stdin); + fclose(gnupointer); +} +char Menu() +{ + char op; + printf("\tMenu:\n\n"); + printf("\t1.-Ingresar Nombre del Archivo\n"); + printf("\t2.-Salir\n"); + scanf("%c", &op); + fflush(stdin); + return op; + +} \ No newline at end of file diff --git a/Examen1/vista.h b/Examen1/vista.h new file mode 100644 index 0000000..49710f7 --- /dev/null +++ b/Examen1/vista.h @@ -0,0 +1,61 @@ +// vista.h +// +// +// Created by Mauricio de Garay on 08/10/2020 +// +#include +#include +#include +#include +#include "pipes.h" +#include "struct.h" +#define TRUE 1 +#define FALSE 0 +#ifndef vista_h +#define vista_h +#ifndef vista_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + + +/* Función del módulo. */ +/* +* El módulo vista se encarga de obtener el nombre del archivo del usuario y además desplegar el histograma al final del programa. +* +* +*/ + + +/* Function prototypes. */ + + +/* +* La función vistaSolicitarDatos se encarga de pedirle un nombre de archivo al usuario +* +* +* @params + NombreArchivo: el nombre del archivo donde están los datos +* +* @returns + + +*/ +EXTERN void vistaSolicitarDatos(char NombreArchivo[]); +/* +* La función vistaDesplegarDatos se encarga de desplegarle el histograma al usuario. +* +* +* @params + +* +* @returns + + +*/ +EXTERN void vistaDesplegarDatos(); + +#undef vista_IMPORT +#undef EXTERN +#endif \ No newline at end of file diff --git a/Examen1/vista.o b/Examen1/vista.o new file mode 100644 index 0000000..d3a3123 Binary files /dev/null and b/Examen1/vista.o differ