238
1 Introducción al lenguaje C Marta Zorrilla Universidad de Cantabria

Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Embed Size (px)

Citation preview

Page 1: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

1

Introducción al lenguaje C

Marta ZorrillaUniversidad de Cantabria

Page 2: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

2

Introducción al C

Objetivos:Presentar la historia del lenguaje C y sus características principales.Presentar la estructura de un programa en C mediante ejemplos sencillos.

Contenidos:1. La historia del C.2. Características.3. Mi primer programa en C.

Page 3: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

3

Historia del C

Muchas ideas provienen de BCPL (Martin Richards, 1967) y de B (KenThompson, 1970).C fue diseñado originalmente en 1972 para el SO UNIX en el DEC PDP-11 por Dennis Ritchie en los Laboratorios Bell.Primer Libro de referencia de C: The C Programming Language (1978) de Brian Kernighan y Dennis Ritchie.En los 80, gran parte de la programación se realiza en C.En 1983 aparece C++ (orientado a objetos).En 1989 aparece el estándar ANSI C.En 1990 aparece el estándar ISO C (actual estándar de C). WG14 se convierte en el comité oficial del estándar ISO C.En década de los 90, WG14 trabaja en el estándar C9X/C99 que resuelve problemas de fiabilidad del ANSI C, amplia su funcionalidad con nuevos tipos de dato, funciones matemáticas, arrays irrestringidos, etc.

Page 4: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

4

Características del C

Lenguaje de programación de propósito general, muy adecuado paraprogramación de sistemas (unix fue escrito en C).Lenguaje relativamente pequeño: solo ofrece sentencias de control sencillas y funciones.La E/S no forma parte del lenguaje, sino que se proporciona a través de una biblioteca de funciones.Permite la agrupación de instrucciones. Programación estructurada.Permite la separación de un programa en módulos que admiten compilación independiente. Diseño modular.Programas portables.

Page 5: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

5

Inconvenientes del C

No es un lenguaje fuertemente tipado.Es bastante permisivo con la conversión de datos.Sin una programación metódica puede ser propenso a errores difíciles de encontrar.La versatilidad de C permite crear programas difíciles de leer.

#define _ -F<00||--F-OO--;int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO(){…..}

Page 6: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

6

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);

}

Page 7: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

7

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);

}

Page 8: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

8

Crear, compilar y ejecutar un programa C

Crear un fichero con extensión .c con un editor de textoMandato de compilación básico:cc ejemplo.c- Genera el código objeto ejemplo.o- Genera el ejecutable a.out- El programa se ejecuta tecleando a.out

El mandato cc -c ejemplo.c genera el fichero objeto ejemplo.oEl mandato cc ejemplo.o -o ejemplo genera el ejecutable ejemplo

- El programa se ejecuta tecleando ejemplo.

Page 9: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

9

Modelo de compilación C

Page 10: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

10

Entorno desarrollo IDE

Page 11: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

11

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);}

Sean dos cuadrados de lados L1 y L2 inscritos uno en otro. Calcula el área de la zona comprendida entre ambos, utilizando para ello una función (que se llamaráAreaCuadrado) que devuelve el área de un cuadrado cuyo lado se pasa como argumento

Page 12: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

12

Elementos de un programa en C

Page 13: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

13

Elementos de un programa CObjetivos:

Mostrar la utilidad de documentar el código utilizando los comentarios.Explicar los conceptos de variable y tipo de dato. Conocer los identificadores válidos y tipos de constantes.Enseñar las instrucciones de lectura y escritura junto con el formato de los datos.

Contenidos:1. Comentarios2. Identificadores y palabras reservadas 3. Constantes4. Variables y tipos de dato5. Escritura de datos con printf()6. Lectura de datos con scanf()

Page 14: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

14

Elementos de un programa C

Básicamente el C está compuesto por los siguientes elementos:

• Comentarios• Identificadores• Palabras reservadas• Variables y tipos de datos• Constantes • Operadores

Page 15: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

15

Comentarios

Sirven para incrementar la legibilidad de los programas.No se pueden anidar. Dentro de un comentario no puede aparecer el símbolo /*

/* Este es un comentario queocupa más de una línea */

// Este comentario ocupa una sola línea

Page 16: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

16

Identificador

Nombre que se asigna a los distintos elementos del programa (variables, funciones,…).

Identificadores NO válidos:Empezar por –Empezar por un númeroUtilizar la "

Ejemplos válidos:numeroarea_circulovalor_1

Page 17: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

17

Palabras reservadas

auto do for return typedefbreak double goto short unioncase else if sizeof unsignedchar enum int static voidconst extern long struct volatilecontinue float register switch whiledefault

Es preciso insistir en que C hace distinción entre mayúsculas y minúsculas. Por lo tanto, la palabra reservada for no puede escribirse como FOR, pues el compilador no la reconoce como una instrucción, sino que la interpreta como un nombre de variable.

Page 18: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

18

Variables

Identificador utilizado para representar un cierto tipo de información.Cada variable es de un tipo de dato determinado.Una variable puede almacenar diferentes valores en distintas partes del programa.

Page 19: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

19

Tipos de datos básicos

8doublecoma flotante (doble precisión)

4floatcoma flotante (simple precisión)

2intentero1charcarácter0voidsin valor

TAMAÑO EN BYTES

PALABRA RESERVADA

TIPO

Page 20: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

20

Tipos de datos. Modificadores

10 bytes±3,4*10-4932 a ±1,1*10+4932long8 bytes±1,7*10-308 a ±1,7*10+308double4 bytes±3,4*10-38 a ±3,4*10+38float4 bytes-2.147.483.648 a 2.147.483.647signed4 bytes0 a 4.294.967.295unsignedlong2 bytes-32.768 a 32.767signed2 bytes0 a 65.535unsignedshortint1 byte-128 a 127signed1 byte0 a 255unsignedcharOcupaRangoModificadoresTipo

El tipo de dato int coincide con el tamaño de palabra del procesador, generalmente 4 bytes

Page 21: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

21

Declaración de variablesUna declaración asocia un tipo de datos determinado a una o más variables.

El formato de una declaración es:

tipo_de_dato var1, var2, ..., varN;

Ejemplos:int a, b, c;float numero_1, numero_2;char letra;unsigned long entero;

Deben declararse todas las variables antes de su uso.

Deben asignarse a las variables nombres significativos.int temperatura;int k;

Page 22: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

22

Tipos definidosPermite dar nuevo nombre a tipos de datos que ya existen, siendo estos más acordes con aquello que representan.

Sintaxis:

typedef tipo_basico nombre;

Declaración :

typedef float Kg;typedef float Mts;

Y su uso al declarar variables:

Kg peso;Mts longitud;

Page 23: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

23

La función printf()

Permite imprimir información por la salida estándar (pantalla)

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);

Page 24: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

24

La función printf() (y 2)

Formatos.

TIPO DE ARGUMENTO

CARÁCTER DE FORMATO

FORMATO DE SALIDA

Numérico %d signed decimal int %i signed decimal int %o unsigned octal int %u unsigned decimal int %x unsigned hexadecimal int (con a, ..., f) %X unsigned hexadecimal int (con A, ..., F) %f [-]dddd.dddd %e [-]d.dddd o bien e[+/-]ddd %g el más corto de %e y %f %E [-]d.dddd o bien E[+/-]ddd %G el más corto de %E y %f

Carácter %c carácter simple %s cadena de caracteres %% el carácter %

Punteros %n se refieren a punteros y se %p estudiarán en el Capítulo 7

14

Page 25: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

25

La función printf() (y 3)

Secuencias de escape.

CARÁCTER BARRA SIGNIFICADO

\a Alarma (Beep)

\b Retroceso (BS)

\t Tabulador Horizontal (HT)

\n Nueva Línea (LF)

\v Tabulador Vertical (VT)

\f Nueva Página (FF)

\r Retorno

\" Comillas dobles

\' Comilla simple

\\ Barra invertida

Page 26: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

26

La función printf (y 4)

Especificadores de ancho de campo:

printf("Numero entero = %5d \n", 28);produce la salida:

Numero entero = 28

printf("Numero real = %5.4f \n", 28.2);produce la salida:

Numero real = 28.2000

Page 27: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

27

Función scanf()

Permite leer datos del usuario.La función devuelve el número de datos que se han leído bien.Formato:

scanf(formato, argumentos);

Especificadores de formato igual que printf().

Ejemplos:scanf("%f", &numero);scanf("%c\n", &letra);scanf("%f %d %c", &real, &entero, &letra);scanf("%ld", &entero_largo);scanf("%s", cadena); no &

&

No va texto

Page 28: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

28

Función scanf() (y 2)Ejemplo: lee un número entero y lo eleva al cuadrado:

#include <stdio.h>

void main(){

int numero;int cuadrado;printf("Introduzca un numero:");scanf("%d", &numero);cuadrado = numero * numero;printf("El cuadrado de %d es %d\n", numero,cuadrado);

}

Comenzar

ESCRIBIRDame numero

LEER numero

ESCRIBIRnumero y cuadrado

FIN

cuadrado=numero * numero

Page 29: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

29

Constantes simbólicas

Para evitar el uso de valores constantes dentro del código, se definen las constantes simbólicasSuele escribirse en mayúsculas.

#define PI 3.141593#define CIERTO 1#define FALSO 0#define AMIGA "Marta"

no acaba en ;

Page 30: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

30

Constantes o literalesCaracteres:

Ejemplos: "Marta ", " barco"

Valores enteros:Notación decimal: 987Notación hexadecimal: 0x25 ó 0X25Notación octal: 034Enteros sin signo: 485UEnteros de tipo long: 485LEnteros sin signo de tipo long: 485ULValores negativos (signo menos): -987

Valores reales (coma flotante):Ejemplos: 12, 14, 8., .34Notación exponencial: .2e+9, 1.04E-12Valores negativos (signo menos): -12 -2e+9

Page 31: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

31

Ejemplo. Programa que lee el radio de un círculo y calcula su área

#include <stdio.h>#define PI 3.141593void 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

ESCRIBIRDame radio

LEER radio

ESCRIBIRarea

FIN

area = PI * radio * radio

PI =3.141593

Page 32: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

32

Ejercicios

Encuentra erroresinclude studio.h

/* Programa que dice cuántos días hay en una semana /*

main {}(

int d

d := 7;print (Hay d días en una semana);

Page 33: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

33

EjerciciosIndica cuál sería la salida de cada uno de los siguientes grupos de sentencias:

a) printf ("Historias de cronopios y famas.");printf ("Autor: Julio Cortázar");

b) printf ("¿Cuántas líneas \nocupa esto?");c) printf ("Estamos \naprendiendo /naprogramar en C");d) int num;

num = 2;printf ("%d + %d = %d", num, num, num + num);

Page 34: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

34

Operadores y expresiones

Page 35: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

35

Operadores y expresiones

Objetivos:Mostrar el concepto de expresión, operador y sentencia.Mostrar el repertorio de operadores de C y el orden de precedencia.

Contenidos:1. Expresiones y sentencias2. Operador asignación. Conversión de tipos3. Operadores aritméticos4. Operadores relacionales5. Operadores lógicos6. Operadores de asignación compuestos7. Precedencia

Page 36: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

36

Expresiones y sentencias

Sentencia: especifica una acción a realizarEj. printf()

Expresión: secuencia de operadores y operandos que especifican un valor

Ej. 4 + 5

Una expresión se convierte en una sentencia cuando va seguida de un punto y coma. Cuando un grupo de sentencias se encierran entre llaves { }, forman un bloque, sintácticamente equivalente a una

sentencia.

Page 37: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

37

Operador de asignaciónForma general: identificador = expresión ; Ejemplos:

a = 3;area = lado * lado;

El operador de asignación = y el de igualdad ==

Asignaciones múltiples:id_1 = id_2 = ... = expresión

Las asignaciones se efectúan de derecha a izquierda.En i = j = 5

1. A j se le asigna 52. A i se le asigna el valor de j

Page 38: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

38

Reglas de asignación

Si los dos operandos en una sentencia de asignación son de tipos distintos, entonces el valor del operando de la derecha será automáticamente convertido al tipo del operando de la izquierda.Además:

1. Un valor en coma flotante se puede truncar si se asigna a una variable de tipo entero.2. Un valor de doble precisión puede redondearse si se asigna a una variable de coma flotante de simple precisión.3. Una cantidad entera puede alterarse si se asigna a una variable de tipo entero corto o a una variable de tipo carácter.

Es importante en C utilizar de forma correcta la conversión de tipos.

Page 39: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

39

Conversión de tipos(tipo de dato) expresión

int x;x = 5;y = x / 2;

el valor asignado a la variable y será 2, pues / realiza una división entera.

int x;x = 5;y = (float) x / 2;

Ahora, la variable y almacena el valor 2.5.

int x;x = 5;y = (float) (x / 2);

no se asigna a y el valor 2.5, sino 2, ya que los paréntesis que envuelven a la expresión x / 2 hacen que primero se efectúe la división entera y luego la conversión a flotante

Page 40: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

40

Operadores aritméticos

OPERADOR DESCRIPCIÓN

UNARIOS - Cambio de signo

- - Decremento

++ Incremento

BINARIOS - Resta

+ Suma

* Producto

/ División

% Resto de división entera

• División entera ( / ): división de una cantidad entera por otra ⇒ se desprecia la parte decimal del cociente.

• El operador % requiere que los dos operandos sean enteros.

• La mayoría de las versiones de C asignan al resto el mismo signo del primer operando.

• Valores negativos con el signo -

Page 41: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

41

Ejemploint x, y;x = 9;y = 2;

la operación x / y devuelve el valor 4, mientras que la operación x % y devuelve 1. Sin embargo, después de las sentencias

float x;int y;x = 9.0;y = 2;

la operación x / y devuelve 4.5, no pudiéndose aplicar, en este caso, el operador % puesto que uno de los operandos no es entero.

Page 42: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

42

Operadores incremento, decremento

La expresión es equivalente ai++; i = i + 1;++i; i = i + 1;i--; i = i - 1;--i; i = i - 1;

Si el operador sigue al operando el valor del operando se modificará después de su utilización. Si el operador precede al operando el valor del operando se modificará antes de su utilización.

Ejemplo: si a = 1 Imprime:

printf("a = %d \n", a); a = 1printf("a = %d \n", ++a); a = 2printf("a = %d \n", a++); a = 2printf("a = %d \n", a); a = 3

Page 43: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

43

Operadores relacionales

OPERADOR DESCRIPCIÓN

BINARIOS > Mayor que

>= Mayor o igual que

< Menor que

<= Menor o igual que

== Igual que

!= Diferente que

• Se utilizan para formar expresiones lógicas.• El resultado es un valor entero que puede ser:

cierto, se representa con un 1falso, se representa con un 0

Ejemplo 1: Si a = 1 y b = 2

Expresión Valor Interpretacióna < b 1 ciertoa > b 0 falso(a + b) ! = 3 0 falsoa == b 0 falsoa == 1 1 cierto

Page 44: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

44

Operadores lógicos

OPERADOR DESCRIPCIÓN

UNARIOS ! not

BINARIOS && and

|| or

Actúan sobre operandos que son a su vez expresiones lógicas que se interpretan como:

• cierto, cualquier valor distinto de 0

• falso, el valor 0

VVFVV

VFFFV

VFVVF

FFVFF

a || ba && b!abaTabla de verdad

Page 45: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

45

Ejemplo

&& y || se evalúan de izquierda a derecha.! se evalúa de derecha a izquierda.

Ejemplos: si a = 7 y b = 3

Expresión Valor Interpretación(a + b) < 10 0 falso!((a + b) < 10) 1 cierto(a ! = 2) || ((a +b) <= 10) 1 cierto(a > 4) && (b < 5) 1 cierto

Page 46: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

46

Operadores de asignación compuestos

El operador de asignación se puede combinar con otros operadores como *, /, %, +, -, <<, >>, &, |, ^ para operaciones acumulativas

m *= 5; m = m * 5;

m += b; m = m + b;

m += y - 3; m = m + y - 3;

m - = (y = 5); m = m - (y = 5);

es equivalente a

Page 47: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

47

Precedencia

,15º→

operadores de asignación14º←

?:13º←

||12º→

&&11º→

|10º→

^9º→

&8º→

== !=7º→

< <= > >=6º→

<< >>5º→

+ -4º→

* / %3º→

! ~ ++ -- (cast) * & sizeof2º←

( ) [ ] . ->1º→

OperadoresNivel de prioridad

Evaluación a igual nivel de

prioridad

Page 48: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

48

EjerciciosIndica cuáles de los siguientes identificadores no son correctos y por qué.

a) contador b) CONTADOR c) _hola d) hola_e) dias2 f) 2dias g) Suma_Total h) Suma-Total

Sean x, y, z, u, v y t, variables que contienen, respectivamente, los valores 2, 3, 4, 5, 6 y 7, ¿qué almacenarán después de ejecutar las siguientes sentencias?

x++;y = ++z;t = - -v;v = x + (y *= 3) / 2;u = x + y / 2;

Page 49: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

49

Ejemplo

C = (5/9) * (F - 32)

#include <stdio.h>void main(){

float centigrados;float fahrenheit;

printf("Introduzca una temperatura en grados fahrenheit: ");scanf("%f", &fahrenheit);centigrados = 5.0/9 * (fahrenheit - 32);printf("%f grados fahrenheit = %f grados centigrados \n", fahrenheit, centigrados);

}

Programa que convierte grados Fahrenheit a grados centígrados.

Page 50: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

50

ERRORES COMUNES

Olvidar que el resultado de dividir dos enteros es enteroRealizar división por ceroOlvidar la prioridad de los operadoresErrores en la conversión de tipos Confundir el operador de igualdad y el de asignación

Page 51: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

51

Funciones

Page 52: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

52

Introducción a funciones

Objetivos:Introducir al alumno en el diseño estructurado.Presentar el concepto de función.Mostrar la definición y declaración de funciones en C.

Contenidos:1. Introducción al diseño estructurado. Concepto de función2. Definición de funciones

o Argumentoso Valor de retornoo Llamada a función

3. Declaración de funciones. Prototipos4. Ejemplos

Page 53: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

53

Introducción

Una función es un segmento de programa que realiza una determinada tarea.

Todo programa C consta de una o más funciones.

Una de estas funciones se debe llamar main()

Todo programa comienza su ejecución en la función main()

El uso de funciones permite la descomposición y desarrollo modular. Permite dividir un programa en componentes más pequeños. reutilización

Page 54: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

54

Definición de una funcióntipo nombre_func (tipo1 arg1, ..., tipoN argN)

{/* CUERPO DE LA FUNCION */

}

Los argumentos se denominan parámetros formales.La función devuelve un valor de tipo de dato tipo

Si se omite tipo se considera que devuelve un intSi no devuelve ningún tipo ⇒ voidSi no tiene argumentos ⇒ void

void explicacion(void)

Entre llaves se encuentra el cuerpo de la función (igual que main()).La sentencia return finaliza la ejecución y devuelve un valor a la función que realizó la llamada.

return(expresion);

En C no se pueden anidar funciones

Page 55: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

55

Declaración de funciones: prototipos

No es obligatorio pero si aconsejable.Permite la comprobación de errores entre las llamadas a una función y la definición de la función correspondiente.

tipo nombre_func (tipo1 arg1, ..., tipoN argN);

Page 56: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

56

Llamadas a funcionesPara llamar a una función se especifica su nombre y la lista de argumentos sin poner el tipo de dato.

nombre_func (var1,var2,…,varN);

Parámetros formales: los que aparecen en la definición de la función.Parámetros reales: los que se pasan en la llamada a la función.

En una llamada habrá un argumento real por cada argumento formal, respetando el orden de la declaración.Los parámetros reales pueden ser:

Constantes.Variables simples.Expresiones complejas.

Deben ser del mismo tipo de datos que el argumento formal correspondiente.Cuando se pasa un valor a una función se copia el argumento real en el argumento formal.

Page 57: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

57

Paso de parámetros por valor

En las llamadas por valor se hace una copia del valor del argumento en el parámetro formal.

La función opera internamente con estos últimos.

Como las variables locales a una función (y los parámetros formales lo son) se crean al entrar a la función y se destruyen al salir de ella, cualquier cambio realizado por la función en los parámetros formales no tiene ningún efecto sobre los argumentos.

Page 58: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

58

EjemploPrograma que calcula el máximo de dos números.

Page 59: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

59

Ejemplo:

Función que calcula x elevado a y (con y entero)

#include <math.h>float potencia (float x, int y); /* prototipo */

float potencia (float x, int y) /* definición */{int i;float prod = 1;

prod = pow(x,y);

return(prod);}

Page 60: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

60

Ejemplo 3Programa que indica si un número es cuadrado perfecto.

#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);}

Page 61: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

61

Ejemplo 3 - Continuación

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 */

elseperfecto = FALSE; /* no es cuadrado perfecto */

return(perfecto);}

Page 62: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

62

Paso de parámetros por referencia

Hasta ahora las funciones solo devolvían un valor, pero ¿qué pasa si tienen que devolver más?

En este caso, se requiere pasar parámetros por referencia

La declaración de una función en este caso sería

void nombreFunc (tipo in1, ..., tipo inN, tipo *out1, …tipo *outN){

/* CUERPO DE LA FUNCION */}

La llamada a la función

nombre_func (in1, ..., inN, &out1, …, &outN);

Page 63: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

63

Paso de parámetros por referencia (II)

En este tipo de llamadas los argumentos contienen direcciones devariables.

Dentro de la función la dirección se utiliza para acceder al argumento real.

En las llamadas por referencia cualquier cambio en la función tiene efecto sobre la variable cuya dirección se pasó en el argumento. No hay un proceso de creación/destrucción de esa dirección.

Aunque en C todas las llamadas a funciones se hacen por valor, pueden simularse llamadas por referencia utilizando los operadores &(dirección) y * (en la dirección).

Mediante & podemos pasar direcciones de variables en lugar de valores, y trabajar internamente en la función con los contenidos, mediante el operador *.

Page 64: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

64

Ejemplo 3 – con parámetros por referencia

void explicacion ( int *numero){

printf("Este programa dice si un numero ");printf("es cuadrado perfecto \n");printf("Introduzca un numero: );

scanf("%d", *&n);}

void main(){

int n, perfecto;explicacion(&n);perfecto = cuadrado_perfecto(n);

……..}

Page 65: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

65

Ejercicio 4

Programa que calcula la hipotenusa de un triángulo rectángulo.

h = √(a2 + b2)

Pasos a seguir:1. Leer a y b ⇒ función leer2. Calcular h según la fórmula dada ⇒ definimos una función hipotenusa3. Imprimir el valor de h ⇒ usar printf().

Page 66: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

66

Solución

#include <stdio.h>#include <math.h>

void hipotenusa(float a, float b, float *h){

*h = sqrt(pow(a,2) + pow(b, 2));}

void leer (float *a, float *b){

printf("Dame valores a y b:\n");scanf("%f %f", *&a, *&b);

}

void main(){float a, b, h;leer (&a,&b);hipotenusa(a,b,&h);printf("La hipotenusa es %f\n", h);}

Page 67: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

67

Recapitulación

Antes de escribir un programa:Leerlo detenidamenteHacer pseudocódigo o diagrama de flujoDecidir división en funcionesDeterminar parámetros de entrada y salidaDesde main() invocar a las funciones

Page 68: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

68

Sentencias de control

Page 69: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

69

Estructuras de control

Objetivos:Introducir los tres tipos básicos de sentencias de control: secuencia, selección e iteración.Explicar la sintaxis y la semántica de las sentencias de controldedicadas a definir estructuras de selección.

Contenidos:1. Tipos de estructuras2. Estructuras condicionales

o Instrucción if - elseo Instrucción switch

3. Instrucción break

Page 70: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

70

Tipos de estructuras

Secuencia: ejecución sucesiva de dos o más operaciones.Selección: se realiza una u otra operación, dependiendo de una condición.Iteración: repetición de una operación mientras se cumpla una condición.

Page 71: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

71

If - else

if (expresión) sentencia;

o bien

if (expresión) sentencia;else sentencia;

Page 72: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

72

Ejemplo if - elsePrograma que lee un número y dice si es par o impar.

#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);}

Page 73: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

73

Operador condicional

Se utiliza para sentencias if-else simples

y=(x>9 ? 100 : 200);

if (x > 9) {y=100;

} else {

y=200;}

LO MISMO

Page 74: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

74

switch

switch (variable) {case cte1: sentencia;

break;case cte2: sentencia;

break;......default: sentencia;

}

Tipo entero o letra

Page 75: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

75

Ejemplo switchcase '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);

}}

#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;

Page 76: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

76

Bucles

Objetivos:Explicar la sintaxis y la semántica de las sentencias de controldedicadas a definir estructuras de iteración.Mostrar patrones habituales de concatenación de sentencias de control con vistas a su utilización en el seno de un programa real.

Contenidos:1. Bucles

a. Instrucción forb. Instrucción whilec. Instrucción do - while

2. Instrucciones break y continue3. Bucles anidados

Page 77: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

77

Instrucción for

for (inicialización; condición; incremento)sentencia;

Inicialización: se inicializa algún parámetro que controla la repetición del bucle.Condición: es una condición que debe ser cierta para que se ejecute sentencia.Incremento: se utiliza para modificar el valor del parámetro.

El bucle se repite mientras condición no sea cero (falso).Si sentencia es compuesta se encierra entre { } incialización e incremento se pueden omitir.Si se omite condición se asumirá el valor permanente de 1 (cierto) y el bucle se ejecutará de forma indefinida.

Page 78: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

78

Ejemplo for

Programa que imprime los 100 primeros números

#include <stdio.h>void main(){

int numero;for (numero=0; numero <100; numero++)

printf("%d\n", numero);}

Page 79: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

79

Instrucción while

while (expresión)sentencia;

sentencia se ejecutará mientras el valor de expresión sea verdadero (distinto de 0).Primero se evalúa expresión.Lo normal es que sentencia incluya algún elemento que altere el valor de expresión, proporcionando la condición de salida del bucle.Si la sentencia es compuesta se encierra entre { }

Page 80: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

80

Ejemplo whilelee un número N y calcula 1 + 2 + 3 + … + N

#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);

}

Page 81: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

81

do - while

dosentencia;

while (expresión);

sentencia se ejecutará mientras el valor de expresión sea verdadero (distinto de 0).sentencia siempre se ejecuta al menos una vez (diferente a while).Lo normal es que sentencia incluya algún elemento que altere el valor de expresión, proporcionando la condición de salida del bucle.Si la sentencia es compuesta se encierra entre { }Para la mayoría de las aplicaciones es mejor y más natural comprobar la condición antes de ejecutar el bucle (while).

Page 82: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

82

Ejemplo do -whilePrograma que lee de forma repetida un número e indica si es par o impar. El programa se repite mientras el número sea distinto de cero.

#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)

}

Page 83: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

83

Bucles anidadosLos bucles se pueden anidar pero es importante estructurarlos de forma correcta.Ejemplo: Calcular 1 + 2 + …N mientras N sea distinto de 0.

#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 */}

Page 84: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

84

Instrucción break

Se utiliza para terminar la ejecución de bucles o salir de una sentencia switch.

Es necesaria en la sentencia switch para transferir el control fuera de la misma.

En caso de bucles anidados, el control se transfiere fuera de lasentencia más interna en la que se encuentre, pero no fuera de las externas.

No es aconsejable el uso de esta sentencia en bucles pues es contrario a la programación estructurada.

Puede ser útil cuando se detectan errores o condiciones anormales.

Page 85: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

85

Ej.

#include <stdio.h>void main(){int opcion;printf ("1 - Mensaje pantalla \n");printf ("2 - salir \n");printf (" cualquier carácter, no hace nada\n");printf("Elija la opción: ");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);

}}

Page 86: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

86

Sentencia continue

Esta sentencia se utiliza en los bucles for, while y do/while.

Cuando se ejecuta, fuerza un nuevo ciclo del bucle, saltándose cualquier sentencia posterior.

Page 87: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

87

Ejemplo continue#include <stdio.h>#include <conio.h>void main (){

int n;int positivos = 0;

do {printf ("\n Teclea un número (-99 finaliza): ");scanf ("%d", &n);if (n <= 0) continue;positivos++;

} while (n != -99);printf ("\n Has tecleado %d números positivos", positivos);

}

La sentencia positivos++ sólo se ejecuta cuando n es un número positivo. Si n es negativo o vale 0, se ejecuta continue que fuerza una nueva evaluación de la condición de salida del bucle.

Page 88: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

88

Tabla de comparativas

Dentro del ciclo después de las instrucciones a repetir

Dentro del ciclo después de las instrucciones a repetir

3º campo

Cambios que hay que hacer

noDespués de cada vuelta

En el while entre paréntesis

Hay que ponerlo fuera, antes del ciclo

do while

NoAntes de cada vuelta

En el while entre paréntesis

Hay que ponerlo fuera, antes del ciclo

while

siAntes de cada vuelta

2º campo1º campofor

¿pueden quedar campos vacíos?

Cuando se comprueba

Cond. para seguir repitiendo

Valores iniciales, operaciones previas

Page 89: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

89

EjerciciosEscriba un programaque calcule xn, siendox y n dos números quese introducen porteclado

#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);}

Page 90: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

90

Escriba un programa que calcule e imprima la suma de los pares y de los impares comprendidosentre dos valores que se piden por teclado (x y n)

#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 calcula (int x, int n){int i, int par=0, impar=0;for (i=x; i<=n; i++ ) {

if ((i%2)==0) par+=i;else impar+=i;}

printf("El resultado suma par: %d e impar: %d \n", par, impar);}

void main(){int n,x;leer (&x,&n);calcula(x,n);}

Page 91: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

91

Ejemplo - funciones y bucles#include <stdio.h>

mensaje (){

printf ("\nTeclee un número (0 finaliza): ");}

int lee_numero (){

int n;scanf ("%d", &n);return n;

}

cuadrado (int x){

printf ("\nEl cuadrado es %d", x * x);}

void main (){

int t;for (mensaje (); t = lee_numero (); cuadrado (t));

}

Page 92: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

92

Recursividad

Page 93: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

93

Recursividad

Objetivos:Repaso: paso de parámetros por valor y por referencia a una función.Mostrar la capacidad de la recursión y las funciones recursivas.

Contenidos:1.Paso de parámetros a una función2.Recursividad

Page 94: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

94

Paso de parámetros por valor

En las llamadas por valor se hace una copia del valor del argumento en el parámetro formal.

La función opera internamente con estos últimos.

Como las variables locales a una función (y los parámetros formales lo son) se crean al entrar a la función y se destruyen al salir de ella, cualquier cambio realizado por la función en los parámetros formales no tiene ningún efecto sobre los argumentos.

Page 95: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

95

Ejemplo

Page 96: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

96

Paso de parámetros por referencia

En este tipo de llamadas los argumentos contienen direcciones devariables.

Dentro de la función la dirección se utiliza para acceder al argumento real.

En las llamadas por referencia cualquier cambio en la función tiene efecto sobre la variable cuya dirección se pasó en el argumento. No hay un proceso de creación/destrucción de esa dirección.

Aunque en C todas las llamadas a funciones se hacen por valor, pueden simularse llamadas por referencia utilizando los operadores &(dirección) y * (en la dirección).

Mediante & podemos pasar direcciones de variables en lugar de valores, y trabajar internamente en la función con los contenidos, mediante el operador *.

Page 97: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

97

Ejemplo#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;

}

x, y punteros

Page 98: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

98

EjemploFunción que intercambia el valor de dos variables.

#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;

}

Page 99: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

99

RecursividadUna función se llama a sí misma de forma repetida hasta que se cumpla alguna condición.

Ejemplo: el factorial de un número:

long int factorial(int n){

if (n <= 1)return(1);

elsereturn(n * factorial(n-1));

}

Page 100: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

100

Ejemplo “torres de Hanoi”

#include <stdio.h>

void transferir( int n, char desde, char hacia, char temp);

void main(){int n;printf ("Bienvenido a las torres de Hanoi \n");printf ("¿Cuántos discos?\n");scanf("%d", &n);transferir(n,'I','D','C');}

Izquierda Centro Derecha

Page 101: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

101

Ejemplo “torres de Hanoi” (y 2)void transferir(int n, char desde, char hacia, char temp){

/* transferir n discos de un pivote a otro*//* n = numero de discos

desde = origenhacia = destinotemp = almacenamiento temporal */

if (n>0){

transferir (n-1, desde, temp, hacia);printf ("mover disco %d desde %c hasta %c\n", n, desde, hacia);transferir (n-1, temp, hacia,desde);

}return;

}

Page 102: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

102

Arrays (listas y tablas)

Page 103: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

103

Arrays (listas y tablas)Objetivos:

Introducir el concepto de tipo de dato estructurado.Mostrar la representación de datos mediante arrays unidimensionales y multidimensionales.Conocer la representación de cadenas de caracteres y las funciones de manipulación.

Contenidos:1. Arrays

o Declaracióno Subíndiceso Almacenamiento en memoriao Tamaño de los arrays

2. Inicialización de un array3. Array de caracteres y cadenas de texto4. Arrays multidimensionales

Page 104: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

104

Listas

Conjunto de datos del mismo tipo a los que se da un nombre comúny a los que se accede a través de un índice

tipo_dato variable_lista[num_elementos];

int numeros[20];float temperaturas[100];

En un vector de N elementos, el primero se referencia con el índice 0y el último con el índice N-1Inicialización

int numeros[2]={0,1}int numeros[]={0,1} el compilador asume array de 2 elementos

El procesamiento se debe hacer elemento a elemento

Page 105: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

105

Listas

¿cómo se utilizan?Usar un elemento de la listavariable_lista[posicion]; temperaturas[10];

Pasar a funcionesen la declaración

void nombreFuncion (int variable)

en la llamada a la función

nombreFuncion (variable_lista[posicion])

Empieza en 0

Page 106: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

106

Listas de números

¿cómo se utilizan?Usar toda la lista. Podemos:

Copiar una lista en otra

memcpy (listadestino,listaorigen,tamaño)

Pasar la lista a una función

void nombreFuncion (int nombreLista[TAMAÑO])

nombreFuncion ( nombreLista );

Sean de entrada o salida, no requieren *

Ojo, corchetes

Page 107: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

107

Listas de números

¿cómo se utilizan?Usar toda la lista. Podemos:

Pasar la lista a una función de tamaño ajustado

void nombreFuncion (int tamano, int nombreLista[tamano])nombreFuncion ( tamano, nombreLista );

Se debe declarar la lista dentro de un bloque Antes debe ser conocida la variable tamanoLa lista sólo es conocida dentro del bloque

Page 108: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

108

Ejemplo lista tamaño fijo

#include <stdio.h>#define TAM_VECTOR 10

void leer (int vector_a[TAM_VECTOR]){int j; /* variable utilizada como indice */

for (j = 0; j < TAM_VECTOR; j++){

printf("Elemento %d: ", j);scanf("%d", &vector_a[j]);

}}

void copiar (int vector_a[TAM_VECTOR], intvector_b[TAM_VECTOR])

{int j; for (j = 0; j < TAM_VECTOR; j++)

vector_b[j] = vector_a[j];}

void escribir (int vector[TAM_VECTOR]){int j;

for (j = 0; j < TAM_VECTOR; j++)printf("El elemento %d es %d \n", j, vector[j]);

}

void main(){int vector_a[TAM_VECTOR];int vector_b[TAM_VECTOR];

leer ( vector_a);copiar (vector_a, vector_b);escribir (vector_b);}

Page 109: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

109

Ejemplo lista tamaño variable#include <stdio.h>void leer (int cuantos, float lista[cuantos])

{int i;

printf ("teclealos :\n");for (i=0 ; i< cuantos ; i++)

{scanf("%f", &lista[i]);}

}void pintar(int cuantos, float lista[cuantos])

{int i;for (i=0 ; i< cuantos ; i++)

{printf("%i\n", lista[i]);}

}

void main(){

int cuantos;

printf ("dame cuantos \t");scanf("%i", &cuantos);{

float lista[cuantos];

leer(cuantos,lista);pintar (cuantos, lista);

} }

Page 110: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

110

Ordenación elementos de lista#include <stdio.h>#include <stdlib.h>

int comparar (int *num1, int *num2) {return ((*num1)-(*num2));

}

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);}

}

Page 111: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

111

La función sizeof()Devuelve el tamaño en bytes que ocupa un tipo o variable en memoria.

#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));

}

Page 112: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

112

Algoritmos de ordenación y búsqueda

Transparencias en pdf aparte

Page 113: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

113

Cadenas de caracteresUn caso particular de lista es la cadena de caracteres. Se declara:

char nombre[num_car];

y permite almacenar num_car-1 caracteres y el carácter nulo '\0' de terminación.

char frase[21];

es apta para almacenar 20 caracteres y el nulo.

C permite la inicialización de cadenas de caracteres en la declaración, mediante sentencias del tipo

char cadena[ ] = "Esto es una cadena de caracteres";

en la que no es necesario añadir el nulo final ni indicar el tamaño, pues lo hace automáticamente el compilador.

Generalmente se utiliza tamaño por exceso, no se suele preguntar al usuario cuántos caracteres va a introducir

Page 114: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

114

Cadenas de caracteres

¿Cómo se utilizan?Usar un elemento de la lista. Igual que lista de números.Usar toda la lista. Hay diferencias:

Leer una lista de letras con una sola instrucciónscanf (“%s”, palabra) coge hasta espacio o fin de líneascanf (“%[^\n]”, frase) coge hasta fin de línea

Escribir una lista de letrasprintf (“%s”, palabra)

Copiar una lista de letras <string.h>strcpy (str_destino, str_origen)

Page 115: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

115

biblioteca estándar string.hchar *strcat (char *cad1, const char *cad2) Concatena cad2 a cad1 devolviendo la

dirección de cad1. Elimina el nulo de terminación de cad1 inicial.char *strcpy (char *cad1, const char *cad2) Copia la cadena cad2 en cad1,

sobreescribiéndola. Devuelve la dirección de cad1. El tamaño de cad1 debe ser suficiente para albergar a cad2.

int strlen (const char *cad) Devuelve el número de caracteres que almacena cad (sin contar el nulo final).

int isalnum (int ch) Devuelve 1 si ch es alfanumérico (letra del alfabeto o dígito) y 0 en caso contrario.

int isalpha (int ch) Devuelve 1 si ch es una letra del alfabeto y 0 en caso contrario.int isdigit (int ch) Devuelve 1 si ch es un dígito del 0 al 9, y 0 en caso contrario.int islower (int ch) Devuelve 1 si ch es un letra minúscula y 0 en caso contrario.int isupper (int ch) Devuelve 1 si ch es una letra mayúscula y 0 en caso contrario.int tolower (int ch) Devuelve el carácter ch en minúscula. Si ch no es una letra

mayúscula la función devuelve ch sin modificación.int toupper (int ch) Devuelve el carácter ch en mayúscula. Si ch no es una letra

minúscula la función devuelve ch sin modificación.

Page 116: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

116

Ejemplo: lectura y escritura de cadenas de caracteres

#include <stdio.h>#define TAM_CADENA 80main(){char cadena[TAM_CADENA];printf("Introduzca una cadena: ");scanf("%s", cadena);printf("La cadena es %s\n", cadena);}

scanf deja de buscar cuando encuentra un blanco ⇒ si se introduce Hola a todos, solo se leerá Hola.No es necesario el operador de dirección (&) ya que cadena representa de forma automática la dirección de comienzo.

no requiere &

Page 117: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

117

Ejemplo: lectura y escritura de cadenas de caracteres (y 2)

La función gets lee una línea completa hasta que encuentre el retorno de carro incluyendo los blancos.La función puts escribe una cadena de caracteres junto con un salto de línea.

#include <stdio.h>#define TAM_LINEA 80main(){char linea[TAM_LINEA];printf("Introduzca una linea: \n");gets(linea);puts("La linea es");puts(linea);}

Son equivalentes:puts("La linea es:"); ≡ printf("La linea es: \n");

Page 118: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

118

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;

for (i=ultima; i>=primera; i--)printf(“%c”,palabra[i]);

}

void main (void){

char palabra[MAXLETRAS];leer(palabra);escribir(palabra);

}

Programa que lee una palabra y la escribe al revés

Page 119: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

119

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 dígitos numéricos\n", contador);puts (cadena);

}

void main (void){

char frase[MAXLETRAS];leer(frase);escribir(frase);

}

El programa siguiente hace uso de alguna de las funciones anteriores para examinar una cadena de caracteres y convertir las minúsculas a mayúsculas y viceversa. Además cuenta cuántos caracteres son dígitos numéricos.

Page 120: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

120

Vectores multidimensionalesUn vector multidimensional se declara:

tipo_dato vector[exp1] [exp2] ... [expN];

Matrices o vectores de 2 dimensiones:

int matriz[20][30];

define una matriz de 20 filas por 30 columnas.

Generalmente se declaran por exceso.

La numeración comienza en 0.

Page 121: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

121

Tablas

¿Cómo se utilizan?Usar un elemento de la tabla

tabla[fila][columna]

Pasar un elemento a una función. llamadanombreFuncion (arg1,.., nombretabla[fila][columna])

declaraciónvoid nombreFuncion (tipo arg1,…, tipo variablesimple)

Usar una columna de la tabla: NO SE PUEDE EN C

Page 122: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

122

TablasUsar un vector de la tabla como argumento a una función:

tabla[fila]declaraciónvoid nombreFuncion (tipo arg1,…, tipo lista[COLUMNAS])llamadanombreFuncion (arg1,.., nombretabla[fila]);

Usar una tabla completa Copiarmemcpy(destino, origen,tamaño)Ej: memcpy ( clientes2, clientes1, sizeof(int)*filas*columnas)Parámetro de una función

Declaración de funciónvoid nombreFuncion (tipo arg1,…, tipo tabla[FILAS][COLUMNAS])

Llamada a una funciónnombreFuncion (arg1,…, tabla)

Page 123: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

123

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 leer(int filas, int columnas, float tabla[filas][columnas]){int i,j;printf("dame tabla:\n");

for (i=0;i<filas;i++){for (j=0;j<columnas;j++)

{scanf("%f", &tabla[i][j]);}

}}

Leer dos matrices de dimensiones indicadas por el usuario y escribir su suma

void main(){int filas, columnas;printf("dame filas y columnas: \n");scanf("%i %i", &filas, &columnas);

{float tabla1[filas][columnas], tabla2[filas][columnas];leer(filas,columnas, tabla1);leer(filas,columnas, tabla2);sumar(filas, columnas,tabla1, tabla2);}}

Page 124: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

124

EjemploFunción que calcula el producto de dos matrices cuadradas.

void multiplicar(float a[DIM][DIM], float b[DIM][DIM], float c[DIM][DIM]){

int i, j, k;for(i = 0; i < DIM; i++)for(j = 0; j < DIM; j++){

c[i][j] = 0.0;for(k = 0; k < DIM; k++)

c[i][j] += a[i][k] * b[k][j];}

}

Page 125: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

125

Ej.:#include <stdio.h>#include <string.h>#define MAX 30 /*incluye el fin de línea*/

void leer(int numpal, int columnas, char tabla[numpal][MAX], char pal[MAX]){int i;printf("dame palabras:\n");

for (i=0;i<numpal;i++){

scanf("%s",tabla[i]);}

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);}

void main(){int numpal;printf("dame nº palabras: \n");scanf("%i", &numpal);

{char tabla[numpal][MAX], pal[MAX];leer(numpal, tabla, pal);calcular(numpal,tabla,pal);}}

Leer lista de palabras y contar el nº de veces que está una palabra que solicita el usuario

Page 126: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

126

Estructuras y uniones

Page 127: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

127

Estructuras y unionesObjetivos:

Conocer la posibilidad de definir tipos de datos estructurados con campos heterogéneos mediante el uso de estructuras.Explicar la posibilidad de combinar tipos de datos estructurados.Mostrar los tipos union.

Contenidos:1. Estructuras

o Concepto de campoo Declaración e inicialización

2. Acceso a estructuras3. Declaración typedef4. Combinación de datos estructurados5. Campos variables con el uso de union

Page 128: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

128

EstructurasEs una estructura de datos compuesta de elementos individuales que pueden ser de distinto tipo.Cada uno de los elementos de una estructura se denomina miembro.Declaración de una estructura:

struct nombre_estructura{tipoDato1 miembro_1;tipoDato2 miembro_2;..tipoDatoN miembro_N;};

Los miembros pueden ser de cualquier tipo excepto void

Page 129: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

129

EjemploDeclaración de una estructura denominada CD.

struct CD{char titulo[100];char artista[50];int num_canciones;int anio;Euros precio;};

Declaración de una variable denominada cd1 de tipo struct CD.struct cd1 CD;

Se pueden copiar estructuras, pero NO comparar:struct CD cd1,cd2;cd2 = cd1;

Page 130: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

130

Inicialización de una estructuraDos formas:

En la declaración:

struct CD{char titulo[100];char artista[50];int num_canciones;int anio;Euros precio;} cd1= {“Un sueño de verano”,”Miguel Rios”,1989,10};

En el programa:

struct CD cd1;strcpy(cd1.titulo, “Un sueño de verano"); strcpy(cd1.artista, “Miguel Rios");cd1.num_canciones = 2;c1.anio = 1989;

Page 131: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

131

Acceso a una estructuraLos miembros de una estructura se procesan individualmente.Para hacer referencia a un miembro determinado, se utiliza el operador . si la variable es de tipo estructura

variable_estructura.miembro

O, se utiliza el operador -> si la variable es de tipo puntero a estructuravariable_estructura->miembro

Ejemplo: imprimir la fecha de hoystruct fecha {int dia, mes, anio;};

struct fecha hoy;struct fecha *ayer;

printf("%d: %d: %d\n", hoy.dia,hoy.mes, hoy.anno);printf("%d: %d: %d\n", ayer->dia, ayer-> mes, ayer-> anno);

Page 132: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

132

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;};

Page 133: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

133

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);}

Page 134: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

134

Combinación de datos estructurados: vector de estructuras

#include <stdio.h>#include <string.h>

#define NUMCAJAS 3

typedef struct{

char pieza[20]; /* Tipo de pieza. */int cantidad; /* Número de piezas. */float precio_unitario; /* Precio de cada pieza. */char existe; /* Comprobar si el registro existe. */

} registro_piezas;

Programa que permita introducir las piezas de un almacén (tipo, nombre, nro, precio) e imprimirlas

Caja 1

Caja Ncaja ...

Page 135: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

135

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 número 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);

Page 136: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

136

Cont.

/* Imprimir la información. */

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*/

Page 137: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

137

Paso de estructuras a funciones

Una función puede devolver una estructura.Se pueden pasar miembros individuales y estructurascompletas a una función. Si la estructura es grande, el tiempo para copiar un estructura (paso por valor) es prohibitivo, por eso se aconseja pasarlo por referencia.Paso de miembros individuales

struct punto{float x;float y;};

void imprime_x (float x){printf ("el valor de x %f", x);}

/*llamada a función*/

imprime_x (p1.x);

Page 138: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

138

Paso de estructuras a funciones por valor

struct fecha leer_fecha(void){

struct fecha f;

printf("Dia: ");scanf("%d", &(f.dia));printf("Mes: ");scanf("%d", &(f.mes));printf("Anno: ");scanf("%d", &(f.anno));return(f);

}

main(){struct fecha fecha_de_hoy;fecha_de_hoy = leer_fecha();imprimir_fecha(fecha_de_hoy);}

#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;}

Ej.: leer y escribir una fecha.

Page 139: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

139

Paso de estructuras a funciones por referencia

void leer_punto(struct punto *p);void imprimir_punto(struct punto p);

struct punto{float x;float y;};

main(){struct punto p1;

leer_punto(&p1);imprimir_punto(p1);

}

void leer_punto(struct punto *p){

printf("x = ");scanf("%f", &(p->x));printf("y = ");scanf("%f", &(p->y));

}void imprimir_punto(struct punto p){printf("x = %f\n", p.x);printf("y = %f\n", p.y);}

Page 140: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

140

UnionesUna union contiene miembros cuyos tipos de datos pueden ser diferentes (igual que las estructuras).Su declaración es similar a las estructuras:

union nombre_estructura{tipoDato1 miembro_1;tipoDato2 miembro_2;..tipoDatoN miembro_N;};

Todos los miembros que componen la union comparten la misma zona de memoria → ahorro de memoria. Una variable de tipo union sólo almacena el valor de uno de sus miembros.

Page 141: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

141

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);}

0 1 32enteroreal

Page 142: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

142

Combinación de datos estructurados: vector de estructuras y unionstruct ALUMNO {

char grupo[15];int asignat;char repite;

};struct PROFESOR {

char nrp[16];char cargo[21];

};union AL_PR {

struct ALUMNO al;struct PROFESOR pr;

};

struct DATOS {char tipo;char nombre[40];int edad;char direccion[40];char telefono[15];union AL_PR ambos;

} personal[100];

Persona 1

Persona nPersona ...

Page 143: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

143

El siguiente segmento de programa muestra los datos de la matriz personal.

for (i = 0; i < 100; i++) {printf ("\nNombre: %s", personal[i].nombre);printf ("\nEdad: %d", personal[i].edad);printf ("\nDirección: %s", personal[i].direccion);printf ("\nTeléfono: %s", personal[i].telefono);if (personal[i].tipo == 'A') {

printf ("\nALUMNO");printf ("\nGrupo: %s", personal[i].ambos.al.grupo);printf ("\nNº de Asignaturas: %d", personal[i].ambos.al.asignat);printf ("\nRepite: %d", personal[i].ambos.al.repite); }

else {printf ("\nPROFESOR");printf ("\nN.R.P.: %s", personal[i].ambos.pr.nrp);printf ("\nCargo: %s", personal[i].ambos.pr.cargo);

}}

Page 144: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

144

Tipos enumeradosUn tipo enumerado es similar a las estructuras.Sus miembros son constantes de tipo int.Es útil definir nuevos literales para

Asociar un nombre a un valor numéricoLimitar los valores que puede tomar una variable enteraHacer el código más legible

Definición:

enum nombre {m1, m2, ..., mN};

Ejemplo:enum color {negro, blanco, rojo};

Page 145: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

145

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 vehículo encima\n");break;

case verde:printf(“Circular\n");break;

}}

Page 146: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

146

Definición de tipos de datos (typedef)

Permite dar nuevo nombre a tipos de datos que ya existen:

typedef tipoDato nuevo_tipo;

Ejemplos:typedef char letra;letra c;

typedef struct{int dia;int mes;int anio;

} FECHA;FECHA a;

Page 147: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

147

Combinación de typedef y enumUsando typedef y enum se pueden definir tipos que sólo pueden tomar ciertos valoresEj. tipo booleano en C

typedef enum {false, true} boolean;...boolean f=false;...if(f)

printf("f es verdadero\n");else

printf("f es falso\n");...f=45; /* Error, no debería tomar ese valor */

Page 148: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

148

Ficheros

Marta Zorrilla

Page 149: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

149

Ficheros

Objetivos:Presentar el tipo de dato FILE y los tipos de fichero.Explicar las instrucciones para abrir, cerrar y gestionar ficheros.Capacitar al alumno a trabajar con ficheros de texto y binarios.

Contenidos:1. Concepto de ficheros y sus tipos2. Declaración de una variable tipo fichero3. Operaciones con ficheros:

o Abrir y cerrar ficheroso Control de errores y fin de ficheroo Lectura/escritura de ficheros de texto: caracteres, cadenas de

caracteres y con formatoo Lectura/escritura de ficheros binarios o Acceso directo a información de archivos

Page 150: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

150

Canales y ficheros

El sistema de E/S del ANSI C proporciona un intermediario entre el programa y el dispositivo al que se accede (pantalla, cinta, disco,...). Este intermediario se llama canal o flujo (stream) y es un buffer independiente del dispositivo al que se conecte. Existen dos tipos de canales:

Canales de texto: Son secuencias de caracteres. Dependiendo del entorno puede haber conversiones de caracteres (LF ⇔ CR + LF). Esto hace que el número de caracteres escritos/leídos en un canal pueda no coincidir con el número de caracteres escritos/leídos en el dispositivo.Canales binarios: Son secuencias de bytes. A diferencia de los canales de texto, en los canales binarios la correspondencia de caracteres en el canal y en el dispositivo es 1 a 1, es decir, no hay conversiones.

Page 151: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

151

Canales y ficheros ( y 2)Hay 3 canales que se abren siempre que comienza un programa C:

stdin Canal estándar de entrada. Por defecto el teclado. (ANSI)stdout Canal estándar de salida. Por defecto la pantalla. (ANSI)stderr Canal estándar de salida de errores. Por defecto la pantalla. (ANSI)

Un canal se asocia a un archivo cuando se abre o se crea éste para lo cual se utilizan funciones de la biblioteca stdio.h.

También incluye funciones para realizar las operaciones de lectura/escritura así como para desasociar un canal de un archivo (operación de cierre).

Page 152: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

152

Apertura de un archivo

Para abrir un archivo:

desc = fopen(nombre_archivo, modo)

donde desc, el descriptor, se declara como:

FILE *desc;

y modo especifica la forma de apertura del archivo.si fopen devuelve NULL, el fichero no se pudo abrir.

Page 153: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

153

Parámetros para abrir un fichero

MODO

DESCRIPCIÓN

r Abre un fichero sólo para lectura. Si el fichero no existe fopen() devuelve un puntero nulo y se genera un error.

w Crea un nuevo fichero para escritura. Si ya existe un fichero con este nombre, se sobreescribe, perdiéndose el contenido anterior.

a Abre o crea un fichero para añadir. Si el fichero existe, se abre apuntando al final del mismo. Si no existe se crea uno nuevo.

r+ Abre un fichero para leer y escribir. Si el fichero no existe fopen()devuelve un puntero nulo y se genera un error. Si existe, puedenrealizarse sobre él operaciones de lectura y de escritura.

w+ Crea un nuevo fichero para leer y escribir. Si ya existe un fichero con este nombre, se sobreescribe, perdiéndose el contenido anterior. Sobre el archivo pueden realizarse operaciones de lectura y de escritura.

a+ Abre o crea un fichero para leer y añadir. Si el fichero ya existe se abre apuntando al final del mismo. Si no existe se crea un fichero nuevo.

Modo TEXTO: añadir letra t. Ej: si modo es rt, se está abriendo el fichero en modo texto sólo para lecturaModo BINARIO: añadir letra b. Ej: modo es w+b se abrirá o creará un fichero en modo binario para lectura y escritura

Page 154: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

154

Cierre de un fichero

Para cerrar un fichero y liberar el canal previamente asociado con fopen(), se debe usar la función fclose()

int fclose (FILE *canal);

Esta función devuelve 0 si la operación de cierre ha tenido éxito, y distinto de 0 en caso de error.

Page 155: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

155

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);}

Page 156: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

156

Control de errores

Cada vez que se realiza una operación de lectura o de escritura sobre un fichero debemos comprobar si se ha producido algún error. Para ello disponemos de la función ferror()

int ferror (FILE *canal);

Esta función devuelve 0 si la última operación sobre el fichero se ha realizado con éxito.

Page 157: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

157

Final de ficheroCada vez que se realiza una operación de lectura sobre un fichero, el indicador de posición del fichero se actualiza.

Es necesario, pues, controlar la condición de fin de fichero. Por ello, debemos saber que cuando se intentan realizar lecturas más allá del fin de fichero, el carácter leído es siempre EOF. Sin embargo en los canales binarios un dato puede tener el valor EOF sin ser la marca de fin de fichero. Es aconsejable, por ello, examinar la condición de fin de fichero mediante la función feof()

int feof (FILE *canal);

Esta función devuelve un valor diferente de cero cuando se detecta el fin de fichero.

Page 158: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

158

Ficheros de texto

Se trata de archivos cuyo contenidos son caracteres en formato ASCII, por tanto, son legibles y editables por cualquier editor de texto. Usualmente tienen la extensión “txt”.Para abrir un archivo en modo texto se debe emplear el modificador “t” en el modo de apertura del archivo.Existen dos formas de tratar ficheros de texto:

Carácter a carácter (fgetc y fputc)Cadenas de caracteres (fgets y fputs)Con formato (fprintf y fscanf)

Page 159: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

159

Funciones de manejo carácter a carácter

Lectura:

int fgetc(FILE *fich)

Lee un carácter del archivo (EOF si estamos al final del mismo)

Escritura:

int fputc(char c, FILE *fich)

Escribe el carácter c en el archivo. Si es correcto devuelve el mismo carácter y si no EOF.

Page 160: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

160

EjemploEjemplo que realiza la lectura de un archivo carácter a carácter empleando un buffer:

char buffer[255], lineas[100][80], c;int n, t;FILE *entrada;

entrada = fopen(“ejemplo.txt”, “rt”);while (!feof(entrada)) {t = 0;do {

c = fgetc(entrada);buffer[t] = c;t++;} while (c!=EOF && c!=’\n’); //fin de fichero o de línea

strcpy(lineas[n], buffer);n++;}fclose(salida);

Page 161: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

161

Funciones de manejo cadenas de caracteres

Lectura:

char *fgets(const char *s, int n, FILE *fich)

Lee n-1 caracteres o hasta carácter de fin de línea (que también se almacena en s). Si no se produce error, la función 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 carácter nulo ni añade el carácter de fin de línea.

Page 162: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

162

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 creación 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);

}

Page 163: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

163

Ejemplo (y 2)/* Bucle de lectura y escritura con líneas */

do{

/* Lectura de la línea 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 línea */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);

}

Page 164: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

164

Funciones de manejo con formato

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.

Page 165: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

165

Ejemplo

Veamos un ejemplo para escribir una cadena de caracteres en un fichero:

char cadena[255];FILE *salida;…salida = fopen(“salida.txt”, “wt”);strcpy(cadena, “Prueba de escritura”);fprintf(salida,”%s”,cadena);fclose(salida);

Page 166: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

166

Ficheros binarios

Son archivos cuyo contenido son caracteres en formato binario, por tanto NO son legibles ni editables. Para asegurarnos que la apertura de un archivo se hace en modo binario se debe emplear el modificador “b” en el modo de apertura del archivo. Si noponemos nada se asume el modo binario por defecto.Las funciones básicas de escritura y lectura asociadas a este modo son: fwrite y fread.Generalmente se utilizan para leer estructuras

Page 167: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

167

Escribir a fichero binario

Escritura

int fwrite(void *datos, int tam, int ndatos, FILE *fich);

Devuelve:Número de elementos (no bytes) escritos en el archivo.Parámetros:*ptr = puntero al origen de los datos.tam = tamaño de cada elemento.ndatos = número de elementos.*fich = puntero a FILE (archivo donde escribir).

Page 168: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

168

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.”);

Page 169: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

169

Lectura de fichero binario

Sintaxis:

int fread(void *datos, int tam, int ndatos, FILE *fich);

Devuelve el número de elementos (no bytes) leídos del archivo.

Parámetros:*ptr = puntero al destino de los datos.tam = tamaño de cada elemento.ndatos = número de elementos.*fich = puntero a FILE (archivo de donde leer).

Page 170: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

170

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);

Page 171: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

171

Ejemplo agenda

El registro de ese archivo constará de los siguientes campos:Nombre 40 caracteresDomicilio 40 caracteresPoblación 25 caracteresProvincia 15 caracteresTeléfono 10 caracteres

El programa crea el fichero llamado LISTIN.TEL con los datos suministrados por el usuario

Page 172: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

172

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);

Page 173: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

173

Ejemplo (y 2)while (var.nom[0]) {

printf ("\nDomicilio: ");gets (var.dom);printf ("\nPoblación: ");gets (var.pob);printf ("\nProvincia: ");gets (var.pro);printf ("\nTeléfono: ");gets (var.tel);

fwrite (&var, sizeof (var), 1, f);if (ferror (f)) {

puts ("No se ha almacenado la información");getch ();

}printf ("Nombre: ");gets (var.nom);

}fclose (f);

}

Page 174: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

174

Ejemplo: Lectura en bloques#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[4];int i, n;if (!(f = fopen ("LISTIN.TEL", "rb"))) {

perror ("LISTIN.TEL");exit (1);

}do {

n = fread (var, sizeof (REG), 4, f);for (i = 0; i < n; i++) printf ("\n%-41s %s", var[i].nom, var[i].tel);puts ("\nPulse una tecla ...");getch ();

} while (!feof (f));fclose (f);

}

Page 175: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

175

Acceso directo

El acceso directo a un archivo, se realiza con la ayuda de la función fseek() que permite situar el indicador de posición del archivo en cualquier lugar del mismo.

int fseek (FILE *canal, long nbytes, int origen);

Esta función sitúa el indicador de posición del fichero nbytescontados a partir de origen. La función devuelve 0 cuando ha tenido éxito. En caso contrario devuelve un valor diferente de 0.Esta función simplemente maneja el indicador de posición del fichero, pero no realiza ninguna operación de lectura o escritura. Por ello, después de usar fseek() debe ejecutarse una función de lectura o escritura.

Page 176: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

176

Acceso directo (y 2)

int fseek (FILE *canal, long nbytes, int origen);

Los valores posibles del parámetro origen y sus macros asociadas

SEEK_END2Fin del fichero

SEEK_CUR1Posición actual

SEEK_SET0Principio del fichero

MACROVALORORIGEN

Page 177: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

177

Ejemplo: Se crea un archivo llamado FRASE.TXT con una cadena de caracteres. Posteriormente lee un carácter de la cadena cuya posición se teclea.

#include <stdio.h>#include <string.h>

void main (void){

FILE *f;int nbyte, st;char frase[80], caracter;if (!(f = fopen ("FRASE.TXT", "w+t"))) {

perror ("FRASE.TXT");return;

}

printf ("Teclee frase: ");gets (frase);fwrite (frase, strlen (frase) + 1, 1, f);printf ("\nLeer carácter nº: ");scanf ("%d", &nbyte);st = fseek (f, nbyte, SEEK_SET);if (st) puts ("Error de posicionamiento");else {

caracter = getc (f);if (caracter != EOF) printf ("\nEl carácter es: %c", caracter);else puts ("Se sobrepasó el fin de fichero");

}fclose (f);

}

Page 178: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

178

Ejemplo: programa escribe registros ayudándose de fseek().

#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);

Page 179: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

179

Ejemplo: programa escribe registros ayudándose de fseek(). (y2)

while (num > 0) {getchar ();printf ("Nombre: ");gets (mireg.nombre);printf ("Edad: ");scanf ("%d", &mireg.edad);printf ("Altura: ");scanf ("%f", &mireg.altura);puntero = (num - 1) * sizeof (REGISTRO);if (fseek (f1, puntero, SEEK_SET)) puts ("Error de posicionamiento");else {

fwrite (&mireg, sizeof (mireg), 1, f1);if (ferror (f1)) {

puts ("ERROR de escritura");getch ();

}}printf ("Escribir registro nº: ");scanf ("%d", &num);

}fclose (f1);

}

Page 180: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

180

Programación modular

Tema 13

Page 181: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

181

Tema 13

Objetivos:Explicar el ámbito de las variables del programa.Familiarizar al alumno con la creación de programas modularizados y la creación de librerías de funciones propias.

Contenidos:1. Variables globales y locales 2. Variables estáticas 3. El preprocesador C: #include y #define.4. Programas modulares5. Bibliotecas de funciones

Page 182: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

182

Ámbito de las variables y tipos de almacenamiento

Existen dos formas de caracterizar una variable:Por su tipo de datoPor su tipo de almacenamiento

El tipo de dato se refiere al tipo de información que representa la variable (int, char, . . . ).

El tipo de almacenamiento se refiere a su permanencia y a su ámbito. El ámbito de una variable es la porción del programa en la cual se reconoce la variable.

Según el ámbito, las variables pueden ser:Variables locales.Variables globales.

Según el tipo, las variables pueden ser:Variables automáticas.Variables estáticas.Variables externas.Variables de tipo registro.

Page 183: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

183

Variables globalesSe declaran fuera de las funciones y antes de su uso.Pueden ser accedidas desde cualquier función.

#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;

}

Page 184: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

184

Variables globales (y 2)Mantienen los valores que se les asignan en las funciones.Es mejor hacer uso de variables locales para evitar efectos secundarios o laterales.

#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;

}

Page 185: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

185

Variables locales

Las variables locales que se definen en las funciones.Su ámbito es local.Su vida se restringe al tiempo en el que esta activa la función.Los parámetros formales se tratan como variables automáticas.Se pueden especificar con la palabra reservada auto aunque no es necesario.

#include <stdio.h>main(){auto int valor; /* equivalente a int valor */valor = 5;printf("El valor es %d\n", valor);}

Page 186: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

186

Variables estáticasSu ámbito es local a la función.Su vida coincide con la del programa ⇒ retienen sus valores durante toda la vida del programa.Se especifican con static.

#include <stdio.h>void funcion(void);

main(){

funcion();funcion();funcion();

}

void funcion(void){

static int veces = 0;veces = veces + 1;printf("Se ha llamado %d veces a funcion\n", veces);

}

Page 187: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

187

Variables de tipo registro

Informan al compilador que el programador desea que la variable se almacene en un lugar de rápido acceso, generalmente en registros.Si no existen registros disponibles se almacenará en memoria.Se especifican con register

#include <stdio.h>main(){register int j;for (j = 0; j < 10; j++)printf("Contador = %d\n", j);}

Page 188: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

188

Variables de tipo externas

Variables globales.Hay que distinguir entre definición y declaración de variable externa.La definición se escribe de la misma forma que las variables normales y reserva espacio para la misma en memoria.Una declaración no reserva espacio de almacenamiento ⇒ se especifica con extern.Se emplean cuando un programa consta de varios módulos. En uno de ellos se define la variable. En los demás se declara (extern)

Page 189: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

189

EjemploModulo principal (main.c)

#include <stdio.h>extern int valor; /* se declara */void funcion(void);main(){funcion();printf("Valor = %d\n", valor);}

Modulo auxiliar (aux.c)

int valor; /* se define la variable */void funcion(void){valor = 10;}

- Se compila por separado:gcc -c -Wall

main.cgcc -c -Wall

aux.c- Se obtienen dos módulos objetos: main.o y aux.o.- El ejecutable (prog) se genera:

gcc main.o aux.o -o prog

Page 190: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

190

Recomendaciones

Evitar el uso de variables globales.Mantener las variables lo más locales que se pueda.Cuando se precise hacer accesible el valor de una variable a una función, se pasará como argumento.

Page 191: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

191

Macros

Una macro es un identificador equivalente a una expresión, sentencia o grupo de sentencias.

#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);

}

Page 192: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

192

Macros (y 2)

No puede haber blancos entre el identificador y el paréntesis izquierdo.

Una macro no es una llamada a función.

El preprocesador sustituye todas las referencias a la macro que aparezcan dentro de un programa antes de realizar la compilación:

No se produce llamada a función ⇒ mayor velocidad.Se repite el código en cada uso de la macro ⇒ mayor código objeto.

Page 193: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

193

Directiva #include

Indica al preprocesador que incluya un archivo fuente nom_fich. El formato es:

#include "nom_fich"o bien,

#include <nom_fich>

El uso de comillas dobles " " o ángulos < > indica dónde debe buscar el preprocesador el fichero nom_fich. • comillas dobles " " : en el directorio de trabajo o en el camino

absoluto que se especifique en la sentencia include• ángulos < >: en los directorios donde se encuentran las bibliotecas

que proporciona el compilador

Page 194: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

194

Archivos de cabecera (.h)

Permiten modularizar el código y favorecer la ocultación de información.

Puede contener:Definiciones de macros #define MIL 1000Declaraciones de variables extern int dia;Declaraciones de funciones extern void f(void);Otras directivas de inclusión #include “a.h”ComentariosDefiniciones de tipos de dato (typedef)

Nunca debe tener:Definiciones de variables int dia;Definiciones de funciones void f(void);

Page 195: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

195

Compilación prog. varios módulos

leyOhm.h prog_ppal.c

leyOhm.h

prog_ppal.cleyOhm.c

leyOhm.oprog_ppal.o

prog_ppal.exe

compiladorInclusión del archivo leyOhm.c

preprocesador

enlazador

Page 196: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

196

La biblioteca de funciones

Contiene parámetros para rutinas de coma flotanteFLOAT.HANSI.C

Declara constantes simbólicas utilizadas en conexiones con la biblioteca de rutinas open()

FCNTL.H

Declara mnemónicos constantes para códigos de errorERRNO.HANSI C

Declara constantes y da las declaraciones necesarias para llamadas específicas del 8086 y del DOS

DOS.H

Contiene definiciones para trabajar con directorios.DIR.H

Contiene información utilizada por las macros de conversión y clasificación de caracteres

CTYPE.HANSI C

Define varias funciones utilizadas en las llamadas a rutinas de E/S por consola en DOS

CONIO.HC++

Define las funciones matemáticas complejasCOMPLEX.HC++

Define funciones utilizadas en rutinas de ROM-BIOSBIOS.H

Define la clase bcdBCD.HC++

Declara la macro de depuración assertASSERT.HANSI C

Define funciones de asignación dinámica de memoriaALLOC.H

DESCRIPCIÓNARCHIVODE CABECERA

LENGUAJE

Page 197: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

197

La biblioteca de funciones

Declara constantes y declaraciones para utilizarlos en funciones signal() y raise()

SIGNAL.HANSI C

Parámetros utilizados en funciones que utilizan arhivos-compartidosSHARE.H

Declaraciones para dar soporte a saltos no localesSETJMP.HANSI C

Contiene estructuras y declaraciones para las funciones spawn(), exec()PROCESS.H

Define las funciones de gestión de memoriaMEM.H

Define prototipos para las funciones matemáticasMATH.HANSI C

Define funciones sobre el país e idiomaLOCALE.HANSI C

Parámetros y constantes sobre la capacidad del sistemaLIMITS.HANSI C

Define rutinas básicas de flujo de E/S de C++ (v2.0)IOSTREAM.HC++

Define los gestores de flujos de E/S de C++ y contiene macros para creación de gestores de parámetros

IOMANIP.HC++

Declaraciones de rutinas de E/S tipo UNIXIO.H

Define prototipos para las funciones gráficasGRAPHICS.HC++

Contiene macros para declaraciones de clase genéricasGENERIC.HC++

Define los flujos de C++ que soportan E/S de archivosFSTREAM.HC++

DESCRIPCIÓNARCHIVODE CABECERA

LENGUAJE

Page 198: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

198

La biblioteca de funcionesDESCRIPCIÓNARCHIVO

DE CABECERALENGUAJE

Declara constantes dependientes de la máquinaVALUES.H

Estructuras y prototipos para funciones de tiempoTIME.HANSI C

Define el tipo time_tSYS\TYPES.HC++

Define la función ftime() y la estructura timebSYS\TIMEB.H

Declara constantes simbólicas utilizadas para abrir y crear archivosSYS\STAT.H

Define varias rutinas de manipulación de cadenas y de memoriaSTRING.HANSI C

Define las clases de flujo de C++ para utilizarlas con arrays de bytes en memoria

STREAM.HC++

Define algunas de las rutinas comúnmente utilizadasSTDLIB.HANSI C

Declara las clases de flujo para utilizar con estructuras del archivo stdio.hSTDIOSTR.HC++

Declara tipos y macros para E/S estándarSTDIO.HANSI C

Declara varios tipos de datos y macros de uso comúnSTDDEF.HANSI C

Soporte para aceptar un número variable de argumentosSTDARG.HANSI C

Page 199: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

199

Punteros y arrays

Tema 14

Page 200: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

200

Punteros y arraysObjetivos:

Introducir el concepto de puntero.Introducir el concepto de tipo de dato estructurado.Mostrar la representación de datos mediante arrays unidimensionales y multidimensionales.Conocer la representación de cadenas de caracteres y las funciones de manipulación.

Contenidos:1. Punteros

o Declaracióno Operadores

2. Arrayso Declaracióno Subíndiceso Almacenamiento en memoriao Tamaño de los arrays

3. Inicialización de un array4. Array de caracteres y cadenas de texto5. Arrays multidimensionales

Page 201: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

201

Punteros

Un puntero es una variable que contiene una dirección de memoria. Por ejemplo, la dirección de otra variable .

Page 202: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

202

Punteros (y 2)

Las variables puntero se declaran de la siguiente forma:

tipo *nombre;

siendo nombre el identificador de la variable puntero, y tipo el tipo de variable a la que apunta. Por ejemplo:

char *m;int *n;float *p;

En estas declaraciones, las variables m, n y p son punteros que apuntan, respectivamente, a datos de tipo char, int y float.

Page 203: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

203

Punteros (y 3)

Los operadores de punteros son:& dirección de* en la dirección de

El operador * sólo se puede aplicar a punteros

Las operaciones permitidas con punteros son:AsignaciónIncremento / DecrementoSuma / RestaComparación

Page 204: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

204

Asignación punteros

Dadas las declaracionesfloat x;float *p, *q;

la forma de asignar a p y q la dirección de x es:p = &x;q = &x;

Ahora p y q almacenan la misma dirección de memoria: la de la variable x. El mismo efecto se consigue con la asignación directa entre punteros:p = &x;q = p;

No es correcta una sentencia comop = x;

Page 205: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

205

Ejemplo

#include <stdio.h>main(){int x; /* variable entera */int y; /* variable entera */int *px; /* variable puntero a entero */

x = 5;px = &x; /* asigna a px la direccion de x */y = *px; /* asigna a y el contenido de ladireccion almacenada en px */printf("x = %d\n", x);printf("y = %d\n", y);printf("*px = %d\n", *px);}

5

5

1000

int x;int y;int *px;

(&px) 3000

(&x) 1200

(&x) 1000

1

2

3

x=5;

px=&x;

y=*px;

Page 206: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

206

EjercicioDado el siguiente fragmento de código:

float n1;float n2;float *p1;float *p2;n1 = 4.0;p1 = &n1;p2 = p1;n2 = *p2;n1 = *p1 + *p2;

¿Cuánto vale n1 y n2?

Page 207: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

207

Incremento / Decremento

Los operadores ++ y -- actúan de modo diferente según el tipo apuntado por el puntero.

Si p es un puntero a caracteres (char *p) la operación p++incrementa el valor de p en 1.

Si embargo, si p es un puntero a enteros (int *p), la misma operación p++ incrementa el valor de p en 2 para que apunte al siguiente elemento, pues el tipo int ocupa dos bytes.

Del mismo modo, para el tipo float la operación p++ incrementa el valor de p en 4.

Lo dicho para el operador ++ se cumple exactamente igual, pero decrementando, para el operador --.

Page 208: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

208

Suma / Resta

Ocurre exactamente lo mismo que con las operaciones de incremento y decremento. Si p es un puntero, la operación

p = p + 5;

hace que p apunte 5 elementos más allá del actual.

Si p estaba definido como un puntero a caracteres, se incrementará su valor en 5, pero si estaba definido como un puntero a enteros, se incrementará en 10.

Page 209: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

209

Comparación

Pueden compararse punteros del mismo modo que cualquier otra variable, teniendo siempre presente que se comparan direcciones y NO contenidos.

int *p, *q;

if (p == q) puts ("p y q apuntan a la misma posición de memoria");

Page 210: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

210

Puntero NULL

Cuando se asigna 0 a un puntero, este no apunta a ningún objeto o función.La constante simbólica NULL definida en stdio.h tiene el valor 0 y representa el puntero nulo.Es una buena técnica de programación asegurarse de que todos los punteros toman el valor NULL cuando no apuntan a ningún objeto o función.

int *p = NULL;Para ver si un puntero no apunta a ningún objeto o función:if (p == NULL)

printf("El puntero es nulo\n");else

printf("El contenido de *p es\n", *p);

Page 211: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

211

Arrays

Conjunto de datos del mismo tipo a los que se da un nombre comúny a los que se accede a través de un índice

tipo_dato variable_array[num_elem];

int numeros[20];float temperaturas[100];

En un vector de N elementos, el primero se referencia con el índice 0y el último con el índice N-1Inicialización

int numeros[2]={0,1}int numeros[]={0,1} el compilador asume array de 2 elementos

El procesamiento se debe hacer elemento a elemento

Page 212: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

212

Ejemplo arrays#include <stdio.h>#define TAM_VECTOR 10main(){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]);}

Page 213: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

213

Cadenas de caracteresUn caso particular de vector es la cadena de caracteres. Se declara:

char nombre[num_car];

y permite almacenar num_car-1 caracteres y el carácter nulo '\0' de terminación.

char frase[21];

es apta para almacenar 20 caracteres y el nulo.

C permite la inicialización de cadenas de caracteres en la declaración, mediante sentencias del tipo

char cadena[ ] = "Esto es una cadena de caracteres";

en la que no es necesario añadir el nulo final ni indicar el tamaño, pues lo hace automáticamente el compilador.

Page 214: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

214

Cadenas de caracteres

Una forma de asignar un valor a una cadena es la siguiente:

char cadena[10];

strcpy(cadena, "Hola");

Page 215: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

215

biblioteca estándar string.hchar *strcat (char *cad1, const char *cad2) Concatena cad2 a cad1 devolviendo la

dirección de cad1. Elimina el nulo de terminación de cad1 inicial.char *strcpy (char *cad1, const char *cad2) Copia la cadena cad2 en cad1,

sobreescribiéndola. Devuelve la dirección de cad1. El tamaño de cad1 debe ser suficiente para albergar a cad2.

int strlen (const char *cad) Devuelve el número de caracteres que almacena cad (sin contar el nulo final).

int isalnum (int ch) Devuelve 1 si ch es alfanumérico (letra del alfabeto o dígito) y 0 en caso contrario.

int isalpha (int ch) Devuelve 1 si ch es una letra del alfabeto y 0 en caso contrario.int isdigit (int ch) Devuelve 1 si ch es un dígito del 0 al 9, y 0 en caso contrario.int islower (int ch) Devuelve 1 si ch es un letra minúscula y 0 en caso contrario.int isupper (int ch) Devuelve 1 si ch es una letra mayúscula y 0 en caso contrario.int tolower (int ch) Devuelve el carácter ch en minúscula. Si ch no es una letra

mayúscula la función devuelve ch sin modificación.int toupper (int ch) Devuelve el carácter ch en mayúscula. Si ch no es una letra

minúscula la función devuelve ch sin modificación.

Page 216: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

216

Lectura y escritura de cadenas de caracteres

#include <stdio.h>#define TAM_CADENA 80main(){char cadena[TAM_CADENA];printf("Introduzca una cadena: ");scanf("%s", cadena);printf("La cadena es %s\n", cadena);}

scanf deja de buscar cuando encuentra un blanco ⇒ si se introduce Hola a todos, solo se leerá Hola.No es necesario el operador de dirección (&) ya que cadena representa de forma automática la dirección de comienzo.

Page 217: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

217

Lectura y escritura de cadenas de caracteres (y 2)

La función gets lee una línea completa hasta que encuentre el retorno de carro incluyendo los blancos.La función puts escribe una cadena de caracteres junto con un salto de línea.

#include <stdio.h>#define TAM_LINEA 80main(){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");

Page 218: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

218

EjemploEl programa siguiente hace uso de alguna de las funciones anteriores para examinar una cadena de caracteres y convertir las minúsculas a mayúsculas y viceversa. Además cuenta cuántos caracteres son dígitos numéricos.

#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 dígitos numéricos\n", contador);puts (cadena);

}

Page 219: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

219

La función sizeof()Devuelve el tamaño en bytes que ocupa un tipo o variable en memoria.

#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));

}

Page 220: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

220

Vectores multidimensionales

Un vector multidimensional se declara:

tipo_dato vector[exp1] [exp2] ... [expN];

Matrices o vectores de 2 dimensiones:

int matriz[20][30];

define una matriz de 20 filas por 30 columnas.El elemento de la fila i columna j es matriz[i][j]

Page 221: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

221

EjemploFunción que calcula el producto de dos matrices cuadradas.

void multiplicar(float a[][DIMENSION], float b[][DIMENSION], float c[][DIMENSION]){

int i, j, k;for(i = 0; i < DIMENSION; i++)for(j = 0; j < DIMENSION; j++){

c[i][j] = 0.0;for(k = 0; k < DIMENSION; k++)

c[i][j] += a[i][k] * b[k][j];}

return;}

Page 222: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

222

Funciones y argumentos de tipo puntero

Tema 16

Page 223: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

223

Tema 16

Objetivos:Mostrar el paso de estructuras y arrays a funciones, enfatizando la conveniencia de realizarlo por referencia.Indicar cómo se pasan parámetros al programa principal.

Contenidos:1. Matrices como argumentos de funciones2. Estructuras como argumentos de funciones3. Argumentos de la función main()

Page 224: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

224

Paso de vectores a funcionesUn vector se pasa a una función especificando su nombre sin corchetes.El nombre representa la dirección del primer elemento del vector ⇒ los vectores se pasan por referencia y se pueden modificar en las funciones.El argumento formal correspondiente al vector se escribe con un par de corchetes cuadrados vacíos. El tamaño no se especifica.Programa que calcula la media de los componentes de un vector.

#include <stdio.h>#define MAX_TAM 4void leer_vector(int vector[]);int media_vector(int vector[]);main(){

int v_numeros[MAX_TAM];int media;leer_vector(v_numeros);media = media_vector(v_numeros);printf("La media es %d\n", media);

}

Page 225: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

225

Paso de vectores a funciones (y2)

void leer_vector(int vector[]){

int j;for(j=0; j<MAX_TAM; j++){

printf("Elemento %d: ", j);scanf("%d", &vector[j]);

}return;

}

int media_vector(int vector[]){

int j;int media = 0;for(j=0; j<MAX_TAM; j++)

media = media + vector[j];return(media/MAX_TAM);

}

Page 226: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

226

Punteros y vectoresEl nombre del vector representa la dirección del primer elementodel vector

float vector[MAX_TAM];vector == &vector[0]

El nombre del vector es realmente un puntero al primer elemento del vector

&x[0] ⇒ x&x[1] ⇒ (x+1)&x[2] ⇒ (x+2)&x[i] ⇒ (x+i)

Es decir, &x[i] y (x+i) representan la dirección del i-esimo elemento del vector x ⇒ x[i] y *(x+i) representan el contenido del i-esimoelemento del vector x.

Page 227: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

227

Punteros y vectores (y 2)Cuando un vector se define como un puntero no se le pueden asignar valores ya que un puntero no reserva espacio en memoria.float x[10] define un vector compuesto por 10 números reales ⇒reserva espacio para los elementos.float *x declara un puntero a float. Si se quiere que float x se comporte como un vector ⇒ habrá que reservar memoria para los 10 elementos:

x = (float *) malloc(10 * sizeof(float));malloc(nb) (stdlib.h) reserva un bloque de memoria de nb bytes.Para liberar la memoria asignada se utiliza free() (stdlib.h)

free(x);El uso de punteros permite definir vectores de forma dinámica.

Page 228: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

228

Ejemplo. Programa que calcula la media de un vector de tamaño especificado de forma dinámica.

#include <stdio.h>#include <stdlib.h>void leer_vector(int vector[], int dim);int media_vector(int vector[], int dim);main(){

int *v_numeros;int dimension;int media;printf("Dimension del vector: ");scanf("%d", &dimension);v_numeros = (int *) malloc(dimension*sizeof(int));leer_vector(v_numeros, dimension);media = media_vector(v_numeros, dimension);printf("La media es %d\n", media);free(v_numeros);

}

Page 229: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

229

Ejemplo. Programa que calcula la media de un vector de tamaño especificado de forma dinámica. (y 2)

void leer_vector(int vector[], int dim){

int j;for(j=0; j<dim; j++){

printf("Elemento %d: ", j);scanf("%d", &vector[j]);

}return;

}int media_vector(int vector[], int dim){

int j;int media = 0;for(j=0; j<dim; j++)

media = media + vector[j];return(media/dim);

}

Page 230: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

230

Vectores y cadenas de caracteres

Una cadena de caracteres es un vector de caracteres ⇒ cada elemento del vector almacena un carácter.Ejemplo: Función que copia una cadena en otra:

void copiar(char *destino, char *fuente){while (*fuente != '\0')

{*destino = *fuente;destino++;fuente++ ;}

*destino = '\0';return;}

Page 231: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

231

Punteros a estructurasIgual que con el resto de variables.

struct punto{float x;float y;};main(){

struct punto punto_1;struct punto *punto_2;punto_1.x = 2.0;punto_1.y = 4.0;punto_2 = &punto_1;printf("x = %f \n", punto_2->x);printf("y = %f \n", punto_2->y);

}En una variable de tipo puntero a estructura los miembros se acceden con ->

Page 232: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

232

Paso de estructuras a funciones (ej. por valor)

Se pueden pasar miembros individuales y estructurascompletas.Por valor o por referencia.Una función puede devolver una estructura.Ejemplo: leer y escribir una fecha.

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;

}

Page 233: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

233

Paso de estructuras a funciones (y 2)struct fecha leer_fecha(void)

{struct fecha f;

printf("Dia: ");scanf("%d", &(f.dia));printf("Mes: ");scanf("%d", &(f.mes));printf("Anno: ");scanf("%d", &(f.anno));return(f);

}

main(){struct fecha fecha_de_hoy;fecha_de_hoy = leer_fecha();imprimir_fecha(fecha_de_hoy);}

Page 234: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

234

Paso de estructuras a funciones (ej. por referencia)

void leer_punto(struct punto *p);void imprimir_punto(struct punto p);

main(){

struct punto *p1;p1 = (struct punto *)malloc(sizeof(struct punto));leer_punto(p1);imprimir_punto(*p1);free(p1);

}

Page 235: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

235

Paso de estructuras a funciones (ej. por referencia) (y 2)

void leer_punto(struct punto *p){

printf("x = ");scanf("%f", &(p->x));printf("y = ");scanf("%f", &(p->y));

}void imprimir_punto(struct punto p){printf("x = %f\n", p.x);printf("y = %f\n", p.y);}

Page 236: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

236

Argumentos de la función main()

Ejecutar un programa con parámetros de entrada (en línea de comandos)

main (int argc, char *argv[ ])

argc: Entero que indica el número de parámetros tecleados (incluye el nombre del programa).

argv[ ]: Matriz de cadenas de caracteres. Cada uno de los elementos argv[i] es una cadena que almacena un argumento.

Page 237: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

237

Argumentos de la función main()

La variable argc vale 1 como mínimo, puesto que se cuenta el nombre del programa. Los parámetros se identifican mediante argvde la siguiente manera:

• argv[0] cadena que almacena el nombre del programa.• argv[1] cadena que almacena el primer parámetro.• argv[2] cadena que almacena el segundo parámetro.......• argv[argc] vale cero (En realidad es un puntero nulo).

Para que los argumentos sean tratados como diferentes tienen queir separados por uno o varios espacios blancos

Page 238: Introducción al lenguaje C - mrodriguez.cs.buap.mxmrodriguez.cs.buap.mx/MIS FRAMES/LenguajeCMi_Intro2008.pdfMarta Zorrilla – Universidad de Cantabria 2 Introducción al C Objetivos:

Marta Zorrilla – Universidad de Cantabria

238

EjemploPrograma que lista los parámetros, si los hay, de la línea de órdenes.

#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 parámetros");else {

printf ("\nParámetros en la línea de órdenes: ");for (i = 1; i < argc; i++) printf ("\n%d: %s", i, argv[i]);

}}