[C con Clase] Duda con programa (Estructuras y apuntadores)

Elois@ guevara.elois en gmail.com
Jue Ago 30 05:01:24 CEST 2012


Hola, buen día a todos.
Estuve haciendo un programa para mi tarea en la universidad y las
condiciones eran las siguientes:
-Crear un programa para agregar 3 recorridos para visitas guiadas, con 3
lugares a visitar cada uno con base a las estructuras siguientes:
Estructura Recorrido:
- Nombre del guia:
- Numero de personas
- Lugares que visita

Estructura Lugar
- Nombre
-Ubicacion

Nota: utilizar apuntadores a esrtucturas, no utilizar arreglos de
caracteres.

Hice el programa y quedó mas o menos así. Sin problema.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Estructura para guardar la información de los lugares de cada recorrido
typedef struct Lugar{
    char *nombre;
    char *ubicacion;
}Lugar;

// Estructura para guardar la información de los recorridos
typedef struct Recorrido{
    char *guia;
    int numPersonas;
    Lugar *lugaresVisita;
}Recorrido;

// Función para mostrar el menú de opciones después de crear un grupo de
recorridos
int Menu();

// Función que crea la cantidad de recorridos que se reciba como parámetro
Recorrido* CrearRecorrido(int);

// Función que modifica el número de personas de un recorrido en particular
void ModNumPer(Recorrido*);

// Función que muestra los lugares que más se repiten en un recorrido
void ObtLugaresRep(Recorrido*, Recorrido*, Recorrido*);

// Función que muestra en pantalla los datos de cada recorrido y los
lugares que visita
void ImprimirRecorrido(Recorrido*, int);

// Función para hacer una pausa en el programa
void Pausa();

int main()
{
    system("cls"); system("color 4F");

    Recorrido *recorrido1, *recorrido2, *recorrido3;

    printf("\a\n     === Visitas Guiadas ===\n\n");
    printf("   Este programa permite crear 3 recorridos con\n"
           "   3 lugares a visitar en cada uno. Agregar los\n"
           "   datos a contnuacion...\n");


    recorrido1 = CrearRecorrido(1);
    recorrido2 = CrearRecorrido(2);
    recorrido3 = CrearRecorrido(3);

    int opc;
    do{
        opc=Menu();

        switch(opc)
        {
        case 1:
            int n;
            do{
            printf("\n   Para que # de recorrido?: ");
            scanf("%d", &n);
            }while(n>3 || n<1);
            switch(n)
            {
                case 1: ModNumPer(recorrido1);
ImprimirRecorrido(recorrido1,1); break;
                case 2: ModNumPer(recorrido2);
ImprimirRecorrido(recorrido2,2); break;
                case 3: ModNumPer(recorrido3);
ImprimirRecorrido(recorrido3,3); break;
            }


            break;
        case 2:
            ObtLugaresRep(recorrido1, recorrido2, recorrido3);
            break;
        case 3: exit(0);
            break;
        default: printf("\n   Opcion invalida! ..."); Pausa();
            break;
    }
   }while(opc!=3);

    return 0;
}

int Menu()
{
    int opc;

    system("cls");
    printf("\n     === Otras opciones ===\n\n");
    printf("  1.- Modificar numero de personas en algun recorrido\n");
    printf("  2.- Obtener lugares repetidos en los recorridos\n");
    printf("  3.- Salir\n");

    printf("\t\t\aOpcion: ");
    scanf("%d", &opc);
    system("cls");
    return opc;

}

void Pausa()
{
    printf("\a\n\n   Presiona una tecla para continuar... ");
    fflush(stdin);
    getchar();
}

Recorrido* CrearRecorrido(int i){

  // Reservación de memoria para la estructura Recorrido
  Recorrido *r= (Recorrido *)malloc(sizeof(Recorrido));


  // Datos de los recorridos (de 2 a 3 recorrridos permitidos)
  //for(int i=0;i<c;i++){

  printf("\n\n     === Recorrido %d ===\n", i);

  // Reservación de memoria para los datos de la estructura
  r->guia=(char *)malloc(sizeof(char)*30);

  // Entrada de datos por el usuario
  printf("   Nombre del guia: ");
  fflush(stdin);
  gets(r->guia);
  printf("   Numero de personas: ");
  scanf("%d", &r->numPersonas);

  // Reservación de memoria para los 3 lugares del recorrido
  r->lugaresVisita=(Lugar*)malloc(sizeof(Lugar)*3);

  printf("\n\n   Cada recorrido visita tres lugares,\n   presiona cualquier
tecla para continuar \n   o 1 para salir de la aplicacion: \n");

  char c;
  fflush(stdin);
  c=getchar();
  if(c==49) exit(0);

  // Datos de los 3 lugares de cada recorrido
  for(int j=0; j<3; j++)
  {
    // Reservación de memoria para los datos de los lugares
    r->lugaresVisita[j].nombre=(char *)malloc(sizeof(char)*20);
    r->lugaresVisita[j].ubicacion=(char *)malloc(sizeof(char)*50);

    printf("\n     === Lugar %d ===\n\n", j+1);

    // Entrada de datos por el usuario
    printf("   Nombre del lugar: ");
    fflush(stdin);
    gets(r->lugaresVisita[j].nombre);
    fflush(stdin);
    printf("   Ubicacion: ");
    gets(r->lugaresVisita[j].ubicacion);
    }

    system("cls");
    return r;
}

void ImprimirRecorrido(Recorrido *r, int n)
{
    printf("\n\n     === Datos del Recorrido %d ===\n\n", n);
    printf("   Guia: %s\n", r->guia);
    printf("   Numero de personas: %d\n", r->numPersonas);
    printf("   Lugares que visita: ");

    for(int i=0; i<3; i++){
    printf("\n\n     === Lugar %d ===\n", i+1);
    printf("   Nombre: %s\n", r->lugaresVisita[i].nombre);
    printf("   Ubicacion: %s\n", r->lugaresVisita[i].ubicacion);
    }
    Pausa();
}

void ModNumPer(Recorrido *s)
{
    printf("\n\n     === Cambio de datos ===\n");

    printf("   Nuevo numero de personas: ");
    scanf("%d", &s->numPersonas);
    printf("\a\n   El numero de personas ha sido modificado correctamente
:)\n");
    Pausa();
}

void ObtLugaresRep(Recorrido *rec, Recorrido *rec2, Recorrido *rec3)
{
    printf("\n   Los lugares que se repiten son: \n");

        for(int j=0;j<3;j++)
        {
            for (int k=0; k<3; k++)
            {
                if(strcmp(rec->lugaresVisita[j].nombre,
rec2->lugaresVisita[k].nombre)==0 || strcmp(rec2->lugaresVisita[j].nombre,
rec3->lugaresVisita[k].nombre)==0 || strcmp(rec->lugaresVisita[j].nombre,
rec3->lugaresVisita[k].nombre)==0)
                printf("     * %s\n",rec->lugaresVisita[j].nombre);
                else printf("   -\n");
            }
        }


    Pausa();
}

Ahora la segunda parte consiste en hacer lo mismo pero para n recorridos y
para n lugares, que el usuario decida estas cifras. El problema es que no
sé como hacer esto si en un arreglo de estructuras o algo así, como creo
apuntadores dependiendo de lo que indique el usuario. Ya intente con un
arreglo de estructuras pero no queda.
Gracias por ayudarme.

-- 
*Elois@ Guevara*

"La vida es muy peligrosa. No por las personas que hacen el mal, sino por
las que se sientan a ver lo que pasa." Albert Einstein
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120829/cd83a820/attachment.html>


Más información sobre la lista de distribución Cconclase