INF Tema3 EntradaYSalidaDeDatos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 50

3.

Entrada y Salida de Datos


Informática
Introducción: E/S
• Funciones de E/S: transportan datos hacia o desde el
programa.
• Entrada → Introduce información en el computador.
• Salida → Extrae información desde el computador
• No forman parte de la definición de C, son funciones de
librería.
• El estándar ANSI define una biblioteca de E/S que permite
tener una E/S común a todos los sistemas, para hacer los
programas portables: stdio.h. Por eso se añade a todos los
programas:
#include <stdio.h>

2
Introducción: E/S
Entrada: el usuario Salida: el programa
introduce datos al muestra datos por
programa (escribe por pantalla.
teclado)

Entrada Salida

Lectura Escritura

Entrada: puede ser Salida: puede ser


también desde fichero también a fichero
(lee los datos de un (escribe datos en un
fichero). fichero).

3
Salida de datos por pantalla
printf("cadena de control", lista de parámetros);

opcional

• Cadena de control: indica como se van a visualizar los datos. Formada


por literales y caracteres de control. Los caracteres de control indican
como deben visualizarse los datos en pantalla.
• lista de parámetros: se separan por comas. Puede incluir variables,
constantes, expresiones, funciones... Para cada valor a mostrar debe
existir un carácter de control.

4
Caracteres de control
Carácter de control Dato
%d Entero
%u Entero sin signo
Los más usados

%ld Entero Largo


%c Carácter
%f Real en coma flotante
%e Real en notación científica
%s Cadena de caracteres
%o Octal
%x Hexadecimal
5
Caracteres de control
• Imprimir el carácter % dentro de la cadena de control: %%.
• Igual número de argumentos que de comandos de formato.
• Para saltar de línea se incluye \n en la cadena de control.
• Para incluir un tabulador se pone \t.

6
Ejemplo
int main() La suma
>> ¿Qué es 9
mostrará
{ en pantalla?
int a=4, b=5, c; 4+5=9
c= a + b;
Hola, ¿Qué tal?
printf("La suma es %d\n",c);
printf("%d + %d = %d\n",a,b,c);
printf("Hola");
printf(", ¿Qué tal?\n");
return 0;
}

7
Ejemplo
int ganancia=20;
printf("Rebaja del %d%%.\n",ganancia);
Rebaja del 20%.

printf("Esto es un carácter: %c.\n", 'a');


printf("Esto es una cadena: %s.\n", "Hola mundo");
Esto es un carácter: a.
Esto es una cadena: Hola mundo.

char c=65;
printf("Carácter %c (ASCII %d). Carácter %c (ASCII %d)\n", 65, 65,
'A', 'A');
Carácter A (ASCII 65). Carácter A (ASCII 65)

printf("Entero:%d Real:%f\n", 9.3, 9.3);


Entero:9 Real:9.3

8
Ejemplo

Instrucción Salida Comentarios


printf("%d\n", 336); 336

printf("%d\n", -336); -336

printf("%c %d\n",'A','A'); A 65 El código ASCII de A es 65

printf("%d %c\n",336,336); 336 P El ASCII de P es 80 (255 + 81 = 336); 81: del 0 al 80

9
Entrada de datos de teclado
scanf("cadena de control", lista de variables);

• Para leer un valor perteneciente a cualquiera de los tipos básicos, se usa el


nombre de la variable precedido por & si la variable es de tipo simple.
• Para leer una variable de tipo cadena de caracteres, no se pone & (ya es
un puntero).
• La cadena de control no debe tener espacios en blanco (aunque la mayoría
de compiladores los admiten).
• Para separar los datos de entrada se usan blancos, tabulaciones o intro
(excepto si la variable que va a guardar el valor es char).

10
Ejemplo
int main()
{
int dia, mes, anyo;

printf("Fecha de nacimiento?:");
scanf("%d%d%d",&dia,&mes,&anyo);
return 0;
}

11
Ejemplo
int main()
Antes de un scanf suele ser conveniente
{ poner un printf, para que el usuario sepa
int a, b; lo que debe introducir.

printf("Introduzca dos enteros:\n");


scanf("%d%d", &a, &b);

printf("%d + %d = %d\n", a, b, a+b);


return 0;
}

12
Ejemplo
int main() La cadena de control de scanf sólo debe contener comandos de control.
{ La cadena de control de printf puede tener cualquier cosa.
int a, b;

printf("Introduzca dos enteros\n");


scanf("%d %d", &a, &b); /* Error en sentido estricto:
tiene blancos (aunque la mayoría
de los compiladores lo admiten) */

scanf("Introduce a y b:%d%d",&a,&b); /* Error: tiene


caracteres y blancos */

return 0;
} 13
Ejemplo
int main() Las variables de scanf van precedidas por & (excepto las cadenas de caracteres).
{ Las variables de printf no van precedidas de &.
int a, b;
printf("Introduce dos valores enteros\n");
scanf("%d%d", a, b); /* Error (no sintáctico): falta & */

printf("%d + %d = %d\n",&a,&b,&a+b); /* Error (no


sintáctico): sobra & */

return 0;
}

14
Ejemplo
int main()
En scanf sólo pueden aparecer variables.
{
int a; En printf pueden aparecer variables, constantes o expresiones.

printf("Introduzca dos enteros\n");


scanf("%d%d", &a, &7); /* Error: se intentan leer
una constante */

printf("%d + %d = %d\n", a, 7, a+7);


return 0;
}

15
Ejemplo
Escribir un programa que calcule el perímetro de
una circunferencia:
2 x  x radio

Solicita al usuario el radio de la circunferencia.

Utilizar una constante para definir el valor de .


16
Solución
#include <stdio.h>
#define PI 3.14159
int main()
{
float radio, perimetro;
printf("Radio de la circunferencia:");
scanf("%f", &radio);
perimetro = 2*PI*radio;
printf("El perímetro es %f", perimetro);
return 0;
}
Múltiples
#include <stdio.h> posibles
#define PI 3.14159 soluciones
int main()
{
float radio;
printf("Radio de la circunferencia:");
scanf("%f", &radio);
printf("El perímetro es %f", 2*PI*radio);
return 0;
} 17
Ejercicio
Escribir un programa que calcule el área de un
círculo:
 x radio2

Solicita al usuario el radio del círculo.

Utilizar una constante para definir el valor de .


18
Posible solución
#include <stdio.h>
#define PI 3.14159

int main()
{
float radio, area;

printf("Radio:");
scanf("%f", &radio);

area = PI*radio*radio;

printf("Área: %f\n", area);


return 0;
}
19
Ejercicio
Escribir un programa que lea un número real n y muestre por
pantalla:
• La mitad del número.
• El cuadrado: n2.
• El cubo: n3.

20
Posible solución
int main()
{
float n;

printf("Introduzca el número:");
scanf("%f", &n);

printf("La mitad de %f es %f\n", n, n/2);


printf("El cuadrado de %f es %f\n",n, n*n);
printf("El cubo de %f es %f\n", n, n*n*n);
return 0;
}
21
Alternativa usando función pow
Función pow

Resultado = pow(a, b)

• #include <math.h>
• Calcula ab y devuelve el valor.
• El valor devuelto es real aunque a y b sean enteros.
• Ejemplo:
float res;
res = pow(3,2); ➔ 32 ➔ 9.0
printf("Resultado: %f", pow(3, 2.0)); ➔ Resultado: 9.0

22
Posible solución
#include <math.h>
#include <stdio.h>
int main()
{
float n;
printf("Introduzca el número:");
scanf("%f", &n);
printf("La mitad de %f es %f", n, n/2);
printf("El cuadrado de %f es %f", n, pow(n,2));
printf("El cubo de %f es %f", n, pow(n,3));
return 0;
}

23
Ejercicio
En un almacén se guarda una cantidad determinada de artículos, todos
iguales.
Escribir un programa que calcule el valor de los artículos del almacén.
Para ello leer la cantidad de artículos que contiene el almacén y el
precio de un artículo.
Mostrar por pantalla el valor resultante.

24
Posible solución
int main()
{
float precio;
int cantidad;

printf("Introduzca la cantidad de artículos: ");


scanf("%d", &cantidad);
printf("Introduzca el precio del artículo: ");
scanf("%f", &precio);

printf("Valor de existencias: %f", cantidad*precio);


return 0;
}

25
Ficheros
• Archivo o fichero: conjunto de datos almacenado en un dispositivo
de almacenamiento secundario: memoria fija (disco duro, DVD, CD).
• Independiente de la información que contengan (datos, programas,
textos, gráficos,...).

Hola 456
Soy un fichero 789
Contengo datos 6.55
Hola.txt datos.txt

26
Nombre de fichero
Se identifica por un nombre y una extensión:
• Nombre
• Extensión: define el tipo de archivo. Suele tener 3 o 4 caracteres.

Tortilla.txt  Fichero de texto


H1.c  Fichero de texto escrito en C
Prueba.exe  Fichero ejecutable
memo.docx  Fichero de MsWord

27
Fin de fichero
Todos los ficheros terminan en un carácter especial que indica el final
del fichero: EOF (end of file). El carácter no es visible.

María Pérez Gómez 8.5


Andres López García 9.0
Ana Ruiperez Gómez 2.4
EOF
Listado.txt

28
Operaciones con ficheros
1. Definir una variable de tipo fichero (FILE *) :
declaración del fichero.
2. Abrir el fichero, y comprobar que la apertura es correcta.
3. Operar con el fichero: leer del fichero o escribir al
fichero.
4. Cerrar el fichero.

29
Declaración de variables ficheros
Tipo del fichero: FILE *

FILE *mi_fichero;
FILE *f1, *f2;
FILE *a, *b, *c;

30
Abrir Ficheros
variable_fichero = fopen(nombre_fichero, modo);

Ejemplo: f1 = fopen("hola.txt", "a");


declarada antes: FILE *f1;

• Nombre del fichero: cadena de caracteres indicando el nombre


completo del fichero y el path. Ejemplo:
"C:\\temp\\datos.txt"
"a.txt" -> En este caso busca en el directorio actual.
• Modo: indica el uso al que se va a destinar el fichero.

31
Abrir Ficheros
Modos principales:
• r  Abre el fichero para lectura. El fichero debe existir, sino se
produce un error.
• a  Abre el fichero para añadir datos al final del fichero. Si el fichero
no existe, lo crea.
• w  Abre el fichero para escritura. Si el fichero existe borra su
contenido. Si no existe, lo crea.

Aparte de los tres anteriores existen otros modos menos utilizados.

32
Abrir Ficheros
Nombre del fichero:
• Entre comillas dobles si es una cadena constante: "prueba.txt".
• Con extensión.
• Si no está en el directorio por defecto debe incluir el path:
"c:\\temp\\prueba.txt".

Las barras \ del path se duplican \\

33
Abrir Ficheros
...
FILE *fichero, *f1, *ejemplo, *f;

fichero = fopen("c:\\temp\\prueba.txt", "r");


f1 = fopen ("hola.txt", "a");

ejemplo = fopen ("a:\\ejemplo.txt", "w");


f = fopen ("datos.txt", "w");

34
Abrir Ficheros
Tras abrir el fichero, se abra en el modo que se abra, se debe comprobar que
no hay errores de apertura: instrucción
FILE *fic; condicional “si”.
fic=fopen("C:\\prueba.txt","r"); Más adelante se
if (fic==NULL){ detallará en
printf("Error al abrir el fichero"); profundidad.
return 1;
}
printf("Fichero abierto para lectura");
/* aquí las operaciones de lectura */
fclose(fic);

>> ¿Por qué es necesario comprobar también la apertura si se abre el fichero


en modo escritura?

35
Cerrar Ficheros

fclose(puntero_fichero);

Ejemplo:

FILE *f;
f = fopen("fichero.txt", "r");
...
fclose(f);

36
Salida de datos a fichero (escritura) opcional

fprintf(fichero,"cadena de control", lista de parámetros);

• Fichero: variable de tipo fichero de donde se van a escribir los datos.

• Cadena de control: indica como se van a visualizar los datos. Formada por
literales y caracteres de control. Los caracteres de control indican como deben
visualizarse los datos en pantalla.

• Parámetros: se separan por comas. Puede incluir variables, constantes,


expresiones, funciones... Para cada parámetro a mostrar debe existir un
carácter de control.

38
Salida de datos a fichero (escritura)
Sólo se puede escribir en un fichero si está abierto para escritura (modo "w") o para añadir datos
(modo "a").

FILE *f;
int a=4, b=5, c;
datos.txt
f=fopen("datos.txt", "w");
if (f==NULL){ La suma es 9
printf("Error al abrir el fichero"); 4+5=9
return 1;
}
c=a+b;
fprintf(f,"La suma es %d\n",c);
fprintf(f,"%d + %d = %d\n",a,b,c);
fclose(f);
39
Entrada de datos de fichero (lectura)
fscanf(fichero, "cadena de control", lista de variables);

• Para leer un valor perteneciente a cualquiera de los tipos básicos, se usa el


nombre de la variable precedido por &.

• Para leer una variable de tipo cadena de caracteres, no se pone & (ya es un
puntero).

• La cadena de control no debe tener espacios en blanco.

• Para separar los datos de entrada se usan blancos, tabulaciones o intro


(excepto char: no se usa nada entre la lectura de dos char).

40
Ejemplo
Modificar este programa para que lea los datos de un fichero (entrada.txt) y
escriba a otro fichero (salida.txt).

#include <stdio.h>
int main()
{
int a, b;
printf("Introduzca dos enteros:\n");
scanf("%d%d", &a, &b);
printf("%d + %d = %d\n", a, b, a+b);
return 0;
}

41
Ejemplo
Paso 1. Declarar las variables de tipo fichero.
Paso 2. Abrir los ficheros
int main()
{
int a, b;
FILE *fe, *fs;
fe = fopen("entrada.txt", "r");
if (fe==NULL){
printf("Error al abrir el fichero de entrada");
return 1;
}
fs = fopen("salida.txt", "w");
if (fs==NULL){
printf("Error al abrir el fichero de salida");
return 1;
}
printf("Introduzca dos valores enteros:\n");
scanf("%d%d", &a, &b);
printf("%d + %d = %d\n", a, b, a+b);
return 0;
}
42
Ejemplo
Paso 3. Cambiar las operaciones de lectura y escritura por las propias de ficheros.
Paso 4. Añadir los punteros a fichero.

int main()
{
int a, b;
FILE *fe, *fs;
fe = fopen("entrada.txt", "r");
if (fe==NULL){
printf("Error al abrir el fichero de entrada");
return 1;
}
fs = fopen("salida.txt", "w");
if (fs==NULL){
printf("Error al abrir el fichero de salida");
return 1;
}
printf("Introduzca dos valores enteros:\n");
fscanf(fe, "%d%d", &a, &b);
fprintf(fs, "%d + %d = %d\n", a, b, a+b);
return 0;
}
43
Ejemplo
Paso 5. Cerrar los ficheros.
Paso 6. Eliminar el printf destinado al usuario.
int main()
{
int a, b;
FILE *fe, *fs;
fe = fopen("entrada.txt", "r");
if (fe==NULL){
printf("Error al abrir el fichero de entrada");
return 1;
}
fs = fopen("salida.txt", "w");
if (fs==NULL){
printf("Error al abrir el fichero de salida");
return 1;
}
printf("Introduzca dos valores enteros:\n");
fscanf(fe, "%d%d", &a, &b);
fprintf(fs, "%d + %d = %d\n", a, b, a+b);
fclose(fe);
fclose(fs);
return 0;
}
44
Ejemplo
int main()
{
4 5
int a, b;
FILE *fe, *fs;
fe = fopen("entrada.txt", "r");
if (fe==NULL){
printf("Error al abrir el fichero de entrada"); Entrada.txt
return 1;
}
fs = fopen("salida.txt", "w");
if (fs==NULL){
printf("Error al abrir el fichero de salida");
return 1;
}
fscanf(fe, "%d%d", &a, &b);
fprintf(fs, "%d + %d = %d\n", a, b, a+b);

fclose(fe); 4+5=9
fclose(fs);
return 0;
}
Salida.txt
45
Ejemplo
Solicitar al usuario el día del mes en que nos
encontramos (valor numérico entre 1 y 30).

Calcular que día será mañana y escribirlo en el fichero


"datos.txt".

Suponer que todos los meses tienen 30 días.

46
Ejemplo
int main()
{
int dia, manyana;
FILE *f;
f=fopen("datos.txt", "w");
if (f==NULL){
printf("Error al abrir el fichero");
return 1;
}
printf("Introduce el día: ");
scanf("%d", &dia);

manyana = dia % 30 + 1;

fprintf(f,"Mañana será día %d", manyana);


fclose(f);
return 0;
}

47
Ejercicio
Desarrollar un programa que pida al usuario un número entero y
escriba en un fichero (potencias.txt) dicho número, su cuadrado y
su raíz cuadrada (cada valor en una línea). Ejemplo:

Dame número: 21

Nota: Se pueden usar


las funciones pow y sqrt
de la librería math.h
48
Ejercicio
En el fichero piezas.txt se tienen dos valores: el total de piezas en
stock de nuestra empresa y el precio de coste unitario de cada pieza:

Suponiendo un beneficio del 20% sobre el precio de coste, hacer un


programa que lea el fichero anterior y muestre por pantalla el dinero
que ingresaríamos si se vendieran todas las piezas en stock.

49
Ejercicio
En el fichero "loteria.txt" se tiene el número de lotería con el
que jugamos.
Se pide desarrollar un programa que lea dicho número y
escriba en el fichero "terminacion.txt" la terminación del
numero leído.

Si se produce un error en la apertura de alguno de los ficheros


se debe indicar por pantalla y terminar el programa a
continuación.

50
Posible solución
int main()
{
int num,terminacion;
FILE *lec, *escr;
lec = fopen("loteria.txt", "r");
if (lec==NULL){
printf("Error al abrir el fichero loteria.txt");
return 1;
}
escr = fopen("terminacion.txt", "w");
if (escr==NULL){
printf("Error al abrir el fichero terminacion.txt");
return 1;
}
fscanf (lec,"%d", &num); /* leer número de fichero loteria.txt */
terminacion = num % 10;
fprintf (escr, "%d", terminacion); /* escribir terminación en fichero terminacion.txt */
fclose(lec);
fclose(escr);
return 0;
}

51

También podría gustarte