Программа проверки пункта назначения - C ++ - PullRequest
1 голос
/ 06 августа 2020

Пытаюсь решить следующий вопрос:

Напишите программу, которая будет получать от пользователя

  1. Количество рейсов (N)
  2. пункт назначения поезда (город)
  3. номер поезда для определенного пункта назначения (номер)
  4. название желаемого города назначения, для которого мы ищем возможные поезда. Программа должна найти и отобразить все номера поездов, идущих go в желаемый пункт назначения. Если такого поезда нет, программа должна отображать "Unreachable city!".

Теперь проблема в том, что я написал код, который находит такой номер поезда, но не номера всех поездов, он не может отображать все номера поездов, идущих в желаемый пункт назначения.

Т.е. если я ввожу следующие данные:

3
Chicago I-789
Chicago J-159
Chicago A-465
Chicago

Он показывает мне только последний номер поезда A-465, тогда как правильный ответ будет: I-789 J-159 A-465

#include <iostream>
#include <string>
using namespace std;

class MyClass {  
    
  public:      
  
    string city;      
    string number;  
    
};

int main() {
    
    int N;
    cin >> N;
        
  MyClass myObj;  
  
 for (int i=0; i<N; i++){
     cin>>myObj.city;
     cin>>myObj.number;
 }
 string destination;
 cin >> destination;
     if(myObj.city==destination){
         cout << myObj.number;
     }
     else{
         cout << "Unreachable city!";
     }
  return 0;
}

Ответы [ 3 ]

1 голос
/ 06 августа 2020

На ваш комментарий:

C ++ намного сложнее, чем python.

Языки программирования - это просто инструменты. Вы используете их для решения проблемы. Если вы не знаете, как пользоваться инструментом, вы не сможете решить проблему. Ваш компьютер - это инструмент, и если вы не знаете, как им пользоваться, вы не сможете делать домашнее задание. Это не значит, что компьютерами сложно пользоваться. Точно так же C ++ - это инструмент, если вы этого не знаете, это не значит, что это сложно.

Давайте перейдем к проблеме.

Проблема

Программа должна найти и отобразить все номера поездов, идущих go в желаемый пункт назначения. Если такого поезда нет, программа должна отображать «Недостижимый город!».

Давайте его разберем

  • Внимательно прочитав задачу, мы увидим, что есть не просто «один» поезд, а несколько «поездов».
  • Мы должны получить данные от пользователя (желаемый пункт назначения)
  • Затем мы должны найти «все» «поезда», которые go этот город.
  • Если поезд не найден, мы печатаем «Недостижимый город!»

Проблема с вашим кодом

Проблема с вашим кодом что есть только «один поезд»:

  MyClass myObj;  //one object only

Вы продолжаете перезаписывать его значения каждый раз, когда принимаете ввод от пользователя.

Изучение инструмента

Итак, что ты можешь это исправить? В программировании, когда мы хотим сохранить несколько значений одного и того же объекта, мы обычно создаем массив. Массив - это просто набор значений одного типа. Пример:

int myarray[5]; //can store 5 "int" values
                //size is given inside the [] (square brackets)

Индексы массива начинаются с 0. Мы можем хранить значения в массиве, как показано ниже:

cin >> myarray[0];  //take input from user and store it into the "first" place in our array
cin >> myarray[1]; //store in the "second" place
cin >> myarray[4]; //store in the "last" place
cin >> myarray[5]; //WRONG! Don't do this. It will result in errors and bugs!! (Undefined Behaviour)

Вы также можете сохранять значения напрямую:

int myarray[5] = {1, 2, 3, 4, 5};
cout << myarray[3]; // prints "4"

Это все хорошо и прекрасно, но есть небольшая проблема с массивами. Мы должны знать «размер» массива, прежде чем создавать его.

int N;
cin >> N;
int array[N]; //WRONG, even it works, this is wrong.

Итак, что нам делать? Мы не можем всегда знать, сколько объектов хотим. Не беспокойтесь, потому что C ++ предоставляет нам хороший контейнер: std::vector, который можно использовать для решения этой проблемы.

#include <vector> // you need this for vector
int N;
cin >> N;
std::vector <int> myvector(N); //vector of size N

//access the values as you would with the array
myvector[0] = 10;
myvector[5] = 9; //WRONG. 

Решение вашей проблемы

Обратите внимание, что я не дам вам решение напрямую, но я покажу вам путь и дам вам инструменты. Это ваша проблема, это ваша задача, и если вы попытаетесь, ее довольно легко решить.

Итак, мы узнали о векторах и массивах. Затем вам может быть интересно, как создать вектор для вашего шрифта. Просто:

//create a vector, with size = N
vector <MyClass> Trains (N);

//take input from user
for (int i=0; i<N; i++){
  cin >> Trains[i].city;
  cin >> Trains[i].number;
} 

Последняя часть будет очень похожей. Вам нужно al oop, затем go по всем значениям в векторе, чтобы найти нужные "места назначения".

Дополнительное примечание

Вы должны начать с наименования ваших объектов и переменных таким образом, чтобы вам было легко и естественно думать о вашей проблеме. Например:

class MyClass 

Это никому ничего не говорит о вашем классе или о том, что вы хотите с ним делать. Что может быть лучше для этого? Глядя на проблему, я предлагаю имя Train:

class Train {};

Проблема также говорит нам, что у каждого поезда есть «город назначения» и «номер поезда». Мы можем реорганизовать наш класс Train, чтобы он содержал следующее:

class Train {  
  public:      
    string destination;      
    string number;  
};
1 голос
/ 06 августа 2020

Во-первых, myObj - плохое имя, давайте заменим его на пустой список адресатов.

#include <vector>
...
vector <MyClass> destinations;

Затем, pu sh каждое новое значение в вектор. Для этого было бы лучше иметь конструктор, который устанавливает значения. Создание пункта назначения без значений бессмысленно.

MyClass(string _c, string _n) : city(_c), number(_n) {};
...
string city, number;
cin >> city;
cin >> number;
destinations.pushback(MyClass(city, number));

Теперь вы можете записывать свои циклы в go через вектор, ища нужные вам данные.

0 голосов
/ 06 августа 2020
    #include <iostream>
#include <string>
using namespace std;
#include <vector> // you need this for vector

class Train {  
  public:      
    string city;      
    string number;  
};

int main(){
int N;
cin >> N;
string dest;
vector <Train> Trains (N);
int i;

//take input from user
for (i=0; i<N; i++){
  cin >> Trains[i].city;
  cin >> Trains[i].number;
} 
   cin >> dest;
for(i=0; i<Trains.size(); i++){
  if(Trains[i].city==dest){
     
    cout << Trains[i].number <<" ";
}
else{
    cout << "Unreachable city!";
}
}
}

Теперь рядом с правильными результатами всегда выводится Недоступный город: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...