‘орум программистов, компьютерный форум, киберфорум
Ќаши страницы

—++ дл€ начинающих

¬ойти
–егистраци€
¬осстановить пароль
 
SergeyS
153 / 145 / 6
–егистраци€: 12.03.2011
—ообщений: 807
#1

”совершенствование кода - C++

17.02.2014, 20:46. ѕросмотров 350. ќтветов 8
ћетки нет (¬се метки)

ƒобрый вечер форумчане. “олько вхожу в C++ и объектно-ориентированное программирование на нЄм, хочетс€ учитьс€ сразу писать правильно.

¬ общем накатал следующее: два класса, книга(Book) и библиотека(Library). Ѕиблиотека инициализируетс€ 10-ю книгами, нужно было предусмотреть возможность поиска по полю и сортировку. ’отелось бы услышать советов по улучшению кода (без сильных извращений) и указать на ошибки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <algorithm>
#include <string.h>
 
class Book {
      public:
             char *Author,*Title,*Publishers;
             int Year;
   
};
      
class Library {
      
      Book books[10];
      int BooksCount;
      
      public:
             Library() { BooksCount = 0; }
                
             bool SearchByAuthor(char* Query) {
                   int i = 0; bool IsSearched = false;
                   while (i < BooksCount) {
                         if (strstr(books[i].Author, Query)) {
                             std::cout << i+1 << "." << books[i].Author <<" "
                                       << "\"" << books[i].Title<<"\", "
                                       << books[i].Publishers <<", "
                                       << books[i].Year << "\n";
                             IsSearched = true;                      
                         }
                         i++;
                   }
                   return IsSearched;          
             }
                             
             void SortByYear() {
                  for (int i = BooksCount - 1 ; i >=0 ; i--) {
                      for (int j = 0 ; j < i ; j++) {
                          if (books[j].Year > books[j+1].Year) {
                                       Book tmp = books[j];
                                       books[j] = books[j+1];
                                       books[j+1] = tmp;
                                       }
                      }
                  } 
             }
             
             void AddBook(char* Author,char* Title,char* Publishers,int Year) {
                  books[BooksCount].Author = Author;
                  books[BooksCount].Title = Title;
                  books[BooksCount].Publishers = Publishers;
                  books[BooksCount].Year = Year; 
                  
                  BooksCount++;  
             } 
             
             void ShowBooks() {
                  for (int i = 0 ; i < BooksCount ; i++) {
                      std::cout << i+1 << "." << books[i].Author <<" "
                                         << "\"" << books[i].Title<<"\", "
                                         << books[i].Publishers <<", "
                                         << books[i].Year << "\n";
                      }
             }
      };
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Library* lib = new Library();
    
    lib->AddBook("Ўилдт √.","¬ведение в C++","Osborne",2009);
    lib->AddBook("Ѕьерн —трауструп","язык программировани€ C++","OZON",2011);
    lib->AddBook("ƒэвид –. ћюссер","STL Tutorial and Reference guide","OZON",2010);
    lib->AddBook("Robert Lafore","Object-Oriented Programming in C++","Osborne",2011);
    lib->AddBook("Ѕ. —трауструп","The Design and Evolution of C++ ","AddisonЦWesley Pub Co",1994);
    
    std::cout << "Ѕиблиотека содержит:\n"; lib->ShowBooks();
    lib->SortByYear();
    std::cout << "\nCортировка по году издани€:\n"; lib->ShowBooks();
    std::cout << "\n¬се книги автора \"—трауструп\":\n" ;lib->SearchByAuthor("—трауструп");
    system("PAUSE");
}
«аранее благодарен за помощь.
0
Ћучшие ответы (1)
Ќадоела реклама? «арегистрируйтесь и она исчезнет полностью.
Similar
Ёксперт
41792 / 34177 / 6122
–егистраци€: 12.04.2006
—ообщений: 57,940
17.02.2014, 20:46
«дравствуйте! я подобрал дл€ вас темы с ответами на вопрос ”совершенствование кода (C++):

усовершенствование кода - C++
сделал код дл€ создани€ целочисленной матрицы, котора€ берет размерность из файла и значени€ оттуда же код работает только если после...

усовершенствование кода - C++
как сделать чтобы он сначало показевал что написано в файле а уже потом просил изменить какоето слово?? пробовал он только показевал но не...

ќптимизаци€ и усовершенствование - C++
«дравствуйте, совсем недавно начал изучать €зык программировани€ &quot;—++&quot;. –ешил попрактиковатьс€, сделал маленькую консольную игру. Ќазвал...

”совершенствование программы, деление нацело и остаток от делени€ - C++
ƒобрый вечер, учусь программировать на —++. ѕридумал одну задачку и решил написать на с++ программу, котора€ будет еЄ решать. ¬ообщем,...

¬ынести основную часть кода кода в отдельную функцию - C++
помогите пожалуйста переделать это на функцию... #include &lt;locale.h&gt; #include &lt;conio.h&gt; int main() { setlocale(0,&quot;&quot;); float...

”часток B кода выполн€етс€ позже, чем участок A кода, но почему-то B вли€ет на работоспособность A! ѕочему? - C++
ƒрузь€! “о есть суть така€, создаю объект и в конструктор передаю им€ процесса и хэндл снимка системы. ј в конструкторе начинаетс€...

8
Kuzia domovenok
1952 / 1805 / 140
–егистраци€: 25.03.2012
—ообщений: 6,253
«аписей в блоге: 1
17.02.2014, 21:08 #2
»спользовать вместо char* string,
1
mustimur
268 / 222 / 57
–егистраци€: 22.11.2013
—ообщений: 832
«аписей в блоге: 1
17.02.2014, 21:19 #3
Ќет защиты от ошибок: а что будет если 11 раз подр€д вызвать AddBook? ј вообще посоветовал бы
C++
1
Book books[10];
сделать динамическим (освобождение пам€ти в диструкторе класса Library), а в класс Book добавил бы два конструктора с параметрами и без, или вообще отказалс€ от него в пользу структуры
1
Kuzia domovenok
1952 / 1805 / 140
–егистраци€: 25.03.2012
—ообщений: 6,253
«аписей в блоге: 1
17.02.2014, 21:22 #4
SergeyS, использовать вместо char* string.
»наче возникает куча проблем с контролем утечек.  онструктор копировани€, оператор равно? ¬ыделение/удаление пам€ти под них € вообще не вижу и.т.д.
» контролировать пам€ть под строки, вообще говор€, не работа дл€ класса Book! —ледовательно только string!
1
mustimur
268 / 222 / 57
–егистраци€: 22.11.2013
—ообщений: 832
«аписей в блоге: 1
17.02.2014, 21:25 #5
’от€ очень смущает вот это:
÷итата —ообщение от SergeyS ѕосмотреть сообщение
:
* * * * * * *char *Author,*Title,*Publishers;
ѕри определенном развитии кода отсутствие диструктора в этом классе по-моему может стать причиной утечек пам€ти в вашей программе. “ак что присоединюсь к совету Kuzia domovenok.

ƒобавлено через 51 секунду
Kuzia domovenok,

Ќе по теме:

опередил думаем одинаково

2
Casper-SC
Ёксперт .NET
3521 / 1740 / 183
–егистраци€: 27.03.2010
—ообщений: 4,927
«аписей в блоге: 1
17.02.2014, 21:49 #6
Ћучший ответ —ообщение было отмечено автором темы, экспертом или модератором как ответ
“о что твой класс пишет в консоль внутри метода класса Library уже не правильно в плане ќќѕ

ƒобавлено через 34 секунды
¬озвращай результат, уж точно класс Library не должен выводить данные куда либо. ѕо крайне мере так, как это сделано сейчас.

ƒобавлено через 48 секунд
ќткрытые (public) пол€, тоже в ќќѕ не приветствуетс€.

ƒобавлено через 17 минут
ѕочитай ещЄ это: ¬озвращение к C++ (современный C++)
3
Tulosba
:)
Ёксперт —++
4397 / 3233 / 297
–егистраци€: 19.02.2013
—ообщений: 9,045
17.02.2014, 22:26 #7
ѕомимо ранее сказанного:
1. ¬место массива из фиксированного числа книг использовать std::vector или std::list в зависимости от того как планируетс€ манипулировать книгами в библиотеке;
2. ћетоды, не модифицирующие логическое состо€ние объекта, объ€вить константными;
3. ѕерегрузить операторы вывода (ввода) дл€ используемых классов;
4. ћетод AddBook всЄ же должен принимать книгу и делать ее частью библиотеки, а не создавать ее внутри себ€;
5. ¬ дальнейшем можно сделать тип Book полиморфным и реализовать иерархию книг: научные, художественные ...;
6. —овершенно ненужное создание объекта библиотеки в куче (строка 74), а если уж сделано так, то не помешает и освобождение объекта добавить;
7. ƒл€ поиска и сортировки использовать стандартные алгоритмы из <algorithm> (иначе зачем он включен?).
1
SergeyS
153 / 145 / 6
–егистраци€: 12.03.2011
—ообщений: 807
28.02.2014, 00:05  [“—] #8
Ѕлагодарю всех за помощь. ћногое из того что советовали на практике не примен€л, но получилась на выходе така€ ересь. “о, что массив объектов фиксированный - это нормально, так задуманно. ¬ывод в консоль пока оставил, уберу позже.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <algorithm>
#include <cstring>
 
using namespace std;
 
class Book {
      
      string Author,Title,Publishers;
      int Year;
      
      public:
             void SetAuthor(string Author) { this->Author = Author; }
             void SetTitle(string Title) { this->Title = Title; }
             void SetPublishers(string Publishers) { this->Publishers = Publishers; }
             void SetYear(int Year) { this->Year = Year; }
             
             string GetAuthor() const { return Author; }
             string GetTitle() const { return Title; }
             string GetPublishers() const { return Publishers; }
             int GetYear() const { return Year; }
             
             Book(){};
             
             Book (string Author, string Title, string Publishers, int Year) {
                  this->Author = Author;
                  this->Title = Title;
                  this->Publishers = Publishers;
                  this->Year = Year;
             }
             
             Book& operator = (const Book &other) {
                  this->Author = other.Author;
                  this->Title = other.Title;
                  this->Publishers = other.Publishers;
                  this->Year = other.Year;
                  return *this;
             }
             
             Book(const Book &other) {
                  *this = other;
             }
   
};
      
class Library {
      
      Book books[10];
      int BooksCount;
      
      public:
             Library() { BooksCount = 0; }
                
             bool SearchByAuthor(string Query) const {
                   int i = 0; bool IsSearched = false;
                   while (i < BooksCount) {
                         if (strstr(books[i].GetAuthor().c_str(), Query.c_str())) {
                                  cout << i+1 << "." << books[i].GetAuthor() <<" "
                                       << "\"" << books[i].GetTitle()<<"\", "
                                       << books[i].GetPublishers() <<", "
                                       << books[i].GetYear() << "\n";
                             IsSearched = true;                      
                         }
                         i++;
                   }
                   return IsSearched;          
             }
                             
             void SortByYear() {
                  for (int i = BooksCount - 1 ; i >=0 ; i--) {
                      for (int j = 0 ; j < i ; j++) {
                          if (books[j].GetYear() > books[j+1].GetYear()) {
                                       Book tmp = books[j];
                                       books[j] = books[j+1];
                                       books[j+1] = tmp;
                                       }
                      }
                  } 
             }
             
             void AddBook(Book item) {
                  books[BooksCount] = item;
                  BooksCount++;
             } 
             
             void ShowBooks() const {
                  for (int i = 0 ; i < BooksCount ; i++) {
                      cout << i+1 << "." << books[i].GetAuthor() <<" "
                                         << "\"" << books[i].GetTitle() <<"\", "
                                         << books[i].GetPublishers() <<", "
                                         << books[i].GetYear() << "\n";
                      }
             }
             
          
      };
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Library* lib = new Library();
    
    Book item(string("√Ш√®√Ђ√§√≤ √Г."),string("√В√Ґ√•√§√•√*√®√• √Ґ C++"),string("Osborne"),2009);
    lib->AddBook(item);
    
    item.SetAuthor("√Б√Љ√•√∞√* √С√≤√∞√*√≥√±√≤√∞√≥√ѓ"); item.SetTitle("√Я√І√ї√™ √ѓ√∞√Ѓ√£√∞√*√ђ√ђ√®√∞√Ѓ√Ґ√*√*√®√њ C++"); 
    item.SetPublishers("OZON"); item.SetYear(2011);
    lib->AddBook(item);
    
    item.SetAuthor("√Д√љ√Ґ√®√§ √Р. √М√Њ√±√±√•√∞"); item.SetTitle("STL Tutorial and Reference guide"); 
    item.SetPublishers("OZON"); item.SetYear(2010);
    lib->AddBook(item);
    
    item.SetAuthor("Robert Lafore"); item.SetTitle("Object-Oriented Programming in C++"); 
    item.SetPublishers("Osborne"); item.SetYear(2011);
    lib->AddBook(item);
    
    item.SetAuthor("√Б. √С√≤√∞√*√≥√±√≤√∞√≥√ѓ"); item.SetTitle("The Design and Evolution of C++ "); 
    item.SetPublishers("AddisonЦWesley Pub Co"); item.SetYear(1994);
    lib->AddBook(item);
    
    cout << "√Б√®√°√Ђ√®√Ѓ√≤√•√™√* √±√Ѓ√§√•√∞√¶√®√≤:\n"; lib->ShowBooks();
    lib->SortByYear();
    std::cout << "\nC√Ѓ√∞√≤√®√∞√Ѓ√Ґ√™√* √ѓ√Ѓ √£√Ѓ√§√≥ √®√І√§√*√*√®√њ:\n"; lib->ShowBooks();
    std::cout << "\n√В√±√• √™√*√®√£√® √*√Ґ√≤√Ѓ√∞√* \"√С√≤√∞√*√≥√±√≤√∞√≥√ѓ\":\n" ;lib->SearchByAuthor("√С√≤√∞√*√≥√±√≤√∞√≥√ѓ");
    
    delete lib;
    system("PAUSE");
}
0
Avazart
Ёксперт —++
7247 / 5419 / 297
–егистраци€: 10.12.2010
—ообщений: 24,047
«аписей в блоге: 17
28.02.2014, 00:18 #9
C++
1
2
3
4
5
6
7
8
typedef std::vector<Book> Library;
 
Library lib;
 
lib.push_back( Book("Ўилдт √.","¬ведение в C++","Osborne",2009) );
 
std::find_if( /* ... */ );
std::sort( /* ... */ );
ѕочитай про контейнеры ( в том числе про std::string) и алгоритмы.

ƒобавлено через 5 минут

Ќе по теме:

Tulosba, Ѕлин прогл€дел твой пост...

0
28.02.2014, 00:18
MoreAnswers
Ёксперт
37091 / 29110 / 5898
–егистраци€: 17.06.2006
—ообщений: 43,301
28.02.2014, 00:18
ѕривет! ¬от еще темы с ответами:

—оздание кода программы с нул€!! создание кода C++ - C++
¬ќ“ ”—Ћќ¬»≈ : ƒл€ данного вещественного x,a,b,c найти значение следующей функции f,принимающей вещественное задани€: ...

”совершенствование кода - C#
ƒобрый день. ѕрограмма работает таким образом, загружает 2 картини в разных PictureBox, далее обрабатывает эти две картинки и выводин в...

”совершенствование кода - Python
ƒобрый вечер, хочу чтобы входные данные были (¬ведите значение функции: ) Ќо никак не получаетс€ в f(x) затолкать инпут, выручайте #...

”совершенствование кода, пожалуйста - Free Pascal
uses crt; const MaxSize = 1000; type arr = array of string; procedure Act(var InputFile : text; var OutputFile : text;...


»скать еще темы с ответами

»ли воспользуйтесь поиском по форуму:
9
ќтвет —оздать тему
ќпции темы

 ибер‘орум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
–ейтинг@Mail.ru