La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Repaso C Ficheros, memoria dinámica, … Pablo San Segundo (C-206)

Presentaciones similares


Presentación del tema: "Repaso C Ficheros, memoria dinámica, … Pablo San Segundo (C-206)"— Transcripción de la presentación:

1 Repaso C Ficheros, memoria dinámica, … Pablo San Segundo (C-206) pablo.sansegundo@upm.es

2 Ejemplo: Centroide de una nube de puntos #define NUM_PUNTOS 4 struct punto_t{ double x; double y; }; struct punto_t centroide(struct punto_t * v, int size){ struct punto_t pres; double x_med=0; double y_med=0; int p; for(p=0; p<size; p++){ x_med+=v[p].x; y_med+=v[p].y; } pres.x=x_med/size; pres.y=y_med/size; return pres; } EJERCICIO I Implemente un programa que compute el centroide de 4 puntos con salida por consola EJERCICIO II Añada entrada por teclado de los 4 puntos

3 Entrada/salida a fichero  FILE * fopen ( const char * filename, const char * mode )  int fclose ( FILE * stream )  Escritura  int fprintf ( FILE * stream, const char * format,... )  int fputs ( const char * str, FILE * stream )  Lectura  int fscanf ( FILE * stream, const char * format,... )  char * fgets ( char * str, int num, FILE * stream )  Estado  Error  int ferror ( FILE * stream )  End of file:  int feof ( FILE * stream ) r, w, a, r+, w+, a+ retorno: 0 si OK, EOF si error retorno: num. campos rellenados si OK #include

4 Ejercicio: nube de puntos en fichero EJERCICIO Modifique el código anterior para que lea de un fichero de texto “datos.txt” los puntos sobre los que calcular el centroide. Fichero: datos.txt 1.02.0 3.04.0 5.06.0 7.08.0

5 Solución parcial FILE * f=fopen("datos.txt", "r"); if(f==NULL){ puts("file not found\n"); return -1; } //typical loop for reading while(!feof(f)){ //reads line and checks stream state fgets(line, SIZE_OF_LINE, f); if(ferror(f)){ puts("error"); break; } //protocol sscanf(line, "%lf %lf", &x, &y); v[index].x=x; v[index++].y=y; } EJERCICIO Implemente la función de prototipo, siguiente: int read (const char * filename, struct punto_t * v, int size ) ;

6 Reserva de memoria dinámica  void * malloc (size_t size )  void free (void * ptr ) #include EJERCICIO Implemente el programa anterior del centroide de la nube de puntos. Reserve memoria dinámica y libere adecuadamente la memoria al terminar. La entrada de las coordenadas de los puntos se hará por consola. RESERVA DE MEMORIA struct punto_t* pv = (struct punto_t*)malloc(sizeof(struct punto_t)*NUM_PUNTOS); /*…*/ free(pv); ENTRADA DE DATOS POR CONSOLA for(p=0; p<NUM_PUNTOS; p++){ printf("Introduzca las coordenadas X Y del punto\n"); scanf("%d %d", &x, &y); pv[p].x=x; pv[p].y=y; }

7 Ejercicio: Reserva de memoria para una matriz bidimensional EJERCICIO Reserve memoria dinámicamente para una matriz de enteros (n x m) RESERVA DE MEMORIA int** matrix=0; matrix= (int**) malloc(n*sizeof(int*)); for(i=0; i<n; i++){ matrix[i]=(int *) malloc(m*sizeof(int)); } LIBERACIÓN DE MEMORIA int i; for(i=0; i<n; i++){ free(matrix[i]); } free(matrix);

8 Ejercicio-Lectura de una lista Implemente un programa que lea el protocolo del fichero de texto mostrado a continuación, e imprima los datos por pantalla. Nota: Es imprescindible gestionar correctamente la liberación de recursos y posibles errores c … c n d num1 d num2 …

9 Solución parcial FILE * f=fopen("fichero.txt", "r"); if(f==NULL){ puts("file not found\n"); return -1; } //typical loop for reading while(!feof(f)){ //reads line and checks stream state fgets(line, SIZE_OF_LINE, f); if(ferror(f)){ puts("error"); break; } //protocol sscanf(line, "%c", &token); if(token=='c'){ continue; }else if(token== 'n'){ sscanf(line, "%c %d", &token, &num_data); //… }else if(token== 'd'){ sscanf(line, "%c %d", &token, &data); //… printf("%d\n", data); }else{ puts("error"); break; } EJERCICIO Implemente la función de prototipo, siguiente: int* read (const char * filename, int* nData); Nota: implemente el protocolo con lógica switch-case

10 Ejercicio-Lectura de una matriz Implemente un programa que lea una matriz bidimensional de un fichero de texto con el protocolo que aparece en pantalla. La primera fila del fichero contendrá la dimensión de la matriz; el resto de filas se corresponderán con las filas de la matriz. Una vez leída, se mostrará en pantalla. Nota: Es imprescindible gestionar correctamente la liberación de recursos antes de finalizar Ejemplo tipo de archivo matriz.txt filas columnas

11 Solución (1/2)  void print_matrix (int n, int m, int ** matrix)  void free_matrix(int n, int m, int** matrix)  int ** read_matrix (const char* filename, int* n, int* m)  apertura de fichero  bucle principal de lectura y protocolo  reserva dinámica de memoria  lectura en modo texto de cada fila

12 Solución: parte de read_matrix (2/2) while(!feof(f)){ //protocol (extracts headers) fscanf(f, "%c",&token); if(token=='d'){ fgets(line, SIZE_OF_LINE, f); if(sscanf(line, "%d %d",n, m)!=2){ puts("error when reading dimension"); return NULL; } //***dynamic allocation of memory }else if(token=='r'){ //reads elements one by one, for each row for(i=0; i<(*m); i++){ fscanf(f, "%d", &matrix[row][i]); } //read what is left of the line fgets(line, SIZE_OF_LINE, f); row++; }else{ puts("unrecognized input"); return 0; } } Cuestión Implemente el protocolo con lógica switch-case int ** read_matrix (const char* filename, int* n, int* m)

13 FIN

14 Operadores de bits Cuestion I b & (~b + 1) = ? MáscaraOperador AND& NOT~ XOR^ OR| Implemente un programa que permita asignar propiedades simbólicas booleanas simultáneamente a una misma variable. Por ejemplo: alumno GUAPO, GENEROSO, RUBIO… #define GUAPO 0x001 #define GENEROSO 0x010 #define RUBIO 0x100 int is_guapo(unsigned int alumno){ return alumno & GUAPO; } int is_generoso(unsigned int alumno){ return alumno & GENEROSO; } int is_rubio(unsigned int alumno){ return alumno & RUBIO; } int set_all(unsigned int* alumno){ *alumno=(GUAPO|GENEROSO|RUBIO); } /*…*/ Cuestion II b & (-b) = ? Cuestion III b ^ (b-1) = ?


Descargar ppt "Repaso C Ficheros, memoria dinámica, … Pablo San Segundo (C-206)"

Presentaciones similares


Anuncios Google