Beruflich Dokumente
Kultur Dokumente
1. Introduccin 2
1.1. Que es una computadora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Lenguajes de Programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
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
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
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.
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
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:
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.
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:
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:
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
Vestirse
Desayunar
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:
Leer datos
Imprimir datos
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.
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.
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:
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
char car;
bool esta;
int entero;
short int edad;
long int precio;
unsigned int edad;
float precio;
double numeroE;
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.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 bool b1,b2; podemos realizar la asignacin b1=!b2 donde ! representa el not.
Ejemplos:
7/4 = 1
7,0/4 = 1,75
7,0/4,0 = 1,75
7 %4 = 3
17 %5 = 2
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)
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)
int c;
c=5;
printf(" %i\n",++c);
printf(" %i\n",c);
printf(" %i\n",-c);
15
Ejemplos:
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
num1 = 7;
num2 = Num1
return 0;
}
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:
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.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.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
Podemos anidar estructuras if e if/else. Esto ocurre cuando una de las sentencias a ejecutar en un if es otro if. Por
ejemplo:
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;
}
#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
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.
#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.
#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
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.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
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.
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:
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.
3. El incremento (o decremento) con el cual, cada vez que se termine un ciclo la variable de control ser modifica-
da.
#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.
#include <stdio.h>
int main(){
int contador;
for (contador=1;contador<=10;contador++){
printf (" %d",contador);
}
return 0;
}
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:
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:
Podemos anidar estructuras if e if/else. Esto ocurre cuando una de las sentencias a ejecutar en un if es otro if. Por
ejemplo:
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;
}
#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
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.
#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.
#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
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.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:
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.
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
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.
#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.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];
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
Lee de la entrada standar un entero de N dgitos que contiene un nmero representado en una base entre 2 y 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
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
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:
El resultado se regresa a la funcin printf en main donde se llamo a cuadrado y printf despliega el resultado.
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
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.
Observemos que:
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>
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;
}
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>
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
}
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.
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.
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.
Adems, el valor de la expresin debe coincidir con el tipo de dato declarado en el prototipo de la funcin.
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.
void imprime_linea(){
printf ("Esta funcion solo imprime esta linea");
}
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.
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()
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;
}
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;
}
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.
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
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.
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;
}
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.
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.
7.8 Para cada uno de los siguientes problemas, escriba el cabezal de la funcin ms apropiada para resolverlo
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
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.
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
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
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);
}
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
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 &.
struct ConjuntoPersonas {
char nombre[50];
char apellido[50];
int edad;
};
/*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.2 Ejercicios
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;
}
5. Una estructura puede ser asignada a otra estructura del mismo tipo.
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
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
struct C {
char codigo;
int calif;
}
struct P {
char letras[MAX_PAL];
int largo;
};
struct E {
Palabra nombre;
int edad;
Curso cursados[CANT_CUR];
};
Ejemplo de salida:
pedro
23
p 10
m 12
l 8
a 0