[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