Está en la página 1de 11

Revisión de lenguaje C

• Compilador cruzado
O1... .obj

main () { 01....1
compilador enlazador
} O1... .o

ejemplo.c ejemplo.obj ejemplo.exe

Revisión de lenguaje C
• Tipos Básicos
char (8 bits) int (16 bits) long (32 bits) float(32 bits)
• Tipo unsigned (muy útil en programación de micros.)
• Tipo bit (µP 51)
• Conversiones:
Hexadecimal (x) Agrupaciones de 4 bits ==> 0x
Octal (o) Agrupaciones de 3 bits ==> 0o
Decimal (--)
• Operadores + , - , * , % , / , ++ , --
• Precedencia ++ , -- , * , / , % , + , -
• Comentarios /* esto es un comentario */
• Formato numérico %d imprime como decimal entero
%6d decimal de 6 caracteres
%f imprime como punto flotante (real)
%f6.2 real de 6 caracteres y 2 decimales

Tema 1 1
Revisión de lenguaje C
• Enteros de 8 bits (tipo char)
Rango : 0 ----> 255 (unsigned)
00---> 0xFF Hexadecimal
Rango : 0 ---> 127, -128 ---> -1 (signed)
00 --> 0x7F, 80 ----> 0xFF Hexadecimal
• Complemento a dos (C2):
Positivos: 0 ---> 2 n-1 - 1 (127 con 8 bits)
Negativos: -1 ---> - 2 n-1 1 (-128 con 8 bits)

main() {
char c;
c = 127;
c += 3;
printf (“%c”,c); -------------->(-126) !!
}

• Se ve que: 1 -1 = 1 +(-1) = 01H + FFH = 100 H = 0 (en 8 bits !!) 3

Revisión de lenguaje C
• Enteros de 16 bits (tipo int)
Rango : 0 ----> 64K (65535unsigned)
00---> 0xFFFF Hexadecimal
Rango : 0 ---> 32767, -32768 ---> -1 (signed)
00 --> 0x7FFF, 0x8000 ----> 0xFFFF Hexadecimal
• Complemento a dos (C2). Igual que con 8 bits
Positivos: 0 ---> 2 n-1 - 1 (32767 con 16 bits)
Negativos: -1 ---> - 2 n-1 1 (-32768 con 16 bits)

• Conversión a complemento a uno 0´s por 1´s y viceversa.


00 --> FF 7F --> 80
• Conversión a complemento a dos (C2) --> Complemento a 1 + 1 = C2
=> 01H = FE + 1 = FF (8 bits) =>-1
=> 0001H = FFFE + 1 = FFFF (16 bits) =>-1
4

Tema 1 2
Revisión de lenguaje C

• Dimensionado :
– sizeof (char) = 1
– sizeof (int) = 2 (4 en Windows95/Linux)

• Reales :
– float
– double
– long double

• Expresiones con enteros :


– Valor de una variable Y, (con X = 5) :
Y = X++; ---> 5
Y = ++X; ---> 6 Equivale a Y = X + 1;

Revisión de lenguaje C
• Estructuras de Control de Flujo:

if (e) { if (e1) { switch (e)


} } case const1:
else if (e2) { break;
case const2:
} break;
else { } default:
}

while (e) {
}

for(init ; test ; fin){


}
6

Tema 1 3
Revisión de lenguaje C
• Cadenas de caracteres (string):
– Sirven para almacenar texto.
– Por cada carácter se necesitan 8 bits.
– Codificación estándar en caracteres tipo ASCII, alfanúmericos y de control.
– Letras : ‘A’ -----> ‘Z’ Números : ‘0’ ---> ‘9’
0x41 -----> 0x30 ---> 0x39
– Restantes : caracteres no alfanúmericos --> ‘:’ , ‘[‘, ‘>’. ....
– Y de control ^S, .. ^Q.... (algunos no son representables en pantalla).

• Representación de cadenas de caracteres en C:


– Secuencia de caracteres ASCII terminada en 0 (‘/0’).
– Ejemplo:
‘A’ ’B’ ’C’ ’/0’ ===> “ABC”

Revisión de lenguaje C
• Ejemplo: Sumar los caracteres de una cadena.
# define MAXCAD 80
main() {
int total,i;
char cadena[MAXCAD];
cadena = gets (cadena);
total=0;
for(i=0; cadena[i]!=‘\0’ ; i++)
total += cadena[i];
}
Notas: gets:
– no reserva espacio para la cadena => lo hacemos con char cadena[MAXCAD]
– devuelve un char *. Prototipo char *gets(char *)
– rellena hasta ‘\n’ y pone ‘/0’ al final.
– devuelve lo mismo que recibe. Usar NULL si hay problemas:
if ((ps = gets(cadena)) == NULL) {
print(“error”);
exit(1) 8

Tema 1 4
Revisión de lenguaje C
• Ejemplo: Copia de una cadena.
{
char *strcpy (char to[ ], char from [ ])
int i; }
i = 0;
while ((to[i] = from[i]) != ‘\0’)
i++;
return to;
}
Notas:
– Se copia el ‘\0’ ? ==> Si se hace antes de !=

Revisión de lenguaje C
Operadores

• booleanos =0 ==0
• lógicos && || !
• relacionales > < >= <= == !=
• aritméticos * / % + -
• desplazamiento << >>
• bit & ^ |
• de asignación = += -= *= /= %=
&= |= <<= >>=

10

Tema 1 5
Revisión de lenguaje C

• Ejemplo: digito = 0; blanco = 0; otro =0;


for(i=0; c=cadena[i]; i++) {
if( c>= ‘0’ && c<= ‘9)
digito++;
else if( c== ‘ ‘ || c==‘\n’ || c==‘\t’)
blanco++;
else
otro++
}

11

Revisión de lenguaje C
• Ejemplo: #define MAXLINEA 80
main () {
char c,cadena[MAXLINEA], *ps;
int digito,blanco,otro;
if((ps=gets(cadena))==NULL) {
printf(“error”);
exit(1);
}
digito = 0; blanco = 0; otro =0;
for(i=0; c=cadena[i]; i++)
if( c>= ‘0’ && c<= ‘9) {
digito++;
}
else if( c== ‘ ‘ || c==‘\n’ || c==‘\t’) {
blanco++;
}
else {
otro++
}
}
}
¡ gets no incuuye el ‘\n’ del final | 12

Tema 1 6
Revisión de lenguaje C
• FUNCION strtok
char *strok(s,ct) secuencia de ejecución:
1o- llamada: p= strtok(s,” “);
devuelve puntero al 1er token
2o- llamada p==strtok (NULL,” “);
resto de llamadas igual
• Ejemplo #define MAXLINEA 100
main () {
char s[MAXLINEA], * ps;
printf(“Introduce linea ”);
if((ps=gets(s))==NULL) {
printf(“error”);
exit(1);
}
ps=strtok(s,” “);
while (ps != NULL) {
printf(“%d”, atoi(ps));
ps=strtok(NULL,” “);
}
printf(“\n”);
13
}

Revisión de lenguaje C
• FUNCIONES atoi, itoa <==> Cadena a entero y viceversa.

int atoi (char s[ ]) {


int i, n;
n = 0;
for (i=0; s[i] >= ‘0’ && s[i] <= ‘9’; i++)
n = 10 *n + (s[i] - ‘0’);
return n;
}

char *itoa (int n, char s[ ]) {


int i;
i = 0;
do {
s[i++] = n%10 + ‘0’;
} while ((n/= 10 ) > 0);
s[i ] = ‘\0’;
return s;
}
14

Tema 1 7
Revisión de lenguaje C

• MODULOS Y FICHEROS DEL TIPO .h (header)


Todo proyecto de programación se genera por módulos.
Las funciones, tipos y macros de la librería estandar son declarados en headers:
<assert.h> <float.h> <math.h> <starg.h> <stdlib.h> <ctype.h> <limits.h>
<setjmp.h> <stddef.h> <string.h> <errno.h> <locale.h> <signal.h> <stdio.h>
<time.h>

Y se acceden del siguiente modo:


#include <header>

:
milib.h

ejemplo.c milib.c

15

Revisión de lenguaje C

milib.h

ejemplo.c milib.c

• “milib.h” esta al mismo nivel (directorio) de “ejemplo.c” y “milib.c”.


• Se genera un proyecto [Open Project] ==>(ejemplo.prj).
• La herramienta compila “ejemplo.c” y “milib.c” por separado, enlaza y forma el “ejemplo.exe”.
#ifndef milib.h
#define milib.h
#define MAXLINEA 100
int atoi (char *PS);
#endif
– en el fichero.h solo hay define y prototipos
– en los ficheros.c se colocan # includes
– se colocan #ifndef en la cabecera y terminación del fichero.h 16

Tema 1 8
Revisión de lenguaje C

• FUNCIONES
– DISMINUIR LA COMPLEJIDAD DE LOS PROGRAMAS.
– DIVISION DE TAREAS (Entre programadores por ejemplo).
– DESARROLLO Y REUTILIZACIÓN POR MÓDULOS .
– AYUDA A UNA MEJOR DEPURACIÓN.
– CREACIÓN DE BIBLIOTECAS.

• ESTRUCTURA
– ARGUMENTOS, CUERPO Y SALIDA
– Ejemplo:

double Cuad(double x)
{
return x*x;
}

17

Revisión de lenguaje C

• FUNCIONES. (salida y argumentos)

– return expresión
– Funciones que no devuelven nada
void
return;
– Funciones sin argumentos:
int getchar (void);
– Funciones con vectores, cadenas y matrices
tipo_devuelto NombreFunción(tipo nombre_vector[])

18

Tema 1 9
Revisión de lenguaje C

• PUNTEROS
– Los punteros almacenan direcciones de memoria y son parte de la potencia del lenguaje C.

– Entre otras cosas, permiten trabajar con vectores y matrices de tamaño variable, es decir, se
pueden ajustar su tamaño dinámicamente
– Se pueden definir estructuras de datos complejas.
– Permiten trabajar con funciones que devuelvan más de un valor.

– DECLARACIÓN:

int a; declaración de una variable entero, almacena valores enteros.


int *p; declaración de una variable puntero, almacena direcciones de memoria
int *pti; el dato almacenado en la dirección de memoria es un entero
double *ptd; el dato almacenado en la dirección de memoria es un double

19

Revisión de lenguaje C
• PUNTEROS. Operadores sobre punteros
– Los punteros almacenan en su inicio un valor desconocido -> apuntan a una dirección
aleatoria.
– OPERADOR UNARIO & (obtiene la dirección de memoria de una variable)
int x; /* variable entera */
int *pti; /* `puntero a entero */

x=128; /* inicialización de x */
pti=&x; /* pti apunta a la dirección donde se localiza x, es decir, obtiene
la dirección de memoria y es un entero, puesto que x es entero*/

– OPERADOR UNARIO * (permite acceder a la variable por medio del puntero)


int x; /* variable entera */
int *pti; /* `puntero a entero */

pti=&x; /* pti apunta a x */


*pti=128; /* es lo mismo que hacer x=128 */

20

Tema 1 10
Revisión de lenguaje C
• PUNTEROS. Operaciones con punteros
– Los punteros permiten hacer operaciones de suma y diferencia.
– Existen dos tipos de operación diferenciados:

*pti+=8; /* suma 8 al entero que apunta a pti, el puntero sigue apuntando al mismo sitio */
pti+=8; /* suma 8 posiciones de memoria a la dirección que apunta pti */

– ES IMPORTANTE SABER COMO HACER OPERACIONES CON PUNTEROS !!

La utilización del puntero sin el operador *, es peligroso, pues se incrementa la dirección de


memoria.

– Punteros y funciones
void cambio(int *a, int*b) /*la función recibe las direcciones de 2 variables*/

cambio(&x,&y) /llamada a la función con el operador de dirección*/

21

Tema 1 11

También podría gustarte