Professional Documents
Culture Documents
Introduccin a la programacin en C
Ordenador y perifricos
Unidades de memoria
0 (falso) 1 (cierto)
Byte : 8 bits
256 combinaciones de 0s y 1s
1 Kb 1 Mb 1 Gb 1 Tb
Sintaxis predefinida
Abstraccin
Ordenador
Lenguaje mquina: 0s y 1s, crptico, etc. Lenguaje ensamblador: uso de mnemotcnicos, optimizado (menos memoria, ms velocidad, ...), etc.
Anlisis: contacto con el cliente, estudio del problema y necesidades, especificacin de alto nivel, documentacin
Diseo: solucin adecuada a los recursos, lenguaje, algoritmos, herra mientas de desarrollo, bases de datos, etc., documentacin
Traductores (I)
lenguaje mquina
Verificacin de sintaxis
Ejecucin
Lentitud de ejecucin !
Traductores (II)
programa ejecutable
Velocidad de ejecucin !
Introduccin a la programacin en C
Un poco de historia
Portabilidad: ANSI C
void main() {
/* Mi primer programa en C */ void main() { /* Otro comentario /* Comentario ilegal */ */ } /* ... y otro comentario */
Modelo de compilacin de C
Montador: creacin del programa ejecutable, combinando libreras y otros ficheros objeto
Empezando a programar
Introduccin a la programacin en C
Identificadores
Estructura de un programa
/* Evaluando una expresin */ Constante #include <stdio.h> void main() { int a, b, c = 5; Variables Sentencias
a = 3 * c; b = 32 / 4; c = a b;
Fin de sentencia
Variables
Objeto abstracto donde se almacena un valor. Se puede consultar y modificar durante la ejecucin del programa.
Asociar un identificador
tipo_de_datos
tipo_de_datos
tipo_de_datos
Ejemplo:
int
a, b, c = 5;
Constantes
Decimal: signo + dgito no 0 + dgitos 0 al 9 Octal: signo + 0 + dgitos 0 al 7 Hexadecimal: signo + 0x o 0X + dgitos 0 al 9 y A a F Coma flotante: signo + parte entera + . + parte decimal signo + mantisa + exponente
char int
ch; num;
. . .
char int
ch; num;
. . .
Expresiones aritmticas
variable = expresin; Unarios
Asignacin:
Operadores:
Binarios
++ + * / %
z++; x = (z w) % 100; w; i += 5; x *= (y + 2);
i = i + 5; x = x * (y + 2);
Expresiones relacionales
Menor que Mayor que Menor o igual que Mayor o igual que Igual que Distinto que
Operadores:
Ejemplos:
23 == 22
falso 4 != 5 cierto
No confundir asignacin (=) con comparacin (==): x = 3 es tambin una expresin, ..., no cero cierto
Expresiones lgicas
Conjuncin Y lgico Disyuncin O lgico Negacin NO lgico
Operadores:
&& || !
Tabla de verdad:
Ejemplos:
(5 <= 0) || !(x > x 1) 2 && (4 > 9)
4 && 0
falso falso
(8 == 4 * 2) && (5 > 2)
!(4 > 1)
(x < x 8) || 4
cierto
Prioridad de operadores
Operador Asociatividad
Izquierda a derecha Derecha a izquierda Parntesis
10
+
NO lgico
Cambio de signo () ! Izquierda a derecha Izquierda a derecha Izquierda a derecha
Smbolo
Incremento Decremento Multiplicacin Divisin Mdulo Suma Resta Menor que Menor o igual que Mayor que Mayor o igual que Igual que Distinto que Y lgico O lgico Asignaciones
11
Ejercicios
Pedir la base y la altura de un rectngulo, calcular su rea y su permetro, y mostrar los resultados por pantalla.
Pedir una cantidad de segundos y mostrar por pantalla a cuntas horas, minutos y segundos corresponden.
Suponiendo la declaracin previa: int x = 7, y; , calcular el valor de la variable y tras evaluar cada una de las siguientes asignaciones:
y = 2 + x;
y += 2;
y = (y == x);
y = y++ x;
5 / 2 + 20 % 6
4 * 6 / 2 15 / 2
5 * 15 / 2 / (4 2)
8 == 16 || 7 != 4 && 4 < 1
Estructuras condicionales
Introduccin a la programacin en C
Introduccin
Ejecucin de un grupo de sentencias u otro, en funcin del valor de una expresin condicional.
Falso : valor 0
if (condicin) sentencia;
Si la expresin es falsa, se ignora la sentencia o grupo de sentencias, y se ejecuta la siguiente sentencia en orden secuencial.
Ejemplo:
scanf("%d", &a); if (a % 2 == 0) a = a + 1;
Generalizacin de la anterior
Si la expresin es cierta, entonces se ejecuta el primer grupo de sentencias, y si es falsa, entonces se ejecuta el segundo grupo de sentencias
Ejemplo:
. . .
. . .
if (condicin_1) { grupo_de_sentencias_1; } else if (condicin_2) { grupo_de_sentencias_2; } . . . else if (condicin_N) { grupo_de_sentencias_N; } else { grupo_de_sentencias_por_defecto; }
Evaluacin secuencial de arriba hacia abajo sentencias por defecto mejor legibilidad
Ejemplo:
scanf("%d", &hora); if ((hora >= 0) && (hora < 12)) printf("Buenos das"); else if ((hora >= 12) && (hora < 18)) printf("Buenas tardes"); else if ((hora >= 18) && (hora < 24)) printf("Buenas noches"); else printf("Hora no vlida");
10
El operador condicional: ?
La expresin toma el valor de la expresin_2 o la expresin_3, en funcin de si la expresin_1 es cierta o falsa, respectivamente.
c = (a > b) ? a : b;
11
switch ( expresin ) { case constante_1: grupo_de_sentencias_1; break; case constante_2: grupo_de_sentencias_2; break; . . . case constante_N: grupo_de_sentencias_N; break; default: grupo_de_sentencias_por_defecto; break; }
default es opcional
12
scanf("%d", &num); switch ( num ) { case 1 : printf("Uno.\n"); break; case 2 : printf("Dos.\n"); break; . . . case 5 : printf("Cinco.\n"); break; default : printf("No esperado.\n"); break; } }
default opcional
Ejercicios (I)
13
Escribir un programa que lea tres valores enteros y muestre por pantalla el mximo y el mnimo de ellos.
scanf("%d %d %d %d", &a, &b, &c, &d); if ( ((a > 0) || (b > a)) && (c != d) ) { a = c; b = 0; } else { c += d; c = (c == 0) ? (c + b) : (c a); b = a + c + d; } printf("%d %d %d %d\n", a, b, c, d);
Ejercicios (II)
14
Escribir un programa que muestre por pantalla la ecuacin de una recta en un plano, Ax + By + C = 0, leyendo previamente las coordenadas de dos de sus puntos (x1, y1) y (x2, y2). Recordar que: B = y1 * (x2 x1) x1 * (y2 y1)
A = y2 y1
Estructuras iterativas
Introduccin a la programacin en C
Introduccin
cont = 0; suma = 0; scanf("%d", &num); while (num != 1) { cont++; suma+=num; scanf("%d", &num); } if (cont != 0) printf("La media es %d.\n", suma/cont); else printf("Secuencia vacia.\n");
En C toda sentencia es una expresin la condicin puede ser cualquier cosa. Ejemplos:
while (x) { . . . }
while (x = x+1);
do
Similar a while
Tanto while como dowhile suelen usarse cuando el nmero de iteraciones se desconoce a priori
Ejemplo:
Sentencia inicial: inicializacin de variables de control del bucle. Se ejecuta una sola vez, antes de entrar. El cuerpo
Incremento o decremento de la variable de control. Se ejecuta al final del cuerpo del bucle.
Ejemplo:
i=1 i
suma = 0; for (i = 1 ; i <= 10 ; i++) { cubo = i * i * i; suma += cubo; } printf("El sumatorio es %d\n", suma);
for suele usarse cuando el nmero de iteraciones es conocido a priori y puede controlarse con una variable contador
10
11
continue evita la ejecucin del resto del cuerpo del bucle en una iteracin determinada.
if (num > 100) { printf("Valor demasiado grande\n"); continue; /* No ejecutar el resto de sentencias */ /* e ir al final del bucle. */ }
} while (num != 0 );
Ejercicios (I)
12
Escribir un programa que calcule la potencia de un nmero entero, dado su valor y el del exponente.
Escribir un programa que lea N nmeros enteros y muestre el mayor y el menor de todos ellos.
Escribir un programa que escriba la tabla de multiplicar de un nmero entero ledo por teclado.
Escribir un programa que muestre la serie de Fibonacci hasta un lmite dado. Recordar que la serie de Fibonacci se define como:
F0 = 1
F1 = 1
Fi = Fi1 + Fi2
Ejercicios (II)
13
Escribir un programa que convierta un nmero entero positivo a cualquier base de numeracin dada, igual o inferior a 10.
Escribir un programa que calcule el factorial de un nmero entero ledo por teclado.
Escribir un programa que calcule la suma de todos los nmeros mltiplos de 5 comprendidos entre dos enteros ledos por teclado.
Introduccin a la programacin en C
Notacin:
Constantes: L o l postfija
Ejemplo:
16 bits
Rango: [0, 2161] = [0, 65535] Rango: [0, 2321] = [0, 4294967295]
32 bits
Constantes: U postfija
Ejemplo:
int unsigned int short int unsigned short int long int unsigned long int
Tipo
Rango [2147483648, 2147483647] [0, 4294967295] [32768, 32767] [0, 65535] [2 63 , 2 63 1] [0, 2 64 1]
ASCII 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
char ASCII NUL \0 32 SOH 33 STX 34 ETX 35 EOT 36 ENQ 37 ACK 38 BEL \a 39 BS \b 40 HT \t 41 LF \n 42 VT \v 43 FF \f 44 CR \r 45 SO 46 SI 47
ASCII 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
char DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
F + 5
Tipo
Formato %c %d %d %u
10
Usar el cdigo ASCII (decimal, octal o hexadecimal): \9 tabulador (ASCII decimal) espacio en blanco (ASCII octal)
\040
Secuencias de escape:
Cdigo
\a \n \r \t
\ \" \0
Significado pitido nueva lnea retorno de carro tabulador comilla simple comillas nulo
11
int char
cod; c;
Aspectos prcticos: Cdigo numrico de un carcter c : d = (int)c (int)0; Carcter correspondiente a un dgito entero d : c = (char)((int)0 + d);
12
13
Calcular y i 1000
i=1 1i
#include <stdio.h> #define LIMITE 1000 void main () { int i, fin; float suma, epsilon;
suma = 0.0; fin = 0; i = 1; scanf("%f", &epsilon); while ( ! fin ) { suma += (1/i); i++; fin = ((1/i < epsilon) || ( i> LIMITE)); } printf("La suma es %f\n", suma);
14
math.h : librera estndar con funciones matemticas (sqrt, sin, cos, ...)
float
Tipo
double
long double
Rango Tamao 1.1754945E38 4 bytes 3.4028232E+38 2.225073858507202E308 8 bytes 1.797693134862312E+308 8.4...E4932 16 bytes 5.9...E+4932
Ejercicios (I)
15
Escribir un programa que cuente el nmero de veces que aparece un letra en una secuencia de caracteres acabada en . .
Escribir un programa que lea un carcter de teclado e informe de si es alfabtico, numrico, blanco o un signo de puntuacin.
Escribir un programa que convierta una secuencia de dgitos entrados por teclado, al nmero entero correspondiente. Supngase que el primer dgito ledo es el de mayor peso, y obsrvese que no se conoce su peso en el nmero, puesto que inicialmente se desconoce el nmero de dgitos en la secuencia.
Escribir un programa que calcule y muestre por pantalla las races de una ecuacin de segundo grado, leyendo previamente los coeficientes A, B y C de la misma : Ax 2 + Bx + C = 0 .
e= i=0 1i!
Introduccin a la programacin en C
Introduccin
Creacin de tipos de datos complejos: vectores, matrices, tablas multidimensionales y cadenas de caracteres
tipo_de_datos nombre_tabla[tamao];
tipo_de_datos
nombre_tabla
tamao
Vectores (II)
nombre_vector[ndice];
Ejemplos:
#define TAM 100 void main () { int vector[TAM], i; for (i=0; i<TAM; i++) vector[i] = 0; }
int int
contador[10]; i, j, x;
Vectores (III)
Inicializacin:
Ejemplos:
/* Correcto */ /* Correcto */ /* Correcto */ /* Incorrecto */
No se puede comparar un vector con otro, ni copiar (asignar) un vector en otro directamente elemento a elemento
#include <stdio.h> void main () { int num; int c0=0, c1=0, c2=0, c3=0;
scanf("%d", &num); while ( num != 1 ) { if (num == 0) c0++; if (num == 1) c1++; if (num == 2) c2++; if (num == 3) c3++; scanf("%d", &num); } %d\n", %d\n", %d\n", %d\n", c0); c1); c2); c3);
= = = =
#include <stdio.h> #include <math.h> #define MAX 100 void main () { float v[MAX], modulo; int i;
/* Calcular el mdulo */ modulo = 0.0; for (i=0; i<MAX; i++) modulo += (v[i]*v[i]); modulo = sqrt(modulo);
tipo_de_datos nombre_tabla[tamao1][tamao2];
tamao1
: nmero de filas
tamao2
: nmero de columnas
Matrices (II)
nombre_matriz[ndice1][ndice2];
Inicializacin:
int mat[3][4] = { {24, 12, 6, 17}, {15, 28, 78, 32}, {0, 44, 3200, 34} }
10
#include <stdio.h> #define MAX 20 void main () { int m[MAX][MAX], mt[MAX][MAX]; int fil, col, i, j;
/* Lectura de la matriz */ printf("\nNum. Filas"); scanf("%d", &fil); printf("\nNum. Columnas"); scanf("%d", &col); printf("Introducir la matrix por filas:"); for (i=0; i<fil; i++) for (j=0; j<col; j++) { printf("\nm[%d][%d] = ", i, j); scanf("%d", &m[i][j]); }
/* Traspuesta */ for (i=0; i<fil; i++) for (j=0; j<col; j++) mt[j][i] = m[i][j];
/* Escritura de la matriz */ for (i=0; i<fil; i++) for (j=0; j<col; j++) printf("\nmt[%d][%d] = %d ", i, j, mt[i][j]);
11
Declaracin:
tipo_de_datos nombre_tabla[tam1][tam2]...[tamN];
Acceso:
nombre_tabla[ndice1][ndice2]...[ndiceN];
12
13
#include <stdio.h> #include <stdlib.h> #define DIM 10 void main () { int tab[DIM][DIM][DIM]; int a, b, c;
/* Inicializacin */ for (a=0; a<DIM; a++) for (b=0; b<DIM; b++) for (c=0; c<DIM; c++) tab[a][b][c] = rand();
/* Escritura de la tabla, de DIM en DIM elementos */ for (a=0; a<DIM; a++) for (b=0; b<DIM; b++) { for (c=0; c<DIM; c++) { printf("\ntab[%d][%d][%d] = ", a, b, c); printf("%d", tab[a][b][c]); } printf("\nPulse ENTER para seguir"); getchar(); }
14
El ltimo elemento til del vector debe ser el carcter nulo (cdigo ASCII 0) \0 declarar un vector con N+1
Ejemplo: char cadena[6]; reserva suficiente espacio para almacenar una cadena de hasta 5 caracteres:
15
char cadena[10];
... char nombre[10] = {N,U,R,I,A,\0}; char nombre[10] = "NURIA"; char nombre[] = "NURIA";
= = = = = =
c; a; s; c; o; \0;
Cadena vaca:
char cadena[12] = "Una frase"; ... cadena = \0; /* Ahora es una cadena vacia */
16
etc.
17
#include <stdio.h> #include <string.h> void main () { char cad1[80], cad2[80], cad3[160]; int i, delta;
printf("\nCadena 1: "); gets(cad1); printf("\nCadena 2: "); gets(cad2); /* cad3 = cad1 + cad2 */ strcpy(cad3, cad1); strcat(cad3, cad2);
i = 0; delta = a A; while (cad3[i] != \0) { if ((cad3[i]>=a) && (cad3[i]<=z)) cad3[i]=delta; /* Convierte en mayscula */ else if ((cad3[i]>=A) && (cad3[i]<=Z)) cad3[i]+=delta; /* Convierte en minscula */ i++; } printf("La cadena resultante es: %s\n", cad3);
Ejercicios (I)
18
Escribir un programa que lea del teclado un vector de 10 nmeros enteros, lo invierta, y finalmente lo muestre de nuevo.
Escribir un programa que cuente el nmero de palabras de ms de cuatro caracteres en una frase. sta se almacena en forma de vector cuyo ltimo elemento es el carcter ..
Escribir un programa que lea del teclado dos nmeros enteros de hasta 20 dgitos y los sume. Usar vectores para almacenar los dgitos.
Escribir un programa que calcule la moda de un conjunto de nmeros enteros almacenados en un vector.
Ejercicios (II)
19
Escribir un programa que inicialice cada elemento de una matriz de enteros con el valor se la suma de su nmero de fila y columna.
Escribir un programa que calcule los puntos de silla de una matriz de enteros. Un elemento de la matriz es un punto de silla si es el mnimo de su fila y el mximo de su columna.
Ejercicios (III)
20
Escribir un programa que dada una cadena de caracteres y un entero correspondiente a una posicin vlida dentro de ella, genere una nueva cadena de caracteres que contenga todos los caracteres a la izquierda de dicha posicin, pero en orden inverso.
Escribir un programa que dada una cadena de caracteres, la limpie de caracteres blancos. Escribirdos versiones, una utilizando una cadena auxiliar y otra versin que realice los cambios sobre la misma cadena.
Escribir un programa que lea dos cadenas de caracteres, las compare, e informe de si son iguales o diferentes.
Introduccin a la programacin en C
Ejemplo:
struct cliente { char nombre[100]; long int dni; char domicilio[200]; long int num_cuenta; float saldo; }
struct nombre_estructura { tipo_campo_1 nombre_campo_1; tipo_campo_2 nombre_campo_2; ... tipo_campo_N nombre_campo_N; } lista_de_variables;
cli1.nombre
strcpy(cli2.nombre, "Federico Sancho Bruch"); cli2.dni = 23347098; gets(cli2.domicilio); scanf("%ld", &cli2.num_cuenta); cli2.saldo += 10000.0;
struct cliente cli2 { "Federico Sancho Buch", 23347098, "Rue del Percebe 13 Madrid", 7897894, 1023459.34 };
cli2 = cli1;
#include <stdio.h> struct datos { char nombre[20], apellido[20]; long int dni; }; struct tablapersonas { int numpersonas; struct datos persona[100]; }; void main () { int i; struct tablapersonas tab;
printf("Nmero de personas: "); scanf("%d", &tab.numpersonas); for (i=0; i<tab.numpersonas; i++) { printf("\nNombre: "); gets(tab.persona[i].nombre); printf("\nApellido: "); gets(tab.persona[i].apellido); printf("\nDNI: "); scanf("%ld", &tab.persona[i].dni); }
union aeroplano { struct jet jet_u; struct helicoptero helicoptero_u; struct carguero carguero_u; }
struct un_aeroplano { /* 0:jet , 1:helicoptero , 2:carguero */ int tipo; union aeroplano datos; };
Ejemplo:
enum dia_semana { LUNES=1, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO=10, FESTIVO=10 };
... if (dia <= VIERNES) printf("Es laborable"); ... dia = MARTES; /* Muestra el valor de la constante: 2 */ print("Hoy es: %d", dia); ...
10
Muy til para tipos complejos: tablas, estructuras, uniones, enumeraciones, etc.
11
#include <stdio.h>
12
Variable entera con o sin signo (char, short, int, long, unsigned, etc.)
13
Operador : ~
#include <stdio.h> void main () { unsigned short a, b; /* a = /* b = b= b= b= b= 0xa4c3 b= 42179 b= 23357 0101 1011 1010 0100 %x\n", a, %u\n", a, %d\n", a, 0011 1100 */ 1100 0011 */ b); b); b);
14
Operaciones lgicas bit a bit: "Y" (AND) : & "O" (OR) : | "O exclusiva" (XOR) : ^ Tabla de verdad:
y 0 1 0 1
/* /* /* /* /* a b c d e = = = = = 1101 1010 1000 1111 0111 1011 0101 0001 1111 1110
x 0 0 1 1
AND (&) 0 0 0 1
OR (|) 0 1 1 1
XOR (^) 0 1 1 0
0001 1100 0000 1101 1101 1101 1011 1001 1111 0110 */ */ */ */ */
Ejemplos:
a= b= c= d= e=
15
Hacia la derecha: var1 >> var2 var1 es la tira de bits y var2 el nmero de bits a desplazar Se pierden los bits de menor peso y se aaden 0s por la izquierda si var1 es unsigned, o se replica el bit de ms peso si var1 es signed var >> n equivale a var/2n
Hacia la izquierda: var1 << var2 var1 es la tira de bits y var2 el nmero de bits a desplazar Se pierden los bits de mayor peso y se aaden 0s por la derecha var << n equivale a var*2n
16
Ejemplo:
a= b= c= d= e= f= g=
c; c; c; c;
/* /* /* /* /* /* /*
a b c d e f g
= = = = = = =
*/ */ */ = 224 */ = 3 */ = 224 */ = 3 */
Ejercicios (I)
17
Escribir un programa que, dadas dos fechas, indique cul es anterior a la otra. Definir una estructura para el tipo de datos fecha (da, mes y ao).
Definir una estructura de datos para representar polinomios de hasta grado 10. Escribir un programa capaz de sumar dos polinomios expresados con dicha estructura.
typedef char Tstring[50]; typedef struct { long int num; char letra; } Tnif; typedef struct { Tnif nif; Tstring nombre, direccion; long int telf; }
Escribir un programa que defina un vector con los datos de N empresas y permita introducirlos por teclado. Dado el NIF de una empresa, el programa deber permitir mostrar sus datos, as como eliminarla del vector, reorganizndolo para no dejar espacios vacios.
Ejercicios (II)
18
typedef char Tstring[50]; typedef struct { Tstring nombre, area; long int ventas[4]; } Tagente;
Escribir un programa que defina un vector de N agentes comerciales, permita introducir los datos por teclado, y finalmente muestre los datos del agente con la mxima media de ventas.
typedef char Tstring[50]; typedef struct { Tstring pais; int temp_max, temp_min; } Ttemp;
Escribir un programa que defina un vector con los datos de N pases y permita introducirlos por teclado. Finalmente, el programa deber mostrar el nombre de los pases cuya temperatura mnima sea inferior a la media de las temperaturas mnimas.
Funciones
Introduccin a la programacin en C
Introduccin
Propsito nico
Identificable
Reusable
Generalidades
Paquete de sentencias
Resultado
Ejemplo (I)
m! m = n! m n ! n
#include <stdio.h> void main() { long int m, n, fm = 1, fn = 1, fdif = 1; float res; int i;
Ejemplo (II)
m! m = n! m n ! n
printf( "Introduzca m y n: " ); scanf( "%d %d", &m, &n ); res = (float)fact(m) / ((float)fact(n) * (float)fact(mn)); printf( "m sobre n = %f\n", res );
Definicin
tipoi parami : tipo y nombre de los parmetros formales. Nombres con que referirse dentro de la funcin a los datos que se transfieren a sta desde la parte del programa que hace la llamada.
cuerpo: declaracin de variables + sentencias (incluyendo llamadas a funciones). Puede incluir la sentencia return para devolver un valor al punto de llamada.
Prototipos
Especificacin parcial de la funcin La definicin puede ser posterior al punto de llamada muy usados
#include <stdio.h>
printf( "Introduzca m y n: " ); scanf( "%d %d", &m, &n ); res = (float)fact(m) / ((float)fact(n) * (float)fact(mn)); printf( "m sobre n = %f\n", res );
Variables y parmetros
Llamada
Si la funcin devuelve algn valor, la llamada debera aparecer dentro de una expresin
Ejemplos:
fm = fact(m);
10
Devolucin de resultados
Sentencia return
11
Ejecucin (I)
parmetros formales
Liberacin de memoria
12
Ejecucin (II)
long int fact ( int x ) { int i; long int f = 1; for (i = 2; i <= x; i++) f = f * i; return(f);
Memoria m fm Pila f i
13
#include <stdio.h>
14
Devolver ms de un valor?
15
#include <stdio.h>
scanf( "%d %d", &a, &b ); swap( &a, &b ); printf( "Los nuevos valores son a=%d y b=%d\n", a, b );
16
Declaracin
Llamada
Declaracin
Llamada
17
Ejercicio
#include <stdio.h> void main() { int a = 0, b = 0; < llamada > } printf( "%d %d\n", a, b );
void f1( int x, int *y, int a, int b ) { x = x + 1; *y = *y + 1; x = x + a; *y = *y + b; printf( "%d %d\n", x, *y ); }
18
Ejemplo:
printf( "Introducir elementos del vector:\n" ); for (i= 0; i< 20; i++) scanf( "%d", &v[i] );
max = v[0]; for (i= 1; i< 20; i++) max = maximo( max, v[i] ); printf( "El elemento mayor es: %d\n", max );
19
No se usa & ni *
20
#include <stdio.h> #define DIM 20 float media( float vec[], int n ) { int j; float sum;
sum = 0.0; for (j= 0; j< n; j++) sum = sum + vec[j]; return (sum/(float)n);
printf( "Introducir elementos del vector:\n" ); for (i= 0; i< DIM; i++) scanf( "%f", &v[i] ); med = media( v, DIM ); printf( "La media es: %f\n", med );
21
void matXvec( int nfil, int ncol, float A[], float x[], float y[] ) { /*Calcula y = A*x */ int i, j;
for (i= 0; i< nfil; i++) { y[i] = 0.0; for (i= 0; i< ncol; i++) y[i] += (A[i*MAXCOL+j] * x[j]); }
... /* Leer nfil, ncol, A, x */ matXvec( nfil, ncol, M, v1, v2 ); ... /* Mostrar y */
22
23
#include <stdio.h> typedef struct { char nombre[80]; long int ndni; } Tdni;
void leer_dni( Tdni *p ) { gets((*p).nombre); /* gets(p>nombre); */ scanf("%ld", &(*p).ndni); /* scanf("%ld", & p>ndni); */ }
24
Funcin main
argc : indica el nmero de parmetros dados al programa, i.e. nmero de cadenas en argv
25
Funcin main
Ejemplo:
#include <stdio.h> void main( int argc, char *argv[] ) { if (argc > 2) { printf( "Demasiados parmetros\n" ); } else if (argc < 2) { printf( "Faltan parmetros\n" ); } else { printf( "Yo te saludo %s\n", argv[1] ); } }
26
Recursividad
Iterativa
Una funcin se llama a s misma repetidamente hasta que se satisface cierta condicin
Recursiva
Ejemplos: Fibonacci
int fibo ( int n ) { if ((n == 0) || (n == 1)) return(1); return (fibo(n1)+fibo(n2)); }
Factorial
Punteros
Introduccin a la programacin en C
Introduccin
Declaracin: *
Operador
&
double double
num; *pnum;
. . .
num = 75.435;
pnum = #
. . .
Indireccin: *
Operador de indireccin
. . .
. . .
x = 20; p = &x; *p = 5498; printf("La direccin contenida en p es: %p", p); printf("El valor de la variable apuntada por p es: %d", *p); y = *p;
. . .
Indireccin mltiple
Un puntero contiene la direccin de otro puntero que a su vez apunta a una variable
. . .
Indireccin
precaucin
Podemos provocar fallos inesperados en el programa: acceso a cdigo o datos de otros programas, etc.
Ejemplo:
. . .
int *x;
*x = 100;
. . .
Asignacin de punteros
Ejemplo:
. . .
. . .
/* Ahora p1 y p2 apuntan a x */
. . .
Comparacin de punteros
Util para saber la posicin relativa que ocupan en memoria ciertas variables
Ejemplo:
. . .
. . .
10
Aritmtica de punteros
Suma o resta de una cantidad entera Incremento o decremento de la direccin contenida en el puntero
El nmero de posiciones de memoria incrementadas depende del tipo de datos apuntado por el puntero:
puntero = puntero + N;
Se interpreta como:
. . .
float
a, b, *pa, *p;
pa = &a; p = pa + 3;
. . .
11
El nombre de una tabla es un puntero que contiene la direccin del primer elemento de la tabla: tab &tab[0]
Es una constante
. . .
. . .
ptab = tab; ptab = ptab + 3; car = *(ptab); /* Equivale a car = tab[3]; */ scanf( "%c", ptab+5 ); printf( "%c", *(ptab+10) );
. . . tab[0] */ *(ptab+7) */
/* Tambin accesibles como tablas. */ scanf( "%c", ptab[0] ); /* ptab[0] equivale a ptab[7] = R; /* ptab[7] equivale a
. . .
12
Ejemplo: matriz n filas y m columnas elemento de la fila i y la fila j es el que ocupa la posicin i*m+j desde el principio de la tabla
13
Punteros y estructuras
Operador
Operador
Operador
Tnif cliente, *pc; Tempresa emp, *pe; char inicial; . . . pc = &cliente;
& : direccin del inicio de la estructura en memoria * : acceso al inicio de la estructura > : acceso a un campo de una estrutura a travs de puntero
(*pc).letra = Z; scanf( "%ld", &(*pc).num ); pc>letra = Z; scanf( "%ld", &pc>num ); pe = &emp; pe>nif.letra = Z; scanf( "%ld", &pe>nif.num ); gets( pe>nombre ); inicial = pe>nombre[0];
typedef struct { Tnif nif; Tstring nombre; Tstring direc; long int telf; } Tempresa;
Ficheros
Introduccin a la programacin en C
Introduccin
Tipos de ficheros
Ficheros de texto
Pueden visualizarse
2147483648 11 bytes
Ficheros binarios
2147483648 4 bytes
stdio.h
Ejemplo
Generalidades
EOF (End Of File)
Tipo especial FILE . Las variables pertenecen al S.O. Pista y sector de inicio del fichero
Buffers internos
...
Operaciones
Leer o escribir en el fichero: fscanf o fprintf Basta indicar el puntero a la variable de tipo FILE y la informacin que queremos leer o escribir
Cerrar el fichero: fclose Se indica al S.O. que ya no necesitamos la variable de tipo FILE asociada al fichero
nombreFichero: cadena de caracteres que indica el nombre del fichero fsico que se quiere abrir
modoAcceso: cadena de caracteres que indica el uso que haremos del fichero
"w" : abrir un fichero nuevo para escritura. Si ya exista ser destruido y creado de nuevo
"a" : abrir un fichero ya existente para aadir informacin al final del mismo. Si el fichero no exista se crear uno nuevo
fopen retorna el puntero a la variable de tipo FILE que el S.O. usar para gestionar el fichero
"r+" : abrir un fichero ya existente tanto para lectura como para escritura
"w+" : abrir un fichero nuevo tanto para lectura como para escritura. Si ya exista ser destruido y creado de nuevo
"a+" : abrir un fichero ya existente para leer y aadir informacin al final del mismo. Si el fichero no exista se crear uno nuevo
10
Ejemplos (I)
#include <stdio.h>
fp = fopen( "mifichero.txt", "r" ); if (fp == NULL) { printf( "Error abriendo mifichero.txt\n" ); exit(0); }
. . .
. . .
fclose( fp );
11
Ejemplos (II)
printf( "Nombre del fichero (< %d caracteres): ", N ); scanf( "%s\%*c", nombreFichero ); fp = fopen( nombreFichero, "w" ); if (fp == NULL) { printf( "Error abriendo %s\n", nombreFichero ); exit(0); }
. . .
. . .
fclose( fp );
12
formato es una cadena de caracteres que indica el formato de las variables a leer
<lista variables> es una lista, separada por comas, de direcciones de memoria (punteros) de variables
Retorna el nmero de variables correctamente ledas de acuerdo con el formato especificado, o EOF si se produjo algn error
13
formato es una cadena de caracteres que indica el formato de las variables a escribir
Retorna el nmero de bytes (caracteres) correctamente escritos, o un nmero negativo si se produjo algn error
14
Ejemplo
#include <stdio.h> #define MAXELE 100 void main( ) { FILE *fp; char nombreFichero[256]; int lon = 0, vec[MAXELE];
printf( "Fichero de entrada(< 256 caracteres): " ); scanf( "%s%*c", nombreFichero ); fp = fopen( nombreFichero, "r" ); /* Control de errores */ fscanf( fp, "%d", &lon ); if (lon < MAXELE) for (i=0; i<lon; i++) fscanf( fp, "%d", &vec[i] ); else printf( "El vector tiene demasiados elementos\n" ); fclose( fp );
printf( "Fichero de salida(< %d caracteres): ", N ); scanf( "%s%*c", nombreFichero ); fp = fopen( nombreFichero, "w" ); /* Control de errores */ fprintf( fp, "%d\n", lon ); for (i=0; i<lon; i++) fprintf( fp, "%d\n", vec[i] ); fclose( fp );
15
Retorna un valor diferente de 0 (cierto) si se lleg a EOF en una lectura anterior si fscanf no pudo completarse
16
#include <stdio.h> #define N 256 #define MAXELE 100 void main( ) { FILE *fp; char nombreFichero[N]; int lon, vec[MAXELE];
printf( " Nombre del fichero(< %d caracteres): ", N ); scanf( "%s%*c", nombreFichero ); fp = fopen( nombreFichero, "r" ); if (fp == NULL) { printf( "Error abriendo %s\n", nombreFichero ); exit(0); } lon = 0; while (!feof(fp) && (lon < MAXELE)) { kk = fscanf( fp, "%d", &vec[lon] ); if (kk == 1) lon++; if (!feof(fp) && (lon == MAXELE)) printf( "Demasiados datos en el fichero\n" ); } fclose( fp );
. . .
17
Comprueba si se produjo un error en una operacin anterior sobre el fichero apuntado por fp
18
19
Ficheros estndar
stdout y stderr: apuntan a un fichero abierto slo para escritura, inicialmente la pantalla scanf("%d", &i); printf("%d", i); printf("%d", i);