El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias)...

Post on 26-Apr-2020

13 views 0 download

Transcript of El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias)...

El lenguaje de programacion C

(Transparencias)

(C) Javier Miranda 1996-2004Reservados todos los derechos

Esta coleccion de transparencias forma parte del contenidodel libro “Diseno de Software con C y UNIX (Volumen 1)”,

J.Miranda (1996), con ISBN 84-87526-45-4.

18 de febrero de 2004

1

El lenguaje de programacion C

18 de febrero de 2004Transp. 1

Historia

1965: Multics (MIT, General Electric, Laboratorios Bell).

1968: Thompson desarrolla Unix para DEC PDP-7 (8k, sin software).

1969: Thompson crea B.

1970: Thompson continua desarrollo de Unix sobre DEC PDP-11 (24k).

1971: Unix comienza a tener usuarios. Thompson desarrolla de NB.

1973: Creacion de C. Thompson reescribe Unix en C. Instala C en otras

arquitecturas.

1978: The C programming language. Kernighan, Ritchie. Johnsondesarrolla pcc.

1979: Johnson desarrolla lint.

1983: Creacion comite para creacion del estandar de C.

1989: C se convierte en estandar ISO/IEC 9899-1990

1986: Stroustrup crea C++.

El lenguaje de programacion C

18 de febrero de 2004Transp. 2

El compilador de C

Preprocesador

Compilador

Ensamblador

Ficherofuente

Otros ficheros

(include)

Ficheroobjeto

Ficheroejecutable

EnlazadorBibliotecasdel sistema

Ficherosobjeto delusuario

El lenguaje de programacion C

18 de febrero de 2004Transp. 3

El preprocesador de C

#undef#define NUM 15

.

.

.#undef NUM#define NUM 34

#define

* Macros simples

* Macros con parámetros

#define TOTAL 2*NUM/4

#define NUM 15

#define MENSAJE "El lenguaje C"

#define INTERCAMBIA(X,Y) {\\ int tmp = X;\\ X=Y;\\ Y=X;}

* Operador #

/* Numero de elementos */

#define ESCRIBE(X) printf(#X "=%d",X)

El lenguaje de programacion C

18 de febrero de 2004Transp. 4

El preprocesador de C

Compilación condicional(#if #ifdef #ifndef #else #elif #endif)

#define DEBUG 1

...

int distancia(...){ ...#if DEBUG printf(...);#endif ...}

int OUT(...){#ifdef INTEL ...#endif#ifdef VAX ...#endif...}

...#define INTEL

#line#line 300 "PRUEBA.PAS"......#line 301

#include#include "fichero.h"

#include <fichero.h>

El lenguaje de programacion C

18 de febrero de 2004Transp. 5

Introduccion

/* Ejemplo de introduccion a la programacion en C */

#include <stdio.h>

int Suma (a,b)

int a,b;

{ int tmp;

tmp = a + b;

return tmp;

}

void Resta(a,b,Resultado)

int a,b;

int *Resultado;

{

*Resultado = a - b;

}

int main()

{ int a,b = 0;

int Respuesta;

scanf("%d %d", &a, &b);

Respuesta = Suma(a,b);

printf("La suma de %d y %d es %d ", a, b, Respuesta);

Resta(a, b, &Respuesta);

printf("y la resta es %d\n", Respuesta);

exit (0);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 6

Tipos de datos y constantes

Tipos de datos

char

int

float

double

cualificadoresshortlongunsigned

Constantes

string

int

decimal

octal

hexadecimal

charascii

hexadecimal

float

Salto de línea \n

Tabulador horizontal

Tabulador vertical

Retorno de carro (CR)

Salto de página (FF)

Alarma

(LF)

\t

\v

\r

\f

\a

Barra invertida \\

Interrogación \?

Apóstrofo \’

Comillas \"

Secuencias de escape

octal

El lenguaje de programacion C

18 de febrero de 2004Transp. 7

Operadores

Operadores

Aritméticos + − * / %

Relacionales

Expresión condicional

Autoincremento, autodecremento ++ −−

Lógicos&& ||

nivel bits & | ^ << >> ~

!

< <= > >= == !=

AsignaciónMúltiple

Compuesta

a = b = c = d

a op= b

Operador coma e1 , e2

e1 ? e2 : e3

( ) [ ] −> .

* / %+ −

< <= > >=== !=

&^|

&&||?:

= += −= etc.,

Precedencia de operadores

<< >>

Asociatividad

! ~ ++ −− + − * & (tipo) sizeof()

El lenguaje de programacion C

18 de febrero de 2004Transp. 8

Ejemplo con operadores

main()

{ int a,b,c,d,e,max,abs;

char c;

a = - b + c * d / (e % f); /* Aritmeticos */

a = ((b > c) == (d <= e)); /* Relacionales */

a = ! ( (a && b) || c ); /* Logicos */

a = ~ ( (a & b) | c); /* Logicos nivel bit */

a++; /* Autoincremento */

b = ++a;

c = a++;

d = a--; /* Autodecremento */

a = b = c = d+e; /* Asignacion multiple */

a += 2; /* Asignacion compuesta */

a /= b + c;

max = (b>c) ? b : c ; /* Expresion condicional*/

abs = (a>0) ? a : -a ;

a = (b=2,c=3); /* Operador coma */

a = sizeof(b); /* Operador "sizeof()" */

c = (char) a; /* Conversion de tipos */

d = (int) c + d;

d = (int) (c+d);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 9

Control de flujo

Controlde flujo

if (expresión) sentencia[else sentencia]

*

switch (expresión) { case expresión−constante: sentencia } [ default: sentencia ]

{

}

*

while (expresión) sentencia

*

do sentenciawhile (expresión)

*

for (expresión−1; expresión−2; expresión−3) sentencia

*

break*

continue*

goto *

El lenguaje de programacion C

18 de febrero de 2004Transp. 10

Funciones

int f1(s) /* Formato K&R */

char s[];

{

float f2(int,float);

...

if (...)

return(0);

...

}

float f2(int a, float b) /* Formato ANSI-C */

{

...

if (a>0)

f2(a,b);

...

}

main()

{

...

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 11

Variables

Fichero 1:

int a,b; /* Externa */

extern char c; /* Externa definida en otro fichero */

static char d; /* Estatica externa */

int f1() /* Externa */

{

int c; /* Automatica */

static char d; /* Interna estatica */

extern float e; /* Externa definida en otro fichero */

...

}

Fichero 2:

char c; /* Externa */

float e; /* Externa */

static int f2() /* Externa estatica */

{

register i; /* Registro */

...

{

int i; /* Automatica */

...

}

...

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 12

EJEMPLO.ADA EJEMPLO.C

package ejemplo is

a,b,c:integer; int a,b,c;

static int d,e;

function f1(x,y:integer) int f1(int x,y)

return integer; {

... int aux;

end ejemplo; ...

}

package body ejemplo is

d,e:integer; static void p1(char z)

{

function f1(x,y:integer) ...

return integer is {

aux:integer; register i;

begin

... for (i=1;i<n;i++) {

end; ...

}

procedure p1(z:character) is }

begin ...

... }

for i in 1..N loop

...

end loop;

...

end;

end;

El lenguaje de programacion C

18 de febrero de 2004Transp. 13

Entrada/Salida

#include <stdio.h>

main()

{

char ch = \’{A}’;

char *p = &ch;

int n = 1234;

int m = 0;

float f = 3.1416;

char s1[50],s2[50],s3[50];

/* Entrada/Salida basica */

putchar(’\n’);

ch=getchar();

/* Entrada/Salida formateada */

printf("Entero %d, Octal %o, Hexadecimal %x, ",n,n,n);

printf("Caracter \’%c\’, ",ch);

printf("Doble %f, Puntero %p\n",f,p);

printf("Introduce un numero: ");

scanf("%d",&n);

ch=getchar();

printf("Correcto (S/N) ?");

ch=getchar();

sprintf(s1,"Pongo %d en la string",n);

sscanf(s1,"%s %d %s",s2,&n,s3);

printf("%s %d %s\n",s2,n,s3);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 14

Estructuras de datos

Sinonimo (alias)

typedef int longitud;

typedef char string;

...

int maxlen,auxlen; longitud maxlen,auxlen;

char nombre[20]; string nombre[20];

Enumerado

Declaracion

enum boolean {FALSE,TRUE};

enum meses {ENE = 1, FEB, MAR, ABR, MAY, JUN,

JUL, AGO, SEP, OCT, NOV, DIC };

enum escapes {NEWLINE = ’\n’, BACKSPACE = ’\b’};

boolean b;

meses tabla[23];

Acceso

b = FALSE;

tabla[12] = OCT;

El lenguaje de programacion C

18 de febrero de 2004Transp. 15

Estructuras de datos

Array

Declaracion

int a[25]

char s[]="123"; /*char s[]={’1’,’2’,’3’,’\0’}*/

int lista[3] = {12,4,-2};

int tabla[2][4] = { {1,2,3,4},

{5,6,7,8} };

Acceso

s[0]

lista[2]

tabla[i][j]

El lenguaje de programacion C

18 de febrero de 2004Transp. 16

Estructuras de datos

Estructura (Registro)

Declaracion

struct fecha {

int dia;

struct { int mes;

int id; int anyo;

char nombre[20]; }

struct {

int dia; struct info {

int mes; int id;

int anyo; char nombre[20];

} fecha_ingreso; struct fecha fecha_ingreso;

} x,empleados[30]; }

struct info x,empleados[30];

Acceso

x.id

empleados[i].nombre;

empleados[i].fecha_ingreso.dia

El lenguaje de programacion C

18 de febrero de 2004Transp. 17

Estructuras de datos

Union

union u_tag {

int i;

float f;

char c;

}

Campos de bit

#define INTERRUPCION 1 struct {

#define DMA 2 unsigned interrupcion :1;

#define MOTOR_ON 4 unsigned dma :1;

unsigned motor_on :1;

} control;

main() {

int control; main()

{

flags |= INTERRUPCION; control.interrupcion = 1;

flags &= ~DMA); control.dma = 0;

} }

El lenguaje de programacion C

18 de febrero de 2004Transp. 18

Punteros

void swap(px,py)

int *px,*py;

{

int tmp;

tmp = *px;

*px = *py;

*py = tmp;

}

main()

{

int x,y;

int *p1;

int *p2 = 0; /* NULL */

int **p3;

void swap();

x = 27;

p1 = &x;

y = *p1;

y = *p1 + 1;

printf("%d\n", *p1);

*p1 = 0;

*p1 += 1;

(*p1)++;

if (p2 != p1)

p2 = p1;

*p3 = p1;

swap(&y,*p3);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 19

Punteros: arrays y funciones

struct registro_persona {

char nombre[15];

int dia,mes,anyo;

}

void f(tabla);

int tabla[2][4]; /* int tabla[][4] o int(*tabla)[4] */

{

...

}

main()

{

struct registro_persona tabla[18];

struct registro_persona *ptr, aux;

int matriz[2][4];

int i;

int (*fnc)();

ptr = &tabla;

aux = *ptr;

aux = *(ptr+3); /* Cuidado con (*ptr+3) */

ptr++;

i = ptr->dia; /* (*ptr).dia */

f(matriz);

fnc = &f;

(*fnc)(matriz);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 20

Punteros: strlen()

strlen(s) /* VERSION 1 */

char s[];

{ int n;

for (n=0; s[n] != ’\0’; n++);

return(n);

}

strlen(s) /* VERSION 2 */

char *s;

{ int n;

for (n=0; *s != ’\0’; s++, n++);

return(n);

}

strlen(s) /* VERSION 3 */

char *s;

{ char *p = s;

while (*p != ’\0’) p++;

return(p-s);

}

strlen(s) /* VERSION 4 */

char *s;

{ char *p = s;

while (*p) p++;

return(p-s);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 21

Parametros lınea comandos

main(argc, argv) /* Version 1 */

int argc;

char *argv[];

{

int i;

for (i=1;i<argc;i++)

/* Procesar argv[i] */

}

main(argc, argv) /* Version 2 */

int argc;

char **argv;

{

while (--argc) {

/* Procesar *argv */

/* argv++ */

}

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 22

Tratamiento de ficheros

#include <stdio.h>

main(int argc, char *argv[])

{

FILE *f1,*f2;

int c;

if (argc != 3) {

fprintf(stderr,"Sintaxis: copy origen destino\n");

exit(1);

}

if ( (f1 = fopen(argv[1],"r")) == NULL) {

fprintf(stderr,"ERROR: Fichero ’%s’ inexistente.",argv[1]);

exit(2);

}

if ( (f2 = fopen(argv[2],"w")) == NULL) {

fprintf(stderr,"ERROR:No puedo crear ’%s’.",argv[1]);

exit(2);

}

while ( (c= getc(f1)) != EOF )

putc(c,f2);

fclose(f1);

fclose(f2);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 23

Errores frecuentes de losprogramadores de C

1. Realizar una comparacion con =.

if (i=3) return 1;

else return 0;

2. Anidar comentarios.

/* Comento este fragmento de codigo

if (a==4) /* Si elijo la opcion 4 */

f(a);

*/

3. Anadir ; al final de una sentencia de control de flujo.

while (i<100);

s=s+a[i];

4. Indentar mal el programa.

if (a) if (a)

if (b) j = 1;

f(); k = 0;

else

g();

int* ptr1, ptr2;

5. Utilizar mal los operadores de autoincremento/autodecremento.

a[i++] = i++;

6. Equivocar el orden de evaluacion de expresiones.

if (fp=fopen(fichero,"r") == NULL)

return (NULL);

El lenguaje de programacion C

18 de febrero de 2004Transp. 24

Errores frecuentes de losprogramadores de C

7. Pasar el valor de una variable en vez de su direccion.

scanf("%d",i);

8. Sobrepasar el lımite de un array.

9. Confundir “\n” con’\n’.

10. Declarar mal los parametros de una funcion.

invertir(str)

{

char *str;

...

}

11. Especificar un directorio mediante .

fopen("~/datos.dat","r");

12. Utilizar un puntero sin haberle asignado memoria.

char *respuesta;

...

gets(respuesta);

El lenguaje de programacion C

18 de febrero de 2004Transp. 25

¿ Donde esta el error ?

Programa 1:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i;

for (i=0;i<10;i=i+1);

printf("i vale %d\n",i);

}

Programa 2:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i,numeros[10];

for (i=1;i<=10;i++)

numeros[i]=i;

for (i=1;i<=10;i++)

printf("numeros[%d]=%d\n", i, numeros[i]);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 26

¿ Donde esta el error ?

Programa 3:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i;

for (i=0;i<10;i=i+1)

if (i=2)

printf("i vale 2\n");

else

printf("i no vale 2\n");

}

Programa 4:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i;

for (i=0;i<10;i=i+1)

switch (i) {

case 0: printf("i vale 0\n");

case 1: printf("i vale 1\n");

default: printf("i es mayor que 1\n");

}

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 27

Programacion de estructuras de datosdinamicas con C

Existen dos formas de declarar el nodo:

• Metodo 1:

struct nodo {

int info;

struct nodo *siguiente;

}

• Metodo 2:

typedef struct nodo Nodo;

typedef Nodo *PtrNodo;

struct nodo {

int info;

PtrNodo siguiente;

};

Debe utilizarse la biblioteca stdlib (#include<stdlib>) para tener

acceso a:

void *malloc(int Numero_bytes)

void free(void *p)

El lenguaje de programacion C

18 de febrero de 2004Transp. 28

Pila (LIFO)

#define PILA_VACIA -99999

PtrNodo top = NULL;

void Push(int n)

{ PtrNodo p;

p = (PtrNodo) malloc (sizeof(Nodo));

p->info = n;

p->siguiente = top;

top = p;

}

int Pop()

{ int aux_n;

PtrNodo aux_p;

if (top) {

aux_n = top->info;

aux_p = top;

top = top->siguiente;

free(aux_p);

return(aux_n);

}

return(PILA_VACIA);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 29

Cola (FIFO)

#define COLA_VACIA -99999

PtrNodo primero, ultimo = NULL;

void Insertar(int n)

{ PtrNodo p;

p = (PtrNodo) malloc (sizeof(Nodo));

p->info = n;

p->siguiente = NULL;

if (!primero)

ultimo = primero = p;

else {

ultimo->siguiente = p;

ultimo = p;

}

}

int Extraer()

{ int n;

PtrNodo p_aux;

if (!primero)

return(COLA_VACIA);

else {

n = primero->info;

p_aux = primero->siguiente;

free(primero);

primero = p_aux;

if (!primero)

ultimo=NULL; /* La cola queda vacia */

return(n);

}

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 30

Lista simplemente encadenada

PtrNodo primero=NULL;

void Insertar(int n)

{ PtrNodo aux_p, anterior, nuevo;

nuevo = (PtrNodo) malloc (sizeof(Nodo));

nuevo->info = n;

if (!primero) { /*Lista vacia*/

nuevo->siguiente=NULL;

primero = nuevo;

return;

} else {

anterior = NULL;

aux_p = primero;

while (aux_p) {

if (aux_p->info < n) { /*Busqueda*/

anterior = aux_p;

aux_p = aux_p->siguiente;

} else

if (!anterior) { /*Ins. principio*/

nuevo->siguiente = primero;

primero = nuevo;

return;

} else {

anterior->siguiente = nuevo; /*Ins. medio*/

nuevo->siguiente = aux_p;

return;

}

}

anterior->siguiente = nuevo; /* Ins. final */

nuevo->siguiente = NULL;

return;

}

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 31

Lista simplemente encadenada

PtrNodo Buscar(int n,PtrNodo *anterior)

{ PtrNodo aux_p;

*anterior=NULL;

if (!primero) return(NULL);

aux_p = primero;

while (aux_p->info != n) {

*anterior = aux_p;

aux_p = aux_p->siguiente;

if (!aux_p) return(NULL);

}

return(aux_p);

}

int Borrar(int n)

{

PtrNodo aux_p,anterior;

aux_p = Buscar(n, &anterior);

if (!aux_p) return (0);

if (!anterior) { /*Era el primero*/

primero = aux_p->siguiente;

free(aux_p);

} else { /*No era el primero*/

anterior->siguiente = aux_p->siguiente;

free(aux_p);

}

return(1);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 32

Lista doblemente encadenada

PtrNodo primero, ultimo = NULL;

Insertar(int n)

{ PtrNodo aux_p, anterior, nuevo;

nuevo = (PtrNodo) malloc (sizeof(Nodo));

nuevo->info = n;

if (!primero) { /* Lista vacia /*

nuevo->izquierda = NULL;

nuevo->derecha = NULL;

primero = nuevo;

ultimo = nuevo;

return;

}

aux_p = primero;

while(aux_p)

if (aux_p->info < n)

aux_p = aux_p->next;

else

if (aux_p == primero) { /* Ins. al principio */

nuevo->izquierda = NULL;

nuevo->derecha = primero;

primero->izquierda = nuevo;

primero = nuevo;

return;

} else { /* Ins. en medio */

nuevo->izquierda = aux_p->izquierda;

nuevo->derecha = aux_p;

aux_p->izquierda = nuevo;

nuevo->izquierda->derecha=nuevo;

return;

}

ultimo->derecha = nuevo; /* Ins. al final */

nuevo->izquierda = ultimo;

nuevo->derecha = NULL;

ultimo = nuevo;

return;

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 33

Arbol binario

Recorrido in order iterativo

void r_in_order (PtrNodo p)

{

PtrNodo PILA[MAX_NODOS];

do {

while (p) {

Push(p);

p=p->left;

}

p=Pop;

visitar(p);

p=p->right;

} while (PILA<>{0});

}

Recorrido in order recursivo

void r_in_order (PtrNodo p)

{

if (p->left)

r_in_order(p->left);

printf("%d ",p->info); /*Visitar(p)*/

if (p->right)

r_in_order(p->right);

}

El lenguaje de programacion C

18 de febrero de 2004Transp. 34

Arbol binario

int Insertar(int n)

{ PtrNodo padre,nuevo,aux_p;

int dir;

nuevo = (PtrNodo) malloc (sizeof(Nodo));

nuevo->info = n;

nuevo->izquierda = NULL;

nuevo->derecha = NULL;

if (!raiz) { /*Arbol vacio*/

raiz = nuevo;

return(1);

}

aux_p = raiz;

do {

if (n == aux_p->info)

free(nuevo);

return(0); /*clave duplicada*/

else {

padre=aux_p;

if (n < aux_p->info) {

aux_p = aux_p->izquierda;

dir=0;

} else {

aux_p = aux_p->derecha;

dir=1;

}

}

} while (aux_p);

if (dir == 0)

padre->izquierda=nuevo;

else

padre->derecha=nuevo;

return(1);

}