Sie sind auf Seite 1von 77

APUNTES DE PROGRAMACIN II.

Prof. Javier Martn Ibarguren.


Educacin Media Tecnolgica
Talleres Don Bosco.
ndice general

1. Introduccin 2
1.1. Que es una computadora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Lenguajes de Programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2. Fundamentos del entorno C 4


2.1. Sistema en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Biblioteca Estandar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4. Pseudocdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3. Lenguaje C 10
3.1. Identificadores,Constantes y Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.1. Conceptos de memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.2. Declaracin de constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.3. Tipos de datos elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.1.4. Valores Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.1.5. Declaraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2. Asignacin y aritmtica en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.1. Asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.2. Operaciones aritmticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.3. Operadores de igualdad y relacionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.4. Operadores booleanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.5. Operadores de asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.6. Operadores incrementales y decrementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.7. Precedencia y Asociatividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

4. Lenguaje C 18
4.1. Instrucciones de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1.1. Secuencia,seleccin,iteracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1.2. Estructura se seleccin if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.1.3. Estructura se repeticin while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1.4. Ejemplos utilizando la estructura de repeticin while . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.5. Ms ejemplos de uso del while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

5. Lenguaje C 28
5.1. Mas sobre instrucciones de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
NDICE GENERAL 1

5.1.1. Lo escencial en la repeticin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28


5.1.2. Repeticin controlada por contador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.1.3. La estructura de repeticin for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.1.4. Estructura se repeticin while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.1.5. Ejemplos utilizando la estructura de repeticin while . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.1.6. Ms ejemplos de uso del while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

6. Lenguaje C 39
6.1. Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.1.1. Declaracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.1.2. Inicializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.1.3. Operaciones frecuentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.1.4. Arreglos constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.1.5. Arreglos de caracteres o strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.1.6. Lectura e impresion de cadenas de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.1.7. Arreglos con mltiples subindices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

7. Lenguaje C 47
7.1. Introduccin a las funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
7.1.1. Funciones en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
7.1.2. Definicin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7.1.3. Definicin de funciones o prototipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.1.4. Devolucin de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.1.5. Librerias (archivos de cabecera) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7.1.6. Llamado o acceso a la funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.1.7. Llamadas por valor y por referencia a la funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.1.8. Ejemplo:Un juego de azar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

8. Lenguaje C 63
8.1. Funciones Recursivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.1.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.1.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
8.1.3. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.1.4. Recursin en comparacin con iteracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

9. Lenguaje C 67
9.1. Estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.1.1. Definicin de estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.1.2. Declaracin de variables de estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
9.1.3. Como inicializar estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
9.1.4. Como tener acceso a los miembros de las estrcuturas . . . . . . . . . . . . . . . . . . . . . . . . . 69
9.1.5. Utilizando estructuras como parmetros de las funciones . . . . . . . . . . . . . . . . . . . . . . . 70
9.1.6. Uso de la palabra reservada typdef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
9.1.7. Ejemplo:Simulacin de barajar y distribuir cartas . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
1 Introduccin

1.1 Que es una computadora

Una computadora es un dispositivo capaz de ejecutar clculos y tomar decisiones lgicas a velocidades millones de
veces mas rpido de lo que pueden hacerlo los seres humanos. Las computadoras procesan un conjunto de instruc-
ciones que se conocen como programas de computacin. Las personas que escriben este conjunto de instrucciones
se conocen como programadores. Los dispositivos (teclado, pantalla, discos, memoria, unidades procesadores) se
conocen como hardware. Los programas de computacin se conocen como el software.

1.2 Lenguajes de Programacin

Los programadores escriben instrucciones en diferentes lenguajes de programacin, algunos comprensibles en forma
directa por la computadora y otros que requieren pasos intermedios de traduccin. Existen hoy en da cientos de
lenguajes de computadora. Estos pueden ser categorizados en tres tipos generales:

1 Lenguajes de mquina

2 Lenguajes ensambladores

3 Lenguajes de alto nivel

Cualquier computadora solo puede entender directamente su propio lenguaje de mquina. Este est relacionado
directamente con el diseo del hardware de la computadora. Estos lenguajes son dependientes de la mquina. En
general consisten de cadenas de nmeros que instruyen a las computadoras para que ejecuten sus operaciones ms
elementales una a la vez.

Ejemplo 1.1

1300042774
1400593419
1200274027
3

Conforme las computadoras se hicieron ms populares se hizo aparente que la programacin en lenguaje de mquina
era lenta y tediosa para los programadores. Se empezaron entonces a utilizar abreviaturas similares al ingles para
representar las operaciones elementales de la computadora. Estas abreviaturas formaron la base de los lenguajes
ensambladores. Se desarrollaron programas de traduccin para convertir los programas del lenguaje ensamblador a
lenguaje de mquina.

Ejemplo 1.2

ADD VALOR
LOAD BASE
FETCH RESULTADO

La utilizacin de las computadoras aument con rapidez con la llegada de los lenguajes ensambladores pero an con
estos se necesitaban muchas instrucciones para llevar a cabo inclusive tareas sencillas. Para acelerar el proceso de
programacin se desarrollaron lenguajes de alto nivel en los cuales se pueden escribir sentencias simples que llevan
a cabo tareas sustanciales.
2 Fundamentos del entorno C

2.1 Sistema en C

Todos los sistemas C consisten en general de tres partes: el entorno, el lengua- je y la biblioteca estndar. Veamos el
entorno tpico de desarrollo de C:

1 Editor:Se crea el programa y se almacena en el disco.

2 Preprocesador:Procesa el cdigo. Se ejecuta antes de la traduccin. Se encarga de la inclusin de otros archivos


en el archivo a compilar y en el reemplazo de smbolos especiales con texto de programa. Es invocado por el
compilador antes de la traduccin del programa a lenguaje de mquina.

3 Compilador:Crea el cdigo objeto y lo almacena en disco.

4 Enlazador:Vincula el cdigo objeto con las bibliotecas, crea el archivo con nombreArchivo.out y lo almacena en
disco.

5 Cargador: El cargador coloca el programa en memoria. Antes de que un programa pueda ser ejecutado debe
ser colocado en memoria.

6 CPU:Toma cada una de las instrucciones y las ejecuta almacenando posiblemente nuevos valores de datos
conforme se ejecuta el programa.

2.2 Biblioteca Estandar

Los programas C consisten de mdulos que se denominan funciones. En general, adems de las funciones que uno
programa se utilizan funciones ya existentes que se encuentran en la biblioteca estandar de C. Utilizar funciones ya
existentes se conoce como reutilizacin de software. En general se usan:

Funciones de la biblioteca estandar <stdlib.h>

Funciones que crea uno mismo

Funciones creadas por otros programadores


5

2.3 Algoritmo

Antes de escribir un programa para resolver un problema es necesario tener comprensin completa del problema y un
mtodo planeado de forma cuidadosa para su resolucin. La solucin a cualquier problema de cmputo involucra
la ejecucin de una serie de acciones en un orden especifico. Un algoritmo es un procedimiento que resuelve un
problema en trminos de:

1. Las acciones a ejecutarse

2. El orden en el cual estas deben ejecutarse

Veamos un ejemplo, el algoritmo de "levantarse"que debe seguir un alumno para salir de su casa y llegar a talleres:

Salir de la cama

Quitarse la ropa de dormir

Darse una ducha

Vestirse

Desayunar

Utilizar algn vehiculo para llegar al centro educativo

2.4 Pseudocdigo

El pseudocdigo es un lenguaje artificial e informal que auxilia a los pro- gramadores a desarrollar los algoritmos.
Este es similar al lenguaje natural, es amigable aunque no se trate de un lenguaje verdadero de programacin de
computadoras. Es un lenguaje intermedio entre el lenguaje natural y los lenguajes de programacin. Los programas
en pseudocdigo no son ejecutables, se utilizan porque ayudan al programador a pensar un programa antes de
intentar escribirlo en un lenguaje de programacin como C. Si cambiaramos el orden y colocaramos Vestirse y Darse
una ducha intercambiados el alumno llegara al talleres mojado.
Algunas instrucciones que utilizamos en el pseudocdigo son:

Definir una constante con valor x

Definir una variable con valor x

Realizar operaciones aritmticas (escribimos la operacin)

Leer datos

Imprimir datos

Si se cumple la condicin entonces realizo sentencia

Si se cumple la condicin entonces realizo sentencia 1 en otro caso realizo sentencia 2

Mientras se cumpla la condicin ejecutar sentencias


6 Fundamentos del entorno C

Ejemplos:

1 Una clase donde no se sabe la cantidad alumnos hizo un examen.Las calificaciones (enteros en el rango de 0 a
100) correspondientes a este examen estn a su disposicin. Determine el promedio de la clase en este examen.

Algoritmo 2.1: Promedio de 10 calificaciones


Entrada: n datos enteros en el rango 0..100
Salida: Promedio de las n notas.
1: Incializar total en 0;
2: Incializar cant_alumnos en 0;
3: repetir
4: Leer centinela;
5: si centinela = y entonces
6: Leer calificacion;
7: Sumar calificacion a total;
8: Sumar 1 a cant_alumnos;
9: fin si
10: hasta que centinela 6= n
11: si cant_alumnos 6= 0 entonces
12: Calcular promedio=total/cant_alumnos;
13: imprimir promedio;
14: si no
15: imprimir "No se ingresaron calificaciones"
16: fin si
17: devolver cierto
7

2 Un instituto de educacin desea saber que tan bien salieron sus alumnos en algn examen.Se ingresar un 1 si
el alumno pas el examen y un 0 si lo reprob. Se quiere saber total de aprobados y total de reprobados en un
total de 10 alumnos.

Algoritmo 2.2: Imprimir aprobados y reprobados


Entrada: 10 datos enteros en el rango 0..1
Salida: Total de aprobados y total de reprobados
1: Incializar total en 0;
2: Incializar total_aprobados en 0;
3: Incializar total_reprobados en 0;
4: mientras total 6= 10 hacer
5: Leer valor;
6: si valor = 1 entonces
7: Sumar 1 a total_aprobados;
8: si no
9: Sumar 1 a total_reprobados;
10: fin si
11: Sumar 1 a total;
12: fin mientras
13: imprimir "Mostrar el total de aprobados"
14: imprimir "Mostrar el total de reprobados"
15: devolver cierto
8 Fundamentos del entorno C

Ahora veremos el cdigo en C de los pseudcodigos anteriores:


Ejemplo 1
#include <stdio.h>
int main(){
int total,total_aprobados,total_reprobados;
total=0;
total_aprobados=0;
total_reprobados=0;
while (total!=10){
scanf(" %c",&nota);
if (centinela==y){
scanf(" %i",&nota);
total=total+nota;
cant_alumnos=cant_alumnos+1;
}
}while (centinela==n);
if (cant_alumnos!=0){
promedio=total/cant_alumnos;
printf ("El promedio es: %f",promedio);
}else{
printf ("No hay notas suficientes para calcular el promedio");
}
return 0;
}
Ejemplo 2
#include <stdio.h>
int main(){
int valor,total,aprobados,reprobados;
total=0;
aprobados=0;
reprobados=0;
while(total!=10){
scanf(" %i",&valor);
if (valor!=1){
aprobados++;
}else{
reprobados++;
}
total++;
}
printf ("Aprobados: %i",aprobados);
printf ("Reprobados: %i",reprobados);
return 0;
}
9

2.5 Ejercicios

2.1 Piense un algoritmo que permita ingresar un nmero y averige si es mltiplo de 3, si es mltiplo de 5 si es mltiplo de 3
y 5 a la vez. Escriba el algoritmo como pseudocdigo.

2.2 Esriba con pseudocdigo un algortimo que encuentre las races reales de la ecuacin de segundo grado: ax2 + bx + c = 0 con
a 6= 0 , donde a,b y c son leidos de la entrada standar.

2.3 Escriba el pseudocdigo para un algoritmo que procese la entrada de un men con el siguiente comportamiento: opcin a:
Imprima en patanlla eligio opcin a opcin b: Imprima en patanlla eligio opcin b opcin c: Imprima en patanlla eligio opcin c
opcin d: terminar

2.4 Escriba el pseudocdigo para un algoritmo que procese la entrada de un men con el siguiente comportamiento:

opcin a: Imprima en patanlla eligio opcin a


opcin b: Imprima en patanlla eligio opcin b
opcin c: Imprima en patanlla eligio opcin c
opcin d: terminar

2.5 Escriba el pseudocdigo para un algoritmo que lea de la entrada un nmero natural y despliegue en la salida todos los
divisores naturales de dicho nmero.

Ejemplo de entrada:
Ingrese un entero: 116
Ejemplo de salida:
Sus divisores son: 1 2 4 29 58

2.6 Escriba el pseudocdigo para un algoritmo que lea desde teclado un valor entero n. A continuacin, el programa deber leer
n enteros y luego desplegar el mayor y el menor de ellos.

Ejemplo de entrada:
Ingrese n: 8
Ingrese 8 enteros: 5 12 36 4 21 95 12 18
Ejemplo de salida:
El mayor entero ingresado es: 95
El menor entero ingresado es: 4

2.7 Dada una secuencia de nmeros enteros positivos que debe ser leda de la entrada estndar (el fin de la secuencia est
determinado por el entero -1), escribir el pseudocdigo de un algoritmo que determine y exhiba la suma y el promedio de todos los
enteros positivos ledos.

2.8 Escriba el pseudocdigo para un algoritmo que lea 10 nmeros de la entrada y, para cada uno, diga si es primo.
3 Lenguaje C

3.1 Identificadores,Constantes y Variables

3.1.1. Conceptos de memoria


Los nombres de variable como x, y, suma corresponden a posiciones en la memoria de la computadora. Cada variable
tiene un nombre, un tipo y un valor. Existen restricciones en nombres de variables y constantes. Deben estar formados
por letras o digitos o guin bajo (_) y el primer carcter debe ser una letra. Letras pueden ser minsculas o maysculas
y estas se consideran diferentes. Hay palabras reservadas como por ejemplo: if, else, int, float,etc.

3.1.2. Declaracin de constantes


Podemos declarar constantes con #define que asocia un valor a un identificador, o con la instruccin (de C++) const.
#include <stdio.h>
#define PI 3.14151926 //Notar que no va ;
int main(){
const float PI 1.1415926; //Esto es al estilo C++
return 0;
}
Tener en cuenta que las constantes no se puede modificar, cualquier intento de modificacin da error. Cuando se
ejecuta la sentencia:
scanf(" %i", &x);
el valor escrito por el usuario se coloca en la posicin de memoria a la cual se le ha asignado el nombre x. Si por
ejemplo el usuario ingresa el valor 15 este se colocar en la posicin de x. Siempre que se coloca un valor en una
posicin de memoria, este valor se sustituye cualquier valor anterior que tuviera la variable
11

3.1.3. Tipos de datos elementales


Tenemos los siguientes tipos de datos en C con sus largos respectivos:

Tipo de dato Bytes


char 1
bool 1
int 2
short 2
long 4
unsigned 4
float 4
double 8

Atendiendo los valores de la tabla se observa que: char almacena caracteres.


bool es el tipo de los valores de verdad que son true y false. Podemos colocar en vez de true 1 y en vez de false 0.
int pueden ser calificadas como short, long o unsigned.
short y long se refieren a distintos tamaos, unsigned son siempre positivos.
Veamos algunos ejemplos:

char car;
bool esta;
int entero;
short int edad;
long int precio;
unsigned int edad;
float precio;
double numeroE;

El tamao de los tipos depende del sistema operativo.

3.1.4. Valores Constantes


Para enteros se utiliza el nmero correspondiente, por ejemplo: 123, 5, -8. Una constante entera que es muy grande
para entrar en un int se toma como long. Para reales, se puede utilizar la notacin cientfica : 123.45e-7 o 0.12E3. Las
constantes punto flotante se almacenan como double. Una constante de carcter se coloca entre comillas simples: a,
B, n. El valor de una constante de carcter es el valor numrico del carcter en la mquina. Por ejemplo en la
codificacin ASCII el 0, 0 es 48. Por ejemplo, supongamos tengo el siguiente programa:

int main (){


char c=a;
printf("El valor de c es: %c\n", c);
printf("El valor numerico de c es: %i\n", c);
return 0;
}

Se imprimira:
El valor de c es: a
El valor de c es: 97
Las constantes de carcter, representan tambin caracteres como ser, salto de linea, tabulares,etc.
12 Lenguaje C

3.1.5. Declaraciones
Todas las variables deben ser declaradas antes de su uso. Una declaracin especifica un tipo y es seguida por uno o
ms nombres de variables. Podemos inicializar las variables en su declaracin, como por ejemplo en:
int x=5;
int y=7;
long f1=0,f2=3.5;
float f3=1,35e-3;

3.2 Asignacin y aritmtica en C

3.2.1. Asignacin
Una asignacin en C es una instruccin de la forma var=e donde var es una variable y e es una expresin del mismo
tipo que var. Ejemplos:

Supongamos declaramos int x,y; podemos realizar la asignacin: x=2+y.

Supongamos declaramos bool b1,b2; podemos realizar la asignacin b1=!b2 donde ! representa el not.

Supongamos declaramos float f1=9.3,g1=3; podemos realizar la asignacin f1=g1/f1;

La asignacin es una expresin y varias asignaciones se asocian de derecha a izquierda.


Puedo escribir:x=y=z+2 esto lo que hace es: calcula z+2, lo asigna a y y luego asigna y a x.
No podemos escribir por ejemplo x=y+1=z;

3.2.2. Operaciones aritmticas


La mayor parte de los programas C ejecutan clculos aritmticos.Los operadores aritmticos de C son:

Operacin Operador Ejemplo


+ Suma f+7
- Resta p-c
* Multiplicacin b*m
/ Divisin x/y
% Modulo o Resto r% 3

Utilizamos smbolos especiales, no necesariamente iguales a los que utilizamos en matemtica.


El asterisco (*) indica multiplicacin y el signo de porcentaje ( %) denota mdulo (resto de la divisin).
Los operadores aritmticos son operadores binarios (se aplican a dos argumentos), excepto el menos (-) unario que
calcula el opuesto.
Estos operadores estn superpuestos es decir tienen significado cuando se aplican a distintos tipos de datos como ser
enteros y reales excepto mdulo que tiene significado solo cuando se aplica a enteros.
En particular la divisin cuando se aplica a enteros trunca es decir redondea a un entero (la divisin de enteros da
como resultado un entero).
13

Ejemplos:

7/4 = 1
7,0/4 = 1,75
7,0/4,0 = 1,75
7 %4 = 3
17 %5 = 2

Un error comn en programacin es la divisin por 0.


Los parntesis se utilizan del mismo modo que en matemticas.
Por ejemplo,para multiplicar a por (b+c) escribimos a * (b + c).
C calculara las expresiones aritmticas en una secuencia determinada por las reglas de precedencia de operadores
que siguen y que en general son las mismas que en matemticas, a saber:

1 Primero se calculan las expresiones contenidas en parntesis. En el caso de parntesis anidados se evalua pri-
mero la expresin en el par de parntesis ms interno.

2 A continuacin se evalan las operaciones de multiplicacin,divisin y mdulo. Si hay varias se evalua primero
de izquierda a derecha. Se dice que estas operaciones tienen el mismo nivel de precedencia.

3 Por ltimo se calculan las operaciones de suma y resta. Igual que en el caso anterior si hay varias de estas
operaciones se asocia de izquierda a derecha y se dice que tienen el mismo nivel de precedencia.

Ejemplo:

x= a*(b+c)/d+e*5

1. Evaluamos (b+c)

2. Al resultado de la suma anterior se lo multiplica por a,es decir a*(b+c)

3. Al resultado de la operacin anterior se lo divide entre d,es decir (a*(b+c))/d

4. Como el signo de + separa terminos,se calcula e*5 y luego se realiza la suma,es decir ((a*(b+c))/d)+(e*5)

Entonces podemos simplificar siempre que tengamos dudas y agregar parentesis.


La expresin anterior la podemos escribir como:x=((a*(b+c))/d)+(e*5)
Por ejemplo,si tenemos la siguiente operacin: z=p*r %q+w/x-y
Agregando parntesis, obtenemos: z=(((p*r) %q)+(w/x))-y

3.2.3. Operadores de igualdad y relacionales


Las expresiones booleanas (expresiones que tienen como valor true o false) se forman utilizando los operadores de
igualdad y los operadores relacionales.
Los operadores relacionales tienen el mismo nivel de precedencia y se asocian de izquierda a derecha.
Los operadores de igualdad tienen un nivel de precedencia menor que los relacionales y tambin se asocian de
izquierda a derecha.
Los operadores son los siguientes:
14 Lenguaje C

Operador Significado Ejemplo Resultado Verdadero si


== igualdad x==y x es igual a y
!= distinto x!=y x es distinto de y
> mayor x>y x es mayor estricto que y
> menor x<y x es menor estricto que y
>= mayor igual x>=y x es mayor igual que y
<= menor igual x<=y x es menor igual que y

3.2.4. Operadores booleanos


Los operadores booleanos o conectivos lgicos son:

Operador Significado Ejemplo Resultado Verdadero si


&& AND x && y x e y son verdaderos
|| OR x || y x es verdadero y es verdadero
! NOT !x x es falso

3.2.5. Operadores de asignacin


C dispone de operadores de asignacin que abrevian las expresiones de asignacin.
Por ejemplo:
c=c+3;
se puede escribir en la forma
c+=3;
En general: variable = variable operador expresion donde operador {+, , , /, %}
Se puede escribir as:variable operador = expresion Ejemplos:

Operador Ejemplo Equivale a


+= c+=7 c=c+7
-= d-=4 d=d-4
*= e*=6 e=e*6
/= f/=4 f=f/4
%= g %=10 g=g %10

3.2.6. Operadores incrementales y decrementales


C dispone de operadores incremental unario (++) y decremental unario ().
Podemos utilizar c++ en vez de c=c+1 o c+=1.
Si los operadores son colocados antes de la variable (++c,c) se conocen como operadores de pre-incremento y pre-
decremento, si se colocan despes (c++,c ) se conocen como operadores de post-incremento y post-decremento.
El preincrementar o decrementar una variable hace que la variable primero se incremente o decremente en 1 y a
continuacin el nuevo valor de la variable se utilizar en la expresin en la cual aparece.
Ejemplo:

int c;
c=5;
printf(" %i\n",++c);
printf(" %i\n",c);
printf(" %i\n",-c);
15

El primer printf incrementa c, luego se imprime 6.


El segundo printf imprime 6 y el tercero 5.
El postincrementar o decrementar una variable hace que el valor de la variable primero se utilize en la expresin en
la cual aparece y luego se incremente o decremente en 1.
Ejemplo:
int c;
c=5;
printf(" %i\n",c++);
printf(" %i\n",c);
printf(" %i\n",-c);
printf(" %i\n",c);
El primer printf imprime 5 y luego lo incrementa.
El segundo printf imprime 6 y el tercero 6 y luego decrementa.
El cuarto printf imprime 5.

3.2.7. Precedencia y Asociatividad


La precedencia y asociatividad de los operadores es:

Operador Asociatividad Tipo


() izquierda a derecha parntesis
++,,-,! derecha a izquierda unario
*,/, %& izquierda a derecha multiplicativo
+,- izquierda a derecha aditivo
!=,>,<,>=,<= izquierda a derecha relacional
==,!= izquierda a dercha igualdad
&&,|| izquierda a derecha AND y OR lgicos
=,+=,-=,*=,/=, %= derecha a izquierda Asignacin

Ejemplos:

x==y+1>=z-3 colocando parntesis quedara (x==((y+1)>=(z+3)))

x=y+1!=z+3 colocando parntesis quedara x=((y+1)!=(z+3))


16 Lenguaje C

3.3 Ejercicios

3.1 Dados los siguientes elementos, indique cules son identificadores vlidos de C.

int1
int_1
1int
1_int
Int_1
int
Int
INT
int 1

3.2 Encuentre los errores que tiene el programa dado.

*/ programa con errores */


main( )
{
Int num1; num2;

num1 = 7;
num2 = Num1

return 0;
}

3.3 D los resultados de evaluar las siguientes expresiones.

7/4*3+2+9%4
7/4*(3+2+9)%4
(7/4)*((3+2)+9%4)
7/4*3+(2+9)%4

3.4 Escriba enunciados en el lenguaje C para lograr cada uno de los siguientes objetivos:

1. Declare las variables estaVariable, q234 y numero de tipo entero.

2. Pida al usuario que ingrese un entero, terminando su mensaje con dos puntos, seguido por un espacio,dejando el cursor
colocado despus del espacio.

3. Lea un entero del teclado y almacene el valor escrito en una variable entera a.

4. Lea tres enteros del teclado y almacnelos en las variables x, y, z de tipo int.

5. Imprima el mensaje: .Este es un programa escrito en Con cada palabra separada por tabuladores.
17

3.5 Identifique y corrija los errores de cada uno de los enunciados siguientes, suponiendo que todas las variables son enteras:

1. printf(.ad");

3.6 Diga qu se imprime en la pantalla al ejecutarse el siguiente programa en C:


int main(){
int num;
printf("El valor de num es: %d\n",num);
return 0;
}

3.7 Para la siguiente declaracin de variables, diga si las asignaciones son permitidas y si son convenientes (suponga que las
asignaciones aparecen en medio de un programa, de modo que las variables ya tienen algn valor).
int i1,i2;
float f1,f2;

1. i1 = i1;

2. i1 = i2;

3. i1 = f1;

4. f1 = i2;

5. f2 = i1 + f1;

6. f2 = i2 / i1;

7. f2 = (float)i2 / f1;

3.8 Para cada enunciado siguiente, escriba el enunciado equivalente sin usar operador de asignacin.

1. x -= y;

2. x -= x;

3. x += 1;

4. x *= y+(x/2);

5. x /= x*2-y;
4 Lenguaje C

4.1 Instrucciones de control

4.1.1. Secuencia,seleccin,iteracin
Por lo regular en un programa los enunciados son ejecutados uno despus del otro, en el orden en que aparecen
escritos. Esto se conoce como secuencia.
C proporciona tres tipos de estructuras de seleccin:

1. if la estructura if que elige una accin si una condicin es verdadera o pasa por alto la accin si la condicin es
falsa.Se llama estructura de una sola seleccin

2. if/else la estructura que ejecuta una accin si la condicin es verdadera y otra accin diferente si la condicin
es falsa.Se llama estructura de doble seleccin

3. switch que veremos ms adelante.Se llama estructura de seleccin mltiple.

C proporciona tres tipos de estructuras de repeticin:

1. while que significa mientras.

2. do/while que significa hacer hasta que.

3. for que significa para


19

4.1.2. Estructura se seleccin if


Consideremos el siguiente pseudocdigo:
Si la nota del estudiante es mayor o igual a 7 mostrar en pantalla Aprobado
Se codifica en C de la siguiente manera:

if (nota >= 7){


printf ("Aprobado");
}
En general una secuencia if consta de:

Una palabra clave if

Una condicin booleana entre parntesis.

Una ( varias) instruccin que se ejecutar si la condicin es verdadera.

Consideremos el siguiente pseudocdigo:


Si la nota del estudiante es mayor o igual a 7 mostrar en pantalla .Aprobado"
En otro caso mostrar "No aprobado" Se cdifica en C de la siguiente manera:
if (nota >= 7){
printf ("Aprobado");
}else{
printf ("No aprobado");
}
En general una secuencia if consta de:

Una palabra clave if

Una condicin booleana entre parntesis.

Una ( varias) instruccin que se ejecutar si la condicin es verdadera.

Una palabra clave else

Una ( varias) instruccin que se ejecutar si la condicin es verdadera.


20 Lenguaje C

Podemos anidar estructuras if e if/else. Esto ocurre cuando una de las sentencias a ejecutar en un if es otro if. Por
ejemplo:

if (nota >= 11){


printf ("Excelente");
}else if (nota >=9){
printf ("Muy bueno");
}else if (nota >=7){
printf ("Bueno");
}else{
printf ("Reprobado");
}
Otro ejemplo:

if (nota >= 7){


if (nota == 12){
printf ("Excelente");
}
if (nota >=9){
printf ("Muy Bueno");
}
if (nota >=9){
printf ("Muy Bueno");
}
if (nota>=7){
printf ("Bueno");
}
}else{
printf ("Reprobado");
}

4.1.3. Estructura se repeticin while


Una estructura de repeticin le permite al programador especificar que se repita una accin mientras cierta condicin
se mantenga verdadera.
Dado el siguiente psuedocdigo que calcula la primer potencia de dos que es superior a 1000:

Algoritmo 4.1: Estructura de repeticin while


1: Incializar producto en 2;
2: mientras producto 6= 1000 hacer
3: multiplicar producto por 2;
4: fin mientras
5: imprimir producto;
21

Podemos escribir la porcin de cdigo como sigue:


int producto;
producto=2;
while (producto <= 1000){
producto=producto*2;
}
printf(" %d",producto);

4.1.4. Ejemplos utilizando la estructura de repeticin while

Algoritmo 4.2: Pseudocdigo para factorial


1: imprimir Imprimir solicitud de ingreso de n;
2: Leer n;
3: Inicializo contador a 1;
4: Inicializo factorial a 1;
5: mientras contador <= n hacer
6: Calcular factorial=factorial * contador;
7: Sumar 1 a contador;
8: fin mientras
9: imprimir factorial;

Factorial de un nmero Podemos escribir la porcin de cdigo como sigue:


#include <stdio.h>
int main(){
int n,contador,factorial;
contador=0;
printf("Ingrese un valor de n:");
scanf(" %d",&n);
while (contador <= n){
factorial=factorial*contador;
contador++;
}
printf("Factorial es: %d",producto);
return 0;
}
22 Lenguaje C

Algoritmo 4.3: Pseudocdigo para potencia


1: imprimir Imprimir solicitud de ingreso de n;
2: imprimir Imprimir solicitud de ingreso de numero;
3: Leer n;
4: Leer numero;
5: Inicializo contador a 1;
6: Inicializo potencia a 1;
7: mientras contador <= n hacer
8: Calcular potencia=potencia * numero;
9: Sumar 1 a contador;
10: fin mientras
11: Imprimir potencia;
12: imprimir factorial;

Potencia n-sima de un nmero dado Podemos escribir la porcin de cdigo como sigue:
#include <stdio.h>
int main(){
int exp,base,potencia,contador;
printf ("Ingrese el exponente:");
scanf(" %d",exp);
printf("Ingrese el n\umero cuya potencia desea calcular:");
scanf(" %d",&base);
contador=1;
potencia=1;
while (contador <= exp){
potencia=potencia*base;
contador++;
}
printf("La potencia %d de %d es %d",base,exp,potencia);
return 0;
}

4.1.5. Ms ejemplos de uso del while


4.1.5.1. Repeticin controlada por contador Nos dicen que una clase de 10 alumnos hizo un examen.Las calificacio-
nes van en un rango entero del 1 al 12.Se pide hallar el promedio de la clase en el examen.

#include <stdio.h>
int main(){
int cant_alumnos,calificacion,total;
float promedio;
total=0;
cant_alumnos=1;
while (cant_alumnos <= 10){
scanf(" %d",&calificacion);
total=total+calificacion;
cant_alumnos++;
}
23

Algoritmo 4.4: Pseudocdigo para promedio de 10 estudiantes


1: Inicializo total a 0;
2: Inicializo cant_alumnos a 1;
3: mientras cant_alumnos <= 10 hacer
4: Leer calificacion;
5: Calcular total=calificacion+total;
6: Sumar 1 a cant_alumnos;
7: fin mientras
8: Calcular promedio=total / 10;
9: imprimir promedio;

promedio=total/(cant_alumnos-1);
printf("El promedio es: %f",promedio);
return 0;
}

4.1.5.2. Repeticin controlada por centinela El problema es igual al anterior salvo que en vez de considerar 10 estu-
diantes consideramos una cantidad arbitraria. Ingresaremos datos y cuando hayamos terminado con todos los datos
ingresaremos -1.

Algoritmo 4.5: Pseudocdigo para promedio de n estudiantes


1: Inicializo total a 0;
2: Inicializo cant_alumnos a 0;
3: Leer centinela
4: mientras centinela != -1 hacer
5: Leer calificacion;
6: Calcular total=calificacion+total;
7: Sumar 1 a cant_alumnos;
8: Leer centinela
9: fin mientras
10: si cant_alumnos != 0 entonces
11: Calcular promedio=total / 10;
12: imprimir promedio;
13: si no
14: imprimir Error no se ingresaron calificaciones.
15: fin si
24 Lenguaje C

#include <stdio.h>
int main(){
int centinela,cant_alumnos,calificacion,total;
float promedio;
total=0;
cant_alumnos=0;
scanf(" %d",centinela);
while (centinela != -1){
scanf(" %d",&calificacion);
total=total+calificacion;
cant_alumnos++;
scanf(" %d",centinela);
}
if (cant_alumnos != 0){
promedio=total/(cant_alumnos-1);
printf("El promedio es: %f",promedio);
}else{
printf("No se ingresaron calificaciones");
}
return 0;
}

4.1.5.3. Estructuras de control anidadas Un centro educativo ofrece un curso que prepara alumnos para un examen.
Se desea saber que tan bien salieron sus alumnos en el examen. Se ingresar un 1 si el alumno pas el examen y un 0
si lo reprob. Se quiere saber total de aprobados y total de reprobados en un total de 10 alumnos.

Algoritmo 4.6: Pseudocdigo para estructuras de control anidadas


1: Inicializo cant_aprobados a 0;
2: Inicializo cant_reprobados a 0;
3: Inicializo cant_alumnos a 1;
4: mientras cant_alumnos <= 10 hacer
5: Leer calificacion;
6: si calificacion == 1 entonces
7: Sumar 1 a cant_aprobados;
8: si no
9: Sumar 1 a cant_reprobados;
10: fin si
11: Sumar 1 a cant_alumnos
12: fin mientras
13: imprimir cantidad de aprobados;
14: imprimir cantidad de reprobados;
25

#include <stdio.h>
int main(){
int cant_alumnos,calificacion,reprobados,aprobados;
cant_alumnos=1;
aprobados=0;
reprobados=0;
while (cant_alumnos <= 10){
scanf(" %d",&calificacion);
if (calificacion==1)
aprobados++;
else
reprobados++;
}
printf("Aprobados: %d Reprobados: %d",aprobados,reprobados);
return 0;
}
26 Lenguaje C

4.2 Ejercicios

4.1 Considere la siguiente instruccin if anidada:

if (a > b){
if (a > c){
printf ("a es el mayor")
}
}
Escriba una sola instruccin if que sea equivalente a sta pero que no contenga otra instruccin if anidada

4.2 Considere el siguiente segmento de programa:


int x,y;
x=7;
y=8;
if (x > y){
x+=1;
}else{
y+=1;
}
Determine el valor de las variables x e y.

4.3 Indique qu es lo que se exhibe al ejecutar el siguiente segmento de programa:


int x, y, z;
...
x = 1;
y = 2;
z = 3;
if (x > y){
if (y > z){
if (x > z){
printf(" %d",x);
}else{
printf(" %d",y);
}
}else{
printf(" %d",z);
}
}
...

4.4 Escriba un programa en C que permita ingresar un nmero y averige si es mltiplo de 3, si es mltiplo de 5 o si es mltiplo
de 3 y 5 a la vez.

4.5 Escriba un programa en C que encuentre las races de una ecuacin de segundo grado de la forma ax2 + bx + c = 0 donde
a,b y c son valores ledos de la entrada.
27

4.6 Escriba un programa en C, que lea de la entrada dos enteros y un carcter que puede ser + o * y finalmente despliegue el
resultado de aplicar la operacin correspondiente a los enteros ingresados.

4.7 Escriba un programa en C que lea 5 enteros y a continuacin imprima el mayor y el menor.

4.8 Escriba un programa en C que lea 3 enteros y a continuacin diga, para cada uno, si es mltiplo de 2.
5 Lenguaje C

5.1 Mas sobre instrucciones de control

Estudiaremos con mayor detalle la repeticin y presentaremos estructuras adicionales de control de la repeticin
a saber las estructuras for y do-while. Presentaremos la estructura de seleccin mltiple switch. Analizaremos los
enunciados break que sale de las estructuras de control y continue que saltea el resto de una estructura de control y
continua con la siguiente iteracin.

5.1.1. Lo escencial en la repeticin


La mayor parte de los programas incluyen repeticiones o ciclos. Un ciclo es un grupo de instrucciones que la compu-
tadora ejecuta en forma repetida en tanto se conserve verdadera alguna condicin de continuacin del ciclo. Hemos
analizado dos procedimientos de repeticin:

1. Repeticin controlada por contador.

2. Repeticin controlada por centinela.

En la repeticin controlada por contador se utiliza una variable de control para contar el nmero de repeticiones. La
variable de control es incrementada (normalmente en 1) cada vez que se ejecuta el grupo de instrucciones dentro de
la repeticin. Cuando el valor de la variable de control indica que se ha ejecutado el nmero correcto de repeticiones
se termina el ciclo y la computadora continua ejecutando el enunciado siguiente al de la estructura de repeticin.
Los valores centinela se utilizan para controlar la repeticin cuando:

1. El nmero preciso de repeticiones no es conocido con anticipacin.

2. El ciclo incluye enunciados que deben obtener datos cada vez que este se ejecuta.

El valor centinela indica "fin de datos".El centinela es introducido una vez que al programa se le han proporcionado
todos los datos. Los centinelas deben ser un valor diferente a los valores que toman los datos.

5.1.2. Repeticin controlada por contador


La repeticin controlada por contador requiere:

1. El nombre de una variable de control (o contador del ciclo).

2. El valor inicial de la variable de control.


29

3. El incremento (o decremento) con el cual, cada vez que se termine un ciclo la variable de control ser modifica-
da.

4. La condicin que compruebe la existencia del valor final de la variable de control.

Considere el siguiente programa que imprime los nmeros del 1 al 10:

#include <stdio.h>
int main(){
int contador;
contador=1;
while (contador <= 10){
printf (" %d",contador);
contador++;
}
return 0;
}

El enunciado contador++ incrementa en 1 el contador del ciclo cada vez que este se ejecuta. La condicin del while
prueba si el valor de la variable de control es menor o igual a 10 (un valor mayor en este caso 11) hace que la condicin
se vuelva falsa.

5.1.3. La estructura de repeticin for


La estructura de repeticin for maneja de forma cuasi automtica todos los detalles. Para ilustrar los poderes del for
reescribiremos el programa anterior:

#include <stdio.h>
int main(){
int contador;
for (contador=1;contador<=10;contador++){
printf (" %d",contador);
}
return 0;
}

El for funciona de esta manera:

1 Se inicializa la variable de control por nica vez (en el caso anterior llamada contador).

2 Si la condicin booleana es verdadera entonces se pasa a 3 (en el caso anterior contador <= 3).Si la condicin
booleana es falsa se sale del cuerpo del for.

3 Se ejecuta el cuerpo del for (lo que esta entre llaves),y se incrementa la variable de control (contador ++).Luego
se vuelve al paso 2

Observaciones:

El incremento puede ser negativo (ir hacia atrs)

Si la condicin booleana resulta falsa,automticamente se sale del cuerpo del for,y no se ejecuta nada.
30 Lenguaje C

5.1.3.1. Ejemplos utilizando la estructura for Los siguientes ejemplos muestran mtodos de como jugar con la va-
riable de control:

Variar la variable de control de 1 a 100 en incrementos de a 1:


for (i=1;i<100;i++)

Variar la variable de control de 100 a 1 en incrementos de a -1:


for (i=1;i<100;i++)

Variar la variable de control de 7 a 77 en pasos de 7:


for (i=7;i<=77;i=i+7)

Variar la variable de control de 20 a 2 en pasos de -2:


for (i=20;i<=2;i=i-2)

Consideremos el siguiente pseudocdigo:


Si la nota del estudiante es mayor o igual a 7 mostrar en pantalla .Aprobado"
En otro caso mostrar "No aprobado" Se cdifica en C de la siguiente manera:
if (nota >= 7){
printf ("Aprobado");
}else{
printf ("No aprobado");
}
En general una secuencia if consta de:

Una palabra clave if

Una condicin booleana entre parntesis.

Una ( varias) instruccin que se ejecutar si la condicin es verdadera.

Una palabra clave else

Una ( varias) instruccin que se ejecutar si la condicin es verdadera.


31

Podemos anidar estructuras if e if/else. Esto ocurre cuando una de las sentencias a ejecutar en un if es otro if. Por
ejemplo:

if (nota >= 11){


printf ("Excelente");
}else if (nota >=9){
printf ("Muy bueno");
}else if (nota >=7){
printf ("Bueno");
}else{
printf ("Reprobado");
}
Otro ejemplo:

if (nota >= 7){


if (nota == 12){
printf ("Excelente");
}
if (nota >=9){
printf ("Muy Bueno");
}
if (nota >=9){
printf ("Muy Bueno");
}
if (nota>=7){
printf ("Bueno");
}
}else{
printf ("Reprobado");
}

5.1.4. Estructura se repeticin while


Una estructura de repeticin le permite al programador especificar que se repita una accin mientras cierta condicin
se mantenga verdadera.
Dado el siguiente psuedocdigo que calcula la primer potencia de dos que es superior a 1000:

Algoritmo 5.1: Estructura de repeticin while


1: Incializar producto en 2;
2: mientras producto 6= 1000 hacer
3: multiplicar producto por 2;
4: fin mientras
5: imprimir producto;
32 Lenguaje C

Podemos escribir la porcin de cdigo como sigue:


int producto;
producto=2;
while (producto <= 1000){
producto=producto*2;
}
printf(" %d",producto);

5.1.5. Ejemplos utilizando la estructura de repeticin while

Algoritmo 5.2: Pseudocdigo para factorial


1: imprimir Imprimir solicitud de ingreso de n;
2: Leer n;
3: Inicializo contador a 1;
4: Inicializo factorial a 1;
5: mientras contador <= n hacer
6: Calcular factorial=factorial * contador;
7: Sumar 1 a contador;
8: fin mientras
9: imprimir factorial;

Factorial de un nmero Podemos escribir la porcin de cdigo como sigue:


#include <stdio.h>
int main(){
int n,contador,factorial;
contador=0;
printf("Ingrese un valor de n:");
scanf(" %d",&n);
while (contador <= n){
factorial=factorial*contador;
contador++;
}
printf("Factorial es: %d",producto);
return 0;
}
33

Algoritmo 5.3: Pseudocdigo para potencia


1: imprimir Imprimir solicitud de ingreso de n;
2: imprimir Imprimir solicitud de ingreso de numero;
3: Leer n;
4: Leer numero;
5: Inicializo contador a 1;
6: Inicializo potencia a 1;
7: mientras contador <= n hacer
8: Calcular potencia=potencia * numero;
9: Sumar 1 a contador;
10: fin mientras
11: Imprimir potencia;
12: imprimir factorial;

Potencia n-sima de un nmero dado Podemos escribir la porcin de cdigo como sigue:
#include <stdio.h>
int main(){
int exp,base,potencia,contador;
printf ("Ingrese el exponente:");
scanf(" %d",exp);
printf("Ingrese el n\umero cuya potencia desea calcular:");
scanf(" %d",&base);
contador=1;
potencia=1;
while (contador <= exp){
potencia=potencia*base;
contador++;
}
printf("La potencia %d de %d es %d",base,exp,potencia);
return 0;
}

5.1.6. Ms ejemplos de uso del while


5.1.6.1. Repeticin controlada por contador Nos dicen que una clase de 10 alumnos hizo un examen.Las calificacio-
nes van en un rango entero del 1 al 12.Se pide hallar el promedio de la clase en el examen.

#include <stdio.h>
int main(){
int cant_alumnos,calificacion,total;
float promedio;
total=0;
cant_alumnos=1;
while (cant_alumnos <= 10){
scanf(" %d",&calificacion);
total=total+calificacion;
cant_alumnos++;
}
34 Lenguaje C

Algoritmo 5.4: Pseudocdigo para promedio de 10 estudiantes


1: Inicializo total a 0;
2: Inicializo cant_alumnos a 1;
3: mientras cant_alumnos <= 10 hacer
4: Leer calificacion;
5: Calcular total=calificacion+total;
6: Sumar 1 a cant_alumnos;
7: fin mientras
8: Calcular promedio=total / 10;
9: imprimir promedio;

promedio=total/(cant_alumnos-1);
printf("El promedio es: %f",promedio);
return 0;
}

5.1.6.2. Repeticin controlada por centinela El problema es igual al anterior salvo que en vez de considerar 10 estu-
diantes consideramos una cantidad arbitraria. Ingresaremos datos y cuando hayamos terminado con todos los datos
ingresaremos -1.

Algoritmo 5.5: Pseudocdigo para promedio de n estudiantes


1: Inicializo total a 0;
2: Inicializo cant_alumnos a 0;
3: Leer centinela
4: mientras centinela != -1 hacer
5: Leer calificacion;
6: Calcular total=calificacion+total;
7: Sumar 1 a cant_alumnos;
8: Leer centinela
9: fin mientras
10: si cant_alumnos != 0 entonces
11: Calcular promedio=total / 10;
12: imprimir promedio;
13: si no
14: imprimir Error no se ingresaron calificaciones.
15: fin si
35

#include <stdio.h>
int main(){
int centinela,cant_alumnos,calificacion,total;
float promedio;
total=0;
cant_alumnos=0;
scanf(" %d",centinela);
while (centinela != -1){
scanf(" %d",&calificacion);
total=total+calificacion;
cant_alumnos++;
scanf(" %d",centinela);
}
if (cant_alumnos != 0){
promedio=total/(cant_alumnos-1);
printf("El promedio es: %f",promedio);
}else{
printf("No se ingresaron calificaciones");
}
return 0;
}

5.1.6.3. Estructuras de control anidadas Un centro educativo ofrece un curso que prepara alumnos para un examen.
Se desea saber que tan bien salieron sus alumnos en el examen. Se ingresar un 1 si el alumno pas el examen y un 0
si lo reprob. Se quiere saber total de aprobados y total de reprobados en un total de 10 alumnos.

Algoritmo 5.6: Pseudocdigo para estructuras de control anidadas


1: Inicializo cant_aprobados a 0;
2: Inicializo cant_reprobados a 0;
3: Inicializo cant_alumnos a 1;
4: mientras cant_alumnos <= 10 hacer
5: Leer calificacion;
6: si calificacion == 1 entonces
7: Sumar 1 a cant_aprobados;
8: si no
9: Sumar 1 a cant_reprobados;
10: fin si
11: Sumar 1 a cant_alumnos
12: fin mientras
13: imprimir cantidad de aprobados;
14: imprimir cantidad de reprobados;
36 Lenguaje C

#include <stdio.h>
int main(){
int cant_alumnos,calificacion,reprobados,aprobados;
cant_alumnos=1;
aprobados=0;
reprobados=0;
while (cant_alumnos <= 10){
scanf(" %d",&calificacion);
if (calificacion==1)
aprobados++;
else
reprobados++;
}
printf("Aprobados: %d Reprobados: %d",aprobados,reprobados);
return 0;
}
37

5.2 Ejercicios

5.1 Considere la siguiente instruccin if anidada:

if (a > b){
if (a > c){
printf ("a es el mayor")
}
}
Escriba una sola instruccin if que sea equivalente a sta pero que no contenga otra instruccin if anidada

5.2 Considere el siguiente segmento de programa:


int x,y;
x=7;
y=8;
if (x > y){
x+=1;
}else{
y+=1;
}
Determine el valor de las variables x e y.

5.3 Indique qu es lo que se exhibe al ejecutar el siguiente segmento de programa:


int x, y, z;
...
x = 1;
y = 2;
z = 3;
if (x > y){
if (y > z){
if (x > z){
printf(" %d",x);
}else{
printf(" %d",y);
}
}else{
printf(" %d",z);
}
}
...

5.4 Escriba un programa en C que permita ingresar un nmero y averige si es mltiplo de 3, si es mltiplo de 5 o si es mltiplo
de 3 y 5 a la vez.

5.5 Escriba un programa en C que encuentre las races de una ecuacin de segundo grado de la forma ax2 + bx + c = 0 donde
a,b y c son valores ledos de la entrada.
38 Lenguaje C

5.6 Escriba un programa en C, que lea de la entrada dos enteros y un carcter que puede ser + o * y finalmente despliegue el
resultado de aplicar la operacin correspondiente a los enteros ingresados.

5.7 Escriba un programa en C que lea 5 enteros y a continuacin imprima el mayor y el menor.

5.8 Escriba un programa en C que lea 3 enteros y a continuacin diga, para cada uno, si es mltiplo de 2.
6 Lenguaje C

6.1 Arreglos

Los arreglos son estructuras de datos consistentes en un conjunto de datos del mismo tipo.
Los arreglos tienen un tamao que es la cantidad de objetos del mismo tipo que pueden almacenar.Son entidades
estticas debido a que se declaran de un cierto tamao y conservan este todo a lo largo de la ejecucin del programa
en el cual fue declarado.
Decimos arreglo o array indistintamente.

6.1.1. Declaracin
Consideremos el siguiente cdigo:

int vect[30];
Declara que vect es un arreglo de enteros de tamao 30.
En general usualmente declaramos el tamao como una constate:
#include <stdio.h>
#define tam 30
int main(){
int vect[tam];
return 0;
}
Observar que las declaracines de constantes no llevan ; al finalizar la sentencia
#define tam 30
Observemos tambin que la declaracin de un vector consta de:

tipo de elementos del arreglo.

nombre del arreglo.

tamao del arreglo.


40 Lenguaje C

Digamos que un arreglo consta de posiciones de memoria contiguas,la direccin de memoria mas baja corresponde
al primer elemento,y la mas baja al ltimo.Para acceder a un elemento se utiliza un indice,por lo que el acceso se
realiza de manera indirecta haciendo referencia al nombre del arreglo y el ndice.
En C y C++ todos los arreglos utilizan el ndice 0 para el primer elemento y si el tamao es N entonces,el indice N-1
es el ltimo elemento del arreglo.
Ejemplo:
#include <stdio.h>
#define N 10
int main(){
//Declaro un vector de enteros de tamanio 10
int vec[N];
//Cargo el vector con valores iguales al indice+10
for (int i=0;i<N;i++){
vec[i]=i+N;
}
//Imprimo en pantalla el contenido del vector
for (int i=0;i<N;i++){
printf("Elemento %d del vector es: %d\n"i,vec[i]);
}
return 0;
}
Podemos entonces decir que:

para cargar un elemento de un array coloco el nombre de array seguido de un ndice entre parntesis rectos y
asocio el valor que desee.

para acceder al valor de un elemento del array coloco el nombre de array seguido de un ndice entre parntesis
rectos.

los indices con los que accedo al array varan entre 0 y la cantidad de elementos menos 1.

Los nombres de los arrays siguen la misma convencin que los nombres de las variables.

Veamos ejemplos de declaraciones:


#include <stdio.h>
#define N 10
#define M 50
int main(){
//Almacena 10 notas
int notas[N];
//Almacena nombres de largo menor o igual a 50
char nombre[M];
//Declara un arreglo de tamanio N para almacenar multiplos*/
int multiplos[N]
return 0;
}
41

Los indices pueden ser cualquier expresin entera.Si un programa utiliza una expresin como subindice esta se
evalua para determinar el ndice.
Ejemplo:
#include <stdio.h>
#define N 100
int main(){
//Almacena 100 notas
int notas[N];
int a=5;
int b=10;
//Suma 2 al elemento del arreglo numero 15.
notas[a+b]+=2;
return 0;
}

6.1.2. Inicializacin
Los elementos de un arreglo pueden ser inicializados en la declaracin del arreglo haciendo seguir a la declaracin
un signo de igual y una lista entre llaves de valores separados por comas.
Ejemplo:
#include <stdio.h>
#define N 10
int main(){
//Almacena 10 notas con los valores dados en la lista de valores
int notas[N]={10,12,3,1,4,4,6,7,2,10};
Si en la declaracin hay menos inicializadores que el tamao del array, los elementos son inicializados a cero. Puedo
entonces inicializar todo un array en 1 as:
#include <stdio.h>
#define N 10
int main(){
//Almacena 10 notas con valor 1
int notas[N]={1};
Si en una declaracin con una lista inicializadora se omite el tamao del arreglo el nmero de elementos del arreglo
ser el nmero de elementos incluidos en la lista inicializadora,ejemplo:
#include <stdio.h>
int main(){
//Almacena 5 notas
int notas[]={10,4,5,6,7};
return 0;
}
42 Lenguaje C

6.1.3. Operaciones frecuentes


Cuando recorremos un vector de tamao N usualmente utilizamos:
#include <stdio.h>
#define N 10
int main(){
//Almacena 10 notas con los valores dados en la lista de valores
int notas[N]={10,12,3,1,4,4,6,7,2,10};
for (int i=0;i<N;i++){
//algo
}
for (int i=N-1;i>=0;i--){
//algo
}
return 0;
}

6.1.4. Arreglos constantes


Podran existir situaciones en las cuales no queremos permitir que una funcin modifique un arreglo.C y C++ pro-
porcionan un calificador llamado const que se puede utilizar para evitar la modificacin de variables en particular
arreglos.
Cuando en un parmetro de una funcin que representa un arreglo se antecede la declaracin del parmetro con la
palabra clave const,los elementos del arreglo se convierten en constantes y cualquier intento de modificar un elemen-
to del arreglo dentro de la funcin da como resultado un error en tiempo de compilacin.
Ejemplo:
#include <stdio.h>
#define N 10
int main(){
//Almacena 10 notas con los valores dados en la lista de valores
const int notas[N]={10,12,3,1,4,4,6,7,2,10};
notas[3]=10;//Error en tiempo de compilacion (assignment of read-only location vec[
return 0;
}

6.1.5. Arreglos de caracteres o strings


Hasta ahora solo nos hemos ocupado de arreglos de enteros. Sin embargo los arreglos son capaces de contener datos
de cualquier tipo. Estudiaremos el almacenamiento de strings o cadenas en arreglos de caracteres.Un arreglo de
caracteres puede ser inicializado utilizando una cadena, por ejemplo, la siguiente declaracin:
int main(){
//Almacena un string de 5 caracteres!!!!!!
char nombre[]="Juan";
return 0;
}
43

Si le preguntaran,que tamao tiene el vector nombre,usted responder naturalmente 4 pues son los caracteres de
Juan,pero esto no es as,en realidad el tamao es 5,y por que? Sucede que siempre se guarda un carcter especial para
marcar el fin de la cadena,este carcter es el \0 por tanto seria similar a declarar este arreglo:
int main(){
//Almacena un string de 5 caracteres
char nombre[5]={J,u,a,n,\0};
return 0;
}
Dado que una cadena es un arreglo de caracteres podemos tener acceso a los caracteres individuales de una cadena
utilizando la notacin de nombre de arreglos con subindices.

6.1.6. Lectura e impresion de cadenas de caracteres


Podemos imprimir y leer una cadena con el especificador de conversin %s.
Ejemplo:
#include <stdio.h>
#define N 50
int main(){
//Almacena un string de 5 caracteres
char nombre[]="Juan Andres";
char apellido[N];
printf ("Ingrese el apellido:");
scanf(" %s",apellido);
printf ("Nombre: %s Apellido: %s",nombre,apellido);
return 0;
}
Observe que aunque el vector apellido es de tamao 50,no se utilizan todos sus elementos,por ejemplo si el apellido
es Perez,se utilizan 6 elementos,el ltimo recuerde que es la marca \0 que indica el fin de la cadena de caracte-
res,aunque existan luego 44 elementos que contienen basura.
Existe otro problema,y es que la funcin scanf lee de la entrada standar caracteres hasta encontrarse con el carc-
ter de espacio en blanco,por tanto nos seria imposible guardar un apellido combinado,al estilo Van Persie,por tanto
debemos leer caracter a caracter hasta que encontremos el cdigo ASCCII del enter (10),y adems es nuestra respon-
sabilidad colocar el centinela \0 al final de la cadena.
44 Lenguaje C

#include <stdio.h>
#define N 50
int main(){
//Almacena un string de 5 caracteres
char nombre[]="Juan Andres";
char apellido[N];
char car;
printf ("Ingrese el apellido:");
int pos=0;
do{
scanf(" %c",&car);
if (car!=10){
apellido[pos]=car;
pos++;
}
}while (car!=10 && pos<N);
apellido[pos]=\0;
printf ("Nombre: %s Apellido: %s",nombre,apellido);
return 0;
}

6.1.7. Arreglos con mltiples subindices


En C y C++ los arreglos pueden tener mltiples subindices.Podemos utilizarlos por ejemplo en tablas de valores que
almacena informacin arreglada en filas y columnas. Para identificar un elemento de la tabla debemos especificar
dos subindices, el primero especifica el rengln del argumento y el segundo identifica la columna.
Podemos especificar arreglos con ms de 2 subindices.
Un arreglo de mltiple subindice puede ser inicializado en su declaracin en forma similar a los de un subindice.
Veamos un ejemplo:
#include <stdio.h>
#define N 50
int main(){
//Almacena un vector de enteros de 2 filas y 3 columnas
int mat[2][3]={{1,2,3},{4,-1,2}};
return 0;
}
En el capitulo de funciones nos explayaremos ms sobre matrices o vectores con mas de un subindice.
45

6.2 Ejercicios

6.1 Para las siguientes declaraciones,decir el tamao y el rango en el cual varian los ndices:

1. int a[10];

2. char arr_car[8];

3. #define MAX 250


......
char arreglo[MAX];

6.2 Para el programa que se da a continuacin,decir cules asignaciones son invlidas (no compilan) o cuales son inapropia-
das.Justificar
#include <stdio.h>
#define MAX 20
int main(){
char arreglo[MAX];
char c1,c2=0;
int n;
arreglo[0]=n;
arreglo[1]=c2;
arreglo[MAX]=$;
for (n=0;n<=MAX;n++)
arreglo[n]=c1;
for (n=1;n<=MAX;n++)
arreglo[n-1]=?;
for (n=1;n<=MAX-1;n++)
arreglo[n]=c2;
}

6.3 Escribir un programa para leer una secuencia de 10 nmeros de la entrada standar y desplegarlos en orden inverso al cual
fueron ledos.El programa debe ser fcilmente adaptable a cualquier otra cantidad de nmeros ledos.

6.4 Escribir un programa para leer una secuencia de nmeros positivos y desplegarlos en orden inverso al orden en el cual
fueron ledos.La cantidad de nmeros ingresados es <= N,siendo N una constante entera.El fin de la secuencia est indicado por
el el valor -1 (centinela).

6.5 Se declaran los siguientes arreglos para representar cadenas de caracteres de largo M y N, con M<N:
char arrM[M];
char arrN[N];
Escribir un programa que lea dos cadenas de la entrada,de largo M y N respectivamente,y determine si la cadena de largo M est
includa dentro de la cadena de largo N (es subcadena). El programa debe funcionar para cualquier valor positivo que puedan
tomar las constantes M y N, siempre que se cumpla M<N.

6.6 Se declaran los siguientes arreglos para representar cadenas de caracteres de largo M y N:
char arrM[M];
char arrN[N];
46 Lenguaje C

Escribir un programa que lea dos cadenas de la entrada, de largo M y N respectivamente, y determine si algn carcter de la
primera cadena ocurre en la segunda cadena.

6.7 Se declaran los siguientes arreglos para representar cadenas de caracteres de largo M y N:
char arrM[M];
char arrN[N];
Escribir un programa que lea dos cadenas de la entrada, de largo M y N respectivamente, y determine si todos los caracteres de
la primera cadena ocurren en la segunda cadena (en cualquier posicin y orden).

6.8 Escribir un programa que lea de la entrada estndar una secuencia de enteros positivos que termina con el centinela 1 y
un valor real.El programa debe imprimir el resultado de evaluar:
P(x) = an xn + an1 xn1 + an2 xn2 + an3 xn3 + ....a2 x2 + a1 x1 + a0 en donde los coeficientes del polinomio son los enteros ledos
de la entrada standar,y el valor x es un real.
Puede utilizar para evaluar el polinomio la Regla de Horner:
P(x) = (((...(an x + an1 )x... + a2 )x + a1 )x + a1)x + a0

6.9 Escribir un programa que:

Lee de la entrada standar un entero de N dgitos que contiene un nmero representado en una base entre 2 y 10.

Lee la base correspondiente.

Despliega el equivalente en base 10.

N es una constante fijada en cualquier valor menor a 10 y mayor a 2. Asumir que las entradas son vlidas,es decir,si se ingresa
un nmero b,los dgitos utilizados estarn entre 0 y b-1.
Puede usar esta formula para calcular la representacin decimal de un nmero:
d1 baseN1 + d2 baseN2 + d3 baseN3 + d4 baseN4 + ... + dN 2 base2 + dN 1 base1 + dN
donde d1,d2,....dN son los N dgitos leidos.
Ejemplo para N=5
Nmero:32201
Base:4
Resultado:905
7 Lenguaje C

7.1 Introduccin a las funciones

La mayor parte de los programas de computo que resuelven problemas de la vida real son mucho mayores que los
programas que hemos visto.
La experiencia ha mostrado que la mejor forma de desarrollar y mantener un programa grande es construirlo a partir
de piezas menores o mdulos, siendo cada uno de ellos ms fcil de manipular que el programa original,esta tcnica
de denomina Divide y Veceras.
C originariamente fue creado para hacer funciones eficientes y faciles de usar.Los programas de C consisten de varias
funciones pequeas en vez de pocas grandes.

7.1.1. Funciones en C
Una funcin es un fragmento de cdigo que realiza una tarea que esta especificada (bien definida).
Por ejemplo:
#include <stdio.h>
int main(){
int contador;
contador=1;
printf (" %d",contador);
return 0;
}
La funcin printf imprime por la salida estandar los argumentos que le pasamos. Por lo general en C los programas
se escriben combinando nuevas funciones que el programador escribe con funciones "preestablecidas"disponibles en
la biblioteca estandar de C. En este caso <stdio.h> es un biblioteca ( conjunto de funciones) estandar.
La biblioteca estandar de C contiene una amplia coleccin de funciones para llevar a cabo clculos matemticos,
manipulaciones de cadenas, entrada/salida, y muchas otras operaciones tiles. Esto facilita la tarea del programador
porque estas funciones proporcionan muchas de las capacidades que los programadores requieren.
48 Lenguaje C

7.1.2. Definicin de funciones


Todas las variables declaradas en las definiciones de funcin son variables locales (son conocidas solo en la funcin
en la cual estn definidas).

La mayor parte de las funciones tienen una lista de parmetros,y los parmetros permiten comunicar informacin
entre funciones.Los parmetros de una funcin son tambin variables locales.

Las funciones se invocan mediante una llamada de funcin. La llamada de funcin especfica el nombre de la funcin
y proporciona informacin (en forma de argumentos) que la funcin llamada necesita a fin de llevar acabo su tarea.
Toda funcin tiene un nombre que indique que es lo que realiza.

Ejemplo:Considere un programa que utiliza una funcin llamada cuadrado para calcular los nmeros que multi-
plicados por si mismo (cuadrados) del 1 al 10.
#include <stdio.h>
/* Definicion (prototipo)de la funcion de cuadrado */
int cuadrado(int);
int main(){
int x;
for (x=1;x<=10;x++)
printf (" %d",cuadrado(x));// Invocacion de la funcion cuadrado
return 0;
}
/* Implementacion de la funcion cuadrado */
int cuadrado(int y){
return y*y;
}
Se imprime: 1 4 9 16 25 36 49 64 81 100
Veamos que:

La funcin cuadrado es invocada dentro de la funcin printf.

Esta recibe una copia del valor de x en el parmetro y.

A continuacin calcula y*y.

El resultado se regresa a la funcin printf en main donde se llamo a cuadrado y printf despliega el resultado.

Este proceso se repite diez veces utilizando la estructura de repeticin for.

La definicin de cuadrado muestra que esta funcin espera un parmetro entero.

La palabra reservada int que precede al nombre de la funcin indica que la funcin devuelve un resultado
entero.

El enunciado return en la funcin cuadrado pasa el resultado del clculo de regreso a la funcin llamadora

La lnea donde se define (prototipo) la funcin o sea int cuadrado(int);

el int dentro del parntesis informa al compilador que la funcin cuadrado espera recibir del llamador un
valor entero.
49

El int a la izquierda del nombre de la funcin le informa al compilador que la funcin regresa al llamador un
valor entero.

El compilador hace referencia al prototipo de la funcin para verificar que las llamadas contengan el tipo de
regreso correcto,nmero correcto de argumentos,y orden de argumentos correctos.

El formato de una funcin de implementacin es:

tipo_de_regreso Nombre_de_funcion (lista de parametros){


delcaracion de variables
.....................
enunciados
.....................
}

Observemos que:

1. El nombre de la funcin es cualquier identificador vlido.

2. El tipo de regreso es el tipo del resultado que se regresa al llamador.

3. Se coloca como tipo void cuando la funcin no regresa un valor.

4. La lista de parmetros consiste en una lista separada por comas que contiene las declaraciones de los parmetros
recibidos por la funcin al ser llamada.

5. Si una funcin no recibe ningn valor la lista de parmetros es void. Para cada parmetro debe especificarse un
tipo.

6. En el caso en que la funcin no reciba parmetros se coloca void entre parntesis o simplemente los parntesis
sin parmetros (esto le ocurre a main).

7. Las declaraciones junto con los enunciados dentro de las llaves forman el cuerpo de la funcin.

8. Bajo ninguna circunstancia puede ser implementada una funcin en el interior de otra funcin.

9. Existen diferentes formas de regresar el control al punto desde el cual se invoco una funcin.

a) Si la funcin no regresa un resultado el control se devuelve cuando se llega a la llave derecha que termina
la funcin o al ejecutar el enuciado return.
b) Si la funcin regresa un resultado el enunciado return expresin devuelve el valor de expresin al llama-
dor y termina la ejecucin de la funcin.
50 Lenguaje C

Ejemplo 1: En el siguiente ejemplo se utiliza una funcin mximo definida por el programador para determinar y
regresar el mayor de tres enteros. Este valor es regresado main mediante un enunciado return.

#include <stdio.h>

/* Definicion (prototipo)de la funcion de maximo */


int maximo (int,int,int);

int main(){
int a,b,c;
printf ("Ingrese tres enteros:");
scanf(" %d %d %d",&a,&b,&c);
printf ("El maximo es: %d",,maximo(a,b,c));// Invocacion de la funcion
return 0;
}

/* Implementacion de la funcion maximo */


int maximo(int x,y,z){
int max=x;
if (y>max)
max=y;
if (z>max)
max=z;
return max;
}

Ejemplo 2: En el siguiente ejemplo se define una funcin que calcula el cubo de un entero.La funcin sin retorno
(procedimiento) main lee un valor, e imprime su cubo.

#include <stdio.h>

/* Definicion (prototipo)de la funcion de cubo */


int cubo (in);

void main(){
int a;
printf ("Ingrese un entero:");
scanf(" %d",&a);
printf ("El cubo de %d es: %d",a,cubo(a));// Invocacion de la funcion
}

/* Implementacion de la funcion cubo */


int cubo(int x){
return x*x*x;
}

Argumentos formales: Los parametros de la funcin.


Argumentos reales:Argumentos que aparecen en la llamada a la funcin.
51

7.1.3. Definicin de funciones o prototipo


Una de las caractersticas ms importante del ANSI C es el prototipo de funcin.
El compilador utiliza los prototipos de funcin para verificar las llamadas de funcin.
Algunas de las caractersticas que deben conocer son:

Es conveniente incluir prototipos de funcin para aprovechar la capacidad de C de verificacin de tipo.

Se debe utilizar las directrices de preprocesador de C (#include) para obtener los prototipos de funciones defi-
nidos en un archivo aparte.

No es necesario especificar nombres de parmetros en los prototipos de funcin, pero se pueden especificar
para mejorar la comprensin del cdigo fuente.

Es necesario colocar punto y coma al final de la definicin de funcin.

Una llamada de funcin que no coincida con el prototipo de la funcin causara un error de sintaxis.

Otra caracterstica importante de prototipos de funcin es obligar a los argumentos al tipo apropiado.

Por ejemplo tengo un parmetro real y la funcin es llamada con un entero.


La conversin de valores a tipos inferiores por lo general resulta en un valor incorrecto.

Si el prototipo de funcin no ha sido incluido en un programa el compilador forma su propio prototipo uti-
lizando la primera ocurrencia de la funcin, ya sea en la implementacin de funcin o una llamada a dicha
funcin.

7.1.4. Devolucin de valores


Una funcin en C slo puede devolver un valor. Para devolver dicho valor, se utiliza la palabra reservada return cuya
sintaxis es la siguiente:
return expresion;
Donde:

Donde expresin puede ser cualquier tipo de dato salvo un array.

Adems, el valor de la expresin debe coincidir con el tipo de dato declarado en el prototipo de la funcin.

Existe la posibilidad de devolver mltiples valores mediante la utilizacin de estructuras.

Dentro de una funcin pueden existir varios return dado que el programa devolver el control a la sentencia
que ha llamado a la funcin en cuanto encuentre la primera sentencia return.

Si no existen return, la ejecucin de la funcin contina hasta la llave del final del cuerpo de la funcin.

Hay que tener en cuenta que existen funciones que no devuelven ningn valor.
El tipo de dato devuelto por estas funciones puede ser void, considerado como un tipo especial de dato.
En estos casos la sentencia return se puede escribir como return sin expresin o se puede omitir.

Un ejemplo son estas dos funciones equivalentes:


void imprime_linea(){
printf ("Esta funcion solo imprime esta linea");
return;
}
52 Lenguaje C

void imprime_linea(){
printf ("Esta funcion solo imprime esta linea");
}

7.1.5. Librerias (archivos de cabecera)


Cada biblioteca estandar tiene un archivo de cabecera correspondiente que contiene los prototipos de funcin de
todas las funciones de dicha biblioteca y las definiciones de varios tipos de datos y de constantes requeridas por
dichas funciones.
El programador puede crear archivos de cabecera personalizados.
Estos deben terminar en .h.
Un archivo de cabecera definido por el programador puede ser incluido utilizando #include.
Cuando un programa utiliza un nmero elevado de funciones, se suelen separar las declaraciones de funcin de las
implementaciones de las mismas.Al igual que con las funciones de biblioteca,las declaraciones pasan a formar parte
de un fichero cabecera (extensin .h), mientras que las definiciones se almacenan en un archivo con el mismo nombre
que el archivo .h, pero con la extensin .c o .cpp.
Veamos un ejemplo:
53

Archivo de definicin Operaciones.h


#ifndef Operaciones_h
#define Operaciones_h
//Aqui pueden llamarse a otras librerias
//Se definen los prototipos
int suma (int,int);
int resta (int,int);
int multiplicacion (int,int);
int division (int,int);
#endif
Archivo de implementacion Operaciones.cpp
#include "Operaciones.h"
#include <stdio.h> //Se pueden llamar a otras librerias

//Aqui van todas las implementaciones definidas en operaciones.h


int suma (int a,int b){
return a+b;
}
int resta (int a,int b){
return a-b
}
int multiplicacion (int a,int b){
return a*b;
}
int division (int a,int b){
if (b==0){
printf("Error en la division por 0\n");
return 0;
}else
return (a/b);
}
54 Lenguaje C

Archivo principal main.cpp


#include "Operaciones.h"
int main(){
int opcion;//0 suma 1 resta 2 multiplicacion 3 division 4 salir
int operando1,operando2;
do{
printf ("Ingrese una opcion:");
scanf(" %d",&opcion);
if (opcion!=4){
printf("Ingrese los operandos");
scanf(" %d %d",&operando1,&operando2);
}
switch (opcion){
case 0:printf("Suma: %d\n",suma(operando1,operando2));
break;
case 1:printf("Resta: %d\n",resta(operando1,operando2));
break;
case 2:printf("Multiplicacion: %d\n",multiplicacion(operando1,operando2));
break;
case 3:printf("Division: %d\n",division(operando1,operando2));
break;
case 4:printf("Salir.\n");
break;
default:printf ("Error en el comando.\n");
break;
}//fin del switch
}while (opcion != 4);//fin del while
return 0;
}

7.1.6. Llamado o acceso a la funcin


Para que una funcin realice la tarea para la cual fue creada, debemos acceder o llamar a la misma.
Debemos recordar las siguientes caractersticas:

Cuando se llama a una funcin dentro de una expresin,el control del programa se pasa a sta y slo regresa
a la siguiente expresin de la que ha realizado la llamada cuando encuentra una instruccin return o, en su
defecto, la llave de cierre al final de la funcin.

Generalmente, se suele llamar a las funciones desde la funcin main, lo que no implica que dentro de una
funcin se pueda acceder a otra funcin.

Cuando queremos acceder a una funcin, debemos hacerlo mediante su nombre seguido de la lista de argu-
mentos que utiliza dicha funcin encerrados entre parntesis.

En caso de que la funcin a la que se quiere acceder no utilice argumentos, se deben colocar los parntesis
vacos.

Cualquier expresin puede contener una llamada a una funcin.


Esta llamada puede ser parte de una expresin simple, como una asignacin, o puede ser uno de los operandos
de una expresin ms compleja.
55

Por ejemplo:

a=cubo(2);
calculo=b+c/cubo(3);

Recordemos que los argumentos que utilizamos en la llamada a una funcin se denominan argumentos reales.
Estos argumentos deben coincidir en el nmero y tipo con los argumentos formales o parmetros de la funcin.
No olvidemos que los argumentos formales son los que se utilizan en la definicin y/o declaracin de una
funcin.

Los argumentos reales pueden ser variables, constantes o incluso expresiones ms complejas.
El valor de cada argumento real en la llamada a una funcin se transfiere a dicha funcin y se le asigna al
argumento formal correspondiente.

Generalmente, cuando una funcin devuelve un valor, la llamada a la funcin suele estar dentro de una expre-
sin de asignacin, como operando de una expresin compleja o como argumento real de otra funcin.

Sin embargo, cuando la funcin no devuelve ningn valor, la llamada a la funcin suele aparecer sola.
Por ejemplo: imprime_linea()

7.1.7. Llamadas por valor y por referencia a la funcin


Hasta ahora siempre hemos declarado los parmetros de nuestras funciones del mismo modo.
Sin embargo, ste no es el nico modo que existe para pasar parmetros.
La forma en que hemos declarado y pasado los parmetros de las funciones hasta ahora es la que normalmente se
conoce como "por valor".
Pasar por valor quiere decir que cuando el control pasa a la funcin, los valores de los parmetros en la llamada
se copian a objetos locales de la funcin,estos objetos son de hecho los propios parmetros.
Veamos un ejemplo:
#include <stdio.h>
int funcion (int,int);
int main(){
int a,b;
a=10;
b=20;
printf ("Los valores son a= %d,b= %d",a,b);
printf ("El valor de la funcion(a,b)=" %d,funcion(a,b));
printf ("Los valores son a= %d,b= %d",a,b);
printf ("El valor de la funcion(10,20)=" %d,funcion(10,20));
return 0;
}
int funcion (int m,int n){
n=n+2;
m=m-5;
return m+n;
}
56 Lenguaje C

Vamos a ver que ocurre en este ejemplo:

1. Empezamos haciendo a = 10 y b = 20, despus llamamos a la funcin funcion con los objetos a y b como par-
metros.
Dentro de funcion esos parmetros se llaman n y m, y sus valores son modificados.
Sin embargo al retornar a main, a y b conservan sus valores originales. Por que ?
La respuesta es que lo que pasamos no son objetos a y b,sino que copiamos sus valores a los objetos a y b.
Esto se denomina (alias).Corra el programa y observe que sucede:

#include <stdio.h>
int main(){
int a,b;
a=10;
&b=a;
printf ("Los valores son a= %d,b= %d",a,b);
a=a+5;
printf ("Los valores son a= %d,b= %d",a,b);
b=b+5;
printf ("Los valores son a= %d,b= %d",a,b);
return 0;
}

Cuando sucede esto,se dicen que a y b son alias.

2. Si los parmetros por valor no funcionasen as, no sera posible llamar a una funcin con valores constantes o
literales.

3. Por tanto:Cuando los argumentos se pasan en llamada por valor se efecta una copia del valor del argumento
con el cual se invoca y se asigna a la variable local (parmetro) correspondiente al argumento.
Las modificaciones que la funcin realice a la variable correspondiente al parmetro no afectan a las posibles
variables con las que se invoc la funcin.

Si queremos que los cambios realizados en los parmetros dentro de la funcin se conserven al retornar de la
llamada, deberemos pasarlos por referencia.
Esto se hace declarando los parmetros de la funcin como referencias a objetos.
57

Por ejemplo:

#include <stdio.h>
int funcion (int *,int *);
int main(){
int a,b;
a=10;
b=20;
printf ("Los valores son a= %d,b= %d",a,b);
printf ("El valor de la funcion(&a,&b)=" %d,funcion(&a,&b));
printf ("Los valores son a= %d,b= %d",a,b);
/*Es ilegal pasar constantes como parametros cuando estos son referencias */
printf("valor de funcion(10,20) = %d", funcion(10,20));//No funciona,leer comentario
return 0;
}
int funcion (int * m,int * n){
n=n+2;
m=m-5;
return m+n;
}

Vamos a ver que ocurre en este nuevo ejemplo:

En este caso,los objetos a y b tendrn valores distintos despus de llamar a la funcin,a saber a=12 y b=15.
Cualquier cambio de valor que realicemos en los parmetros de la funcin,se har tambin en los objetos de la
llamada.

Por tanto no podemos realizar la llamada de la funcin con parmetros constantes.


Un objeto con valor constante no puede tratarse como variable.

Cuando un argumento es pasado en llamada por referencia, las modificaciones que la funcin realice a la va-
riable correspondiente al parmetro se realizan en las posibles variables con las que se invoc la funcin.

La llamada por valor debera ser utilizada siempre que la funcin llamada no necesite modificar el valor de la
variable original del llamador.

La llamada por referencia debe ser utilizada solo cuando se necesite modificar la variable original.

7.1.7.1. Ejemplos: Escribamos una funcin intercambio que reciba dos argumentos enteros y los intercambie.Escribamos
la funcin de la siguiente manera

void intercambio (int m,int n){


int aux=m;
m=n;
n=aux;
}

Observemos que:

Los argumentos estan pasados por valor,entonces si llamo a la funcin del siguiente modo:intercambio(a,b),a
y b no son modificados.

Veamos como sera la funcin y su invocacin en el caso de llamada por referencia:


58 Lenguaje C

void intercambio (int * m,int * n){


int aux=m;
m=n;
n=aux;
}

Para la invocacin de la funcin utilizamos &,en este ejempo:intercambio(&a,&b)

En el caso de C++ podemos utilizar la siguiente funcin para el caso de pasaje de parametros por referencia.
void intercambio (int & m,int & n){
int aux=m;
m=n;
n=aux;
}

Para la invocacin de la funcin:intercambio(a,b)


59

7.1.8. Ejemplo:Un juego de azar


Las reglas de juego son las siguientes:
Un jugador tira dos dados.Cada dado tiene 6 caras.Las caras contienen 1,2,3,4,5 y 6 puntos. Una vez que los dados
se hayan detenido se calcula la suma de los puntos en las dos caras. Si a la primera tirada la suma es 7 o bien 11 el
jugador gana. Si en la primera tirada la suma es 2, 3 o 12 el jugador pierde (gana la casa). Si en la primera tirada la
suma es 4,5,6,8,9 o 10 el jugador debe seguir jugando hasta que o bien se repite dicho nmero o hasta que salga 7. En
el primer caso el jugador gana en el segundo pierde.
El siguiente programa simula el juego:
#include <stdio.h>
#include <stdlib.h>
int jugada();
int main(){
int estado, suma, resultado;
srand(time(NULL));
suma = jugada();
switch (suma){
case 7:case 11:estado=1;
break;
case 2:case 3:case 12:estado=2;
break;
default:estado=0;
resultado=suma();
printf("Jugada dio: %d\n",resultado);
break;
}
while (estado==0){
suma=jugada();
if (suma==resultado)
estado=1;
if (suma==7)
estado=2;
}
if (estado==1)
printf ("Jugador gana\n");
else
printf ("Jugador pierde\n");
return 0;
}

int jugada (void){


int dado1,dado2,suma;
dado1=1+(rand() %6);
dado2=1+(rand() %6);
suma=dado1+dado2;
printf ("Jugador sumo %d+ %d= %d\n",dado1,dado2,suma);
return suma;
}
Queda para el estudiante analizar el programa.
60 Lenguaje C

7.2 Ejercicios

7.1 Escribir el encabezado de las siguientes funciones apropiadas para resolver los siguientes problemas.Pensar,para cada fun-
cin,cuales son los parmetros,cual los tipos de parmetros y cual es el tipo de retorno.

1. Dados dos enteros calcular su suma.

2. Dados dos enteros decir si son iguales.

3. Desplegar el mensaje "Fin del programa"

4. Dado un arreglo de enteros,decir cul es el valor mximo contenido en l.

5. Dados 3 enteros,calcular el promedio de los tres.

6. Dado un arreglo de caracteres,desplegar todos los elementos contenidos en l.

7.2 Considere el siguiente segmento de programa:


#include <stdio.h>
int valorLeido (void);
void mensajeFinal (int);
int main(){
int num;
num=valorLeido();
mensajeFinal(num);
return 0;
}

/* Funcion que pide un numero entero al usuario y lo devuelve como resultado */


int valorLeido (void){
int v;
printf ("Ingrese un valor entero:");
scanf (" %d",&v);
return v;
}
/* Funcion que despliega un valor entero */
void mensajeFinal(int){
printf ("El valor es: %d\n",valor);
return;
}

1. Cuales son las variables locales de valorLeido ?

2. Cuales son las variables locales de mensajeFinal ?

3. Cuales son las variables locales de main ?

4. Cuales son los parmetros de valorLeido ?

5. Cuales son los parmetros de mensajeFinal ?


61

6. Cual es el tipo que retorna valorLeido ?

7. Cual es el tipo que retorna mensajeFinal ?

8. Cual es el tipo que retorna main ?

9. El programa tiene variables globales a todas las funciones ?

7.3 Escribir los cdigos en C para las siguientes funciones:

1. Funcin que calcule xy

2. Funcin que calcule x!

3. Procedimiento que despliegue todos los divisores de x

4. Un programa que utilizando las partes anteriores lea de la entrada standar un entero x y muestre xy donde y es una
constante dada definida en el programa,x! y todos los divisores de x

7.4 Se pide:

1. Implementar una funcin para calcular las races de un polinomio de segundo grado.La funcin tendr 4 parmetros:3
enteros para los coeficientes del polinomio,y un vector de reales de tamao dos para las races (aqu van las races que
encuentre).La funcin retornara un entero que indica la cantidad de races encontradas en el polinomio.

2. Escribir un programa completo en C que incluya la funcin desarrollada en la parte anterior.El programa debe tomar los
coeficientes del polinomio de la entrada estndar y desplegar la cantidad de races encontradas,as como sus valores.

7.5 Escribir una funcin llamada Convertir que convierta un arreglo de caracteres al entero equivalente.Puede asumir que
el vector solo tiene caracteres en forma decimal (0,1,...9).Por ejemplo,si el parmetro de la funcin viene con los valores
[1,2,3],entonces el entero resultante sera 123.

7.6 Escribir un programa que lea de la entrada estndar N valores enteros y despliegue los que son primos.Resolver el problema
de modo de utilizar funciones que simplifiquen el problema.

7.7 Se pide:

1. Implementar una funcin que,dados 2 vectores de caracteres determine si el primero es prefijo del segundo.

2. Escribir un programa principal para probar la funcin del item anterior.

7.8 Para cada uno de los siguientes problemas, escriba el cabezal de la funcin ms apropiada para resolverlo

1. Dado un nmero primo, determinar el nmero primo inmediato ms grande.

2. Dado un entero positivo n distinto de 0, determinar la cantidad de factores de n y devolver los dos factores ms grandes (si
existen).

7.9 Resolver el ejercicio 4, teniendo en cuenta la siguiente modificacin: la funcin,en vez de tener entre sus parmetros un
arreglo de tamao 2 para poner las races del polinomio,tiene dos parmetros reales, uno para cada raz posible (cada uno de estos
parmetros se utiliza siempre que el polinomio tenga alguna raz).

7.10 Escribir una funcin con solo tres parmetros enteros: a, b y c. El efecto de la funcin debe ser "girar"los valores de los
parmetros hacia la derecha de manera que, despus de la ejecucin, el valor que originalmente estaba en a quede en b, el que
estaba en b quede en c y el que estaba en c quede en a.
Por ejemplo, si a=4, b=1 y c=7, luego de ejecutar la funcin tendremos: a=7, b=4 y c=1.
62 Lenguaje C

7.11 Implemente una funcin que, dado un arreglo de enteros, devuelva el valor ms grande y el ndice en que ste ocurre. El
arreglo est completo y su largo est dado por una constante N global a la funcin

7.12 Se pide:

1. Escribir una funcin que calcule la cantidad de letras y la cantidad de dgitos contenidos en un arreglo de caracteres de
tamao N (N es una constante global).

2. Escribir un programa que lea de la entrada N caracteres para cargar un arreglo, invoque a la funcin de la parte a) y
despliegue las cantidades que calcula dicha funcin.
8 Lenguaje C

8.1 Funciones Recursivas

Para algunos tipos de problemas es til tener funciones que se llaman a si mismas.
Una funcin recursiva es una funcin que se llama a si misma.
Primero consideraremos la recusin en forma conceptual y a continuacin examinaremos varios programas que
contienen funciones recursivas.
Las funciones recursivas se definen definiendo:

1. caso base: son casos simples.Si la funcin es llamada con el caso base la funcin simplemente devuelve un
resultado.

2. caso recursivo: la funcin es llamada con un problema ms complejo.


Para hacer factible la recursin este ltimo debe parecerse al problema original.
El paso de recursin puede dar como resultado muchas llamadas recursivas a la funcin con problemas ms
sencillos que el original.

Para que la recursin finalice (y no exista recursin indefinida) la funcin debe llamarse a s misma con una versin
ligeramente ms sencilla que el problema original.
Esta secuencia de problemas mas sencilla,se deben converger al paso base.

8.1.1. Ejemplo 1
El factorial de un nmero entero no negativo,escrito como n! y pronunciado factorial de n,se define de la siguiente
manera:

0! = 1

1! = 1

n! = n (n 1) (n 2) ... 3 2 1
64 Lenguaje C

Veamos una versin iterativa (en contraposicin con una recursiva)


#include <stdio.h>
long factorial (long);
int main(){
long num,res;
printf ("Ingrese un numero:");
scanf (" %li",&num);
res=factorial(num);
printf(" %li!= %li",num,res);
}

long factorial (long num){


long fact=1;
for (long i=2;i<=num;i++)
fact=fact*i;
return fact;
}
La versin recursiva solo cambiamos la implementacin de la funcin
long factorial (long num){
if (num==0 || num==1)
return 1;
else{
long fact;
fact=factorial(num-1)*num;
return fact;
}
}
Utilizamos variables de tipo long,pues la funcion factorial crece en forma muy rapida.

8.1.2. Ejemplo 2
La serie de Fibonacci: 0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 35 , ....
empieza con 0 y 1 y tiene la propiedad de que cada nmero subsecuente es la suma de los dos anteriores.
Se puede definir en forma recursiva de la siguiente manera:

fibonacci(0)=0

fibonacci(1)=1

fibonacci(n)=fibonacci(n-1)+fibonacci(n-2) con n 2
65

La versin recursiva de la funcin es:


long fibonacci (long n){
if (n==0 || n==1)
return n;
else{
long fib;
fib=fibonacci(n-1)+fibonacci(n-2);
return fib;
}
}
Cada vez que se invoca a fibonacci se prueba el caso base,es decir si n=0 n=1.
Si esto es verdadero se regresa n,caso contrario se generan dos llamadas recursivas,cada una de las cuales es mas
sencilla que la original.

8.1.3. Ejemplo 3
Consideremos una funcin que imprime los nmeros de n a 1.
Por ejemplo:
#include <stdio.h>
void imprime (long);
int main(){
long num;
printf ("Ingrese un numero:");
scanf (" %li",&num);
imprime(num);
}

void imprime (long num){


if (num==0)
return;
else{
printf (" %d ",num);
imprime(num-1);
}
}

8.1.4. Recursin en comparacin con iteracin


Compararemos los dos enfoques y analizaremos porqu el programador debe escoger un enfoque sobre el otro en
una situacin en particular.
Tanto la iteracin como la recursin se basan en una estructura de control: la iteracin utiliza una estructura de repe-
ticin, la recursin utiliza una estructura de seleccin

Tanto la iteracin como la recursin implican repeticin: la iteracin utiliza la estructura de repeticin en forma ex-
plicita, la recursin consigue la repeticin mediante llamadas de funcin repetidas

La iteracin y la recursin ambas involucran una prueba de terminacin: la iteracin termina cuando falla la condi-
cin de continuacin del ciclo, la recursin termina cuando se reconoce un caso base.
66 Lenguaje C

La recursin tiene muchas negativas. La sobrecarga de llamadas de la funcin puede resultar costoso tanto en tiempo
de procesador como en espacio de memoria.

Cada llamada recursiva genera otra copia de la funcin, esto puede consumir gran cantidad de memoria
La iteracin por lo regular ocurre dentro de una funcin por lo que no ocurre la sobrecarga de llamadas repetidas de
funcin y asignacin extra de memoria.
9 Lenguaje C

9.1 Estructuras

Las estructuras son colecciones de variables relacionadas bajo un nombre.


Las estructuras pueden contener variables de muchos tipos diferentes de datos a diferencia de los arreglos que con-
tienen nicamente elementos de un mismo tipo de datos.

9.1.1. Definicin de estructuras


Las estructuras son tipos de datos derivados,es decir estn construidos a partir de otros tipos de datos,que pueden
ser atmicos o agregados (otras estructuras y vectores).
Considere la siguiente definicin de estructura:
.................
.................
struct Datos{
char c;
int i;
int datos[10];
};
.................
.................
La palabra reservada struct indica que se est definiendo una estructura. El indentificador Datos es el nombre de la
estructura.
Las variables declaradas dentro de la llave de definicin de la estructura son miembros de la estructura.Los miembros
de la estructura deben tener nombres nicos,mientras que dos miembros de distintas estructuras pueden tener igual
nombre.
Cada definicin de estructura debe terminar con punto y coma (;).
La definicin de la estructura Datos tiene 3 campos,a saber,de tipo char,de tipo int,y de tipo vector de enteros.En este
caso dos son atmicos (char e int) y el otro es agregado (el vector).
68 Lenguaje C

9.1.2. Declaracin de variables de estructuras


Pasamos a declarar variables del tipo Datos:
.................
.................
struct Datos d,vect[10];
.................
.................
La declaracin anterior declara una variable del tipo Datos llamada d,y un vector del tipo Datos de tamao 10.
Una operacin vlida entre estructuras es asignar variables de estructura a variables de estructura del mismo tipo.
No se pueden comparar dos estructuras
Ejemplo: Consideremos la informacin de una fecha,que consiste en el da,el mes,el ao,y posiblemente el da del
ao y el nombre del mes.Toda esa informacin la guardaremos en una estructura llamada Fecha,con los siguientes
campos:
.............
.............
struct Fecha{
int dia;
int mes;
int anio;
int dia_anio;
char nombre_mes[9];
};
.............
.............
Otro ejemplo de estructura que incluye a otras estructuras (por ejemplo la anterior) es la siguiente estructura persona
............
#define tam_nombre 100
#define tam_apellido 100
............
............
struct Persona{
char nombre[tam_nombre];
char apellido[tam_apellido];
long codigo_postal;
long seguro_social;
double salario;
struct Fecha cumple;
struct Fecha contrato;
};
............
............
69

9.1.3. Como inicializar estructuras


Las estructuras usualmente son inicializadas por el programador mediante un procedimiento llamado inicializar o
init.
Por ejemplo:
...................

struct Datos{
char c;
int i;
int datos[10];
};
...................
void Init (struct Datos & d){
d.c=a;
d.i=100;
for (int i=0;i<10;i++)
d.datos[i]=-1
}
...................
int maint(){
...................
...................
strcut Datos d;
Init(d);
...................
...................
return 0;
}
Observar en el ejemplo el pasaje de llamada por referencia de la estructura Datos con el &.

9.1.4. Como tener acceso a los miembros de las estrcuturas


Para tener acceso a miembros de estructuras utilizamos el operador punto.El operador punto se utiliza colocando el
nombre de la variable de tipo estructura seguido de un punto y seguido del nombre del miembro de la estructura.
Por ejemplo, para imprimir el miembro c de tipo char de la estructura d utilizamos el enunciado:
printf (" %c",d.c);
Para acceder al miembro i de la estructura d escribimos:
printf (" %d",d.i);
Si queremos acceder algn elemento del vector,lo hacemos por su indice,ejemplo:
printf (" %d",d.datos[3]);
En general un miembro de estructura particular es referenciada por una construccin de la forma:
nombre_de_la_estrcutura.miembro
70 Lenguaje C

9.1.5. Utilizando estructuras como parmetros de las funciones


Las estructuras pueden ser pasadas a funciones pasando miembros de estructura individuales o pasando toda la
estructura.
Cuando se pasan estructuras o miembros individuales de estructura a una funcin se pasan por llamada por valor.
Para pasar una estructura en llamada por referencia tenemos que colocar el * &
Los arreglos de estructura como todos los dems arreglos son automticamente pasados en llamadas por referen-
cia.
Si quisiramos pasar un arreglo en llamada por valor, podemos definir una estructura con nico miembro el array.
Una funcin puede devolver una estructura como valor.
Ejemplos:
struct Punto{
int x;
int y;
};
/*Retorna un punto a partir de sus coordenadas */
struct Punto crearPunto (int valor_absisa,int valor_ordenada){
struct Punto p;
p.x=valor_absisa;
p.y=valor_ordenada;
return p;
}

/*Retorna la sumo de las coordenada de dos puntos*/


struct Punto sumoPuntos (struct Punto p1,struct Punto p2){
struct Punto p;
p.x=p1.x+p2.x;
p.y=p1.y+p2.y;
return p;
}

/*Muestro en la salida standar las coordenadas de un punto*/


void mostrarPunto (struct Punto p){
printf("Las coordenadas del punto son:( %d, %d)",p.x,p.y);
}

9.1.6. Uso de la palabra reservada typdef


La palabra reservada typedef proporciona un mecanismo para la creacin de sinnimos (o alias) para tipos de datos
anteriormente definidos. Veamos un ejemplo:

struct ConjuntoPersonas {
char nombre[50];
char apellido[50];
int edad;
};

typdef struct ConjuntoPersonas CnjP;


71

/*Ahora podemos utilizar CnjP para declarar variables del tipo ConjuntoPersonas.*/
CnjP cnj[10];
typedef se utiliza a menudo para crear seudnimos para los tipos de datos.
Si tenemos por ejemplo un programa que requiere enteros de 4 bytes podraa usar el tipo int en un programa y el
tipo long en otro. Para garantizar portabilidad podemos utilizar typedef para crear un alias de los enteros de 4 bytes
en ambos sistemas.

9.1.7. Ejemplo:Simulacin de barajar y distribuir cartas


El programa que sigue se basa en la simulacin de barajar y distribuir cartas.
El programa representa el mazo de cartas como un arreglo de estructuras, donde cada estructura contiene el nmero
de la carta y el palo. Las funciones son: inicializar mazo que inicializa un array de cartas con los valores de las cartas
ordenado del 1 al 12 de cada uno de los palos, barajar recibe un array de 48 cartas y para cada una de ellas se toma
un nmero al azar entre el 0 y el 47.
A continuacin se intercambia la carta original con la seleccionada al azar. Finalmente la funcin imprimir imprime
las cartas. Se utiliza para imprimir las cartas luego de barajar.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*Definicion de la estructura para carta */


struct carta {
int numero;
char palo[7];
};
/*Alias del tipo de dato Carta y de un vector de 7 caracteres*/
typedef struct carta Carta;
typedef char Palo[7];

/*Inicializa el mazo de cartas*/


void inicializar (Carta m[],Palo p[]);
/*Baraja el mazo de cartas*/
void barajar(Carta m[]);
/*Muestra en la salida estandar el mazo de cartas*/
void imprimir(Carta m[]);

int main (){


Carta mazo[48];
Palo p[4] = {"copa","oro","espada","basto"};
srand(time(NULL));
inicializar(mazo,p);
barajar(mazo);
imprimir(mazo);
return 0;
}
72 Lenguaje C

/*Metodo auxiliar para copiar dos cadenas de largo dado*/


void copiar(char a[], char b[], int largo){
int i;
for (i=0;i < largo;i++)
a[i]=b[i];
}

void inicializar(Carta m[],Palo p[]){


int i;
for (i=0; i < 48;i++){
m[i].numero=(i % 12)+1;
copiar(m[i].palo,p[i/12],7);
}
}

void barajar(Carta m[]){


int i,j;
Carta temp;
for (i=0; i < 48; i++){
j = rand() % 48;
temp = m[i];
m[i] = m[j];
m[j] = temp;
}
}

void imprimir(Carta m[])


{
int i;
for (i=0; i < 48; i++){
printf (" %i de ", m[i].numero);
printf (" %s ", m[i].palo);
printf ("\n");
}
}
73

9.2 Ejercicios

9.1 Decir cules sentencias del siguiente programa son vlidas:


struct fecha {
int dia;
char mes[12];
int anio;
char bisiesto;
};

int main(){
struct fecha f1,f2;
f1.dia = 30;
f1.mes[0] = enero;
f1.dia = 48;
f1.anio = 2000;
f1.bisiesto = si;
f2.anio = f1.dia;
f2.bisiesto = n;
printf(" %d",f1.mes);
if(f2.anio < f1.anio)
printf(" %c",f2.mes);
return 0;
}

9.2 Decir si las siguientes afirmaciones son verdaderas o falsas:

1. Las estructuras pueden contener un nico tipo de datos.

2. Las estructuras no pueden ser comparadas.

3. Una estructura puede contener un campo que sea un arreglo (vector).

4. Un arreglo no puede contener datos del tipo estructura.

5. Una estructura puede ser asignada a otra estructura del mismo tipo.

9.3 Para las siguientes definiciones de tipos:


struct estr1 {
int campo1;
char campo2,campo3;
int campo4[10];
};
struct estr2 {
struct estr1 camp1;
int camp2;
};
y las siguientes declaraciones de variables:
74 Lenguaje C

struct estr2 e,arrE[20];


struct estr1 e1;
decir el tipo de las expresiones que se dan a continuacin
1. arrE[5]

2. e[0].camp1

3. arrE[1].camp1.campo1

4. e[5].camp2

5. arrE[0].camp1.campo4

6. arrE[0].camp1.campo4[8]

7. e1.campo4

8. e1.campo3

9.4 Definir un tipo de datos que permita guardar informacin sobre pacientes de un hospital. De los pacientes, interesa conocer:
su nombre (que tendr hasta 15 letras), su cdula (de 7 dgitos), su edad (un nmero entero) y su fecha de nacimiento. Para la
fecha de nacimiento, habr que definir un tipo apropiado que permita manejar da, mes, ao (tres valores enteros)

9.5 Escribir un programa que lea de la entrada una palabra de largo <= 15, la guarde en la estructura palabra que se da a
continuacin y luego la despliegue.
#define N 15
struct palabra {
char pal[N];
int largo;
};
Los campos de la estructura se utilizan del siguiente modo:
1. pal es un arreglo que contiene las letras de la palabra

2. largo es un entero que indica el largo de la palabra leda

9.6 Los nmeros complejos tienen dos componentes: una parte real y una parte imaginaria, cada una de las cuales se representa
mediante un nmero real. La siguiente estructura es til para representar nmeros complejos:
struct complejo {
float real,imag;
};
Escriba dos funciones con tres parmetros del tipo complejo (dos por valor y uno por referencia) que lleven a cabo la suma y
la multiplicacin de nmeros complejos. Si re1 e im1 son los componentes del primer nmero complejo y re2 e im2 son los
componentes del segundo nmero complejo, la suma y la multiplicacin de ambos nmeros complejos se calculan del siguiente
modo:
Suma:
re3 = re1 + re2
im3 = im1 + im2

Multiplicacion:
re3 = re1 * re2 - im1 * im2
im3 = im1 * re2 + im2 * re1
75

9.7 Dadas las siguientes constantes y estructuras:


#define MAX_PAL 15
#define CANT_CUR 4

struct C {
char codigo;
int calif;
}

typedef struct C Curso;

struct P {
char letras[MAX_PAL];
int largo;
};

typedef struct P Palabra;

struct E {
Palabra nombre;
int edad;
Curso cursados[CANT_CUR];
};

typedef struct E Estudiante;


Escribir un programa que lea de la entrada una lnea con el nombre de un estudiante, su edad, y los pares cdigo-calificacin
correspondientes a 4 cursos como se muestra en el ejemplo. Los datos ledos deben guardarse en las estructuras dadas.Luego, los
datos deben desplegarse como se muestra en el ejemplo.
Ejemplo de entrada:
pedro/23/p-10,m-12,l-8,a-0/

Ejemplo de salida:
pedro
23
p 10
m 12
l 8
a 0

Das könnte Ihnen auch gefallen