Actualizado el 20 de Mayo del 2018 (Publicado el 18 de Enero del 2017)
2.480 visualizaciones desde el 18 de Enero del 2017
284,2 KB
8 paginas
Creado hace 16a (23/09/2008)
Algoritmos y Estructuras de Datos
2º de Ingeniería Informática, Curso 2008/2009
SEMINARIO “C para programadores java”
(este seminario forma parte de las actividades del proyecto piloto)
Sesión 1
Contenidos:
1. Características generales de C
2. Edición y compilación de un programa C
3. Variables y tipos de datos básicos
4. Operadores
5. Sentencias de control de flujo
Ejercicios
1. Características generales de C
• C es un lenguaje:
o IMPERATIVO (vs. orientado a objetos).
o estructurado de nivel medio-alto:
no es bajo nivel, como ensamblador
pero es débilmente tipado, hace uso intensivo de punteros, tiene
goto…
o de tamaño reducido
o pero con una gran potencia y expresividad
o se asume que “el programador sabe lo que hace” ⇒ errores, más difíciles
de detectar; por ejemplo, no hay excepciones1
• Pero entonces, ¿por qué aprender C cuando ya sé java? ¿Porque me obligan?
o C es al mismo tiempo de nivel alto y bajo, polivalente.
o Mejor control de los mecanismos de bajo nivel.
o Mejor rendimiento que java (interpretado vs. compilado)
o Java oculta muchos detalles necesarios para escribir código del S.O.
1 ¿Conocéis las excepciones?
Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C – Sesión 1
2/8
• Tipos de datos:
o elementales:
enteros (int, long, short)
caracteres (char)
enumerados (enum)
no hay booleanos, pero sí en C++
reales (float, double)
o compuestos (ojo, no son clases):
arrays
No hay colecciones, clases, string ni envolventes2, pero sí en C++
registros (struct) y uniones (union).
• Funciones y procedimientos:
o No hay distinción entre unas y otros.
o Tienen la forma:
<tipo_devuelto> <nombre_operacion> (<parámetros>)
{
}
<codigo>
o Si no devuelve nada o no hay parámetros, se pone void.
o No se pueden anidar.
• Sentencias de control de flujo:
o Iteración (for, while, do-while)
o Condicionales (if, if-else)
o Selección de casos (switch)
• Expresiones y sentencias:
(para la comparación usar “==”). Por ejemplo “a= 4+(b=0);”.
o Cualquier expresión en C puede ser una sentencia.
o La asignación es una expresión, se expresa mediante el símbolo “=”
o Las sentencias acaban en “;”.
o Sentencia vacía, “;”, es una sentencia válida.
o Bloque:
− secuencia de sentencias (0 o más), entre llaves.
− es una sentencia.
• Declaración de variables:
o Obligatoria.
o Forma: <tipo_var> <nombre_var> [, <nombre_var>];
o Las variables pueden ser globales (declaradas fuera de una función) o
locales (declaradas al principio del código de un procedimiento, nunca
intercaladas con el código, aunque en C++ sí es posible).
o Ejemplos:
int a,b,c;
int a=0,b,c=1; (inicialización en la declaración)
o OJO: no hay inicialización a 0 automática de variables (en java sí).
REGLA DE ORO: siempre inicializar “todo” antes de usarlo.
2 ¿Sabéis lo que son?
3/8
Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C – Sesión 1
Escribir por pantalla: printf()
• No forma parte del lenguaje, hay que “incluirlo”: #include <stdio.h>
printf ("Hola!");
printf("%d", expresión_entero); // Otro comentario
printf("%c", expresión_caracter);
printf("%f", expresión_real);
printf("Un entero: %d y un real: %f", entero, real);
printf("Dos caracteres: %c%c, con fin de línea.\n", car1, car2);
/* Esto es un comentario */
A modo de resumen:
paradigma
nivel
eficiencia
interpretado
excepciones
clases, string…
union
booleano
declaración variables entre
líneas de código
variables autoinicializadas
JAVA
OO
alto
media
sí
sí
sí
no
sí
sí
C
imperativo
medio-alto
alta
no
no
no
sí
no
no
C++
OO + imperativo
medio-alto
alta
no
sí
sí
sí
sí
sí
sí
no
no
2. Edición y compilación de un programa C
• Un programa C está compuesto por un conjunto de funciones.
• Debe existir una función llamada main (“principal”), es la que será invocada
cuando se ejecute el programa.
• El programa puede estar en uno o varios ficheros, con extensión: .c
• Ejemplos de programas C:
nada.c
main () {} /* Programa que no hace absolutamente nada */
#include <stdio.h>
/* Este hace un poco más... */
void main (void)
{
printf("Hola!");
}
hola.c
#include <stdio.h> /* Puede ser necesario */
int main(int num_argumentos) /* Cuenta el num. de argumentos */
{
printf("%d argumentos\n", num_argumentos);
return 0;
}
argum.c
Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C – Sesión 1
4/8
• Compara con java:
o Aplicación:
class <Nombre>
{
public static void main(String[] args)
{
instrucciones;
}
}
o Applet:
class <Nombre> extends Applet
{
public void init()
{
instrucciones;
}
}
• NOTA IMPORTANTE: en C y C++, el fichero ejecutable generado corre
directamente sobre la máquina hardware, no sobre la máquina virtual java, de
modo que el ejecutable a generar es distinto según la máquina y sistema
operativo.
• Entrar en la máquina:
o Lilo: linux
o
login/password: mismos que suma, platón o correo ALU
• Crear y editar el fichero .c. Usar “joe”, “jed”, “rhide”, “vi”...
• Compilar con gcc. Ejemplos de compilación:
>> gcc nada.c
>> gcc hola.c -o hola
>> gcc -o argum.exe argum.c
El ejecutable es “a.out”
El ejecutable es “hola”
El ejecutable es “argum.exe”
• Ejecutar los programas compilados:
>> hola
>> ./hola para evitar ese problema
>> ./argum.exe
>> ./argum.exe uno dos tres
Si no funciona es que el directorio actual no está en el PATH
NOTA: en linux un fichero es ejecutable porque tiene permisos de ejecución, no por tener extensión .exe
Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C – Sesión 1
5/8
Tipo
Carácter
Entero
Real
Real
doble
char
8
int
Nombre Bits3 Descripción
32
número entre -128 y +127.
Representa un carácter ASCII,
aunque se puede usar como un
3. Variables y tipos de datos básicos.
Ejemplo
char c1, c2;
c1= 'a';
c2= 'A' + 5;
printf("%c ", c2);
printf("%d ", c1);
int i1= 0;
i1= 288;
i1= 032; /*Octal*/
i1= 0xf0;/*Hexad*/
printf("%d", i1);
float f1= 0.0;
f1= 3.142;
f1= 3e-12;
printf("%f", f1);
printf("%g", f1);
printf("%5f", f1);
double d1;
d1= 4.3e-3;
printf("%f", d1);
printf("%4.3f",d1);
flotante, con doble precisión.
Entero de 32 bits, con signo.
Número real en punto
Número real en punto
flotante.
float
32
double
64
3 Puede variar según la máquina y el compilador usados
4 ¿conocéis el concepto de referencia directa vs. indirecta?
• Variantes: signed/unsigned, short/long
o De char:
o De int:
• unsigned char (número de 0 a 255)
• signed char (por defecto, equivale a char).
• short int (entero corto, se puede poner sólo short)
• long int (entero largo, se puede poner sólo long)
• long long (entero muy largo)
• unsigned (equivalente a unsigned int), unsigned long…
o De double: long double.
• No existe el tipo booleano (en C++ sí):
o en su lugar se usan los enteros, caracteres o punteros: si vale 0 entonces
o un true “generado” es un uno cuando usado como número.
significa false, cualquier otro valor es true.
• int bol= (63>7);
• char bol2= (5==2+3) && bol;
• Enumerados: enum; basados en enteros; ojo, son tipo básico, referencia directa4
enum dias {lunes, martes, miercoles}; /* Definicion tipo */
enum dias d1= lunes, d2= miércoles; /* Declaracion vars */
enum sexo {hombre=1, mujer=2, nsnc=3}; /* Asignación manual */
enum sexo s1= hombre;
enum sexo s2= 3; /* Válido, aunque no recomendado */
printf("%d ", s1); /* Se deben imprimir como enteros... */
printf("Tamaño de long long: %d bytes\n", sizeof(long long));
• Probar el tamaño (en bytes) de los distintos tipos: sizeof(tipo)
• ¿Cómo escribir un unsigned, un long…? → man –a
Tipo
Aritméticos
Relacionales
Booleanos
Operaciones
con bits
Asignación5
Incrementales
Operadores
Suma: +
Resta: -
Multiplicación: *
División: /
Módulo: %
Igual: ==
Distinto: !=
Menor: <
Menos o igual: <=
Mayor: >
Mayor o igual: >=
No lógico: !
Y lógico: &&
O lógico: ||
No nivel bits: ~
Y nivel bits: &
O nivel bits: |
Xor nivel bits: ^
Despl. izq.: <<
Despl. Der.: >>
Asignación: =
Suma con asig.: +=
Resta con asig.: -=
*=, /=, …
Preincremento: ++c
Postincremento: c++
Predecremento: --c
Postdecremento: c--
sizeof(tipo)
Descripción
Ejemplo
Operadores aritméticos
elementales. Más operaciones
en las librerías matemáticas.
char c= 'A'-'a';
int i= c%4;
long l= 0xff*((double) 1);
double d= (2/3)*3;
Operadores de comparación
entre enteros, caracteres y
reales.
int cond1= (32>=4);
int cond2= (cond1<6);
cond1==cond2;
Operaciones lógicas,
aplicadas sobre enteros,
siendo 0 → false y otro valor
true.
Operaciones lógicas aplicadas
a nivel de bits. En los
desplazamientos: a << c,
significa desplazar c bits el
valor a.
Operaciones de asignación a
una variable. Las de forma:
a+= b, son equivalentes a:
a= a + b
Preincremento: devuelve c y
hace c= c+1
Postincremento: hace
c= c+1 y devuelve c
Devuelve el tamaño (en
bytes) de un tipo de datos.
Une varias expresiones en
una misma línea de código.
Resultado = expr2.
int a, b, c;
(!(a && (b || c)))
int a= 0xff, b= 0xf0;
(a & b);
(a | b);
a << 2;
int a, b, c;
a= b= c= 0;
a+= 1;
Comentarios de: SEMINARIO “C para programadores java” (0)
No hay comentarios