Professional Documents
Culture Documents
Facultad Politécnica
Dpto. Informática
Algoritmo
IEL/ IEK/ICM
Introducción a Lenguaje C
Una perspectiva desde SL
Mayo/2013
2
Historia
• Desarrollado por Dennis Ritchie en los años 70
• Es un lenguaje de programación de propósito general.
• Su ancestros: un lenguaje denominado B desarrollado
por Ken Thompson y otro denominado BCPL
desarrollado por Martin Richards.
• Fue producto de la recodificación del S.O. Unix para
posibilitar su portabilidad.
• Estandarizado en el año 1983 por ANSI (American
National Standards Institute).
• Actualmente se tiene el estándar ANSI 1989 (ANSI
X3.159-1989) o C89 y su par europeo ISO 1990 o C90
(ISO/IEC 9899:1990)
3
Características generales de C
• Lenguaje de programación estructurada
• Relativamente simple
• Genera código de máquina muy eficiente
• Es muy flexible con poca comprobación de errores
• Mucha libertad al programador
• Ampliamente usado en programación de sistemas (S.O,
base de datos, librerías gráficas, telecomunicaciones,
etc).
• Mucho, mucho código escrito mundialmente en todas
las áreas.
4
Programa simple en C (1)
Un programa que imprime el famoso mensaje
“Hola mundo!!” en la pantalla
#include <stdio.h>
int main() {
/* Comentarios .. */
printf(“Hola mundo!!\n”);
return 0;
}
5
Programa simple en C (2)
• Imprimir la suma de dos variables enteras que se
leen por teclado
#include <stdio.h>
int main() {
int a, b;
printf(“Introduzca dos variables enteras “);
scanf(“%d%d”, &a, &b);
printf(“La suma es %d\n”, a + b);
return 0;
}
6
Modelo de compilación en C
• A diferencia de SL, que es interpretado, usualmente C es un
lenguaje compilado
La generación de código ejecutable es
Fuente C específico para la plataforma ( máquina
test.c + sistema operativo ),
por ejemplo: Intel/Linux
math.h Preprocesador
stdio.h
Prototipos
Definición de Funciones
Todo ejecutable debe tener una función
main()
8
Tipo de datos básicos
dependientes de la plataforma
• char
– Entero de 8 bits. Rango -127 a 127. Modificadores signed y unsigned.
Ejemplos de constantes: ‘A’, ‘B’, ‘c’ (entre comillas simples)
• int
– Entero de 16 o 32 bits. Modificadores: signed, unsigned, short y long
(32 bits). Constantes: 34L, 20000, 3000
• float
– Punto flotante IEEE 754 de 32 bits. Constantes: 12.34F, 4.34e-3F
• double
– Punto flotante IEEE 754 de 64 bits. Modificador: long. Constantes:
12.23, 0.000034, 0.12323L
• void
– Ausencia de tipo
9
Literales o constantes
Nombre Descripción Ejemplos
Decimal Entero en base 10 1234
Hexadecimal Entero en base 16 0x1234
Octal Entero en base 8 01234
Carácter Byte en ASCII ‘A’
Punto flotante Número real 1.2
3.4e6
3.456-2
Cadena Texto literal “hola Ingenieria Electronica”
10
Valor lógico y cadenas
• En C no existe un tipo de dato “logico” como
lo es en SL. En C se considera:
– El valor entero 0 (cero) como falso
– Todo lo que no sea cero (!0), verdadero
• En C no existe el tipo de dato cadena como en
SL, solo arreglo de tipo char.
11
Consideraciones sintácticas
• Existe diferencia entre minúsculas y mayúsculas. Igual
que en SL
• Todas las palabras reservadas en minúsculas
• Todas las sentencias terminan en ; (punto y coma). En
SL terminan con Enter
• El valor inicial de las variables esta indefinido. En SL los
números se inicializan en 0 y las cadenas en ””.
• La declaración de variables es:
<tipo_dato> lista_variables;
Ejemplo:
int a, b, c;
12
Operadores más comunes
• Aritméticos (igual que SL)
• Auto incremento y decremento ++ y --
• Relacionales ( >=, <=, ==. != , < , > )
• Lógicos ( && (and), || (or) , ! ( not) )
Otros:
- Operadores de bits ( & , ^, | , >> , <<, ~ )
- Punteros ( & * -> )
- Estructuras ( () [] . )
- Asignación simple (=) y combinada ( *= /= += -= )
- Condicional ( ? : )
- Especial ( , (operador coma) )
13
Resumen de precedencia de algunos
operadores
Mayor
() [] -> .
! ~ ++ -- - (tipo)* & sizeof
* / %
<< >>
< <= > >=
== !=
&
^
&&
||
?
= += -= *= /=
,
Menor
14
Expresiones
• No se detectan desbordamientos de números
ni de los arreglos.
• En las divisiones, si los operandos son enteros,
se devuelve sólo el cociente entero (sin
decimales). Lo que hace int() de SL
• Las operaciones booleanas devuelven cero o
uno para indicar falso o verdadero (recordar
que no existe variables de tipo lógico)
15
Asignación
• A diferencia que SL, la asignación en C es una
operación (no una sentencia) que puede
participar en una expresión.
• Por ejemplo:
c = (d = 10) * 2;
d tendrá 10 y c tendrá 20.
16
Entrada/Salida
Se realizan a través de funciones preincorporadas de
tipo estándar
17
Salida
printf(<cadena formato>,<expr1>,<expr2>, .. <exprn>
Formato Interpretación
%d Decimal entero
%f Float
%c Carácter
%s Cadena
%lf Double
18
Salida
Ejemplos:
printf(“Entero %d”, 100 );
Entero 100
printf(“Float %f”, 0.0023);
Float 0.0023
printf(“Cadena %s”, “Hola mundo”);
Cadena Hola mundo
printf(“Carácter %c”, ‘A’);
Carácter A
printf(“Suma de %d+%d = %d”,10,20,10+20);
Suma de 10+20 = 30
19
Entrada
scanf(<cadena formato>,<dir1>,<dir2>, .. <dirn>
20
Entrada
Ejemplo de funcionamiento de scanf
int a;
scanf( “%d”, &a); Memoria
3500
int a
&a = dirección
de la variable
a
22
Estructuras de control (2)
SL C
repetir do {
sentencias sentencias
hasta (<expr-logica>) } while (<expr-entera>);
eval { switch (<expr-entera> )
caso <expr-logica> case <const-entera> :
sentencias sentencias o break;
caso <expr-logica> case <const-entera> :
sentencias sentencias o break;
[ sino [ default:
sentencias ] sentencias ]
} }
23
Estructuras de control(3)
SL C
salir break
continue
abandona la iteración
actual y vuelve a iterar
goto
salto incondicional
retorna return
solo final de la en cualquier lugar de la
subrutina función
24
Estructuras de control (1)
if <expr_entera> sentencia; [else sentencia;]
Ejemplo:
if ( a == b )
a = 100;
else
b = 100;
25
Estructuras de control (2)
for ( expr1 ; expr2; expr3) sentencia;
– Permite una iteración semiautomática.
Primero se hace expr1, si expr2 es verdadero se
ejecuta sentencia y luego se evalúa expr3.
Ejemplo: imprimir los 100 primeros números
pares empezando por 2.
26
Estructuras de control(2)
while ( <expr_entera> ) sentencia;
Se ejecuta sentencia mientras que
expr_entera sea verdadera
Ejemplo:
while ( a <= b )
a = a + 1 ;
27
Estructuras de control(3)
do { <lista-sentencias> } while ( <condicion> );
Se ejecuta la lista de sentencias (al menos una vez)
mientras sea verdadera la condición.
Ejemplo: (solicitar el usuario un valor entero
positivo mayor a cero)
do {
scanf(“%d”, &opc);
} while ( opc <= 0 ) ;
28
Bloques
• Un bloque es un conjunto de sentencias limitadas por llaves
{}.
• Si se desea ejecutar más de una sentencia en una
estructura de control se debe utilizar un bloque. Al inicio
del bloque puede declararse variables (que solo “viven” en
el bloque)
if ( a == b ) {
int c;
a = 100;
b = 200;
c = a + b;
printf(“%d\n”, c);
}
Puede declararse al inicio del bloque
29
Funciones en C
• Un programa C es un conjunto de funciones,
donde el punto de entrada del programa es la
función con nombre main()
• El orden de la definición de las funciones es
importante. Se debe declarar primero antes de
usar.
• La definición consiste en la cabecera mas el
cuerpo. Una definición implica declaración.
• La declaración consiste solo en la cabecera, esto
se conoce como “prototipo”.
30
Funciones en C (1)
<retorno> <nombre-funcion> ( <parametros> )
{
<cuerpo>
}
Ejemplo de definición
31
Funciones en C (2)
Cuando no se tiene retorno, caso de
procedimiento, entonces el tipo de retorno es
void
void proceso () {
..
}
32
Funciones en C (3)
Llamada. Puedo dejar de usar el valor de retorno.
#include <stdio.h>
var
int suma ( int , int ); a, b , c : numerico
inicio
int main () { leer(a,b)
int a, b, c ; c = suma(a,b)
scanf( “%d%d”, &a, &b); imprimir(c)
c = suma(a,b); fin
printf(“%d\n”,c);
return 0; sub suma ( a,b :numerico)
} retorna numerico
inicio
int suma ( int a, int b ) { retorna a + b
return a + b; fin
}
33
Arreglos
Los arreglos son siempre estáticos, no existe validación de límites.
Definición de vectores
<tipo> <variable> [<constante>];
Ejemplo:
int A[100] ; //vector de 100 elementos ints
Definición de matrices
<tipo> <variable> [<constante>] [<constante>]
Ejemplo
int M[100][20]; // matriz de 100 filas y 20 columnas
34
Arreglos
Acceso a componentes.
El primer elemento tiene el índice 0 ( en SL
tiene 1 )
Vectores
<var>[<expr-entera>]
Matrices
<var>[<expr-entera>][<expr-entera>]
35
Arreglos - ejemplo
Ordenar un vector de N elementos enteros, fijarse que N debe pasarse como parámetro.
36
Registros en C
En C se denominan “struct” o estructuras
struct[<nombre-tipo>]{<tipo> <nombre>;.. }
<var>,..,<var>;
Ejemplos
struct TFecha {int d;int m;int a} fec1;
struct TFecha fec2, fec3;
struct { int c1, int c2 } varx;
37
Punteros
• Definición: una variable cuyo contenido es
una dirección de memoria
• Declaración de punteros en C
<tipo> * < variable>
Memoria
Ejemplo
int * p; 0x27cd1c 1000
int i; int * p
0x27cd1c
int a
p = & i;
*p = 1000;
39
Puntero (ejemplo)
Función que intercambie dos valores enteros
#include <stdio.h>
int main () {
int a, b;
scanf( “%d%d”, &a, &b);
printf(“Antes a=%d b=%d\n”,a,b);
intercambiar(&a,&b);
printf(“Despues a=%d b=%d\n”,a,b);
return 0;
}
41
Ámbito de variables
#include <stdio.h>
void func() {
int x; // definición de variable local x
x = 1; // acceso a la variable local x
y = 1; // acceso a la variable global y
{
int y = 20; // variable de bloque (local)
y = 5; // acceso a variable de bloque
// (local) y
}
42
Cadenas en C
• En C no existe un tipo de dato predefinido
para manipular cadenas, sin embargo existe
una convención: una cadena es un vector de
caracteres (char) cuya última posición es el
byte 0.
• Definición
char <var-cadena> [ <constante> ];
Ejemplo
char s[8] = “algo”;
a l g o \0 ? ? ?
43
Literales e inicialización de cadenas
• Los literales o constantes se forman con comillas
dobles.
“Hola esto es una prueba”
• Al declarar un vector de caracteres, se puede
inicializar
char texto[4] = “abc” ; // la ult. pos. se usa para el delimitador
44
Imprimir cadenas
• La función printf admite formato de cadenas
con la especificación %s
char cadena[80];
...
printf ( "El texto es %s\n", cadena );
45
Cadena - ejemplo
Leer una cadena e imprimir su longitud, comparando con la función predefinida, strlen()
#include <stdio.h>
#include <string.h> //Otras opciones para hacer lo mismo
return 0;
}
46
Biblioteca estándar para cadenas
• La biblioteca <string.h> contiene el prototipo de las
funciones para manipular cadenas
• Algunas funciones son:
47
Ejercicios sencillos en C (1)
1. Leer dos números enteros a y b e imprimir la
multiplicación a * b utilizando sumas
sucesivas
2. Imprimir los primeros 100 números pares en
5 columnas
3. Imprimir los primeros n números primos
4. Imprimir la cantidad de dígitos que posee un
número N leído por teclado. Usar long int.
48
Ejercicios sencillos en C (2)
5. Hacer una función que reciba un vector de
enteros y retorne en una estructura la suma,
el promedio, el menor y el mayor
6. Hacer una función que reciba un vector de
enteros y lo ordene usando ordenación por
burbuja.
7. Hacer una función que reciba una matriz de
10x20 y retorne los mínimos de cada
columna en un vector de 20 posiciones
49
Ejercicios sencillos en C (3)
8. Leer una cadena e imprimir la longitud de la
misma sin utilizar la función strlen();
9. Dada una cadena s1 y otra cadena s2,
imprimir si s2 se encuentra contenida en s1.
10.Dada una cadena s, imprimir la cantidad de
caracteres alfabéticos (mayúsculas o
minúsculas), números y caracteres especiales
tiene.
50
Bibliografía
• El lenguaje de programación C. Kernighan/Ritchie
• Como programar en C/C++. H.M.Deitel /
P.J.Deitel. Editorial Prentice Hall.
• C. Manual de Referencia. Herbet Shildt.Editorial
McGraw-Hill
• Programación C. Marcelo Hernán Ruiz.
• Problemas resueltos paso a paso de
programación en lenguaje C. Félix García
Carballeira, Alejandro Calderón, Jesus Carretero,
Javier Fernández, José Ma. Pérez.
51