ayuda programacion c++

buenas estoy estudiando el grado de telematica y es que estoy pillado en un sitio y no se como hacerlo;

tengo que hacer una practica para ahora para septiembre que consiste en
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


tengo hecho casi todo el programa, lo unico es que no se es ir almacenando las estaciones que estan relacionadas , hago bien el recorrido del primer tren que me lo almacena bien pero ya en el segundo se me sobreescriben ¿como podria hacerlo? os dejo el codigo tambien
#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;
}



Gracias!!!
Hola, verás creo que el lugar ideal sería alguno de los foros de PC, reporto para que te lo muevan, que creo que allí te ayudarán mejor.

Un cordial saludo.
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 queda ;)


void 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é [carcajad]
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 queda ;)


void 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é [carcajad]

Como mola EOL jijiji.... yo he empezado a mirar código pero me perdia jajaja

Saludos
muchisssssissssimas graciiiaassssssssss d verdad llevaba 1 semana bloqueado, gracias
4 respuestas