g e @ r t u

Física – Computación – Educación

Lenguaje C

Aprender a programar en C

  • Un exelente libro en formato PDF que nos permitira ir paso a paso igual que si estuvieramos en primero. APRENDA C COMO EN PRIMERO (descargar el archivo) escrito por parte de la Escuela Superior de Ingenieros Industriales de la Universidad de Navarra.
  • Otro buen trabajo es el de Rosseline Rodríguez, de la Universidad de Simón Bolivar, es el problemario de ejercicios en C para la materia de Computación (descargar el archivo).
  • Consejos de Estilo en C (descargar archivo).
  • Cosnejos de programación (descargar archivo).
  • ¿Qué compiladores usar? La página Compiladores habla sobre los compiladores que puedes usar en tu Sistema Operativo.

Para compilar software se necesitará:
• una computadora con un sistema operativo funcionando (Ver: Sistemas Operativos);
• conocimiento general del sistema operativo;
• algo de espacio en el disco duro;
• un compilador (generalmente para el lenguaje C) y un archivador (tar);
• algo de comer (en los casos difíciles, puede durar un tiempo largo), un verdadero hacker come pizza, no tornillos;
• algo de beber (por las mismas razones), un verdadero hacker bebe cola con gas – por la cafeína;
• el correo electrónico de su “gurú” tecnológico, ese que recompila el núcleo todas las semanas;
• pero por sobre todo, paciencia, ¡y mucha!.

Las cuatro fases de la compilación
Para comprender cómo funciona la compilación (y por lo tanto, poder resolver posibles problemas),
uno tiene que conocer sus cuatro fases. Su objetivo es convertir poco a poco un texto escrito en un lenguaje
comprensible por un ser humano entrenado (por ejemplo, el lenguaje C ), a un lenguaje comprensible por una máquina gcc ejecuta cuatro programas uno tras otro, cada uno de los cuales se encarga de una etapa:
1. la primera etapa consiste en reemplazar las directivas (pre-procesadores) por instrucciones C puras.
Típicamente, esto significa insertar un archivo de encabezado o header (#include), o definir una función
macro (#define) Al final de esta fase, se genera código C puro.
2. esta fase consiste en convertir el C en lenguaje ensamblador. El código generado depende de la
arquitectura de destino.
3. esta fase consiste en generar el código objeto (o código binario) a partir del lenguaje ensamblador. Al
final de esta fase, se generará un archivo con extensión .o.
4. la última fase (la “edición de vínculos”, en inglés linkage) ensambla (o vincula) todos los archivos
objeto (.o) y las bibliotecas asociadas, y produce un archivo ejecutable.
Estos ejemplos son programas en C para ser ejecutados en un sistema UNIX.

El primer programa: “Hola Mundo”
Primero debemos editar un archivo que llamaremos “hola_mundo.c

#include<stdio.h>
main( )
{
printf(“Hola Mundo!\n”);
}

Para compilarlo

$ gcc -o hola hola_mundo.c

Con esto se crea el archivo “hola” para poder ejecutarlo.
Para ejecutarlo:

$ ./hola

Obtenemos, entonces, una linea que nos dice: Hola Mundo!, y después volvemos a obtener nuestro prompt. Eso fue todo, nada espectacular pero es el primer paso.

El primer programa: “Hola Mundo” (segunda versión)
El programa “Hola Mundo” usando el comando “cat” como editor, desde una terminal.

Hola Mundo

Usando el comando "cat" como editor hacemos el programa: Hola Mundo

Después de dar “Enter” al reglón: cat > hola.c sólo hay que comenzar a escribir. Una vez que terminamos el programa, tecleamos: Ctrl-D, para salir al “promt.” Compilamos (gcc -o hola hola.c) y listo (./hola). Nota: ¿Qué es una “Terminal”?

/*
Titulo:Programa para calcular el área de un círculo
Descripción:Programa elemental que lee el radio de un círculo, calcula su área y escribe el resultado calculado.
Objetivo:La estructura de un programa fuente en C.
*/

#include<stdio.h> /*ACCESO A ARCHIVO DE BIBLIOTECA*/

main() /*CABECERA DE FUNCION*/
{
float radio, area; /*DECLARACION DE VARIABLES*/

printf(“Radio = ?”); /*INSTRUCCION DE SALIDA*/
scanf(“%f”, &radio); /*INSTRUCCION DE ENTRADA*/
area=3.14159*radio*radio;
/*INSTRUCCION DE ASIGNACION*/
printf(“Area = %f”, area);
/*INSTRUCION DE SALIDA*/
}

El programa se escribe en minúsculas.
Debe tener un formato de presentación.
#include hace refecencia a un archivo especial (stdio.h) que contiene información externa al programa que será necesaria a la hora de su compilación.
main es la cabecera de la función. Los paréntesis vacíos indican que ésta no incluye argumentos.
Las Declaraciones de Variables e Instrucciones de Expresión

float radio, area;
printf(“Radio = ?”);
scanf(“%f”, &radio);
area=3.14159*radio*radio;
printf(“Area = %f”, area);

… están encerradas por {}, que conforman la Instrucción Compuesta.
Las Declaraciones de Variables e Instrucciones de Expresión deben terminar con “;”
printf: genera una solicitud de información.
scanf: introduce información en la computadora.
La instrucción de asignación realiza una operación y reasigna valores.
Los espacios, las líneas en blanco y los sangrados sirven estéticamente pero no son esenciales para la compilación.

/* ARCHIVOS DE BIBLIOTECA */

/* CABECERA DE FUNCIoN */
/* DECLARACIoN DE ARGUMENTOS */
{
/* INTRUCCIONES DE EXPRESIoN; */
/* INSTRUCCIoN COMPUESTA while, for, if */
{

/* instrucciones de expresión */
}
} /* INSTRUCCIoN COMPUESTA */

Titulo: Programa para calcular el área de un círculo
Descripción:Este programa calcula el área de un círculo dado su radio, definiendo constantes y creando funciones
Objetivo:La declaración de CONSTANTES y la definición de una FUNCION

#include<stdio.h>

#define PI 3.14159
/*DECLARACION DE UNA CONSTANTE*/

float procesar(float radio);
/*prototipo de función*/

main()
{
float radio, area; /*declaración de variables*/

printf(“Radio = “);
scanf(“%f”, &radio);
area = procesar(radio);
printf(“Area = %f\n”, area);
}

float procesar(float r)
/**/
{
float a; /*DECLARACION DE UNA FUNCION*/

a=PI*r*r;
return(a);
}

Esta versión utiliza una función definida por el programador, la función “procesar”, que se ocupa de efectuar realmente los cálculos. Dentro de esta función, “r” es un argumento (o parámetro) que representa el calor del radio proporcionado desde “main”, y “a” es el resultado calculado que se devuelve a “main”.
Aparece una referencia a la función en “main”, dentro de la instrucción:
area = procesar(radio);
Una “declaración de función” precede a la función “main”, que indica que “procesar” acepta un argumento en coma flotante y devuelve también un valor en coma flotante.
Este programa también tiene una “constante simbólica”, PI, que representa el valor numérico 3.14159. Esta es una forma de representación que existe para conveniencia del programador. Cuando se compila el programa, la cosntante simbólica se reemplaza automáticamente por su valor numérico.

Titulo:Programa para calcular el área de un círculo con comprobación de error
Descripción:Este programa calcula el área de un círculo dado su radio y si éste es CERO dá un valor de 0

Objetivo:Se ve el uso de IF – ELSE (SÍ – SINO)

#include<stdio.h>

#define PI 3.14159

float procesar(float radio);
/*prototipo de finción*/

main()
{
float radio, area; /*declaración de variables*/

printf(“Radio = “);
scanf(“%f”, &radio);

if (radio < 0)
area = 0;
/*IF: ?*/
else
area = procesar(radio);
/*ELSE: ?*/
printf(“Area = %f\n”, area);
}

float procesar(float r) /*definición de función*/
{
float a; /*declaración de variable local*/

a = PI * r * r;
return(a);
}

Este programa calcula de nuevo el área de un círculo. Incluye la función “procesar” y la costante simbólica “PI”.
Se ha añadido una sencilla rutina de corrección de errores, que comprueba si el valor del radio es menor que cero. (Matemáticamente, un valor negativo del radio no tiene sentido.) La comprobación se lleva a cabo dentro de “main”, utilizando una instrucción “if-else”.


Titulo:Programa para calcular áreas de varios círculos usando un bucle FOR
Descripción:Este programa calcula las áreas de varios círculos mostrando el uso del buble FOR
Objetivo:Mostrar el uso del bucle for

#include<stdio.h>

#define PI 3.14159

float procesar(float radio); /*prototipo de función*/

main()
{
float radio, area; /*declaración de variables float*/
int cont, n; /*declaración de variables enteras*/
/*INT: ?*/

printf(“Nº de círculos? “);
scanf(“%d”, &n);

for (cont = 1; cont <= n; ++cont)
/*FOR: ?*/
{
printf(“\nCírculo nº %d: Radio = ? “, cont);
scanf(“%f”, &radio);

if (radio < 0)
area = procesar(radio);
else
area = procesar(radio);
printf(“Area = %f\n”, area);
}
}

float procesar(float r) /*definición de función*/
{
float a; /*declaración de variable local*/

a = PI * r * r;
return(a);
}

El número total de círculos es representado por la variable entera “n” que se debe introducir antes de que se realice cualquier cálculo.
Se utiliza la instrucción “for” para calcular iterativamente las áreas de los “n” círculos.
La variable “cont” se utiliza como un contador dentro del bucle “for” (dentro de la porción del programa que se repite). El valor de “cont” se incrementará en 1 en cada pasada por el bucle.
La expresión “++cont” que aparece en la instrucción “for” es equivalente a: cont = cont + 1

Titulo:Programa para calcular áreas de varios círculos, usando un bucle WHILE; no se especifíca el número de círculos
Descripción:Este programa calcula áreas de varios círculos usando el bucle while, sin definir el número de círculos
Objetivo:Ver el uso de un bucle while “infinito” ¿Cuáles son las diferencias con el bucle for?

#include<stdio.h>

#define PI 3.14159

float procesar(float radio);
/*prototipo de función*/

main()
{
float radio, area; /*declaración de variables*/

printf(“Para PARAR, introducir 0 en el valor del radio\n”);
printf(“\nRadio = “);
scanf(“%f”, &radio);

while (radio != 0)
/*WHILE: ?*/
/* for (cont = 1, radio != 0; ++cont) */
/*DIFERENCIAS?*/
{
if (radio < 0)
area = 0;
else
area = procesar(radio);

printf(“Area = %f\n”, area);

printf(“\nRadio = ? “);
scanf(“%f”, &radio);
}
}

float procesar(float r) /*definición de función*/
{
float a; /*definición de variable local*/

a = PI * r * r;
return(a);
}

Ahora se usa la instrucción “while” en vez de una “for” para llevar a cabo la ejecución repetida del programa.
La instrucción “while” seguirá ejecutándose mientras se le asigne a “radio” un valor que no sea cero.
La instrucción “while” continuará ejecutándose mientras la expresión contenida en los paréntesis se considere “verdadera”.


Titulo:Programa para calcular áreas de varios círculos, usando un bucle WHILE, los resultados se almacenan en el ARRAY; no se especifíca el número de círculos
Descripción:Este programa calcula áreas de varios círculos usando el bucle while almacenando los resultados en el ARRAY, sin definir el número de círculos
Objetivo:Ver el efecto que tiene almacenar resultados en el array

#include<stdio.h>

#define PI 3.14159

float procesar(float radio);
/*prototipo de función*/

main()
{
int n, i = 0; /*declaración de variables*/
float radio[100], area[100];
/*DECLARACION DE ARRAYS*/
/*ARRAY: ?*/
/* float radio, area; */
/*DIFERENCIAS ?*/

printf(“Para PARAR, introducir 0 en el valor del radio\n\n”);
printf(“Radio = “);
scanf(“%f”, &radio[i]);
/*DIREFENCIAS ?*/

while (radio[i])
/*DIREFENCIAS ?*/
{
if (radio[i] < 0)
area[i] = 0;
else
area[i] = procesar(radio[i]);

printf(“Radio = “);
scanf(“%f”, &radio[++i]);
}

n = –i; /*EL MAYOR VALOR DE i*/

/* PRESENTAR LOS ELEMENTOS DEL ARRAY */
printf(“\nRelación de resultados\n\n”);
for (i = 0; i <= n; ++i)
printf(“Radio = %f Area = %f\n”, radio[i], area[i]);
}

float procesar(float r) /*definición de función*/
{
float a; /*definición de variable local*/

a = PI * r * r;
return(a);
}

Algunos problemas requieren que se almacene en la computadora una serie de resultados ya calculados, quizá para ser utilizados en cálculos posteriores.
Los datos de entrada correspondientes se pueden también almancenar internamente junto con los resultados calculados.
Estos se puede llevar a cabo mediante el uso de “arrays”.
Este programa usa dos arrays, llamados “radio” y “area”, para almacenar el radio y el área de hasta 100 círculos.
Cada array se puede ver como una lista de números.
Cada uno de los números individuales dentro de cada lista es un “elemento de array”.
Los elementos de un array están numerados, empezando por 0.
Así el radio del primer círculo se almacenará dentro del elemento “radio[0]“, y así sucesivamente.
Las áreas correspondientes se almacenarán en “area[0]“, “area[1]“. etc.
Se introduce un número indetermindao de radios.
Se introduce cada valor del radio y se almacena el valor i-ésimo de “radio[i]“.
Se calcula entonces el área correspondiente y se almacena en “area[i]“.
Este proceso continuará hasta que se introduzcan todos los radios y al final se proporcione el valor 0 para el radio.
Se presenta finalmente el conjunto entero de valores almacenados (elementos del array cuyos valores no son cero).
“++i” aparece dos veces en el programa, cada una de estas expresiones hace que se incremente en 1 el valor de “i” (son equivalente a ” i = i + 1 “).
Este programa no hace uso de los valores almacenados en los arrays.
Su único propósito es mostrar los mecanismos que utilizan los arrays.
En un ejemplo más complicado, podríamos querer determinar el valor medio de las áreas, y entonces comparar cada área individualmente con la media. Para hacer esto tendríamos que recurrir a cada uno de los valores de las áreas (array[i]).

Titulo:Programa para calcular áreas de varios círculos, usando un bucle WHILE; los resultados se almacenan en el ARRAY; no se especifíca el número de círculos; se introduce una cadena de caracteres para cada conjunto de datos.
Descripción:Este programa calcula áreas de varios círculos usando el bucle while almacenando los resultados en el ARRAY, sin definir el número de círculos.
Objetivo:Ver el uso de una cadena de caracteres para cada conjunto de datos

#include<stdio.h>

#define PI 3.14159

float procesar(float radio);
/*prototipo de función*/

main()
{
int n, i = 0; /*declaración de variables*/

struct
/*STRUCT: ?*/
{
char texto[20];
/*CHAR: ?*/
float radio;
float area;
} circulo[10]; /*DECLARACION DE VARIABLES TIPO ESTRUCTURA*/

printf(“Para PARAR, introducir FIN en el identificador\n”);
printf(“\nIdentificador: “);
scanf(“%s”, circulo[i].texto);
while (circulo[i].texto[0] !=’F’ || circulo[i].texto[1] != ‘I’ || circulo[i].texto[2] != ‘N’)
{
printf(“Radio = “);
scanf(“%f”, &circulo[i].radio);
if (circulo[i].radio < 0)
circulo[i].area = 0;
else
circulo[i].area = procesar(circulo[i].radio);

++i;
printf(“\nIdentificador: “);
/*siguiente conjunto de datos*/
scanf(“%s”, circulo[i].texto);
}

n = –i; /* El mayor valor de i*/

/*presentar los elementos del array*/
printf(“\n\nRelación de resultados\n\n”);
for (i = 0; i <= n; ++i)
printf(“%s Radio = %f Area = %f\n”, circulo [i].texto, circulo[i].radio, circulo[i].area);

}

float procesar(float r) /*definición de función*/
{
float a; /*definición de variable local*/

a = PI * r * r;
return(a);
}

Se introduce un “texto descriptor”, seguido del valor del radio, para cada círculo.
Los caracteres del descriptor se almacenan en el array “texto”.
Estos caracteres son en conjunto una “constante de cadena de caracteres”.
En este programa el tamaño máximo de cada constante de cadena de caracteres es 20.
El descriptor, el radio y el área correspondiente de cada círculo se define como componentes de una “entrada!”.
Definimos “circulo” como un array de estructuras. Es decir, cada elemento “circulo” será una estructura que contiene un descriptor, un radio y un área.
Cuando se ejecuta el programa, se introduce un descriptor para cada círuclo, seguido del valor del radio. Esta información en “circulo[i].texto” y “circulo[i].radio”. Se calcula el área correspondiente y se almancena en “circulo[i].area”. Este proceso continúa hasta que se introduce el descriptor “FIN”. Entonces se presenta toda la información almacenada en los elementos del array (descriptor, radio y área de cada círculo) y termina la ejecución.
Cuando se ejecuta el programa, se genera un diálogo interactivo.


Titulo:Programa para calcular áreas de varios círculos, usando archivos
Descripción:Este programa calcula áreas de varios círculos usando los arrays. Leyendo y escribiendo en archivos
Objetivo:Usar Archivos para leer y escribir los datos que necesita y crea el programa de cálculo de áreas

#include<stdio.h>

#define PI 3.14159

float procesar(float radio);
/*prototipo de función*/

main()
{
int n, i = 0; /*declaración de variables*/

struct
/*STRUCT: ?*/
{
char texto[20];
/*CHAR: ?*/
float radio;
float area;
} circulo[10]; /*DECLARACION DE VARIABLES TIPO ESTRUCTURA*/

FILE *datos, *areas;

datos = fopen(“datos.dat”, “r”);
areas = fopen(“areas.dat”,”w”);

fscanf(datos, “%s\t”, circulo[i].texto);

while (circulo[i].texto[0] !=’F’ || circulo[i].texto[1] != ‘I’ || circulo[i].texto[2] != ‘N’)
{
fscanf(datos, “%f\n”, &circulo[i].radio);
if (circulo[i].radio < 0)
circulo[i].area = 0;
else
circulo[i].area = procesar(circulo[i].radio);

fprintf(areas,”\nIdentificador: %s Radio: %f Area: %f\n”,circulo [i].texto, circulo[i].radio, circulo[i].area);

++i;
/*siguiente conjunto de datos*/
fscanf(datos, “%s\t”, circulo[i].texto);
}

n = –i; /* El mayor valor de i*/

/*presentar los elementos del array*/
printf(“\n\nRelación de resultados\n\n”);
for (i = 0; i <= n; ++i)
printf(“%s Radio = %f Area = %f\n”, circulo [i].texto, circulo[i].radio, circulo[i].area);

fclose(datos);
fclose(areas);

}

float procesar(float r) /*definición de función*/
{
float a; /*definición de variable local*/

a = PI * r * r;
return(a);
}

/* hooke.c */

#include <stdio.h>main ()
{/* DECLARACION DE VARIABLES */
static float F[100],k,x[100];
int i;

/* INICIALIZAR VARIABLES */
printf (”k = “);
scanf (”%f”,&k);
printf (”x[0] = “);
scanf (”%f”,&x[0]);

/* ABRIR ARCHIVO */
FILE *Resultados; /*Abrir archivo*/
Resultados = fopen (”archivo.dat”,”a”);

/* USO DEL FOR */
for ( i = 1 ; i<=32 ; i++)
{

/* USO DEL IF */
if (x+i!=0)
{
x[i]=x[i-1]+1;
F[i]=-k*(x[i]);
}

/* USO DEL ELSE */
else
F[i]=0;

/* MANDAR RESULTADOS A PANTALLA Y AL ARCHIVO */
printf (”i=%d \t x[%d]=%g \tF[%d] = %g Newtons\n”,i,i,x[i],i,F[i]);
fprintf(Resultados,”i=%d \t x=%g \t F=%g N\n”,i,x,F);}

/* COMPROBAR SI FUNCIONAN LOS ARRAY */
printf(”F[3] = %g \n”, F[3]);

/* CERRAR ARCHIVO */
fclose(Resultados);

} /* FIN DEL MAIN */

¿Vim o Emacs?

Soy Programador!!!

Programador Humor

Enlaces Interesantes:

Tutoriales C: Curso de programación en C, Ejemplos de C (chuidiang), El rincón del C, Guía de programación en C y UNIX, Manual de C (Hector Tejeda), Programación C (Manitas de WEB), Programar juegos c/c++. En WikiLibros podemos encontrar un buen inicio para la Programación en C.

Los Tutoriales de Mac Programadores

Mac Programadores

9 comentarios to “Lenguaje C”

  1. Carlos V. said

    Para compilar, solamente se puede usar la orden de gcc -o, es que he estado programando (en ubuntu) y esa orden no me la reconoce, ¿Qué estoy haciendo mal?

  2. geartu said

    Muchas veces no viene instalado el compilador gcc en linux. Así que hay que ver si lo tenemos dentro de las opciones de instalación.
    Si no tenemos el compilador de c/c++ (gcc) tenemos que descargarlo e instalarlo, para esto sólo tenemos que escribir en una terminal lo siguiente:
    $ sudo apt-get install build-essential
    Con esto instalará algunas cosas necesarias para desarrolladores (entre estas cosas tenemos el compilador de gcc).

  3. daniela said

    este blog es la NETA!!!

  4. Yhanks you said

    Yhanks you6ecf368fa208a102643010c12efb4554

  5. yaher carrillo said

    Buenas quisiera saber como hago para mostrar la informacion ya sea carpetas como archivos que contenga el disco duro desde un programa hecho en lenguaje C………es decir algo que simule a la accion que se realiza desde el ejecutar de un ordenador y colocamos Dir C:\ y esto a su vez muestra toda la informacion del disco ……quien me podria ayudar por favor

  6. [...] Lenguaje C [...]

  7. [...] Lenguaje C [...]

  8. [...] Lenguaje C [...]

  9. [...] Lenguaje C [...]

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

%d personas les gusta esto: