tutorial de c

67
Tutorial de C FUNDAMENTOS C Características de C: El lenguaje C fue inventado e implementado por primera vez por Dennis Ritchie en un DEC PDP-11 en Bell Laboratories. Es el resultado de un proceso de desarrollo comenzado con un lenguaje anterior denominado B, inventado por Ken Thompson. En los años 70 el lenguaje B lleva al desarrollo del C. En 1978, Brian Kernighan y Dennis Ritchie publicaron el libro The C Programming Language que ha servido hasta la actualidad como definición eficiente de este lenguaje. El lenguaje C se denomina como un lenguaje de nivel medio, puesto que combina elementos de lenguajes de alto nivel (Fortran, Pascal, Basic, ) con el funcionalismo del lenguaje ensamblador. Una de las ventajas más importantes es la portabilidad de los archivos fuente resultantes. Quiere esto decir que un programa desarrollado en un PC podrá ser ejecutado en un Macintosh o en una máquina UNIX, con mínimas modificaciones y una simple recompilación. El lenguaje C, originalmente desarrollado por D. Ritchie en los laboratorios Bell de la AT&T, fue posteriormente estandarizado por un comité del ANSI (American National Standard Institute) con objeto de garantizar su portabilidad entre las distintas computadoras, dando lugar al ANSI C, que es la variante que actualmente se utiliza casi universalmente. C permite la manipulación de bits, bytes y direcciones (los elementos básicos con que funciona la computadora). C es un lenguaje de propósito general ampliamente utilizado. + Presenta características de bajo nivel, es decir C trabaja con la misma clase de objetos que todas las computadoras sin importar el Sistema Operativo que estén usando. + Esta estrechamente asociado con UNIX, UNIX y su software fueron elaborados en C. + Es un lenguaje adecuado para la programación de sistemas, por su utilidad en la escritura de Sistemas Operativos, por ejemplo si quieres participar enriqueciendo LINUX. + También es adecuado para elaborar cualquier otro tipo de aplicaciones. + Es un lenguaje pequeño ya que sólo ofrece instrucciones de control sencillas y funciones. + No ofrece mecanismos de E/S (entrada/salida), todos los mecanismos de alto nivel se encuentran fuera del lenguaje y se ofrecen como funciones de biblioteca. + Su código fuente es portable ya que puede compilarse y ejecutarse en multitud de computadoras. + Permite la programación estructurada y de diseño modular. Ing. Víctor Hugo Arroyo Hernández

Upload: michel-arteaga

Post on 23-Jan-2016

29 views

Category:

Documents


1 download

DESCRIPTION

fundamentos programacion

TRANSCRIPT

Page 1: Tutorial de C

Tutorial de C

FUNDAMENTOS C

Características de C:

El lenguaje C fue inventado e implementado por primera vez por Dennis Ritchie en un DEC PDP-11 en Bell Laboratories.

Es el resultado de un proceso de desarrollo comenzado con un lenguaje anterior denominado B, inventado por Ken Thompson. En los años 70 el lenguaje B lleva al desarrollo del C. En 1978, Brian Kernighan y Dennis Ritchie publicaron el libro The C Programming Language que ha servido hasta la actualidad como definición eficiente de este lenguaje.

El lenguaje C se denomina como un lenguaje de nivel medio, puesto que combina elementos de lenguajes de alto nivel (Fortran, Pascal, Basic, ) con el funcionalismo del lenguaje ensamblador.Una de las ventajas más importantes es la portabilidad de los archivos fuente resultantes. Quiere esto decir que un programa desarrollado en un PC podrá ser ejecutado en un Macintosh o en una máquina UNIX, con mínimas modificaciones y una simple recompilación. El lenguaje C, originalmente desarrollado por D. Ritchie en los laboratorios Bell de la AT&T, fue posteriormente estandarizado por un comité del ANSI (American National Standard Institute) con objeto de garantizar su portabilidad entre las distintas computadoras, dando lugar al ANSI C, que es la variante que actualmente se utiliza casi universalmente.

C permite la manipulación de bits, bytes y direcciones (los elementos básicos con que funciona la computadora).

C es un lenguaje de propósito general ampliamente utilizado.+ Presenta características de bajo nivel, es decir C trabaja con la misma clase

de objetos que todas las computadoras sin importar el Sistema Operativo que estén usando.

+ Esta estrechamente asociado con UNIX, UNIX y su software fueron elaborados en C.

+ Es un lenguaje adecuado para la programación de sistemas, por su utilidad en la escritura de Sistemas Operativos, por ejemplo si quieres participar enriqueciendo LINUX.

+ También es adecuado para elaborar cualquier otro tipo de aplicaciones.+ Es un lenguaje pequeño ya que sólo ofrece instrucciones de control sencillas

y funciones.+ No ofrece mecanismos de E/S (entrada/salida), todos los mecanismos de

alto nivel se encuentran fuera del lenguaje y se ofrecen como funciones de biblioteca.

+ Su código fuente es portable ya que puede compilarse y ejecutarse en multitud de computadoras.

+ Permite la programación estructurada y de diseño modular.

Ing. Víctor Hugo Arroyo Hernández

Page 2: Tutorial de C

Tutorial de C

Los programas en C consisten en una o más funciones. La única función que debe estar absolutamente presente es la denominada main, siendo la primera función que es llamada cuando comienza la ejecución del programa. Aunque main no forma técnicamente parte del lenguaje C, hay que tratarla como si loV fuera, pues si se emplea para nombrar una variable, probablemente confundirá al compilador.

La forma general de un programa en C es:

instrucciones del preprocesador declaraciones globales tipo_devuelto main(lista de parámetros) { secuencia de instrucciones }

tipo_devuelto función_1(lista de parámetros) { secuencia de instrucciones } tipo_devuelto función_2(lista de parámetros) { secuencia de instrucciones } ... ... tipo_devuelto función_n(lista de parámetros) { secuencia de instrucciones }

El programa así escrito se denomina programa fuente y puede estar escrito en uno o varios archivos. La magnitud del programa y su estructura interna determina o aconseja sobre el número de archivos a utilizar. La división de un programa en varios archivos es una forma de controlar su manejo y su modularidad. Cuando los programas son pequeños (hasta 50≈100 líneas de código), un solo archivo suele bastar. Para programas más grandes, y cuando se quiere mantener más independencia entre los distintos subprogramas, es conveniente repartir el código entre varios archivos.

Para que la computadora pueda ejecutarlos es necesario traducirlos a su propio lenguaje de máquina. Esta es una tarea que realiza un programa especial llamado compilador, que traduce el programa a lenguaje de máquina.

Ing. Víctor Hugo Arroyo Hernández

Page 3: Tutorial de C

Tutorial de C

Esta tarea se suele descomponer en dos etapas, que se pueden realizar juntas o por separado. El programa de alto nivel se suele almacenar en uno o más archivos llamados archivos fuente, que en casi todos los sistemas operativos se caracterizan por una terminación (también llamada extensión) especial. Así, todos los archivos fuente de C deben terminar por (.c); ejemplos de nombres de estos archivos son calculos.c, derivada.c, etc. La primera tarea del compilador es realizar una traducción directa del programa a un lenguaje más próximo al de la computadora (llamado ensamblador), produciendo un archivo objeto con el mismo nombre que el archivo original, pero con la extensión (.obj). En una segunda etapa se realiza el proceso de montaje (link) del programa, consistente en producir un programa ejecutable en lenguaje de máquina, en el que están ya incorporados todos los otros módulos que aporta el sistema sin intervención explícita del programador (funciones de librería, recursos del sistema operativo, etc.). En un PC con sistema operativo Windows el programa ejecutable se guarda en un archivo con extensión (*.exe). Este archivo es cargado por el sistema operativo en la memoria RAM cuando el programa va a ser ejecutado.

Recuérdese además que cada vez que se introduce un cambio en el programa hay que volver a compilarlo. La compilación se realiza a nivel de archivo, por lo que sólo los archivos modificados deben ser compilados de nuevo. Si el programa está repartido entre varios archivos pequeños esta operación se realiza mucho más rápidamente. Hace algún tiempo lo más habitual era que el compilador de C se llamase desde el entorno del sistema operativo MS-DOS, y no desde Windows. Ahora los entornos de trabajo basados en Windows se han generalizado, y el MS-DOS está en claro restroceso como entorno de de sarrollo. En cualquier caso, la forma de llamar a un compilador varía de un compilador a otro, y es necesario disponer de los manuales o al menos de cierta información relativa al compilador concreto que se esté utilizando.

De ordinario se comienza escribiendo el programa en el archivo fuente correspondiente (extensión .c) por medio de un editor de texto. MS-DOS dispone de un editor estándar llamado edit que puede ser utilizado con esta finalidad. En Windows XP o Vista puede utilizarse Notepad.

Existen también entornos de programación más sofisticados que se pueden utilizar desde Windows, como por ejemplo el Visual C++ de Microsoft, o el C++ de Borland, Dev C++. Estos programas ofrecen muchas más posibilidades que las de un simple compilador de ANSI C. En cualquier caso, lo que hay que hacer siempre es consultar el manual correspondiente al compilador que se vaya a utilizar. Estos sistemas disponen de editores propios con ayudas suplementarias para la programación, como por ejemplo criterios de color para distinguir las palabras clave del lenguaje C.

Nota.- “En este curso nos vamos a auxiliar del compilador Dev C ++ “Aunque es un compilador de C Orientado a Objetos este curso solo cubre la parte de C estructurado. 01

Ing. Víctor Hugo Arroyo Hernández

Page 4: Tutorial de C

Tutorial de C

El preprocesador es un componente característico de C, que no existe en otros lenguajes de programación. El preprocesador actúa sobre el programa fuente, antes de que empiece la compilación propiamente dicha, para realizar ciertas operaciones. Una de estas operaciones es, por ejemplo, la sustitución de constantes simbólicas. Así, es posible que un programa haga uso repetidas veces del valor 3.141592654, correspondiente al número π. Es posible definir una constante simbólica llamada PI que se define como 3.141592654 al comienzo del programa y se introduce luego en el código cada vez que hace falta. En realidad PI no es una variable con un determinado valor: el preprocesador chequea todo el programa antes de comenzar la compilación y sustituye el texto PI por el texto 3.141592654 cada vez que lo encuentra. Las constantes simbólicas suelen escribirse completamente con mayúsculas, para distinguirlas de las variables.

El preprocesador realiza muchas otras funciones que se irán viendo a medida que se vaya explicando el lenguaje. Lo importante es recordar que actúa siempre por delante del compilador (de ahí su nombre), facilitando su tarea y la del programador.

Con objeto de mantener el lenguaje lo más sencillo posible, muchas instrucciones que existen en otros lenguajes, no tienen su correspondiente contrapartida en C. Por ejemplo, en C no hay instrucciones para entrada y salida de datos. Es evidente, sin embargo, que ésta es una funcionalidad que hay que cubrir de alguna manera. El lenguaje C lo hace por medio de funciones preprogramadas que se venden o se entregan junto con el compilador. Estas funciones están agrupadas en un conjunto de librerías de código objeto, que constituyen la llamada librería estándar del lenguaje. La llamada a dichas funciones se hace como a otras funciones cualesquiera, y deben ser declaradas antes de ser llamadas por el programa (más adelante se verá cómo se hace esto por medio de la directiva del preprocesador #include).

Recuérdese también que todos los archivos que contienen código fuente en C deben terminar con la extensión (.c), como por ejemplo: producto.c, solucion.c, etc.

La lectura y escritura (o entrada y salida) de datos se realiza por medio de llamadas a funciones de una librería que tiene el nombre de stdio (standard input/output). Las declaraciones de las funciones de esta librería están en un archivo llamado stdio.h. Se utilizan funciones diferentes para leer datos desde teclado o desde disco, y lo mismo para escribir resultados o texto en la pantalla, en la impresora, en el disco, etc.

Es importante considerar que las funciones de entrada y salida de datos son verdaderas funciones, con todas sus características: nombre, valor de retorno y argumentos.

Ing. Víctor Hugo Arroyo Hernández

Page 5: Tutorial de C

Tutorial de C

CAPITULO 1 - Elementos

Comentarios

Comienzan con /* y finalizan con */ . No se pueden anidar. Dentro de un comentario no puede aparecer el símbolo /*.

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

main(){

/*********************************//* Esto es un comentario *//*********************************/printf("Este programa contiene\n");printf("un comentario. \n");system(“pause”);

}

Nota.- La función system() con el parámetro “pause” la usamos aquí para que la ventana de Windows permanezca abierta y nos deje ver el resultado en Dev C++. Para usarla se debe incluir la librería windows.h

Palabras reservadas

Otras características del C es que posee muy pocas palabras clave (32, donde 27 fueron definidas en la versión original y cinco añadidas por el comité del ANSI, enum, const, signed, void y volatile). Todas las palabras clave de C están en minúsculas (C distingue entre las mayúsculas y minúsculas). En la siguiente tabla se muestran las 32 palabras clave:

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

Tipos de datos elementales

Cuando en C, se dice que un objeto es de un tipo, se quiere decir que ese objeto pertenece a un conjunto específico de valores con los cuales se pueden realizar un conjunto de operaciones también determinadas.

Ing. Víctor Hugo Arroyo Hernández

Page 6: Tutorial de C

Tutorial de C

Existen cinco tipos básicos: carácter, entero, coma flotante, coma flotante de doble precisión y void.Los demás tipos se basan en alguno de estos tipos básicos. El tamaño y el rango de estos tipos de datos varían con cada tipo de procesador y con la implementación del compilador de C.

El tipo void, o bien declara explícitamente una función como que no devuelve valor alguno, o bien crea punteros genéricos.

La siguiente tabla muestra todas las combinaciones que se ajustan al estándar ANSI junto con sus rangos mínimos y longitudes aproximadas en bits.

Tipo Significado Tamaño en bits Rangochar carácter 8 -127 a 127unsigned char 8 0 a 255signed char 8 -127 a 127int entero 16 -32767 a 32767unsigned int sin signo 16 0 a 65535signed int con signo 16 -32767 a 32767short int entero corto 16 -32767 a 32767unsigned short int 16 0 a 65535signed short int 16 -32767 a 32767long int entero largo 32 -2147483647 a 2147483647signed long int 32 -2147483647 a 2147483647unsigned long int 32 0 a 4294967295float real 32 seis dígitos de precisióndouble 64 diez dígitos de precisiónlong double 64 diez dígitos de precisión

Constantes

Caracteres: 'a', 'b'

Valores enteros:

- Notación decimal: 987- Notación hexadecimal: 0x25 _o 0X25- Notación octal: 034- Enteros sin signo: 485U- Enteros de tipo long: 485L- Enteros sin signo de tipo long: 485UL- Valores negativos (signo menos): -987

Valores reales (coma flotante):

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

Ing. Víctor Hugo Arroyo Hernández

Page 7: Tutorial de C

Tutorial de C

OperadoresLos operadores son palabras o símbolos que hacen que un programa actúe sobre las variables.En C existen seis tipos de operadores. Aritméticos, relacionales, de asignación, lógicos, de dirección y de movimiento.

InstruccionesUna instrucción es una expresión en C donde se esperan unas consecuencias, normalmente son asignaciones, operaciones, llamadas a funciones, etc.

Macros del preprocesadorUna macro es una codificación de instrucciones que implican una o varias acciones. El preprocesador toma como entrada el programa fuente en C antes que el compilador y ejecuta todas las macros que encuentra.

La función printf

Permite imprimir información por la salida estándar.

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

Especificadores de formato:

Carácter Argumentos Resultadod, i entero entero decimal con signou entero entero decimal sin signoo entero entero octal sin signox,X entero entero hexadecimal sin signof real real con punto y con signoe, E real notación exponencial con signog, Gc carácter un carácters cadena de caracteres cadena de caracteres% imprime %p void Dependiente implementaciónld,lu,lx,lo entero entero largo

Ing. Víctor Hugo Arroyo Hernández

Page 8: Tutorial de C

Tutorial de C

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 entero = 28.200003

Secuencias de escape:

Secuencia Significado\n nueva línea\t tabulador\b backspace\r retorno de carro\" comillas\' apóstrofe\\ backslash\? signo de interrogación

04

Variables

Identificador utilizado para representar un cierto tipo de información. Una variable es una posición de memoria con nombre que se usa para mantener un valor que puede ser modificado en el programa. Una variable puede almacenar diferentes valores en distintas partes del programa.

Debe comenzar con una letra o el carácter _El resto sólo puede contener letras, números o _

Ejemplos de variables validas:

numero_coloridentificador_1

C es sensible a mayúsculas y minúsculas. Las siguientes variables son todas distintas:

pi PI Pi pI

Ing. Víctor Hugo Arroyo Hernández

Page 9: Tutorial de C

Tutorial de C

Declaración de variables

Todas las variables deben ser declaradas antes de poder usarlas.

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

Cada variable es de un tipo de datos determinado.

El formato de una declaración es:

tipo_de_datos var1, var2, ..., varN;

Ejemplos:

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

Deben asignarse a las variables nombres significativos.

int temperatura;int k;

Una variable puede ser fijada a una constante con la sintaxis:

const tipo identificador = valor (por ejemplo const int a=10).

Expresiones e instrucciones

Una expresión representa una unidad de datos simple, tal como un número o carácter.

También puede estar formados por identificadores y operadores:

a + bnum1 * num2

Una instrucción controla el flujo de ejecución de un programa.

Instrucción simple:

temperatura = 4 + 5;

Ing. Víctor Hugo Arroyo Hernández

Page 10: Tutorial de C

Tutorial de C

Instrucción de asignación

El operador de asignación (=) asigna un valor a una variable.Puede asignarse valor inicial a una variable en su declaración.

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

int a = 1;

float b = 4.0;int c, d;char letra;

c = 10;letra = 'a';d = a + c;

printf("a = %d \n", a);printf("b = %f \n", b);printf("c = %d \n", c);printf("d = %d \n", d);printf("La letra es %c \n", letra);system(“pause”);

}05

Función scanf()

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

Formato:

scanf(formato, argumentos);

Especificadores de formato igual que printf().

Ejemplos:

scanf("%f", &numero);scanf("%c", &letra);scanf("%f %d %c", &real, &entero, &letra);scanf("%ld", &entero_largo);

* Importante el símbolo &.

Ing. Víctor Hugo Arroyo Hernández

Page 11: Tutorial de C

Tutorial de C

EjemploPrograma que lee un número entero y lo eleva al cuadrado:

#include <stdio.h>#include <windows.h>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); system(“pause”);}

Introducción a la directiva #define

Permite definir constantes simbólicas en el programa.

#define nombre texto

Donde:nombre representa un nombre simbólico que suele escribirse en mayúsculas.

texto no acaba en ;

nombre es sustituido por texto en cualquier lugar del programa.

Ejemplos:

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

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

#include <stdio.h>#include <windows.h>#define M_PI 3.141593

Ing. Víctor Hugo Arroyo Hernández

Page 12: Tutorial de C

Tutorial de C

main(){

float radio;float area;printf("Introduzca el radio: ");scanf("%f", &radio);area = M_PI * radio * radio;printf("El area del circulo es %5.4f \n", area);system(“pause”);

}07

Errores de codificación comunes

Problemas con las mayúsculas y minúsculas.Omisión del punto y coma.Comentarios incompletos.Comentarios anidados.Uso de variables no declaradas.

Ejemplo: Corregir el siguiente programa

#include <stdio.h>#define M_PI 3.141593

/* Programa que calcula el área de un Circulo*/

Main(){

float radio;printf("Introduzca el radio: ")scanf("%f", &radio);area = M_PI * radio * Radio;printf("El area del circulo es %5.4f \n", area);system(“pause”);

}08EJERCICIOS:09Elaborar un programa en C para cada una de las siguientes opciones, que calcule el área de: Un cuadrado Un rectángulo Un triangulo

El volumen de: Una esfera Una pirámide

Ing. Víctor Hugo Arroyo Hernández

Page 13: Tutorial de C

Tutorial de C

Capitulo 2 - OPERADORES

C es un lenguaje muy rico en operadores. Se definen seis tipos de operadores aritméticos, relacionales, de asignación, lógicos, de dirección y de movimiento.

Operadores aritméticos de C:__________________________________Operador Función + Suma - Resta * Producto / División % Operador módulo resto de la 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 -. Ejemplo: -4

Ejercicio: 10

Hacer un programa en C que realice las siguientes operaciones

aºb

Donde º es cada uno de los operadores, considerando los valores a=10 y b=3

Analice los resultados y posterior mente pruebe con a=11 y b=-3

Vuelva a analizar los resultados.

Conversión de tipos

+ En C un operador se puede aplicar a dos variables o expresiones distintas.+ Los operandos que difieren en tipo pueden sufrir una conversión de tipo.+ Norma general: El operando de menor precisión toma el tipo del operando de mayor precisión.

Reglas de conversión de tipos:1. Si un operando es long double el otro se convierte a long double.2. En otro caso, si es double el otro se convierte a double.

Ing. Víctor Hugo Arroyo Hernández

Page 14: Tutorial de C

Tutorial de C

3. En otro caso, si es float el otro se convierte a float.4. En otro caso, si es unsigned long int el otro se convierte a unsigned long int.5. Si un operando es long int y el otro es unsigned int, entonces:5.1. Si el unsigned int puede convertirse a long int el operando unsigned int se convertirá en long int.5.2. En otro caso, ambos operandos se convertirían a unsigned long int.6. En otro caso, si un operando es long int el otro se convertiría a long int.7. En otro caso, si un operando es unsigned int el otro se convertiría a unsigned int.8. En otro caso, ambos operandos serían convertidos a tipo int si es necesario.

Ejemplo:11Programa que convierte grados Fahrenheit a grados Centìgrados.

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

#include <stdio.h>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);}

Ejercicios:Introduzca una temperatura en grados fahrenheit: 96

96.0000 grados fahrenheit = 35.5557 grados centigrados

¿Qué ocurriría si se hubiera utilizado la siguiente instrucción? (Probar y escribir reporte)

centigrados = 5/9 * (fahrenheit - 32);

Ing. Víctor Hugo Arroyo Hernández

Page 15: Tutorial de C

Tutorial de C

Conversión de tipos

Existe otro tipo de operador denominado molde que su función es hacer posible que una expresión sea de un tipo determinado utilizando la sintaxis

(tipo) expresión;

Siendo tipo uno de los tipos estándar de C.

Por ejemplo, si se quiere asegurar que la expresión x/2 se evalúe de tipo float, se puede escribir: (float) x/2;.

Otro Ejemplo: ( (int) 5.5 % 4)

Prioridad de los operadores aritméticos+ La prioridad indica el orden en el que se realizan las operaciones aritméticas.+ Las operaciones con mayor precedencia se realiza antes.________________________________________ Prioridad Operación Primero ( ) Segundo Negación (signo menos) Tercero * / % Cuarto + ---------------------------------------------------------------------

Dentro de cada grupo las operaciones se realizan de izquierda a derecha.

Ejemplo:a - b / c * d

es equivalente aa - ((b/c) * d)

12

OPERADORES DE ASIGNACION_______________________________________________________ OPERADOR INSTRUCCION INSTRUCCION NO ABREVIADA ABREVIADA = = = ++ m++ m=m+1 -- m-- m=m-1 += m+=n m=m+n -= m-=n m=m-n *= m*=n m=m*n /= m/=n m=m/n %= m%=n m=m%n-----------------------------------------------------------------------------------------------

Ing. Víctor Hugo Arroyo Hernández

Page 16: Tutorial de C

Tutorial de C

Reglas de asignación

Si los dos operandos en una instruccion 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 más corto o a una variable de tipo carácter.

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

Los operadores de asignación ++ y -- pueden ir antes o delante de una expresión formando una nueva expresión. Estas expresiones se denominan post-incrementos o pre-incrementos (decrementos si el operador es --) y son expresiones compuestas, normalmente son del tipo y=x++; (y=++x;).

Operadores de incremento y decremento

Operador de incremento ++ incrementa en uno el operando. Operador de decremento -- decrementa en uno el operando.

Variantes:

Postincremento => i + + Preincremento => + + i Postdecremento => i -- Predecremento => -- i

Ejemplos:

La expresión i + +; => i = i + 1 La expresión + + i; => i = i + 1 La expresión i - - => i = i - 1 La expresión -- i; => i = i - 1

Si el operador precede al operando el valor del operando se modificara antes de su utilización.

Si el operador sigue al operando el valor del operándose modificara después de su utilización.

Ing. Víctor Hugo Arroyo Hernández

Page 17: Tutorial de C

Tutorial de C

Existen una diferencia entre el post-incremento y el pre-incremento. El post-incremento primero suma uno a la variable (x en el ejemplo) y luego asigna ese valor (y en el ejemplo), mientras con el pre-incremento, la asignación es anterior.

Por ejemplo: int x=1, y; y=x++; /* y es 1 y x vale 2 */ int x=1, y; y=++x; /* x vale 2 e y también vale 2 */

Ejercicio:13 Probar los resultados que arrojarían las siguientes instrucciones si a ‘a’ se le asigna el valor de 1.

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

OPERADORES RELACIONALES

Se utilizan para formar expresiones lógicas.El resultado es un valor entero que puede ser: cierto se representa con un 1 falso se representa con un 0

____________________________________________________ OPERADOR SIGNIFICADO == Igual a != No igual a > Mayor que < Menor que >= Mayor o igual que <= Menor o igual que-----------------------------------------------------------------------------------------

14

Ing. Víctor Hugo Arroyo Hernández

Page 18: Tutorial de C

Tutorial de C

Capitulo 3 - INSTRUCCIONES

Una instrucción es cualquier expresión en C que se espera que tenga alguna consecuencia.

Pueden ser asignaciones, operaciones, llamadas a funciones o combinaciones de ellas. Toda instrucción termina con un “;”.

Una instrucción simple consiste en una expresión acabada en un punto y coma (;).

Instrucciones compuestasEs un conjunto de instrucciones simples que se encierran entre los símbolos { } para formar un bloque de código.Pueden aparecer en cualquier sitio en el que podría aparecer una instrucción simple.

Pueden contener declaraciones de nuevos objetos (el alcance de la declaración afecta al bloque).

La sintaxis es: { instrucción; instrucción; ¦ instrucción; }

Tipos de estructuras de programación:

Secuencial: 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.

Estructura SecuencialCorresponde a la ejecución de instrucciones en orden descendente, es tal cual se han utilizado hasta este momento en los ejemplos de este documento.

Ing. Víctor Hugo Arroyo Hernández

Page 19: Tutorial de C

Tutorial de C

Estructura Selección o CondicionalEs donde el flujo de ejecución de las instrucciones depende del valor resultante de una condición. Por el momento vamos a enfocarnos en la instrucción if (aunque existe otra).

Instrucción if

Forma general:if (expresión)instrucción

Se interpreta de la siguiente forma: si expresión es verdadera (valor mayor que 0) =>se ejecuta instrucción.

Ojo.- La expresión debe estar entre paréntesis.

Si es la instrucción es compuesta:

if (expresión){ Instrucción 1 Instrucción 2 . . . Instrucción n}

Ejemplo: Programa que lee un número e indica si es par.

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

Ing. Víctor Hugo Arroyo Hernández

Page 20: Tutorial de C

Tutorial de C

Otro ejemplo:Programa que lee un número y lo eleva al cuadrado si es par.

#include <stdio.h>main(){ int numero; int cuadrado;

/* leer el numero */ printf("Introduzca un numero: "); scanf("%d", &numero);

if ((numero % 2) == 0) { cuadrado = numero * numero; printf("El cuadrado de %d es %d.\n", numero, cuadrado); }}15

Instruction if-else

Forma general:

if (expresión) Instrucción 1else Instrucción 2

si expresión es: verdadera (valor mayor que 0) =>se ejecuta la Instrucción 1. falsa (valor igual a 0) =>se ejecuta Instrucción 2.

Si las Instrucciones son compuestas se encierran entre { }Las Instrucciones pueden ser a su vez instrucciones if-else

if (expresión 1) if (expresión 2) Instrucciones 1 else Instrucciones 2else Instrucciones 3

Ing. Víctor Hugo Arroyo Hernández

Page 21: Tutorial de C

Tutorial de C

Ejemplo:Programa que lee un número y dice si es par o impar.

#include <stdio.h>#include <windows.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); system(“pause”);}16

Ejercicio:17Escribir un programa en C que permita jugar el juego del señor que desea cruzar el río con su Lobo, Oveja y Alfalfa pudiendo cruzar solo el y alguno de los elementos en la embarcación. Considerando que no puede dejar solos a los que se podrían comer uno al otro.

Estructuras de iteración o repetición También denominadas bucles. Permiten realizar un conjunto de instrucciones hasta que se alcance una cierta condición.

La instrucción que nos enfocaremos inicialmente es la llamada while

whileSu forma general es:

while (condición) instrucción;

La condición puede ser cualquier expresión condicional, cualquier valor distinto de 0 es cierto. El bucle itera mientras la condición sea cierta. Cuando la condición se hace falsa, el control del programa pasa a la línea siguiente al código del bucle.

La instrucción, puede ser una instrucción compuesta.

Ing. Víctor Hugo Arroyo Hernández

Page 22: Tutorial de C

Tutorial de C

while (condición){ instrucción 1 instrucción 2 . . instrucción n}

Consideraciones:- Primero se evalúa expresión.- Lo normal es que la instruccion incluya algún elemento que altere el valor de condición, proporcionando así la condición de salida del ciclo.

Ejemplos:

Programa que muestra los primeros 100 números N

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

main(){ int N = 1;

while (N < 100) { N = N + 1; /* equivalente a N++ */ printf("%d \t", N); } system(“pause”);}18

Programa que lee un número N y calcula 1 + 2 + 3 + . . . + N

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

main(){ int N; int suma = 0;

/* leer el numero N */ printf("N: "); scanf("%d", &N);

Ing. Víctor Hugo Arroyo Hernández

Page 23: Tutorial de C

Tutorial de C

while (N > 0) { suma = suma + N; N = N - 1; /* equivalente a N-- */ } printf("1 + 2 +...+ N = %d\n", suma); system(“pause”);}19Ejercicios:20+ Hacer un programa en C que genere la siguiente secuencia 1, 4, 9, 16, 25, 36, hasta obtener 20 elementos21+ Hacer un programa en C que calcule el factorial de un número (el factorial de un número es la multiplicación de el número dado multiplicado por sus anteriores) Ejemplo, el factorial de 5 es 5X4X3X2X122+ Hacer un programa en C que genere la serie de FIBONACCI introduciendo los primeros valores 0 y 1. De ahí debe generar 1,2,3,5,8,13,21,34,55, etc. Generar al menos los primeros 20 números de la serie.

Otras estructuras de repetición

do-while

Esta instrucción ejecutará las instrucciones que se indican mientras el valor de condición sea verdadero (distinto de 0).

Formal general:

do instrucción while (condición);

A diferencia del ciclo while, que analizan la condición del bucle al principio del mismo, el bucle do-while analiza la condición al final del ciclo. Esto significa que el ciclo do-while siempre se ejecuta al menos una vez. La forma general de mostrarse es:

do { instrucción; } while (condición);

Aunque las llaves no son necesarias cuando sólo hay una instrucción, se utilizan normalmente para evitar confusiones al programador con el while.

Ing. Víctor Hugo Arroyo Hernández

Page 24: Tutorial de C

Tutorial de C

Lo normal es la que instrucción incluya algún elemento que altere el valor de condición, proporcionando así la condición de salida del bucle.

Si la instruccion es compuesta se encierra entre { }

do{ instrucción 1 instrucción 2 . . instrucción N}while (condición);

Para la mayoría de las aplicaciones es mejor y más natural comprobar la condición antes de ejecutar el ciclo (ciclo while)

Ejemplo:

Programa 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>#include <windows.h>

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 impar.\n", numero); } while (numero != 0); system(“pause”);}23

Ing. Víctor Hugo Arroyo Hernández

Page 25: Tutorial de C

Tutorial de C

for

El formato general es: for (inicialización; condición; incremento) instrucción;

La inicialización normalmente es una instrucción de asignación que se utiliza para iniciar la variable de control del ciclo.

La condición es una expresión condicional que determina cuando finaliza el ciclo.

El incremento define como cambia la variable de control cada vez que se repite la instrucción.

Estas tres secciones principales deben ser separadas por punto y coma (;). El ciclo for continua ejecutándose mientras que la condición sea cierta. Una vez que la condición es falsa, la ejecución del programa sigue por la instrucción siguiente al for.

Si la instruccion es compuesta se encierra entre { }

No es obligatoria ninguna de las tres expresiones, si se omite la condición se asumirá el valor permanente de 1 (cierto) y el ciclo se ejecutara de forma indefinida, por ejemplo, se puede realizar un ciclo infinito de la forma:

for(;;) printf(“este ciclo estará siempre ejecutándose.\n”);

Si se omite el incremento este tomara un valor por emoción de 1, similarmente el valor de inicialización

Ejemplo:Programa que imprime los 100 primeros números usando for

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

main(){ int numero; for (numero=0; numero <100; numero++) printf("%d\n", numero); system(“pause”);}24

Ing. Víctor Hugo Arroyo Hernández

Page 26: Tutorial de C

Tutorial de C

Ciclos anidados+ Los ciclos se pueden anidar unos y otros.+ Se pueden anidar diferentes tipos de ciclos.+ Importante estructurarlos de forma correcta.

Ejemplo: Calcular 1 + 2 + : : :N mientras N sea distinto de 0.

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

main(){ int N; int suma; int j;

do { /* leer el numero N */ printf("Introduzca N: "); scanf("%d", &N); suma = 0;

for (j = 0; j <= N; j++) /* ciclo anidado */ suma = suma + j;

printf("1 + 2 + ... + N = %d\n", suma); } while (N > 0); /* fin del ciclo do */ system(“pause”);}25

Ing. Víctor Hugo Arroyo Hernández

Page 27: Tutorial de C

Tutorial de C

Otras estructuras condicionales

Estructura switch

Es una instrucción de selección múltiple, que compara sucesivamente el valor de una expresión con una lista de constantes enteras o de caracteres. Cuando se encuentra una correspondencia, se ejecutan las instrucciones asociadas con la constante. l

Formal general:

switch (expresion){ case constante 1: secuencia de instrucciones 1; break;

case constante 2: secuencia de instrucciones 2; break;

case constante 3: secuencia de instrucciones 3; break;

. . . default: secuencia de instrucciones 1;}

La expresión devuelve un valor entero (también puede ser de tipo char) y es la que se compara con cada una de las constante, en caso de coincidir con una realiza la secuencia de instrucciones correspondiente y en caso de no corresponder con alguna ejecutara las de la opción por default , la cual es opcional.

El break indica que debe saltar a continuación de la instrucción switch

La instrucción switch se diferencia de la instruccion if en que sólo puede comparar la igualdad, mientras que if puede evaluar expresiones relacionales o lógicas.No puede haber dos constantes case en el mismo switch que tengan los mismos valores (por supuesto que una instrucción switch contenida en otra instrucción switch pude tener constantes case que sean iguales).

Ing. Víctor Hugo Arroyo Hernández

Page 28: Tutorial de C

Tutorial de C

Si se utilizan constantes de tipo carácter en la instruccion switch, se convierten automáticamente a sus valores enteros.

Ejemplo

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

main(){ char letra;

printf("Introduzca una letra: "); scanf("%c", &letra); switch(letra) { case 'a': case 'A': printf("Vocal %c\n", letra); break; case 'e': case 'E': printf("Vocal %c\n", letra); break; case 'i': case 'I': printf("Vocal %c\n", letra); break; case 'o': case 'O': printf("Vocal %c\n", letra); break; case 'u': case 'U': printf("Vocal %c\n", letra); break; default: printf("Consonante %c\n", letra); } system(“pause”);}26Operador condicional ?

Forma general:expresión_1 ? expresión _2 : expresión _3

Si expresión _1 es verdadero => devuelve expresión _2

Ing. Víctor Hugo Arroyo Hernández

Page 29: Tutorial de C

Tutorial de C

Si expresión _1 es falso => devuelve expresión _3

Su prioridad es justamente superior a los operadores de asignación.

Se evalúa de derecha a izquierda.Ejemplo:

Si a = 1 en la instrucción

k = (a < 0) ? 0 : 100;

Primero se evalúa (a < 0)

Como es falso el operador condicional devuelve 100. Este valor se asigna a k. Es decir k toma el valor 100

Ejercicios:27Hacer un programa en C que ejecute la instrucción ? anterior para ver que si funciona asignándole distintos valores de a.28Elaborara un programa en C que calcule los primeros 100 números primos.

Ing. Víctor Hugo Arroyo Hernández

Page 30: Tutorial de C

Tutorial de C

Capitulo 4 - FUNCIONES Y PROGRAMACION ESTRUCTURADA

Las aplicaciones informáticas que habitualmente se utilizan, incluso a nivel de informática personal, suelen contener decenas y aún cientos de miles de líneas de código fuente. A medida que los programas se van desarrollando y aumentan de tamaño, se convertirían rápidamente en sistemas poco manejables si no fuera por la modularización, que es el proceso consistente en dividir un programa muy grande en una serie de módulos mucho más pequeños y manejables.

A estos módulos se les ha denominado de distintas formas (subprogramas, subrutinas, procedimientos, funciones, etc.) según los distintos lenguajes. El lenguaje C hace uso del concepto de función (function). Sea cual sea la nomenclatura, la idea es sin embargo siempre la misma: dividir un programa grande en un conjunto de subprogramas o funciones más pequeñas que son llamadas por el programa principal; éstas a su vez llaman a otras funciones más específicas y así sucesivamente.

La división de un programa en unidades más pequeñas o funciones presenta (entre otras) las ventajas siguientes:

1. Modularización. Cada función tiene una misión muy concreta, de modo que nunca tiene un número de líneas excesivo y siempre se mantiene dentro de un tamaño manejable. Además, una misma función (por ejemplo, un producto de matrices, una resolución de un sistema de ecuaciones lineales, ...) puede ser llamada muchas veces en un mismo programa, e incluso puede ser reutilizada por otros programas. Cada función puede ser desarrollada y comprobada por separado.

2. Ahorro de memoria y tiempo de desarrollo. En la medida en que una misma función es utilizada muchas veces, el número total de líneas de código del programa disminuye, y también lo hace la probabilidad de introducir errores en el programa.

3. Independencia de datos y ocultamiento de información. Una de las fuentes más comunes de errores en los programas de computadora son los efectos colaterales o perturbaciones que se pueden producir entre distintas partes del programa. Es muy frecuente que al hacer una modificación para añadir una funcionalidad o corregir un error, se introduzcan nuevos errores en partes del programa que antes funcionaban correctamente. Una función es capaz de mantener una gran independencia con el resto del programa, manteniendo sus propios datos y definiendo muy claramente la interfaz o comunicación con la función que la ha llamado y con las funciones a las que llama, y no teniendo ninguna posibilidad de acceso a la información que no le compete.

Ing. Víctor Hugo Arroyo Hernández

Page 31: Tutorial de C

Tutorial de C

Todo programa C consta de una o mas funciones. La forma general de definición de una función es: tipo nombre(lista de parámetros) { cuerpo de la función }

El tipo especifica el tipo de valor que devuelve la instrucción return de la función. El valor puede ser cualquier tipo válido; si no se especifica ninguno, se asume un resultado entero.

La lista de parámetros es la lista de nombres de variables separados por comas con sus tipos asociados que reciben los valores de los argumentos cuando se llama a la función.

Una función puede no tener parámetros, en cuyo caso la lista de parámetros está vacía; sin embargo, los paréntesis son necesarios.

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.

DeclaraciónCada función debe ser declarada. Su forma general es:

tipo nombre_función (lista de tipos (y nombres) de los argumentos);

Si una función va usar argumentos, debe declarar variables que acepten los valores de los argumentos. Estas variables se llaman parámetros formales de la función y se comportan como variables locales dentro de la función, creándose al entrar en la función y destruyéndose al salir. La declaración de parámetros aparece después del nombre de la función al definirla.Los parámetros formales tienen que ser del mismo tipo que los argumentos usados al llamar una función (el compilador no dará error pero los resultados serán inesperados).

Al igual que con variables locales, se pueden hacer asignaciones a los parámetros de una función o usarlos en cualquier expresión válida. Se pueden usar como cualquier otra variable.

Una función es visible para ella misma y otras funciones desde el momento en que se define. Es visible para el propio cuerpo de la función, es decir, la recursividad esta permitida.

Ing. Víctor Hugo Arroyo Hernández

Page 32: Tutorial de C

Tutorial de C

El código de una función es privado a esa función y sólo se puede acceder a él mediante una llamada a esa función. Las variables definidas dentro de una función son locales (a no ser que las definamos globales) por lo que no conservan su valor de una llamada a otra (excepto si se declaran como static, entonces el compilador no las destruye y almacena su valor para la próxima llamada, aunque la variable tiene limitado el ámbito al interior de la función).

En C, todas las funciones están al mismo nivel, es decir, no se puede definir una función dentro de otra función. Esto es por lo que C no es técnicamente un lenguaje estructurado por bloques.

Llamadas a funcionesLas funciones son llamadas para su ejecución desde cualquier parte del código, teniendo en cuenta que antes deben haber sido declaradas (y por supuesto definidas).La llamada de una función se produce mediante el uso de su nombre en una instruccion, pasando una lista de argumentos que deben coincidir en número y tipo con los especificados en la declaración (en otro caso se produciría una conversión de tipos o resultados inesperados).

Llamadas por valor y por referenciaEn general, se pueden pasar argumentos a las funciones de dos formas, por valor y por referencia.La llamada por valor copia el valor de un argumento en el parámetro formal de la función. De esta forma, los cambios en los parámetros de la función no afectan a las variables que se usan en la llamada (es la llamada más usual, es decir, en general no se pueden alterar las variables usadas para llamar a la función).La llamada por referencia copia la dirección del argumento en el parámetro. Dentro de la función se usa la dirección para acceder al argumento usado, significando que los cambios hechos a los parámetros afectan a la variable usada en la llamada.Es posible simular una llamada por referencia pasando un puntero al argumento, entonces, al pasar la dirección, es posible cambiar el valor de la variable usada en la llamada.

Ejemplo:Programa que calcula el máximo de dos números.

#include <stdio.h>

int maximo(int a, int b); /* prototipo de función */

main(){ int x, y; int max; printf("Introduzca dos numeros: "); scanf("%d %d", &x, &y);

Ing. Víctor Hugo Arroyo Hernández

Page 33: Tutorial de C

Tutorial de C

max = maximo(x,y); /* llamada a la función */ printf("El maximo es %d\n", max);}

int maximo(int a, int b) /* definición de la función */{ int max;

if (a > b) max = a; else max = b; return(max); /* devuelve el valor máximo */}29Ejemplo:Programa que dice si un número es un cuadrado perfecto.

#include <stdio.h>#include <math.h>#define TRUE 1#define FALSE 0

void explicacion(void);int cuadrado_perfecto(int x);

main(){ int n; int 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);}

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;

Ing. Víctor Hugo Arroyo Hernández

Page 34: Tutorial de C

Tutorial de C

int perfecto; raiz = (int) sqrt(x); if (x == raiz * raiz) perfecto = TRUE; /* cuadrado perfecto */ else perfecto = FALSE; /* no es cuadrado perfecto */ return(perfecto);}30Ejercicios: 31Explicar donde se aplica la teoría antes descrita en los programas anteriores, es decir donde se declaran la funciones, cuales son sus parámetros, que variables y de que tipo son, así como a que función pertenecen, etc.

32+ Hacer un programa que calcule el factorial de un número usando funciones.

Recursividad

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

Ejemplo: El factorial de un número:

f(n) = 1 si n = 0f(n) = n * f(n - 1) si n > 0

Función que calcula el factorial de forma recursiva:

long int factorial(int n){ if (n <= 1) return(1); else return(n * factorial(n-1));}

Ejercicio: 33Elaborar un programa en C que invoque a la función anterior y calcule el factorial de un número solicitado por el usuario.

Ing. Víctor Hugo Arroyo Hernández

Page 35: Tutorial de C

Tutorial de C

Macros

Una macro es una codificación de instrucciones que implican una o varias acciones. El preprocesador toma como entrada el programa fuente en C antes que el compilador y ejecuta todas las macros que encuentra.

En la composición de macros se pueden utilizar todos los elementos básicos del lenguaje. Las expresiones que se pueden poner en los comandos del preprocesador cuando ponemos la fórmula o expresión, debe ser una expresión que diese los mismos resultados que si la escribiésemos en una línea de C. El resultado debe ser una constante.

La instrucción #define se puede utilizar para definir macros.Una macro es un identificador equivalente a una expresión, instrucción o grupo de instrucción.

Ejemplo: programa que calcula el máximo de dos números.

#include <stdio.h>#define maximo(a,b) ((a > b) ? a : b) /* macro */

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);}34Consideraciones:+ No puede haber blancos entre el identicador 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, como se observa:

main(){ int x, y; int max;

printf("Introduzca dos numeros: "); scanf("%d %d", &x, &y);

max = ((x > y) ? x : y);

Ing. Víctor Hugo Arroyo Hernández

Page 36: Tutorial de C

Tutorial de C

printf("El maximo es %d\n", max);}

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

Otro ejemplo de macros seria:

Dada la siguiente definición de macro:

#define maximo (x,y,z) if (x > y) \ z = x; \ else \ z = y;

Cuando el preprocesador encuentra:

maximo(a, b, max);

Lo sustituirá por:

if ( a > b ) max = a ; else max = b ; ;

Que es equivalente a:

if (a > b) max = a;else max = b;

Ejercicio: 35Escribir un programa en C que use la macro anterior y probar su funcionamiento.

Programación estructurada

Tiende a construir programas fácilmente comprensibles.

Se basa en la técnica de diseño mediante refinamiento progresivo: las operaciones se van descomponiendo poco a poco hasta llegar a operaciones básicas.

Construcciones básicas de la programación estructurada son las ya mencionadas:

Secuencial: ejecución sucesiva de dos o más operaciones.

Ing. Víctor Hugo Arroyo Hernández

Page 37: Tutorial de C

Tutorial de C

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.

Importante: Todos los bloques y funciones tienen un único punto de entrada. Todos los bloques y funciones tienen un único punto de salida.

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

Pasos a seguir:

1. Leer a y b mediante la función scanf()2. Calcular h según la fórmula dada definiendo una función hipotenusa().3. Imprimir el valor de h usando la función printf().

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

float hipotenusa(float a, float b); /* prototipo */

main(){ float a, b; float h; int error;

printf("Introduzca a y b: "); error = scanf("%f %f", &a, &b);

if (error !=2) printf("Error al leer a y b\n"); else { h = hipotenusa(a,b); printf("La hipotenusa es %f\n", h); }}

float hipotenusa(float a, float b){ float h; h = sqrt(pow(a,2) + pow(b, 2)); return(h);}36Nota.- Observe el uso de la variable error

Ing. Víctor Hugo Arroyo Hernández

Page 38: Tutorial de C

Tutorial de C

Capitulo 5 - Arreglos o variables dimensionadas

Un arreglo es una colección de variables del mismo tipo que se referencian por un nombre común. A un elemento específico de un arreglo se accede mediante un índice. En C todos los arreglos constan de posiciones de memoria contiguas. La dirección más baja corresponde al primer elemento y la más alta al último. Los arreglos pueden tener una o varias dimensiones. El arreglo más común en C es la cadena, que simplemente es un arreglo de caracteres terminado por uno nulo.

Arreglos unidimensionalesLos arreglos unidimensionales o vectores son listas de información del mismo tipo que se guardan en posiciones contiguas de memoria según el orden del índice.

La forma general de declaración es:

tipo nombre_variable [tamaño];

Los arreglos tienen que declararse implícitamente para que el compilador reserve espacio en memoria para ellos. El tipo declara el tipo de los elementos del vector, en C los datos individuales de un vector pueden ser de cualquier tipo (int, char, float, etc.)

El tamaño indica cuántos elementos mantendrá el vector.

Para declarar un vector de 10 elementos denominado p y de tipo carácter, se escribe: char p[10];

En este caso hemos declarado un array que tiene diez elementos, desde p[0] hasta p[9].

En C todos los arreglos tienen el 0 como índice de su primer elemento.

Ejemplos: int v_numeros[20]; float n[12]; char vector_letras[5];

C no comprueba los límites de los arreglos. Se puede pasar cualquier extremo de un array y escribir en alguna otra variable de datos e incluso en el código del programa.

Sólo se puede asignar valores iniciales a vectores estáticos y globales. Por ejemplo:

int n[5] = {1, 2, 18, 24, 3};

Ing. Víctor Hugo Arroyo Hernández

Page 39: Tutorial de C

Tutorial de C

En C no se permiten operaciones que impliquen vectores completos

Es decir: No se pueden asignar vectores completos. No se pueden comparar vectores completos.

El procesamiento debe realizarse elemento a elemento. Por ejemplo:

#include <stdio.h>#define TAM_VECTOR 10

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

/* leer el vector a */ for (j = 0; j < TAM_VECTOR; j++) { printf("Elemento %d: ", j); scanf("%d", &vector_a[j]); }

/* copiar el vector */ for (j = 0; j < TAM_VECTOR; j++) vector_b[j] = vector_a[j];

/* escribir el vector b */ for (j = 0; j < TAM_VECTOR; j++) printf("El elemento %d es %d \n",j, vector_b[j]);}37

Paso de vectores a funciones+ Un vector se pasa a una función especificando su nombre sin corchetes.+ El nombre representa la dirección del primer elemento del vector por lo que 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.

Ejemplo Programa que calcula la media de los componentes de un vector.

#include <stdio.h>#define MAX_TAM 4

void leer_vector(int vector[]);int media_vector(int vector[]);

Ing. Víctor Hugo Arroyo Hernández

Page 40: Tutorial de C

Tutorial de C

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

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);}38Cadenas de caracteresEl uso más común de los arreglos unidimensionales es como cadenas de caracteres. En C una cadena se define como un arreglo o vector de caracteres.Para declarar un arreglo de caracteres es necesario un carácter más que la cadena más larga que pueda contener, para dejar sitio para el carácter nulo del final de la cadena.Una constante de cadena es una lista de caracteres encerrada entre dobles comillas. Por ejemplo:

“Hola”

La cadena "Hola" se almacena en memoria:

‘H’ ‘o’ ‘l’ ‘a’ '\0' Y su longitud es 4 (no se considera el carácter nulo).

Consideraciones:'a' representa un carácter individual."Hola" representa una cadena de caracteres."a" representa una cadena de caracteres compuesta por un único carácter.

Ing. Víctor Hugo Arroyo Hernández

Page 41: Tutorial de C

Tutorial de C

Todas las cadenas de caracteres en C finalizan con el carácter nulo de C ('\0').Este carácter indica el fin de una cadena de caracteres.No es necesario añadir explícitamente el carácter nulo al final de las constantes de cadena, el compilador lo hace automáticamente.

Declaración de cadenas de caracteres

char cadena[] = "Hola";

Declara una cadena denominada cadena y reserva espacio para almacenar los siguientes caracteres:

'H' 'o' 'l' 'a' '\0'

Ejemplo:

#include <stdio.h>

main(){ char cadena[] = "hola"; printf("La cadena es %s \n", cadena); printf("Los caracteres son: \n"); printf("%c \n", cadena[0]); printf("%c \n", cadena[1]); printf("%c \n", cadena[2]); printf("%c \n", cadena[3]); printf("%c \n", cadena[4]);}39

cadena[i] representa el i-esimo carácter de la cadena.

Asignación de valores a cadenas de caracteres+ La asignación de valores iniciales a una cadena se puede realizar en su declaración:

char cadena[5] = "Hola";char cadena[10] = "Hola";

+ NO se puede asignar valores de la siguiente forma:cadena = "Hola";

+ Una forma de asignar un valor a una cadena es la siguiente:strcpy(cadena, "Hola");

+ La cadena debe tener suficiente espacio reservado.strcpy(cadena1, cadena2); copia cadena1 en cadena2 incluyendo el

carácter nulo.• strcpy se encuentra en el archivo de cabecera string.h

Ing. Víctor Hugo Arroyo Hernández

Page 42: Tutorial de C

Tutorial de C

Lectura y escritura de cadenas de caracteres

#include <stdio.h>#define TAM_CADENA 80

main(){ char cadena[TAM_CADENA]; printf("Introduzca una cadena: "); scanf("%s", cadena); printf("La cadena es %s\n", cadena);}

Nota.- scanf deja de buscar cuando encuentra un blanco, si se introduce

Hola a todos solo se leería Hola.

+ No es necesario el operador de dirección (&) ya que cadena representa de forma automática la dirección de comienzo.

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 80

main(){ char linea[TAM_LINEA]; printf("Introduzca una linea: \n"); gets(linea); puts("La linea es"); puts(linea);}

Nota.- puts("La linea es:"); es equivalente a: printf("La linea es: \n");40

Ejemplo:

Programa que lee n líneas hasta dar una línea en blanco de y cuenta el número de caracteres de cada línea:

Ing. Víctor Hugo Arroyo Hernández

Page 43: Tutorial de C

Tutorial de C

#include <stdio.h>#define TAM_LINEA 80

main(){ char linea[TAM_LINEA]; int num_car; int j;

while (gets(linea) != NULL) { num_car = 0; j = 0; while (linea[j] != '\0') { num_car ++; j++; } printf("Esta linea tiene %d caracteres\n", num_car); }}41Paso de cadenas de caracteres a funciones+ Cuando se pasa una cadena a una función se pasa la dirección de comienzo de la misma por lo tanto la cadena se puede modificar en la función.

Ejemplo:

#include <stdio.h>#define TAM_LINEA 80void leer_linea(char linea[]);

main(){ char linea[TAM_LINEA]; leer_linea(linea); puts("La linea es"); puts(linea);}

void leer_linea(char linea[]){ gets(linea); return;}

Ing. Víctor Hugo Arroyo Hernández

Page 44: Tutorial de C

Tutorial de C

Ejemplo:Programa que lee n líneas hasta dar una línea en blanco de y cuenta

el número de caracteres de cada línea, usando funciones: (Comparar con el ejemplo anterior que realiza la misma tarea)

#include <stdio.h>#define TAM_LINEA 80int longitud(char cadena[]);

main(){ char linea[TAM_LINEA]; int num_car; while (gets(linea) != NULL) { num_car = longitud(linea); printf("Esta linea tiene %d caracteres\n", num_car); }}

int longitud(char cadena[]){ int j = 0; while (cadena[j] != '\0') j++; return(j);}

EjemploPrograma que lee una línea en minúsculas y la convierte a mayúsculas.

#include <stdio.h>#include <ctype.h>#define TAM_LINEA 80void Convertir_may(char min[], char may[]);

main(){ char linea_min[TAM_LINEA]; char linea_may[TAM_LINEA]; while (gets(linea_min) != NULL) { Convertir_may(linea_min, linea_may); puts(linea_may);

Ing. Víctor Hugo Arroyo Hernández

Page 45: Tutorial de C

Tutorial de C

}}

void Convertir_may(char min[], char may[]){ int j = 0; while (min[j] != '\0') { may[j] = toupper(min[j]); j++; } may[j] = '\0'; return;}

Ejercicio: 42 Documentar cada uno de los ejemplos anteriores, esto implica ademas hacer su prueba de escritorio.

Ing. Víctor Hugo Arroyo Hernández

Page 46: Tutorial de C

Tutorial de C

Funciones de biblioteca para manejar cadenas<string.h>

Función SignificadoStrcpy Copia una cadena en otraStrlen Longitud de la cadenaStrcat Concatenación de cadenasStrcmp Comparación de dos cadenasStrchr Buscar un carácter dentro de una cadenaStrstr Buscar una cadena dentro de otra

<stdlib.h>Función SignificadoAtoi Convierte una cadena a un entero (int)Atol Convierte una cadena a un entero largo

(long)Atof Convierte una cadena a un real (double)

Ing. Víctor Hugo Arroyo Hernández

Page 47: Tutorial de C

Tutorial de C

Arreglos multidimensionalesC permite arreglos de más de una dimensión. La forma general de declaración de un arreglo multidimensional es:

Tipo nombre [a] [b] [c] ¦.. [z];

Los arreglos de tres o más dimensiones no se utilizan a menudo por la cantidad de memoria que se requiere para almacenarlos, ya que el almacenamiento requerido aumenta exponencialmente con el número de dimensiones.

Inicialización de arreglosC permite la inicialización de arreglos en el momento de declararlos, como en cualquier variable. La forma general es:

tipo nombre [tamaño1], …, [tamaño n]={lista de valores};

la lista de valores es una lista de constantes separadas por comas cuyo tipo es compatible con el tipo especificado en la declaración del array. Por ejemplo:

int i[10] = {1,2,3,4,5,6,7,8,9,10};

Con las cadenas o arreglos de caracteres se hace igual, aunque permite una inicialización abreviada. Estas dos instrucciones producen el mismo resultado:

char cad[11] = “Me gusta C”; char cad[11] = {‘M’,’e’,’ ‘,’g’,’u’,’s’,’t’,’a’,’ ‘,’C’,’\0’};

Los arreglos multidimensionales se inicializan del mismo modo que los unidimensionales.

Matrices o vectores de 2 dimensiones:

int matriz[20][30];

define una matriz de 20 por 30 columnas.

El elemento del renglón i columna j es matriz[i][j]

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

Ing. Víctor Hugo Arroyo Hernández

Page 48: Tutorial de C

Tutorial de C

{ c[i][j] = 0.0; for(k = 0; k < DIMENSION; k++) c[i][j] += a[i][k] * b[k][j]; } return;}

Ejercicio: 43Elaborar un programa en C que lea dos matrices e invoque a la función anterior ‘multiplicar’ para multiplicar ambas matrices y obtener la matriz resultante.

Ing. Víctor Hugo Arroyo Hernández

Page 49: Tutorial de C

Tutorial de C

Capitulo 6.-Ambito de las variables y tipos de almacenamiento

Existen dos formas de caracterizar una variable:

+ Por su tipo de datos. Se refiere al tipo de información que representa la variable (int,

char, ... ).+ Por su 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.

Variables locales

Sólo se reconocen dentro de la función donde se definen. Son invisibles al resto.Una variable local normalmente no conserva su valor una vez que el control del programa se transfiere fuera de la función.

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

main(){ int a = 1; /* variable local */ int b = 2; /* variable local */ funcion1(); printf("a = %d, b = %d \n", a, b);}

void funcion1(void){ int a = 3; /* variable local */ int c = 4; /* variable local */ printf("a = %d, c = %d \n", a, c);

Ing. Víctor Hugo Arroyo Hernández

Page 50: Tutorial de C

Tutorial de C

return;}

Ejercicio: Analizar y describir como funciona el ejemplo anterior

Variables globales

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

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; /* variable global */

main(){ printf("Antes a = %d\n", a); funcion1(); printf("Despues a = %d\n", a);}

void funcion1(void){

Ing. Víctor Hugo Arroyo Hernández

Page 51: Tutorial de C

Tutorial de C

a = 1000; return;}

Precaución con el uso de variables globales+ El uso de variables globales puede causar errores inesperados.+ Cualquier función puede cambiar el valor de una variable global, esto implica que puede haber efectos secundarios o laterales.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ía como argumento.

Variables automáticas (auto)

Es la opción por defecto para las variables que se declaran dentro de un bloque {...}, incluido el bloque que contiene el código de las funciones. En C la declaración debe estar siempre al comienzo del bloque. En C++ la declaración puede estar en cualquier lugar y hay autores que aconsejan ponerla justo antes del primer uso de la variable. No es necesario poner la palabra auto. Cada variable auto es creada al comenzar a ejecutarse el bloque y deja de existir cuando el bloque se termina de ejecutar. Cada vez que se ejecuta el bloque, las variables auto se crean y se destruyen de nuevo. Las variables auto son variables locales, es decir, sólo son visibles en el bloque en el que están definidas y en otros bloques anidados en él, aunque pueden ser ocultadas por una nueva declaración de una nueva variable con el mismo nombre en un bloque anidado. No son inicializadas por default, y antes de que el programa les asigne un valor pueden contener basura informática (conjuntos aleatorios de unos y ceros, consecuencia de un uso anterior de esa zona de la memoria).

A continuación se muestra un ejemplo y analisis del uso de variables de modo auto.

{

int i=1, j=2; /* se declaran e inicializan i y j */ ...

{

float a=7., j=3.; /* se declara una nueva variable j */

Ing. Víctor Hugo Arroyo Hernández

Page 52: Tutorial de C

Tutorial de C

...

j=j+a; /* aqui j es float */ ... /* la variable int j es invisible */ ... /* la variable i=1 es visible */ }

… /* fuera del bloque, a ya no existe */

... /* la variable j=2 existe y es entera */Ejemplo:

#include <stdio.h>

main(){ auto int valor; /* equivalente a int valor */ valor = 5; printf("El valor es %d\n", valor);}

Variables externas (extern)

Son variables globales, que se definen fuera de cualquier bloque o función, por ejemplo antes de definir la función main(). Estas variables existen durante toda la ejecución del programa. Las variables extern son visibles por todas las funciones que están entre la definición y el fin del archivo. Para verlas desde otras funciones definidas anteriormente o desde otros archivos, deben ser declaradas en ellos como variables extern. Por defecto, son inicializadas a cero.

Una variable extern es definida o creada (una variable se crea en el momento en el que se le reserva memoria y se le asigna un valor) una sola vez, pero puede ser declarada (es decir, reconocida para poder ser utilizada) varias veces, con objeto de hacerla accesible desde diversas funciones o orchivos. También estas variables pueden ocultarse mediante la declaración de otra variable con el mismo nombre en el interior de un bloque. La variables extern permiten transmitir valores entre distintas funciones, pero ésta es una práctica considerada como peligrosa. A continuación se presenta un ejemplo y analisis del uso de variables extern.

Ing. Víctor Hugo Arroyo Hernández

Page 53: Tutorial de C

Tutorial de C

int i=1, j, k; /* se declaran antes de main() */

main()

{

int i=3; /* i=1 se hace invisible */ int func1(int, int);

... /* j, k son visibles */}

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

Ejercicio: 44Crear dos archivos como se describe a continuación y analizar

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

Ing. Víctor Hugo Arroyo Hernández

Page 54: Tutorial de C

Tutorial de C

Variables estáticas

Cuando ciertas variables son declaradas como static dentro de un bloque, estas variables conservan su valor entre distintas ejecuciones de ese bloque. Dicho de otra forma, las variables static se declaran dentro de un bloque como las auto, pero permanecen en memoria durante toda la ejecución del programa como las extern. Cuando se llama varias veces sucesivas a una función (o se ejecuta varias veces un bloque) que tiene declaradas variables static, los valores de dichas variables se conservan entre dichas llamadas. La inicialización sólo se realiza la primera vez. Por default, son inicializadas a cero.

Las variables definidas como static extern son visibles sólo para las funciones y bloques comprendidos desde su definición hasta el fin del archivo. No son visibles desde otras funciones ni aunque se declaren como extern. Ésta es una forma de restringir la visibilidad de las variables.

Por default, y por lo que respecta a su visibilidad, las funciones tienen modo extern.

Una función puede también ser definida como static, y entonces sólo es visible para las funciones que están definidas después de dicha función y en el mismo fichero. Con estos modos se puede controlar la visibilidad de una función, es decir, desde qué otras funciones puede ser llamada.

Ejemplo:

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

main(){ funcion(); funcion(); funcion();

Ing. Víctor Hugo Arroyo Hernández

Page 55: Tutorial de C

Tutorial de C

}

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

Ejercicio: Probar, analizar y describir como conservan o cambian el valor de las variable, en los ejemplos anteriores

Variables de tipo registro (register)

Informan al compilador que el programador desea que la variable se almacene en un lugar de rápido acceso, generalmente en registros del CPU y los cálculos con ellas sean más rápidos. No existen los modos auto y register para las funciones.- Si no existen registros disponibles se almacenaría en memoria.

Ejemplo:

#include <stdio.h>

main(){ register int j; for (j = 0; j < 10; j++) printf("Contador = %d\n", j);}45

Ing. Víctor Hugo Arroyo Hernández

Page 56: Tutorial de C

Tutorial de C

Capitulo 7 - PUNTEROS

Introducción+ La memoria de la computadora se encuentra organizada en grupos de bytes que se denominan palabras.+ Dentro de la memoria cada dato ocupa un número determinado de bytes:Por ejemplo, recordemos que:

Un char =>1 byte. Un int =>4 bytes.

+ A cada byte o palabra se accede por su dirección.+ Si x es una variable que representa un determinado dato el compilador reservará los bytes necesarios para representar por ejemplo a la variable x (4 bytes si es de tipo int).

Podemos pensar en la memoria como una serie de casilleros identificados por su dirección en donde se almacenan los valores a usar.

Dirección Contenido012...

N Un puntero es una variable que contiene una dirección de memoria. Normalmente, esa dirección es la posición de otra variable de memoria. Si una variable contiene la dirección de otra variable, entonces se dice que la primera variable apunta a la segunda. Si una variable va a contener un puntero, entonces tiene que declararse como tal.

Una declaración de un puntero consiste en un tipo base, un * y el nombre de la variable. La forma general es:

tipo *nombre;

Donde tipo es cualquier tipo válido y nombre es el nombre de la variable puntero. El tipo base del puntero define el tipo de variables a las que puede apuntar. Técnicamente, cualquier tipo de puntero puede apuntar a cualquier dirección de la memoria, sin embargo, toda la aritmética de punteros esta hecha en relación a sus tipos base, por lo que es importante declarar correctamente el puntero.

Ing. Víctor Hugo Arroyo Hernández

Page 57: Tutorial de C

Tutorial de C

Ejemplos:int *numero;float *p;char *letra;

Existen dos operadores especiales de punteros: & y *. El operador de dirección & devuelve la dirección de memoria de su operando. El operador de indirección * devuelve el contenido de la dirección apuntada por el operando.

Si x es una variable entonces &x representa la dirección de memoria de x.

+ Un puntero es una variable que almacena la dirección de otro objeto (variable, función, . . . ).

Ejemplo:

#include <stdio.h>

main(){ int x; /* variable de tipo entero */ int y; /* variable de tipo entero */ int *px; /* variable de tipo puntero a entero */

x = 5; px = &x; /* asigna a px la dirección de x */ y = *px; /* asigna a y el contenido de la dirección almacenada en px */

printf("x = %d\n", x); printf("y = %d\n", y); printf("*px = %d\n", *px);}

*px representa el contenido almacenado en la dirección a la que apunta px.

* es el operador de indirección y opera sobre una variable de tipo puntero.

46

Un puntero representa la dirección de memoria del objeto al que apunta, NO su valor.

Ing. Víctor Hugo Arroyo Hernández

Page 58: Tutorial de C

Tutorial de C

Considerando del ejemplo anterior: int x; int y; int *px;

(&x)100

05

(&x)1500

5

(&px)3000

1000

Después de declarar un puntero, pero antes de asignarle un valor, éste contiene un valor desconocido; si en ese instante lo intenta utilizar, probablemente se estrellará, no sólo el programa sino también el sistema operativo. Por convenio, se debe asignar el valor nulo a un puntero que no este apuntando a ningún sitio, aunque esto tampoco es seguro.Para usar un puntero se debe estar seguro de que apunta a una dirección de memoria correcta.

Asignación de punterosComo en el caso de cualquier otra variable, un puntero puede utilizarse a la derecha de una declaración de asignación para asignar su valor a otro puntero. Por ejemplo: int x; int *p1,*p2; p1=&x; p2=p1;Tanto p1 como p2 apuntan a x.

Un puntero no reserva memoria. El siguiente fragmento de programa es incorrecto:

int *p; *p = 5;

¿A que dirección de memoria apunta p?¿Dónde se almacena el 5?

Ing. Víctor Hugo Arroyo Hernández

X=5 ; a x se le asigna el valor de 5 y supongamos que este valor se asigna en la dirección 1000

px= &x; Aquí px almacena el valor de la disección donde se almaceno el valor de x

Y=*px; Esta instrucción indica que y va a tomar el valor que esta en la dirección de memoria px

Page 59: Tutorial de C

Tutorial de C

Pueden asignarse punteros del mismo tipo entre sí. Dado 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?47

Ing. Víctor Hugo Arroyo Hernández

Page 60: Tutorial de C

Tutorial de C

Paso de punteros a una función

Cuando se pasa un puntero a una función no se pasa una copia sino la dirección del dato al que apunta.

+ El uso de punteros permite el paso de argumentos por referencia.

+ Cuando un argumento se pasa por valor, el dato se copia a la función.

+ Un argumento pasado por valor no se puede modificar.

+ Cuando se pasa un argumento por referencia (cuando un puntero se pasa a una función), se pasa la dirección del dato por lo tanto el contenido de la dirección se puede modificar en la función.

+ Un argumento pasado por referencia si se puede modificar.

+ El uso de punteros como argumentos de funciones permite que el dato sea alterado globalmente dentro de la función.

Ejemplos: 48Ejecuta los siguientes ejemplos y haz una descripción grafica de como funciona el intercambio de valores de la función main y la función que usa cada ejemplo.

Paso de parámetros por valor

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

Ing. Víctor Hugo Arroyo Hernández

Page 61: Tutorial de C

Tutorial de C

Paso de parámetros por referencia.

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

Función que intercambia el valor de dos variables.

#include <stdio.h>

void swap(int *a, int *b); /* prototipo */

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(int *a, int *b){ int temp; temp = *b; *b = *a; *a = temp; return;}

Ing. Víctor Hugo Arroyo Hernández

Page 62: Tutorial de C

Tutorial de C

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

El operador sizeof

Este es el operador de C con el nombre más largo. Puede parecer una función, pero en realidad es un operador. La finalidad del operador sizeof() es devolver el tamaño, en bytes, del tipo de variable introducida entre los paréntesis. Recuérdese que este tamaño depende del compilador y del tipo de computadora que se está utilizando, por lo que es necesario disponer de este operador para producir código portable. Por ejemplo:

var_1 = sizeof(double) /* var_1 contiene el tamaño de una variable double*/Ejemplo:

#include <stdio.h>

main(){ float num; 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));

Ing. Víctor Hugo Arroyo Hernández

Page 63: Tutorial de C

Tutorial de C

printf("num ocupa %d bytes\n", sizeof(num));}49Vectores y cadenas de caracteres

Una cadena de caracteres es un vector de caracteres, ya que, 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;}

Punteros y vectores multidimensionales

Programa que define de forma dinámica una matriz (mediante punteros).

#include <stdio.h>#include <stdlib.h>float **crear_matriz(int fil, int col);void destruir_matriz(float **mat, int fil);void leer_matriz(float **mat, int fil, int col);void imprimir_matriz(float **mat, int fil, int col);

main(){ float **matriz; int fil, col; printf("Numero de filas: "); scanf("%d", &fil); printf("Numero de columnas: "); scanf("%d", &col); matriz = crear_matriz(fil, col); leer_matriz(matriz, fil, col); imprimir_matriz(matriz, fil, col); destruir_matriz(matriz, fil);}

Ing. Víctor Hugo Arroyo Hernández

Page 64: Tutorial de C

Tutorial de C

float **crear_matriz(int fil, int col){ int j; float **mat; mat = (float **) malloc(fil * sizeof(float *)); for (j = 0; j < fil; j++) mat[j] = (float *) malloc(col * sizeof(float)); return(mat);}

void destruir_matriz(float **mat, int fil){ int j; for (j = 0; j < fil; j++) free(mat[j]); free(mat); return;}

void leer_matriz(float **mat, int fil, int col){ int i, j; float dato; for (i = 0; i < fil; i++) for (j = 0; j < col; j++) { printf("Elemento %d %d: ", i,j); scanf("%f", &dato); *(*(mat + i) + j) = dato; } return;}

void imprimir_matriz(float **mat, int fil, int col){ int i, j; for (i = 0; i < fil; i++) for (j = 0; j < col; j++) printf("Elemento %d %d = %f\n", i,j,mat[i][j]); return;}50

LIBRERÍAS DEL LENGUAJE C

Ing. Víctor Hugo Arroyo Hernández

Page 65: Tutorial de C

Tutorial de C

A continuación se incluyen en forma de tabla algunas de las funciones de librería más utilizadas en el lenguaje C.

Función Tipo Descripción Libreria

abs(i) int Devuelve el valor absoluto de i stdlib.h

acos(d) double Devuelve el arco coseno de d math.h

asin(d) double Devuelve el arco seno de d math.h

atan(d) double Devuelve el arco targente de d math.h

atof(s) double Convierte la cadena s en un número de doble precisión

stdlib.h

atoi(s) long Convierte la cadena s en un número entero stdlib.h

clock() long Devuelve la hora del reloj de la computadora. Para pasar a segundos, dividir por la constante CLOCKS_PER_SEC

time.h

cos(d) double Devuelve el coseno de d math.h

exit(u) void Cerrar todos los archivos y buffers, terminando el programa.

stdlib.h

exp(d) double Elevar e a la potencia d (e=2.77182...) math.h

fabs(d) double Devuelve el valor absoluto de d math.h

fclose(f) int Cierra el archivo f. stdlib.h

feof(f) int Determina si se ha encontrado un fin de archivo. stdlib.h

fgetc(f) int Leer un carácter del archivo f. stdlib.h

fgets(s,i,f) char * Leer una cadena s, con i caracteres, del archivo f stdlib.h

floor(d) double Devuelve un valor redondeado por defecto al entero más cercano a d.

math.h

fmod(d1,d2) double Devuelve el resto de d1/d2 (con el mismo signo de d1)

math.h

fopen(s1,s2) FILE * Abre un archivo llamado s1, para una operación del tipo s2.Devuelve el puntero al archivo abierto.

stdlib.h

fprintf(f,...) int Escribe datos en el archivo f. stdlib.h

Ing. Víctor Hugo Arroyo Hernández

Page 66: Tutorial de C

Tutorial de C

fputc(c,f) int Escribe un carácter en el archivo f. stdlib.h

free(p) void Libera un bloque de memoria al que apunta p. malloc.h

fscanf(f,...) int Lee datos del archivo f. stdlib.h

getc(f) int Ler un carácter del archivo f. stdlib.h

getchar() int Lee un carácter desde el dispositivo de entrada estándar.

stdlib.h

log(d) double Devuelve el logaritmo natural de d.

malloc(n) void * Reserva n bytes de memoria.Devuelve un puntero al principio del espacio reservado.

Malloc.h o stdlib.h

pow(d1,d2) double Devuelve d1 elevado a la potencia d2.

printf(...) int Escribe datos en el dispositivo de salida estándar.

stdlib.h

rand(void) int Devuelve un valor aleatorio positivo. stdlib.h

sin(d) double Devuelve el seno de d. math.h

sqrt(d) double Devuelve la raíz cuadrada de d. math.h

strcmp(s1,s2) int Compara dos cadenas lexicográficamente. string.h

strcomp(s1,s2) int Compara dos cadenas lexicográficamente, sin considerar mayúsculas o minúsculas.

string.h

strcpy(s1,s2) char * Copia la cadena s2 en la cadena s1 string.h

strlen(s) int Devuelve el número de caracteres en la cadena s.

string.h

system() int Pasa la orden s al sistema operativo. windows.h

tan(d) double Devuelve la tangente de d. math.h

time(p) long int

Devuelve el número de segundos transcurridos desde de un tiempo base designado (1 de enero de 1970).

time.h

toupper(c) int Convierte una letra a mayúscula. stdlib.h o ctype.h

Nota: La columna tipo se refiere al tipo de la cantidad devuelta por la función. Un asterisco denota puntero, y los argumentos que aparecen en la tabla tienen el significado siguiente:

Ing. Víctor Hugo Arroyo Hernández

Page 67: Tutorial de C

Tutorial de C

c denota un argumento de tipo carácter.

d denota un argumento de doble precisión.

f denota un argumento archivo.

i denota un argumento entero.

l denota un argumento entero largo.

p denota un argument puntero.

s denota un argumento cadena.

u denota un argumento entero sin signo.

Ing. Víctor Hugo Arroyo Hernández