Departamento de Electrónica y Automática 1 Práctica 0REP: REPASO DE C BÁSICO Objetivos: ?? Arrancar nuevamente a programar en C. ?? Familiarizarse con la herramienta de desarrollo en C (Será introducida por el profesor en el laboratorio). ?? Realizar pequeños programas de prueba con funciones de la librería estándar. Tiempo de laboratorio: 1 sesión. Trabajo a entregar al inicio de la sesión: El alumno deberá traer preparados los trozos de código pedidos (apartados 3 y 4). Es conveniente traer tecleados los programas dados. Memoria: Papel: sólo los trozos de código pedidos. E-mail: Fichero (0rep.c) con todo el código (dado y pedido). Normas para la cabecera del e-mail: CLAVE_PRACTICA APELLIDOS_ALUMNO CURSO. Ejemplo: 0rep Garcia Nieva 3itiei 0. Organización del directorio El alumno deberá crear un directorio de nombre: c para almacenar todo lo referente a las prácticas de C. Todo el trabajo de cada práctica irá en directorio independiente que colgará directamente del directorio c. El nombre de cada uno de estos directorios se debe corresponder con el nombre en clave de la práctica. Para la sesión de hoy es 0rep Aunque todo esto se haga a punta de ratón, el alumno debe estar familiarizado con al menos los siguientes comandos de DOS: cd: cambiar de directorio (cd 0rep). md: crear subdirectorio en el directorio actual (md 0rep). copy: copiar un fichero en otro (copy pru1.txt pru2.txt). dir: ver la información del directorio (dir 0rep). type: ver la información de un fichero (type pru1.txt). Si no se recuerda cómo funcionan y cuál es su sintaxis se puede utilizar el comando help en una ventana de DOS. Tecleando help en una ventana de DOS se obtiene información sobre todos los comandos disponibles en DOS, y tecleando help y a continuación el nombre del comando (ejemplo: help cd) se obtiene información de ese comando particular. 1. Hola mundo (30 min con explicación). Escribir, compilar, enlazar y ejecutar el siguiente programa: #include <stdio.h> main() { printf("Hola mundo\n"); return 0; } Organizar el programa como un proyecto de nombre 0rep que contiene el fichero 0rep.c. Prácticas de Programación en C - Nivel Intermedio Departamento de Electrónica y Automática 2 Dependiendo del sistema operativo y del modo de ejecución del programa, puede ser que no se vea el resultado de la ejecución en pantalla. Esto es debido a que el programa se ejecuta en una ventana independiente que desaparece cuando el programa termina. Comprobarlo ejecutando el programa paso a paso. Para evitar que desaparezca se puede programar al final del main una entrada de datos muy simple como en el siguiente ejemplo: main() { int i; printf("Hola mundo\n"); printf("Pulse un número y return para terminar "); scanf("%d",&i); return 0; } 2. Salida de datos con printf (20 min) Comprobar el funcionamiento del siguiente programa: #include <stdio.h> main() { double d=2.36; int i=234; char s[]="Cadena"; printf("Tal cual:\n"); printf("double: %f, entero: %d, cadena: %s\n",d,i,s); printf("Con más formato:\n"); printf("double: %8.1f, entero: %8d, cadena: %20s\n",d,i,s); } Para incluir este programa, se utilizará el mismo proyecto que en el apartado 1: se comenta con /* */ la parte de programa correspondiente al apartado 1 en 0rep.c y se incluye el nuevo código al inicio del fichero. De esta forma también se realizará en los siguientes apartados. Probar con otros valores de d, i y de la cadena apuntada por s. Y probar a utilizar otros tamaños en los formatos (ejemplo: variar 8.1 para f o 20 para s). 3. Entrada de datos con fscanf (30 min) Comprobar el funcionamiento del siguiente programa: #include <stdio.h> main() { double d; int i; char s[10]; printf("Escribe un número en coma flotante, otro entero y una cadena de 9 caracteres\n"); scanf("%lf %d %9s",&d,&i,s); printf("Resultado: %f %d %s\n",d,i,s); return 0; } Ejecutar el programa anterior paso a paso y activar el visualizador con las variables d, i y s para ver su evolución. Prácticas de Programación en C - Nivel Intermedio Departamento de Electrónica y Automática 3 En el siguiente programa sustituir los comentarios por el código correspondiente para pedir y leer los valores del vector enteros definido por el identificador mi. Seguir el mismo esquema del bucle programado para imprimir los resultados por pantalla. #include <stdio.h> main() { int mi[4]; int i; /* código para leer el vector mediante scanf desde teclado */ for(i=0;i<4;i++) { printf("m[%i]=%i\n",i,mi[i]); } } El formato %i equivale a %d. 4. Lectura/escritura desde fichero (70 min) Comprobar el funcionamiento del siguiente programa para lectura y escritura desde fichero. #include <stdlib.h> #include <stdio.h> main() { char s[]="Esto es una prueba"; char sLec[30]; FILE *pfic; pfic=fopen("prueba.txt","w"); if (pfic==NULL) { printf("Error abriendo prueba.txt"); exit(1); } fputs(s,pfic); fclose(pfic); pfic=fopen("prueba.txt","r"); if (pfic==NULL) { printf("Error abriendo prueba.txt"); exit(1); } fgets(sLec,30,pfic); fclose(pfic); printf("Texto en prueba.txt: %s\n",sLec); /* Tambien se puede utilizar rewind */ pfic=fopen("prueba.txt","r"); if (pfic==NULL) { printf("Error abriendo prueba.txt"); exit(1); } printf("Lectura de prueba.txt con fscanf\n"); while(fscanf(pfic,"%29s",sLec)!=EOF) { printf("%s\n",sLec); } fclose(pfic); return 0; } Realizar una función (UnaPorFila) que permita pasar de un fichero de varias palabras por fila a otro fichero con una palabra por fila. A continuación se da el programa main para probar dicha función. Prácticas de Programación en C - Nivel Intermedio Departamento de Electrónica y Automática 4 #include <stdio.h> #include <stdlib.h> void UnaPorFila(FILE *pficOri, FILE *pficSal); void ImpFicPorFilas(FILE *pfic); main() { char sNomOri[]="prueba.txt"; char sNomSal[]="salida.txt"; FILE *pficOri; FILE *pficSal; if ((pficOri=fopen(sNomOri,"w"))==NULL) { printf("Error abriendo %s\n",sNomOri); exit(1); } fprintf(pficOri,"Obras son amores\ny no buenas razones"); fclose(pficOri); if ((pficOri=fopen(sNomOri,"r"))==NULL) { printf("Error abriendo %s\n",sNomOri); exit(1); } if ((pficSal=fopen(sNomSal,"w"))==NULL) { fclose(pficOri); printf("Error abriendo %s\n",sNomSal); exit(1); } UnaPorFila(pficOri,pficSal); fclose(pficOri); fclose(pficSal); if ((pficSal=fopen(sNomSal,"r"))==NULL) { printf("Error abriendo %s\n",sNomSal); exit(1); } ImpFicPorFilas(pficSal); fclose(pficSal); return 0; } void UnaPorFila(FILE *pficOri, FILE *pficSal) { /*Función a programar*/ } void ImpFicPorFilas(FILE *pfic) { char s[100]; while(fgets(s,100,pfic)) { printf("%s",s); } } El resultado de la ejecución debería ser: Obras son amores y no buenas razones Prácticas de Programación en C - Nivel Intermedio