Sunteți pe pagina 1din 9

Copyright

Copyright © 2007 A. G. Stankevicius

Se asegura la libertad para copiar, distribuir y


El Lenguaje de modificar este documento de acuerdo a los

Programación C términos de la GNU Free Documentation License,


Versión 1.2 o cualquiera posterior publicada por la
Free Software Foundation, sin secciones invariantes
Organización de Computadoras
ni textos de cubierta delantera o trasera.
Ingeniería en Sistemas de Computación
Una copia de esta licencia está siempre disponible
en la página http://www.gnu.org/copyleft/fdl.html.

La versión transparente de este documento puede


ser obtenida de la siguiente dirección:

http://cs.uns.edu.ar/~ags/teaching

Contenidos Origen del lenguaje

Breve repaso histórico. El lenguaje C fue diseñado por

Características del lenguaje. Dennis Ritchie alrededor del


año 1972.
Estructura de un programa simple.
Deriva de un lenguaje de
Tipos básicos disponibles.
programación llamado B.
Sentencias de control.
Fue usado para implementar gran
Definición de funciones.
parte del sistema operativo UNIX.
Entrada/salida estándar.
Hoy en día se lo sigue utilizando para
implementar todo tipo de sistemas:
Por caso, el sistema GNU/Linux.

Filosofía de diseño Características

C es un lenguaje de programación Cuenta con excelentes compiladores


minimalista. optimizantes.

Figuran entre sus objetivos: No hay procedimientos, sólo funciones.


Poder ser compilado usando un No cuenta con el concepto de
compilador sencillo y simple.
anidamiento de funciones.
Brindar acceso de bajo nivel al hardware
El código escrito en este lenguaje es
de la computadora.
altamente portable.
Poder traducir cada instrucción de C en
Ninguna característica del sistema
pocas instrucciones en lenguaje máquina.
operativo se ve reflejada en el lenguaje.
No requerir mucha ayuda adicional en
tiempo de ejecución.
Características Características

Todas las sentencias terminan con un Elementos de un programa:


con un punto y coma. Palabras reservadas (muy pocas).

Difiere un poco de Pascal, donde el punto Variables y funciones definidas por el


y coma en vez separa las sentencias. programador.

Los espacios en blanco y los Funciones de librería estándar.

tabuladores son ignorados. Los bloques de código se delimitan


Podemos (¡debemos!) indentar entre llaves (¡no más begin-end!).
adecuadamente nuestro código.
Al igual que UNIX, C es sensible a la
Solo permite el pasaje de parámetros mayusculización (por caso,fact() y
por valor. Fact() son dos funciones diferentes).

Compiladores vs.
Nuestro primer programa
intérpretes

El clásico hola mundo, en esta El lenguaje C es un lenguaje


oportunidad codificado en C: compilado.

Por caso, Pascal o Modula2.

#include <stdio.h> Otros lenguajes de programación son


interpretados.
int main() { Por caso, Prolog o Haskell.

printf(“Hola mundo!!\n”); Por último, también existen lenguajes


return(0); compilados e intépretados a la vez:
} Por caso, Java.

Lenguaje compilado vs.


Comentarios
lenguaje interpretado

Lenguajes Interpretados: Los comentarios pueden ocupar una o

Las instrucciones se transforman en varias líneas:


lenguaje máquina según va siendo
ejecutado el programa. int main() { // Comentario de una línea.
Los pequeños cambios pueden probarse /* Esto es un comentario
rápidamente.
de varias líneas.*/
Lenguajes Compilados: return(0);
Los programas son traducidos a lenguaje // Otro comentario de una línea.
máquina antes de ser ejecutados.
}
Para probar un pequeño cambio se debe
compilar todo nuevamente.
Finalización de un Tipo elementales de
programa variables

Un programa finaliza: Los tipos elementales de variables

Al llegar al final de la función main(). son:

Cuando la función main() invoca un Enteros (int).


return(). Reales en precisión simple (float).
Si se ejecuta la función exit() (presente en Reales en precisión dobre (double).
la librería stdlib).
Caracteres ( char).
#include <stdlib.h>
*
Punteros ( ).
int main() {
exit(0); Notar que no existen los booleanos ni

return(1); // Esto no se ejecutará las cadenas de caracteres como tipos


} elementales.

Modificadores de los
Declaración de variables
tipos básicos

Ciertos tipos básicos admiten diversos Declaración simple:


modificadores: char letra;
unsigned: para representar sólo valores unsigned int contador;
positivos (sin signo).
Declaración múltiple:
Ej:unsigned int contador;
char letra, inicial;
signed: para representar valores positivos
y negativos (este es el modificador activo
unsigned int i,j,k;
por defecto). Declaración e inicialización:
Ej:signed char letra; char letra = ’A’;
long: para representar enteros largos unsigned int i = 1, j = 10;
(sólo puede aplicarse al tipo int).

Alcance de una Alcance de una


declaración declaración

Al no existir el anidamiento de int x,y;


funciones, sólo hay dos alcances int main() {
posibles para una declaración: float x,z;
Alcance global: La declaración es visible /* Aquí y sigue siendo entero,
desde todas las funciones del programa. pero x y z ahora son reales */
Alcance local: La declaración sólo es }
visible dentro de la función en la que
aparece y tiene prioridad sobre las
declaraciones globales.
/* x e y vuelven a ser enteras, y
además z no existe fuera de la
función main() */
Expresiones constantes Expresiones constantes

Una constante real se puede expresar Las constantes de tipo caracter


tanto en notación decimal ( 2.56) como especiales se definen usando
en notación científica (2.45E-4). secuencias de escape:

Una constante de tipo long se puede ‘\n’: Línea nueva.


definir agregando una L al final (200L). ‘\r’: Retorno de carro.
Una constante de tipo caracter se ‘\t’: Tabulador.
puede definir directamente usando ‘\\’: Barra invertida.
comillas simples ( ‘a’). ‘\0’: Caracter nulo.
‘\nnn’: Caracter ASCII nnn (en octal).
‘\xnn’: Caracter ASCII nn (en hexa).

Conversión explícita de Operadores aritméticos


tipos (casting) básicos disponibles

La conversión explícita entre los tipos C usa como operador de asignación al


de las expresiones y las variables se signo igual ( ). =
denota de la siguiente forma: Los operadores aritméticos básicos
disponibles son:
int a; float b; char c; +
Suma ( )
b = 65.0; /* probar qué pasa si acá -
Resta ( )
ponemos directamente 65 */ Multiplicación ( ) *
a = (int) b; // a ahora vale 65 División ( )/
c = (char) a; /* c ahora vale ‘A’ Módulo o resto ( ) %
(esto es, el ASCII 65) */

División entera vs.


Pre y post incrementos
división real

El resultado de la división depende de Los operadores unarios (++) y (--)


los operandos involucrados. representan las operaciones de

Por ejemplo: incremento y decremento


respectivamente.

4 / 3 da 1 (entero)
x++ equivale a la asignación x = x + 1
4.0 / 3 da 1.333 (real)
y-- equivale a la asignación y = y - 1
4 / 3.0 da 1.333 (real) Por caso:

4.0 / 3.0 da 1.333 (real) a=3; b=a++; // a vale 4, b vale 3


a=3; b=++a; // a vale 4, b vale 4
a=3; --b=a++; // ¿cuánto valen a y b?
Variantes del operador
Operadores relacionales
de asignación

Existen diversas variantes del Los operadores relacionales a nuestra


operador de asignación: disposición son:

x += y es equivalente a x = x + y ==)
Igual (

x -= y es equivalente a x = x - y !=)
Distinto (

x *= y es equivalente a x = x * y Mayor (>) y mayor o igual (>=).

x /= y es equivalente a x = x / y Menor (<) y menor o igual (<=).

En el lado izquierdo de una asignación El resultado de una comparación es un


debe ser del tipo adecuado. entero, donde:

De no ser así, se puede apelar a la El cero denota falso.


conversión explícita entre tipos. Cualquier otro valor denota verdadero.

Expresiones en
Operadores lógicos
corto-circuito

Sobre los datos de tipo booleano (es El lenguaje C implementa un modelo


decir, los enteros), se definen los de evaluación de expresiones
siguientes operadores lógicos: booleanas de tipo perezoso.

La conjunción ó and lógico (&&). Por caso:


La disyunción ó or lógico (||). a = 3 > 2 || w == 4;
La negación lógica (!). /* la subexpresion w == 4
Por caso: nunca llega a evaluarse */
/* ¿a cuánto evalúa la siguiente
expresión? */ // ¿por qué razón?
Rsta = (3 > 2 || 5 == 4) && !1;

Sentencia condicional Ejemplo

La sentencia condicional tiene la #include <stdio.h>


siguiente sintaxis: main() {
int a = 2;
if (condición) { if (a % 2) {
// código a ejecutarse si printf(“dos es impar\n”);
// la condición se satisface } else {
} else { printf(“dos es par\n”);
// código a ejecutarse en }
// caso contrario. return(0);
} }
Sentencia de repetición Ejemplo

La sentencia de repetición for es muy #include <stdio.h>


flexible en este lenguaje: main() {
int i;
for (cont = 0; cont < tope; cont++) { for (cont = 0; cont < 10; cont++) {
/* bloque de sentencias que se printf("%i al cuadrado es %i\n",
repiten mientras se cumpla la cont, cont * cont);
condición de permanencia */ } // ¿llegará hasta 10?
} return(0);
}

Sentencia de repetición Ejemplo

También es posible repetir un #include <stdio.h>


fragmento de código mientras se main() {
cumpla una cierta condición: int cont = 0;
while (cont++ < 10) {
while (condición) { printf("%i al cuadrado es %i\n",
/* bloque de sentencias que se cont, cont * cont);
repiten mientras se cumpla la } // ¿ahora llegará hasta 10?
condición de permanencia */ return(0);
} }

Sentencia de repetición Ejemplo

Finalmente, existe una segunda #include <stdio.h>


variante para la sentencia de main() {
repetición basada en una condición: int cont = 0;
do {
do { printf("%i al cuadrado es %i\n",
/* bloque de sentencias que se cont, cont * cont);
repiten mientras se cumpla la cont++;
condición de permanencia */ } while (cont < 10); // ¿y ahora?
} while (condición); return(0);
}
Break y continue Ejemplo (a no imitar)

Al estar dentro del ámbito de una #include <stdio.h>


sentencia de repetición, se puede main() {
hacer uso de dos sentencias int cont = 0;
especiales: do {
break: permite romper una repetición, printf("%i visitado\n");
retomando la ejecución en la instrucción cont++;
inmediata siguiente.
if (cont > 10) break;
continue: permite indicar que la iteración } while (1); // ¿cuándo corta?
actual ya fue completada y que se desea
considerar la siguiente.
return(0);
}

Sentencia de
Ejemplo
alternativas múltiples

Las alternativas en la ejecución #include <stdio.h>


pueden agruparse por medio de la main() {
sentencia de alternativas múltiples: char letra = '\x42';
switch (alternativa) { switch (letra) {
case caso-1: { // bloque-1 } case 'A': { printf("A\n"); }
case caso-2: { // bloque-2 } case 'B': { printf("A o B\n");
... break; }
case caso-n: { // bloque-n } case 'C': { printf("C\n"); }
default: { // bloque por defecto } }
} }

Funciones de
La función printf()
entrada/salida estándar

Las funciones de entrada/salida La invocación a la función printf()


estándar en C no pertenecen al guarda la siguiente sintaxis:
lenguaje en si, sino que son provistas printf(
por diversas funciones de librería. formato-a-utilizar,
Por caso, exp-1, exp-2, ..., exp-n)
Entrada: getchar(), scanf(), etc. donde:
Salida: putchar(), printf(), etc. El formato a utilizar es una cadena que
describe cómo mostrar la información.

Las expresiones son los datos que se


desean mostrar.
Ejemplo Expresiones de formato

int x=3; float y=23.0; char z=‘A’; En la E/S estándar, se puede hacer uso
de las siguientes expresiones de
printf(“Hola mundo!!\n”); formato (entre otras):

%c: caracter.
printf(“x vale %d\n”, x); %i: entero.
%d: entero decimal.
printf(
%x: entero hexadecimal.
“y vale %f,\n...y z vale %c.\n”,
y, z); %f: real.
%s: cadena de caracteres.

Expresiones de formato La función scanf()

Existen muchas otras expresiones que La invocación a la función scanf()


controlan otros aspectos del formato: guarda la siguiente sintaxis:

La precisión (número de decimales). scanf(


La justificación (a izquierda o a derecha). formato-a-utilizar,
Poder escribir ciertos caracteres dest-1, dest-2, ..., dest-n)
especiales (por caso, %). donde:
Consultar la referencia de la función El formato a utilizar es una cadena que
en la bibliografia: describe cómo recibir la información.

“The C Programming Language”, escrito Las expresiones son los destinos de los
por B. Kernighan y D. Ritchie. datos ingresados.

Pasaje de parámetros
Ejemplo
por referencia

int x; float y; char z; Si bien C no permite pasar parámetros


por referencia, cuenta con un operador
printf(“Ingrese un número entero: ”); que permite simular ese tipo de pasaje
scanf(“%d”, &x); // ¡x se modifica! de parámetro: el operador '&'.

Este operador calcula la dirección en


printf(“\nOtro entero y un real: ”); memoria de la variable a su derecha.
scanf(“%u %f”, &x, &y); Por caso:

int a = 5;
printf(“\nAhora un caracter: ”); printf("a vale %i\n", a);
scanf(“%c”, &z); printf("&a vale %i\n", &a);
Consideraciones acerca
Definición de funciones
de las funciones

La definición de una función guarda la Una función se invoca al definir los


siguiente estructura: valores actuales para los parámetros
formales de la misma.

tipo identificador (parámetros) { Los parámetros siempre se pasan por


valor.
// Cuerpo de la función. El resultado de la evaluación de la
función se devuelve por medio de la
} sentencia return().

Consideraciones acerca
Ejemplo
de las funciones

Los procedimientos son simplemente int fact(int n) {


funciones de un tipo especial ( void). int rsta = 1;
El control del número y tipo de los while (n > 1)
parámetros es mínimo. rsta *= n--;
Las funciones en C admiten llamadas
return(rsta);
recursivas. }

int main() {
printf(“%d!=%d\n”, 5, fact(5));
}

Definición y declaración
Ejemplo
de funciones

C sólo permite invocar a funciones int fact(int n);


previamente definidas.

¿cómo hacer para definir programas que


int main() {
hagan uso de una recursión cruzada?
printf(“%d!=%d\n”, 5, fact(5));
Es posible separar la declaración de
}
una función de su definición:

La definición abarca todo el código de la


función en cuestión.
int fact(int n) {
La declaración sólo incluye la cabecera o
// código de la función
prototipo de la misma. }

S-ar putea să vă placă și