ДАЮ 1ОО БАЛЛОВ! СРОЧНО!!! Нужна программа ** С++ Хотя бы часть! Опишите класс С - книга....

0 голосов
54 просмотров

ДАЮ 1ОО БАЛЛОВ! СРОЧНО!!! Нужна программа на С++ Хотя бы часть! Опишите класс С - книга. Члены класса - автор - динамическая строка символов, название книги - строка символов, год издания целое число. Определите в классе конструктор по умолчанию, конструктор инициализации, деструктор класса и функции - члены класса чтения имени автора книги, чтения названия книги, чтения цены книги, года издания. Объявите в классе дружественную функцию для изменения года издания и цены книги. В программе покажите работоспособность класса С.


Информатика (561 баллов) | 54 просмотров
Дан 1 ответ
0 голосов

В задании указано сделать дружественную функцию для того чтобы устанавливать новую цену на книгу, но не указано делать поле price, поэтому я его добавил (с типом double).

Мой вариант:

#include

#include

using namespace std;

class Book

{

   char *autor;

   char name[50];

   int year;

   double price;

public:

   Book()

   {

       autor = new char[50];

       strcpy(autor,"undefined");

       strcpy(name,"undefined");

       year=0;

       price=0;

   }

   Book(char *name, char *autor, int year, double price)

   {

       this->autor = new char[50];

       this->year=year;

       strcpy(this->name,name);

       strcpy(this->autor,autor);

       this->price=price;

   }

   ~Book()

   {

       delete[]autor;

   }

   char* getName() { return name; }

   char* getAutor() { return autor; }

   double getPrice() { return price; }

   int getYear() { return year; }

   friend  void setPrice(Book& obj, double price);

   friend  void setYear(Book& obj, int year);

};

void setPrice(Book& obj, double price)

{

   obj.price = price;

}

void setYear(Book& obj, int year)

{

   obj.year = year;

}

int main()

{

   Book b("Harry Potter","Joanne Rowling",1995,100);

   cout

   cout

   cout

   cout

   setPrice(b,150);

   setYear(b,1997);

   cout

   cout

   cin.get();

   cin.get();

}

(1.5k баллов)
0

Пример:class MyClass{ public: void foo();};void MyClass::foo(){ // do something}

0

На счет конструктора и названий таких же как и у полей класса. Для этого специально разработаны разные Code Style - советую ознакомиться хотя бы с геософтовским. Если говорить о том как избежать одинаковых названий переменных, то можешь обнаружить в подавляющем большинстве кодингстайлов, что переменные аттрибуты объекта следует называть с приставки с какой-нибудь буквой, к примеру m (member), что повышает как читабельность так и простоту содержания кода в чистоте, так же об жтом говорит Маерс.

0

4. На счет константных методов. Рекомендую почитать Маерса на которого бесконечно тут ссылаюсь - метериал очень доступный, а так как он, так и сам Страуструп говорит о том, что все методы не модифицирующие внутреннее состояние класса следует делать константными, по тому, что дефинишн класса это по факту твой API к сущности, в твоем случаи он не соответствует её внутреннему поведению (метод не константный = предпологается что он модифицирует внутренее состояние сущности, хотя у тебя это не так).

0

5. Рекомендовано писать френд-функции вначале дефинишена класса (вообще рекомендовано от слова "совсем" их не использовать, но в нашем случаи задание такое), обусловленно это тем, что все external dependency должны быть прозрачно видны сразу, а не там, куда может программист и не дочитать.

0

6. Консоль выключается только если ты программируешь через визуал студию и не умеешь её настраивать (запусти просто не через дебаг мод, скорее всего поможет). Ты делаешь по факту костыль который будет мешать нормальной работе программы. Это следует удалить и научиться пользоваться средой в которой ты работаешь.

0

7. Компилятор многое делает за ленивых программистов, да не все. По скольку программирование на C++ это не тоже самое что на Js/Python итд что позволяет писать что угодно и как угодно и все равно будет работать... На C++ требуется особое внимание к таким мелочам как качество кода, в данном случаи работает правило One enter point - One exit point. В твоем случаи последнее отсутствует, рекомендовано вставлять по двум причинам - очевидность кода и снижение потенциально опасных мест.

0

Теперь то что ниже ты написал:- Обучение (не важно школьника или не школьника) должно быть корректным и правильным. Коль ты не хочешь, не знаешь или не умеешь писать как минимум хорошо, то лучше не берись. Ты вливаешь информацию на самых ранних этапах обучения, что всенепременно ведет к тому, что придется переучиваться позже, что есть больнее и сложнее.

0

- this является лишней конструкцией в конструкторе объекта (простите за товтологию), решается это адекватным неймингом переменных и полей класса. В тот же момент как return в main как я уже ссылался к правилу One enter point - one exit point является вопиющим его нарушением.

0

- Навыки адеватного написания кода пригодятся в работе, следует выробатывать их начиная с обучения, ибо такими темпами работы может и не быть по этому направлению. А как сказал выше, следует писать как минимум хорошо, если речь заходит об ответах тут.

0

Постскриптум1. Я не говорю что твой ответ плохой, но косяки есть, и их следует исправлять, не в этом ответе так в следующих.2. Я коментирую ответы на C и C++ и буду коментировать, это моя стехия и я слежу что бы ответы были либо хорошими, либо коментирую что не так - для этого коментарии тут и нужны.3. Все что я писал - не из 90х, ты можешь это найти в книгах подолбных Effective Modern C++ или C++ the complete reference от создателей языка либо людей с огромным опытом и признаным авторитетом.