Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Marta Zorrilla
Universidad de Cantabria
Introduccin al C
Objetivos:
Contenidos:
1. La historia del C.
2. Caractersticas.
3. Mi primer programa en C.
2
Historia del C
Caractersticas del C
Inconvenientes del C
Primer programa en C
/* Ejemplo 1. Programa DOCENA.C */
#include <stdio.h>
main ()
{
int docena;
docena = 12;
printf ("Una docena son %d unidades\n", docena);
}
Segundo programa en C
/* Ejemplo 1. Programa saludo.c*/
#include <stdio.h>
#define MENSAJE alumnos
/*prototipo funciones*/
int imprimir_saludo (char * destino);
int main (void)
{
int error=0;
error=imprimir_saludo (MENSAJE);
return(0);
}
int imprimir_saludo (char * destino)
{
printf (hola %s \n", destino);
return(0);
}
7
Modelo de compilacin C
10
Ejercicio
#include <stdio.h>
int cuadrado (int);
int main (void)
{
int lado2, lado1;
printf ("dame lado del cuadrado 1:");
scanf( "%d",&lado1);
printf ("dame lado del cuadrado 2:");
scanf(" %d",&lado2);
printf ("El resultado de la diferencia es %d", cuadrado(lado1)-cuadrado(lado2));
return(0);
}
int cuadrado (int lado)
{
return(lado*lado);
}
11
Elementos de un programa
en C
12
Elementos de un programa C
Objetivos:
Contenidos:
1. Comentarios
2. Identificadores y palabras reservadas
3. Constantes
4. Variables y tipos de dato
5. Escritura de datos con printf()
6. Lectura de datos con scanf()
13
Elementos de un programa C
Comentarios
15
Identificador
Empezar por
Empezar por un nmero
Utilizar la "
Ejemplos vlidos:
numero
area_circulo
valor_1
16
Palabras reservadas
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
Variables
18
PALABRA
RESERVADA
TAMAO EN
BYTES
sin valor
void
carcter
char
int
float
double
entero
19
Tipo
char
int
short
long
Rango
Ocupa
unsigned
0 a 255
1 byte
signed
-128 a 127
1 byte
unsigned
0 a 65.535
2 bytes
signed
-32.768 a 32.767
2 bytes
unsigned
0 a 4.294.967.295
4 bytes
signed
float
3,4*10-38 a 3,4*10+38
4 bytes
double
1,7*10-308 a 1,7*10+308
8 bytes
3,4*10-4932 a 1,1*10+4932
10 bytes
long
Declaracin de variables
Ejemplos:
int a, b, c;
float numero_1, numero_2;
char letra;
unsigned long entero;
21
Tipos definidos
Sintaxis:
typedef tipo_basico nombre;
Declaracin :
typedef float Kg;
typedef float Mts;
La funcin printf()
Formato:
printf(formato, argumentos);
Ejemplos:
printf("Hola mundo\n");
printf("El numero 28 es %d\n", 28);
printf("Imprimir %c %d %f\n", 'a', 28, 3.0e+8);
23
La funcin printf() (y 2)
Formatos.
TIPO DE
ARGUMENTO
Numrico
Carcter
Punteros
CARCTER
DE FORMATO
%d
%i
%o
%u
%x
%X
%f
%e
%g
%E
%G
%c
%s
%%
%n
%p
FORMATO DE
SALIDA
signed decimal int
signed decimal int
unsigned octal int
unsigned decimal int
unsigned hexadecimal int (con a, ..., f)
unsigned hexadecimal int (con A, ..., F)
[-]dddd.dddd
[-]d.dddd o bien e[+/-]ddd
el ms corto de %e y %f
[-]d.dddd o bien E[+/-]ddd
el ms corto de %E y %f
carcter simple
cadena de caracteres
el carcter %
se refieren a punteros y se
estudiarn en el Captulo 14
7
24
La funcin printf() (y 3)
Secuencias de escape.
CARCTER BARRA
SIGNIFICADO
\a
Alarma (Beep)
\b
Retroceso (BS)
\t
\n
\v
\f
\r
Retorno
\"
Comillas dobles
\'
Comilla simple
\\
Barra invertida
25
La funcin printf (y 4)
26
Funcin scanf()
scanf(formato, argumentos);
Ejemplos:
scanf("%f", &numero);
&
scanf("%c\n", &letra);
scanf("%f %d %c", &real, &entero, &letra);
scanf("%ld", &entero_largo);
no &
scanf("%s", cadena);
27
Funcin scanf() (y 2)
Comenzar
ESCRIBIR
Dame numero
LEER
numero
cuadrado=numero * numero
int numero;
int cuadrado;
ESCRIBIR
numero y cuadrado
printf("Introduzca un numero:");
scanf("%d", &numero);
FIN
cuadrado = numero * numero;
printf("El cuadrado de %d es %d\n", numero,cuadrado);
28
Constantes simblicas
PI 3.141593
CIERTO 1
FALSO 0
AMIGA "Marta"
no acaba en ;
29
Constantes o literales
Caracteres:
Valores enteros:
Ejemplo.
#include <stdio.h>
#define PI 3.141593
void main()
{
float radio;
float area;
printf("Introduzca el radio: ");
scanf("%f", &radio);
area = PI * radio * radio;
printf("El area del circulo es %5.4f \n", area);
}
Comenzar
PI =3.141593
ESCRIBIR
Dame radio
LEER radio
ESCRIBIR
area
FIN
31
Ejercicios
Encuentra errores
include studio.h
/* Programa que dice cuntos das hay en una semana /*
main {}
(
int d
d := 7;
print (Hay d das en una semana);
32
Ejercicios
33
Operadores y expresiones
34
Operadores y expresiones
Objetivos:
Contenidos:
1. Expresiones y sentencias
2. Operador asignacin. Conversin de tipos
3. Operadores aritmticos
4. Operadores relacionales
5. Operadores lgicos
6. Operadores de asignacin compuestos
7. Precedencia
35
Expresiones y sentencias
printf()
Ej.
Ej.
4+5
Operador de asignacin
Asignaciones mltiples:
id_1 = id_2 = ... = expresin
Reglas de asignacin
38
Conversin de tipos
(tipo de dato) expresin
int x;
x = 5;
y = x / 2;
no se asigna a y el valor 2.5, sino 2, ya que los parntesis que envuelven a la expresin
x / 2 hacen que primero se efecte la divisin entera y luego la conversin a flotante
39
Operadores aritmticos
Divisin entera ( / ): divisin de una cantidad entera por otra se desprecia la parte
decimal del cociente.
El operador % requiere que los dos operandos sean enteros.
La mayora de las versiones de C asignan al resto el mismo signo del primer operando.
Valores negativos con el signo OPERADOR
UNARIOS
BINARIOS
DESCRIPCIN
Cambio de signo
--
Decremento
++
Incremento
Resta
Suma
Producto
Divisin
40
Ejemplo
int x, y;
x = 9;
y = 2;
La expresin
es equivalente a
i++;
++i;
i--;
--i;
i
i
i
i
=
=
=
=
i
i
i
i
+ 1;
+ 1;
- 1;
- 1;
=
=
=
=
%d
%d
%d
%d
\n",
\n",
\n",
\n",
Imprime:
a);
++a);
a++);
a);
a
a
a
a
=
=
=
=
1
2
2
3
42
Operadores relacionales
Se utilizan para formar expresiones lgicas.
El resultado es un valor entero que puede ser:
cierto, se representa con un 1
falso, se representa con un 0
BINARIOS
Ejemplo 1: Si a = 1 y b = 2
Expresin
a<b
a>b
(a + b) ! = 3
a == b
a == 1
Valor
1
0
0
0
1
Interpretacin
cierto
falso
falso
falso
cierto
OPERADOR
DESCRIPCIN
>
Mayor que
>=
<
Menor que
<=
==
Igual que
!=
Diferente que
43
Operadores lgicos
Actan sobre operandos que son a su vez expresiones lgicas que se
interpretan como:
cierto, cualquier valor distinto de 0
falso, el valor 0
Tabla de verdad
a
!a
a && b
a || b
OPERADOR DESCRIPCIN
UNARIOS
BINARIOS
!
&&
||
not
and
or
44
Ejemplo
Ejemplos:
si a = 7 y b = 3
Expresin
(a + b) < 10
!((a + b) < 10)
(a ! = 2) || ((a +b) <= 10)
(a > 4) && (b < 5)
Valor
0
1
1
1
Interpretacin
falso
cierto
cierto
cierto
45
Operadores de asignacin
compuestos
Marta Zorrilla Universidad de Cantabria
m = m * 5;
m += b;
m = m + b;
m += y - 3;
m = m + y - 3;
m - = (y = 5);
m = m - (y = 5);
46
Precedencia
Evaluacin a
igual nivel de
prioridad
Nivel de
prioridad
Operadores
()
[]
->
++
--
<<
<
==
&
10
11
&&
12
||
13
?:
14
operadores de asignacin
15
(cast)
* & sizeof
>>
<=
>
>=
!=
47
Ejercicios
contador
dias2
b) CONTADOR c) _hola
d) hola_
f) 2dias
g) Suma_Total h) Suma-Total
Ejemplo
Programa que convierte grados Fahrenheit a grados centgrados.
C = (5/9) * (F - 32)
#include <stdio.h>
void main()
{
float centigrados;
float fahrenheit;
49
ERRORES COMUNES
50
Funciones
51
Introduccin a funciones
Objetivos:
Contenidos:
52
Introduccin
53
void explicacion(void)
54
Declaracin de funciones:
prototipos
55
Llamadas a funciones
nombre_func (var1,var2,,varN);
Constantes.
Variables simples.
Expresiones complejas.
56
En las llamadas por valor se hace una copia del valor del
argumento en el parmetro formal.
La funcin opera internamente con estos ltimos.
Como las variables locales a una funcin (y los parmetros
formales lo son) se crean al entrar a la funcin y se
destruyen al salir de ella, cualquier cambio realizado por la
funcin en los parmetros formales no tiene ningn efecto
sobre los argumentos.
57
Ejemplo
Programa que calcula el mximo de dos nmeros.
58
Ejemplo:
#include <math.h>
float potencia (float x, int y); /* prototipo */
float potencia (float x, int y) /* definicin */
{
int i;
float prod = 1;
prod = pow(x,y);
return(prod);
}
59
Ejemplo 3
#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
void explicacion(void);
int cuadrado_perfecto(int x);
void main()
{
int n, perfecto;
explicacion();
scanf("%d", &n);
perfecto = cuadrado_perfecto(n);
if (perfecto)
printf("%d es cuadrado perfecto.\n", n);
else
printf("%d no es cuadrado perfecto.\n", n);
}
60
Ejemplo 3 - Continuacin
void explicacion(void)
{
printf("Este programa dice si un numero ");
printf("es cuadrado perfecto \n");
printf("Introduzca un numero: );
}
int cuadrado_perfecto(int x)
{
int raiz;
int perfecto;
raiz = (int) sqrt(x);
if (x == raiz * raiz)
perfecto = TRUE; /* cuadrado perfecto */
else
perfecto = FALSE; /* no es cuadrado perfecto */
return(perfecto);
61
La llamada a la funcin
nombre_func (in1, ..., inN, &out1, , &outN);
62
64
Ejercicio 4
Solucin
#include <stdio.h>
#include <math.h>
void hipotenusa(float a, float b, float *h)
{
*h = sqrt(pow(a,2) + pow(b, 2));
}
void main()
{
float a, b, h;
leer (&a,&b);
hipotenusa(a,b,&h);
printf("La hipotenusa es %f\n", h);
}
Recapitulacin
Leerlo detenidamente
Hacer pseudocdigo o diagrama de flujo
Decidir divisin en funciones
Determinar parmetros de entrada y salida
Desde main() invocar a las funciones
67
Sentencias de control
68
Estructuras de control
Objetivos:
Contenidos:
1. Tipos de estructuras
2. Estructuras condicionales
o Instruccin if - else
o Instruccin switch
3. Instruccin break
69
Tipos de estructuras
Secuencia: ejecucin
sucesiva de dos o ms
operaciones.
Seleccin: se realiza
una u otra operacin,
dependiendo de una
condicin.
Iteracin: repeticin de
una operacin mientras
se cumpla una
condicin.
70
If - else
if (expresin) sentencia;
o bien
if (expresin) sentencia;
else sentencia;
71
Ejemplo if - else
#include <stdio.h>
main()
{
int numero;
/* Leer el numero */
printf("Introduzca un numero: ");
scanf("%d", &numero);
if ((numero % 2) == 0)
printf("El numero %d es par.\n", numero);
else
printf("El numero %d es impar.\n", numero);
}
72
Operador condicional
LO MISMO
}
73
switch
switch (variable) {
case cte1: sentencia;
break;
case cte2: sentencia;
break;
...
...
default: sentencia;
}
74
Ejemplo switch
#include <stdio.h>
void main()
{
char letra;
printf("Introduzca una letra: ");
scanf("%c", &letra);
switch(letra)
{
case 'a':
case 'A':
printf("Vocal %c\n", letra);
break;
case 'e':
case 'E':
printf("Vocal %c\n", letra);
break;
case 'i':
case 'I':
printf("Vocal %c\n", letra);
break;
case 'o':
case 'O':
printf("Vocal %c\n", letra);
break;
case 'u':
case 'U':
printf("Vocal %c\n", letra);
break;
default:
printf("Consonante %c\n",
letra);
75
Bucles
Objetivos:
Contenidos:
1. Bucles
a. Instruccin for
b. Instruccin while
c. Instruccin do - while
Instruccin for
for (inicializacin; condicin; incremento)
sentencia;
Ejemplo for
#include <stdio.h>
void main()
{
int numero;
for (numero=0; numero <100; numero++)
printf("%d\n", numero);
}
78
Instruccin while
while (expresin)
sentencia;
Ejemplo while
#include <stdio.h>
void main()
{
int N;
int suma = 0;
/* leer el numero N */
printf("N: ");
scanf("%d", &N);
while (N > 0)
{
suma = suma + N;
N = N - 1; /* equivalente a N-- */
}
printf("1 + 2 +...+ N = %d\n", suma);
}
80
do - while
do
sentencia;
while (expresin);
Ejemplo do -while
#include <stdio.h>
void main()
{
int numero;
do
{
/* se lee el numero */
printf("Introduzca un numero: ");
scanf("%d", &numero);
if ((numero % 2) == 0)
printf("El numero %d es par.\n", numero);
else
printf("El numero %d es par.\n", numero);
}
while (numero != 0)
}
82
Bucles anidados
#include <stdio.h>
main()
{
int N, suma, j;
do
{
/* leer el numero N */
printf("Introduzca N: ");
scanf("%d", &N);
suma = 0;
for (j = 0; j <= N; j++)
/* bucle anidado */
suma = suma + j;
printf("1 + 2 + ... + N = %d\n", suma);
} while (N > 0);
/* fin del bucle do */
83
Instruccin break
Ej.
#include <stdio.h>
Marta Zorrilla Universidad de Cantabria
void main()
{
int opcion;
printf ("1 - Mensaje pantalla \n");
printf ("2 - salir \n");
printf (" cualquier carcter, no hace nada\n");
printf("Elija la opcin: ");
scanf("%d", &opcion);
while (opcion)
{
switch(opcion)
{
case 1:
printf("Hola, selecciono opcion %d\n" , opcion);
break;
case 2:
printf ("Adios \n");
return;
break;
default:
printf("Seleccion invalida. Intentelo de nuevo\n");
}
printf("Elija la opcion: ");
scanf("%d", &opcion);
}
}
85
Sentencia continue
86
Ejemplo continue
#include <stdio.h>
#include <conio.h>
void main ()
{
int n;
int positivos = 0;
do {
Tabla de comparativas
Valores
iniciales,
operaciones
previas
Cond. para
seguir
repitiendo
Cuando se
comprueba
for
1 campo
2 campo
si
while
En el while entre
parntesis
No
do
while
En el while entre
parntesis
Despus de
cada vuelta
no
Cambios que
hay que hacer
pueden
quedar
campos
vacos?
88
Ejercicios
Escriba un programa
que calcule xn, siendo
x y n dos nmeros que
se introducen por
teclado
#include <stdio.h>
void main()
{
int n,x,i;
float potencia=1;
printf("Dame x y n \n: ");
scanf("%d %d", &x, &n);
for (i=0; i<n ; i++) {
potencia=potencia * x;
}
printf("El resultado es: %f\n", potencia);
}
89
#include <stdio.h>
void leer (int *a, int *b)
{
do{
printf("Solicito dos numeros a<b \n");
printf("Dame a y b \n: ");
scanf("%d %d", *&a , *&b);
} while (a>b);
}
void main()
{
int n,x;
leer (&x,&n);
calcula(x,n);
}
90
91
Recursividad
92
Recursividad
Objetivos:
Contenidos:
1.Paso de parmetros a una funcin
2.Recursividad
93
En las llamadas por valor se hace una copia del valor del
argumento en el parmetro formal.
La funcin opera internamente con estos ltimos.
Como las variables locales a una funcin (y los parmetros
formales lo son) se crean al entrar a la funcin y se
destruyen al salir de ella, cualquier cambio realizado por la
funcin en los parmetros formales no tiene ningn efecto
sobre los argumentos.
94
Ejemplo
95
Ejemplo
x, y punteros
#include <stdio.h>
void funcion(int *a, int *b); /* prototipo */
main()
{
int x = 2;
int y = 5;
printf("Antes x = %d, y = %d\n", x, y);
funcion(&x, &y);
printf("Despues x = %d, y = %d\n", x, y);
}
void funcion(int *a, int *b)
{
*a = 0;
*b = 0;
printf("Dentro *a = %d, *b = %d\n", *a, *b);
return;
}
97
Ejemplo
#include <stdio.h>
void swap_ref (int *a, int *b); /* prototipo */
void main()
{
int x = 2;
int y = 5;
printf("Antes x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("Despues x = %d, y = %d\n", x, y);
}
void swap_ref (int *a, int *b)
{
int temp;
temp = *b;
*b = *a;
*a = temp;
}
98
Recursividad
Izquierda
Centro
Derecha
100
101
102
Objetivos:
Contenidos:
1. Arrays
o
o
o
o
Declaracin
Subndices
Almacenamiento en memoria
Tamao de los arrays
2. Inicializacin de un array
3. Array de caracteres y cadenas de texto
4. Arrays multidimensionales
103
Listas
Listas
cmo se utilizan?
Empieza en 0
temperaturas[10];
Pasar a funciones
en la declaracin
en la llamada a la funcin
nombreFuncion (variable_lista[posicion])
105
Listas de nmeros
cmo se utilizan?
memcpy (listadestino,listaorigen,tamao)
Sean de entrada o
salida, no requieren *
Ojo, corchetes
106
Listas de nmeros
cmo se utilizan?
108
void main()
{
int cuantos;
printf ("dame cuantos \t");
scanf("%i", &cuantos);
{
float lista[cuantos];
leer(cuantos,lista);
pintar (cuantos, lista);
}
109
void main()
{
int cuantos;
printf ("dame cuantos \t");
scanf("%i", &cuantos);
{
float lista[cuantos];
leer(cuantos,lista);
qsort(lista,cuantos, sizeof(lista[0],comparar);
pintar (cuantos, lista);
}
}
110
La funcin sizeof()
#include <stdio.h>
main()
{
char cadena[10];
printf("un int ocupa %d bytes\n", sizeof(int));
printf("un char ocupa %d bytes\n", sizeof(char));
printf("un float ocupa %d bytes\n", sizeof(float));
printf("un double ocupa %d bytes\n", sizeof(double));
printf(" cadena ocupa %d bytes\n", sizeof(cadena));
}
111
Algoritmos de ordenacin y
bsqueda
Transparencias en pdf aparte
112
Cadenas de caracteres
Cadenas de caracteres
Cmo se utilizan?
114
no requiere
&
La funcin gets lee una lnea completa hasta que encuentre el retorno
de carro incluyendo los blancos.
La funcin puts escribe una cadena de caracteres junto con un salto de
lnea.
#include <stdio.h>
#define TAM_LINEA 80
main()
{
char linea[TAM_LINEA];
printf("Introduzca una linea: \n");
gets(linea);
puts("La linea es");
puts(linea);
}
Son equivalentes:
puts("La linea es:");
117
Ej.
#include <stdio.h>
#include <string.h>
#define MAXLETRAS 20
void leer (char palabra[MAXLETRAS])
{
printf ("\nTeclee una cadena de caracteres: ");
scanf(%s, palabra);
}
void escribir (char palabra[MAXLETRAS])
{
int primera=0, ultima=0, i;
ultima=strlen(palabra)-1;
118
Ej.
#include <stdio.h>
#include <string.h>
#define MAXLETRAS 100
void leer (char cadena [MAXLETRAS])
{
printf ("\nTeclee una cadena de caracteres: ");
gets (cadena);
}
void escribir (char cadena[MAXLETRAS])
{
int i, contador=0;
for (i = 0; i <= strlen (cadena); i++) {
if (isupper (cadena[i])) cadena[i] = tolower (cadena[i]);
else if (islower (cadena[i])) cadena[i] = toupper (cadena[i]);
else if (isdigit (cadena[i])) contador++;
}
printf ("\nLa cadena tiene %d dgitos numricos\n", contador);
puts (cadena);
}
void main (void)
{
char frase[MAXLETRAS];
leer(frase);
escribir(frase);
}
119
Vectores multidimensionales
La numeracin comienza en 0.
120
Tablas
Cmo se utilizan?
llamada
nombreFuncion (arg1,.., nombretabla[fila][columna])
declaracin
void nombreFuncion (tipo arg1,, tipo variablesimple)
Tablas
declaracin
void nombreFuncion (tipo arg1,, tipo lista[COLUMNAS])
llamada
nombreFuncion (arg1,.., nombretabla[fila]);
Copiar
memcpy(destino, origen,tamao)
Ej: memcpy ( clientes2, clientes1, sizeof(int)*filas*columnas)
Parmetro de una funcin
Declaracin de funcin
122
Ejemplo
#include <stdio.h>
void sumar(int filas, int columnas, float tabla1[filas][columnas], float tabla2[filas][columnas])
{
int i,j, acumulador=0;
for (i=0;i<filas;i++)
{
for (j=0;j<columnas;j++)
{
printf("%f \t", tabla1[i][j]+tabla2[i][j]);
}
printf("\n");
}
}
void main()
{
int filas, columnas;
printf("dame filas y columnas: \n");
scanf("%i %i", &filas, &columnas);
Ejemplo
Ej.:
#include <stdio.h>
#include <string.h>
#define MAX 30 /*incluye el fin de lnea*/
void main()
{
int numpal;
void leer(int numpal, int columnas, char tabla[numpal][MAX], char pal[MAX]) printf("dame n palabras: \n");
{
scanf("%i", &numpal);
int i;
printf("dame palabras:\n");
{
char tabla[numpal][MAX], pal[MAX];
for (i=0;i<numpal;i++)
{
leer(numpal, tabla, pal);
scanf("%s",tabla[i]);
calcular(numpal,tabla,pal);
}
}
printf("dame palabra a buscar:\n");
}
scanf("%s",pal);
}
void calcular(int numpal, int columnas, char tabla[numpal][MAX], char pal[MAX])
{
int i,suma=0;
for (i=0;i<numpal;i++)
{
if (strcmp(listapal[i],pal)==0)
{
suma ++;
}
}
printf(la palabra buscada %s, aparece %d veces\,pal, suma);
}
125
Estructuras y uniones
126
Estructuras y uniones
Objetivos:
Contenidos:
1. Estructuras
2.
3.
4.
5.
o Concepto de campo
o Declaracin e inicializacin
Acceso a estructuras
Declaracin typedef
Combinacin de datos estructurados
Campos variables con el uso de union
127
Estructuras
Ejemplo
Dos formas:
En la declaracin:
struct CD
{
char titulo[100];
char artista[50];
int num_canciones;
int anio;
Euros precio;
} cd1= {Un sueo de verano,Miguel Rios,1989,10};
En el programa:
struct CD cd1;
strcpy(cd1.titulo, Un sueo de verano");
strcpy(cd1.artista, Miguel Rios");
cd1.num_canciones = 2;
c1.anio = 1989;
130
131
Ejemplo
#include <stdio.h>
struct fecha
{
int dia;
int mes;
int anno;
};
struct cuenta
{
int cuenta_no;
char nombre[80];
float saldo;
struct fecha ultimo_pago;
};
132
Ejemplo (y 2)
main()
{
struct cuenta c1, c2;
/* rellena la estructura c1 */
c1.cuenta_no = 2;
strcpy(c1.nombre, "Pepe");
c1.saldo = 100000;
c1.ultimo_pago.dia = 12;
c1.ultimo_pago.mes = 5;
c1.ultimo_pago.anno = 1997;
/* asignacion de estructuras */
c2 = c1;
printf("No. Cuenta %d \n", c2.cuenta_no);
printf("Nombre %s \n", c2.nombre);
printf("Saldo %f \n", c2.saldo);
printf("Fecha de ultimo pago: %d:%d:%d \n", c2.ultimo_pago.dia,
c2.ultimo_pago.mes, c2.ultimo_pago.anno);
}
133
typedef struct
{
char pieza[20];
/* Tipo de pieza.
*/
int cantidad;
/* Nmero de piezas.
*/
float precio_unitario; /* Precio de cada pieza.
*/
char existe;
/* Comprobar si el registro existe. */
} registro_piezas;
134
main()
{
registro_piezas cajas[NUMCAJAS];
int registro=0;
int i;
do
{
/* Leer el nombre de la pieza. */
printf("Nombre de la pieza => ");
scanf("%s", cajas[registro].pieza);
/* Leer el nmero de piezas. */
printf("Numero de piezas => ");
scanf("%d", &cajas[registro].cantidad);
/* Leer el precio de cada pieza. */
printf("Precio de cada pieza => ");
scanf("%f", &cajas[registro].precio_unitario);
/* Indicar que el registro tiene datos, V */
cajas[registro].existe = 'V';
registro ++;
} while (registro < NUMCAJAS);
135
Cont.
/* Imprimir la informacin. */
for(registro = 0; registro < NUMCAJAS; registro++)
{
if(cajas[registro].existe == 'V')
{
printf("La caja %d contiene:\n", registro + 1);
printf("Pieza => %s\n", cajas[registro].pieza);
printf("Cantidad => %d\n",
cajas[registro].cantidad);
printf("Precio unitario => $%f\n",
cajas[registro].precio_unitario);
}
} /* Fin for. */
} /*fin main*/
136
137
#include <stdio.h>
struct fecha
{
int dia;
int mes;
int anno;
};
void imprimir_fecha(struct fecha f)
{
printf("Dia: %d\n", f.dia);
printf("Mes: %d\n", f.mes);
printf("Anno: %d\n", f.anno);
return;
}
}
main()
{
struct fecha fecha_de_hoy;
fecha_de_hoy = leer_fecha();
imprimir_fecha(fecha_de_hoy);
138
}
leer_punto(&p1);
imprimir_punto(p1);
}
139
Uniones
Ejemplo
#include <stdio.h>
#include <stdlib.h>
union numero
{
int entero;
float real;
};
main()
{
union numero num;
/* leer un entero e imprimirlo */
printf("Entero: ");
scanf("%d", &(num.entero));
printf("El entero es %d\n", num.entero);
/* leer un real e imprimirlo */
printf("Real: ");
scanf("%f", &(num.real));
printf("El entero es %f\n", num.real);
}
3
entero
real
141
Persona n
Persona ...
Persona 1
struct DATOS {
char tipo;
char nombre[40];
int edad;
char direccion[40];
char telefono[15];
union AL_PR ambos;
} personal[100];
142
Tipos enumerados
Definicin:
enum nombre {m1, m2, ..., mN};
Ejemplo:
enum color {negro, blanco, rojo};
144
Ejemplo
#include <stdio.h>
enum semaforo {rojo, amarillo, verde};
main()
{
enum estado semaforo;
for(estado =rojo; estado <=verde; estado ++)
switch(estado )
{
case rojo:
printf(Parar, sino multa\n");
break;
case amarillo:
printf(Parar si no tienes vehculo encima\n");
break;
case verde:
printf(Circular\n");
break;
}
}
145
Ejemplos:
typedef char letra;
letra c;
typedef struct{
int dia;
int mes;
int anio;
} FECHA;
FECHA a;
146
Ficheros
Marta Zorrilla
148
Ficheros
Objetivos:
Contenidos:
Canales y ficheros
150
Canales y ficheros ( y 2)
stdin
stdout
stderr
(ANSI)
151
Apertura de un archivo
r+
w+
a+
Modo TEXTO: aadir letra t. Ej: si modo es rt, se est abriendo el fichero en modo texto slo para lectura
Modo BINARIO: aadir letra b. Ej: modo es w+b se abrir o crear un fichero en modo binario para lectura y escritura153
Cierre de un fichero
154
Ejemplo
#include <stdio.h>
main()
{
FILE *desc;
desc = fopen("ejemplo.txt", w");
if (desc == NULL)
{
printf("Error, no se puede abrir el archivo \n");
}
else
{
/* se procesa el archivo */
/* al final se cierra */
fclose(desc);
}
exit(0);
}
155
Control de errores
156
Final de fichero
Ficheros de texto
158
Lectura:
int fgetc(FILE *fich)
Lee un carcter del archivo (EOF si estamos al final del
mismo)
Escritura:
int fputc(char c, FILE *fich)
Escribe el carcter c en el archivo. Si es correcto devuelve
el mismo carcter y si no EOF.
159
Ejemplo
160
Lectura:
char *fgets(const char *s, int n, FILE *fich)
Lee n-1 caracteres o hasta carcter de fin de lnea (que tambin se almacena
en s). Si no se produce error, la funcin devuelve un puntero a char; en caso
contrario, devuelve un puntero nulo.
Escritura:
int fputs(char *s, FILE *fich)
Escribe la cadena s en el archivo. Si es correcto devuelve un valor no
negativo y si no EOF. No copia el carcter nulo ni aade el carcter de fin
de lnea.
161
Ejemplo
#include <stdio.h>
int main(void)
{
FILE *fent;
FILE *fsal;
char car[120];
int res = 0;
char * ret;
/* Apertura del archivo de entrada */
fent = fopen("./entrada.txt", "r");
if (fent == NULL)
{
fprintf(stderr, "Error abriendo entrada.txt \n");
return(0);
}
/* Apertura, con creacin si no existe, del archivo de salida */
fsal = fopen("./salida.txt", "w");
if (fsal == NULL)
{
fprintf(stderr, "Error creando salida.txt \n");
fclose(fent);
return(0);
}
162
Ejemplo (y 2)
/* Bucle de lectura y escritura con lneas */
do
{
/* Lectura de la lnea siguiente */
ret = fgets(car, 110, fent);
if ( car == NULL)
fprintf(stderr, "Error al leer \n");
else
fprintf(stdin, "Longitud linea leida: %d \n", strlen(car));
/* Escritura de la lnea */
if (ret != NULL) {
res = fputs(car, fsal);
if (res == EOF)
fprintf(stderr, "Error al escribir %s \n", car);
}
} while (ret != NULL);
/* Cierre de los streams de entrada y de salida */
fclose(fent);
fclose(fsal);
return(0);
}
163
Lectura:
int fscanf(FILE *fich, char *formato, arg1,arg2,argN)
Su uso es el mismo que scanf pero con la salvedad de que lee desde
un archivo, en vez desde el teclado.
Escritura:
int fprintf(FILE *fich, char *formato, arg1,arg2,argN)
Su uso es igual al de printf pero con la salvedad de que escribe en
un archivo en vez de en la pantalla.
164
Ejemplo
165
Ficheros binarios
166
Escritura
int fwrite(void *datos, int tam, int ndatos, FILE *fich);
Devuelve:
Nmero de elementos (no bytes) escritos en el archivo.
Parmetros:
*ptr = puntero al origen de los datos.
tam = tamao de cada elemento.
ndatos = nmero de elementos.
*fich = puntero a FILE (archivo donde escribir).
167
Ejemplo
FILE *archivo;
int valor;
Tficha ficha;
int n;
archivo=fopen(c:\archivo.dat,w);
n = fwrite(&valor, sizeof(int), 1, archivo);
if (n!=1) printf(Error: escritura incompleta.);
n = fwrite(&ficha, sizeof(TFicha), 1, archivo);
if (n!=1) printf(Error: escritura incompleta.);
168
Sintaxis:
int fread(void *datos, int tam, int ndatos, FILE *fich);
Parmetros:
*ptr = puntero al destino de los datos.
tam = tamao de cada elemento.
ndatos = nmero de elementos.
*fich = puntero a FILE (archivo de donde leer).
169
Ejemplo
TFicha fichas[100];
int nfichas;
FILE *agenda;
nfichas =0;
agenda = fopen(agenda.dat, rb);
while (!feof(agenda)) {
fread(&fichas[nfichas], sizeof(TFicha), 1, agenda);
nfichas ++;
}
fclose(agenda);
170
Ejemplo agenda
40 caracteres
40 caracteres
25 caracteres
15 caracteres
10 caracteres
171
Ejemplo
#include <stdio.h>
typedef struct {
char nom[41];
char dom[41];
char pob[26];
char pro[16];
char tel[11];
} REG;
void main (void)
{
FILE *f;
REG var;
if (!(f = fopen ("LISTIN.TEL", "wb"))) {
perror ("LISTIN.TEL");
return;
}
printf ("Nombre: ");
gets (var.nom);
172
Ejemplo (y 2)
while (var.nom[0]) {
printf ("\nDomicilio: ");
gets (var.dom);
printf ("\nPoblacin: ");
gets (var.pob);
printf ("\nProvincia: ");
gets (var.pro);
printf ("\nTelfono: ");
gets (var.tel);
fwrite (&var, sizeof (var), 1, f);
if (ferror (f)) {
puts ("No se ha almacenado la informacin");
getch ();
}
printf ("Nombre: ");
gets (var.nom);
}
fclose (f);
173
174
Acceso directo
Acceso directo (y 2)
int fseek (FILE *canal, long nbytes, int origen);
VALOR
MACRO
SEEK_SET
Posicin actual
SEEK_CUR
SEEK_END
176
Ejemplo:
177
Ejemplo:
#include <stdio.h>
typedef struct {
char nombre[40];
int edad;
float altura;
} REGISTRO;
void main (void)
{
FILE *f1;
REGISTRO mireg;
int num;
long int puntero;
if (!(f1 = fopen ("REGISTRO.DAT", "r+b"))) {
puts ("Error de apertura");
return;
}
printf ("Escribir registro n: ");
scanf ("%d", &num);
178
Ejemplo:
(y2)
Programacin modular
Tema 13
180
Tema 13
Objetivos:
Contenidos:
1. Variables globales y locales
2. Variables estticas
3. El preprocesador C: #include y #define.
4. Programas modulares
5. Bibliotecas de funciones
181
Variables locales.
Variables globales.
Variables
Variables
Variables
Variables
automticas.
estticas.
externas.
de tipo registro.
182
Variables globales
#include <stdio.h>
void funcion1(void);
int a = 1000; /* variable global */
main()
{
int b = 2; /* variable local */
funcion1();
printf("a = %d, b = %d \n", a, b);
}
void funcion1(void)
{
int c = 4; /* variable local */
printf("a = %d, c = %d \n", a, c);
return;
}
183
Variables globales (y 2)
#include <stdio.h>
void funcion1(void);
int a=10; /* variable global */
main()
{
printf("Antes a = %d\n", a);
funcion1();
printf("Despues a = %d\n", a);
}
void funcion1(void)
{
a = 1000;
return;
}
184
Variables locales
Variables estticas
186
187
Variables globales.
Hay que distinguir entre definicin y declaracin de variable
externa.
La definicin se escribe de la misma forma que las variables
normales y reserva espacio para la misma en memoria.
Una declaracin no reserva espacio de almacenamiento se
especifica con extern.
Se emplean cuando un programa consta de varios mdulos. En uno
de ellos se define la variable. En los dems se declara (extern)
188
Ejemplo
#include <stdio.h>
extern int valor; /* se declara */
void funcion(void);
main()
{
funcion();
printf("Valor = %d\n", valor);
}
189
Recomendaciones
190
Macros
#include <stdio.h>
#define maximo(a,b) ((a > b) ? a : b)
main()
{
int x, y;
int max;
printf("Introduzca dos numeros: ");
scanf("%d %d", &x, &y);
max = maximo(x,y); /* uso de la macro */
printf("El maximo es %d\n", max);
}
191
Macros (y 2)
192
Directiva #include
El uso de comillas dobles " " o ngulos < > indica dnde debe
buscar el preprocesador el fichero nom_fich.
prog_ppal.c
leyOhm.c
leyOhm.h
compilador
leyOhm.o
Inclusin del
archivo leyOhm.c
prog_ppal.c
prog_ppal.o
enlazador
prog_ppal.exe
195
La biblioteca de funciones
LENGUAJE
ARCHIVO
DE CABECERA
DESCRIPCIN
ALLOC.H
ANSI C
ASSERT.H
C++
BCD.H
BIOS.H
C++
COMPLEX.H
C++
CONIO.H
Define varias funciones utilizadas en las llamadas a rutinas de E/S por consola
en DOS
ANSI C
CTYPE.H
DIR.H
DOS.H
ERRNO.H
FCNTL.H
FLOAT.H
ANSI C
ANSI.C
196
La biblioteca de funciones
LENGUAJE
ARCHIVO
DE CABECERA
DESCRIPCIN
C++
FSTREAM.H
C++
GENERIC.H
C++
GRAPHICS.H
IO.H
C++
IOMANIP.H
Define los gestores de flujos de E/S de C++ y contiene macros para creacin de
gestores de parmetros
C++
IOSTREAM.H
ANSI C
LIMITS.H
ANSI C
LOCALE.H
ANSI C
MATH.H
MEM.H
PROCESS.H
SETJMP.H
SHARE.H
SIGNAL.H
ANSI C
ANSI C
La biblioteca de funciones
LENGUAJE
ARCHIVO
DE CABECERA
DESCRIPCIN
ANSI C
STDARG.H
ANSI C
STDDEF.H
ANSI C
STDIO.H
C++
STDIOSTR.H
Declara las clases de flujo para utilizar con estructuras del archivo stdio.h
ANSI C
STDLIB.H
C++
STREAM.H
Define las clases de flujo de C++ para utilizarlas con arrays de bytes en
memoria
ANSI C
STRING.H
SYS\STAT.H
SYS\TIMEB.H
C++
SYS\TYPES.H
ANSI C
TIME.H
VALUES.H
198
Punteros y arrays
Tema 14
199
Punteros y arrays
Objetivos:
Contenidos:
1. Punteros
o Declaracin
o Operadores
2. Arrays
o
o
o
o
Declaracin
Subndices
Almacenamiento en memoria
Tamao de los arrays
3. Inicializacin de un array
4. Array de caracteres y cadenas de texto
5. Arrays multidimensionales
200
Punteros
201
Punteros (y 2)
202
Punteros (y 3)
&
*
direccin de
en la direccin de
Asignacin
Incremento / Decremento
Suma / Resta
Comparacin
203
Asignacin punteros
204
Ejemplo
#include <stdio.h>
main()
{
int x; /* variable entera */
int y; /* variable entera */
int *px; /* variable puntero a entero */
int x;
int y;
int *px;
1
(&x) 1000
(&x) 1200
x = 5;
px = &x; /* asigna a px la direccion de x */
y = *px; /* asigna a y el contenido de la
direccion almacenada en px */
(&px) 3000
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("*px = %d\n", *px);
}
px=&x;
3
x=5;
y=*px;
2
100
0
205
Ejercicio
float n1;
float n2;
float *p1;
float *p2;
n1 = 4.0;
p1 = &n1;
p2 = p1;
n2 = *p2;
n1 = *p1 + *p2;
Cunto vale n1 y n2?
206
Incremento / Decremento
Suma / Resta
208
Comparacin
209
Puntero NULL
Arrays
Ejemplo arrays
#include <stdio.h>
#define TAM_VECTOR 10
main()
{
int vector_a[TAM_VECTOR];
int vector_b[TAM_VECTOR];
int j; /* variable utilizada como indice */
/* leer el vector a */
for (j = 0; j < TAM_VECTOR; j++)
{
printf("Elemento %d: ", j);
scanf("%d", &vector_a[j]);
}
/* copiar el vector */
for (j = 0; j < TAM_VECTOR; j++)
vector_b[j] = vector_a[j];
/* escribir el vector b */
for (j = 0; j < TAM_VECTOR; j++)
printf("El elemento %d es %d \n", j, vector_b[j]);
}
212
Cadenas de caracteres
Cadenas de caracteres
214
La funcin gets lee una lnea completa hasta que encuentre el retorno de carro
incluyendo los blancos.
La funcin puts escribe una cadena de caracteres junto con un salto de lnea.
#include <stdio.h>
#define TAM_LINEA 80
main()
{
char linea[TAM_LINEA];
printf("Introduzca una linea: \n");
gets(linea);
puts("La linea es");
puts(linea);
}
puts("La linea es:");
es equivalente a:
printf("La linea es: \n");
217
Ejemplo
El programa siguiente hace uso de alguna de las funciones anteriores para examinar una
cadena de caracteres y convertir las minsculas a maysculas y viceversa. Adems cuenta
cuntos caracteres son dgitos numricos.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
void main (void)
{
char cadena[100];
int contador = 0;
register int i;
clrscr ();
printf ("\nTeclee una cadena de caracteres: ");
gets (cadena);
for (i = 0; i <= strlen (cadena); i++) {
if (isupper (cadena[i])) cadena[i] = tolower (cadena[i]);
else if (islower (cadena[i])) cadena[i] = toupper (cadena[i]);
else if (isdigit (cadena[i])) contador++;
}
printf ("\nLa cadena tiene %d dgitos numricos\n", contador);
puts (cadena);
}
218
La funcin sizeof()
#include <stdio.h>
main()
{
char cadena[10];
printf("un int ocupa %d bytes\n", sizeof(int));
printf("un char ocupa %d bytes\n", sizeof(char));
printf("un float ocupa %d bytes\n", sizeof(float));
printf("un double ocupa %d bytes\n", sizeof(double));
printf(" cadena ocupa %d bytes\n", sizeof(cadena));
}
219
Vectores multidimensionales
220
Ejemplo
Funciones y argumentos de
tipo puntero
Tema 16
222
Tema 16
Objetivos:
Contenidos:
223
Punteros y vectores
x
(x+1)
(x+2)
(x+i)
226
Punteros y vectores (y 2)
227
Ejemplo.
228
Ejemplo.
229
Punteros a estructuras
233
}
234
}
void imprimir_punto(struct punto p)
{
printf("x = %f\n", p.x);
printf("y = %f\n", p.y);
}
235
de
236
Para que los argumentos sean tratados como diferentes tienen que
ir separados por uno o varios espacios blancos
237
Ejemplo
#include <stdio.h>
void main (int argc, char *argv[ ])
{
register int i;
printf ("\nNombre del programa: %s", argv[0]);
if (argc == 1) printf ("\nNo se han introducido parmetros");
else {
printf ("\nParmetros en la lnea de rdenes: ");
for (i = 1; i < argc; i++) printf ("\n%d: %s", i, argv[i]);
}
}
238