Sie sind auf Seite 1von 51

Universidad Nacional de Asunción

Facultad Politécnica
Dpto. Informática

Algoritmo
IEL/ IEK/ICM

Introducción a Lenguaje C
Una perspectiva desde SL
Mayo/2013

Prof. Cristian Cappo


Contenido
• Historia
• Tipo de datos
• Expresiones y principales operadores
• Estructuras de control
• Funciones
• Registros y arreglos
• Cadenas en C
• Comparación con SL

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

Archivos cabecera Archivos objeto


Compilador
test.o
libc.lib
Enlazador o linker
Ejecutable
Librerías
test.exe
7
Estructura de un programa C
Directivas del preprocesador
Ej: #include <stdio,h>
Definiciones globales

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

printf : imprime en la salida estándar


scanf : lee desde la entrada estándar

Ambas funciones recibe una cadena de formato y


una lista de expresiones (printf) o direcciones de
variables (scanf).

17
Salida
printf(<cadena formato>,<expr1>,<expr2>, .. <exprn>

Cadena de formato: es un literal de arreglo de caracteres


(cadena) con especificación %## que indican donde
reemplazar por el valor de la expresión. A continuación
algunos formatos usuales

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>

Cadena de formato: es un literal de arreglo de


caracteres (cadena) con especificación %## que
indica como interpretar lo que se lee desde la
entrada (por ejemplo teclado):
Fijarse que dir1, dir2, .., dirn indican direcciones de
memoria donde colocar el valor leído desde la
entrada estándar.

20
Entrada
Ejemplo de funcionamiento de scanf
int a;
scanf( “%d”, &a); Memoria

3500
int a

&a = dirección
de la variable
a

3500\n scanf (“%d”,&a)


scanf interpreta el buffer
Buffer del teclado
21
Estructuras de control
SL C
si ( <expr-logica> ) { if ( <expr-entera> )
sentencias sentencia o bloque
sino else
sentencias sentencia o bloque
}
mientras(<expr-logica>){ while (<expr-entera> )
sentencias sentencia o bloque
}
desde <var>=<expr> hasta for (<expr1>;<expr2;<expr3>)
<expr> [paso <expr>]{ sentencia o bloque
sentencias
}

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.

for ( nro=2; nro <= 100; nro+=2)


printf(“%d \t”, nro);

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

int suma ( int a, int b ) {


return a+b;
}

Ejemplo de declaración (prototipo)

int suma ( int , int );

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.

void intercambiar ( int A [] , int i, int j) {


int tmp;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}

int ordenar ( int A [], int N) {


int i, j;
for ( i=0; i < N; i++ ) {
int min = i;
for ( j=i+1; j < N; j++ )
if ( A[j] < A[min] )
min = j;
// swap
intercambiar(A, i, min);
}
}

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;

fec1 = { 25, 12, 2011 } ;


fec2 = fec1;
fec3.a = 10; fec3.m = 2; fec3.d = 10

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;

Acceso indirecto a la variable apuntada – Operación de desreferenciación 38


Punteros
• Operadores:
– Obtener dirección de una variable : &
– Desreferenciar : *
– Aritmética de punteros : se puede sumar o restar
cantidades enteras de un puntero. Significa adelantar
o atrasar el puntero en una cantidad de bytes de
acuerdo al tipo de dato apuntado.
• Con este tipo de dato es posible trabajar con
memoria dinámica, haciendo petición de bloques
de memoria y accediéndolas a través de punteros

39
Puntero (ejemplo)
Función que intercambie dos valores enteros
#include <stdio.h>

void intercambiar (int *, int *);

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;
}

void intercambiar( int * a, int * b ) {


int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
40
Ámbito de variables
• Variables locales : definidas en funciones y
bloques.

• Variables globales: definidas fuera de las


funciones, generalmente al principio.
Accesible en todas las funciones.

41
Ámbito de variables
#include <stdio.h>

int x, y; // variables globales

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

int long_cadena ( char * s ) { while ( s[l] != ‘\0’ ) l++; return l;


int l = 0;
for ( l=0; s[l] != ‘\0’; l++ ); return l;
while ( s[l++] != ‘\0’ );
//con punteros
return l-1; while ( *s++ != ‘\0’ ) l++; return l;
}
while ( *s != ‘\0’ ) { l++; s++;} return l;
int main () {
char cadena[255]; // defino una cadena de 255 de long. Maxima

printf(“\nIntroduzca una cadena: “);


scanf(“%[^\n]s”, cadena); // leo hasta encontrar un \n

printf(“Long %d y según strlen = %d “, long_cadena(cadena), strlen(cadena));

return 0;
}

46
Biblioteca estándar para cadenas
• La biblioteca <string.h> contiene el prototipo de las
funciones para manipular cadenas
• Algunas funciones son:

// Obtener la longitud de una cadena


int strlen( char * s ) ;

// Copiar una cadena sobre otra


char * strcpy ( char * destino, char * origen);

// Concatenar una cadena a otra


char * strcat ( char * destino, char * origen);

// Comparar una cadena con otra


int strcmp ( char * s1, char * s2 );

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