#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
может быть добавлен как к методу, так и к указателю, и указатель, вероятно, должен быть ссылочным.