Documente Academic
Documente Profesional
Documente Cultură
El lenguaje C
___________________________________________________________________
El lenguaje C es uno de los más rápidos y potentes que hay hoy en dia. Algunos
dicen que está desfasado y que el futuro es Java. No se si tendrá futuro pero está
claro que presente si tiene. No hay más que decir que el sistema operativo Linux
está desarrollado en C en su práctica totalidad. Así que creo que no sólo no
perdemos nada aprendiéndolo sino que ganamos mucho. Para empezar nos servirá
como base para aprender C++ e introducirnos en el mundo de la programación
Windows. Si optamos por Linux existe una biblioteca llamada gtk (o librería, como
prefieras) que permite desarrollar aplicaciones estilo windows con C.
No debemos confundir C con C++, que no son lo mismo. Se podría decir que C++
es una extensión de C. Para empezar en C++ conviene tener una sólida base de C.
Existen otros lenguajes como Visual Basic que son muy sencillos de aprender y de
utilizar. Nos dan casi todo hecho. Pero cuando queremos hacer algo complicado o
que sea rápido debemos recurrir a otros lenguajes (c++, delphi,...).
Una de las cosas importantes de C que debes recordar es que es Case Sensitive
(sensible a las mayúsculas o algo así). Es decir que para C no es lo mismo escribir
Printf que printf.
Esto genera un proyecto llamado “curso.ide”. Los componentes principales del IDE
son un escritorio con una barra de menú sobre la línea superior, iconos de
herramientas (también conocidos como barra rápida) sobre la siguiente línea, y una
línea de estado en la parte inferior del escritorio. El área primaria es el espacio de
trabajo de Borland que sirve como un telón para varias ventanas. Hay varios tipos
diferentes de ventanas. Entre estos tipos de ventanas están las ventanas de edición
para crear el código C, ventanas de inspección para mirar dentro de un objeto, una
ventana de proyecto para manejar múltiples archivos que pertenecen a un proyecto
(parte superior derecha), y una ventana de mensaje para reportar errores (parte
inferior, al compilar).
En nuestro caso, el compilador lleva consigo un editor integrado (hoy en día esto es
lo normal con cualquier software que compile algún lenguaje de programación), y
aunque se puede utilizar cualquier editor de texto, es muy conveniente utilizar el
del IDE.
Cuando se guarda un archivo fuente se le debe dar un nombre (recuerden el
archivo fuente de nuestro primer proyecto, “curso.cpp”). Como regla general, el
nombre debe describir lo que hace el programa, aunque se puede agregar una
descripción más detallada como comentarios al interior del archivo. La extensión
por defecto de los programas en C es *.C, en nuestro caso utilizamos *.CPP debido
al IDE que utilizamos, recuerde que esta diseñado para C++.
Compilación
Parte del lenguaje C es una biblioteca de funciones que contiene el código objeto
para funciones predefinidas. Una función predefinida contiene código C que ya ha
sido escrito, y se proporciona en una forma lista para usarse con el paquete del
compilador. Este proceso es llamado enlazado y es ejecutado por el enlazador.
Finalización
Una vez compilado y enlazado el programa, se puede ejecutar como cualquier otra
aplicación. Si se reciben resultados diferentes a lo esperado, hay que regresar al
primer paso, identificando el problema y corrigiéndolo. Cuando se hace un cambio
al código fuente, se debe volver a compilar y enlazar el programa.
#include <stdio.h>
int main() {
printf("Hola mundo\n");
return 0;
}
Nota: Hay mucha gente que programa en Windows que se queja de que cuando
ejecuta el programa no puede ver el resultado. Para evitarlo se puede añadir
antes de return 0; la siguiente línea:
system("PAUSE");
¿Qué fácil eh? Este programa lo único que hace es sacar por pantalla el mensaje:
Hola mundo
Vamos ahora a comentar el programa línea por línea (Esto no va a ser más que
una primera aproximación).
#include <stdio.h>
#include es lo que se llama una directiva. Sirve para indicar al compilador que
incluya otro archivo. Cuando en compilador se encuentra con esta directiva la
sustituye por el archivo indicado. En este caso es el archivo stdio.h que es donde
está definida la función printf, que veremos luego.
int main()
Es la función principal del programa. Todos los programas de C deben tener una
función llamada main. Es la que primero se ejecuta. El int (viene de
Integer=Entero) que tiene al principio significa que cuando la función main acabe
devolverá un número entero. Este valor se suele usar para saber cómo ha
terminado el prorama. Normalmente este valor será 0 si todo ha ido bien, o un
valor distinto si se ha producido algún error (pero esto lo decidimos nosotros, ya
lo veremos). De esta forma si nuestro programa se ejecuta desde otro el
programa 'padre' sabe como ha finalizado, si ha habido errores o no.
Se puede usar la definición 'void main()', que no necesita devolver ningún valor,
pero se recomienda la forma con 'int' que es más correcta. A lo largo de este
curso verás muchos ejemplos que uso 'void main' y falta el return 0; del final, el
código funciona correctamente pero puede dar un 'warning' al compilar. En estos
momentos estoy intentando corregir esto, pido perdón por las molestias.
Son las llaves que indican el comienzo de una función, en este caso la función
main.
/* Este es un comentario
que ocupa dos filas */
es perfectamente válido.
Aquí es donde por fin el programa hace algo que podemos ver al ejecutarlo. La
función printf muestra un mensaje por la pantalla. Al final del mensaje "Hola
mundo" aparece el símbolo '\n'; este hace que después de imprimir el mensaje se
pase a la línea siguiente.
Fíjate en el ";" del final. Es la forma que se usa en C para separar una instrucción
de otra. Se pueden poner varias en la misma línea siempre que se separen por el
punto y coma.
return 0;
...y cerramos llaves con lo que termina el programa. Todos los programas
finalizan cuando se llega al final de la función main.
Ejercicios
Ejercicio 1.
int main()
{
/* Aquí va el cuerpo del programa */
Printf( "Hola mundo\n" );
return 0;
}
Tipos de Datos
El tipo Int
int numero;
Esto hace que declaremos una variable llamada numero que va a contener un
número entero.
Tenemos dos posibilidades, una es declararla como global y otra como local. Por
ahora vamos a decir que global es aquella variable que se declara fuera de la
funcón main y local la que se declara dentro:
int x, y;
Vamos a ir u poco más allá con la función printf. Supongamos que queremos
mostrar el contenido de la variable x por pantalla:
printf( "%i", x );
int x = 15;
int x, y = 20;
Podríamos pensar que x e y son igual a 20, pero no es así. La variable x está sin
valor inicial y la variable 'y' tiene el valor 20.
#include <stdio.h>
int main()
{
int x = 10;
El valor inicial de x es 10
Ahora el valor es 50
El tipo Char
Las variables de tipo char sirven para almacenar caracteres. Los caracteres se
almacenan en realidad como números del 0 al 255. Los 128 primeros (0 a 127)
son el ASCII estándar. El resto es el ASCII extendido y depende del idioma y del
ordenador.
char letra;
En una variable char sólo podemos almacenar solo una letra, no podemos
almacenar ni frases ni palabras. Eso lo veremos más adelante (strings, cadenas).
Para almacenar un dato en una variable char tenemos dos posibilidades:
letra = 'A';
o
letra = 65;
letra = 'A';
printf( "La letra es: %c.", letra );
resultado:
La letra es A.
letra = 'A';
printf( "El número ASCII de la letra %c es: %i.", letra,
letra );
resultado:
Como vemos la única diferencia para obtener uno u otro es el modificador (%c ó
%i) que usemos.
El modificador Unsigned
Este modificador (que significa sin signo) modifica el rango de valores que puede
contener una variable. Sólo admite valores positivos. Si hacemos:
Esta variable en vez de tener un rango de -128 a 128 pasa a tener un rango de 0
a 255.
El tipo Float
float numero;
float num=4060.80;
printf( "El valor de num es : %f", num );
Resultado:
El tipo Double
double numero;
Ejercicios
#include <stdio.h>
int main()
{
int número;
número = 2;
return 0;
}
#include <stdio.h>
int main()
{
int numero;
numero = 2;
return 0;
}
Lo primero que tenemos que conocer es el tamaño en bytes de ese tipo de dato.
Vamos a ver un ejemplo con el tipo INT. Hagamos el siguiente programa:
#include <stdio.h>
int main()
{
int num1;
el resultado es:
Como sabemos 1byte = 8bits. Por lo tanto el tipo int ocupa 4*8=32 bits.
Sin embargo esto sólo es cierto si usamos un tipo unsigned (sin signo, se hace
añadiendo la palabra unsigned antes de int). Para los tipos normales tenemos que
almacenar números positivos y negativos. Así que de los 4.294.967.296 posibles
números la mitad serán positivos y la mitad negativos. Por lo tanto tenemos que
dividir el número anterior entre 2 = 2.147.483.648. Como el 0 se considera
positivo el rango de números posibles que se pueden almacenar en un int sería:
-2.147.483.648 a 2.147.483.647.
Resumen:
OPERADORES
___________________________________________________________________
1. INTRODUCCION
estamos diciéndole al programa, por medio del operador +, que compute la suma
del valor de dos variables , y una vez realizado ésto asigne el resultado a otra
variable var1. Esta última operación (asignación) se indica mediante otro
operador, el signo =.
El lenguaje C tiene una amplia variedad de operadores, y todos ellos caen dentro
de 6 categorias , a saber : aritméticos , relacionales, lógicos, incremento y
decremento, manejo de bits y asignacion. Todos ellos se irán describiendo en los
párrafos subsiguientes.
2. OPERADORES ARITMETICOS
El operador módulo ( % ) se utiliza para calcular el resto del cociente entre dos
ENTEROS , y NO puede ser aplicado a variables del tipo float ó double .
Si bien la precedencia (orden en el que son ejecutados los operadores) se
analizará más adelante, en este capítulo, podemos adelantar algo sobre el orden
que se realizan las operaciones aritméticas.
En la TABLA 4, última columna, se da el orden de evaluación de un operador
dado. Cuanto más bajo sea dicho número mayor será su prioridad de ejecución. Si
en una operación existen varios operadores, primero se evaluarán los de
multiplicación , división y módulo y luego los de suma y resta . La precedencia de
los tres primeros es la misma , por lo que si hay varios de ellos, se comenzará a
evaluar a aquel que quede más a la izquierda . Lo mismo ocurre con la suma y la
resta .
Para evitar errores en los cálculos se pueden usar paréntesis , sin limitación de
anidamiento, los que fuerzan a realizar primero las operaciones incluidas en ellos .
Los paréntesis no disminuyen la velocidad a la que se ejecuta el programa sino
que tan sólo obligan al compilador a realizar las operaciones en un orden dado
dado, por lo que es una buena costumbre utilizarlos ampliamente .
Los paréntesis tienen un orden de precedencia 0, es decir que antes que nada se
evalúa lo que ellos encierran .
Se puede observar que no existen operadores de potenciación, radicación,
logaritmación, etc, ya que en el lenguaje C todas estas operaciones ( y muchas
otras ) se realizan por medio de llamadas a Funciones.
El último de los operadores aritméticos es el de SIGNO . No debe confundirselo
con el de resta, ya que este es un operador unitario que opera sobre una única
variable cambiando el signo de su contenido númerico. Obviamente no existe el
operador + unitario, ya que su operación sería DEJAR el signo de la variable, lo
que se consigue simplemente por omisión del signo.
3. OPERADORES RELACIONALES
Todas las operaciones relacionales dan sólo dos posibles resultados : VERDADERO
ó FALSO . En el lenguaje C, Falso queda representado por un valor entero nulo
(cero) y Verdadero por cualquier número distinto de cero En la TABLA 5 se
encuentra la descripción de los mismos .
Uno de los errores más comunes es confundir el operador relacional IGUAL QUE
(= =) con el de asignacion IGUAL A (=). La expresión a=b copia el valor de b en
a, mientras que a = = b retorna un cero , si a es distinto de b ó un número
distinto de cero si son iguales.
Los operadores relacionales tiene menor precedencia que los aritméticos , de
forma que a < b + c se interpreta como a < ( b + c ), pero aunque sea superfluo
recomendamos el uso de paréntesis a fin de aumentar la legilibilidad del texto.
Cuando se comparan dos variables tipo char el resultado de la operación
dependerá de la comparación de los valores ASCII de los caracteres contenidos en
ellas. Asi el caracter a ( ASCII 97 ) será mayor que el A (ASCII 65 ) ó que el 9
(ASCII 57).
4. OPERADORES LOGICOS
Hay tres operadores que realizan las conectividades lógicas Y (AND) , O (OR) y
NEGACION (NOT) y están descriptos en la TABLA 6 .
a = a + 1 ;
a++ ;
a = a - 1 ;
a-- ;
será 'B' .
Si bien las sentencias
i++ ;
++i ;
int i = 1 , j , k ;
j = i++ ;
k = ++i ;
6. OPERADORES DE ASIGNACION
En principio puede resultar algo futil gastar papel en describir al operador IGUAL A
( = ) , sin embargo es necesario remarcar ciertas características del mismo .
Anteriormente definimos a una asignación como la copia del resultado de una
expresión ( rvalue ) sobre otra ( lvalue ) , esto implica que dicho lvalue debe
tener LUGAR (es decir poseer una posición de memoria ) para alojar dicho valor .
Es por lo tanto válido escribir
a = 17 ;
17 = a ; /* incorrecto */
c = ( a = b ) ;
c = a = b = 17 ;
a = a + 17 ;
a = (a) OP (b) ;
a OP= b ;
Por ejemplo
a += b ; /* equivale : a = a + b */
a -= b ; /* equivale : a = a - b */
a *= b ; /* equivale : a = a * b */
a /= b ; /* equivale : a = a / b */
a %= b ; /* equivale : a = a % b */
Nótese que el pseudooperador debe escribirse con los dos símbolos seguidos , por
ejemplo += , y no será aceptado +(espacio) = .
Los operadores de asignación estan resumidos en la TABLA 8 .
c = ( a < b ) ? a : b ;
Precedencia
( ) [ ] -> .
! ~ ++ -- (molde) * & sizeof (El * es el de puntero)
* / % (El * de aquí es el de multiplicación)
+-
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /=
,
10 * 2 + 5
10 * ( 2 + 5 )
10 * ( 5 * 2 +3 )
Otro detalle que debemos cuidar son los operadores ++ y --. Estos tienen mayor
precedencia que las demás operaciones aritméticas (+, -, *, /, %). Por ejemplo:
10 * 5 ++
#include <stdio.h>
int main()
{
int a, b;
a = 5;
b = a++;
printf( "a = %i, b = %i\n", a, b );
}
#include <stdio.h>
int main()
{
int a, b;
a = 5;
a++;
b = a;
printf( "a = %i, b = %i\n", a, b );
}
Ejercicios
#include <stdio.h>
int main()
{
int a, c;
a = 5;
c += a +5;
}
#include <conio.h>
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
b = ++a;
c = ( a + 5 * 2 ) * ( b + 6 / 2 ) + ( a * 2 );
printf( "%i, %i, %i", a, b, c );
}
Ejercicio 4:
a. ¿Qué efecto tienen los espacios y las líneas en blanco sobre la ejecución de un
programa?
b. ¿Los números negativos son considerados verdaderos o falsos?
c. ¿Qué es una expresión?
d. ¿Cuál es el resultado de la expresión 10 % 3?
e. ¿Cuál es el resultado de la expresión 5 + 3 * 8 / 2?
f. ¿Cuál es el resultado de las siguientes expresiones?
(1 + 2 * 3)
10 % 3 * 3 – (1 + 2)
((1 + 2) * 3)
(5 == 5)
(x = 5)