Как вы сортируете строку в параметре класса?

#c #string #class #sorting #bubble-sort

#c #строка #класс #сортировка #пузырьковая сортировка

Вопрос:

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

Ввод должен основываться на названии видео, его URL, комментариях, сделанных к видео, длине (в минутах) и рейтинге (в *).

Например:

Гитары United Break, https://www.youtube.com/watch?v 5YGc4zOqozo , Отличный пример того, как один человек заставил слушать гигантскую компанию, 4.5, ***, Пробел против табуляции, https://www.youtube.com/watch?v=SsoOG6ZeyUl , Решайте сами: пробелы или табуляции?, 2.83, ****

Перед вводом любого описания видео пользователю необходимо указать метод сортировки из трех вариантов, Rating, Length, or title . Я выполнил большую часть кода и метода сортировки, заданного моим профессором (пузырьковая сортировка), однако, когда я прошу программу выполнить сортировку по названию (это единственный из трех вариантов, который является строкой), он выводится некорректно. Вот мой код:

 #include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;

#include "video.h"


int main()
{
    string user, url, comment, title;
    int rating;
    double length;
    int i = 0, last = 0;

    Video *videoObj[100];


   // specifies how the videos should be sorted
   cin >> user;
   cin.ignore();


while (getline(cin,title)  ) {


    getline(cin, url);
    getline(cin, comment);
    cin >> length;
    cin >> rating;
    cin.ignore();



    videoObj[i] = new Video(title, url, comment, length, rating);
    i  ;
    last  ;
    }

//------------------------------------------------------------------------
//--------------- Sorts the list based on rating (*) ---------------------
//------------------------------------------------------------------------

    if(user=="rating"){

        for(int i = 0; i < last - 1; i  ){

    for(int j = 0; j< last - i -1; j  ){

    if(videoObj[j  1]->Rating(videoObj[j])){
            swap(videoObj[j], videoObj[j 1]);

      }
    }
  }
}

//------------------------------------------------------------------------
//--------------- Sorts the list based on length -------------------------
//------------------------------------------------------------------------

    if(user=="length"){

        for(int i = 0; i < last - 1; i  ){

    for(int j = 0; j< last - i -1; j  ){

    if(videoObj[j  1]->Length(videoObj[j])){
            swap(videoObj[j], videoObj[j 1]);


      }
    }
  }
}

//------------------------------------------------------------------------
//--------------- Sorts the list based on title --------------------------
//------------------------------------------------------------------------

 if(user=="title"){

        for(int i = 0; i < last - 1; i  ){

    for(int j = 0; j< last - i -1; j  ){

    if(videoObj[j  1]->Title(videoObj[j])){
            swap(videoObj[j], videoObj[j 1]);

      }
    }
  }
}


   for(int i= 0; i < last; i  ){

    videoObj[i]->print();

   }

     //delete[] videoObj;

return 0;
}
  

video.cpp:

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

#include "video.h"

Video::Video(string video_title, string video_link, string video_comment, double video_length, int video_number)
: title(video_title), link(video_link), comment(video_comment), length(video_length), rating(video_number)
{
 m_title = title;
 m_link = link;
 m_comment = comment;
 m_length = length;
 m_rating = rating;
}


bool Video::Rating(Video *other)
{
    if(m_rating > other-> m_rating){
        return true;
    }
    else
    {
        return false;
    }
}


bool Video::Length(Video *other2)
{
     if(m_length > other2-> m_length){
        return true;
    }
    else
    {
        return false;
    }
}

bool Video::Title(Video *other3)
{
     if(m_length > other3-> m_length){
        return true;
    }
    else
    {
        return false;
    }
}

void Video::print(){

string star;
switch(rating){

case 1:
    star = "*";
    break;
case 2:
    star = "**";
    break;
case 3:
    star = "***";
    break;
case 4:
    star = "****";
    break;
case 5:
    star = "*****";
    break;

}

 cout << title << ", " << link << ", " << comment << ", " << length << ", " << star << endl;

}
  

video.h:

 #ifndef VIDEO_H
#define VIDEO_H

using namespace std;

class Video {

public:
    Video(string video_title, string video_link, string video_comment, double video_length, int video_number);
    void print();
    bool Rating(Video *other);
    bool Length(Video *other2);
    bool Title(Video *other3);




private:


    string m_title;
    string m_link;
    string m_comment;
    double m_length;
    int m_rating;

    string title;
    string link;
    string comment;
    double length;
    int rating;

};


#endif
  

Я не совсем уверен, что мне нужно сделать title , чтобы она работала правильно. Я думал о сравнении по строкам, но опять же, не уверен, с чего начать.

Кроме того, еще один вопрос: как мне использовать delete[] videoObj; без получения ошибки?

Комментарии:

1. Зачем использовать одну из худших сортировок, известных в информатике (сортировка пузырьками)? Просто используйте std::sort с функцией предиката.

2. @PaulMcKenzie ха-ха, да, это именно то, что он рекомендовал. Я не совсем уверен, как и где я бы начал с std::sort . Все это ново для меня

3. Ваш Video класс не имеет возможности из внешнего мира получить доступ к каким-либо данным, поскольку данные — это все private . Таким образом, это в основном бесполезный класс для main или любой другой функции или класса вне Video . Сначала вы должны создать Video класс, в котором данные могут запрашиваться, а также задаваться. Прямо сейчас все, что у вас есть, это конструктор и оператор печати.

4. @PaulMcKenzie Но это работает, хотя ..? Что бы вы порекомендовали мне сделать?

5. Как это работает, если, например, main требуется получить заголовок Video объекта? Где находится Video::getTitle() или аналогичная функция?

Ответ №1:

Ну, это неправильно, вероятно, просто опечатка

 bool Video::Title(Video *other3)
{
     if(m_length > other3-> m_length){
        return true;
    }
    else
    {
        return false;
    }
}
  

Это m_title не должно быть m_length (вероятно)

 bool Video::Title(Video *other3)
{
     if(m_title > other3-> m_title){
        return true;
    }
    else
    {
        return false;
    }
}
  

Также этот код можно упростить, вышесказанное можно записать в одну строку

 bool Video::Title(Video *other3)
{
    return m_title > other3-> m_title;
}
  

if (xxx) return true; else return false; точно так же, как return xxx; . Новички часто не понимают, что вы можете вычислять с помощью логических значений таким образом.

Комментарии:

1. Чтобы пойти дальше, const может быть добавлен как к методу, так и к указателю, и указатель, вероятно, должен быть ссылочным.