Transcript
5/25/2018 Aaa - Clases 2013
1/103
Apuntes de la clase de Programacin Fecha: 1 de febrero de 2013
MSc. Jos Colbes
Bibliografa:
"THE C PROGRAMING LANGUAGE" Kernighan y Ritchie - Prentice-Hall, Segunda Edicin.
FUNDAMENTOS DE PROGRAMACIN: ALGORITMOS, ESTRUCTURAS DE DATOS YOBJETOS" Luis Joyanes Aguilar - McGraw-HillCuarta Edicin
CMO PROGRAMAR EN C/C++ Y JAVA Deitel Prentice-HallCuarta Edicin.Algoritmos, programas y lenguajes de programacin
Algoritmo: (del griego y latn, dixit algorithmus y este a su vez del matemtico persa Al-Juarismi,
siglo IX). Enunci paso a paso las reglas para ejecutar las operaciones bsicas en matemticas.
Algoritmo: Conjunto de pasos para resolver un problema. Un algoritmo es un procedimientocomputacional bien definido que toma un conjunto de valores como entrada y produce un
conjunto de valores como salida.
Caractersticas de un algoritmo
Preciso: indicar el orden de realizacin en cada paso. Definido: si se sigue dos veces, obtiene el mismo resultado cada vez (dudoso) Finito: tiene un fin. Tiene un nmero determinado de pasos.
Ejemplos de algoritmos de la vida cotidiana
Suma de dos nmeros enteros Recetas de cocina Cambiar la rueda de un auto
- Aflojar los tornillos de la rueda pinchada
- Levantar el auto hasta que la rueda pueda girar libremente
- Quitar los tornillos y la rueda pinchada
- Colocar la rueda de repuesto y los tornillos
- Bajar el auto
- Apretar los tornillos
Formas de expresin de un algoritmo
Lenguaje naturalEjemplo: verificar si un nmero X es primo.
El algoritmo ms sencillo que puede utilizarse para saber si un nmeroXes primo es el siguiente:
se divideXentre 2,3,4,5,...,X-1. Si X es divisible por alguno de ellos, no es un nmero primo.
FrmulasEjemplo: Hallar las races de
( )
( )
5/25/2018 Aaa - Clases 2013
2/103
Diagramas de flujo
PseudocdigoEjemplo: Suma de dos nmeros
Entrada:a,bnmeros
Salida:s, la suma de a y b
inicio
leer(a,b)
s = a + b
escribir(s)
fin
Programa#include#include
void main()
{
int a, b, s;
printf("Ingrese el primer nmero ");
scanf("%d",&a);
printf("\n\nIngrese el segundo numero ");
scanf("%d",&b);
s=a+b;
printf("\n\nEl resultado de la adicion es: %d",s);
getch();
}
Lenguajes de programacin
Lenguaje de mquina: dependiente del procesador, usa 0 y 1. Lenguajes de bajo nivel: ensamblador. Difcil de aprender y dependiente de la mquina. Lenguajes de alto nivel: C, C++, C#, Java, Pascal, Visual Basic, Fortran, otros. Se asemeja
ms al razonamiento humano.
5/25/2018 Aaa - Clases 2013
3/103
5/25/2018 Aaa - Clases 2013
4/103
Sentencia SI (SimpleDobleAnidamiento)
Diagrama de Flujo
si ( condicion )
{
Instruccin 1
Instruccin 2
sino
Instruccin 3
}
Ejemplo
Determinar si un nmero es par o impar
Anidamiento Ejemplo: Mostrar la calificacin de un alumno a partir del puntaje obtenido en el
examen.
inicio
cls()
imprimir ("Ingrese la nota del alumno: ")
leer (pnt)
si (pnt >= 90)
{
cal = 5
sino si (pnt >= 80)
cal = 4
sino si (pnt >= 70)cal = 3
sino si (pnt >= 60)
cal = 2
sino
cal = 1
}
imprimir(cal)
fin
Estructuras repetitivas
Hay una gran variedad de situaciones que requieren que una o varias
instrucciones se repitan varias veces, ya sean clculos u otro tipo de
instrucciones. Las estructuras repetitivas abren la posibilidad de realizar una
secuencia de instrucciones ms de una vez. Las ms conocidas son:
Mientras (while) Repetir (do-while) Para (for)
Condicin AccionesAcciones
5/25/2018 Aaa - Clases 2013
5/103
Conceptos de bucle (lazo) e iteracin
Un bucle, es una seccin de cdigo que se repite. Es decir cuando se termina de ejecutar la ltima
instruccin del conjunto, el flujo de control retorna a la primera sentencia y comienza una nueva
repeticin de las sentencias que forman esa seccin de cdigo. Se denomina iteracin al hecho de
repetir la ejecucin de una secuencia de acciones, la iteracin se asocia a un nmero entero que
indica el nmero de veces que se repite un trozo de cdigo.
MientrasSintaxis
mientras(condicion)
{
instrucciones
}
RepetirSintaxis
repetir
{
instrucciones} hasta(condicin)
Para (o Desde)Sintaxis
paravar_control = valor_inicio hastavalor_fin [increment o paso]
{
instrucciones
}
Ejercicios
1. Escribir un algoritmo que obtenga el permetro y rea de un rectngulo, dados la base y laaltura del mismo.
2. Se desea obtener el salario de un trabajador conociendo la cantidad de horas trabajadas,el salario por hora y la tasa de impuesto (%) que se aplica como deduccin.
3. Desarrollar un algoritmo que permita leer dos valores distintos, determinar cual de los dosvalores es el mayor y escribirlo.
4. Desarrollar un algoritmo que permita leer tres valores y almacenarlos en las variables A, By C, respectivamente. El algoritmo debe imprimir el mayor de los valores.
5. Desarrollar un algoritmo que realice la sumatoria de los nmeros enteros comprendidosentre el 1 y el 10, es decir, 1 + 2 + 3 + . + 10.
6. Describir un algoritmo que permita intercambiar los valores de las variables A y B, a travsde una variable AUX.7. Supongamos que se proporciona una secuencia de N nmeros, tales como:
Mediante el contador CON, contar e imprimir el nmero de ceros de la secuencia.
8. Escribir un algoritmo que calcule el promedio de N nmeros.9. Dado un nmero natural , desarrolle un algoritmo que calcule la sumatoria y el promedio
de los nmeros menores a y que sean mltiplos de 3.
5/25/2018 Aaa - Clases 2013
6/103
10.Realizar la divisin entre 2 nmeros naturales ( y ) por restas sucesivas, y mostrar elcociente y el resto de la divisin.
11.Desarrolle un algoritmo que permita determinar a partir de un nmero de das (ingresadopor pantalla), los aos, meses, semanas y das que constituyen el nmero de das
proporcionado.
12. Ingresar nmeros por teclado hasta obtener uno que sea positivo e imprimirlo.13.Calcular el factorial de un nmero N.
Estructuras de datos
Hasta ahora slo hemos trabajado con variables simples, que nicamente pueden almacenar un
dato. Por ejemplo, al trabajar con listas de nmeros (calificaciones de alumnos de una misma
clase, trabajadores de una empresa, serie de nmeros enteros, etc.), su manejo con variables
simples puede ser un poco imprctico, adems de no considerar el almacenamiento de las
entradas.
Pregunta 1:Cmo podramos ordenar nmeros utilizando variables simples?
Pregunta 2:Cmo saber la cantidad de alumnos con notas mayor al promedio de la clase?
Para salvar estas situaciones, la mayora de los lenguajes de programacin incluyen caractersticas
de estructuras de datos. Una estructura de datos es una coleccin de datos que pueden ser
caracterizados por su organizacin y las operaciones que se definen en ella.
Las estructuras de datos bsicasque soportan la mayora de los lenguajes son los arreglos(arrays)
(siendo el vectorun arreglo de una dimensin, y la matrizuno de dos dimensiones). Se dividen en:
Estticas (tamao definido de antemano): arreglos, registros, cadenas Dinmicas (no tiene limitaciones de tamao): listas (pilas/colas), listas enlazadas, rboles,
grafos.
Un arreglo es una secuencia de posiciones de la memoria central a las que se puede acceder
directamente, que contiene datos del mismo tipo y pueden ser seleccionados individualmente
mediante el uso de subndices.
Podemos considerar al vector como un conjunto de variables simples con datos del mismo tipo.
Ejemplo de vector: Notas de una clase
Nota 1 Nota 2 Nota 3 Nota Nota
El vector notatiene subndices o ndices de sus elementos (1, 2, , , , ) que indican la posicinde un elemento particular dentro del arreglo. Por ejemplo, si se desea modificar el tercer
elemento de un vector de tipo numrico:
nota[3] = 80
Nombre del vector Posicin del elemento
5/25/2018 Aaa - Clases 2013
7/103
Matrices
La matriz puede verse como un vector de vectores. Por ello, se necesita especificar dos subndices
para poder identificar cada uno de sus elementos.
Nombre de la matrizFila
Columna
5/25/2018 Aaa - Clases 2013
8/103
Apuntes de la clase de PED 2 Fecha: 15 de febrero de 2012
MSc. Jos Colbes
Lenguaje C
C es un lenguaje de programacin de propsito general. Se lo ha asociado estrechamente con el sistema
operativo UNIX (donde se desarroll), ya que tanto el sistema y la mayora de los programas que se ejecutan en
l estn escritos en C. El lenguaje, sin embargo, no est ligado a ningn sistema operativo o mquina, y aunque
se lo ha llamado lenguaje deprogramacin del sistema, porque es til para escribir compiladores y sistemas
operativos; se ha utilizado tambin para escribir programas importantes en muchos mbitos diferentes.
Se ha creado en 1972 por Brian W. Kernighan y Dennis M. Ritchie en los Laboratorios Bell como evolucin del
anterior lenguaje B, a su vez basado en BCPL.
Se trata de un lenguaje fuertemente tipificado de medio nivel pero con muchas caractersticas de bajo nivel.
Dispone de las estructuras tpicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del
lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que
posibilitan mezclar cdigo en ensamblador con cdigo C o acceder directamente a memoria o dispositivos
perifricos. (Wikipedia)
Empezando en C
#include main(){
printf("hello, world\n");}
Este programa imprimir a la salida:
Esquema bsico de un programa:
directivasmain(){
declaracionesinstrucciones
.}funciones(){
}
Algunas observaciones:
stdio.h (Standard input/output) es la librera principal en C, con funciones bsicas de entrada/salida. Cuando en un archivo .c se encuentra una lnea con un #include seguido de un nombre de archivo, el
preprocesador la sustituye por el contenido de ese archivo.
La funcin main es la principal (el programa se ejecuta al comienzo de la misma). Un mtodo de comunicacin de datos entre funciones es que la funcin que llama proporcione una
lista de valores, llamados argumentos, a la funcin llamada. Los parntesis que van despus del
nombre contienen la lista de argumentos. En este ejemplo, mainse define como una funcin que no
espera argumentos, lo cual est indicado por la lista vaca ().
Las sentencias de una funcin estn encerradas por llaves {}. Una funcin es llamada por su nombre, seguido por una lista de argumentos entre ():
o Por ejemplo, se llama a printf con el argumento hola mundo!!\n. El fin de una instruccin lleva un punto y coma ; La secuencia \n indica un salto de lnea. Representa un solo carcter y se denomina secuencia de
escape, que son caracteres invisibles o difciles de escribir.
5/25/2018 Aaa - Clases 2013
9/103
Funcin printfSecuencias de escape
Tipos de datos
char: un byte, capaz de almacenar un carcter. int: un entero, tpicamente refleja el tamao natural de los enteros de la mquina que ejecuta el programa. float: punto flotante de precisin simple. double: punto flotante de alta precisin.
5/25/2018 Aaa - Clases 2013
10/103
Declaraciones y asignaciones
int a=5; char b=a;char b=97; float f=2.45;
int d=05; (un cero antes del nmero indica que es el valor octal) int e=0xD; (el 0x 0X indica que se tiene un valor hexadecimal)
Obs1: para operaciones con caracteres, se debe manejar el cdigo de representacin (por ejemplo, tabla
ASCII). Por ejemplo, no es lo mismo el entero 9 que el carcter 9.
Obs2: en el lenguaje C no existen las cadenas como tipo de dato.
Reglas para los identificadores (ANSI C):
1. Un identificador se forma con una secuencia de letras (minsculas de la a a la z; maysculas de la A a laZ; y dgitos del 0 al 9).
2. El carcter subrayado o guin bajo (_) se considera como una letra ms.3. Un identificador no puede contener espacios en blanco, ni otros caracteres distintos de los citados,
como por ejemplo (*,;.:-+, etc.).
4. El primer carcter de un identificador debe ser siempre una letra o un (_), es decir, no puede ser undgito.
5. Se hace distincin entre letras maysculas y minsculas. As, Masa es considerado como unidentificador distinto de masa y de MASA.
6. ANSI C permite definir identificadores de hasta 31 caracteres de longitud.Ejemplos de identificadores vlidos son los siguientes:
tiempo, distancia1, caso_A, PI, velocidad_de_la_luzPor el contrario, los siguientes nombres no son vlidos (Por qu?)
1_valor, tiempo-total, dolares$, %finalEjemplo 2
#includemain(){
int a;a=3;printf(%d\n);
}
Opciones para printf
%d: despliega el valor entero %c: despliega el carcter correspondiente al valor. %f: despliega en formato de punto flotante. %lf: despliega en formato double. %.2f: despliega en formato de punto flotante con 2 decimales (el 2 puede ser cualquier nmero
contemplado en la precisin del tipo de dato)
Ejercicio: escribir un programa que permita asignar valores enteros a 2 variables y que calcule e imprima por
pantalla el producto de ambos.
#includemain(){
int a,b,c;
a=3;b=4;c=a*bprintf(%d\n,c);
}
#includemain(){
int a,b,c;
a=3; b=4;printf(%d\n,c=a*b);
}
Para tener en cuenta: supongamos que F es un entero que indica la temperatura en grados Fahrenheit, y
queremos transformarla en grados Celsius, almacenando el valor en el entero C. Son equivalentes las
siguientes expresiones?:
C=5*(F-32)/9; C=5/9*(F-32)
5/25/2018 Aaa - Clases 2013
11/103
Funciones
Ejemplo: escribir un programa que sume dos nmerosxe y.
#includeint suma(int,int);main(){
int a,b,c;a=3; b=5;c=suma(a,b);printf(%d\n,c);
}int suma(int x, int y){
return (x+y);}
#includeint suma(int x, int y){
return (x+y);
}main(){
int a,b,c;a=3; b=5;c=suma(a,b);printf(%d\n,c);
}
Una funcin tiene el siguiente formato:tipo_devuelto nombre_funcion(declaracin de parmetros, si los hay){
DeclaracionesSentenciasreturn expresion;
}
Introduccin de datos por teclado
getchar()Permite la introduccin de un carcter por teclado, est incluida en stdio.h. Un aspecto importante es que se
toma el enter como un carcter.int a,b;a=getchar();b=getchar();printf(%c %c,a,b);
getch() y getche()Estn incluidos en conio.h (Console input and output). Introducen caracteres sin la necesidad de un enter al
final. La diferencia entre ambas es que con getch() lo ingresado por teclado no aparece en pantalla, pero con
getche() s.
scanf()Es anlogo a printf, y se encuentra en stdio.h. La forma general de esta funcin es la siguiente:
int scanf("%x1%x2...", &arg1, &arg2, ...);
Ejemplo:
int a;
scanf(%d,&a);
printf(%d,a);
Variables globales y locales
#includeint cuad(int);main(){
int a;scanf(%d,&a);printf(%d\n,cuad(a));
}int cuad(int a){
return (a*a);}
#includevoid cuad();int a;main(){
scanf(%d,&a);cuad();printf(%d\n,a);
}void cuad(){
a=a*a;}
5/25/2018 Aaa - Clases 2013
12/103
5/25/2018 Aaa - Clases 2013
13/103
Reglas de precedencia y asociatividad
Ejercicios
Luego de ingresar el radio por teclado, hallar la ca y el rea del crculo. Realizar un programa que permita la introduccin por teclado (mediante getchar) de un valor entero de
una cifra y que calcule e imprima por pantalla el cuadrado del mismo.
5/25/2018 Aaa - Clases 2013
14/103
Apuntes de la clase de PED 2 Fecha: 22 de febrero de 2012
MSc. Jos Colbes
Pginas interesantes:
Stackoverflow (http://stackoverflow.com/): comunidad donde se puede encontrar mucha informacinsobre varios algoritmos y lenguajes.
ACM-ICPC Live Archive (https://icpcarchive.ecs.baylor.edu/): Repositorio que contiene una variedad deproblemas que aparecieron en las olimpiadas de programacin de la ACM (Association for ComputingMachinery) Tienen jueces virtuales para verificar las soluciones a los problemas. Las olimpiadas secentran en el diseo de algoritmos para los problemas planteados en las competencias; pudindoseemplear C, C++ y Java.
SPOJ (http://www.spoj.com/): lo mismo que lo anterior. Ahmed-Aly (http://ahmed-aly.com/): sitio donde se realizan competencias virtuales de programacin
(o bien entrenamientos), usando los repositorios de problemas antes mencionados (y otros ms).
Estructuras selectivas
En C las sentencias se ejecutan sucesivamente una tras otra. Esto define un camino que va desarrollado elprograma. Sin embargo, habr momentos en que el programa deba ejecutar determinadas partes dependiendodel estado en el que se halle el programa o de las variables externas. Para ello pueden utilizarse las sentenciascondicionales o incondicionales.
Una sentencia condicionales una instruccin o grupo de instrucciones que se pueden ejecutar o no, en funcindel valor de una condicin.
Las sentencias que se ejecutan de formaincondicionalson: break, continue, gotoy return.
Bifurcaciones condicionales (if)
La sentencia ifadmite dos tipos de sintaxis:
if(expresin)sentencia1;
if(expresin)sentencia1;
elsesentencia2;
Permite tomar decisiones al programa. En su primera forma, la sentencia1slo se ejecuta si el resultado deevaluar la expresin es verdadero (distinto de cero). En la segunda forma, tenemos dos posibilidades: si al
evaluar la expresin el resultado es verdadero se ejecuta la sentencia1, pero si el resultado es falso seejecuta la sentencia2. En cualquier caso slo una de las dos sentencias se ejecuta.
Por ejemplo:
if(numero1==1)printf(la variable numero1 vale 1);
elseprintf(la variable numero1 no vale 1);
Tras evaluarse la expresin ify ejecutarse la sentencia adecuada, el programa contina con la lnea siguiente
a la de la ltima sentencia del if. Como sentencia vale cualquier tipo de sentencia vlida en C, entre ellas lapropia sentencia if.
En este caso hablaremos de sentencias ifanidadas. Por ejemplo:
if(num>0)if(num==1)
printf(num es igual a 1);else
printf(num es mayor que 1);else
printf(num es menor que 1);
5/25/2018 Aaa - Clases 2013
15/103
Cuando hay dos if anidados y a continuacin hay un else, ste pertenece al ltimo if. As en el caso
anterior el primer elsecorresponde al segundo if. Si queremos que un elsepertenezca al primer ifde un
ifanidado deberemos encerrar al segundo entre llaves. Por ejemplo:
if(num>=0){
if(num==1)
printf (num es igual a 1);}else
printf(num es menor que 0);
Cuando necesitamos ejecutar varias sentencias que dependen de un if, utilizaremos los bloques desentencias. Un bloque de sentencias es un grupo de sentencias encerradas entre llaves { y }. Por ejemplo:
if (num 0){printf(num %d \n);if (num>=0)
printf(num igual a 0);if (num>=1)
printf(num mayor o igual a 1);}
Ejemplo
Determinar si un nmero es par o impar
/*Ejercicio que seala siun numero ingresado por teclado es par o impar*/#include
main(){int a,b;printf("Ingrese el nro:\n");scanf("%d",&a);if((a%2)==0) //Condicion para que el numero sea par
printf("El numero es par\n");else
printf("El numero es impar\n");}
Obs:Los comentarios son partes del cdigo ignorados por el compilador, slo sirven para orientar alprogramador o a otra persona que lee el cdigo. Puede sealarse mediante /* */ y // (este ltimo slo sirvepara una lnea)
Anidamiento Ejemplo:Mostrar la calificacin de un alumno a partir del puntaje obtenido en el examen.
#includemain(){
int nota, cal;printf("Ingrese la nota:\n");scanf("%d",¬a);if(nota>=90) cal=5;else if(nota>=80) cal=4;
else if(nota>=70) cal=3;else if(nota>=60) cal=2;else cal=1;printf("\nLa calificacion es: %d\n",cal);
}
5/25/2018 Aaa - Clases 2013
16/103
Estructuras repetitivas
Hasta ahora se ha trabajado con instrucciones de entrada, salida, expresiones y operadores; asignaciones,instrucciones secuenciales y de seleccin. Hay una gran variedad de situaciones que requieren que una o variasinstrucciones se repitan varias veces, ya sean clculos u otro tipo de instrucciones. Las estructuras repetitivasabren la posibilidad de realizar una secuencia de instrucciones ms de una vez.
Estructura genrica Repetir - Formato
repetir
instruccin 1instruccin 2 En algn punto debe haber un criterio de parada o finalizacininstruccin n
fin_ repetir
Estructuras repetitivas
Mientras (while) Repetir (do-while) Desde (for)
Conceptos de bucle (lazo) e iteracin
Un bucle, es una seccin de cdigo que se repite. Es decir cuando se termina de ejecutar la ltima instruccindel conjunto, el flujo de control retorna a la primera sentencia y comienza una nueva repeticin de lassentencias que forman esa seccin de cdigo. Se denomina iteracin al hecho de repetir la ejecucin de unasecuencia de acciones, la iteracin se asocia a un nmero entero que indica el nmero de veces que se repiteun trozo de cdigo.
El bucle while
El bucle whilees el tipo de bucle ms sencillo. Admite la siguiente sintaxis:
while(expresin)sentencia;
El bucle whilecomienza por evaluar la expresin. Si es cierta, se ejecuta la sentencia. Entonces se vuelve aevaluar la expresin. De nuevo, si es verdadera, se vuelve a ejecutar la sentencia. Este proceso contina hastaque el resultado de evaluar la expresin es falso. Por esto se le llama a esta expresin la condicin de salida.
Normalmente, en las sentencias del bucle whilese coloca alguna instruccin que modifique la expresin decontrol. Lo ms habitual es utilizar un bloque de sentencias en vez de una sentencia nica. Por ejemplo:
int variable=10;while(variable>1){
printf(la variable vale %d \n, variable);variable=variable-1;printf(valor tras decrementar la variable %d\n, variable);
}
Ejemplo 1
Dado un nmero natural , desarrolle un algoritmo que calcule la sumatoria y el promedio de los nmerosmenores a y que sean mltiplos de 3.#includeint main(){
int n,i=1,sum=0,cont=0;float prom;printf("\nIngrese el numero: ");scanf("%d",&n);while(i
5/25/2018 Aaa - Clases 2013
17/103
else{printf("\nEl nro ingresado es menor que 4");
}return 0;
}
Ejemplo 2
Desarrolle un algoritmo que permita determinar a partir de un nmero de das (ingresado por pantalla), losaos, meses, semanas y das que constituyen el nmero de das proporcionado.
#includeint main(){
int dias,meses=0,anhos=0,semanas=0;printf("Ingrese el numero de dias: ");scanf("%d",&dias);while(dias>=365){
dias-=365;anhos++;
}while(dias>=30){
dias-=30;meses++;}while(dias>=7){
dias-=7;semanas++;
}printf("\nLa cantidad de anhos es: %d",anhos);printf("\nLa cantidad de meses es: %d",meses);printf("\nLa cantidad de semanas es: %d",semanas);printf("\nLa cantidad de dias es: %d",dias);return 0;
}
Ejemplo 3
Validacin de datos
Ingresar un nmero positivo
#includeint main(){
int n;printf("\nIngrese un numero positivo: ");scanf("%d",&n);while(n1);
5/25/2018 Aaa - Clases 2013
18/103
Ejemplo 1Validacin de datos
Ingresar un nmero positivo
#includeint main(){
int n;do{
printf("\nIngrese un numero positivo: ");scanf("%d",&n);}while(n
5/25/2018 Aaa - Clases 2013
19/103
5/25/2018 Aaa - Clases 2013
20/103
5/25/2018 Aaa - Clases 2013
21/103
Bifurcacin mltiple: SWITCH
Esta sentencia sirve para agrupar varias sentencias ifen una sola, en el caso particular en el que una variablees comparada a diferentes valores, todos ellos constantes, y que realiza acciones si coincide con ellos. Susintaxis es:
switch(control){case expresion1_const:
sentencia1;break;
case expresion2_const:sentencia2;break;
default:sentencia0;break;
}
Primero se evala la expresin de control. A continuacin se compara con la expresin de la primera etiqueta case. Si son iguales, se ejecuta la
sentencia1.
Luego se vuelve a comparar la expresin de control con la etiqueta del segundo case. De nuevo, si soniguales, se ejecuta la sentencia2.
Se repite el proceso hasta agotar todas las etiquetas case. Si al llegar a la etiqueta defaultno se haejecutado ninguna otra sentencia sta es la accin por defecto. La etiqueta defaultes opcional, si nola ponemos el programa simplemente salta a la lnea siguiente.
Ejemplo:#include
int main(){int num;printf("\nIngrese un numero: ");scanf("%d",&num);switch(num){
case 1:printf("Es un 1\n");break;
case 2:printf("Es un 2\n");break;
case 3:printf("Es un 3\n");
break;default:printf("No es ni 1, ni 2, ni 3\n");
}return 0;
}
5/25/2018 Aaa - Clases 2013
22/103
Lista de ejercicios sobre estructuras de decisin
1) Indicar con un mensaje si un ngulo ingresado en grados es o no recto.2) Escribir un programa que permita ingresar un carcter e indique si es una letra o no.3) Escribir un programa que permita recibir un carcter y que devuelva su mayscula en caso de tratarse
de un carcter alfabtico, o que devuelva el mismo carcter en caso contrario.4) Dados los valores a, b y c; indicar si pueden ser los lados de un tringulo.5) Dados cinco nmeros, calcular su promedio.6) Dados dos valores a y b, indicar a travs de un mensaje cul de los 2 es el mayor (Ej: El mayor es a).
En caso de que sean iguales, indicarlo a travs de un mensaje.7) Dados tres nmeros, indicar cul es el central.8) Calcular la raz cuadrada de un nmero y escribir su resultado.9) Determinar el precio de un billete de ida y vuelta en tren, conociendo la distancia a recorrer y sabiendo
que si el nmero de das de estancia es superior a 7 y la distancia superior a 800 kilmetros, el billetetiene una reduccin del 30%. El precio por kilmetro es de 250 guaranes.
10)Escribir un programa que, dados dos nmeros a y b, indique si uno es divisor del otro.11)Escribir un programa que, dado un ngulo en grados, indique si es recto, agudo u obtuso.12)Escribir un programa que acepte dos nmeros reales y un cdigo de seleccin. Si el cdigo de seleccin
es 1, entonces el programa suma los dos nmeros introducidos previamente y se visualiza el resultado;si el cdigo de seleccin es 2, los nmeros deben ser multiplicados y visualizado el resultado; y si elcdigo seleccionado es 3, el primer nmero se debe dividir por el segundo nmero y visualizarse elresultado.
13)Si los das LUN-DOM se ingresan de forma numrica (del 1 al 7), devolver el nombre del dacorrespondiente. Si el nmero es invlido, indicarlo con un mensaje.
14)Disear un programa que acepte las coordenadas x,y de un punto. Indicar con un mensaje si estdentro o no de la circunferencia (Obs: un punto en el borde se considera como interior).Tambin se debe indicar si est por encima, por debajo, o es un punto de la recta .
15)Los empleados de una fbrica trabajan en dos turnos: diurno y nocturno. Se desea calcular el jornaldiario de acuerdo a los siguientes puntos:
La tarifa de las horas diurnas es de 10.000 Gs La tarifa de las horas nocturnas es de 20.000 Gs Si es un domingo, el jornal aumenta en un 25%.
Para un trabajador considerado, se ingresan como entradas el da de la semana en la que trabaj (del 1
al 7, donde 7 es domingo), la cantidad de horas trabajadas en el turno diurno, y la cantidad de horastrabajadas en el turno nocturno. Se debe retornar el jornal que le corresponde.
16)Escribir un programa que calcule las races de la ecuacin , sean stas reales oimaginarias.
17)Disear un algoritmo que resuelva el sistema de ecuaciones de la forma:Indicar si existe una solucin nica, no tiene solucin o tiene infinitas soluciones
18)Escribir un programa que indique si el ao introducido es bisiesto o no.19)Disear un programa en el que se ingresan tres variables: DIA, MES y AO (en forma nmerica); y
devuelva la fecha del da siguiente (en formato DIA/MES/AO). Se deben considerar los aos bisiestos,cantidad de das de cada mes, etc. En caso de insertar nmeros reales o fechas invlidas, indicar con unmensaje.
Lista de ejercicios sobre estructuras de repeticin
1) Dado un nmero natural , desarrolle un algoritmo que calcule la sumatoria y el promedio de losnmeros menores a n y que sean mltiplos de 3.
2) Realizar la divisin entre 2 nmeros naturales (y ) por restas sucesivas, y mostrar el cociente y elresto de la divisin.
3) Desarrolle un algoritmo que permita determinar a partir de un nmero de das (ingresado por teclado),los aos, meses, semanas y das que constituyen el nmero de das proporcionado. Se supone que unao siempre tiene 360 das, y que un mes tiene 30 das.
4) Asegurndose de que el nmero ingresado sea un nmero natural, calcular el factorial de dichonmero.
5) Extrado de http://en.wikipedia.org/wiki/Bizz_buzz: Imprimir en pantalla los nmeros comprendidosentre 1 y 100. Pero para los mltiplos de 3, imprimir Fizz en lugar del nmero, mientras que para losmltiplos de 5 se imprime Buzz en lugar del nmero. Si el nmero es mltiplo de 3 y de 5, mostrar
Fizzbuzz en lugar del nmero.6) Calcular el producto de todos los nmeros primos comprendidos entre 2 y .7) Una empresa consta de empleados. A fin de mes, se debe hacer una liquidacin de los sueldos de los
mismos. Para ello, se debe disear un algoritmo que (en cada paso) lea los sueldos brutos de los
http://en.wikipedia.org/wiki/Bizz_buzzhttp://en.wikipedia.org/wiki/Bizz_buzz5/25/2018 Aaa - Clases 2013
23/103
empleados, y devuelva el sueldo neto aplicando un descuento de 9% para IPS y 16% para jubilacin.Por disposicin de la gerencia, tambin se desea conocer la diferencia entre el mayor y el menor sueldoneto.
8) Calcule e imprima:
9) Calcular el mximo comn divisor (MCD) de dos nmeros A y B (usando el algoritmo de Euclides).10)Disee un programa que acepte un nmero y muestre los primeros elementos de la sucesin: 11)Dado un nmero , imprimir en pantalla sus divisores.12)Realice un programa para encontrar los 100 primeros nmeros perfectos. Un nmero es perfecto
cuando la suma de sus divisores (sin contar el mismo nmero) es igual al mismo nmero. Por ejemplo:6 = 1+2+3.
13)Dado un nmero , imprimir una tabla de multiplicar de la siguiente manera:* 1 2 1 1 2 *12 2 4 *2
1* 2* *Obs:Recordar que las tabulaciones se realizan con \t y los saltos de lnea con \n.
14)Escribir un programa que, al ingresar un nmero entero (sea positivo o negativo), devuelva el nmeroen orden inverso. Ej: -375-573
15)Dado un nmero entero con un nmero par de dgitos, escribir un programa que muestre el nmerocon cada par de dgitos intercambiado. Por ejemplo: si =654321 se debe mostrar 563412.
16)Dado un nmero , imprimir en pantalla sus factores primos de la siguiente manera (ejemplo, 150):
17)Calcular el ensimo trmino de la serie de Fibonacci () definida por:
18)Dado un valor como entrada, calcular el menor valor de tal que se cumpla:
19)Leer un nmero y disear un programa que calcule:
20)Una maestra desea obtener las estadsticas acerca del rendimiento de sus alumnos en la materia. Paraello, se debe disear un algoritmo que lea las notas (nmeros entre 1 y 100) y calcule:
La mejor nota
La peor nota La media de las notas. La cantidad de alumnos que aprueban y reprueban, considerando que se aprueba la materia
con una calificacin de 60 o ms.El algoritmo finaliza cuando una nota ingresada sale fuera del rango.
21)Escribir un algoritmo que permita saber la cantidad de das entre 2 fechas cualesquiera.22)Un comercio dispone de dos tipos de artculos en fichas correspondientes a diversas sucursales con los
siguientes campos:
Cdigo del artculo (A o B) Precio unitario del artculo Nmero de artculosLa ltima ficha del archivo de artculos tiene un cdigo de artculo, una letra X. Se pide: El nmero de artculos existentes en cada categora. El importe total de los artculos de cada categora.
23)Una estacin climtica proporciona un par de temperaturas diarias (mxima, mnima). Ninguna de lastemperaturas debera ser igual a 9 grados. El algoritmo finaliza cuando se ingrese 0,0. Se pidedeterminar el nmero de das cuyas temperaturas se han proporcionado; las medias mxima y mnima,el nmero de errores (temperaturas de 9 grados) y el porcentaje que representan en relacin al totalde valores de temperaturas consideradas.
24)Se desea conocer una serie de datos de una empresa con 50 empleados, conociendo su edad y salario: Cuntos ganan ms de 5.000.000 Gs?
5/25/2018 Aaa - Clases 2013
24/103
Cuntos ganan entre 2.500.000 y 5.000.000 Gs? Cuntos ganan menos que 2.500.000? Cuntos empleados mayores a 50 aos estn en la empresa y cul es la media de sus salarios?
25)Existe un juego llamado Adivina mi nmero, el cual consiste en que un nio trata de adivinar elnmero (entero, y entre 1 y 100) pensado por el otro nio. Las reglas del juego son las siguientes:
El nio pregunta al otro si un nmero que dice es el pensado por el segundo.
Si el nmero es correcto, el primer nio gana el juego. Si no lo acierta, el segundo nio debeindicarle si el nmero es mayor o menor del que pens. El primer nio tiene 10 oportunidadespara adivinar el nmero, y si no lo hace, el juego es ganado por el segundo.
El algoritmo debe indicar el ganador del juego.Obs: en este problema, el segundo nio es la computadora (el nmero puede ser generadoaleatoriamente o predeterminado por el programador); mientras que el usuario es el primer nio.
Algunos ejercicios de la primera parte.
Problema 3#includechar mayusculas(char c);
int main(){char c;printf("Ingrese el caracter: \n");scanf("%c",&c);c=mayusculas(c);printf("El nuevo caracter es: %c",c);return 0;
}
char mayusculas(char c){if((c>='a')&&(c
5/25/2018 Aaa - Clases 2013
25/103
else prom=-1; //esto indica que no se puede hallar el promedioprintf("\nLa suma es: %d",sum);printf("\nEl promedio es: %.2f\n",prom);return 0;
}
Problema 2#include
int main(){int a,b,c=0;printf("Ingrese el valor de a: ");scanf("%d",&a);printf("\nIngrese el valor de b: ");scanf("%d",&b);while(a>b){
c++;a-=b;
}printf("\nEl cociente es: %d",c);printf("\nEl resto es: %d",a);
return 0;}
Problema 4#includelong long factorial(int n);
int main(){double n;long long m;int c;printf("\nIngrese el numero: ");scanf("%lf",&n);
while(n!=((int) n)){printf("\nIngrese un numero natural: ");scanf("%lf",&n);
}m=factorial(n);printf("\nEl resultado es: %lld",m);return 0;
}
long long factorial(int n){int i;long long prod=1;for(i=2;i
5/25/2018 Aaa - Clases 2013
26/103
5/25/2018 Aaa - Clases 2013
27/103
Apuntes de la clase de PED 2 Fecha: 1 de marzo de 2013
MSc. Jos Colbes
Estructuras de datos
Hasta ahora slo hemos trabajado con variables simples, que nicamente pueden almacenar un dato (sea ste
numrico o caracter). En ejercicios anteriores, hemos trabajado con listas de nmeros (calificaciones de
alumnos de una misma clase, trabajadores de una empresa, serie de nmeros enteros, etc.); y su manejo con
variables simples puede ser un poco imprctico, adems de no considerar el almacenamiento de las entradas.
Pregunta:Cmo podramos ordenar nmeros utilizando variables simples?
Para salvar estas situaciones, la mayora de los lenguajes de programacin incluyen caractersticas de
estructuras de datos. Una estructura de datos es una coleccin de datos que pueden ser caracterizados por su
organizacin y las operaciones que se definen en ella.
Las estructuras de datos bsicasque soportan la mayora de los lenguajes son los arreglos(arrays) (siendo el
vectorun arreglo de una dimensin, y la matrizuno de dos dimensiones). Se dividen en:
Estticas (tamao definido de antemano): arreglos, registros, cadenas Dinmicas (no tiene limitaciones de tamao): listas(pilas/colas), listas enlazadas, rboles, grafos.
Un arregloes una secuencia de posiciones de la memoria central a las que se puede acceder directamente, que
contiene datos del mismo tipo y pueden ser seleccionados individualmente mediante el uso de subndices.
Podemos considerar al vector como un conjunto de variables simples con datos del mismo tipo.
Ejemplo de vector: Notas de una clase
Nota 0 Nota 1 Nota 2 Nota Nota
El vector notatiene subndices o ndices de sus elementos (0, 1, 2, , , , ) que indican la posicin de un
elemento particular dentro del arreglo (de tamao ). Por ejemplo, si se desea modificar el tercer elemento de
un vector de tipo numrico:
nota[2] = 80
Nombre del vector Posicin del elemento
La declaracin de un vector en C se hace de la siguiente manera:
int vector[tamao];
Tipo de dato que almacena Nombre del vector
Tamao mximo del vector
Observaciones importantes:el primer elemento se representa por el ndice 0. Si el tamao del vector es ,
entonces el ltimo elemento tiene un ndice .
Declaracin de vectores
tipo nombre_vector[tam];
Es muy similar a la declaracin de las variables simples, pero el tamao del vector va en corchetes luego del
nombre del mismo. El tamao tam debe tener valores asignados previamente (en el caso de que sean
variables), o bien ser constantes.
Lectura de un vector de tamao 5
int a[5];int i;for(i=0;i
5/25/2018 Aaa - Clases 2013
28/103
Si los elementos del vector estn definidos, puede hacerse la siguiente declaracin:
int a[5]={1,2,3,4,5};
Ejemplo 1:realizar un programa que permita leer un vector de nmeros enteros introducidos por teclado y
que calcule e imprima por pantalla la suma de todos sus elementos, el promedio, el mayor y el menor.
#include
int main(){int i,n,max,min,sum=0;float p;printf("Ingrese la cantidad de elementos del vector: ");scanf("%d",&n);int vec[n]; //Se dimensiona el vectorfor(i=0;i
5/25/2018 Aaa - Clases 2013
29/103
5/25/2018 Aaa - Clases 2013
30/103
int atoi(char s[]){
int i=0, n=0, signo=1;while(s[i]==' ') i++; /* se eliminan los espacios en blanco */if ((s[i]=='+')||(s[i]=='-')){ /* se toma el signo */
if(s[i] == '-') signo=-1;i++;
}while(s[i]!='\0'){
n=10*n +(s[i]-'0');i++;
}return (signo*n);
}
Entero a cadena(itoa):#includeint itoa(char s[], int n);
int main(){char s[30];int num;printf("Ingrese el numero: ");scanf("%d",&num);itoa(s,num);puts(s);return 0;
}
int itoa(char s[], int n){
int i=0,d=1,j;if(n=10){
d++;aux/=10;
}for(j=(d+i-1);j>=i;j--){
s[j]=(n%10)+'0';n/=10;
}s[i+d]='\0';
}
Tarea: convertir una cadena a un punto flotante (nmero decimal) y viceversa.
5/25/2018 Aaa - Clases 2013
31/103
Lista de ejercicios sobre vectores
1) Calcular la cantidad de alumnos que obtuvieron nota inferior al promedio del curso en cierta materia. Hay20 alumnos, y todos rindieron. Las notas van del 0 al 100 (se asume que todas las notas son correctas).
2) Se tienen las temperaturas (promedio) de todos los das del mes de febrero de 2012 almacenados en elvector Temp (luego de cargar por teclado). Disear un algoritmo que obtenga las temperaturas mxima,
mnima (e indica los das correspondientes), y el promedio de las que se encuentran entre los das 21 y 27.
3) Disear un algoritmo que obtenga el producto escalar de dos vectores (de enteros) de tamao.4) Se tiene un vector de nmeros binarios de tamao (siendo el mismo un mltiplo de 3). Un ejemplo es el
siguiente:
1 0 1 0 0 0 1 0 0
Disear un algoritmo que cree nuevo vector a partir del vector de entrada, donde despus de cada 3
elementos del vector original, se agregue un elemento que indique la cantidad de 1s en esos tres
elementos. En nuestro caso, la salida sera:
1 0 1 2 0 0 0 0 1 0 0 1
5) Escribir un algoritmo que muestre la cantidad de nmeros positivos, negativos y los ceros de un vector de100 elementos.
6) Calcular la suma y promedio de los valores positivos de un vector de 50 elementos.7) Se dispone de un vector T de n elementos distintos de cero. Crear un nuevo vector en lo que todos sus
elementos resulten de dividir los elementos del vector T por el elemento T[k], siendo k un valor dado.
8) Dado un nmero x, verificar que exista ese valor dentro del vector A e indicar la posicin del elemento. Sino se encuentra, mostrar un mensaje de notificacin.
9) Se tienen dos vectores A y B, donde se indican los promedios de los parciales y notas de los finales de 30alumnos. Segn la siguiente frmula:
Imprimir las calificaciones de los alumnos segn la siguiente escala:
0/59: 1 60/69: 2 70/79: 3 80/89: 4 90/100: 5
10)Considere los 100 primeros nmeros naturales. El programa debe devolver una matriz lgica (0=falso,1=verdadero) donde se indique si el elemento i es o no primo.
11)Se cuenta con una lista L1 de nmeros enteros en el cual existen numerosos valores repetidos.A fin de economizar el espacio de almacenamiento, se desea crear una nueva lista L2 en la cual cada valor
diferente aparece una sola vez, sin repeticin, pero indicando la cantidad de veces que se repite dicho valor en
la lista L1.
Ejemplo:
Lista original L1 (dato para el algoritmo)
23 27 8 14 23 23 8 23 27 23 27 8 27
Lista final L2 (resultado del algoritmo)
8 3 14 1 23 5 27 4
La interpretacin de la lista L2 es como sigue: el valor 8 aparece 3 veces en L1, el valor 14 aparece 1 vez en L1,
el valor 23 aparece 5 veces en L1, y el valor 27 aparece 4 veces en L1.
Note que los valores de L1 deben aparecer ordenados ascendentemente en L2 (8-14-23-27).
Escriba un algoritmo en C que reciba la lista original L1 y obtenga la lista L2 con las caractersticas indicadas.
5/25/2018 Aaa - Clases 2013
32/103
12)Un palndromo es un nmero o una frase de texto que se lee igual hacia delante y hacia atrs (un casoconocido es un nmero capica). Ejemplo de palndromos son: 41214, radar y 4ana4. Escribir un programa
que reciba una cadena (de 50 caracteres como mximo) e indique si es o no un palndromo.
13)Convertir un nmero binario ingresado por teclado a su equivalente decimal.Algunos ejercicios resueltos
Ejercicio 1#include
int main(){int i,sum=0,nota[20],con=0;float prom;for(i=0;i
5/25/2018 Aaa - Clases 2013
33/103
Ejercicio 11#include
int main(){int i,n,aux,j;printf("Ingrese el tamanho del vector: ");scanf("%d",&n);int vec[n];
printf("Ingrese los elementos del vector:\n");for(i=0;i
5/25/2018 Aaa - Clases 2013
34/103
Matrices y arreglos multidimensionales
Hasta el momento, hemos considerado slo los arreglos unidimensionales (vectores), y en ellos cada elemento
se define o referencia por un ndice o subndice. Estos vectores son elementos de datos escritos en una
secuencia.
Sin embargo, existen grupos de datos que son mejor representados en forma de tabla o matriz con dos o ms
subndices. Por ejemplo: tablas kilomtricas entre ciudades, informes de ventas peridicas, etc.
Se pueden definir tablas o matrices como arreglos multidimensionales, cuyos elementos se pueden
referenciar por dos, tres o ms subndices. El trmino matriz se asocia generalmente a un arreglo
bidimensional. Como en el caso del vector o arreglo unidimensional, sus elementos son del mismo tipo (int,
char, float, etc).
Matrices
La matriz puede verse como un vector de vectores. Por ello, se necesita especificar dos subndices para poder
identificar cada uno de sus elementos.
La declaracin de una matriz o array bidimensional es:
tipo nombre_matriz[cant_filas][cant_columnas];
Se deben tener los mismos cuidados que los mencionados para el caso de los vectores en relacin al
dimensionamiento de la matriz (cantidad de filas y columnas).
int matrix[3][6] = {{16, 21, 8, 3, -7, 9},{-3, 11, 0, 5, 9, 7},{13, 7, -64, 19, 14, 2}}
Las dimensiones de los arreglos van aumentando a medida que se incluyen ms corchetes en la declaracin de
los arreglos.
Por ejemplo:
int M3[3][5][2] //define un arreglo tridimensional
Nombre de la matrizFila
Columna
Matriz de tres
dimensiones
5/25/2018 Aaa - Clases 2013
35/103
Lectura de datos de una matriz
for(i=0;i
5/25/2018 Aaa - Clases 2013
36/103
Lista de ejercicios sobre matrices
1) Dada una matriz A de tamao m*n, obtener un vector B que contenga los menores elementos de cada fila.2) Multiplicar (si es posible) dos matrices A y B de tamaos m*n y p*q respectivamente (siendo estos ltimos
nmeros naturales). Guardar el resultado en una matriz C e imprimirla en pantalla.
3) Escribir un algoritmo que indique si una matriz es o no simtrica (condicin de simetra: mat[i][j]=mat[j][i]).4) Dadas la cantidad de filas y columnas maximas, generar una matriz "caracol"
5) Para transmitir mensajes de texto de hasta 100 caracteres de longitud se ha propuesto el siguiente mtodode codificacin:
a) Se genera una clave de 10 dgitos distintos (entre 0 y 9) (asumir que esa clave se introduce porteclado y es vlida).
b) Si el texto a codificar tiene menos de 100 caracteres, se completa al final con tantos asteriscoscomo sea necesario para completar los 100 caracteres.
c) El texto resultante se coloca en una matriz de 10 filas y 10 columnas, de modo que cada carcterocupe un elemento de la matriz, fila por fila, de izquierda a derecha y de arriba hacia abajo.
d) Se toma el primer dgito de la clave y la columna correspondiente a ese dgito se pasa al textocodificado. Se toma el segundo dgito de la clave y la columna correspondiente a ese dgito se
agrega al final del texto codificado. Se repite este procedimiento hasta utilizar todos los dgitos de
la clave.
e) Se agrega al final del texto codificado la clave utilizada para su codificacin.f) El resultado final es un mensaje codificado de 110 caracteres de longitud.
Se requiere:
a) Escribir un algoritmo para codificar un mensaje utilizando este mtodob) Escribir otro algoritmo para decodificar un mensaje codificado con este mtodo
Ejemplo
Mensaje original: LA CRIPTOGRAFIA ES LA CIENCIA DE CIFRAR Y DESCIFRAR MENSAJES USANDO TECNICAS
MATEMATICAS
Clave generada: 8204975613
La matriz es:L A C R I P T O G
R A F I A E S L
A C I E N C I A
D E C I F R A R
Y D E S C I F R A
R M E N S A J E S
U S A N D O T E
C N I C A S M A T
E M A T I C A S * *
* * * * * * * * * *
Mensaje codificado final:
O ARRETA* FC DMSIA*LRADYR CE*RAEISNNAI*GL ASET**TSIAFL MS*I NFCSDSC*PECRIAO A*AA E UNM*
CIICEEACT*8204975613
6) Una empresa tiene cuatro vendedores (1 a 4), los cuales venden 5 productos distintos (1 a 5). Una vez alda, cada vendedor introduce un registro para cada tipo de producto vendido. Cada registro contiene lo
siguiente:
a. El nmero de vendedor.b. El nmero de producto.c. El nmero total del producto vendido del da.
5/25/2018 Aaa - Clases 2013
37/103
Suponga que estn disponibles los registros del ltimo mes (para nuestro ejercicio, suponemos que se
ingresan por teclado). Escriba un programa que lea toda la informacin hasta que se ingrese un nmero de
vendedor no vlido, y sume el total de las ventas por vendedor y por producto. Todos los totales se deben
almacenar en la matriz VENTAS. Una vez procesada toda la informacin del ltimo mes, despliegue los
resultados en forma tabular; en donde cada una de las columnas representa a un vendedor y cada una de
las filas representa un producto en particular. Obtenga la suma de cada fila para el total de ventas de cada
producto del ltimo mes; obtenga la suma de cada columna para el total de ventas por vendedor del
ltimo mes. Su salida tabular debe incluir esos totales a la derecha para las filas y en el fondo para las
columnas.
7) Teniendo un sistema de ecuaciones representado en una matriz, obtener la solucin al sistema (suponerque siempre hay una solucin y es nica) mediante el mtodo de eliminacin de Gauss:
d. Ir a la columna no cero extrema izquierda.e. Si el primer rengln tiene un cero en esta columna, intercambiarlo con otro que no lo tenga.f. Luego, obtener ceros debajo de este elemento delantero, sumando mltiplos adecuados del
rengln superior a los renglones debajo de l.
g. Cubrir el rengln superior y repetir el proceso anterior con la submatriz restante. Repetir con elresto de los renglones (en este punto la matriz se encuentra en la forma de escaln).
h. Comenzando con el ltimo rengln no cero, avanzar hacia arriba: para cada rengln obtener un 1delantero e introducir ceros arriba de ste sumando mltiplos correspondientes a los renglones
correspondientes.
8) Ordenar alfabticamente un conjunto de palabras que se representan mediante una matriz decaracteres. Cada palabra es una fila de la matriz y no supera los 20 caracteres.
E S T A \0
E S \0
U N A \0 \0
P R U E B A \0
9) Teniendo como entrada una matriz de filas y columnas, escriba un programa que solicite loselementos de esta matriz y luego la procese para ordenar sus valores segn la regla que se muestra en el
siguiente ejemplo:
Entrada:
34 23 63 27 72
56 8 33 42 11
78 21 86 6 29
22 75 10 30 13
54 77 36 74 55
28 22 56 41 1
Salida:
1 6 8 10 11
23 22 22 21 13
27 28 29 30 33
54 42 41 36 34
55 56 56 63 72
86 78 77 75 74
10)Un mensaje de texto ha sido codificado cambiando cada letra por la siguiente en el abecedario (en elcaso de tener la ltima letra del abecedario, cambiar por la primera) y modificando el orden de las mismasen el texto en funcin a una clave ingresada por teclado. La longitud mxima de una palabra es de 30 y la
cantidad mxima de palabras es 10. Al final de cada palabra se agrega un nmero que indica cul es su
posicin en el mensaje.
Se hacen las siguientes suposiciones:
La clave ingresada es siempre vlida y tiene una cantidad de dgitos igual a la de palabras del mensaje. El mensaje contiene slo letras y sus palabras estn separadas por espacios simples. No se tienen espacios al inicio ni al final del mensaje. Se tienen maysculas y minsculas. Las vocales no llevan acento.
5/25/2018 Aaa - Clases 2013
38/103
5/25/2018 Aaa - Clases 2013
39/103
dir=3;colmax--;
}}else if(dir==3){
col--;if(col==colmin){
dir=4;filmax--;
}}else{
fil--;if(fil==filmin){
dir=1;colmin++;
}}
}
printf("\n\nMatriz C:\n");for(i=0;i
5/25/2018 Aaa - Clases 2013
40/103
Apuntes de la clase de PED 2 Fecha: 8 de marzo de 2013
MSc. Jos Colbes
Recursiones o Recurrencias
Fuentes:
Libro de Joyanes AguilarCaptulo 14: Recursividad Wikipedia: Recursin (ciencias de la computacin), algoritmo recursivo, recursin
Recurrencia, recursin o recursividad es la forma en la cual se especifica un proceso basado en su propia
definicin. Un problema que pueda ser definido en funcin de su tamao (sea este ), pueda ser dividido en
instancias ms pequeas ( ) del mismo problema y se conozca la solucin explcita a las instancias ms
simples (lo que se conoce como casos base); se puede aplicar induccin sobre las llamadas ms pequeas y
suponer que estas quedan resueltas.
Un ejemplo de recursin es el factorial de un nmero :
( )
Es decir, puede conocerse solucionando el mismo problema, pero para un caso ms pequeo ( ). Este
proceso podemos continuar hasta llegar al caso base de . Podemos observar como un problema se
divide en varias (una o ms) instancias del mismo problema, pero de tamao menor gracias a lo cual se puede
aplicar induccin, llegando a un punto donde se conoce el resultado (el caso base).
Recursin es, en ciencias de computacin, una forma de atacar y solucionar problemas. De hecho, la recursin
es una de las ideas centralesen ciencias de la computacin. Resolver un problema mediante recursin significa
que la solucin depende de las soluciones de casos ms pequeos del mismo problema.
Dato interesante:La mayora de los lenguajes de programacin dan soporte a la recursin permitiendo a una
funcin llamarse a s misma desde el texto del programa. Los lenguajes imperativosdefinen las estructuras de
loops como while y forque son usadas para realizar tareas repetitivas. Algunos lenguajes de programacinfuncionales no definen estructuras de loops sino que posibilitan la recursin llamando cdigo de forma
repetitiva. La teora de la computabilidad ha demostrado que estos dos tipos de lenguajes son
matemticamente equivalentes, es decir que pueden resolver los mismos tipos de problemas, aunque los
lenguajes funcionales carezcan de las tpicas estructuras while y for.
Por ejemplo, se presentan dos soluciones para hallar el factorial de un nmero n:
Mtodo 1:Iteracin#includeint main(){
int n,i;
long long facto=1;printf("Ingrese un numero: ");scanf("%d",&n);for(i=1;i
5/25/2018 Aaa - Clases 2013
41/103
Algoritmos recursivos
Un algoritmo recursivoes un algoritmo que expresa la solucin de un problema en trminos de una llamada a
s mismo. La llamada a s mismo se conoce como llamada recursiva o recurrente.
Los programas examinados hasta ahora, generalmente estructurados, se componen de una serie de funciones
que llaman unas a otras de un modo disciplinado. En algunos problemas es til disponer de funciones que se
llamen a s mismas. Una funcin o subprograma recursivo es un subprograma que se llama a s mismo ya sea
directa o indirectamente.
Se puede utilizar la recursividad como una alternativa a la iteracin. De hecho, ciertas soluciones salen de
manera ms natural (por las caractersticas de los problemas; como ejemplos se tienen muchos problemas
matemticos) utilizando la recursividad. Por esta causa, la recursin es una herramienta poderosa e importante
en la resolucin de problemas y en la programacin.
Una solucin recursiva es normalmente menos eficiente, en trminos de tiempo de computadora, que una
solucin iterativa; esto es debido a las operaciones auxiliares que llevan consigo las llamadas suplementarias a
las funciones. Adems, se debe tener en cuenta el espacio de memoria para cada uno de los procesos que
quedan pendientes de resultado durante la ejecucin del programa recursivo.
Un esquema de una funcin recursiva es el siguiente:
tipo_dato_retorno funcion_recursiva(argumentos){funcion_recursiva(argumentos)
}
Ejemplo 1:A travs de una funcin recursiva, calcular , donde es un nmero entero y uno natural.
#includelong long potencia(int a,int b){
if(b==0) return 1;return (a*potencia(a,(b-1)));
}int main(){
int a,b;printf("Ingrese la base: "); scanf("%d",&a);printf("Ingrese el exponente: "); scanf("%d",&b);printf("\nEl valor de %d^%d es: %lld",a,b,potencia(a,b));return 0;
}
Ejemplo 2: Calcular la suma de todos los nmeros enteros entre 1 y 100.
#includeint sumas(int i){
if(i==0) return 0;return (i+sumas(i-1));
}int main(){
printf("\nEl valor de la suma del 1 al 100 es: %d", sumas(100));return 0;
}
Ejemplo 3: Calcular el ensimo trmino de la sucesin de Fibonacci (() ( ) ( )),
sabiendo que los dos primeros trminos son 0 y 1.#includeint fibo(int i){
if(i==1) return 0;if(i==2) return 1;return (fibo(i-1)+fibo(i-2));
}int main(){
int n;printf("Ingrese el numero del termino cuyo valor se desea conocer: ");scanf("%d",&n);printf("\nEl valor del termino %d de la serie de Fibonacci es: %d",n,fibo(n));return 0;
}
5/25/2018 Aaa - Clases 2013
42/103
Recursividad directa e indirecta
Si una funcin se invoca a s misma, el proceso se denomina recursin directa(los ejercicios vistos hasta aqu
son de este tipo). Si una funcin puede invocar a una segunda funcin que a su vez invoca a la primera, este
proceso se conoce como recursin indirecta omutua.
Ejemplo: imprimir todo el alfabeto.
#includevoid A(char);void B(char);int main(){
printf("El alfabeto es:\n");A('Z');return 0;
}void A(char c){
if(c>'A') B(c);putchar(c);
}
void B(char c){A(--c);
}
Explicacin: el programa principal llama a la funcin recursiva () con el argumento (la ltima letra del
alfabeto), y esta funcin examina su parmetro . Si est despus que (en orden alfabtico), la funcin
llama a (), que inmediatamente llama a(), pasndole un parmetro predecesor de . Esta accin hace que
()vuelva a examinar , y nuevamente llame a (), hasta que sea igual a . En este momento, la recursin
termina ejecutando putchar() 26 veces; y con esto se visualiza todo el alfabeto.
Recursin vs Iteracin
Todos los ejercicios anteriores se pueden implementar de modo iterativo o de modo recursivo. A continuacin
se compararn ambos enfoques, de manera a que el programador pueda elegir un enfoque u otro de acuerdo a
una determinada situacin.
Tanto la iteracin como la recursin se basan en una estructura de control: la iteracin utiliza una estructura
repetitiva y la recursin utiliza una estructura de seleccin. La iteracin y la recursin implican repeticin: la
iteracin utiliza explcitamente una estructura repetitiva, mientras que la recursin consigue la repeticin
mediante llamadas repetidas. Ambas implican cada una condicin de salida (test de terminacin). La iteracin
termina cuando la condicin del bucle no se cumple, mientras que la recursin termina cuando se reconoce un
caso base o la condicin de salida se alcanza.
La recursin tiene ciertas desventajas: se invoca repetidamente al mecanismo de recursividad y enconsecuencia se necesita tiempo suplementario para realizar las mencionadas llamadas.
Esta caracterstica puede resultar cara en tiempo de procesador y espacio de memoria. Cada llamada de una
funcin recursiva produce que otra copia de la funcin (realmente slo las variables de la funcin) sea creada;
esto puede consumir memoria considerable. Por el contrario, la iteracin se produce dentro de una funcin, de
modo que las operaciones suplementarias de las llamadas a la funcin y asignacin de memoria adicional son
omitidas.
En consecuencia, cules son las razones para elegir la recursin? La razn fundamental es que existen
numerosos problemas complejos que poseen naturaleza recursiva y por ello son ms fciles de solucionar con
algoritmos de este tipo. Sin embargo, en condiciones tpicas de tiempo y memoria, es decir, cuando elconsumo de tiempo y memoria sean decisivos o concluyentes para la resolucin del problema, la solucin a
elegir generalmente es la iterativa.
5/25/2018 Aaa - Clases 2013
43/103
Resolucin de ejercicios un poco ms complejos con recursividad
Problema 1: Torres de Hanoi
El juego, en su forma ms tradicional, consiste en tres varillas verticales. En una de las varillas se apila un
nmero indeterminado de discos (elaborados de madera) que determinar la complejidad de la solucin, por
regla general se consideran ocho discos (pero pueden ser de cantidad ). Los discos se apilan sobre una varilla
en tamao decreciente. No hay dos discos iguales, y todos ellos estn apilados de mayor a menor radio en una
de las varillas, quedando las otras dos varillas vacantes. El juego consiste en pasar todos los discos de la varilla
ocupada (es decir la que posee la torre) a una de las otras varillas vacantes. Para realizar este objetivo, es
necesario seguir tres simples reglas:
Slo se puede mover un disco cada vez. Un disco de mayor tamao no puede descansar sobre uno ms pequeo que l mismo. Slo puedes desplazar el disco que se encuentre arriba en cada varilla.
Existen diversas formas de realizar la solucin final, todas ellas siguiendo estrategias diversas. La que
emplearemos es la de recursin, y el programa se muestra a continuacin:
#includevoid Hanoi(int inicio, int fin, int centro, int n){
if(n==1){printf("\nMover disco 1 de la varilla %d a la varilla %d.",inicio,fin);
}
else{Hanoi(inicio, centro, fin, (n-1));printf("\nMover disco %d de la varilla %d a la varilla %d.",n,inicio,fin);Hanoi(centro, fin, inicio, (n-1));
}}int main(){
int n;printf("Ingrese el valor de n: ");scanf("%d",&n);Hanoi(1,3,2,n);// 1 es la varilla inicial, 2 la del centro y 3 la final.return 0;
}
Problema 2:Ped-dlares (problema extrado de ICPC/ACM y adaptado para el curso)
Pedlandia tiene un sistema monetario bastante particular. Cada moneda tiene escrito un nmero entero que
indica la su valor en ped-dlares. Los bancos (aqu viene lo peculiar) permiten cambiar una moneda por otras
tres de valores , y ; redondeadas hacia abajo.
Adems, se tiene que un ped-dlar equivale a un dlar americano. Entonces, teniendo una moneda de un
cierto valor x, cul es la mayor cantidad de dlares americanos que pueden obtenerse de l?
#includeint cantidad(int);int main(){
int n,m;
printf("\nIngrese el valor de la moneda: ");scanf("%d",&n);m=cantidad(n);printf("\nLa cantidad de dolares es: %d",m);return 0;
}int cantidad(int x){
if(x==0) return 0;int a,b,c,y;a=x/2;b=x/3;c=x/4;y=cantidad(a)+cantidad(b)+cantidad(c);if(x>y) return x;else return y;
}
5/25/2018 Aaa - Clases 2013
44/103
Problema 3:Bsqueda binaria
En este problema, se tiene una lista de nmeros (vamos a suponer que son distintos) ordenados de manera
ascendente. Se ingresa un nmero cualquiera (lo llamaremos clave) y se desea buscarlo dentro de la lista. Si
est, se debe indicar su posicin en el arreglo; si no lo est, se indica con un mensaje.
Se puede realizar una bsqueda secuencial, pero el hecho de que los nmeros estn ordenados nos permite
realizarla de manera ms eficiente. Considerando los lmites del arreglo, se considera el elemento central. Este
elemento se compara con la clave: si es igual a la clave, se termina y retorna la posicin; si es mayor que la
clave, esta ltima podra encontrarse en el subarreglo izquierdo; si es menor, la clave podra encontrarse en el
subarreglo derecho. Este proceso se realiza en forma recursiva.
//El vector ingresado ya debe estar ordenado#includeint busqueda_bin(int x, int inf, int sup, int lista[]){
if(inf>sup) return (-1);int med=inf+(sup-inf)/2;if(lista[med]==x) return med;if(lista[med]>x) return busqueda_bin(x,inf,(med-1),lista);else return busqueda_bin(x,(med+1),sup,lista);
}int main(){
int n,i,clave;printf("\nIngrese el tamanho de la lista: ");scanf("%d",&n);int lista[n];for(i=0;i
5/25/2018 Aaa - Clases 2013
45/103
#includeint mat[200][200],fil,col;maximo(int a, int b, int c){
if(a>=b){if(a>=c) return a;else return c;
}else{
if(b>=c) return b;
else return c;}
}int recursion(int x, int y){
int a,b,c;if(x==0) return mat[x][y];b=recursion((x-1),y);if(y==0){
a=-1;c=recursion((x-1),(y+1));
}else if(y==(col-1)){
a=recursion((x-1),(y-1));c=-1;
}
else{a=recursion((x-1),(y-1));c=recursion((x-1),(y+1));
}int d=maximo(a,b,c)+mat[x][y];return d;
}int main(){
int i,j,d;printf("Ingrese la cantidad de filas: ");scanf("%d",&fil);printf("Ingrese la cantidad de columnas: ");scanf("%d",&col);printf("\nLa matriz es:\n");for(i=0;i
5/25/2018 Aaa - Clases 2013
46/103
Apuntes de la clase de PED 2 Fecha: 15 de marzo de 2013
MSc. Jos Colbes
Punteros (Se recomienda leer el captulo 5 del libro de Kernighan y Ritchie)
Bsicamente, el puntero es una variable cuyo contenido es la direccin de otra variable. Los punteros son muy
usados en C, y son una de sus caractersticas principales.
Una mquina tpica tiene un arreglo de celdas de memoria numerados o direccionados de forma consecutiva
que pueden ser manipuladas de forma individual o en grupos contiguos. Una situacin comn es que cualquier
byte puede ser un char, un par de celdas de un byte puede ser tratado como un short int, y cuatro bytes
adyacentes forman un long. Un puntero es un grupo de celdas (a menudo dos o cuatro) que puede contener
una direccin. As que si es un char y es un puntero que apunta a la misma, se podra representar la
situacin de la siguiente manera:
El operador & da la direccin de un objeto (variable), entonces la sentencia:
asigna al puntero la direccin de la variable . Entonces se dice que apunta a . El operador & slo se
aplica a elementos almacenados en memoria (como variables y arreglos).
El operador * es el desreferenciador. Al aplicarlo a un puntero, se accede al objeto al que apunta. Un
ejemplo del uso de estos operadores es el siguiente:
int x = 1, y = 2, z[10];
int *ip; /* ip es un puntero a un int */ip = &x; /* ip apunta a la variable x */y = *ip; /* ahora y es 1 */*ip = 0; /* ahora x es 0 */ip = &z[0]; /* ahora ip apunta a z[0] */
Observacin: un puntero est restringido a apuntar a objetos de un tipo en especfico (por eso se definen como
un tipo de dato).
Si , entonces las siguientes operaciones son vlidas (para modificar el valor de o para hacer otras
operaciones):
*ip = *ip + 10; //incrementa x en 10y = *ip + 1; //es lo mismo que y=x+1*ip += 1; //incremental el valor de x en 1++*ip; //tambin incrementa x en 1;(*ip)++ //se usa el parntesis para incrementar x. Si no se coloca, seincrementa el valor del puntero.
Como los punteros son variables, se pueden hacer operaciones sin desreferenciar. Por ejemplo: iq = ip
(con esto, e apuntan al mismo objeto).
Paso por valor y paso por referencia:
Ejemplo 1:Qu valor se imprime en pantalla en cada uno de estos programas?
#includevoid sub(int);main(){
int a=3;sub(a);printf(%d,a);
}void sub(int a){
a=10;}
#includevoid sub(int *);main(){
int a=3;sub(&a);printf("%d",a);
}void sub(int *p){
*p=10;}
Observacin: para imprimir el valor de un puntero (en hexadecimal), se utiliza printf(%p,pa);
Puntero Variable
5/25/2018 Aaa - Clases 2013
47/103
Ejemplo 2: Son formas equivalentes de definir la funcin swap?
void swap(int x, int y){int temp;temp = x;x = y;y = temp;
}
void swap(int *px, int *py){int temp;temp = *px;*px = *py;*py = temp;
}
Punteros y vectores
En C, existe una fuerte relacin entre los punteros y los vectores (en general, los arreglos); y la mayora de las
veces pueden usarse indistintamente (en realidad los nombres de los vectores son punteros constantesque
apuntan al primer elemento del vector).
La declaracin int a[10];define un bloque de 10 elementos consecutivos llamados a[0],,a[9].
La notacin se refiere al elemento del vector. Si es un puntero a int, entonces:int *pa;pa = &a[0];hace que apunte el elemento cero de. Es decir, contiene la direccin de .
Si apunta a un elemento de , entonces apunta a la siguiente posicin, y apunta a un
elemento alejado de (esto se conoce como aritmtica de punteros). Por definicin, el valor de una variable
o expresin de tipo vector es la direccin del elemento cero del vector. Por lo tanto, estas expresiones son
equivalentes:
pa = &a[0]; pa = a;
Adems, las siguientes notaciones son equivalentes:
a[i] *(a+i) &a[i] a+i Si es un puntero: pa[i] *(pa+i)
Si se supone que p=vect, la relacin entre punteros y vectores puede resumirse como se indica en las lneas
siguientes:
*p equivale a vect[0], a *vect y a p[0] *(p+1) equivale a vect[1], a *(vect+1) y a p[1] *(p+2) equivale a vect[2], a *(vect+2) y a p[2]
Observacin: Existe una diferencia entre el nombre de un vector y un puntero: un puntero es una variable, por
lo que pa=aand pa++son operaciones legales. Pero el nombre de un vector (y en general, el de un arreglo)
es una constante, por lo que a=paand a++son operaciones ilegales.
En la funcin
que llama
En la funcin
swap
px
py
x
y
5/25/2018 Aaa - Clases 2013
48/103
Vectores y funciones
Cuando el nombre de un vector se pasa a una funcin, lo que se pasa es la ubicacin del elemento inicial.
Dentro de la funcin llamada, este argumento es una variable local, y por lo tanto el nombre de un arreglo
como parmetro es un puntero; esto es, una variable que contiene una direccin (paso por referencia). Un
ejemplo sera la funcin strlen:
#includeint strlen(char []);int strlen2(char *);
int main(){char cad[30];gets(cad);int a;a=strlen(cad);//a=strlen2(cad);printf("%d\n",a);return 0;
}
int strlen(char cad1[]){int i=0;while(cad1[i]!='\0') i++;return i;
}
int strlen2(char *pc){int i=0;while((*pc++)!='\0') i++;return i;
}
Las llamadas como:
strlen("hello, world"); /* constante de tipo cadena */strlen(array); /* char array[100]; */strlen(ptr); /* char *ptr; */
funcionan correctamente.
Observacin importante:la instruccin char cad[30];ya reserva un espacio en memoria para ese vector.
Si slo definimos un puntero de tipo char, no se reserva memoria. La asignacin dinmica de memoria
(asociada a punteros) se ver ms adelante.
Punteros a carcter y funciones
Una constante cadena, escrita como: Hola, es una arreglo de caracteres. Estas constantes pueden usarse
como parmetros de funciones. Una forma comn de usarlas es a travs de la funcin printf:
printf("Hola mundo\n");
Cuando una constante cadena aparece en un programa, lo hace a travs de un puntero a carcter; y printf
recibe un puntero que apunta al inicio del arreglo de caracteres. Estas constantes no solo se restringen a
argumentos de funciones. Si se declara como: char *pc; entonces:
pc = "hola que tal"; asigna a un puntero al arreglo de caracteres. Esto NO es una copia de la
cadena, slo es una relacin entre punteros.
Existe una diferencia importante entre estas definiciones:
char amesage[] = "now is the time"; /* un vector de caracteres */char *pmessage = "now is the time"; /* un puntero */
es un arreglo, lo suficientemente grande para contener a la cadena (se pueden modificar los
elementos del vector); mientras que es un puntero, inicializado a apuntar una constante cadena. El
puntero puede cambiar de objetivo, pero el resultado es indefinido si se intenta modificar el contenido de la
cadena.
5/25/2018 Aaa - Clases 2013
49/103
Ejemplo:
#includevoid copia(char *, char *);
int main(){char cad1[30];copia(cad1,"hola chau");
printf("%s\n",cad1);return 0;
}
void copia(char *c1, char *c2){int i=0;while(*(c2+i)!='\0'){
*(c1+i)=*(c2+i);i++;
}*(c1+i)='\0';
}
Relacin entre matrices y punteros
En el caso de las matrices la relacin con los punteros es un poco ms complicada. Supngase una declaracin
como la siguiente:
int mat[5][3], *q;
Se debe prestar especial atencin a lo siguiente: una matriz es un vector de vectores.
Recurdese tambin que, por la relacin entre vectores y punteros, (mat+i) apunta a mat[i]. Recurdese que la
frmula de direccionamiento de una matriz de N filas y M columnas establece que la direccin del elemento (i,
j) viene dada por:
direccin (i, j) = direccin (0, 0) + i*M + j
Si la matriz tiene M columnas y si se hace q = &mat[0][0] (direccin base de la matriz), el elemento mat[i][j]
puede ser accedido de varias formas. Basta recordar que dicho elemento tiene por delante i filas completas, y j
elementos de su fila:
*(q + M*i + j) // frmula de direccionamiento*(mat[i] + j) // primer elemento fila i desplazado j elementos(*(mat + i))[j] // [j] equivale a sumar j a un puntero*((*(mat + i)) + j) // accede al elemento mat[i][j]
Todas estas relaciones tienen una gran importancia, pues implican una correcta comprensin de los punteros y
de las matrices. De todas formas, hay que indicar que las matrices no son del todo idnticas a los vectores de
punteros: Si se define una matriz explcitamente por medio de vectores de punteros, las filas pueden tener
diferente nmero de elementos, y no queda garantizado que estn contiguas en la memoria (aunque se puede
hacer que s lo sean). No sera pues posible en este caso utilizar la frmula de direccionamiento y el acceder por
columnas a los elementos de la matriz.
En realidad, una matriz se representa en memoria como un vector, donde se colocan las filas una al lado de
otra; por lo tanto una matriz es un vector, donde sus elementos son vectores. Por ejemplo, una matriz A de
10x10 se representa en memoria por un vector de 100 elementos.
La matriz es un arreglo de arreglos de una dimensin. Como el nombre de un arreglo es un puntero a su primer
elemento (y ese elemento es un arreglo de una dimensin), A es realmente un puntero al primer arreglo de 10
elementos (ms informacin sobre estos temas en http://stackoverflow.com/questions/546860/passing-
arrays-and-matrices-to-functions-as-pointers-and-pointers-to-pointers-in).
Formas de pasar una matriz a una funcin
En el ejemplo, se pasa el nombre de una matriz de 10x10:
voidfuncion(int(*arreglo)[10]);
voidfuncion(intarreglo[][10]);
5/25/2018 Aaa - Clases 2013
50/103
5/25/2018 Aaa - Clases 2013
51/103
Lista de ejercicios sobre punteros
1) Dada una matriz A de tamao m*n, obtener un vector B que contenga los menores elementos de cada fila.2) Ordenar los elementos de un vector de forma descendente.3) Ordenar alfabticamente un conjunto de palabras que se representan mediante una matriz de
caracteres. Cada palabra es una fila de la matriz y no supera los 20 caracteres.
E S T A \0
E S \0
U N A \0 \0
P R U E B A \0
4) Escribir un programa que convierta una cadena en maysculas y otro que la convierta en minsculas.5) Escribir un algoritmo que elimine todos los espacios de una cadena ingresada mediante la funcin gets().6) Escribir una funcin contpar(int *a, int tam) que recibe un vector y su tamao, y devuelve el nmero de
elementos pares del arreglo.
7) Escribir una funcin letra(char *cad) que reciba una cadena y devuelva el carcter con ms apariciones dela misma.
Algunos ejercicios resueltos
Ejercicio 1#includevoid menor_elemento(int, int, int **, int *);
int main(){int i,j,m,n;printf("Ingrese la cantidad de filas y columnas de la matriz:");printf("\nFilas: "); scanf("%d",&m);printf("Columnas: "); scanf("%d",&n);int mat[m][n],vec[m];int *p[m],**q=p,*t=vec;for(i=0;i
5/25/2018 Aaa - Clases 2013
52/103
a=*(c1+i)-*(c2+i);return a;
}
void ordenar(char **q, int n){int a,i,j=1,band=1;char *t;while(band){
band=0;
for(i=0;i0){
t=*(q+i);*(q+i)=*(q+i+1);*(q+i+1)=t;band=1;
}}j++;
}}
Ejercicio 5
#include#include
int main(){int i,pos=0;char cad[100];char cad2[100];char *p,*q;printf("\nIngrese la cadena:\n");gets(cad);p=cad;q=cad2;for(i=0;i
5/25/2018 Aaa - Clases 2013
53/103
}
char letra(char *p, int n){int i,cont=1,max=0;char c=(*p);for(i=1;imax)&&((*(p+i-1))!=' ')){
max=cont;
c=*(p+i-1);}cont=1;
}else cont++;
}return c;
}
5/25/2018 Aaa - Clases 2013
54/103
Apuntes de la clase de PED 2 Fecha: 22 de marzo de 2013
MSc. Jos Colbes
Lista de ejercicios de repaso
Tema 1: Amigos de guerra
Nlogonia est librando una guerra sin cuartel contra el vecino pas de Cubiconia. El General en Jefe del Ejrcitode Nlogonia decidi atacar al enemigo con una formacin lineal de los soldados, que permitan avanzar juntos
hasta la conquista del pas vecino. Antes de la batalla, el General en Jefe orden que cada soldado en la lnea
de ataque, adems de protegerse a s mismo y atacar, tambin debe proteger a sus dos (ms cercanos) vecinos
en la lnea, uno a su izquierda y otro a su derecha. El General en Jefe dijo a los soldados que para cada uno de
ellos, sus amigos seran estos dos vecinos, si tales vecinos existan (porque el soldado ms a la izquierda no
tiene un vecino de la izquierda y el soldado ms a la derecha no tiene un vecino de la derecha). El General en
Jefe tambin dijo a los soldados que proteger a sus compaeros era muy importante para evitar que la lnea de
ataque se rompa. Tan importante que, si el amigo de la izquierda o la derecha de un soldado es asesinado,
entonces el siguiente vecino vivo al lado izquierdo o al lado derecho del soldado, respectivamente, debe pasar
a ser su nuevo amigo.
La batalla es feroz, y muchos soldados en la lnea de ataque estn siendo asesinados por disparos de fuego,
granadas y bombas. Pero siguiendo las rdenes del general en jefe, inmediatamente despus de conocer
acerca de las prdidas en la lnea de ataque, la divisin de sistemas de informacin del Ejrcito tiene que
informar a los soldados quines son sus nuevos compaeros.
A usted se le da el nmero de soldados en la lnea de ataque, y una secuencia de informes de prdidas. Cada
informe describe la prdida de un grupo de soldados contiguos en la lnea de ataque que fueron asesinados
recientemente en la batalla. Escriba un programa que, para cada informe de prdida, imprime los nuevos
compaeros formados.
Entrada del programa:
Cada caso de prueba se describe utilizando varias lneas. La primera lnea de entrada contiene dos enteros S y Bque representan respectivamente el nmero de soldados en la lnea de ataque, y el nmero de informes de
prdidas ( ). Los soldados se identifican por diferentes enteros de 1 a , en funcin de sus
posiciones en la lnea de ataque; siendo 1 el soldado ms a la izquierda y el soldado ms a la derecha. Cada
una de las siguientes lneas de entrada describe un informe de prdida utilizando dos enteros (izquierda) y
(derecha), lo que significa que los soldados de izquierda a derecha fueron asesinados ( ). Usted
puede asumir que hasta ese momento los soldados estaban vivos y que acaban de morir.
El ltimo caso de prueba es seguido por una lnea que contiene dos ceros.
Salida del programa:
Para cada caso de prueba de salida se imprimen lneas. En la lnea de salida -sima se deben escribir losnuevos compaeros formados mediante la eliminacin de la lnea de ataque de los soldados que perdieron la
vida de acuerdo con el -simo informe de prdida. Es decir, para el informe de prdida , imprima el
primer soldado sobreviviente a la izquierda de , y el primer soldado sobreviviente a la derecha de . Para cada
direccin, imprima el carcter ''(asterisco) si hay no soldado sobreviviente en esa direccin. Imprima una lnea
que contiene un solo carcter '' (guin) despus de cada caso de prueba.
Ejemplo de entrada
1 1
1 1
10 4
2 56 9
1 1
10 10
5 1
1 1
0 0
Ejemplo de salida
* *
-
1 6
1 10* 10
* *
-
* 2
-
5/25/2018 Aaa - Clases 2013
55/103
Tema 2: Nmeros Palndromos
Se dice que un nmero es un Palndromo (capica) si es el mismo cuando se lee de izquierda a derecha o de
derecha a izquierda. Por ejemplo, el nmero 75457 es un palndromo.
Por supuesto, la propiedad depende de la base en la que se representa el nmero. El nmero 17 no es un
palndromo en la base 10, pero su representacin en base 2 (10001) es un palndromo.
El objetivo de este problema es el de verificar si un conjunto de nmeros dados son palndromos en cualquier
base desde 2 a 16.
Entrada del programa:
Varios nmeros enteros comprenden la entrada. Cada nmero se da en base decimal en una
lnea separada. La entrada termina con un cero.
Salida del programa:
Su programa debe imprimir el mensaje El numero es palindromo en basedonde es el nmero dado, seguid
de las bases donde la representacin del nmero es un palndromo. El dgito ms a la izquierda de un nmero
en cualquier base debe ser distinto de cero.
Si el nmero no es un palndromo en cualquier base entre 2 y 16, el programa debe imprimir el mensaje El
numero no es palindromo.
Ejemplo de entrada
17
19
0
Ejemplo de salida
El numero 17 es palindromo en base 2 4 16
El numero 19 no es palindromo
Tema 3: Permutaciones
Dada una lista de elementos, definir todas las permutaciones que pueden obtenerse con los mismos.
Entrada del programa:
Varios nmeros enteros comprenden la entrada. Cada nmero est separado del siguiente por un
espacio simple. La entrada termina con un salto de lnea.
Salida del programa:
Se deben presentar las permutaciones posibles siguiendo el esquema presentado en el caso de prueba.
Ejemplo de entrada
3 2 4 1
Ejemplo de salida
1 2 3 41 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 23 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
5/25/2018 Aaa - Clases 2013
56/103
Tema 4: Dados
La gente de PEDlandia tienen una tradicin de tirar un dado de seis caras para determinar quin elegir dnde
cenar esa noche.
Una persona tira el dado, y la otra elige paro impar. Si esta segunda persona acierta, entonces l o ella
tiene que elegir el restaurante, de lo contrario, la persona que lanz lo hace. Por suerte es obvio que impar
gana cuando se lanza un 1, 3 5; y evencuando se obtiene 2, 4 6!
Los PEDlandianos tambin tienen una tradicin de repetir la misma eleccin (ya sea par o impar) varias veces
en sucesin.
Su tarea es verificar los resultados de lanzamientos grabados y determinar cuntas veces gana cada persona.
Entrada del programa:
La entrada para este problema consiste en una secuencia de uno o ms escenarios. Cada escenario contiene 3
lneas.
La primera lnea contiene, en orden, los nombres de dos personas, y una de las palabras par oimpar (en minsculas), separadas por un espacio. La primera persona nombrada siempre es lalanzadora del dado, y la segunda persona nombrada ser la que elija paro impar, como se indica.
En PEDlandia, un nombre es una secuencia no vaca de hasta 20 (inclusive) letras (cualquiera de las
cuales puede estar en maysculas o minsculas).
La segunda lnea ser un nmero entero, , , que representa el nmero de lanzamientosdel dado.
La tercera lnea contiene enteros, cada uno entre 1 y 6 (inclusive); separados por espacios, querepresentan los resultados de cada lanzamiento.
La entrada ser terminada por una lnea que consta de tres numerales (#), separados por espacios. Esta lneano debe ser procesada.
Salida del programa:
La salida ser una secuencia de lneas, una para cada escenario de entrada. Cada lnea contendr en orden los
siguientes elementos, separados por espacios: el nombre de la primera persona (tal y como aparece en la
entrada), el nmero de veces que la primera persona gan, el nombre de la segunda persona (exactamente
como aparece en la entrada), y el nmero de veces que la segunda persona ha ganado.
Ejemplo de entrada
Bill Susan even
8
1 6 5 3 4 2 5 5
Sarah Tony odd
15
2 4 5 4 3 6 1 2 5 4 3 1 2 5 6
# # #
Ejemplo de salida
Bill 5 Susan 3
Sarah 8 Tony 7
5/25/2018 Aaa - Clases 2013
57/103
Tema 5: Cerradura de combinacin
La cerradura de combinacin de este problema, como se muestra en la figura, consiste de un disco circular, que
se puede girar (en sentido horario o anti-horario) y est incrustado en la parte "fija" de la cerradura. El disco
tiene posiciones espaciadas uniformemente. Las posiciones se numeran de a , aumentando en el
sentido horario. La parte fija de la cerradura tiene una "marca" que siempre "apunta a" una posicin particular
en el disco. Por supuesto, la marca apunta a posiciones diferentes a medida que el disco gira. (En la figura,
N=40 y la marca apunta a la posicin 14.)
La cerradura viene con tres nmeros de cdigo , , . Estos son nmeros enteros no-negativos y cada uno
de ellos es menor que . Ningn par de estos tres cdigos son iguales.
La cerradura se abre en tres etapas de operaciones:
Si la marca inicialmente apunta la posicin , gire el disco exactamente dos vueltas completas ensentido horario y pare. De lo contrario, gire el mando en sentido horario exactamente dos vueltas
completas, y contine girando en sentido horario hasta que la marca apunta a la posicin .
Gire el disco una vuelta completa en sentido anti-horario y contine girando en este sentido hasta quela marca apunte a la posicin .
Gire el disco en sentido horario hasta que la marca apunte a la posicin . La cerradura debe abrirse.Dados los nmeros , el objetivo de este problema es encontrar el nmero promedio de posiciones
que el disco debe girar (cambiar) con el fin de abrir la cerradura. Para cualesquiera y una
configuracin inicial particular de la cerradura, el nmero de posiciones giradas (cambiadas) se define como la
suma de las posiciones giradas (cambiadas) en las tres etapas descritas anteriormente.
Entrada del programa:
El archivo de entrada consiste de un nmero de casos de prueba, con un caso de prueba por lnea. Cada lnea
del archivo de entrada contiene cuatro enteros: , por este orden, separados por espacios en
blanco. El entero es un mltiplo de 5, y . Los nmeros y satisfacen las restricciones
indicadas en la descripcin anterior. La entrada ser terminada por una lnea que contiene slo cuatro ceros,
separados por espacios en blanco.
Salida del programa:
Para cada caso de prueba, imprimir el nmero promedio de cambios de posiciones (redondeado a tres
decimales) que el disco debe hacer al girar para abrir la cerradura. Supongamos que cada una de las posibles
configuraciones iniciales de la cerradura es igualmente probable.
Ejemplo de entrada
80 20 40 50
80 10 79 12
0 0 0 0
Ejemplo de salida
369.500
415.500
5/25/2018 Aaa - Clases 2013
58/103
Apuntes de la clase de PED 2 Fecha: 22 de marzo de 2013
MSc. Jos Colbes
Lista de ejercicios de repaso
Tema 1: Amigos de guerra
Nlogonia est librando una guerra sin cuartel contra el vecino pas de Cubiconia. El General en Jefe del Ejrcit
top related