Aaa - Clases 2013

download Aaa - Clases 2013

of 103

Transcript of Aaa - Clases 2013

  • 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",&nota);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_buzz
  • 5/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