Академический Документы
Профессиональный Документы
Культура Документы
C trabaja con tipos de datos que son directamente tratables por el hardware de la mayoría de computadoras
actuales, como son los caracteres, números y direcciones.
El lenguaje C se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y
compilados. Los interpretados son aquellos que necesitan del código fuente para funcionar (P.ej: Basic). Los
compilados convierten el código fuente en un fichero objeto y éste en un fichero ejecutable. Este es el caso
del lenguaje C.
Podemos decir que el lenguaje C es un lenguaje de nivel medio, ya que combina elementos de lenguaje de
alto nivel con la funcionalidad del lenguaje ensamblador.
Es un lenguaje estructurado, ya que permite crear procedimientos en bloques dentro de otros procedimientos.
Hay que destacar que el C es un lenguaje portable, ya que permite utilizar el mismo código en diferentes
equipos y sistemas informáticos: el lenguaje es independiente de la arquitectura de cualquier máquina en
particular.
Por último solo queda decir que el C es un lenguaje relativamente pequeño; se puede describir en poco
espacio y aprender rápidamente.
Este es sin duda el objetivo de éste curso. No pretende ser un completo manual de la programación, sino una
base útil para que cualquiera pueda introducirse en este apasionante mundo.
ESTRUCTURA DE UN PROGRAMA EN C.
Estructura.
Todo programa en C consta de una o más funciones, una de las cuales se llama main. El programa comienza
en la función main, desde la cual es posible llamar a otras funciones.
Cada función estará formada por la cabecera de la función, compuesta por el nombre de la misma y la lista de
argumentos (si los hubiese), la declaración de las variables a utilizar y la secuencia de sentencias a ejecutar.
Ejemplo:
Declaraciones de funciones
main( )
{
variables locales
bloque
}
funcion1( )
{
variables locales
bloque
}
Comentarios.
A la hora de programar es conveniente añadir comentarios (cuantos más mejor) para poder saber que función
tiene cada parte del código, en caso de que no lo utilicemos durante algún tiempo. Además facilitaremos el
trabajo a otros programadores que puedan utilizar nuestro archivo fuente.
Símbolos Especiales.
Hay un grupo de símbolos, que son tratados como caracteres individuales, que especifican algunos caracteres
especiales del código ASCII. Los más importantes son:
\a Alert
\b backspace
\f formfeed
\n newline
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\" double quote
\OOO visualiza un carácter cuyo código ASCII es OOO en octal.
\xHHH visualiza un carácter cuyo código ASCII es HHH en hexadecimal.
#include <stdio.h>
main()
{
printf("Hola amigos!\n");
}
Con el visualizamos el mensaje Hola amigos! en el terminal. En la primera línea indica que se tengan en
cuenta las funciones y tipos definidos en la librería stdio (standard input/output). Estas definiciones se
encuentran en el fichero header stdio.h. Ahora, en la función main se incluye una única sentencia que llama a
la función printf. Esta toma como argumento una cadena de caracteres, que se imprimen van encerradas entre
dobles comillas " ". El símbolo \n indica un cambio de línea.
/*Programa ejemplo que despliega el contenido de "ROL" en pantalla*/
#include <stdio.h>
#define ROL "9274002-1"
despliega_rol()
{
printf("Mi rol es : \%s\n", ROL);
}
void main()
{
despliega_rol();
}
/* Fin programa */
Los tipos de datos básicos definidos por C son caracteres, números enteros y números en coma flotante. Los
caracteres son representados por char, los enteros por short, int, long y los números en coma flotante
por float y double. Los tipos básicos disponibles y su tamaño son:
Las variables son definidas utilizando un identificador de tipo seguido del nombre de la variable. Veamos el
siguiente programa.
#include <stdio.h>
main()
{
float cels, farh;
farh = 35.0;
cels = 5.0 * ( farh - 32.0 ) / 9.0;
printf(">>> %f F son %f C\n", farh, cels );
}
En el programa anterior se definen dos variables float, se asigna un valor a la primera y se calcula la
segunda mediante una expresión aritmética. Las asignaciones en C también son una expresión, por lo que se
pueden utilizar como parte de otra expresión, pero según que prácticas de este tipo no son muy recomendables
ya que reducen la legibilidad del programa. En la instrucción printf, el símbolo %f indica que se imprime
un número en coma flotante.
Hay un tipo muy importante que se representa por void que puede significar dos cosas distintas, según su
utilización. Puede significar nada, o sea que si una función devuelve un valor de tipo void no devuelve
ningún resultado, o puede significar cualquier cosa, como puede ser un puntero a void es un puntero
genérico a cualquier tipo de dato. Más adelante veremos su utilización.
EXPRESIONES Y OPERADORES.
Los distintos operadores permiten formar expresiones tanto aritméticas como lógicas. Los operadores
aritméticos y lógicos son:
+, - suma, resta
++, -- incremento, decremento
*, /, % multiplicación, división, módulo
>>, << rotación de bits a la derecha, izquierda.
& AND booleano
| OR booleano
^ EXOR booleano
~ complemento a 1
! complemento a 2, NOT lógico
==, != igualdad, desigualdad
&&, || AND, OR lógico
<, <= menor, menor o igual
>, >= mayor, mayor o igual
En estos operadores deben tenerse en cuenta la precedencia de operadores y las reglas de asociatividad, que
son las normales en la mayoría de lenguajes. Se debe consultar el manual de referencia para obtener una
explicación de tallada. Además hay toda una serie de operadores aritméticos con asignación, como pueden ser
+= y ^=.
Por ello se deben evitar construcciones en las que se modifiquen valores de datos en la propia expresión, pues
su comportamiento puede depender de la implementación del compilador o de la optimización utilizada en
una compilación o en otra. Estos son errores que se pueden cometer fácilmente en C ya que una asignación es
también una expresión.
Debemos evitar:
if (( x++ > 3 ) || ( x < y ))
Hay un tipo especial de expresión en C que se denomina expresión condicional y está representada por los
operadores ? : . Su utilización es como sigue: <e> ? <x> : <y>. Se evalúa si e entonces x; si no, y.
waste_time ()
{
float a, b = 0.0;
( b > 0.0 ) ? sin(M_PI / 8) : cos(M_PI / 4);
}
Asignación.
A la variable i se le asigno el valor 7, y la expresión, como un todo, toma ese valor. Cuando la expresión va
seguida de un punto y coma, se convierte en una proposición.
Algunos ejemplos de proposiciones son: i = 7;
x = 3.1 + sin(22.2);
Se calcula el valor de la expresión que esta a la derecha del signo = y luego se asigna a la variable del lado
izquierdo. Por ejemplo
int a, b, c
a = 7;
b = 2;
c = a + b;
declara que las variables a, b y c son de tipo int, luego asigna el valor 7 a `a`, el valor 2 a `b`, y el valor de la
expresión a + b a `c`.
Notación compacta.
Operadores aritméticos.
Los operadores aritméticos + - * / % corresponden a las operaciones matemáticas normales de
suma, resta, multiplicación, división y modulo, respectivamente. La división de enteros devuelve el valor
entero que obtuvo y desecha cualquier fracción restante.
Por ejemplo, 1 / 2 tiene el valor 0, 3 / 2 tiene el valor 1, y -7 / 3 tiene el valor -2. La expresión a % b se lee "a
modulo b". Si a y b son enteros positivos, el resultado será el residuo de la división de a ente b. Por ejemplo, 7
% 2 tiene el valor 1, y 12 % 3 tiene el valor 0; si a, b o ambos son negativos, entonces a % b esta definido,
pero el resultado es dependiente de la maquina. El valor de b no puede ser cero, porque eso nos conduciría a
dividir por cero.
Operadores de incremento y decremento.
Como operador de incremento tenemos el ++ y de decremento es el --. Tanto ++ como - - pueden aplicarse a
variables, pero no a constantes o a expresiones.
y de manera similar
--k; es equivalente a k = k - 1;
k--; es equivalente a k = k - 1;
Las expresiones ++a y a++ provocan que a se incremente en 1. En forma similar, - -a y a- - causan que a
disminuya en 1. No obstante, al usar ++a en una expresión, el valor de a se aumenta antes de evaluar la
expresión, mientras que al emplear a++, la expresión se evalúa con el valor actual de a, incrementándolo
después. Lo mismo ocurre con - -a y a- -.
Considérese una expresión de relación como a < b. Intuitivamente, si el valor de a es menor que el de b, la
expresión es VERDADERA; y como en C lo VERDADERO se representa con cualquier valor distinto de 0,
es natural que a < b tenga el valor INT 1. Si el valor de a no es menor que el de b, entonces la expresión es
FALSA, y a < b tendrá el valor INT 0.
son similares A PRIMERA VISTA. Se parecen en la forma, pero son completamente distintas en cuanto a la
función. La expresión a = = b es una prueba de igualdad, mientras que a = b es una expresión de asignación.
Uno de los errores mas comunes en programación es codificar algo como.
if (i = 1)
. . . . /* hacer algo */
en lugar de
if (i == 1)
. . . . /* hacer algo */
La expresión de la primera proposición IF siempre es VERDADERA, y será muy difícil encontrar un error de
este tipo.
La función PRINTF() se usa para la salida; en forma similar, la función SCANF() se usa para la entrada. En
sentido técnico, estas funciones no son parte del lenguaje C, sino del sistema C; residen en una biblioteca
estándar y están disponibles para usarlas donde quiera que haya un sistema C. Ambas funciones tienen una
lista de parámetros con dos partes:
string_de_control y lista_de_argumentos
El formato %s hace que el argumento "ABC" se imprima en el formato de un string de caracteres. Esto mismo
puede realizarse también con la proposición
printf("%c%c%c", 'A', 'B', 'C');
Los apóstrofos que encierran cada letra se emplean para designar constantes de caracteres; de acuerdo con
esto, `A` es la constante de carácter que corresponde a la letra A mayúscula. El formato %c imprime el valor
de una expresión como un carácter. Por ejemplo:
c1 = 'A';
c2 = 'B';
c3 = 'C';
printf("%c%c%c", c1, c2, c3);
La función scanf() es análoga a la función printf(), pero se usa para la entrada. Su primer argumento es un
string de control con formatos que corresponden a las diferentes formas en que pueden interpretarse los
caracteres en la entrada como valores para los diferentes tipos de variables. La lista de argumentos esta
formada por DIRECCIONES de variables. El símbolo & representa al operador de dirección; por ejemplo, la
proposición
scanf("%d", &x);
contiene el formato %d, el cual provoca que scanf() interprete los caracteres de entrada como un entero
decimal y que coloque el valor en la dirección x. La función scanf() puede usarse para convertir cadenas de
dígitos decimales en valores enteros y almacenarlos en el lugar apropiado.
c caracter
d decimal
f número de punto flotante (float)
lf numero de punto flotante (double)
s cadena de caracteres (string)
Veamos un ejemplo.
#include <stdio.h> /* Estándar Input/Output */
main()
{
int x;
char c;
float y;
double z;
El sistema proporciona getchar() y putchar() para manejar los caracteres de entrada y salida.
Ejemplo:
#include <stdio.h> /* Estándar Input/Output */
main()
{
char c;
c = getchar();
putchar(c);
putchar(c);
}
Todo lo que hace este programa es recibir un caracter de entrada y devolverlo a la pantalla dos veces.
La variable c se declara de tipo char, uno de los fundamentales en C. Las variables de este tipo pueden tener
valor de caracteres.
FUNCIONES.
Un programa C está formado por un conjunto de funciones que al menos contiene la función main. Una
función se declara con el nombre de la función precedido del tipo de valor que retorna y una lista de
argumentos encerrados entre paréntesis. El cuerpo de la función está formado por un conjunto de
declaraciones y de sentencias comprendidas entre llaves. Veamos un ejemplo de utilización de funciones:
#include <stdio.h>
#define VALOR 5
#define FACT 120
{
int r = 1, i = 0;
while ( i <= v )
{
r = r * i;
i = i + 1;
}
return r;
}
{
if ( v == 0 )
return 1;
else
return v * fact_r(v-1);
}
main()
{
int r, valor = VALOR;
if ( (r = fact_i(valor)) != fact_r(valor) )
printf("Codificación errónea!!.\n");
else
if ( r == FACT )
printf("Codificación correcta.\n");
else
printf("Algo falla!!.\n");
}
Se definen dos funciones, fact_i y fact_r, además de la función main. Ambas toman como parámetro
un valor entero y devuelven otro entero. La primera calcula el factorial de un número de forma iterativa,
mientras que la segunda hace lo mismo de forma recursiva.
Todas las líneas que comienzan con el símbolo # indican una directiva del precompilador. Antes de realizar la
compilación en C se llama a un precompilador cuya misión es procesar el texto y realizar ciertas sustituciones
textuales. Hemos visto que la directiva #include incluye el texto contenido en un fichero en el fuente que
estamos compilando. De forma parecida, #define nombre texto sustituye todas las apariciones de nombre
por texto. Así, en el fuente, la palabra VALOR se sustituye por el número 5.
El valor que debe devolver una función se indica con la palabra return. La evaluación de la expresión debe
dar una valor del mismo tipo de dato que el que se ha definido como resultado. La declaración de una variable
puede incluir una inicialización en la misma declaración. Se debe tener muy en cuenta que en C todos los
argumentos son pasados 'por valor'. No existe el concepto de paso de parámetros 'por variable' o 'por
referencia'. Veamos un ejemplo:
main()
{
int a, b;
b = 3;
a = incr(b);
/* a = 4 mientras que
b = 3. No ha cambiado después de la llamada.*/
}
En el ejemplo anterior el valor del parámetro de la función incr, aunque se modifique dentro de la función,
no cambia el valor de la variable b de la función main. Todo el texto comprendido entre los caracteres /* y
*/ son comentarios al programa y son ignorados por el compilador. En un fuente C los comentarios no se
pueden anidar.