2013-09-18 3 views
0

У меня есть моя программа, работающая нормально, за исключением одной незначительной проблемы, которую я не могу понять. Сначала я хочу, чтобы пользователь вводил метод сортировки, а затем вводил значения в массив указателей, пока пользователь не закончит ввод с помощью^D. После того, как пользователь заканчивает ввод, моя программа печатает пользовательский ввод от наивысшего до самого низкого на основе требуемого метода сортировки. Опять же, у меня все работает, и сортировка действительно происходит, но то, что я хочу сделать, это печать на основе порядка ввода пользователя, если два значения методов сортировки одинаковы. Вот мой код, если требуется какое-либо дополнительное разъяснение, просто спросите.Попытка не поменять местами с сортировкой пузыря, если значения одинаковы

main.cpp

5 #include<iostream> 
6 using namespace std; 
7 
8 #include "video.h" 
9 
10 #include<string> 
11 
12 int main() 
13 { 
14 const int MAX = 100; // maximum number of things stored in the array 
15 Video *vids[MAX]; // Video pointer for Video objects 
16 int num_vids = 0; // counter for number of videos 
17 
18 string title, url, comment; // for title, url, and comment respectively 
19 float length; // for length 
20 int rating; // for rating 
21 
22 string sort; // for sorting method 
23 
24 cout << "How would you like to sort these videos, by rating, length, or title? " <<  endl; 
25 cin >> sort; 
26 cin.ignore(); 
27 
28 if((sort != "length") && (sort != "rating") && (sort != "title")) 
29 { 
30 cerr << sort << " is not a legal sorting method, giving up." << endl; 
31 return 1; 
32 } 
33 
34 cout << "Enter a Title: " << endl; 
35 while(getline(cin,title)) 
36 { 
37 cout << "Enter the URL: " << endl; 
38 getline(cin,url); 
39 
40 cout << "Enter a comment: " << endl; 
41 getline(cin,comment); 
42 
43 cout << "Enter the length: " << endl; 
44 cin >> length; 
45 
46 cout << "Enter a rating of 1-5: " << endl; 
47 cin >> rating; 
48 cin.ignore(); 
49 
50 vids[num_vids] = new Video(title,url,comment,length,rating); 
51 num_vids++; 
52 
53 cout << "Enter a Title: " << endl; 
54 } 
55 cout << endl; 
56 
57 if((num_vids > MAX)) 
58 { 
59 cerr << "Too many video entries, giving up." << endl; 
60 return 1; 
61 } 
62 
63 if((sort == "length")) 
64 { 
65 for(int last = num_vids-1; last > 0; last--) 
66 for(int cur = 0; cur < last; cur++) 
67  if((vids[cur]->longer(vids[cur+1]) == false)) 
68  swap(vids[cur], vids[cur+1]); 
69 } 
70 
71 else if((sort == "rating")) 
72 { 
73 for(int last = num_vids-1; last > 0; last--) 
74 for(int cur = 0; cur < last; cur++) 
75  if((vids[cur]->largerRating(vids[cur+1]) == false)) 
76 // if((vids[cur] != vids[cur+1])) 
77  swap(vids[cur], vids[cur+1]); 
78 } 
79 else if((sort == "title")) 
80 { 
81 for(int last = num_vids-1; last > 0; last--) 
82 for(int cur = 0; cur < last; cur++) 
83  if((vids[cur]->alphabetical(vids[cur+1]) == false)) 
84  swap(vids[cur], vids[cur+1]); 
85 } 
86 
87 
88 for(int i = 0; i < num_vids; i++) 
89 { 
90 vids[i]->print(); 
91 } 
92 return 0; 
93 } 

video.cpp

5 #include<iostream> 
6 using namespace std; 
7 
8 #include<string> 
9 
10 #include "video.h" 
11 
12 using namespace std; 
13 
14 Video::Video(string title, string url, string comment, float length, int rating) 
15 { 
16 m_title = title; 
17 m_url = url; 
18 m_comment = comment; 
19 m_rating = rating; 
20 m_length = length; 
21 } 
22 
23 Video::~Video() 
24 { 
25 cout << "object is desructing" << endl; 
26 } 
27 
28 bool Video::longer(Video *other) 
29 { 
30 return m_length > other->m_length; 
31 if((other->m_length > m_length)) 
32 { 
33 return true; 
34 }else 
35 { 
36 return false; 
37 }; 
38 } 
39 
40 bool Video::largerRating(Video *other) 
41 { 
42 return m_rating > other->m_rating; 
43 if((other->m_rating > m_length)) 
44 { 
45 return true; 
46 } 
47 else 
48 { 
49 return false; 
50 }; 
51 } 
52 
53 bool Video::alphabetical(Video *other) 
54 { 
55 return other->m_title > m_title; 
56 if((other->m_title > m_title)) 
57 { 
58 return true; 
59 }else 
60 { 
61 return false; 
62 }; 
63 } 
64 
65 void Video::print() 
66 { 
67 cout << m_title << ", " << m_url << ", " << m_comment << ", " << m_length << ", "; 
68 for(int i = 0; i < m_rating; i++) 
69 { 
70 cout << "*"; 
71 } 
72 cout << endl; 
73 } 
74 

video.h

5 #ifndef VIDEO_H 
6 #define VIDEO_H 
7 
8 #include<iostream> 
9 using namespace std; 
10 
11 #include<string> 
12 
13 class Video 
14 { 
15 public: 
16 Video(string title, string url, string comment,float length, int rating); 
17 ~Video(); 
18 bool longer(Video *other); 
19 bool largerRating(Video *other); 
20 bool alphabetical(Video *other); 
21 void print(); 
22 
23 private: 
24 string m_title; 
25 string m_url; 
26 string m_comment; 
27 float m_length; 
28 int m_rating; 
29 }; 
30 
31 #endif 

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

71 else if((sort == "rating")) 
72 { 
73 for(int last = num_vids-1; last > 0; last--) 
74 for(int cur = 0; cur < last; cur++) 
75  if((vids[cur]->largerRating(vids[cur+1]) == false)) 
76  if((vids[cur] != vids[cur+1])) 
77  swap(vids[cur], vids[cur+1]); 
78 } 

Но все же, не повезло. Любой вход был бы очень полезен.

+2

1: Сократите это до минимального примера. Сброс 270 строк кода не приведет вас никуда. 2: Используйте логические значения.Не говорите 'if (expr == false)'. Скажем 'if (! Expr)'. Не говорите 'if (expr) return true else return false'. Скажите 'return expr'. 3: Случайно угадывая, ваша проблема заключается в том, что вы должны изменить '>' на '> =' в своих методах сравнения, чтобы ваша сортировка была стабильной. (Является ли стабильность вашей проблемой? Трудно сказать.) – Teepeemm

+0

Что делает весь этот код для сортировки? Постарайтесь быть максимально лаконичными и конкретными, задавайте правильные вопросы. Из того, что вы упомянули в своем тексте, я думаю, [это] (http://en.wikipedia.org/wiki/Stable_sort#Stability) имеет значение. – iavr

ответ

-1

Просто изменить условия свопа, как это:

for(int last = num_vids-1; last > 0; last--) { 
    for(int cur = 0; cur < last; cur++) { 
     if(vids[cur+1]->largerRating(vids[cur])) { 
      swap(vids[cur], vids[cur+1]); 
     } 
    } 
} 

Пожалуйста, обратите внимание, что это совершенно лишнее, чтобы сравнить логическое значение логического значения, так что вместо написания условий, как это:

if(condition == true) { 
if(negated == false) { 

вы должны просто написать

if(condition) { 
if(!negated) { 

Вот что bool са re для, в конце концов.

+0

Удивительно, я понимаю это сейчас, большое спасибо. – user1940516

+0

@cmaster "лишний"? Это означало бы, что высказывание «если (условие)» эквивалентно обеим сравнениям, что неверно. И некоторые люди находят, что явное сравнение легче читать. – kfsone

+1

@kfsone «лишний», потому что он полностью не нужен. Он добавляет еще один уровень состояния. Почему бы не сказать 'if ((condition == true) == false)'? Потому что это так же излишне, как писать 'it (condition == true)' в первую очередь. Это просто спам, решительно. – cmaster

0

Есть две возможных причины этой проблемы:

1- Вы сравнивающие поплавки или двойник, которые могут привести к точности проблемам, поэтому сравнение между плавающими типами не должно быть сделано, как это (для пример):

double a,b; 
//some code that defines a and b 
if(a == b) //this is very bad 
    //do something 

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

if(a - b <= std::numeric_limits<float>::epsilon) 
    //do something 

Подробнее о сравнении переменных с плавающей точкой

2- Ваше сравнение компаратор вызывает проблему, так, например, вместо

if(a <= b) 

использование

if(a < b) 

и вице-стих , Попробуйте оба!

Смежные вопросы