Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es...

49
Una breve Una breve introducción introducción

Transcript of Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es...

Page 1: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Una breve Una breve introducciónintroducción

Page 2: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

¿Por qué “C”?¿Por qué “C”?- ““C” es el “idioma” natal de Unix. C” es el “idioma” natal de Unix. - ““C” es “portable” Un código escrito en C” es “portable” Un código escrito en

una máquina se puede usar en otra.una máquina se puede usar en otra.- ““C” es un lenguaje “breve” Tiene un C” es un lenguaje “breve” Tiene un

conjunto de operadores poderoso y conjunto de operadores poderoso y eficientes. eficientes.

- “C” es la base de C++ y Java.- “C” es la base de C++ y Java.

- “C” por supuesto que tiene sus - “C” por supuesto que tiene sus bemoles.bemoles.

Page 3: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Aspectos Básicos de “C” Aspectos Básicos de “C” /* Maraton en kilometros *//* Maraton en kilometros */#include <stdio.h>#include <stdio.h>main( )main( ){{

int miles, yards;int miles, yards;float kms;float kms;miles = 26;miles = 26;yards=385;yards=385;kms = 1.609*(miles+yards/1760.0);kms = 1.609*(miles+yards/1760.0);printf(“un maraton tiene %f kilometros\printf(“un maraton tiene %f kilometros\n”,kms);n”,kms);

}}

Page 4: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Detalles del programaDetalles del programa/* Comentarios *//* Comentarios */

#include <stdio.h>#include <stdio.h>Incluye una copia del archivo stdio.h en este punto del Incluye una copia del archivo stdio.h en este punto del código. Este archivo lo provee el sistema “C”. Se código. Este archivo lo provee el sistema “C”. Se incluye este archivo porque contiene información de incluye este archivo porque contiene información de la función printf( ) Otro archivo de este tipo es: la función printf( ) Otro archivo de este tipo es: <math.h> <math.h>

main()main()Es la función donde se escribe el programa principal. Es la función donde se escribe el programa principal. La ejecución de un programa siempre empieza con La ejecución de un programa siempre empieza con esta función.esta función.

{{Con los paréntesis curvos inicia una función y se Con los paréntesis curvos inicia una función y se termina. También delimita expresiones. termina. También delimita expresiones.

int miles, yardas;int miles, yardas;Declaración de variables. int es una palabra-clave Declaración de variables. int es una palabra-clave (palabras reservadas), tienen significado especial (palabras reservadas), tienen significado especial para el compilador, le dicen que miles y yards son para el compilador, le dicen que miles y yards son enteros. enteros.

Page 5: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

float kms;float kms;

Es una declaración. float es una palabra-clave (palabras que Es una declaración. float es una palabra-clave (palabras que no pueden usarse como nombres de variables, hay 32 en no pueden usarse como nombres de variables, hay 32 en “C”). Le dice al compilador que las variables que le siguen son “C”). Le dice al compilador que las variables que le siguen son números reales.números reales.

miles=26;miles=26;

yards=385;yards=385;

Son expresiones de asignación. El signo “=“ es un operador Son expresiones de asignación. El signo “=“ es un operador de asignación. Los números 26 y 385 son enteros constantes.de asignación. Los números 26 y 385 son enteros constantes.

kms = 1.609*(miles + yards/1760.0);kms = 1.609*(miles + yards/1760.0);

Es una expresión de asignación. Los operadores *, +, /, se Es una expresión de asignación. Los operadores *, +, /, se refieren a la multiplicación, suma y división.refieren a la multiplicación, suma y división.

printf(“un maraton tiene %f kilometros\n”, kms);printf(“un maraton tiene %f kilometros\n”, kms);

Es una expresión que llama a la función printf(). Entre Es una expresión que llama a la función printf(). Entre comillas está la cuerda de control. Dentro de la cuerda está la comillas está la cuerda de control. Dentro de la cuerda está la especificación de conversión o formato %f , ahí se colocará un especificación de conversión o formato %f , ahí se colocará un numero real: kms.numero real: kms.

Page 6: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

División de enteros resulta en enteros y el División de enteros resulta en enteros y el residuo se desecha. Así que 9/2 tiene un residuo se desecha. Así que 9/2 tiene un valor entero de 4. La expresión 9.0/2 es un valor entero de 4. La expresión 9.0/2 es un real dividido por un entero y al evaluarse se real dividido por un entero y al evaluarse se convierte en un real cuyo valor será 4.5convierte en un real cuyo valor será 4.5

kms = 1.609*(miles + yards/1760);kms = 1.609*(miles + yards/1760);

““bug” pues yards (385) es de tipo entero bug” pues yards (385) es de tipo entero dividido por otro entero, lo cual daría por dividido por otro entero, lo cual daría por resultado 0. resultado 0.

kms=1.609*(miles + yards/1760.0);kms=1.609*(miles + yards/1760.0);

Page 7: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

printf() y scanf()printf() y scanf()input and output. Estas funciones son parte del sistema input and output. Estas funciones son parte del sistema “C” existen en una librería y están disponibles “C” existen en una librería y están disponibles dondequiera que se encuentre un sistema “C”. Los dondequiera que se encuentre un sistema “C”. Los prototipos de estas funciones están en prototipos de estas funciones están en stdio.hstdio.h

Argumentos: Argumentos: cuerda de control cuerda de control y y otros argumentosotros argumentos

Para imprimir letras sobre la pantallaPara imprimir letras sobre la pantalla

printf(“abc”);printf(“abc”);

óó

printf(”%s”,”abc”);printf(”%s”,”abc”);

óó

printf(“%c%c%c”,’a’,’b’,’c’);printf(“%c%c%c”,’a’,’b’,’c’);

Page 8: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

printf(“Introduzca los valores de A, w, y B\n”);printf(“Introduzca los valores de A, w, y B\n”);

scanf(“%f %f %d”,&a,&w,&b); scanf(“%f %f %d”,&a,&w,&b);

printf(“Ud. Introdujo A= %e, w= %f, y B= %d\printf(“Ud. Introdujo A= %e, w= %f, y B= %d\n”,a,w,b);n”,a,w,b);

Pantalla:Pantalla:

Introduzca los valores de A, w, y BIntroduzca los valores de A, w, y B

0.0245 1.235 35 0.0245 1.235 35

Ud. Introdujo A= 2.45e-02, w= 1.235 y B= Ud. Introdujo A= 2.45e-02, w= 1.235 y B= 3535

Page 9: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Conversiones de printf() y scanf()Conversiones de printf() y scanf()

c como carácterc como carácter

d como enterod como entero

f como número con punto decimalf como número con punto decimal

lf o LF como número doble precisiónlf o LF como número doble precisión

s como cuerdas como cuerda

Conversiones sólo de printf()Conversiones sólo de printf()e como número real en notación científicae como número real en notación científica

g en el formato e o f, el que sea mas cortog en el formato e o f, el que sea mas corto

Page 10: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Flujos de ControlFlujos de ControlSirven para alterar el flujo secuencial normal en Sirven para alterar el flujo secuencial normal en un programa.un programa.

if y if-else if y if-else proveen acciones alternativas.proveen acciones alternativas.

while y for while y for proveen mecanismos de ciclos.proveen mecanismos de ciclos.

Estos requieren la evaluación de expresiones Estos requieren la evaluación de expresiones lógicas que pueden ser falsas o verdaderas.lógicas que pueden ser falsas o verdaderas.

if( expresión)if( expresión)

operaciónoperación

Page 11: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

if (expr)if (expr)

acciónacción

elseelse

acciónacción

while(expr)while(expr)

acciónacción

for(exp1;expr2;expr3)for(exp1;expr2;expr3)

acciónacción

expr1;expr1;

while(expr2){while(expr2){

acciónacción

expr3;expr3;

}}

Page 12: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

/* calcula el maximo el minimo y el promedio *//* calcula el maximo el minimo y el promedio */#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>main()main(){{

int i;int i;double x, min, max, sum, avg;double x, min, max, sum, avg;if( scanf(“%lf”,&x) != 1) {if( scanf(“%lf”,&x) != 1) {

printf(“no se encontraron datos\n”);printf(“no se encontraron datos\n”);exit(1);exit(1);

}}min = max = sum = avg = x;min = max = sum = avg = x;for( i=2; scanf(“%lf”,&x) == 1; i += 1) {for( i=2; scanf(“%lf”,&x) == 1; i += 1) {

if( x < min)if( x < min) min = x;min = x;else if( (x > max)else if( (x > max) max = x;max = x;

sum += x;sum += x;avg = sum/i;avg = sum/i;

}}printf(“min = %3.5f, min= %3.5f, avg = %3.5f\n”,min, max, avg);printf(“min = %3.5f, min= %3.5f, avg = %3.5f\n”,min, max, avg);

} }

Page 13: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

if( scanf(“%lf”,&x) != 1) {if( scanf(“%lf”,&x) != 1) {printf(“no se encontraron datos\n”);printf(“no se encontraron datos\n”);exit(1);exit(1);

}}lf long float, es equivalente a double. Almacena lo que lee en la dirección de lf long float, es equivalente a double. Almacena lo que lee en la dirección de x, (&x se lee como “la dirección de x” & es el operador “direccion”). La x, (&x se lee como “la dirección de x” & es el operador “direccion”). La función scanf regresa un valor int (entero) que es el número de función scanf regresa un valor int (entero) que es el número de conversiones exitosas que realiza. Si no lee nada, imprime, se imprime un conversiones exitosas que realiza. Si no lee nada, imprime, se imprime un mensaje y sale del programa con la función exit() (esta en stdlib.h), que mensaje y sale del programa con la función exit() (esta en stdlib.h), que toma un solo argumento tipo int, se le da un entero diferente de cero si la toma un solo argumento tipo int, se le da un entero diferente de cero si la salida no se considera normal.salida no se considera normal.

min = max = sum = avg = x;min = max = sum = avg = x;for( i=2; scanf(“%lf”,&x) == 1; i += 1)for( i=2; scanf(“%lf”,&x) == 1; i += 1)Se inicializa la variable i con el valor 2. luego se hace una prueba para ver si Se inicializa la variable i con el valor 2. luego se hace una prueba para ver si la expresión lógica scanf(“%lf”,&x) == 1 es verdadera. Si scanf() puede leer la expresión lógica scanf(“%lf”,&x) == 1 es verdadera. Si scanf() puede leer caracteres de la corriente de entrada standard, lo interpreta como un caracteres de la corriente de entrada standard, lo interpreta como un double y coloca ese valor en la dirección de x, se ha hecho una conversión double y coloca ese valor en la dirección de x, se ha hecho una conversión exitosa y y scanf() regresa el valor 1. == es el operador “igual a” ¿el entero exitosa y y scanf() regresa el valor 1. == es el operador “igual a” ¿el entero que regresa scanf() es igual a 1? (Error común es usar = en vez de ==). Si si que regresa scanf() es igual a 1? (Error común es usar = en vez de ==). Si si lo es, el ciclo se repite.lo es, el ciclo se repite.

variable OP= expresiónvariable OP= expresióndonde OP puede ser +, -, *, o / es equivalente a donde OP puede ser +, -, *, o / es equivalente a

variable = variable OP (expresión)variable = variable OP (expresión)En este caso i += 1 es i = i + 1 En este caso i += 1 es i = i + 1

Page 14: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

if( x < min)if( x < min)

min = x;min = x;

else if ( x > max)else if ( x > max)

max = x;max = x;

Esta construcción es un if-else: La acción después del else Esta construcción es un if-else: La acción después del else es un un condicional if. Aquí el min y max se actualizan con es un un condicional if. Aquí el min y max se actualizan con cada lectura de los datos.cada lectura de los datos.

Se puede crear un archivo de datos, por ejemplo “datos”, Se puede crear un archivo de datos, por ejemplo “datos”, compliamos el programa con la instrucción:compliamos el programa con la instrucción:

cc –o promedio promedio.ccc –o promedio promedio.c

y se crea el ejecutable promedio. Ahora se da el comandoy se crea el ejecutable promedio. Ahora se da el comando

promedio < datospromedio < datos

con esto la entrada se redirecciona hacia el programa con esto la entrada se redirecciona hacia el programa promediopromedio

Page 15: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Operadores de incremento y Operadores de incremento y decrementodecremento

Son operadores usables como pre-fijos o post-fijos. Si val es Son operadores usables como pre-fijos o post-fijos. Si val es una variable de tipo int, entonces ++val y val++ son una variable de tipo int, entonces ++val y val++ son expresiones válidas.expresiones válidas.Se aplican a variables, no a constantes o a expresiones Se aplican a variables, no a constantes o a expresiones ordinarias:ordinarias:++i++ia-- Válidoa-- Válido367++367++++(a*b+1) Inválido++(a*b+1) InválidoCada expresión: ++i, i++ tiene un valor y además, cada Cada expresión: ++i, i++ tiene un valor y además, cada una, causa que se le incremente el valor de i por 1.una, causa que se le incremente el valor de i por 1.++i : aumenta el valor de i por 1,++i : aumenta el valor de i por 1,

y toma ese valor aumentado para la expresión y toma ese valor aumentado para la expresión

Page 16: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

i++: esta expresión primero toma como valor de i, y luego i++: esta expresión primero toma como valor de i, y luego lo aumenta por 1. lo aumenta por 1.

int a, b, c=0;int a, b, c=0;

a = ++c;a = ++c;

b = c++;b = c++;

printf(“%d %d %d\n”, a, b, ++c); printf(“%d %d %d\n”, a, b, ++c);

/*** 1 1 3 se imprime en la pantalla ***//*** 1 1 3 se imprime en la pantalla ***/

El operador –- disminuye el valor de i.El operador –- disminuye el valor de i.

Ejercicio: Qué cree se imprimirá conEjercicio: Qué cree se imprimirá con

int a, b=0, c=0;int a, b=0, c=0;

a = ++b + c++;a = ++b + c++;

printf(“%d %d %d\n”,a,b,c);printf(“%d %d %d\n”,a,b,c);

a= b++ + --c;a= b++ + --c;

printf(“%d %d %d\n”,a,b,c);printf(“%d %d %d\n”,a,b,c);

Page 17: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Operador Modulo %Operador Modulo %

a % b da el residuo de dividir a entre b. Así que, por ejemplo a % b da el residuo de dividir a entre b. Así que, por ejemplo 10%3 tiene el valor 1.10%3 tiene el valor 1.

¿ Qué hace la siguiente sección de programa ?¿ Qué hace la siguiente sección de programa ?

for( i=1; i<=50 ; i++){for( i=1; i<=50 ; i++){

if( i%5 == 0) printf(“\n”);if( i%5 == 0) printf(“\n”);

printf(“a[%d]= %f “,i,a[i]);printf(“a[%d]= %f “,i,a[i]);

}}

Operadores Lógicos: && y, || o, ! negaciónOperadores Lógicos: && y, || o, ! negación

Operadores de Igualdad: == igual a, != no igual aOperadores de Igualdad: == igual a, != no igual a

Operadores relacionales: < , <=, >, >=Operadores relacionales: < , <=, >, >=

Page 18: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Operador Condicional ? :Operador Condicional ? :

Toma tres expresiones, su forma general es:Toma tres expresiones, su forma general es:

expr1 ? expr2 : expr3expr1 ? expr2 : expr3

Primero se evalua expr1, si es verdadera, se evalua expr2 y Primero se evalua expr1, si es verdadera, se evalua expr2 y ese es el valor de la expresión condicional como un todo. Si ese es el valor de la expresión condicional como un todo. Si expr1 es falsa, se evalúa expr3 y ese el es valor de toda la expr1 es falsa, se evalúa expr3 y ese el es valor de toda la expresión condicional expresión condicional

if(y < z)if(y < z)

x=y;x=y;

elseelse

x=z;x=z;

Así se asigna a x el mínimo entre y & z. Es equivalente aAsí se asigna a x el mínimo entre y & z. Es equivalente a

x= (y<z) ? y : zx= (y<z) ? y : z

El tipo de la expresión total lo determina expr2 & expr3.El tipo de la expresión total lo determina expr2 & expr3.

Page 19: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Arreglos, Cuerdas y ApuntadoresArreglos, Cuerdas y ApuntadoresArreglos 1-dimensionales. Datos que tienen un Arreglos 1-dimensionales. Datos que tienen un índice. El índice en “C” empieza en 0.índice. El índice en “C” empieza en 0.

#define N 10#define N 10

float a[N]; float a[N];

Aparta espacio para a[0], a[1],…,a[9] diez Aparta espacio para a[0], a[1],…,a[9] diez elementos. Es una buena practica definir el elementos. Es una buena practica definir el tamaño del arreglo como una constante tamaño del arreglo como una constante simbólica.simbólica.

Sobrepasar el tamaño de un arreglo es un error Sobrepasar el tamaño de un arreglo es un error común al programar.común al programar.

Page 20: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Inicialización:Inicialización:

float f[5] = {0.0, 1.0, 2.0, 3.0, 4.0};float f[5] = {0.0, 1.0, 2.0, 3.0, 4.0};

int a[10] = {0};int a[10] = {0};

Ejemplo del uso de arreglos:Ejemplo del uso de arreglos:

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

#define N 5#define N 5

main()main()

{{

int i, j, score[N]= {99, 87, 85, 94,70}, sum;int i, j, score[N]= {99, 87, 85, 94,70}, sum;

for(sum=0, i=0;i<N; ++i)for(sum=0, i=0;i<N; ++i)

sum += score[i];sum += score[i];

printf(“%5.2f es el promedio\n”,(double) sum/N);printf(“%5.2f es el promedio\n”,(double) sum/N);

}}

Page 21: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

(double) sum/N;(double) sum/N;

usa un operador “cast” cuyo efecto es convertir el valor int usa un operador “cast” cuyo efecto es convertir el valor int de sum a un valor double. Este operador “cast” se realiza de sum a un valor double. Este operador “cast” se realiza primero antes que la división, así que tendríamos una primero antes que la división, así que tendríamos una división entre un un double y un entero, lo cual nos da un división entre un un double y un entero, lo cual nos da un double. Sin este “cast” la fracción se descartaría, y el el double. Sin este “cast” la fracción se descartaría, y el el printf, por el formato, marcaría un error.printf, por el formato, marcaría un error.

POINTER (Apuntadores). Una variable se almacena con un POINTER (Apuntadores). Una variable se almacena con un cierto número de bytes en una localización particular cierto número de bytes en una localización particular (“dirección”) de memoria en una máquina. Los apuntadores (“dirección”) de memoria en una máquina. Los apuntadores se usan para accesar memoria y manipular direcciones.se usan para accesar memoria y manipular direcciones.

Un apuntador es la dirección de un objeto en memoria.Un apuntador es la dirección de un objeto en memoria.

Si p es un apuntador, el valor directo de p es una Si p es un apuntador, el valor directo de p es una localización en memoria o “dirección”. localización en memoria o “dirección”.

Page 22: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

ILUSTRACION: ILUSTRACION:

int a=1, b=2, *p;int a=1, b=2, *p;

Las variables a,b,p están almacenadas e memoria como:Las variables a,b,p están almacenadas e memoria como:

a b pa b p

? ?

Pensamos en p como una flecha. Pero como no se le ha Pensamos en p como una flecha. Pero como no se le ha asignado un valor no sabemos a que apunta. Si escribimos asignado un valor no sabemos a que apunta. Si escribimos p= &a;p= &a;

Esto lo leemos como “a p se le asigna la dirección de a” y el Esto lo leemos como “a p se le asigna la dirección de a” y el diagrama sería:diagrama sería:

1 2

Page 23: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Diagrama nuevo:Diagrama nuevo:

a b pa b p

Ahora hacemos la asignación: b= *p;Ahora hacemos la asignación: b= *p;

Que se lee “a la variable b se le asigna el valor a que apunta Que se lee “a la variable b se le asigna el valor a que apunta p”, y como p apunta hacia a, p”, y como p apunta hacia a,

b = *p; es equivalente a b = a;b = *p; es equivalente a b = a;

Un programa que ilustra la distinción p = &a, y b =*p es: Un programa que ilustra la distinción p = &a, y b =*p es:

1 2

Page 24: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

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

main()main()

{{

int i = 7, *p ; /* variable p de tipo entero */int i = 7, *p ; /* variable p de tipo entero */

p = &i; /* p apunta a la dirección de i */p = &i; /* p apunta a la dirección de i */

printf(“%s%d\n%s%p\n”, “ Valor de i :”, *p,printf(“%s%d\n%s%p\n”, “ Valor de i :”, *p,

“ “Localizacion de i: “, p);Localizacion de i: “, p);

}}

Lo que se lee en la pantalla es:Lo que se lee en la pantalla es:

Valor de i : 7Valor de i : 7

Localización de i : effffb24Localización de i : effffb24

La variable i debe declararse antes detomar su dirección. La variable i debe declararse antes detomar su dirección. %p es el formato preferido para el valor de un apuntador%p es el formato preferido para el valor de un apuntador

Page 25: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Relación entre arreglos y apuntadoresRelación entre arreglos y apuntadores

El nombre de una arreglo por sí mismo es una dirección. Pero a El nombre de una arreglo por sí mismo es una dirección. Pero a diferencia de un apuntador que puede asignársele diferentes diferencia de un apuntador que puede asignársele diferentes direcciones como valores, un arreglo es una dirección (o direcciones como valores, un arreglo es una dirección (o apuntador) que es apuntador) que es fijofijo..

Cuando se declara un arreglo, el compilador da Cuando se declara un arreglo, el compilador da espacio espacio contiguocontiguo en la memoria para contener todos lo elementos de en la memoria para contener todos lo elementos de arreglo. La dirección base del arreglo es la dirección del primer arreglo. La dirección base del arreglo es la dirección del primer elemento a[0].elemento a[0].

int a[10], i, *p, sum;int a[10], i, *p, sum;

p = a; /* equivale a p = &a[0] */p = a; /* equivale a p = &a[0] */

p = a +1; /* equivale a p = &a[1] */p = a +1; /* equivale a p = &a[1] */

Si los elementos a[i] ya tienen valores, podemos sumar sus Si los elementos a[i] ya tienen valores, podemos sumar sus valores convalores con

for( sum=0,p=a; p< &a[10]; ++p) for( sum=0,p=a; p< &a[10]; ++p)

sum += *p;sum += *p;

Page 26: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

FuncionesFunciones

La parte de un código que describe lo que hace una función La parte de un código que describe lo que hace una función se llama se llama definición de la función definición de la función No debe confundirse con la No debe confundirse con la declaración de la función (las funciones también se declaración de la función (las funciones también se declaran antes de usarse).declaran antes de usarse).

tipo nombre(lista de parametros) {tipo nombre(lista de parametros) {

declaracionesdeclaraciones

acciones acciones

}}

El tipo, nombre y lista de parámetros constituyen cabezal El tipo, nombre y lista de parámetros constituyen cabezal de la función.de la función.

{ cuerpo de la definición de la función}{ cuerpo de la definición de la función}

Page 27: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

int factorial( int n) /* cabezal */int factorial( int n) /* cabezal */

{ /* empieza el cuerpo */{ /* empieza el cuerpo */

int i, product= 1;int i, product= 1;

for( i=2; i<= n; ++i)for( i=2; i<= n; ++i)

product *= i;product *= i;

return product;return product;

}}

El primer int le dice al compilador que el valor que regresa El primer int le dice al compilador que el valor que regresa la función es de tipo entero (y si es necesario convertido a la función es de tipo entero (y si es necesario convertido a entero). Solo hay un parámetro. La función se llama con la entero). Solo hay un parámetro. La función se llama con la instrucción: factorial(7);instrucción: factorial(7);

Si la función no regresa ningún valor, ésta debe ser del tipo Si la función no regresa ningún valor, ésta debe ser del tipo void. Si no se pone el tipo, la función será int por default.void. Si no se pone el tipo, la función será int por default.

Los parámetros actúan como sostenedores de espacio. Si no Los parámetros actúan como sostenedores de espacio. Si no hay parámetros, se escribe ahí void (palabra clave).hay parámetros, se escribe ahí void (palabra clave).

Page 28: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Cualquier variable declarada en el cuerpo de la función será Cualquier variable declarada en el cuerpo de la función será “local” a dicha función. Otras variables pueden declararse “local” a dicha función. Otras variables pueden declararse exteriores a la función, esas son variables “globales”.exteriores a la función, esas son variables “globales”.

Cuando el programa se topa con la declaración return, la Cuando el programa se topa con la declaración return, la ejecución de la función se termina y el control regresa al ejecución de la función se termina y el control regresa al lugar desde donde se llamó a la función. lugar desde donde se llamó a la función.

La declaración o “prototipo de la función” se da, por La declaración o “prototipo de la función” se da, por ejemplo comoejemplo como

double power(double x, double y);double power(double x, double y);

El prototipo de función le dice al compilador el número y el El prototipo de función le dice al compilador el número y el tipo de argumentos que se van a pasar a la función, y el tipo de argumentos que se van a pasar a la función, y el tipo de valor que se regresará. Pero los tipo de valor que se regresará. Pero los identificadores identificadores x, y x, y no los usa el compilador. Por eso también se puede escribirno los usa el compilador. Por eso también se puede escribir

double power(double , double );double power(double , double );

Page 29: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

#include <stdio.h>#include <stdio.h>float maximo(float x, float y);float maximo(float x, float y);float minimo(float x, float y);float minimo(float x, float y);void imprimir(int, float , float);void imprimir(int, float , float);

int main( void )int main( void ){{

int i, n;int i, n;float max, min, x;float max, min, x;

printf(“Introduzca el numero de valores N\n”);printf(“Introduzca el numero de valores N\n”);scanf(“%d”,&n);scanf(“%d”,&n);printf(“Introduzca %d valores reales\n”,n);printf(“Introduzca %d valores reales\n”,n);scanf(“%f”,&x);scanf(“%f”,&x);max = min = x;max = min = x;for(i = 2; i <= n; ++i){for(i = 2; i <= n; ++i){ scanf(“%f”,&x);scanf(“%f”,&x); max = maximo(max,x);max = maximo(max,x);

min = minimo(max,x);min = minimo(max,x); }}

imprimir(n,max,min);imprimir(n,max,min);return 0;return 0;

}}

Page 30: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

float maximo(float x, float y)float maximo(float x, float y)

{{

if( x > y)if( x > y)

return x;return x;

elseelse

return y;return y;

}}

float minimo(float x, float y)float minimo(float x, float y)

{{

if( x < y)if( x < y)

return x;return x;

elseelse

return y;return y;

} }

Page 31: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

void imprimir(int n, float x, float y)void imprimir(int n, float x, float y){{

printf(“el maximo de la lista de %d números es %f y el printf(“el maximo de la lista de %d números es %f y el minimo minimo %f\n”,n, max, min);%f\n”,n, max, min);

}}

Los datos pueden ponerse en un archivo “datos” y se corre el Los datos pueden ponerse en un archivo “datos” y se corre el programa escribiendoprograma escribiendoejecutable < datosejecutable < datos o bien el usuario los escribe en la pantalla.o bien el usuario los escribe en la pantalla.

for( i = 2; i <= n; ++i){for( i = 2; i <= n; ++i){ scanf(“%f”,&x);scanf(“%f”,&x); max = maximo(max,x);max = maximo(max,x);

min = minimo(min,x);min = minimo(min,x); }}

En cada ciclo se lee un nuevo valor para x, entonces los valores de En cada ciclo se lee un nuevo valor para x, entonces los valores de max y x pasan como argumentos de la función maximo y el mayor max y x pasan como argumentos de la función maximo y el mayor de los dos se regresa y asigna a max. Similarmente se pasan las de los dos se regresa y asigna a max. Similarmente se pasan las variables min y x como argumentos de minimo y se asigna a min e variables min y x como argumentos de minimo y se asigna a min e menor de los dos.menor de los dos.

Page 32: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

En “C”, los argumentos de las funciones siempre pasan En “C”, los argumentos de las funciones siempre pasan

sólo “su valor”. Es decir, se hace una sólo “su valor”. Es decir, se hace una copia copia del valor de del valor de cada argumento, y son estas copias las que se procesan en cada argumento, y son estas copias las que se procesan en la función. Como consecuencia, la variables que pasan la función. Como consecuencia, la variables que pasan como argumentos a las funciones como argumentos a las funciones NO CAMBIANNO CAMBIAN en el en el ambiente o lugar donde se llamaron.ambiente o lugar donde se llamaron.

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

int main( void )int main( void )

{{

int a=1;int a=1;

void change(int); /* función interna a main */void change(int); /* función interna a main */

printf(“a= %d\n”,a); /* se imprime 1 */printf(“a= %d\n”,a); /* se imprime 1 */

change(a);change(a);

printf(“a=%d\n”,a); /* se impime ?? */printf(“a=%d\n”,a); /* se impime ?? */

return 0;return 0;

}}

Page 33: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

void change( int a)void change( int a)

{{

a = 100;a = 100;

}}

Cuando a se pasa como argumento de la función Cuando a se pasa como argumento de la función se produce una copia de a, es esta copia, y se produce una copia de a, es esta copia, y no la no la misma variablemisma variable a la que pasa a la función. Así que a la que pasa a la función. Así que en el ambiente en que se llama a la función (en en el ambiente en que se llama a la función (en main), la variable a no cambia.main), la variable a no cambia.

Page 34: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Para que una función llame variables por referencia, deben Para que una función llame variables por referencia, deben usarse apuntadores en la lista de parámetros. Y cuando se usarse apuntadores en la lista de parámetros. Y cuando se llama la función, deben pasarse direcciones de variables llama la función, deben pasarse direcciones de variables como argumentos.como argumentos.

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

int main(void)int main(void)

{{

int i=3, j=5;int i=3, j=5;

void intercambia(int *, int *);void intercambia(int *, int *);

intercambia(&i, &j);intercambia(&i, &j);

printf(“%d %d\n”,i,j); /* se imprime 5 3 */printf(“%d %d\n”,i,j); /* se imprime 5 3 */

return 0;return 0;

}}

Page 35: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

void intercambia(int *p, int *q)void intercambia(int *p, int *q)

{{

int tmp;int tmp;

tmp= *p;tmp= *p;

*p = *q;*p = *q;

*q = tmp;*q = tmp;

}}

Toma dos argumentos del tipo pointer a enteros y no Toma dos argumentos del tipo pointer a enteros y no regresa nada. La variable tmp es local de tipo int (y se usa regresa nada. La variable tmp es local de tipo int (y se usa para guardar temporalmente un valor). para guardar temporalmente un valor).

A tmp se le asigna el valor al que apunta p. Se le asigna al A tmp se le asigna el valor al que apunta p. Se le asigna al objeto al que apunta p, el valor al que apunta q. El objeto al objeto al que apunta p, el valor al que apunta q. El objeto al que apunta q se le asigna el valor de tmp. Se han cambiado que apunta q se le asigna el valor de tmp. Se han cambiado en main los valores de objetos donde apunten p y q.en main los valores de objetos donde apunten p y q.

Page 36: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Arreglos como argumentos de funcionesArreglos como argumentos de funciones

En la definición de una función, un parámetro que se En la definición de una función, un parámetro que se declara como un arreglo es realmente un apuntador. Como declara como un arreglo es realmente un apuntador. Como notación de conveniencia, el compilador permite notación notación de conveniencia, el compilador permite notación de paréntesis al declarar pointers como parámetros.de paréntesis al declarar pointers como parámetros.

double sum(double a[], int n) double sum(double a[], int n)

{ /* n es el tamaño de a[] */{ /* n es el tamaño de a[] */

int i;int i;

double sum= 0.0;double sum= 0.0;

for(i=0;i<n; i++) sum += a[i];for(i=0;i<n; i++) sum += a[i];

return sum;return sum;

}}

La declaración double a[] es equivalente a double *aLa declaración double a[] es equivalente a double *a

Page 37: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Arreglos 2-dimensionalesArreglos 2-dimensionalesAunque los elementos de un arreglo se almacenan en Aunque los elementos de un arreglo se almacenan en espacios contiguos uno tras de otro, es conveniente pensar espacios contiguos uno tras de otro, es conveniente pensar en un arreglo 2-dimensional como una colección rectangular en un arreglo 2-dimensional como una colección rectangular de elementos con filas y columnas.de elementos con filas y columnas.

Si declaramosSi declaramos

float a[2][4];float a[2][4];

pensamos que el arreglo se acomoda comopensamos que el arreglo se acomoda como

a[0][0] a[0][1] a[0][2] a[0][4]a[0][0] a[0][1] a[0][2] a[0][4]

a[1][0] a[1][1] a[1][2] a[1][4]a[1][0] a[1][1] a[1][2] a[1][4]

La dirección base del arreglo es &a[0][0], no a. Empezando La dirección base del arreglo es &a[0][0], no a. Empezando el la dirección base, el compilador asigna espacio contiguo el la dirección base, el compilador asigna espacio contiguo para 8 float’s. para 8 float’s.

Page 38: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Declaración Formal de ParámetrosDeclaración Formal de Parámetros

Cuando un arreglo multidimensional es un parámetro en una Cuando un arreglo multidimensional es un parámetro en una definición de función, todos los tamaños, exceptuando el primero, definición de función, todos los tamaños, exceptuando el primero, deben especificarse, de modo que el compilador pueda almacenarlo deben especificarse, de modo que el compilador pueda almacenarlo correctamente. Considere la declaración correctamente. Considere la declaración

float a[2][4];float a[2][4];

Esto aparta espacio para una matriz 2x4.Esto aparta espacio para una matriz 2x4.

float suma(float a[][4])float suma(float a[][4])

{{

int i,j;int i,j;

float sum=0.0;float sum=0.0;

for(i=0;i<2;i++)for(i=0;i<2;i++)

for(j=0;j<4;j++) sum += a[i][j];for(j=0;j<4;j++) sum += a[i][j];

return sum;return sum;

}}

Inicialización: int a[2][3]={1,2,3,4,5,6}; Inicialización: int a[2][3]={1,2,3,4,5,6};

int a[2][3]={{1,2,3},{4,5,6}}; int a[][3]={{1,2,3},{4,5,6}};int a[2][3]={{1,2,3},{4,5,6}}; int a[][3]={{1,2,3},{4,5,6}};

Page 39: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Lo inadecuado de los arreglosLo inadecuado de los arreglosSuponga que se declara una matriz 3x3Suponga que se declara una matriz 3x3

float a[3][3];float a[3][3];

y quiere usarse una función que calcule su determinante. Si y quiere usarse una función que calcule su determinante. Si la matriz ya recibió valores, quisiéramosla matriz ya recibió valores, quisiéramos

det = determinate(a);det = determinate(a);

cuya definición se vería como:cuya definición se vería como:

float determinante(float a[][3])float determinante(float a[][3])

{{

…………..

Se mencionó que es necesario especificar el 3 para que el Se mencionó que es necesario especificar el 3 para que el compilador trabaje bien. Así que nuestra función trabajará compilador trabaje bien. Así que nuestra función trabajará sólo para matrices 3x3. Si queremos calcular el sólo para matrices 3x3. Si queremos calcular el determinante de una matriz 4x4, se requiere escribir una determinante de una matriz 4x4, se requiere escribir una nueva función !! nueva función !!

Page 40: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Construcción de matrices con arreglos de Construcción de matrices con arreglos de apuntadoresapuntadores

Si uno empieza con un apuntador que apunta a un Si uno empieza con un apuntador que apunta a un apuntador que apunta a un float, se puede construir una apuntador que apunta a un float, se puede construir una matriz de cualquier tamaño que uno quiera, y pasarlas a matriz de cualquier tamaño que uno quiera, y pasarlas a funciones diseñadas para trabajar con matrices de tamaño funciones diseñadas para trabajar con matrices de tamaño arbitrario.arbitrario.

Aquí esta el código para crear el espacio para una matriz:Aquí esta el código para crear el espacio para una matriz:

int i, j, n;int i, j, n;

float **a, det, tr;float **a, det, tr;

. . . . . . . . . . . . /* se obtiene n de algún lado */. . . . . . . . . . . . /* se obtiene n de algún lado */

a = calloc(n, sizeof(float *));a = calloc(n, sizeof(float *));

for(i=0;i<n;i++) a[i] = calloc(n,sizeof(float));for(i=0;i<n;i++) a[i] = calloc(n,sizeof(float));

El tamaño de a no se necesita saber a priori, ni se necesita El tamaño de a no se necesita saber a priori, ni se necesita como definir como constante. Una vez conocido el tamaño como definir como constante. Una vez conocido el tamaño deseado, se usa la función calloc de la librería standard para deseado, se usa la función calloc de la librería standard para

Page 41: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

crear espacio para la matriz. Cuando se llama a esta función crear espacio para la matriz. Cuando se llama a esta función como:como:calloc(n, sizeof( type))calloc(n, sizeof( type))se crea espacio para un arreglo de n elementos del tipo se crea espacio para un arreglo de n elementos del tipo especificado (en este caso un apuntador que apunta a un especificado (en este caso un apuntador que apunta a un float), y se regresa la dirección base del arreglo. Así quefloat), y se regresa la dirección base del arreglo. Así que

a = calloc(n, sizeof( float *));a = calloc(n, sizeof( float *));

crea espacio para a (una arreglo de tamaño n, de crea espacio para a (una arreglo de tamaño n, de apuntadores a float), enapuntadores a float), enfor(i=0;i<n;i++) a[i] = calloc(n,sizeof(float));for(i=0;i<n;i++) a[i] = calloc(n,sizeof(float));a cada elemento de a, se le asigna la dirección base del a cada elemento de a, se le asigna la dirección base del espacio creado en memoria para un arreglo de float’s de espacio creado en memoria para un arreglo de float’s de tamaño ntamaño n

Page 42: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Pensamos en a en la memoria como en el diagrama:Pensamos en a en la memoria como en el diagrama:

00

1 1 0 1 2 n-10 1 2 n-1

22

0 1 2 n-10 1 2 n-1

0 1 2 n-10 1 2 n-1

n-1 n-1

0 1 2 n-10 1 2 n-1

Page 43: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

a se almacena en la memoria como un arreglo de a se almacena en la memoria como un arreglo de apuntadores, la expresión a[i][j] se usa para accesar el apuntadores, la expresión a[i][j] se usa para accesar el elemento de la i-ésima fila y j-ésima columna. Como es elemento de la i-ésima fila y j-ésima columna. Como es

del tipo **a, entonces a[i] es del tipo float *, y puede del tipo **a, entonces a[i] es del tipo float *, y puede pensarse como la i-ésima fila de la matriz. Como a[i] es del pensarse como la i-ésima fila de la matriz. Como a[i] es del tipo float *, se sigie que a[i][j] es del tipo float.tipo float *, se sigie que a[i][j] es del tipo float.

Ahora se puede pasar como argumento:Ahora se puede pasar como argumento:

det = dterminante(a,n);det = dterminante(a,n);

tr = traza(a,n); tr = traza(a,n);

float traza(float **a, int n)float traza(float **a, int n)

{ {

int i;int i;

float sum=0.0;float sum=0.0;

for(i=0;i<n;i++) sum += a[i][i];for(i=0;i<n;i++) sum += a[i][i];

return sum;return sum;

}}

Page 44: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Ajustando los índicesAjustando los índicesEspacio asignado por calloc() ( contiguos allocation) no Espacio asignado por calloc() ( contiguos allocation) no regresa al sistema cuando uno sale de la función, debe regresa al sistema cuando uno sale de la función, debe usarse free() explícitamente para regresar ese espacio.usarse free() explícitamente para regresar ese espacio.

free(a), hace esto. calloc puede usarse para iniciar el free(a), hace esto. calloc puede usarse para iniciar el conteo desde 1. El libro Numerical Recipes en “C”, tiene un conteo desde 1. El libro Numerical Recipes en “C”, tiene un archivo nrutil.c donde se hace todo esto.archivo nrutil.c donde se hace todo esto.

#include “nrutil.c”#include “nrutil.c”

float *b, **a;float *b, **a;

b=vector(1,n);b=vector(1,n);

a=matrix(1,n,1,m);a=matrix(1,n,1,m);

Al final de la función debe liberarse el espacio:Al final de la función debe liberarse el espacio:

Page 45: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

free_vector(b,1,n);free_vector(b,1,n);

free_matrix(a,1,n,1,m);free_matrix(a,1,n,1,m);

Debe usarse un apuntador a un archivo, y la función fopen() Debe usarse un apuntador a un archivo, y la función fopen() y fclose() de la librería standard. Su función prototipo esta y fclose() de la librería standard. Su función prototipo esta en stdio.hen stdio.h

int main(void)int main(void)

{{

FILE *fp;FILE *fp;

fp= fopen(“file.dat”,”w”);fp= fopen(“file.dat”,”w”);

. . . . . . . . . .

fclose(fp);fclose(fp);

}}

Page 46: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

fopen() toma dos argumentos de cuerda. El fopen() toma dos argumentos de cuerda. El primero nombra al archivo con el que se primero nombra al archivo con el que se trabajará, y el segundo indica el modo, los mas trabajará, y el segundo indica el modo, los mas comunes son “r” para leer, y “w” para escribir.comunes son “r” para leer, y “w” para escribir.

Para escribir, en algún lugar del programa se usa:Para escribir, en algún lugar del programa se usa:

fprintf(fp,”%e\t%e\t%e\n”,x,f(x),g(x));fprintf(fp,”%e\t%e\t%e\n”,x,f(x),g(x));

Y para leer un archivo ya existente se usa:Y para leer un archivo ya existente se usa:

fscanf(fp,”%f”, &z);fscanf(fp,”%f”, &z);

Page 47: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Funciones matemáticasFunciones matemáticas

““C” tiene funciones matemáticas cuyos prototipos están en C” tiene funciones matemáticas cuyos prototipos están en math.hmath.h

sqrt() pow() exp() log() sin() cos() tan()sqrt() pow() exp() log() sin() cos() tan()

Exceptuando pow(), todas estas funciones toman un solo Exceptuando pow(), todas estas funciones toman un solo argumento de tipo double y regresan uno de tipo double.argumento de tipo double y regresan uno de tipo double.

pow() toma dos argumentos de tipo double, regresa uno pow() toma dos argumentos de tipo double, regresa uno double:double:

pow(2.0, 2.5) 2.0 se eleva a la potencia 2.5pow(2.0, 2.5) 2.0 se eleva a la potencia 2.5

Hay muchas funciones: funciones hiperbólicas, Hay muchas funciones: funciones hiperbólicas, logarítmicas, exponenciales, arco tangente, arco seno, logarítmicas, exponenciales, arco tangente, arco seno, valor absoluto, étc.valor absoluto, étc.

Page 48: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Usando AssertionsUsando Assertions

Suponga que la función f(a,b) se diseña para generar Suponga que la función f(a,b) se diseña para generar valores positivos, y queremos asegurarnos de esto, valores positivos, y queremos asegurarnos de esto, entonces usamos:entonces usamos:

c=f(a,b);c=f(a,b);

assert(c>0);assert(c>0);

Si c>0 no se cumple, assert() escribe un mensaje y aborta.Si c>0 no se cumple, assert() escribe un mensaje y aborta.

assert() tiene sus prototipos en assert.hassert() tiene sus prototipos en assert.h

Si supone que a debe ser 1 o -1, y que b debe estar en el Si supone que a debe ser 1 o -1, y que b debe estar en el intervalo [5,10] escribimos:intervalo [5,10] escribimos:

assert(a==1 || a == -1);assert(a==1 || a == -1);

assert(b>= 5 && b<=10);assert(b>= 5 && b<=10);

assert() es fácil de usar y agrega robustez al código.assert() es fácil de usar y agrega robustez al código.

Page 49: Una breve introducción. ¿Por qué “C”? -“C” es el “idioma” natal de Unix. -“C” es “portable” Un código escrito en una máquina se puede usar en otra. -“C”

Algunos ejerciciosAlgunos ejercicios I. Escriba un programa que pida un número entero y escriba I. Escriba un programa que pida un número entero y escriba

todos los números primos menores que él. (Sugerencia: use todos los números primos menores que él. (Sugerencia: use el operador %)el operador %)

II. Escriba un código que calcule e imprima los números de II. Escriba un código que calcule e imprima los números de Fibonacci: f0= 0, f1=1, f_i+1= f_i+f_i-1, y juntamente con Fibonacci: f0= 0, f1=1, f_i+1= f_i+f_i-1, y juntamente con cada número su respectivo cociente de Fibonacci: q_i = cada número su respectivo cociente de Fibonacci: q_i = f_i/f_i-1 con i=2,3,4,…N, haga N=45 por ejemplo. ¿A qué f_i/f_i-1 con i=2,3,4,…N, haga N=45 por ejemplo. ¿A qué valor converge q_j?valor converge q_j?

III. Sea a un número real positivo, considere la sucesión: III. Sea a un número real positivo, considere la sucesión: x0=1, x_i+1 = 0.5 (x_i + a/x_i) i= 0,1,2,…. Puede mostrarse x0=1, x_i+1 = 0.5 (x_i + a/x_i) i= 0,1,2,…. Puede mostrarse que x_i -> sqrt(a) cuando i -> infty. Escriba un programa que x_i -> sqrt(a) cuando i -> infty. Escriba un programa que lea valores de a, use el algoritmo para calcular la raíz que lea valores de a, use el algoritmo para calcular la raíz de a. Detenga la iteración cuando de a. Detenga la iteración cuando

|a-x_i*x_i| < EPS , ud de el valor de EPS.|a-x_i*x_i| < EPS , ud de el valor de EPS.