Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción al
Lenguaje C
1
Introducción a C
1. Características generales
2. Tipos, operadores y expresiones
3. Arrays
4. Flujos de control
5. Estructuras
6. Funciones
7. Otras cuestiones
8. Bibliografía
9. Ejercicios 2
Un tutorial clásico
Características generales
● Pocas palabras reservadas (32)
● Cercanía a la máquina
–Se usa en muchos núcleos de sistemas
operativos
– Prácticamente tan eficiente como
ensamblador
● Muy portable
– Desde mainframes a micro-controladores
© 2009 Grupo ARCO Estructura de Computadores 4
Características generales
Estructura de un programa
printf es una función de la biblioteca
estándar que formatea e imprime
textos por salida estándar
main()
main(){{
printf("hello,
printf("hello,world\n");
world\n");
}}
Un programa funcional
Variables, tipos y declaraciones
main()
main(){{
int
inta,a,b,b,c,c,sum;
sum;
aa==1;1; bb==2;2; cc==3;3;
sum
sum==aa++bb++c;c;
printf("sum
printf("sumisis%d",%d",sum);
sum);
}}
Tipos básicos
● Las variables deben declararse para poder ser
usadas (indica el tipo)
● Tipos básicos
int Entero del tamaño de una palabra
char Carácter (o entero) de 1 byte
float Número real en coma flotante de
simple precisión
double Número real en coma flotante de
doble precisión
Constantes
int
inta;a;char
charquest,
quest,newline,
newline,flags;
flags;
aa==1;1;
quest
quest=='?';'?';
newline
newline ='\n';
= '\n';
flags = 077;
flags = 077;
Entrada/salida simple
getchar, putchar
main(
main() ){{
char
charc;c;
cc==getchar(
getchar(););
putchar(c);
putchar(c);
}}
Entrada/salida simple
printf
main(
main() ){{
int El formato
intn;n;
nn==511;
511; Lo que tiene
printf
printf("¿Cuál
("¿Cuáles
eselelvalor
valorde
de%d
%den
enoctal?",
octal?",n);
n); que formatear
printf
printf("%s!
("%s!%d
%ddecimal
decimales es%o
%ooctal\n",
octal\n","Correcto",
"Correcto",n,n,n);
n);
}}
Expresiones básicas
● a == b 1 si a es igual a b
● a != b 1 si a difiere de b
● a>b 1 si a es mayor que b
● a<b 1 si a es menor que b
● a >= b 1 si a es mayor o igual que b
● a<b 1 si a es menor o igual que b
● a && b 1 si a ≠ 0 y b ≠ 0
● a || b 1 si a ≠ 0 o b ≠ 0
© 2009 Grupo ARCO Estructura de Computadores 11
Tipos, operadores y expresiones
Incremento y decremento
● ++n equivale a n = n + 1
--n equivale a n = n - 1
– Más claro, especialmente si n es complejo
● Existe una versión postfija que devuelve el valor
antes de incremento/decremento
int
inta,a,b,b,x,x,y;y; a == 6 b == 6
aa==bb==5;5; x == 5 y == 6
xx==a++;
a++;
yy==++b;
++b;
Precedencia de operadores
Precedencia de operadores
● (c = getchar()) != '\0'
– Asigna a c un carácter de la entrada estándar
– Compara dicho valor con '\0'
● c = getchar() != '\0' El operador != tiene más
precedencia que el operador =
– Obtiene un carácter de la entrada estándar
– Compara dicho valor con '\0'
– Asigna el resultado de la comparación a c
Arrays (vectores)
● Se puede declarar un array y usarlo así
int
intx[10];
x[10];int
inty[10][10];
y[10][10];
x[0]
x[0]==1;1;x[8]
x[8]==x[9]
x[9]==5;5;
y[0][0]
y[0][0]==y[1][0]
y[1][0]==8;8;
Ejemplo de arrays
● Contar caracteres de cada línea y almacenar los
primeros 100 caracteres
Arrays de caracteres
También llamados
cadenas de texto
● Normalmente terminados en '\0'
– printf lo utiliza como marca de final
● Ejemplo:
– Imprimir longitud así como cada línea
main(
main() ){ {
int
intn;n;
char
charline[100];
line[100];
nn= =0;0;
while((line[n++]=getchar(
while((line[n++]=getchar())))!=!='\n');
'\n');
line[n] = '\0';
line[n] = '\0';
printf("%d:\t%s",
printf("%d:\t%s",n,n,line);
line);
}}
Sentencias condicionales
if, operaciones de relación y lógicos
Evalúa si la
expresión es ≠0
cc==getchar();
getchar();
if(c
if(c =='?')
== '?')
printf("¿Por
printf("¿Porqué
quéhas
hasescrito
escritoun
unsigno
signode
deinterrogación?");
interrogación?");
false: = 0
● Sentencia condicional básica true:≠ 0
– if (expresión) sentencia;
● Op. Relación == != < > <= >=
● Op. Lógicos && || !
– if (a < b && (a < 0 || a > 100)) ...
ifif(a
(a<<b) b){{ Bloque de
t t==a;a; sentencias
aa==b;b;
bb==t;t;
}}
Bucles básicos
while, expresión de asignación
main()
main(){{
char
charc;c;
while((c=getchar())
while((c=getchar())!=
!='\0')
'\0') La asignación también
putchar(c);
putchar(c); tiene un valor
}}
Es posible hacer
a = b = c = 0;
● Sentencia while
– while (expresión) sentencia;
1.Evalúa expresión
2.Si es true (≠0) ejecuta sentencia y vuelve a 1
Sentencia nula
main()
main(){{
while(putchar(getchar())
while(putchar(getchar())!=!='\0')
'\0')
;; Sentencia nula
}}
Aritmética
Resto
● Operadores aritméticos: + - * / %
● Los caracteres pueden tratarse como enteros
– E.g. Paso de mayúscula a minúscula:
c = c + 'a' - 'A';
main(
main() ){{
char
charc;c;
while((c=getchar()) != '\0') Si es una letra
while((c=getchar()) != '\0') mayúscula
if('A'<=c
if('A'<=c&&
&&c<='Z')
c<='Z')
putchar(c+'a'-'A');
putchar(c+'a'-'A');
else
else
putchar(c);
putchar(c);
}} Imprimir
minúscula
Tabla ASCII
while((c=getchar())
while((c=getchar())!=
!='\0')
'\0')
putchar(('A'
putchar(('A' <= c &&cc<=
<= c && <='Z')?
'Z')?c-'A'+'a':
c-'A'+'a':c);
c);
Escaleras de if/else
● Contar letras, dígitos y otros caracteres
main(
main( )) {{
int
int let,
let, dig,
dig, other,
other, c;c; Incremento
let
let == dig
dig == other
other == 0;
0;
while((c=getchar())
while((c=getchar()) != '\0')
!= '\0')
if(('A'<=c
if(('A'<=c && c<='Z') ||
&& c<='Z') || ('a'<=c
('a'<=c &&
&& c<='z'))
c<='z')) ++let;
++let;
else if('0'<=c && c<='9') ++dig;
else if('0'<=c && c<='9') ++dig;
else
else ++other;
++other;
printf("%d
printf("%d letras,
letras, %d%d dígitos,
dígitos, %d
%d otros",
otros", let,
let, dig,
dig, other);
other);
}}
if (expr) sentencia1;
else if (expr2) sentencia2;
else if (expr3) sentencia3;
...
else sentenciaN;
Sentencia switch
● Algunas escaleras if/else pueden implementarse
más eficientemente
switch(c) { switch(c)
switch(c){{
switch(c) { case
case 'a':
case 'a': case'a':'a':case
case'A':
'A':
aflag++; aflag++;
aflag++;
aflag++;
break;
break;
break;
break;
case 'b': case
case 'b':
bflag++; case'b':'b':case
case'B':
'B':
bflag++; bflag++;
bflag++;
break; break;
break; break;
case 'c':
case 'c': ......
cflag++;
cflag++; }}
break;
break;
default:
default:
printf("%c?\n", c);
printf("%c?\n", c);
}
}
for(;;)
for(;;){{
......
ifif(condicionDeSalida)
(condicionDeSalida)break;
break;
......
}}
El bucle for
● Es un caso especial de bucle while
– for(inic; expresión; incr)
sentencia;
● Equivale a
– inic;
while(expresión) {
sentencia;
incr;
}
Estructuras
● Agrupaciones inhomogéneas
struct
struct{{ struct
structsymtsymt{{
char
char id[10];
id[10]; ......
int
int line;
line; };
};
char
char type; struct
type; structsymtsymtsym[10],
sym[10],*psym;
*psym;
int
int usage;
usage;
}}sym; psym
sym; psym==&sim[0];
&sim[0];
psym->type
psym->type==077;
077;
sym.type
sym.type==077; psym->usage
077; psym->usage =0;0;
=
sym.usage
sym.usage =0;0;
= ......
......
psym->type es (*psym).type
Funciones
Definición y declaración
● Definición de función
int
intmin(int
min(inta,a,int
intb)
b){{
return
returnaa<<bb??aa: :b;b;
}}
Pueden devolver un valor
void = no devuelve nada
● Declaración de función
int Declara tipos de argumentos y valor de retorno
intmin(int
min(inta,a,int
intb);
b);
......
i i==min(10,
min(10,6);6); El compilador
...... comprueba que se usa
correctamente
Declaración implícita
● Siempre deben declararse las funciones
– Si no se declara se genera una declaración implícita:
● int funcion(); Argumentos desconocidos
Comentarios
● Comentarios entre /* */
– En C99 también // hasta final de línea
void
voidstrcopy(char
strcopy(chars1[],s1[],char
chars2[])
s2[]){{/*/*copia
copias1
s1en
ens2
s2*/*/
int
inti;i;
for(i
for(i==0;0;(s2[i]
(s2[i]==s1[i])
s1[i])!=
!='\0';
'\0';i++);
i++);
}}
Inicialización de variables
● En la propia definición se proporciona un valor
inicial
– La inicialización puede ser más eficiente que la
asignación
int
intxx==20;
20;int
intaa=='k';
'k';char
charcc==0177;
0177;
int y[] = { 1, 2, 3, 4 };
int y[] = { 1, 2, 3, 4 };
int*
int*pp==&y[1];
&y[1];
char*
char* msg=="Error
msg "Errorde
deformato";
formato";
char
char buf[] = "Introducelos
buf[] = "Introduce losdatos";
datos";
No es lo mismo msg y buf. La
cadena de msg no puede ser
alterada. ¿Por qué?
El preprocesador
● Preprocesador: paso previo a compilación
● Interpreta directivas
– Las directivas empiezan por #
#include
#include<stdio.h>
<stdio.h> #define
#defineMAXBUFSIZE
MAXBUFSIZE2525
FILE* f;
FILE* f; int buf[MAXBUFSIZE];
int buf[MAXBUFSIZE];
Incluye el archivo stdio.h
(declaraciones de la Macro-constante
biblioteca estándar)
Operaciones de bits
● a&b AND
● a|b OR (or inclusivo)
● a^b XOR (or exclusivo)
● ~a Complemento a 1
● ! Negación lógica
● a << b Desplaza a b bits a la izquierda
● a >> b Desplaza a b bits a la derecha
Asignaciones especiales
● a -= b a = a - b
● a &= b a = a & b
● a <<= b a = a << b
● ...
Coma flotante
● Calcular la media de un vector de reales de simple
precisión
double
doublesum;
sum;
float
float avg,y[10];
avg, y[10];
sum = 0.0; Se pueden mezclar
sum = 0.0; distintos tipos numéricos.
for(
for(i=0;
i=0;i<n;
i<n;i++
i++) ) Hay promoción implícita
sum
sum=+=+y[i];
y[i]; de tipos
avg
avg==sum/n;
sum/n;
Tipos de usuario
typedef
typedef
typedefstruct structsymt_
symt_symt;
symt;
struct symt_
struct symt_ { {
char
charid[20];
id[20];
int type;
int type;
......
};};
......
struct
structsymt_ symt_sym1
sym1=={};
{};
symt sym2;
symt sym2;
sym2
sym2==sym1; sym1;
Proceso de compilación
Primero compilar, luego
$ gcc -c archivo1.c montar
archivos.c
$ gcc -c archivo2.c
$ gcc -o ejecutable archivo1.o archivo2.o
Compilador
C
Todo de golpe
Montador
ejecutable
4. Ejecuta el programa
– Por defecto se habrá generado como “a.out”
$ ./a.out
Aprender C
● The C Programming Language, 2nd ed.
B. Kernighan, D. Ritchie Buen libro
Ejercicios (1)
● Experimenta con todo el código que se presentado de ejemplo aquí
● Ejecuta el programa “Hola, mundo”
– Experimenta con la omisión de partes del programa para ver qué
mensajes de error se obtienen
● Escribe un programa que cuente espacios en blanco
● Escribe una función que reciba una cadena de texto y la convierta a
minúsculas
● Escribe un programa que invierta la cadena que se le proporcione en
línea de órdenes