el lenguaje de programaci on c (transparencias) · el lenguaje de programaci on c (transparencias)...
Post on 26-Apr-2020
19 Views
Preview:
TRANSCRIPT
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);
}
top related