‘орум программистов, компьютерный форум CyberForum.ru

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

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

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

17.02.2014, 20:46. ѕросмотров 339. ќтветов 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");
}
«аранее благодарен за помощь.
Ћучшие ответы (1)
Similar
Ёксперт
41792 / 34177 / 6122
–егистраци€: 12.04.2006
—ообщений: 57,940
17.02.2014, 20:46     ”совершенствование кода
ѕосмотрите здесь:

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

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

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

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

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

”совершенствование кода по переносу диаграмм - VBA
ѕодскажите пожалуйста, есть хороший нижеуказанный код по переносу и формированию всех диаграмм с одного листа на другой, но у мен€ очень...

”совершенствование кода пакета LAPACK(CLAPACK) - јлгоритмы
я на интеловской странице опубликовал усовершенствование кода одной из функций пакета LAPACK(CLAPACK), котора€ используетс€ во многих...

ѕосле регистрации реклама в сообщени€х будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
–егистраци€: 25.03.2012
—ообщений: 5,924
«аписей в блоге: 1
17.02.2014, 21:08     ”совершенствование кода #2
»спользовать вместо char* string,
mustimur
268 / 222 / 57
–егистраци€: 22.11.2013
—ообщений: 832
«аписей в блоге: 1
17.02.2014, 21:19     ”совершенствование кода #3
Ќет защиты от ошибок: а что будет если 11 раз подр€д вызвать AddBook? ј вообще посоветовал бы
C++
1
Book books[10];
сделать динамическим (освобождение пам€ти в диструкторе класса Library), а в класс Book добавил бы два конструктора с параметрами и без, или вообще отказалс€ от него в пользу структуры
Kuzia domovenok
1890 / 1745 / 118
–егистраци€: 25.03.2012
—ообщений: 5,924
«аписей в блоге: 1
17.02.2014, 21:22     ”совершенствование кода #4
SergeyS, использовать вместо char* string.
»наче возникает куча проблем с контролем утечек.  онструктор копировани€, оператор равно? ¬ыделение/удаление пам€ти под них € вообще не вижу и.т.д.
» контролировать пам€ть под строки, вообще говор€, не работа дл€ класса Book! —ледовательно только string!
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,

Ќе по теме:

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

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

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

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

ƒобавлено через 17 минут
ѕочитай ещЄ это: ¬озвращение к C++ (современный C++)
Tulosba
:)
Ёксперт —++
4393 / 3236 / 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> (иначе зачем он включен?).
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");
}
MoreAnswers
Ёксперт
37091 / 29110 / 5898
–егистраци€: 17.06.2006
—ообщений: 43,301
28.02.2014, 00:18     ”совершенствование кода
≈ще ссылки по теме:

.NET 2.x усовершенствование программы в C# - C#
помогите подскажите как сделать что бы к примеру на ‘орм 1 было форма входа (Ћогин и ѕароль), и когда они правильны эта форма как бы...

усовершенствование скрипта - PHP
«дравствуйте, »мею рабочий скрипт который выводит ћеню –одителей и детей. соответственно 2 цикла &lt;ul id=&quot;navmenu-v&quot;&gt; &lt;?php ...

”совершенствование программы - Delphi
ѕодскажите пожайлуста как к готовой программе не име€ исходника добавить свой код. ƒл€ примера в программе открываетс€ окно с кнопкой...

”совершенствование javascript  алькул€тора - JavaScript
«дравствуйте ‘орумчане! Ќужна небольша€ помощь, решил начать изучать &quot;html css javascript&quot;, и получил задание написать...


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

»ли воспользуйтесь поиском по форуму:
Avazart
Ёксперт —++
7116 / 5293 / 273
–егистраци€: 10.12.2010
—ообщений: 23,405
«аписей в блоге: 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, Ѕлин прогл€дел твой пост...

Yandex
ќбъ€влени€
28.02.2014, 00:18     ”совершенствование кода
ќтвет —оздать тему
ќпции темы

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