Publicado el 5 de Abril del 2019
1.539 visualizaciones desde el 5 de Abril del 2019
2,6 MB
51 paginas
Creado hace 13a (22/11/2011)
Lenguaje C
Lenguaje C
Ignacio Alvarez García
Octubre - 2006
Indice
Introducción al lenguaje C
Datos y su almacenamiento
Operadores y expresiones
Sentencias de control de programa
Tablas y punteros
Asignación dinámica de memoria
Funciones
Nuevos tipos definidos por el programador
Funciones de librería estándar
E/S por stream
El preprocesador
1
Introducción al lenguaje C
Lenguaje de nivel medio
Características de alto nivel: tipado, estructurado (no totalmente),
altamente portable (estándar ANSI-C).
Características de bajo nivel: acceso a bits, bytes y direcciones;
lenguaje no seguro.
Diseñado para programadores de sistemas
Lenguaje de programación adaptable a múltiples escenarios
Un repaso rápido al C
Forma típica de un programa en C
#include <stdio.h>
#include <stdlib.h>
#define TAM_TABLA
5
int Factorial(int n)
{
int i,result;
for (i=1,result=1;i<=n;i++)
result=result*i;
return result;
}
main()
{
int i;
int x[TAM_TABLA],fact[TAM_TABLA];
for (i=0;i<TAM_TABLA;i++)
{
Directivas de preprocesador
Declaración variables globales (evitar si es posible)
Función
Función principal
printf("Introduzca x[%d] = ",i);
scanf("%d",&x[i]);
fact[i]=Factorial(x[i]);
printf("El factorial de %d es %d\n",x[i],fact[i]);
}
}
2
Un repaso rápido al C
Contenidos de una función
Parámetros
Nombre (identificador)
tipoDvto NombreFuncion(tipo1 param1,tipo2 param2,...)
{
tipoA varlocalA;
tipoB varlocalB1,varlocalB2,varlocalB3[10];
tipoC varlocalC=valorInicial;
Cabecera
Declaración variables locales
sentencias a ejecutar terminadas en ;
Código de la función
return resultado;
}
Una función es una caja negra
Entradas
(parámetros)
Función
Código
Vbles
locales
Salida (valor devuelto)
Un repaso rápido al C
Tipos básicos de variables:
int (entero): 3, -117, 0
char (carácter): ‘a’ ‘b’ ‘c’
float (real): 3.17, -0.000035, 2.0
Declaración de variables (terminan en ; ):
int cuenta;
/* Variable tipo entero */
int num_alumnos=23; /* Id. con valor inicial 23 */
int valorx,valory,valorz; /* Tres variables enteras */
int datos[5];
/* Cinco variables enteras
consecutivas (tabla o array) */
3
Un repaso rápido al C
Sentencias y expresiones:
Todas las sentencias terminan en ;
Expresión: todo o parte de una sentencia en la que
intervienen operandos y operadores para dar un resultado.
Operandos: valores de variables, constantes y resultados
de función
Operadores: aritméticos (+ - * / … ), relacionales (>= <= ==
!= …), de asignación (=), paréntesis, etc.
Asignación: operador que modifica el contenido de una
variable
Ejemplos de expresiones:
y = 2*x + tabla[4]*Factorial(x-1);
x-5;
Condicion=(z>=3 && z<=5);
Un repaso rápido al C
Sentencias de control de programa
Bloque:
{
}
sentencia1;
sentencia2;
…
Alternativa:
if (condicion)
sentenciaSiTRUE;
else
sentenciaSiFALSE;
Bucle while:
while (condicion)
sentenciaARepetir;
Bucle for:
condicion = valor entero :
0 ≡ Falso
No 0 ≡ Verdadero
Sentencia se puede
sustituir por un bloque
for (inicializacion ; condicion_continuidad ; paso )
sentenciaARepetir;
4
Un repaso rápido al C
Punteros:
Puntero: contiene la dirección de memoria donde se aloja una
variable, y el tipo de la misma. Permite acceder a esa posición de
forma indirecta.
Declaración:
tipo *puntero;
Acceso a dirección apuntada:
*puntero
Obtención de dirección de vble:
&vble
Ejemplo:
int x=5,y=27;
int *pt;
pt = &x;
*pt = 50 ; // x pasa a valer 50
pt = &y;
*pt = 50 ; // y pasa a valer 50
Memoria
pt
3000
. . .
5
27
x
y
3000
3010
Un repaso rápido al C
Tablas:
Conjunto de variables almacenadas en memoria
de forma consecutiva con un identificador único.
Declaración:
tipo identif[TAM];
TAM debe ser constante
Acceso al elemento i-simo:
identif[i]
int tabla[5] ;
int* pt;
tabla
pt=tabla;
tabla[3] ”
” *(pt+3) ”
” pt[3]
pt
La tabla y el puntero, tras la declaración, son
equivalentes: el identificador de tabla es un
puntero (constante), o un puntero se puede
utilizar como una tabla
5
”
”
”
”
”
”
”
”
Un repaso rápido al C
Cadenas de caracteres:
Son tablas de char terminadas en el valor 0
(carácter nulo).
Almacenan secuencias de caracteres de texto
codificadas en ASCII (ejemplos: ‘H’ ≡ 72,
‘o’ ≡ 111, ‘\n’ ≡ 10 ≡ retorno de carro).
Constantes tipo cadena: “texto” (incluye carácter
nulo)
char texto[5] = “Hola”;
texto
72
111
108
97
0
texto[0]
texto[1]
texto[4]
Un repaso rápido al C
Funciones de Entrada / Salida por consola:
putchar(char c); Escribe carácter cuyo código ASCII es c
char getchar(); Espera pulsación de carácter (+INTRO) y
devuelve su código ASCII
puts(char* cad); Escribe cadena (todos los caracteres
hasta el nulo)
gets(char* cad); Espera pulsación de secuencia de
caracteres (+INTRO) y almacena sus
códigos ASCII en la tabla apuntada por cad
printf(char* fmt,…); Escribe cadena con formato
scanf(char* fmt,…);Espera pulsación de datos con formato
6
Un repaso rápido al C
Funciones de Entrada / Salida por consola:
printf(char* fmt,valor1,valor2,…);
Escribe en pantalla los caracteres de la cadena fmt, excepto
cuando aparece %ALGO. El %ALGO lo sustituye por el valor
correspondiente (por orden):
– %d: entero
– %f: real (float)
– %c: carácter
– %s: cadena de caracteres
Ejemplo:
int alumnos=12;
char estudios[13]=“Programación”;
printf(“Hay %d alumnos estudiando %s\n”,alumnos,estudios);
Hay 12 alumnos estudiando programación
_
Un repaso rápido al C
Funciones de Entrada / Salida por consola:
scanf(char* fmt,ptero_a_valor1,ptero_a_valor2,…);
Espera por teclado la pulsación de una secuencia de
caracteres terminada en INTRO. Una vez obtiene la
secuencia, va extrayendo valores en función de los %ALGO de la
cadena de formato y almacenando dichos valores en las
direcciones indicadas por los punteros:
Ejemplo:
int alumnos,grupos;
printf(“Introduzca nº de alumnos: ”);
scanf(“%d”,&alumnos);
grupos=alumnos/2;
printf(“Puedo hacer %d grupos de 2 alumnos”,grupos);
Introduzca nº de alumnos: 12
Puedo hacer 6 grupos de 2 alumnos_
7
Tipos de datos en lenguaje C
Enteros: Permiten almacenar valores numéricos enteros (o
conjuntos de datos representables por enteros). char, short,
int, long, todos elllos signed o unsigned.
Reales: Permiten almacenar valores numéricos fraccionarios.
float, double, long double.
Punteros: Permiten almacenar direcciones donde se
encuentran datos de otros tipos (incluidos punteros). Se indican
como tipo*.
Ningún tipo: No almacena nada. void.
Tipos de datos enteros
Enteros sin signo (sólo
positivos): codificación
ponderada en base 2 con el
nº de bits indicado en la
tabla de la diapositivia
siguiente.
Enteros con signo
(positivos y negativos):
positivos como los
anteriores, negativos con el
bit más significativo (MSB) a
1, indican valor en
complemento a 2.
decimal
sin signo
código binario
decimal
con signo
0
1
2
3
. . .
2n-1-2
2n-1-1
2n-1
2n-1+1
. . .
2n-3
2n-2
2n-1
000 …….. 000
000 …….. 001
000 …….. 010
000 …….. 011
. . .
011 …….. 110
011 …….. 111
100 …….. 000
100 …….. 000
. . .
111 …….. 101
111 …….. 110
111 …….. 111
0
1
2
3
. . .
2n-1-2
2n-1-1
-2n-1
-2n-1+1
. . .
-3
-2
-1
8
Tipos de datos enteros
Rango de los enteros
Nº bits
mín
Nº bits
VC++
Rango
sin signo
Rango
con signo
Mín (0) Máx (2n-1)
Mín (-2n-1) Máx (2n-1-1)
char
8
short
>=char
int
long
>char
>=short
>short
>=int
8
16
32
32
0
0
0
0
255
-128
127
65535
-32768
32767
4.294.967.295 -2.147.483.648 2.147.483.647
4.294.967.295 -2.147.483.648 2.147.483.647
Tipos de datos enteros
Operaciones con enteros
Suma positivos
Decimal
Binario
+
46
11
57
11
-11
--11
Suma con signo
Decimal
25+23+22+21
23+21+20
+
25+24+23+20
00101110
00001011
00111001
+
46
-11
35
25+21+20
Negación
Suma con signo
Decimal
00001011
(00001011)+1
+
11110101
6
-11
-5
(11110101)+1
0
00001011
Binario
00101110
11110101
+
1
00100011
Binario
00000110
11110101
+
0
11111011
9
Tipos de datos enteros
Cambio de tamaño de un dato entero
Operación realizada
Ejemplos
sin signo,
nº bits creciente
Ampliar con 0s a
la izquierda
12 (8 bits) = 00001100
12 (16 bits) = 0000000000001100
con signo,
Ampliar con bit de signo a
nº bits creciente
la izquierda
-11 (8 bits) = 11110101
-11 (16 bits) = 1111111111110101
ambos,
nº bits decreciente
Truncamiento de la
parte superior (puede
perderse el valor)
258 (16 bits) = 0000000100000010
2 (8 bits) = 00000010
Tipos de datos enteros
ALU para suma de enteros
Sumador de 1 bit
Tabla de verdad
a
0
0
1
1
0
0
1
1
s
a
b
cin
cout
s
ALU de 1 bit (+, -, AND, OR)
binv
cin
op
a
b
0
1
2
0
1
cout
b
0
1
0
1
0
1
0
1
cin
0
0
0
0
1
1
1
1
cout
0
0
0
1
0
1
1
1
s
0
1
1
0
1
0
0
1
ALU de n bits
binv
op
cin
A
.
.
.
B
.
.
.
ALU0
ALU1
. . .
ALUn-1
Sumador de n bits
cin
S
.
.
.
s0
s1
sn-1
. . .
cout
A
.
.
.
B
.
.
.
a0
b0
a1
b1
an-1
bn-1
S
.
.
.
CF
OF
ZF
SF
10
Tipos de datos enteros
Importante:
Toda operación con enteros da como resultado otro entero:
si hay salida de rango, se produce un resultado válido
aunque no correcto.
Ej: char a=100,b=30,c;
c
Comentarios de: Lenguaje C (0)
No hay comentarios