El sistema ferroviario de un país quiere actualizar la localización de las oficinas de atención al
cliente (OAC) para disminuir costes dando servicio al máximo número de estaciones. Para ello
necesita un programa que realice el siguiente proceso:
– En primer lugar el programa comenzará preguntando el número total de estaciones en la red
ferroviaria. Este valor estará comprendido entre 2 y un valor máximo MAXE = 100.
Inicialmente se supone que ninguna estación tiene una OAC y no hay conectividad entre
ninguna estación.
– A continuación el programa calculará la conectividad entre estaciones. Para ello el programa
leerá el recorrido de los trenes en la red ferroviaria almacenando la conectividad entre las
estaciones que recorre cada tren. Esto es, Si un tren pasa por las estaciones 1, 5 y 3 el
programa considerará que hay una conexión directa entre las estaciones 1 y 5 y entre las
estaciones 5 y 3. Se supone que las conexiones son bidireccionales. Esto es, si hay una
conexión entre la estación 1 y 5 entonces también la hay entre las estaciones 5 y 1. Un
ejemplo del funcionamiento del programa en este punto podría ser (en negrita los datos
introducidos por el usuario):
Introduce el número de estaciones del recorrido del tren: 4
Introduce las estaciones: 1 5 2 8
Conectividad almacenada
Quiere introducir el recorrido de otro tren?
– El programa continuará leyendo recorridos de trenes y almacenando la conectividad entre
estaciones hasta que se le indique
– A continuación el programa calculará y mostrará por pantalla las estaciones en las que hay
que colocar oficinas de atención al cliente (OAC). Para ello seguirá el siguiente algoritmo:
1. Buscar la estación que no este cubierta por una OAC y que tenga más conexiones
directas con otras estaciones. Una estación está cubierta por una OAC si dispone de
una OAC o tiene conexión directa con una estación con una OAC.
2. Colocar una OAC en la estación encontrada en el paso 1
3. Repetir el proceso desde el paso 1 hasta que todas las estaciones estén cubiertas por
una OAC
Un ejemplo de funcionamiento del programa podría ser:
Número total de estaciones? 5
Introduce el número de estaciones del recorrido del tren: 4
Introduce las estaciones: 1 2 3 4
Conectividad almacenada
Quiere introducir el recorrido de otro tren? S
Introduce el número de estaciones del recorrido del tren: 3
Introduce las estaciones: 1 2 5
Conectividad almacenada
Quiere introducir el recorrido de otro tren? N
Las OAC deberían ser colocadas en las siguientes estaciones:
2 4
Fin del programa
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
const int MAXT=100;
typedef int TEstTren[MAXT];
struct TEstaciones{
int estacion;
int ncox;
bool oac;
TEstTren trenes;
};
typedef TEstaciones TlistaEstaciones[MAXT];
struct TTrenes{
TlistaEstaciones estaci;
TEstTren paratren;
unsigned ntrenes;
};
void inicializartrenes(TTrenes &Tren);
void inicialiazarestaciones(TTrenes &Tren,int x);
void recotren(TTrenes &Tren,int x,int nest,int pos);
void almacenaestaciones(TTrenes &Tren,int nest,int x,int pos);
int Posicionestacion( const TTrenes &Tren,int nest,int x,int pos);
void almacena(TTrenes &Tren,int pose,int pos,int nest);
void ordenarestaciones(TTrenes &Tren,int x);
int main(){
TTrenes Tren;
int x,nest,pos,fin;
char opc;
inicializartrenes(Tren);
pos=0;
cout<<"Numero total de estaciones? "<<endl;
cin>>x;
if((x<2)||(x>MAXT)){
cout<<"Error, numero no permitido,introduzca un numero valido"<<endl;
cout<<"Numero total de estaciones? "<<endl;
cin>>x;
}
inicialiazarestaciones(Tren,x);
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
while(opc!='n'){
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos,fin);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}
for(int i=0;i<x;i++){
cout<<"La estacion es: "<<Tren.estaci[i].estacion<<endl;
cout<<"El numero de cox: "<<Tren.estaci[i].ncox<<endl;
cout<<"Los trenes con conexiones directas son: "<<endl;
for(int a=0;a<Tren.estaci[i].ncox;a++){
cout<<Tren.estaci[i].trenes[a]<<",";
cout<<endl;
}
}
return 0;
}
void inicializartrenes(TTrenes &Tren){
Tren.ntrenes=0;
}
void inicialiazarestaciones(TTrenes &Tren,int x){
for(int p=0;p<x;p++){
Tren.estaci[p].estacion=p+1;
Tren.estaci[p].oac=false;
Tren.estaci[p].ncox=0;
}
}
void recotren(TTrenes &Tren,int x,int nest,int pos){
int est;
cout<<"Intoduce las estaciones"<<endl;
for(int p=0;p<nest;p++){
cin>>est;
if(est>x){
while(est>x){
cout<<"Error,numero no permitido"<<endl;
cin>>est;
}
}
Tren.paratren[p]=est;
}
almacenaestaciones(Tren,nest,x,pos);
Tren.ntrenes++;
}
int Posicionestacion( const TTrenes &Tren,int nest,int x,int pos){
int pose;
for(int a=0;a<x;a++){
for(int p=0;p<nest;p++){
if(Tren.paratren[pos]==Tren.estaci[a].estacion){
pose=a;
}
}
}
return pose;
}
void almacena(TTrenes &Tren,int pose,int pos,int nest){
if(pos==0){
Tren.estaci[pose].trenes[0]=Tren.paratren[pos+1];
}else{
if(pos==nest){
Tren.estaci[pose].trenes[0]=Tren.paratren[pos-1];
}else{
Tren.estaci[pose].trenes[0]=Tren.paratren[pos-1];
Tren.estaci[pose].trenes[1]=Tren.paratren[pos+1];
}
}
}
void almacenaestaciones(TTrenes &Tren,int nest,int x,int pos,){
while(pos<nest){
int pose=Posicionestacion(Tren,nest,x,pos);
if((Tren.paratren[0]==Tren.estaci[pose].estacion)||(Tren.paratren[nest-1]==Tren.estaci[pose].estacion)){
Tren.estaci[pose].ncox++;
}else{
if(Tren.paratren[pos-1]>0){
Tren.estaci[pose].ncox++;
}
if(Tren.paratren[pos+1]>0){
Tren.estaci[pose].ncox++;
}
}
almacena(Tren,pose,pos,nest);
pos++;
}
cout<<"Conectividad Almacenada"<<endl;
}
void recotren(TTrenes &Tren,int x,int nest,int pos){
int est;
cout<<"Intoduce las estaciones"<<endl;
f[b]or(int p=0;p<nest;p++)[/b]{
cin>>est;
if(est>x){
while(est>x){
cout<<"Error,numero no permitido"<<endl;
cin>>est;
}
}
[b]Tren.paratren[p]=est;[/b]
}
almacenaestaciones(Tren,nest,x,pos);
Tren.ntrenes++;
}
TTrenes Tren[100];
int contador = 0;
do{
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren[contador],x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
contador++;
}while(opc!='n');
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
while(opc!='n'){
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}
if((x<2)||(x>MAXT)){
cout<<"Error, numero no permitido,introduzca un numero valido"<<endl;
cout<<"Numero total de estaciones? "<<endl;
cin>>x;
}
inicialiazarestaciones(Tren,x);
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
while(opc!='n'){
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
[u][b]recotren(Tren,x,nest,pos,fin);[/b][/u]
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
while(opc!='n'){
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}
do
{
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}while(opc!='n');
void inicializartrenes(TTrenes &Tren){
Tren.ntrenes=0;
}
amchacon escribió:No sé si es por el foro, pero tienes que arreglar mucho el interlineado. Tienes que dejar más espacios y separaciones.
Los nombres de las variables SON MUY CONFUSOS. Me ha costado mucho entender para que servía cada cosa, tienes que usar nombres concretos, claros y evitar ambiguedades (estacion y estaci???).
Sé puede tener la mesa desordenada, se puede tener el armario patas arriba... Pero en la programación no se puede ser desordenado, de ese modo te costará mucho más tiempo identificar los errores... Y no digamos una persona externa T_T.
Luego también se podrían añadir anotaciones y demás... Aunque eso ya es más segundario.
En cuanto al error, se encuentra en esta función:void recotren(TTrenes &Tren,int x,int nest,int pos){
int est;
cout<<"Intoduce las estaciones"<<endl;
f[b]or(int p=0;p<nest;p++)[/b]{
cin>>est;
if(est>x){
while(est>x){
cout<<"Error,numero no permitido"<<endl;
cin>>est;
}
}
[b]Tren.paratren[p]=est;[/b]
}
almacenaestaciones(Tren,nest,x,pos);
Tren.ntrenes++;
}
Cada vez que se usa la funcion, P se resetea y siempre se le da los mismos valores (entre 0 y nest).
La solución estaría en guardar cada tren en una variable diferente... O mejor aún, hacer un array de trenes:TTrenes Tren[100];
Y luego le pasas a la función el numero de tren que estas editando:int contador = 0;
do{
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren[contador],x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
contador++;
}while(opc!='n');
Esas líneas irían en sustitución de:cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
while(opc!='n'){
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}
Y con eso iría... Ah. Te hago una lista con algunas cosas que se podrían corregir en tu programa:if((x<2)||(x>MAXT)){
cout<<"Error, numero no permitido,introduzca un numero valido"<<endl;
cout<<"Numero total de estaciones? "<<endl;
cin>>x;
}
Aquí tendría que ir un while en vez de un if (supongo, que querras que se repita hasta que le des una coordenada buena).inicialiazarestaciones(Tren,x);
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
while(opc!='n'){
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
[u][b]recotren(Tren,x,nest,pos,fin);[/b][/u]
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}
Esa función no tiene 5 parametros sino 4. Supongo que te confundirias.cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
while(opc!='n'){
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}
Lo que entiendo aquí, es que quieres introducir un estaciones hasta que el usuario diga no... No tienes que poner el codigo dos veces, basta con que uses un do while:do
{
cout<<"Introduce el numero de estaciones del recorrido del tren "<<endl;
cin>>nest;
recotren(Tren,x,nest,pos);
cout<<"Quiere introducir el recorrido de otro tren?"<<endl;
cin>>opc;
}while(opc!='n');
La condición no se comprueba hasta el final, menos código y más claro quedavoid inicializartrenes(TTrenes &Tren){
Tren.ntrenes=0;
}
Haces una función solo para eso? T_T
Mejor metelo dentro de otra, como la de "InicializarEstaciones".
PD: No te ofendas, yo tampoco era mejor cuando empezé