martes, 26 de febrero de 2013

FUNCIONES BÁSICAS DE ENTRADA Y SALIDA


FUNCIONES BÁSICAS DE ENTRADA Y SALIDA DEL LENGUAJE C

Se refiere a las operaciones que se producen en el teclado y en la pantalla de la computadora. En C no hay palabras claves para realizar las acciones de Entrada/Salida, estas se hacen mediante el uso de las funciones de la biblioteca estándar (stadio.h).Para utilizar las funciones de E / S debemos incluir en el programa el archivo de cabecera, ejemplo: stdio.h, mediante la declaratoria:
#include <stdio.h>
Las Funciones de E/S más simples son getchar() que lee un carácter del teclado, espera un retorno, es decir un enter y el eco aparece. Es decir la tecla presionada.
putchar():Imprime un carácter en la pantalla, en la posición actual del cursor. Algunas variaciones:
getche():Aparece el Eco
getch():No aparece el eco

 estas instrucciones se encuentran en la biblioteca conio.h
 Programa que espera que se presiona una tecla, la muestra en pantalla, y además muestra el carácter siguiente: Ejemplo 2.1:
#include <stdio.h>
#include <conio.h>
main()
{
char car;
 clrscr(); /*Se encarga de borrar la pantalla por eso se llama clear screen*/
car=getchar();
putchar(car+1);
getch();
return 0;
}

Ejemplo 2.2:
#include <stdio.h>
#include <conio.h>
main()
{
char x; /*Declaramos x como carácter*/
printf("Para Finalizar Presione cualquier Tecla:");
x= getchar();/*Captura y muestra el carácter presionado*/
getch();/*Espera a que se presione cualquier otra tecla para finalizar*/
return 0;
}

FUNCIONES DE ENTRADA Y SALIDA (printf y scanf) 
Salida de datos con formato: la función printf()
 La función printf() (de “print” = imprimir y “f” = formato) sirve para escribir datos en el dispositivo de salida estándar (generalmente la pantalla) con un formato determinado por el programador. La forma general de utilizarla es la siguiente:
printf(cadena_de_formato, datos);
El prototipo de printf() se encuentra en el archivo de cabecera stdio.h (de “std” =standard e “io” = input/output, es decir, entrada/salida; por lo tanto, “stdio” es unacrónimo de “entrada/salida estándar”)
 El primer argumento, la cadena_de_formato, especifica el modo en el que se deben mostrar los datos que aparecen a continuación. Esta cadena se compone de una serie de códigos de formato que indican a C qué tipo de datos son los que se desean imprimir. Todos los códigos están precedidos del símbolo de porcentaje (“%”). Por ejemplo, el código “%i” indica a la función que se desea escribir un número de tipo int ,y el código “%f”, que se desea escribir un número real de tipo  float 
.La forma más simple de utilizar printf() es:
int a;
a = 5;
printf("%i", a);

Esto escribirá el valor de la variable entera a en la pantalla, es decir, 5. Fíjese en que el primer argumento de printf() es una cadena (y, por lo tanto, se escribe entre comillas)cuyo contenido es el código del tipo de dato que se pretende escribir. El segundo argumento es el dato mismo.
En una sola instrucción printf() pueden escribirse varios datos. Por ejemplo:
int a;
float x;
a = 5;
x = 10.33;
printf("%i%f", a, x);

Observe detenidamente la cadena de formato: primero aparece “%i” y luego “%f”.Esto indica que el primer dato que debe imprimirse es un entero, y el segundo, un real. Después, aparecen esos datos separados por comas y exactamente en el mismo orden que en la cadena de formato: primero a (la variable entera) y luego x (la variable real).El resultado será que en la pantalla se escribirán los números 5 y 10.33.
Hay códigos que admiten modificadores. Por ejemplo:
• Los códigos numéricos “%i”, “%d”, “%u” (para números enteros) y “%f”, “%e” y“%g” (para números reales), permiten insertar modificadores de longitud “l” (longitud doble) y “h” (longitud corta). Así, por ejemplo, “%ld” indica que se va a imprimir un entero de longitud doble (long int); “%hu” sirve para enteros cortos sin signo (unsignedshort int); “%lf” indica que se imprimirá un número real de longitud doble (double),etc
.• El código “%f” (números reales) se pueden usar con un modificador deposiciones decimales que se desean mostrar. Por ejemplo, con “%10.4f” obligamos a que se impriman diez dígitos a la izquierda de la coma decimal y cuatro a la derecha. La escritura se ajusta a la derecha. Para ajustarla a la izquierda se utiliza el modificador “-”, de esta forma: “%-10.4f”
• El código “%s” (cadenas de caracteres) se puede combinar con un especificadorde longitud máxima y mínima de la cadena. Por ejemplo, “%4.8s” escribe una cadena de al menos cuatro caracteres y no más de ocho. Si la cadena tiene más, se pierden rosque excedan de ocho. También se puede utilizar el modificador “-” para alinear el texto a la izquierda.
 Además de los códigos de formato, en la cadena de formato puede aparecer cualquier texto entremezclado con los códigos. A la hora de escribir en la pantalla, los códigos serán sustituidos por los datos correspondientes, pero el resto del texto aparecerá de forma literal. Por ejemplo:
int a;
float x;
a = 5;
x = 10.33;
printf("El número entero es %i y el real es %f", a, x);
Lo que aparecerá en la pantalla al ejecutar este fragmento de código será:
El número entero es 5 y el real es 10.33
Una última observación sobre printf(). Hay ciertos caracteres que no son directamente imprimibles desde el teclado. Uno de ellos es el salto de línea. Para poder ordenar a  printf() que escriba un salto de línea (o cualquier otro carácter no imprimible) se utilizan los códigos de barra invertida, que con códigos especiales precedidos del carácter “\”.En concreto, el carácter “salto de línea” se indica con el código “\n”. Observe las diferencias entre estos dos bloques de instrucciones para intentar comprender la importancia del salto de línea:
int a;
a = 5;
printf("La variable a vale %i", a);
a = 14;
printf("La variable a vale %i", a);

El resultado en la pantalla de la ejecución de estas instrucciones es:
La variable a vale 5 La variable a vale 14
Veamos el mismo ejemplo usando el código del salto de línea (\n):
int a;
a = 5;
printf("La variable a vale %i\n", a);
a = 14;
printf("La variable a vale %i", a);

El resultado en la pantalla será:
La variable a vale 5
La variable a vale 14
ENTRADA DE DATOS CON FORMATO: LA FUNCIÓN SCANF()
La función scanf() es, en muchos sentidos, la inversa de  printf() . Puede leer desde el dispositivo de entrada estándar (normalmente el teclado) datos de cualquier tipo de los manejados por el compilador, convirtiéndolos al formato interno apropiado. Funciona de manera análoga a printf(), por lo que su sintaxis es:
scanf(cadena_de_formato, datos);
El prototipo de scanf() se encuentra en el archivo de cabecera stdio.h (de “std” =standard e “io” = input/output, es decir, entrada/salida)
La cadena_de_formato tiene la misma composición que la de printf(). Los datos son las variables donde se desea almacenar el dato o datos leídos desde el teclado. ¡Cuidado! Con los tipos simples, es necesario utilizar el operador & delante del nombre de la variable, porque esa variable se pasa por referencia a scanf() para que ésta pueda modificarla.
 Por ejemplo:
int a, b;
float x;
scanf("%d", &a);
scanf("%d%f", &b, &x);

La primera llamada a scanf() sirve para leer un número entero desde teclado y almacenarlo en la variable a. La segunda llamada lee dos números: el primero, entero, que se almacena en b; y, el segundo, real, que se almacena en x.
La función scanf() tiene alguna otra funcionalidad añadida para el manejo de cadenas de caracteres que por ahora no vamos a discutir, para no agobiar.

EJEMPLO DE USO DE SCANF() Y PRINTF()
Debido a la relativa complejidad de estas funciones de entrada y salida, vamos a presentar un pequeño ejemplo de traducción de pseudocódigo a C. Se trata de un algoritmo que lee dos números enteros, A y B. Si A es mayor que B los resta, y en otro caso los suma.
En pseudocódigo:
algoritmo suma_y_resta
variables a y b son enteros
inicio
 escribir ("Introduzca dos números enteros")
leer(a, b)
si (a < b) entonces
 escribir("La suma de a y b es:", a+b)
si_no
 escribir("La resta de a menos b es:", a–b)
fin

En lenguaje C:
/* Programa suma y resta */
#include <stdio.h>
int main()
{
int a, b;
printf ("Introduzca dos números enteros\n");
scanf("%d%d", &a, &b);
if (a < b)
printf("La suma de %d y %d es: %d", a, b, a+b);
else
printf("La resta de %d menos %d es: %d", a, b, a–b);
return 0;

FUNCIONES DE ENTRADA Y SALIDA (PUTS Y GETS) 
FUNCIÓN GETS
Lee una cadena de carácter introducido por el teclado. Se puede introducir caracteres hasta que se de un retorno de carro, (enter); el cual no es parte de la cadena; en su lugar se coloca un terminador nulo \0.
Sintaxis:
char *gets(char *s);
Lee una cadena desde stdin.
Gets lee una cadena de caracteres terminada con un retorno de línea desde la entrada estándar y la almacena en s. El carácter de retorno de línea es reemplazado con el carácter nulo en s.
 Observa que la manera en que hacemos referencia a una cadena dentro de la funciones char *, el operador * indica que debemos pasar como argumento la dirección de memoria donde estará almacenada la cadena a leer. Veremos la explicación en el capítulo de punteros, baste decir que a nivel del compilador char *cad y char cad[], son equivalentes, o casi.
Gets permite la entrada de caracteres que indican huecos, como los espacios y los tabuladores. gets deja de leer después de haber leído un carácter de retorno de línea; todo aquello leído será copiado en s, incluido en carácter de retorno de línea. Esta función no comprueba la longitud de la cadena leída. Si la cadena de entrada no es lo suficientemente larga, los datos pueden ser sobrescritos o corrompidos. Más adelante veremos que la función fgets proporciona mayor control sobre las cadenas de entrada.
Valor de retorno:
 Si tiene éxito, gets devuelve la cadena s, si se encuentra el fin_de_fichero o se produce un error, devuelve tNULL. Ejemplo:
char cad[80];
do {
gets(cad);
} while (cad[0] != '\000');

En este ejemplo, el programa permanecerá leyendo cadenas desde el teclado mientras no introduzcamos una cadena vacía. Para comprobar que una cadena está vacía basta con verificar que el primer carácter de la cadena es un carácter nulo.
FUNCIÓN PUTS
Imprime en pantalla, el argumento guardado en la variable que se manda a impresión.
Sintaxis:
int puts(const char *s);
Envía una cadena a stdout.
puts envía la cadena s terminada con nulo a la salida estándar stdout y le añade el carácter de retorno de línea.
Valor de retorno: Si tiene éxito, puts devuelve un valor mayor o igual a cero. En caso contrario devolverá el valor EOF.
Ejemplo:
char cad[80];
int i;
 do {
gets(cad);
for(i = 0; cad[i]; i++)
if(cad[i] == ' ') cad[i] = '_';
puts(cad);} while (cad[0] != '\000');

Empezamos a llegar a ejemplos más elaborados. Este ejemplo leerá cadenas en "cad", mientras no introduzcamos una cadena vacía. Cada cadena será recorrida carácter a carácter y los espacios de sustituirán por caracteres '_'. Finalmente se visualizará la cadena  resultante.
Llamo tu atención ahora sobre la condición en el bucle for, comparándola con la del bucle do while. Efectivamente son equivalentes, al menos para i == 0, la condición del bucle do while podría haberse escrito simplemente como while (cad[0]). De hecho, a partir de ahora intentaremos usar expresiones más simples.
 POR ARCHIVOS
En C un archivo puede ser cualquier cosa, desde un archivo de disco a un terminal o una impresora. Se asocia una secuencia con un archivo específico realizando una operación de apertura, una vez que está abierto, la información puede ser intercambiada entre éste y el programa. El puntero a un archivo es el hilo que unifica el sistema de E/S con buffer. Un puntero a un archivo es un puntero a una información que define varias cosas sobre él, incluyendo el nombre, el estado y la posición actual del archivo. En esencia, el puntero a un archivo identifica un archivo en disco específico y utiliza la secuencia asociada para dirigir el funcionamiento de las funciones de E/S con buffer. Para obtener una variable de tipo puntero a archivo se debe utilizar una sentencia como la siguiente: FILE *punt;
La función fopen() abre una secuencia para que pueda ser utilizada y le asocia a un archivo. Su prototipo es: FILE *fopen(const char *nombre_archivo, const char *modo); Donde nombre_archivo es un puntero a una cadena de caracteres que representan un nombre válido del archivo y puede incluir una especificación de directorio. La cadena que apunta modo determina cómo se abre el archivo. Los modos son los siguientes:
r: Abre un archivo de texto para lectura.
w: Crea un archivo de texto par escritura
a: Abre un archivo de texto para añadir
r+: Abre un archivo de texto para lectura/escritura
w+: Crea un archivo de texto para lectura/escritura
a+: Añade o crea un archivo de texto para lectura/escritura
La función fclose() cierra una secuencia que fue abierta mediante una llamada a fopen(). Escribe toda la información que todavía se encuentre en el buffer del disco y realiza un cierre formal del archivo a nivel del sistema operativo. También libera el bloque de control de archivo asociado con la secuencia, dejándolo libre para su reutilización. A veces es necesario cerrar algún archivo para poder abrir otro, debido a la existencia de un límite del sistema operativo en cuanto al número de archivos abiertos. Su prototipo es: int fclose(FILE *fp);
La función putc() escribe caracteres en un archivo que haya sido abierto previamente para operaciones de escritura, utilizando la función fopen(). Su prototipo es: int putc(int car, FILE *pf);
La función getc() escribe caracteres en un archivo que haya sido abierto, en modo lectura, mediante fopen(). Su prototipo es: int getc(FILE *pf);La función fputs() escribe la cadena en la secuencia especificada. Su prototipo es: fputs() escribe la cadena en la secuencia especificada. Su prototipo es: int fputs(const char *cad, FILE *pf);La función fgets() lee una cadena de la secuencia especificada hasta que se lee un carácter de salto de línea o hasta que se han leído longitud-1 caracteres.
La función rewind() inicia el indicador de posición al principio del archivo indicado por su argumento. Su prototipo es: rewind() inicia el indicador de posición al principio del archivo indicado por su argumento. Su prototipo es: void rewind(FILE *pf);
Existen otras muchas funciones en la biblioteca estándar de C (ver capítulo 13) como pueden serremove(): Borra el archivo especificado.
fflush(): Vacía el contenido de una secuencia de salida.
fread(): Lee tipos de datos que ocupan más de un byte. Permiten la lectura de bloques de cualquier tipo de datos.
fwrite(): Escribe tipos de datos que ocupan más de un byte. Permiten la escritura de bloques de cualquier tipo de datos.
fprintf(): Hace las funciones de printf() sobre un fichero.
fscanf(): Hace las funciones de scanf() sobre un fichero.
feof(): Detecta el final de un fichero.
ferror(): Detecta un error en la lectura/escritura de un fichero.
fclose() cierra una secuencia que fue abierta mediante una llamada a fopen().
putc() escribe caracteres en un archivo que haya sido abierto previamente para operaciones de escritura, utilizando la función fopen().
La función getc() escribe caracteres en un archivo que haya sido abierto, en modo lectura, mediante fopen(). Su prototipo es:
La función fputs() escribe la cadena en la secuencia especificada. Su prototipo es: int fputs(const char *cad, FILE *pf);
La función fgets() lee una cadena de la secuencia especificada hasta que se lee un carácter de salto de línea o hasta que se han leído longitud-1 caracteres. Su prototipo es: fgets() lee una cadena de la secuencia especificada hasta que se lee un carácter de salto de línea o hasta que se han leído longitud-1 caracteres. Su prototipo es:int fgets(char *cad, FILE *pf);
















No hay comentarios:

Publicar un comentario