You are on page 1of 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

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

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 MSDOS 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

Se utilizan funciones diferentes para leer datos desde teclado o desde disco. correspondiente al número π. que ésta es una funcionalidad que hay que cubrir de alguna manera. 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. La llamada a dichas funciones se hace como a otras funciones cualesquiera. 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). para realizar ciertas operaciones. El lenguaje C lo hace por medio de funciones preprogramadas que se venden o se entregan junto con el compilador. antes de que empiece la compilación propiamente dicha.c. Una de estas operaciones es. por ejemplo. y lo mismo para escribir resultados o texto en la pantalla. sin embargo. como por ejemplo: producto. Las constantes simbólicas suelen escribirse completamente con mayúsculas. Estas funciones están agrupadas en un conjunto de librerías de código objeto.h. la sustitución de constantes simbólicas. valor de retorno y argumentos. Ing.141592654 cada vez que lo encuentra. solucion. es posible que un programa haga uso repetidas veces del valor 3. Lo importante es recordar que actúa siempre por delante del compilador (de ahí su nombre). etc. El preprocesador realiza muchas otras funciones que se irán viendo a medida que se vaya explicando el lenguaje. Es evidente. facilitando su tarea y la del programador. para distinguirlas de las variables.c). que constituyen la llamada librería estándar del lenguaje. Recuérdese también que todos los archivos que contienen código fuente en C deben terminar con la extensión (. etc.Tutorial de C El preprocesador es un componente característico de C. muchas instrucciones que existen en otros lenguajes. Así.141592654 al comienzo del programa y se introduce luego en el código cada vez que hace falta. no tienen su correspondiente contrapartida en C. en la impresora. 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). en el disco.c. El preprocesador actúa sobre el programa fuente.141592654. que no existe en otros lenguajes de programación. Las declaraciones de las funciones de esta librería están en un archivo llamado stdio. con todas sus características: nombre. Víctor Hugo Arroyo Hernández . Es posible definir una constante simbólica llamada PI que se define como 3. Es importante considerar que las funciones de entrada y salida de datos son verdaderas funciones. Con objeto de mantener el lenguaje lo más sencillo posible. Por ejemplo. en C no hay instrucciones para entrada y salida de datos.

se dice que un objeto es de un tipo.h> #include <windows. Para usarla se debe incluir la librería windows. void y volatile). donde 27 fueron definidas en la versión original y cinco añadidas por el comité del ANSI. Víctor Hugo Arroyo Hernández . Dentro de un comentario no puede aparecer el símbolo /*. signed. #include <stdio. system(“pause”). \n").h> main() { /*********************************/ /* Esto es un comentario /*********************************/ printf("Este programa contiene\n"). No se pueden anidar. */ } Nota.h Palabras reservadas Otras características del C es que posee muy pocas palabras clave (32.Tutorial de C CAPITULO 1 .. printf("un comentario.Elementos Comentarios Comienzan con /* y finalizan con */ . const. enum. En la siguiente tabla se muestran las 32 palabras clave: auto break case char const continue default do double else enum extern oat for goto if int long register return short sizeof static struct switch typedef union unsigned void volatile while Tipos de datos elementales Cuando en C. 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. Todas las palabras clave de C están en minúsculas (C distingue entre las mayúsculas y minúsculas).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++. Ing.

'b' Valores enteros: . Tipo char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double Significado carácter entero sin signo con signo entero corto entero largo real Tamaño en bits Rango 8 -127 a 127 8 0 a 255 8 -127 a 127 16 -32767 a 32767 16 0 a 65535 16 -32767 a 32767 16 -32767 a 32767 16 0 a 65535 16 -32767 a 32767 32 -2147483647 a 2147483647 32 -2147483647 a 2147483647 32 0 a 4294967295 32 seis dígitos de precisión 64 diez dígitos de precisión 64 diez dígitos de precisión Constantes Caracteres: 'a'.2e+9.Enteros de tipo long: 485L .04E-12 . coma flotante de doble precisión y void.Enteros sin signo: 485U . 14.Ejemplos: 12. 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. 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.Tutorial de C Existen cinco tipos básicos: carácter. Los demás tipos se basan en alguno de estos tipos básicos.Notación hexadecimal: 0x25 _o 0X25 .Notación exponencial: .. El tipo void.Notación octal: 034 . 8.Valores negativos (signo menos): -12 -2e+9 02 Ing. 1.34 . . o bien crea punteros genéricos. entero. Víctor Hugo Arroyo Hernández .Valores negativos (signo menos): -987 Valores reales (coma flotante): .Enteros sin signo de tipo long: 485UL . coma flotante.Notación decimal: 987 . o bien declara explícitamente una función como que no devuelve valor alguno.

Tutorial de C
Operadores
Los 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.
Instrucciones
Una instrucción es una expresión en C donde se esperan unas consecuencias,
normalmente son asignaciones, operaciones, llamadas a funciones, etc.
Macros del preprocesador
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.

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
d, i
entero
u
entero
o
entero
x,X
entero
f
real
e, E
real
g, G
c
carácter
s
cadena de caracteres
%
p
void
ld,lu,lx,lo
entero

Resultado
entero decimal con signo
entero decimal sin signo
entero octal sin signo
entero hexadecimal sin signo
real con punto y con signo
notación exponencial con signo
un carácter
cadena de caracteres
imprime %
Dependiente implementación
entero largo

Ing. Víctor Hugo Arroyo Hernández

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.2000
03
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
_color
identificador_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

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+b
num1 * 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

#include <stdio. &letra). scanf("%c". &entero_largo). Formato: scanf(formato. scanf("%ld". char letra. system(“pause”). Puede asignarse valor inicial a una variable en su declaración. c = 10.Tutorial de C Instrucción de asignación El operador de asignación (=) asigna un valor a una variable.h> main() { int a = 1. letra = 'a'. * Importante el símbolo &.0. &entero. letra). &letra). printf("b = %f \n". float b = 4. &numero). Especificadores de formato igual que printf(). printf("c = %d \n". Víctor Hugo Arroyo Hernández . d). d. a). argumentos). La función devuelve el número de datos que se han leído correctamente. int c. printf("La letra es %c \n". b). scanf("%f %d %c". c). printf("a = %d \n". d = a + c. &real. printf("d = %d \n". Ejemplos: scanf("%f". Ing. } 05 Función scanf() Permite leer datos del usuario.h> include <windows.

Tutorial de C Ejemplo Programa que lee un número entero y lo eleva al cuadrado: #include <stdio. int cuadrado. cuadrado = numero * numero. system(“pause”). Víctor Hugo Arroyo Hernández . #define nombre texto Donde: nombre representa un nombre simbólico que suele escribirse en mayúsculas. Ejemplos: #define M_PI 3. printf("El cuadrado de %d es %d\n".141593 Ing. nombre es sustituido por texto en cualquier lugar del programa. texto no acaba en . #include <stdio.h> #include <windows. cuadrado).h> #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. } Introducción a la directiva #define Permite definir constantes simbólicas en el programa.h> #include <windows. scanf("%d". numero. &numero).h> main() { int numero. printf("Introduzca un numero:").

4f \n".141593 /* Programa que calcula el área de un Circulo*/ Main() { float radio. Víctor Hugo Arroyo Hernández . printf("El area del circulo es %5. area = M_PI * radio * radio. area). printf("El area del circulo es %5. } 07 Errores de codificación comunes Problemas con las mayúsculas y minúsculas. Uso de variables no declaradas. &radio). printf("Introduzca el radio: ").h> #define M_PI 3. Comentarios anidados. &radio). que calcule el área de: Un cuadrado Un rectángulo Un triangulo El volumen de: Una esfera Una pirámide Ing. scanf("%f". area). system(“pause”).4f \n". float area. } 08 EJERCICIOS:09 Elaborar un programa en C para cada una de las siguientes opciones. Omisión del punto y coma. printf("Introduzca el radio: ") scanf("%f". Comentarios incompletos. area = M_PI * radio * Radio. Ejemplo: Corregir el siguiente programa #include <stdio. system(“pause”).Tutorial de C main() { float radio.

Se definen seis tipos de operadores aritméticos.Tutorial de C Capitulo 2 . de asignación. 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. + Norma general: El operando de menor precisión toma el tipo del operando de mayor precisión. Reglas de conversión de tipos: 1. 2. si es double el otro se convierte a double. La mayoría de las versiones de C asignan al resto el mismo signo del primer operando. relacionales. + Los operandos que difieren en tipo pueden sufrir una conversión de tipo.OPERADORES C es un lenguaje muy rico en operadores. Ing. 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. Víctor Hugo Arroyo Hernández . Si un operando es long double el otro se convierte a long double. Valores negativos con el signo -. Conversión de tipos + En C un operador se puede aplicar a dos variables o expresiones distintas. El operador % requiere que los dos operandos sean enteros. lógicos. En otro caso.

7. En otro caso. En otro caso. C = (5/9) * (F . En otro caso.0/9 * (fahrenheit . fahrenheit. Víctor Hugo Arroyo Hernández . si un operando es long int el otro se convertiría a long int. printf("%f grados fahrenheit = %f grados centigrados \n". si es float el otro se convierte a float.32). printf("Introduzca una temperatura en grados fahrenheit: ").5557 grados centigrados ¿Qué ocurriría si se hubiera utilizado la siguiente instrucción? (Probar y escribir reporte) centigrados = 5/9 * (fahrenheit . float fahrenheit. En otro caso. si es unsigned long int el otro se convierte a unsigned long int. En otro caso. scanf("%f".1.Tutorial de C 3. } Ejercicios: Introduzca una temperatura en grados fahrenheit: 96 96. 5. &fahrenheit). 6. ambos operandos serían convertidos a tipo int si es necesario.32) #include <stdio.32). Si el unsigned int puede convertirse a long int el operando unsigned int se convertirá en long int. Si un operando es long int y el otro es unsigned int. 8. ambos operandos se convertirían a unsigned long int. si un operando es unsigned int el otro se convertiría a unsigned int.h> main() { float centigrados. centigrados = 5. entonces: 5.2. En otro caso. 4.0000 grados fahrenheit = 35. Ejemplo:11 Programa que convierte grados Fahrenheit a grados Centìgrados. 5. Ing. centigrados).

si se quiere asegurar que la expresión x/2 se evalúe de tipo float..((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.5 % 4) Prioridad de los operadores aritméticos + La prioridad indica el orden en el que se realizan las operaciones aritméticas. Otro Ejemplo: ( (int) 5. Ejemplo: a-b/c*d es equivalente a a . ________________________________________ Prioridad Operación Primero () Segundo Negación (signo menos) Tercero * / % Cuarto + -------------------------------------------------------------------Dentro de cada grupo las operaciones se realizan de izquierda a derecha. Siendo tipo uno de los tipos estándar de C. + Las operaciones con mayor precedencia se realiza antes. Víctor Hugo Arroyo Hernández . se puede escribir: (float) x/2. Por ejemplo.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.

Operador de decremento -. Es importante en C utilizar de forma correcta la conversión de tipos.1 La expresión -. 3. Un valor en coma flotante se puede truncar si se asigna a una variable de tipo entero. Víctor Hugo Arroyo Hernández . (y=++x. Variantes: Postincremento => i + + Preincremento => + + i Postdecremento => i -Predecremento => -. => i = i . Los operadores de asignación ++ y -.Tutorial de C Reglas de asignación Si los dos operandos en una instruccion de asignación son de tipos distintos. => i = i + 1 La expresión i .). Si el operador sigue al operando el valor del operándose modificara después de su utilización.1 Si el operador precede al operando el valor del operando se modificara antes de su utilización. 2.. normalmente son del tipo y=x++. Operadores de incremento y decremento Operador de incremento ++ incrementa en uno el operando. 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.=> i = i . Un valor de doble precisión puede redondearse si se asigna a una variable de coma flotante de simple precisión. Estas expresiones se denominan post-incrementos o pre-incrementos (decrementos si el operador es --) y son expresiones compuestas. Ing.i.i Ejemplos: La expresión i + +. => i = i + 1 La expresión + + i.pueden ir antes o delante de una expresión formando una nueva expresión.decrementa en uno el operando. entonces el valor del operando de la derecha será automáticamente convertido al tipo del operando de la izquierda. Además: 1.

y=++x. \n". El postincremento primero suma uno a la variable (x en el ejemplo) y luego asigna ese valor (y en el ejemplo). \n". a). Víctor Hugo Arroyo Hernández . y=x++. ++a). a++).Tutorial de C Existen una diferencia entre el post-incremento y el pre-incremento. 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. Por ejemplo: int x=1. la asignación es anterior. /* y es 1 y x vale 2 */ int x=1. printf("a printf("a printf("a printf("a = = = = %d %d %d %d \n". OPERADORES RELACIONALES Se utilizan para formar expresiones lógicas. a). mientras con el pre-incremento. /* 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. y. \n". y.

Pueden aparecer en cualquier sitio en el que podría aparecer una instrucción simple. Víctor Hugo Arroyo Hernández . Ing. Iteración: repetición de una operación mientras se cumpla una condición. dependiendo de una condición. } Tipos de estructuras de programación: Secuencial: ejecución sucesiva de dos o más operaciones. operaciones. instrucción. llamadas a funciones o combinaciones de ellas.). Toda instrucción termina con un “. Instrucciones compuestas Es un conjunto de instrucciones simples que se encierran entre los símbolos { } para formar un bloque de código. Una instrucción simple consiste en una expresión acabada en un punto y coma (. Pueden contener declaraciones de nuevos objetos (el alcance de la declaración afecta al bloque). La sintaxis es: { instrucción. Estructura Secuencial Corresponde a la ejecución de instrucciones en orden descendente. es tal cual se han utilizado hasta este momento en los ejemplos de este documento. ¦ instrucción.INSTRUCCIONES Una instrucción es cualquier expresión en C que se espera que tenga alguna consecuencia. Pueden ser asignaciones. Selección: se realiza una u otra operación.Tutorial de C Capitulo 3 .”.

La expresión debe estar entre paréntesis. /* leer el numero */ printf("Introduzca un numero: "). . Si es la instrucción es compuesta: if (expresión) { Instrucción 1 Instrucción 2 . #include <stdio. } Ing. Ojo. if ((numero % 2) == 0) printf("El numero %d es par.h> main() { int numero. Por el momento vamos a enfocarnos en la instrucción if (aunque existe otra). .\n".Tutorial de C Estructura Selección o Condicional Es donde el flujo de ejecución de las instrucciones depende del valor resultante de una condición.. scanf("%d". numero). Víctor Hugo Arroyo Hernández . &numero). 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. Instrucción n } Ejemplo: Programa que lee un número e indica si es par.

numero. scanf("%d". &numero).Tutorial de C Otro ejemplo: Programa que lee un número y lo eleva al cuadrado si es par. } } 15 Instruction if-else Forma general: if (expresión) Instrucción 1 else Instrucción 2 si expresión es: verdadera (valor mayor que 0) =>se ejecuta la Instrucción 1. /* leer el numero */ printf("Introduzca un numero: "). int cuadrado.h> main() { int numero. #include <stdio. Víctor Hugo Arroyo Hernández .\n". printf("El cuadrado de %d es %d. 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 2 else Instrucciones 3 Ing. cuadrado). if ((numero % 2) == 0) { cuadrado = numero * numero. falsa (valor igual a 0) =>se ejecuta Instrucción 2.

La condición puede ser cualquier expresión condicional. Cuando la condición se hace falsa.Tutorial de C Ejemplo: Programa que lee un número y dice si es par o impar.\n". Ing. Considerando que no puede dejar solos a los que se podrían comer uno al otro. puede ser una instrucción compuesta. system(“pause”). if ((numero % 2) == 0) printf("El numero %d es par. cualquier valor distinto de 0 es cierto.\n". el control del programa pasa a la línea siguiente al código del bucle. Estructuras de iteración o repetición También denominadas bucles. numero).h> main() { int numero. La instrucción. Oveja y Alfalfa pudiendo cruzar solo el y alguno de los elementos en la embarcación. /* Leer el numero */ printf("Introduzca un numero: ").h> #include <windows. El bucle itera mientras la condición sea cierta. Víctor Hugo Arroyo Hernández . #include <stdio. else printf("El numero %d es impar. &numero). numero). 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 while Su forma general es: while (condición) instrucción. scanf("%d". } 16 Ejercicio:17 Escribir un programa en C que permita jugar el juego del señor que desea cruzar el río con su Lobo.

+ N #include <stdio.Tutorial de C while (condición) { instrucción 1 instrucción 2 . int suma = 0. while (N < 100) { N = N + 1. instrucción n } Consideraciones: . } system(“pause”). Ejemplos: Programa que muestra los primeros 100 números N #include <stdio.h> #include <windows. scanf("%d". . . proporcionando así la condición de salida del ciclo.h> main() { int N. . &N). printf("%d \t". . Víctor Hugo Arroyo Hernández .Primero se evalúa expresión. /* leer el numero N */ printf("N: "). Ing. /* equivalente a N++ */ } 18 Programa que lee un número N y calcula 1 + 2 + 3 + .h> main() { int N = 1.Lo normal es que la instruccion incluya algún elemento que altere el valor de condición.h> #include <windows. N).

N = N . 16. A diferencia del ciclo while. Ing. } while (condición). Formal general: do instrucción while (condición). Víctor Hugo Arroyo Hernández . Generar al menos los primeros 20 números de la serie. 25.21. 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).1. 4.34. el bucle do-while analiza la condición al final del ciclo.. /* equivalente a N-.55. La forma general de mostrarse es: do { instrucción. De ahí debe generar 1. Aunque las llaves no son necesarias cuando sólo hay una instrucción.8. system(“pause”).3. se utilizan normalmente para evitar confusiones al programador con el while. que analizan la condición del bucle al principio del mismo. suma). hasta obtener 20 elementos 21 + 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. etc.5. Esto significa que el ciclo do-while siempre se ejecuta al menos una vez.+ N = %d\n"..Tutorial de C while (N > 0) { suma = suma + N. 9.*/ } printf("1 + 2 +. el factorial de 5 es 5X4X3X2X1 22 + Hacer un programa en C que genere la serie de FIBONACCI introduciendo los primeros valores 0 y 1. } 19 Ejercicios:20 + Hacer un programa en C que genere la siguiente secuencia 1.13.2. 36.

&numero). numero).h> #include <windows. . El programa se repite mientras el número sea distinto de cero. if ((numero % 2) == 0) printf("El numero %d es par. 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.\n". #include <stdio.h> main() { int numero. } while (numero != 0). Si la instruccion es compuesta se encierra entre { } do { instrucción 1 instrucción 2 . system(“pause”). instrucción N }while (condición). Víctor Hugo Arroyo Hernández . scanf("%d". else printf("El numero %d es impar.\n".Tutorial de C Lo normal es la que instrucción incluya algún elemento que altere el valor de condición. numero). proporcionando así la condición de salida del bucle. } 23 Ing. do { /* se lee el numero */ printf("Introduzca un numero: ").

Víctor Hugo Arroyo Hernández .. Una vez que la condición es falsa.Tutorial de C for El formato general es: for (inicialización.) printf(“este ciclo estará siempre ejecutándose. El incremento define como cambia la variable de control cada vez que se repite la instrucción. se puede realizar un ciclo infinito de la forma: for(. Estas tres secciones principales deben ser separadas por punto y coma (. incremento) instrucción. por ejemplo. numero). Si la instruccion es compuesta se encierra entre { } No es obligatoria ninguna de las tres expresiones. La condición es una expresión condicional que determina cuando finaliza el ciclo. condición.\n”). numero++) printf("%d\n".h> #include <windows. for (numero=0. la ejecución del programa sigue por la instrucción siguiente al for. system(“pause”). numero <100. } 24 Ing. similarmente el valor de inicialización Ejemplo: Programa que imprime los 100 primeros números usando for #include <stdio. La inicialización normalmente es una instrucción de asignación que se utiliza para iniciar la variable de control del ciclo. Si se omite el incremento este tomara un valor por emoción de 1.h> main() { int numero.). si se omite la condición se asumirá el valor permanente de 1 (cierto) y el ciclo se ejecutara de forma indefinida. El ciclo for continua ejecutándose mientras que la condición sea cierta.

h> main() { int N. Ejemplo: Calcular 1 + 2 + : : :N mientras N sea distinto de 0. suma). for (j = 0.Tutorial de C Ciclos anidados + Los ciclos se pueden anidar unos y otros.. &N). + Importante estructurarlos de forma correcta. scanf("%d". int suma. } while (N > 0). } 25 Ing. #include <stdio. printf("1 + 2 + . /* fin del ciclo do */ system(“pause”). + Se pueden anidar diferentes tipos de ciclos. do { /* leer el numero N */ printf("Introduzca N: "). suma = 0. int j. j++) /* ciclo anidado */ suma = suma + j. + N = %d\n". Víctor Hugo Arroyo Hernández . j <= N..h> #include <windows.

. 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 . . . que compara sucesivamente el valor de una expresión con una lista de constantes enteras o de caracteres. l Formal general: switch (expresion) { case constante 1: secuencia de instrucciones 1. Víctor Hugo Arroyo Hernández . } 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. 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. case constante 2: secuencia de instrucciones 2. break. 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). default: secuencia de instrucciones 1. mientras que if puede evaluar expresiones relacionales o lógicas. break. se ejecutan las instrucciones asociadas con la constante.Tutorial de C Otras estructuras condicionales Estructura switch Es una instrucción de selección múltiple. break. Cuando se encuentra una correspondencia. la cual es opcional. case constante 3: secuencia de instrucciones 3. Ing.

letra). Víctor Hugo Arroyo Hernández . printf("Introduzca una letra: "). se convierten automáticamente a sus valores enteros.h> main() { char letra. Ejemplo #include <stdio. break. break. break. } system(“pause”). letra).h> #include <windows. break. case 'u': case 'U': printf("Vocal %c\n". scanf("%c". default: printf("Consonante %c\n". switch(letra) { case 'a': case 'A': printf("Vocal %c\n".Tutorial de C Si se utilizan constantes de tipo carácter en la instruccion switch. case 'o': case 'O': printf("Vocal %c\n". letra). letra). break. case 'i': case 'I': printf("Vocal %c\n". &letra). letra). case 'e': case 'E': printf("Vocal %c\n". } 26 Operador condicional ? Forma general: expresión_1 ? expresión _2 : expresión _3 Si expresión _1 es verdadero => devuelve expresión _2 Ing. letra).

Tutorial de C Si expresión _1 es falso => devuelve expresión _3 Su prioridad es justamente superior a los operadores de asignación. Ing. Es decir k toma el valor 100 Ejercicios:27 Hacer un programa en C que ejecute la instrucción ? anterior para ver que si funciona asignándole distintos valores de a. Se evalúa de derecha a izquierda. Primero se evalúa (a < 0) Como es falso el operador condicional devuelve 100. Víctor Hugo Arroyo Hernández . 28 Elaborara un programa en C que calcule los primeros 100 números primos. Ejemplo: Si a = 1 en la instrucción k = (a < 0) ? 0 : 100. Este valor se asigna a k.

En la medida en que una misma función es utilizada muchas veces. etc. y no teniendo ninguna posibilidad de acceso a la información que no le compete. 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. 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. Una función es capaz de mantener una gran independencia con el resto del programa. procedimientos. una misma función (por ejemplo. el número total de líneas de código del programa disminuye. suelen contener decenas y aún cientos de miles de líneas de código fuente. Víctor Hugo Arroyo Hernández . e incluso puede ser reutilizada por otros programas.. y también lo hace la probabilidad de introducir errores en el programa. de modo que nunca tiene un número de líneas excesivo y siempre se mantiene dentro de un tamaño manejable. una resolución de un sistema de ecuaciones lineales.Tutorial de C Capitulo 4 . incluso a nivel de informática personal. Es muy frecuente que al hacer una modificación para añadir una funcionalidad o corregir un error. A estos módulos se les ha denominado de distintas formas (subprogramas. subrutinas. se introduzcan nuevos errores en partes del programa que antes funcionaban correctamente. 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. funciones.. éstas a su vez llaman a otras funciones más específicas y así sucesivamente.) puede ser llamada muchas veces en un mismo programa. Cada función puede ser desarrollada y comprobada por separado. 3. un producto de matrices. . se convertirían rápidamente en sistemas poco manejables si no fuera por la modularización. Independencia de datos y ocultamiento de información. 2. Ing. Sea cual sea la nomenclatura. Cada función tiene una misión muy concreta.FUNCIONES Y PROGRAMACION ESTRUCTURADA Las aplicaciones informáticas que habitualmente se utilizan.) según los distintos lenguajes. A medida que los programas se van desarrollando y aumentan de tamaño. Ahorro de memoria y tiempo de desarrollo. El lenguaje C hace uso del concepto de función (function). que es el proceso consistente en dividir un programa muy grande en una serie de módulos mucho más pequeños y manejables. Modularización. La división de un programa en unidades más pequeñas o funciones presenta (entre otras) las ventajas siguientes: 1. Además.

se pueden hacer asignaciones a los parámetros de una función o usarlos en cualquier expresión válida. 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). El valor puede ser cualquier tipo válido. Víctor Hugo Arroyo Hernández . Estas variables se llaman parámetros formales de la función y se comportan como variables locales dentro de la función. es decir. Una función es visible para ella misma y otras funciones desde el momento en que se define. Una función puede no tener parámetros. Se pueden usar como cualquier otra variable. Su forma general es: tipo nombre_función (lista de tipos (y nombres) de los argumentos). 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. en cuyo caso la lista de parámetros está vacía. si no se especifica ninguno. la recursividad esta permitida. Una de estas funciones se debe llamar main(). La declaración de parámetros aparece después del nombre de la función al definirla. 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 uso de funciones permite la descomposición y desarrollo modular.Tutorial de C Todo programa C consta de una o mas funciones. creándose al entrar en la función y destruyéndose al salir. los paréntesis son necesarios. sin embargo. Si una función va usar argumentos. Es visible para el propio cuerpo de la función. debe declarar variables que acepten los valores de los argumentos. se asume un resultado entero. Al igual que con variables locales. Permite dividir un programa en componentes más pequeños. Todo programa comienza su ejecución en la función main(). Ing. Declaración Cada función debe ser declarada.

es posible cambiar el valor de la variable usada en la llamada. Dentro de la función se usa la dirección para acceder al argumento usado. En C. significando que los cambios hechos a los parámetros afectan a la variable usada en la llamada.h> int maximo(int a. De esta forma. int max. int b). La llamada por valor copia el valor de un argumento en el parámetro formal de la función. &y). es decir. Llamadas a funciones Las funciones son llamadas para su ejecución desde cualquier parte del código. entonces. scanf("%d %d". Víctor Hugo Arroyo Hernández . entonces el compilador no las destruye y almacena su valor para la próxima llamada. Es posible simular una llamada por referencia pasando un puntero al argumento. Ing. por valor y por referencia. #include <stdio. se pueden pasar argumentos a las funciones de dos formas. todas las funciones están al mismo nivel. y. Llamadas por valor y por referencia En general. al pasar la dirección. no se puede definir una función dentro de otra función.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. printf("Introduzca dos numeros: "). &x. teniendo en cuenta que antes deben haber sido declaradas (y por supuesto definidas). Ejemplo: Programa que calcula el máximo de dos números. 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. 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). 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. es decir. Esto es por lo que C no es técnicamente un lenguaje estructurado por bloques. /* prototipo de función */ main() { int x. 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. La llamada de una función se produce mediante el uso de su nombre en una instruccion. aunque la variable tiene limitado el ámbito al interior de la función).

} int cuadrado_perfecto(int x) { int raiz. max).y).Tutorial de C max = maximo(x. int b) /* definición de la función */ { int max. return(max). &n). if (a > b) max = a.\n".\n". /* llamada a la función */ printf("El maximo es %d\n". Ing. #include <stdio.h> #define TRUE 1 #define FALSE 0 void explicacion(void). explicacion(). printf("es cuadrado perfecto \n"). } int maximo(int a. printf("Introduzca un numero: ”). if (perfecto) printf("%d es cuadrado perfecto. n). perfecto = cuadrado_perfecto(n). } void explicacion(void) { printf("Este programa dice si un numero ").h> #include <math. else max = b. main() { int n. int cuadrado_perfecto(int x). scanf("%d". else printf("%d no es cuadrado perfecto. int perfecto. n). Víctor Hugo Arroyo Hernández . /* devuelve el valor máximo */ } 29 Ejemplo: Programa que dice si un número es un cuadrado perfecto.

} 30 Ejercicios: 31 Explicar donde se aplica la teoría antes descrita en los programas anteriores.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)).Tutorial de C int perfecto. etc. Recursividad Una función se llama a sì misma de forma repetida hasta que se cumpla alguna condición. if (x == raiz * raiz) perfecto = TRUE. es decir donde se declaran la funciones. Ing. Ejemplo: El factorial de un número: f(n) = 1 si n = 0 f(n) = n * f(n . /* no es cuadrado perfecto */ return(perfecto). Víctor Hugo Arroyo Hernández . } Ejercicio: 33 Elaborar un programa en C que invoque a la función anterior y calcule el factorial de un número solicitado por el usuario. 32 + Hacer un programa que calcule el factorial de un número usando funciones. así como a que función pertenecen. que variables y de que tipo son. /* cuadrado perfecto */ else perfecto = FALSE. cuales son sus parámetros. raiz = (int) sqrt(x).

+ El preprocesador sustituye todas las referencias a la macro que aparezcan dentro de un programa antes de realizar la compilación. &x. En la composición de macros se pueden utilizar todos los elementos básicos del lenguaje.y). El resultado debe ser una constante. El preprocesador toma como entrada el programa fuente en C antes que el compilador y ejecuta todas las macros que encuentra.Tutorial de C Macros Una macro es una codificación de instrucciones que implican una o varias acciones. Ing. + Una macro no es una llamada a función. max = ((x > y) ? x : y). &x. como se observa: main() { int x. scanf("%d %d". La instrucción #define se puede utilizar para definir macros. max). Las expresiones que se pueden poner en los comandos del preprocesador cuando ponemos la fórmula o expresión. max = maximo(x.h> #define maximo(a. printf("Introduzca dos numeros: "). &y). } 34 Consideraciones: + No puede haber blancos entre el identicador y el paréntesis izquierdo. int max. #include <stdio. &y).b) ((a > b) ? a : b) /* macro */ main() { int x. y. int max. printf("Introduzca dos numeros: "). Víctor Hugo Arroyo Hernández . instrucción o grupo de instrucción. y. Ejemplo: programa que calcula el máximo de dos números. debe ser una expresión que diese los mismos resultados que si la escribiésemos en una línea de C. /* uso de la macro */ printf("El maximo es %d\n". scanf("%d %d". Una macro es un identificador equivalente a una expresión.

Otro ejemplo de macros seria: Dada la siguiente definición de macro: #define maximo (x. else max = b . \ else \ z = y. else max = b.y. 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. Se repite el código en cada uso de la macro por lo tanto se tiene mayor código objeto. Construcciones básicas de la programación estructurada son las ya mencionadas: Secuencial: ejecución sucesiva de dos o más operaciones. } No se produce llamada a función por lo tanto se tiene mayor velocidad. max). Que es equivalente a: if (a > b) max = a. b. Víctor Hugo Arroyo Hernández . Ejercicio: 35 Escribir un programa en C que use la macro anterior y probar su funcionamiento. Ing. max). Lo sustituirá por: if ( a > b ) max = a . Programación estructurada Tiende a construir programas fácilmente comprensibles.Tutorial de C printf("El maximo es %d\n". Cuando el preprocesador encuentra: maximo(a. .z) if (x > y) \ z = x.

&a. 3.b). Imprimir el valor de h usando la función printf().Observe el uso de la variable error Ing. float b). Pasos a seguir: 1. /* prototipo */ main() { float a. error = scanf("%f %f". } 36Nota. Importante: Todos los bloques y funciones tienen un único punto de entrada. float b) { float h.Tutorial de C Selección: se realiza una u otra operación. Calcular h según la fórmula dada definiendo una función hipotenusa(). &b). Iteración: repetición de una operación mientras se cumpla una condición. Víctor Hugo Arroyo Hernández . dependiendo de una condición. Leer a y b mediante la función scanf() 2. b. #include <stdio.. int error. Todos los bloques y funciones tienen un único punto de salida.h> #include <math. } } float hipotenusa(float a. else { h = hipotenusa(a. 2)).2) + pow(b. h = sqrt(pow(a. h). printf("La hipotenusa es %f\n".h> float hipotenusa(float a. Ejemplo: Programa que calcula la hipotenusa de un triángulo rectàngulo. printf("Introduzca a y b: "). if (error !=2) printf("Error al leer a y b\n"). return(h). float h.

La forma general de declaración es: tipo nombre_variable [tamaño]. etc. float n[12].Arreglos o variables dimensionadas Un arreglo es una colección de variables del mismo tipo que se referencian por un nombre común. char vector_letras[5]. Los arreglos tienen que declararse implícitamente para que el compilador reserve espacio en memoria para ellos. Ejemplos: int v_numeros[20]. 18. se escribe: char p[10]. char. 2. que simplemente es un arreglo de caracteres terminado por uno nulo. Se puede pasar cualquier extremo de un array y escribir en alguna otra variable de datos e incluso en el código del programa.) El tamaño indica cuántos elementos mantendrá el vector. en C los datos individuales de un vector pueden ser de cualquier tipo (int. Sólo se puede asignar valores iniciales a vectores estáticos y globales. La dirección más baja corresponde al primer elemento y la más alta al último. Ing. Por ejemplo: int n[5] = {1. A un elemento específico de un arreglo se accede mediante un índice. En C todos los arreglos tienen el 0 como índice de su primer elemento. C no comprueba los límites de los arreglos. 24. El tipo declara el tipo de los elementos del vector. Arreglos unidimensionales Los 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. En este caso hemos declarado un array que tiene diez elementos. Víctor Hugo Arroyo Hernández . Los arreglos pueden tener una o varias dimensiones. Para declarar un vector de 10 elementos denominado p y de tipo carácter. desde p[0] hasta p[9]. El arreglo más común en C es la cadena. En C todos los arreglos constan de posiciones de memoria contiguas. float.Tutorial de C Capitulo 5 . 3}.

} 37 Paso de vectores a funciones + Un vector se pasa a una función especificando su nombre sin corchetes. vector_b[j]). + El argumento formal correspondiente al vector se escribe con un par de corchetes cuadrados vacíos. /* escribir el vector b */ for (j = 0.Tutorial de C En C no se permiten operaciones que impliquen vectores completos Es decir: No se pueden asignar vectores completos. j++) { printf("Elemento %d: ". Ejemplo Programa que calcula la media de los componentes de un vector. int vector_b[TAM_VECTOR]. j++) vector_b[j] = vector_a[j]. j). El tamaño no se especifica.h> #define TAM_VECTOR 10 main() { int vector_a[TAM_VECTOR]. j < TAM_VECTOR. j < TAM_VECTOR. Ing. &vector_a[j]). + 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. No se pueden comparar vectores completos. } /* copiar el vector */ for (j = 0. /* variable utilizada como indice */ /* leer el vector a */ for (j = 0. El procesamiento debe realizarse elemento a elemento. Víctor Hugo Arroyo Hernández . int media_vector(int vector[]).h> #define MAX_TAM 4 void leer_vector(int vector[]). #include <stdio. int j. j++) printf("El elemento %d es %d \n". Por ejemplo: #include <stdio.j. j < TAM_VECTOR. scanf("%d".

printf("La media es %d\n". 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). j). Víctor Hugo Arroyo Hernández . j++) { printf("Elemento %d: ". Para declarar un arreglo de caracteres es necesario un carácter más que la cadena más larga que pueda contener. scanf("%d". for(j=0. int media. para dejar sitio para el carácter nulo del final de la cadena. int media = 0. Ing. } void leer_vector(int vector[]) { int j. return(media/MAX_TAM). En C una cadena se define como un arreglo o vector de caracteres. } 38 Cadenas de caracteres El uso más común de los arreglos unidimensionales es como cadenas de caracteres. &vector[j]). Consideraciones: 'a' representa un carácter individual. } return. for(j=0. media).Tutorial de C main() { int v_numeros[MAX_TAM]. j<MAX_TAM. leer_vector(v_numeros). media = media_vector(v_numeros). j++) media = media + vector[j]. "Hola" representa una cadena de caracteres. Una constante de cadena es una lista de caracteres encerrada entre dobles comillas. j<MAX_TAM. "a" representa una cadena de caracteres compuesta por un único carácter. } int media_vector(int vector[]) { int j.

cadena[2]). cadena[0]).h Ing.Tutorial de C Todas las cadenas de caracteres en C finalizan con el carácter nulo de C ('\0'). Víctor Hugo Arroyo Hernández . printf("%c \n". "Hola"). + NO se puede asignar valores de la siguiente forma: cadena = "Hola". printf("%c \n". cadena[1]). copia cadena1 en cadena2 incluyendo el carácter nulo. cadena). + La cadena debe tener suficiente espacio reservado. cadena2). printf("Los caracteres son: \n"). el compilador lo hace automáticamente. 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". No es necesario añadir explícitamente el carácter nulo al final de las constantes de cadena. strcpy(cadena1. } 39 cadena[i] representa el i-esimo carácter de la cadena. printf("La cadena es %s \n". + Una forma de asignar un valor a una cadena es la siguiente: strcpy(cadena. printf("%c \n". 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". Este carácter indica el fin de una cadena de caracteres. char cadena[10] = "Hola". cadena[3]). printf("%c \n". cadena[4]). Declaración de cadenas de caracteres char cadena[] = "Hola". printf("%c \n". • strcpy se encuentra en el archivo de cabecera string.

printf("Introduzca una linea: \n").puts("La linea es:").scanf deja de buscar cuando encuentra un blanco. es equivalente a: printf("La linea es: \n"). si se introduce Hola a todos solo se leería Hola. gets(linea).. printf("Introduzca una cadena: "). cadena). La función gets lee una línea completa hasta que encuentre el retorno de carro incluyendo los blancos. + No es necesario el operador de dirección (&) ya que cadena representa de forma automática la dirección de comienzo. scanf("%s". puts(linea). cadena). Víctor Hugo Arroyo Hernández . } Nota. 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. La función puts escribe una cadena de caracteres junto con un salto de línea. puts("La linea es").h> #define TAM_LINEA 80 main() { char linea[TAM_LINEA].h> #define TAM_CADENA 80 main() { char cadena[TAM_CADENA]. printf("La cadena es %s\n".Tutorial de C Lectura y escritura de cadenas de caracteres #include <stdio. } Nota.. #include <stdio.

Tutorial de C #include <stdio. while (linea[j] != '\0') { num_car ++. Víctor Hugo Arroyo Hernández . } } 41 Paso 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. main() { char linea[TAM_LINEA]. int num_car. int j. return. } printf("Esta linea tiene %d caracteres\n". while (gets(linea) != NULL) { num_car = 0. num_car). j = 0. puts(linea). } Ing. j++.h> #define TAM_LINEA 80 void leer_linea(char linea[]). leer_linea(linea). puts("La linea es").h> #define TAM_LINEA 80 main() { char linea[TAM_LINEA]. } void leer_linea(char linea[]) { gets(linea).

} } int longitud(char cadena[]) { int j = 0. char linea_may[TAM_LINEA]. int num_car. while (gets(linea) != NULL) { num_car = longitud(linea). printf("Esta linea tiene %d caracteres\n". while (gets(linea_min) != NULL) { Convertir_may(linea_min. usando funciones: (Comparar con el ejemplo anterior que realiza la misma tarea) #include <stdio. main() { char linea_min[TAM_LINEA]. linea_may).h> #include <ctype. #include <stdio.h> #define TAM_LINEA 80 int longitud(char cadena[]). num_car). } Ejemplo Programa que lee una línea en minúsculas y la convierte a mayúsculas.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. Ing. char may[]). Víctor Hugo Arroyo Hernández . main() { char linea[TAM_LINEA].h> #define TAM_LINEA 80 void Convertir_may(char min[]. while (cadena[j] != '\0') j++. puts(linea_may). return(j).

j++. while (min[j] != '\0') { may[j] = toupper(min[j]). char may[]) { int j = 0.Tutorial de C } } void Convertir_may(char min[]. } Ejercicio: 42 Documentar cada uno de los ejemplos anteriores. return. esto implica ademas hacer su prueba de escritorio. } may[j] = '\0'. Ing. Víctor Hugo Arroyo Hernández .

Tutorial de C Funciones de biblioteca para manejar cadenas <string. Víctor Hugo Arroyo Hernández .h> Significado Convierte una cadena a un entero (int) Convierte una cadena a un entero largo (long) Convierte una cadena a un real (double) Ing.h> Función Significado Strcpy Copia una cadena en otra Strlen Longitud de la cadena Strcat Concatenación de cadenas Strcmp Comparación de dos cadenas Strchr Buscar un carácter dentro de una cadena Strstr Buscar una cadena dentro de otra Función Atoi Atol Atof <stdlib.

ya que el almacenamiento requerido aumenta exponencialmente con el número de dimensiones.’\0’}. La forma general es: tipo nombre [tamaño1]. j++) Ing.’C’. Los arreglos multidimensionales se inicializan del mismo modo que los unidimensionales. El elemento del renglón i columna j es matriz[i][j] Ejemplo Función que calcula el producto de dos matrices cuadradas.6. define una matriz de 20 por 30 columnas.Tutorial de C Arreglos multidimensionales C permite arreglos de más de una dimensión. Estas dos instrucciones producen el mismo resultado: char cad[11] = “Me gusta C”. float c[][DIMENSION]) { int i. i < DIMENSION. 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.5. for(i = 0. ….’e’.’ ‘. Con las cadenas o arreglos de caracteres se hace igual. Por ejemplo: int i[10] = {1.’u’. char cad[11] = {‘M’. [tamaño n]={lista de valores}.’s’.9.’g’.’ ‘.3. Los arreglos de tres o más dimensiones no se utilizan a menudo por la cantidad de memoria que se requiere para almacenarlos. como en cualquier variable. j < DIMENSION.7. Matrices o vectores de 2 dimensiones: int matriz[20][30]. Víctor Hugo Arroyo Hernández . void multiplicar(float a[][DIMENSION]. k. j.10}.’t’. float b[][DIMENSION].2. aunque permite una inicialización abreviada. i++) for(j = 0.’a’.4. [z]. Inicialización de arreglos C permite la inicialización de arreglos en el momento de declararlos..8. La forma general de declaración de un arreglo multidimensional es: Tipo nombre [a] [b] [c] ¦.

for(k = 0. Víctor Hugo Arroyo Hernández .Tutorial de C { c[i][j] = 0. } Ejercicio: 43 Elaborar 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. k < DIMENSION. Ing. k++) c[i][j] += a[i][k] * b[k][j].0. } return.

Variables automáticas. . a.. . /* variable local */ int b = 2. Se refiere al tipo de información que representa la variable (int. las variables pueden ser: . Se refiere a su permanencia y a su ámbito. /* variable local */ int c = 4. /* variable local */ funcion1(). ). Según el tipo. El ámbito de una variable es la porción del programa en la cual se reconoce la variable.Variables de tipo registro. c). /* variable local */ printf("a = %d. Variables locales Sólo se reconocen dentro de la función donde se definen.Tutorial de C Capitulo 6. b = %d \n". Una variable local normalmente no conserva su valor una vez que el control del programa se transfiere fuera de la función..Variables estáticas. #include <stdio. Según el ámbito.Variables externas. . b). Víctor Hugo Arroyo Hernández .-Ambito de las variables y tipos de almacenamiento Existen dos formas de caracterizar una variable: + Por su tipo de datos. Son invisibles al resto. . } void funcion1(void) { int a = 3.Variables globales. c = %d \n". + Por su tipo de almacenamiento.Variables locales. main() { int a = 1. Ing.h> void funcion1(void). las variables pueden ser: . char. printf("a = %d. . a.

return. c). } void funcion1(void) { Ing. } Ejercicio: Analizar y describir como funciona el ejemplo anterior Variables globales Se declaran fuera de las funciones y antes de su uso. printf("Despues a = %d\n". a. b = %d \n". a). b). Pueden ser accedidas desde cualquier función. c = %d \n". /* variable global */ main() { printf("Antes a = %d\n". int a = 1000. Víctor Hugo Arroyo Hernández . } Mantienen los valores que se les asignan en las funciones.h> void funcion1(void). /* variable local */ funcion1(). Es mejor hacer uso de variables locales para evitar efectos secundarios o laterales. /* variable global */ main() { int b = 2. } void funcion1(void) { int c = 4. /* variable local */ printf("a = %d.Tutorial de C return. a. #include <stdio. #include <stdio. funcion1(). printf("a = %d. int a. a).h> void funcion1(void).

j=2.}. consecuencia de un uso anterior de esa zona de la memoria). + Mantener las variables lo más locales que se pueda. En C la declaración debe estar siempre al comienzo del bloque. Víctor Hugo Arroyo Hernández . esto implica que puede haber efectos secundarios o laterales. Cada variable auto es creada al comenzar a ejecutarse el bloque y deja de existir cuando el bloque se termina de ejecutar.. j=3. aunque pueden ser ocultadas por una nueva declaración de una nueva variable con el mismo nombre en un bloque anidado. { int i=1. A continuación se muestra un ejemplo y analisis del uso de variables de modo auto. es decir.Tutorial de C a = 1000. return.. Las variables auto son variables locales. No es necesario poner la palabra auto.. + Cualquier función puede cambiar el valor de una variable global. /* se declaran e inicializan i y j */ . Cada vez que se ejecuta el bloque. y antes de que el programa les asigne un valor pueden contener basura informática (conjuntos aleatorios de unos y ceros... En C++ la declaración puede estar en cualquier lugar y hay autores que aconsejan ponerla justo antes del primer uso de la variable.. } Precaución con el uso de variables globales + El uso de variables globales puede causar errores inesperados. No son inicializadas por default. Variables automáticas (auto) Es la opción por defecto para las variables que se declaran dentro de un bloque {. Recomendaciones: + Evitar el uso de variables globales. incluido el bloque que contiene el código de las funciones. + Cuando se precise hacer accesible el valor de una variable a una función se pasaría como argumento. sólo son visibles en el bloque en el que están definidas y en otros bloques anidados en él. las variables auto se crean y se destruyen de nuevo. /* se declara una nueva variable j */ Ing. { float a=7.

.. Para verlas desde otras funciones definidas anteriormente o desde otros archivos. que se definen fuera de cualquier bloque o función... A continuación se presenta un ejemplo y analisis del uso de variables extern. La variables extern permiten transmitir valores entre distintas funciones. } Variables externas (extern) Son variables globales. Víctor Hugo Arroyo Hernández . j=j+a. reconocida para poder ser utilizada) varias veces. Por defecto. 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. /* la variable i=1 es visible */ } … /* fuera del bloque. /* aqui j es float */ . con objeto de hacerla accesible desde diversas funciones o orchivos. por ejemplo antes de definir la función main(). printf("El valor es %d\n". También estas variables pueden ocultarse mediante la declaración de otra variable con el mismo nombre en el interior de un bloque. son inicializadas a cero.. pero ésta es una práctica considerada como peligrosa. valor).Tutorial de C . Ing. /* equivalente a int valor */ valor = 5.. Estas variables existen durante toda la ejecución del programa. deben ser declaradas en ellos como variables extern. Las variables extern son visibles por todas las funciones que están entre la definición y el fin del archivo... pero puede ser declarada (es decir. /* la variable int j es invisible */ .h> main() { auto int valor. /* la variable j=2 existe y es entera */ Ejemplo: #include <stdio. a ya no existe */ .

En los demás se declara (extern). int). /* se define la variable */ void funcion(void) { valor = 10. Ejercicio: 44Crear dos archivos como se describe a continuación y analizar Modulo principal (main. } Modulo auxiliar (aux. k son visibles */ } .c) #include <stdio. valor).. /* se declaran antes de main() */ main() { int i=3. /* i=1 se hace invisible */ int func1(int. .En uno de ellos se define la variable. k.. } Ing. main() { funcion(). j.Tutorial de C int i=1. /* se declara */ void funcion(void). printf("Valor = %d\n".c) int valor. .Se emplean cuando un programa consta de varios módulos. Víctor Hugo Arroyo Hernández .h> extern int valor. . /* j.

Tutorial de C Variables estáticas Cuando ciertas variables son declaradas como static dentro de un bloque. Ing. Una función puede también ser definida como static. Dicho de otra forma. La inicialización sólo se realiza la primera vez. 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. Víctor Hugo Arroyo Hernández . y entonces sólo es visible para las funciones que están definidas después de dicha función y en el mismo fichero. estas variables conservan su valor entre distintas ejecuciones de ese bloque. No son visibles desde otras funciones ni aunque se declaren como extern. Por default. funcion(). main() { funcion(). funcion(). Por default. y por lo que respecta a su visibilidad. Con estos modos se puede controlar la visibilidad de una función. Ésta es una forma de restringir la visibilidad de las variables. las variables static se declaran dentro de un bloque como las auto. desde qué otras funciones puede ser llamada . es decir. son inicializadas a cero. los valores de dichas variables se conservan entre dichas llamadas. pero permanecen en memoria durante toda la ejecución del programa como las extern.h> void funcion(void). Ejemplo: #include <stdio. las funciones tienen modo extern. Cuando se llama varias veces sucesivas a una función (o se ejecuta varias veces un bloque) que tiene declaradas variables static.

Si no existen registros disponibles se almacenaría en memoria. Ejemplo: #include <stdio. j). for (j = 0. . j++) printf("Contador = %d\n". } Ejercicio: Probar. No existen los modos auto y register para las funciones. } 45 Ing. Víctor Hugo Arroyo Hernández . veces). j < 10. veces = veces + 1.Tutorial de C } void funcion(void) { static int veces = 0. 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.h> main() { register int j. printf("Se ha llamado %d veces a funcion\n". generalmente en registros del CPU y los cálculos con ellas sean más rápidos. analizar y describir como conservan o cambian el valor de las variable.

Podemos pensar en la memoria como una serie de casilleros identificados por su dirección en donde se almacenan los valores a usar. Víctor Hugo Arroyo Hernández . + 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). La forma general es: tipo *nombre. cualquier tipo de puntero puede apuntar a cualquier dirección de la memoria. Donde tipo es cualquier tipo válido y nombre es el nombre de la variable puntero. Normalmente.Tutorial de C Capitulo 7 . Si una variable va a contener un puntero. entonces se dice que la primera variable apunta a la segunda. Una declaración de un puntero consiste en un tipo base. sin embargo. . N Un puntero es una variable que contiene una dirección de memoria. Ing. un * y el nombre de la variable. esa dirección es la posición de otra variable de memoria. . + A cada byte o palabra se accede por su dirección. Si una variable contiene la dirección de otra variable. Un int =>4 bytes. por lo que es importante declarar correctamente el puntero.PUNTEROS Introducción + La memoria de la computadora se encuentra organizada en grupos de bytes que se denominan palabras. El tipo base del puntero define el tipo de variables a las que puede apuntar. toda la aritmética de punteros esta hecha en relación a sus tipos base. Técnicamente. + Dentro de la memoria cada dato ocupa un número determinado de bytes: Por ejemplo. recordemos que: Un char =>1 byte. Dirección Contenido 0 1 2 . entonces tiene que declararse como tal.

Tutorial de C Ejemplos: int *numero. + Un puntero es una variable que almacena la dirección de otro objeto (variable. float *p. Víctor Hugo Arroyo Hernández . Existen dos operadores especiales de punteros: & y *. /* asigna a y el contenido de la dirección almacenada en px */ printf("x = %d\n". px = &x. función. y). El operador de dirección & devuelve la dirección de memoria de su operando. } *px representa el contenido almacenado en la dirección a la que apunta px. . NO su valor. Ejemplo: #include <stdio. x). El operador de indirección * devuelve el contenido de la dirección apuntada por el operando. /* variable de tipo entero */ int *px. Ing. /* asigna a px la dirección de x */ y = *px. *px). printf("y = %d\n". /* variable de tipo entero */ int y.h> main() { int x. . 46 Un puntero representa la dirección de memoria del objeto al que apunta. ). /* variable de tipo puntero a entero */ x = 5. . char *letra. Si x es una variable entonces &x representa la dirección de memoria de x. * es el operador de indirección y opera sobre una variable de tipo puntero. printf("*px = %d\n".

a x se le asigna el valor de 5 y supongamos que este valor se asigna en la dirección 1000 px= &x. *p = 5. El siguiente fragmento de programa es incorrecto: int *p. si en ese instante lo intenta utilizar. probablemente se estrellará. Víctor Hugo Arroyo Hernández . X=5 . ¿A que dirección de memoria apunta p? ¿Dónde se almacena el 5? Ing. se debe asignar el valor nulo a un puntero que no este apuntando a ningún sitio. un puntero puede utilizarse a la derecha de una declaración de asignación para asignar su valor a otro puntero.Tutorial de C Considerando del ejemplo anterior: int x. int y. Asignación de punteros Como en el caso de cualquier otra variable. Aquí px almacena el valor de la disección donde se almaceno el valor de x Y=*px. éste contiene un valor desconocido. p2=p1. Esta instrucción indica que y va a tomar el valor que esta en la dirección de memoria px (&x)100 0 5 (&x)150 0 5 (&px)30 00 1000 Después de declarar un puntero. Un puntero no reserva memoria. Para usar un puntero se debe estar seguro de que apunta a una dirección de memoria correcta. aunque esto tampoco es seguro. no sólo el programa sino también el sistema operativo. pero antes de asignarle un valor. int *px. Tanto p1 como p2 apuntan a x. int *p1. Por convenio. Por ejemplo: int x. p1=&x.*p2.

float n2.0. Dado el siguiente fragmento de código: float n1. Víctor Hugo Arroyo Hernández . float *p1.Tutorial de C Pueden asignarse punteros del mismo tipo entre sí. p1 = &n1. n2 = *p2. n1 = *p1 + *p2. n1 = 4. ¿Cuànto vale n1 y n2? 47 Ing. p2 = p1. float *p2.

int b) { a = 0. y = %d\n". return. Víctor Hugo Arroyo Hernández . + Un argumento pasado por referencia si se puede modificar. + Cuando un argumento se pasa por valor. + Cuando se pasa un argumento por referencia (cuando un puntero se pasa a una función). Paso de parámetros por valor #include <stdio. } void funcion(int a. a. el dato se copia a la función. x. /* prototipo */ main() { int x = 2. Ejemplos: 48 Ejecuta 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. printf("Dentro a = %d. } Ing.h> void funcion(int a. + Un argumento pasado por valor no se puede modificar. int y = 5. printf("Antes x = %d. y). b = 0. x. y). y = %d\n". b). funcion(x. se pasa la dirección del dato por lo tanto el contenido de la dirección se puede modificar en la función.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 como argumentos de funciones permite que el dato sea alterado globalmente dentro de la función. int b). b = %d\n". y). printf("Despues x = %d. + El uso de punteros permite el paso de argumentos por referencia.

printf("Antes x = %d. y = %d\n". *b = 0. int y = 5. #include <stdio. Víctor Hugo Arroyo Hernández .h> void funcion(int *a. int *b). x. printf("Antes x = %d.Tutorial de C Paso de parámetros por referencia. *b = %d\n". } Función que intercambia el valor de dos variables. x. #include <stdio. y). y). printf("Despues x = %d. &y). y). &y). printf("Dentro *a = %d. temp = *b.h> void swap(int *a. y). int y = 5. funcion(&x. return. } void swap(int *a. *b = *a. } void funcion(int *a. } Ing. /* prototipo */ main() { int x = 2. y = %d\n". x. int *b) { int temp. int *b) { *a = 0. *b). *a. swap(&x. return. printf("Despues x = %d. y = %d\n". y = %d\n". int *b). x. *a = temp. /* prototipo */ main() { int x = 2.

pero en realidad es un operador. printf(“un float ocupa %d bytes\n". printf(“un double ocupa %d bytes\n". Por ejemplo: var_1 = sizeof(double) /* var_1 contiene el tamaño de una variable */ Ejemplo: double #include <stdio. este no apunta a ningún objeto o función. El operador sizeof Este es el operador de C con el nombre más largo. sizeof(int)). La finalidad del operador sizeof() es devolver el tamaño. por lo que es necesario disponer de este operador para producir código portable. en bytes. else printf("El contenido de *p es\n". Recuérdese que este tamaño depende del compilador y del tipo de computadora que se está utilizando. printf(“un int ocupa %d bytes\n". sizeof(double)). del tipo de variable introducida entre los paréntesis. Víctor Hugo Arroyo Hernández .Tutorial de C Puntero NULL Cuando se asigna 0 a un puntero. Ing.h> main() { float num. sizeof(char)). Puede parecer una función. printf(“un char ocupa %d bytes\n". Para ver si un puntero no apunta a ningún objeto o función: if (p == NULL) printf("El puntero es nulo\n"). + La constante simbólica NULL definida en stdio. *p). + 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. sizeof(float)).h tiene el valor 0 y representa el puntero nulo.

return. fil.h> float **crear_matriz(int fil. col). printf("Numero de columnas: "). int col). col). matriz = crear_matriz(fil. int fil. leer_matriz(matriz. int fil. } Punteros y vectores multidimensionales Programa que define de forma dinámica una matriz (mediante punteros).Tutorial de C printf("num ocupa %d bytes\n". col. char *fuente) { while (*fuente != '\0') { *destino = *fuente. int fil). ya que. fil. cada elemento del vector almacena un carácter. destino ++. void leer_matriz(float **mat. int col). } 49 Vectores y cadenas de caracteres Una cadena de caracteres es un vector de caracteres. &fil). Víctor Hugo Arroyo Hernández . fuente++ . sizeof(num)). fil). printf("Numero de filas: "). scanf("%d". #include <stdio. destruir_matriz(matriz. } *destino = '\0'. main() { float **matriz.h> #include <stdlib. } Ing. &col). int fil. Ejemplo: Función que copia una cadena en otra: void copiar(char *destino. void destruir_matriz(float **mat. col). int col). imprimir_matriz(matriz. void imprimir_matriz(float **mat. scanf("%d".

Víctor Hugo Arroyo Hernández . j < fil. for (i = 0. j. *(*(mat + i) + j) = dato. int col) { int j. for (j = 0. } void imprimir_matriz(float **mat. j < col. } return. j++) free(mat[j]). int fil. j < fil.j. int col) { int i. float **mat. free(mat). scanf("%f". float dato. i. j++) mat[j] = (float *) malloc(col * sizeof(float)). j < col. return. for (j = 0.mat[i][j]). i < fil. i++) for (j = 0. j++) { printf("Elemento %d %d: ". mat = (float **) malloc(fil * sizeof(float *)). for (i = 0. j.j). int col) { int i. return(mat). i. i++) for (j = 0. return. } 50 LIBRERÍAS DEL LENGUAJE C Ing. int fil) { int j. } void leer_matriz(float **mat. } void destruir_matriz(float **mat. j++) printf("Elemento %d %d = %f\n".Tutorial de C float **crear_matriz(int fil. &dato). int fil. i < fil.

dividir por la constante CLOCKS_PER_SEC time.d2) double Devuelve el resto de d1/d2 (con el mismo signo math.s2) FILE * Abre un archivo llamado s1.h exp(d) double Elevar e a la potencia d (e=2. fmod(d1.h exit(u) void stdlib.h Ing.h math. Víctor Hugo Arroyo Hernández ..h fgetc(f) int Leer un carácter del archivo f. terminando el programa..h del tipo s2.. con i caracteres. fprintf(f.h stdlib. del archivo f stdlib.h acos(d) double Devuelve el arco coseno de d math..h cos(d) double Devuelve el coseno de d math.h feof(f) int Determina si se ha encontrado un fin de archivo. stdlib.h fabs(d) double Devuelve el valor absoluto de d math. Función Tipo Descripción Libreria abs(i) int Devuelve el valor absoluto de i stdlib. para una operación stdlib.h clock() long Devuelve la hora del reloj de la computadora.h fclose(f) int Cierra el archivo f.f) char * Leer una cadena s. stdlib. stdlib. Escribe datos en el archivo f.77182..h asin(d) double Devuelve el arco seno de d math.h de d1) fopen(s1.i.h floor(d) double Devuelve un valor redondeado por defecto al entero más cercano a d. fgets(s.h atan(d) double Devuelve el arco targente de d math.) math.) int Cerrar todos los archivos y buffers. Devuelve el puntero al archivo abierto.h atoi(s) long Convierte la cadena s en un número entero stdlib.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.h atof(s) double Convierte la cadena s en un número de doble precisión stdlib. Para pasar a segundos.

h getc(f) int Ler un carácter del archivo f. string..h sqrt(d) double Devuelve la raíz cuadrada de d.Tutorial de C fputc(c. stdlib. stdlib. stdlib. stdlib. Víctor Hugo Arroyo Hernández .h Nota: La columna tipo se refiere al tipo de la cantidad devuelta por la función.f) int Escribe un carácter en el archivo f.h time(p) long int Devuelve el número de segundos transcurridos desde de un tiempo base designado (1 de enero de 1970).h log(d) double Devuelve el logaritmo natural de d. malloc. malloc(n) void * Reserva n bytes de memoria. Devuelve un puntero al principio del espacio reservado.h strcpy(s1.) int Lee datos del archivo f. stdlib. stdlib. windows. Un asterisco denota puntero. math.h rand(void) int Devuelve un valor aleatorio positivo..h o stdlib.h o ctype. time.s2) char * Copia la cadena s2 en la cadena s1 string.) int Escribe datos en el dispositivo de salida estándar.h toupper(c) int Convierte una letra a mayúscula.h strcmp(s1. pow(d1.h tan(d) double Devuelve la tangente de d.h getchar() int Lee un carácter desde el dispositivo de entrada estándar..h free(p) void Libera un bloque de memoria al que apunta p.. string.h system() int Pasa la orden s al sistema operativo. math. string.h strcomp(s1.s2) int Malloc. sin considerar mayúsculas o minúsculas.s2) int Compara dos cadenas lexicográficamente.d2) double Devuelve d1 elevado a la potencia d2.h sin(d) double Devuelve el seno de d.h Compara dos cadenas lexicográficamente.h strlen(s) int Devuelve el número de caracteres en la cadena s. y los argumentos que aparecen en la tabla tienen el significado siguiente: Ing..h fscanf(f. stdlib. math. printf(.

i denota un argumento entero. d denota un argumento de doble precisión. Ing. p denota un argument puntero. l denota un argumento entero largo. f denota un argumento archivo. u denota un argumento entero sin signo. Víctor Hugo Arroyo Hernández .Tutorial de C c denota un argumento de tipo carácter. s denota un argumento cadena.