Mostrando entradas con la etiqueta C. Mostrar todas las entradas
Mostrando entradas con la etiqueta C. Mostrar todas las entradas

lunes, 5 de marzo de 2012

C - Hola Mundo en C

El primer programa que se normalmente se crea al empezar a aprender un nuevo lenguaje de programación es el “Hello World” o también conocido como el “Hola Mundo”, recuerdo incluso que un ex profesor (Eduardo Klagges) nos contó sobre la maldición del programador, y que era si uno no realizaba el hola mundo como su primer programa, pero bueno, eso es para otro artículo.



El siguiente código es el que genera el hola mundo en el lenguaje C.
#include <stdio.h>
int main() {
    printf("Hola mundo\n");
    return 0;
}
Respecto a #include <stdio.h> pueden leerlo en mi otro articulo.

int main(){ } Es la función principal de casi todo lenguaje de programación, es el método de ejecución de nuestro programa. En este caso, el int (número entero), significa que nuestro programa devuelve un valor, además este valor es un int. Obviamente el método main puede no devolver ningún valor, según las necesidades del programa y programador. Lo que va dentro de las llaves es el código a ejecutar, en este caso es mostrar las palabras “Hola mundo”.

printf("Hola mundo\n"); printf es una de las formas que tenemos de mostrar valores por pantalla, en este caso estamos mostrando las palabras hola mundo, las cuales deben ir dentro de comillas, la especificación \n significa que habrá un salto de línea al terminar el bloque.

return 0 Es el valor que esta retornando el programa, en el caso que el valor retornado sea diferente a 0, significaría que el programa esta presentando problemas.

Aveces pueden existir problemas en la visualización de las palabras, que no se alcancé de visualizar, para esto debemos agregar la siguiente línea:
system("PAUSE");
con esto causamos una “pausa” antes de que se cierre el programa.

martes, 21 de febrero de 2012

stdio.h



stdio.h, que significa "standard input-output header" (cabecera estandar E/S), es la biblioteca estándar del lenguaje de programación C, el archivo de cabecera que contiene las definiciones de macros, las constantes, las declaraciones de funciones y la definición de tipos usados por varias operaciones estándar de entrada y salida. Por motivos de compatibilidad, el lenguaje de programación C++ (derivado de C) también tiene su propia implementación de estas funciones, que son declaradas con el archivo de cabecera cstdio.

Las funciones declaradas en stdio.h pueden clasificarse en dos categorías: funciones de manipulación de ficheros y funciones de manipulación de entradas y salidas.

Manipulación de ficheros


Nombre
Descripción
fcloseCierra un fichero a través de un puntero.
fopen, fropen, fdopenAbre un fichero para lectura, para escritura/reescritura o para edición.
removeElimina un fichero.
renameCambia el nombre del fichero.
rewindColoca el indicador de posición de fichero para el stream apuntado por stream al comienzo del fichero.
tmpfileCrea y abre un fichero temporal que es borrado cuando cerramos con la función fclose().

Manipulación de entrada y salidas



Nombre
Descripción
clearerr
Despeja los indicadores de final de fichero y de posición de fichero para el stream apuntado por stream al comienzo del fichero.
feof
Comprueba el indicador de final de fichero.
ferror
Comprueba el indicador de errores.
fflush
Si stream apunta a un stream de salida o de actualización cuya operación más reciente no era de entrada, la función fflush envía cualquier dato aún sin escribir al entorno local o a ser escrito en el fichero; si no, entonces el comportamiento no está definido. Si stream es un puntero nulo, la función fflush realiza el despeje para todos los streams cuyo comportamiento está descrito anteriormente.
fgetpos
Devuelve la posición actual del fichero.
fgetc
Devuelve un carácter de un fichero.
fgets
Consigue una cadena de caracteres de un fichero.
fputc
Escribe un carácter en un fichero.
fputs
Escribe una cadena de caracteres en un fichero.
ftell
Devuelve la posición actual del fichero como número de bytes.
fseek
Sitúa el puntero de un fichero en una posición aleatoria.
fsetpos
Cambia la posición actual de un fichero.
fread
Lee diferentes tamaños de datos de un fichero.
fwrite
Envía, desde el array apuntado por puntero, hasta nmemb de elementos cuyo tamaño es especificado por tamaño. El indicador de posición de ficheros es avanzado por el número de caracteres escritos correctamente. Si existe un error, el valor resultante del indicador de posición de ficheros es indeterminado.
getc
Devuelve un carácter desde un fichero.
getchar
Igual que getc.
printf, fprintf, sprintf
snprintf
Usados para imprimir salidas de datos.
vprintf
También utilizado para imprimir salidas.
perror
Escribe un mensaje de error a stderr.
putc
Devuelve un carácter de un fichero.
putchar, fputchar
Igual que putc(stdout).
scanf, fscanf, sscanf
Utilizado para introducir entradas.
vfscanf, vscanf, vsscanf
También utilizado para introducir entradas.
setbuf
Esta función es equivalente a la función setvbuf pasando los valores _IOFBF para modo y BUFSIZ para tamaño, o (si acumulador es un puntero nulo), con el valor _IONBF para modo.
setvbuf
Sólo puede ser usada después de que el stream apuntado por stream ha sido asociado con un fichero abierto y antes de otra operación cualquiera es llevada acabo al stream. El argumento modo determina cómo stream será almacenado según lo siguiente: _IOFBF ocasiona la entrada/salida a ser completamente almacenado; _IOLBF ocasiona la entrada/salida a almacenar por líneas; _IONBF ocasiona la entrada/salida a no ser almacenado. Si acumulador no es un puntero nulo, el array al que es apuntado puede ser usado en vez de la acumulación adjudicada por la función setvbuf. El argumento tamaño especifica el tamaño del array.
tmpnam
Genera una cadena de caracteres que es un nombre válido para ficheros y que no es igual al nombre de un fichero existente. La función tmpnam genera una cadena diferente cada vez que es llamada, hasta un máximo de TMP_MAX veces. Si la función es llamada más veces que TMP_MAX, entonces el comportamiento de la función está definido según la implementación del compilador.
ungetc
puts
Imprime una de cadena de caracteres.


fuente: wikipedia

Funciones estándar de entrada y de salida


El lenguaje C sólo cuenta con operadores e instrucciones de control de flujo. Cualquier otra operación que se desee realizar hay que programarla o bien emplear las funciones de que se disponga en nuestra biblioteca de programas.

El lenguaje C cuenta con un amplio conjunto de funciones estándar entre las que se encuentran las de entrada y de salida de datos, que veremos en esta sección. El compilador de C tiene que saber (nombre y tipo de datos de los argumentos y del valor devuelto) qué funciones utilizará nuestro programa para poder generar el código ejecutable de forma correcta. Por tanto, es necesario incluir los ficheros de cabecera que contengan sus declaraciones en el código de nuestro programa. En este caso:
#include <stdio.h>
Funciones de salida estándar

La salida estándar es el lugar donde se muestran los datos producidos (mensajes, resultados, etcétera) por el programa que se encuentra en ejecución. Normalmente, esta salida es la pantalla del ordenador o una ventana dentro de la pantalla. En este último caso, se trata de la ventana asociada al programa.
printf( "formato" [, lista_de_campos ] )
Esta función imprime en la pantalla (la salida estándar) el texto contenido en “formato”. En este texto se sustituyen los caracteres especiales, que deben de ir precedidos por la barra invertida (\), por su significado en ASCII. Además, se sustituyen los especificadores de campo, que van precedidos por un %, por el valor resultante de la expresión (normalmente, el contenido de una variable) correspondiente indicada en la lista de campos. Este valor se imprime según el formato indicado en el mismo especificador.

La tabla siguiente muestra la correspondencia entre los símbolos de la cadena del formato de impresión y los caracteres ASCII.n se utiliza para indicar un dígito de un número:


Indicación de carácter
Carácter ASCII
\nnew line (salto de línea)
\fform feed (salto de página)
\bbackspace (retroceso)
\ttabulator (tabulador)
\nnnASCII número  nnn
\0nnnASCII número  nnn (en octal)
\0XnnASCII número  nn (en hexadecimal)
\\backslash (barra invertida)

Los especificadores de campo tienen el formato siguiente:
%[-][+][anchura[.precisión]]tipo_de_dato
Los corchetes indican que el elemento es opcional. El signo menos se emplea para indicar alineación derecha, cosa habitual en la impresión de números. Para éstos, además, si se especifica el signo más se conseguirá que se muestren precedidos por su signo, sea positivo

o negativo. La anchura se utilizará para indicar el número mínimo de caracteres que se utilizarán para mostrar el campo correspondiente y, en el caso particular de los números reales, se puede especificar el número de dígitos que se desea mostrar en la parte decimal mediante la precisión. El tipo de dato que se desea mostrar se debe incluir obligatoriamente y puede ser uno de los siguientes:

Enteros:


%dEn decimal
%iEn decimal
%uEn decimal sin signo
%oEn octal sin signo
$xEn hexadecimal

Reales:


%fEn punto flotante
%eCon formato expotencial: [+/-]0.000e[+/-]000 con e minúscula o mayúscula (%E)
%gEn formato e, f, o d

Otros:


%cCarácter
%sCadena de caracteres
%%El signo de %


Funciones de entrada estándar

Se ocupan de obtener datos de la entrada estándar que, habitualmente, se trata del teclado. Devuelven algún valor adicional que informa del resultado del proceso de lectura. El valor devuelto no tiene por qué emplearse si no se necesita, pues muchas veces se conoce que la entrada de datos se puede efectuar sin mayor problema.
scanf( "formato" [, lista_de_&variables ] )
Lee del buffer del teclado para trasladar su contenido a las variables que tiene como argumentos. La lectura se efectúa según el formato indicado, de forma similar a la especificación de campos empleada para printf.

Para poder depositar los datos leídos en las variables indicadas, esta función requiere que los argumentos de la lista de variables sean las direcciones de memoria en las que se encuentran. Por este motivo, es necesario emplear el operador “dirección de” (&). De esta manera, scanf deja directamente en las zonas de memoria correspondiente la información que haya leído y, naturalmente, la variable afectada verá modificado su contenido con el nuevo dato.

Es importante tener presente que si se especifican menos argumentos que especificadores de campo en el formato, los resultados pueden ser imprevisibles, pues la función cambiará el contenido de alguna zona de memoria totalmente aleatoria.
scanf( "%d", &num_articulos );
En el ejemplo anterior, scanf lee los caracteres que se tecleen para convertirlos (presumiblemente) a un entero. El valor que se obtenga se colocará en la dirección indicada en su argumento, es decir, en el de la variable num_articulos. Esta lectura de caracteres del buffer de memoria del teclado se detiene cuando el carácter leído no se corresponde con un posible carácter del formato especificado. Este carácter se devuelve al buffer para una posible lectura posterior. Para la entrada que se muestra en la figura siguiente, la función detiene la lectura después del espacio en blanco que separa los números tecleados. Éste y el resto de caracteres se quedan en el buffer para posteriores lecturas.

La función scanf devuelve el número de datos correctamente leídos. Es decir, todos aquellos para los que se ha encontrado algún texto compatible con una representación de su tipo.



Fuente: Libro Introducción al desarrollo del software

Estructura de un programa en C

Todo programa escrito en C, debiera poseer una estructura estándar, la cual es la siguiente:







/* Fichero: nombre.c*/
/* Contenido: ejemplo de estructura de un programa en C */
/* Autor: nombre del autor*/
/* Revisión: preliminar*/
/* COMANDOS DEL PREPROCESADOR*/
/* -inclusión de ficheros de cabeceras*/
#include <stdio.h>
/* -definición de constantes simbólicas*/
#define FALSO 0
/* FUNCIONES DEL PROGRAMADOR*/
main( ) /* Función principal:*/
{        /* El programa se empieza a ejecutar aquí*/
    ...  /* Cuerpo de la función principal*/
} /* main */
En esta organización, las primeras líneas del fichero son comentarios que identifican su contenido, autor y versión. Esto es importante, pues hay que tener presente que el código fuente que creemos debe ser fácilmente utilizable y modificable por otras personas y obviamente por nosotros mismos.



Fuente: Libro Introducción al desarrollo del software 

Compilar y ejecutar un programa C en Linux


Primero que nada, para lograr generar un programa escrito en C en linux, necesitaremos donde escribirlo, podemos escribirlo en un compilador como puede ser Netbeans, Anjuta, etc. Pero para seguir con lo tradicional de Linux, lo escribiremos en una herramienta del sistema, puede ser gedit si queremos algo gráfico, o si nos gusta la consola, puede ser vi, vim, emacs, nano, etc. como preferencia propia ocupo vim para realizar todo.

Luego de haber elegido donde escribiremos las líneas de código, pasaremos a crear el archivo y escribir las el código. En mi caso es:
$vim holamundo.c
Una vez dentro de este, procedemos a escribir el código
#include <stdio.h>
main(){
        printf("Hola Mundo \n");
}
con esto ya tenemos nuestro archivo con extensión “.c”, lo que debemos hacer con nuestro archivo es compilarlo, para compilarlo debemos:
$gcc -c holamundo.c
ahora se nos creo un archivo con extensión “.o”, también conocido como fichero objeto, este archivo contiene el lenguaje máquina (código fuente) de lo que nosotros creamos, producto que tenemos la función “prinf” que corresponde a la biblioteca de C, será necesario hacer un enlace (link)
$gcc holamundo.o -o holamundo
esta linea indicamos el compilador gcc, luego nuestro archivo objeto, le damos la opción -o, y finalmente el nombre que queremos que quede nuestro archivo, de no darle norma, se nos crea el archivo a.out.

Habitualmente, el proceso de compilación y enlazado se hacen directamente mediante:
$ gcc hola.c –o hola
Si el fichero fuente contuviese errores sintácticos, el compilador mostrará los mensajes de error correspondientes y deberemos corregirlos antes de repetir el procedimiento de compilación.

Si no obtuvimos ningún error, finalmente pasamos a ejecutar nuestro programa de la siguiente manera:
$./holamundo