Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1

Задача работа с классами

19.12.2022, 02:13. Показов 6900. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Подскажите, где ошибка в решении след. задачи:
Задача1.
Все печатные издания имеют название, год издания, состоят из определённого количества страниц, а ещё могут портиться.

1. Создайте базовый класс PrintEditionItem со свойствами:
name,
releaseDate,
pagesCount,
state,
type.
Конструктор класса должен принимать название (name), дату выпуска (releaseDate) и количество страниц (pagesCount) в качестве аргумента. Состояние (state) по умолчанию установите равным 100, тип type пока должен быть равен null.

2. Испорченное издание можно подклеить и этим улучшить его состояние. Создайте метод fix(), увеличивающий state в полтора раза. Метод не должен принимать аргументов.

3. Нельзя улучшить новое издание и бесполезно подклеивать полностью уничтоженное. Создайте «сеттер» для свойства state, принимающий в качестве аргумента новое состояние печатного издания (число).

Если новое состояние меньше 0, «сеттер» должен записать в свойство state значение 0. Если новое состояние больше 100, должно быть записано значение 100. В остальных случаях в свойство state записывается переданное в «сеттер» значение.

4. Создайте «геттер», который читает значение свойства state.
Создайте класс Magazine, который будет наследоваться от класса PrintEditionItem. Конструктор класса должен принимать такие же параметры, как и класс-родитель. От базового печатного издания журнал отличается только типом. Значение свойства type равно "magazine".

5. Создайте класс Book, наследующийся от класса PrintEditionItem. Конструктор класса должен принимать такие же параметры, как и класс-родитель, а также имя автора книги author. Значение свойства type равно "book".

6. Создайте классы NovelBook для романов, FantasticBook для фантастических произведений и DetectiveBook для детективов, наследующиеся от класса Book. Значения свойства type равны "novel", "fantastic" и "detective" соответственно.


Задача 2. (связана с задачей 1)

Следующая задача — подготовить библиотеку к работе в цифровом режиме, то есть реализовать возможности хранить книги, выдавать их читателям и принимать обратно.

1. Создайте класс Library со свойствами:

name,
books.
Конструктор класса должен принимать название библиотеки name (строка). Значением свойства books должен быть пустой массив.

2. Реализуйте метод addBook(book), который будет в качестве аргумента принимать объект (книгу или журнал). Метод должен добавлять книгу в хранилище books, только если состояние state книги больше 30.

3. Создайте метод findBookBy(type, value), который в качестве аргумента будет принимать ключ, по которому идёт поиск (тип, автор, название, год выпуска и пр.) и искомое значение. Метод должен возвращать книгу в случае успеха и null, если книга не найдена.

4. Создайте метод giveBookByName(bookName), который будет в качестве аргумента принимать название книги. Если запрошенная книга найдена, метод должен удалять книгу из хранилища books и возвращать её. Если книга не была найдена, метод должен возвращать null.

У меня большего всего трудностей с задачей 2. Особенно п.3 и п.4. Я вроде представляю, как решить, но не могу это нормально в код написать.

Я же правильно понимаю по з.2, что конструктор класса Library в качестве аргумента должен принимать только название библиотеки. Свойство books не должно передаваться в конструктов в качестве аргумента, его надо создать в конструкторе со значением пустого массива. В это свойство методом addBook будут передаваться экземпляры класса PrintEditionItem или его наследников, то есть печатные издания.
По пн.3. Аргумент type в этом методе - это одно из свойств экземпляров класса PrintEditionItem или его наследников.Нужно обращаться к свойствам объекта, которые переданы как строка - в квадратных скобках.
По пн.4. В метод giveBookByName передается название книги, которое у нас лежит в свойстве name книги, а сама книга является элементом массива books.


Пример использования (по заданию)
JavaScript
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
const library = new Library("Библиотека имени Ленина");
 
library.addBook(
  new DetectiveBook(
    "Артур Конан Дойл",
    "Полное собрание повестей и рассказов о Шерлоке Холмсе в одном томе",
    2019,
    1008
  )
);
library.addBook(
  new FantasticBook(
    "Аркадий и Борис Стругацкие",
    "Пикник на обочине",
    1972,
    168
  )
);
library.addBook(new NovelBook("Герберт Уэллс", "Машина времени", 1895, 138));
library.addBook(new Magazine("Мурзилка", 1924, 60));
 
console.log(library.findBookBy("name", "Властелин колец")); //null
console.log(library.findBookBy("releaseDate", 1924).name); //"Мурзилка"
 
console.log("Количество книг до выдачи: " + library.books.length); //Количество книг до выдачи: 4
library.giveBookByName("Машина времени");
console.log("Количество книг после выдачи: " + library.books.length); //Количество книг после выдачи: 3


Ниже мой вариант решения, подскажите, в чем я ошиблась(

JavaScript
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
class PrintEditionItem {
  constructor (name, releaseDate, pagesCount){
    this.name = name;
    this.releaseDate = releaseDate;
    this.pagesCount = pagesCount;
    this.state = 100;
    this.type = null;
  }
  fix () {
  this.state * 1.5; 
  }
 
set state (number) {
  if (number < 0) {
    this._state = 0;
  }
    if (number >100) {
      this._state = 100;
} else {
  this._state = number;
}
}
 
get state (){
  return this._state;
}
}
class Magazine extends PrintEditionItem {
  constructor (name, releaseDate, pagesCountr){
    super(name);
    this.releaseDate = releaseDate;
    this.pagesCount = pagesCount;
    this.state = 100;
  this._type = "magazine";
}
}
 
class Book extends PrintEditionItem {
  constructor (name, releaseDate, pagesCount, author){
    super(name);
    this.releaseDate = releaseDate;
    this.pagesCount = pagesCount;
    this.state = 100;
  this._type = "book";
  this._author = author;
}
}
 
class NovelBook extends Book {
  constructor (name, releaseDate, pagesCount, author){
    super(name);
    this.releaseDate = releaseDate;
    this.pagesCount = pagesCount;
    this.state = 100;
    this._author = author;
    this._type = "novel";  
}
}
 
class FantasticBook extends Book {
  constructor (name, releaseDate, pagesCount, author){
    super(name);
    this.releaseDate = releaseDate;
    this.pagesCount = pagesCount;
    this.state = 100;
    this._author = author;
    this._type = "fantastic";
}
}
 
class DetectiveBook extends Book {
  constructor (name, releaseDate, pagesCount, author){
    super(name);
    this.releaseDate = releaseDate;
    this.pagesCount = pagesCount;
    this.state = 100;
    this._author = author;
    this._type = "detective";
}
}
 
class Library{
constructor(name,books){
  this.name = name;
  this.books = [];
 }
 
 addBook(PrintEditionItem) {
  if (state > 30){
    this.books.push(Book);
  }
 }
 
findBookBy(type, value){
 PrintEditionItem[name, releaseDate, pagesCount, state, type];
 return this.findBookBy;
 
}
 
giveBookByName(books) {
  if (this.books === true){
    delete this.books
    return this.name;
  } else {
    this.name = null;
  }
}
}
В Jasmine такие ошибки:
Задача №1
создание печатного издания
починка почти целого печатного издания (ограничение сеттером state)
починка печатного издания

геттер для свойства state
сеттер для свойства state
создание объекта Magazine
создание объекта Book
создание объекта NovelBook
создание объекта FantasticBook
создание объекта DetectiveBook

Задача №2
создание библиотеки
добавление книги
поиск книги
выдача книги


В консоле
2019
main.js:5 100
main.js:7 100
main.js:9 undefined
main.js:11 10
main.js:13 10
task.js:89 Uncaught ReferenceError: state is not defined
at Library.addBook (task.js:89:3)
at main.js:17:9
addBook @ task.js:89
(анонимная) @ main.js:17
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2022, 02:13
Ответы с готовыми решениями:

Работа с классами
Здравствуйте, форумчане. Подскажите как при наведении на кнопку с одним классом добавить класс другому классу. Формулировка наверное не...

Работа с контейнерными классами. Задача связана с авиабилетами
Написать программу учета на авиабилеты. Каждая заявка содержит: -пункт назначения - номер рейса -фамилию и инициалы пассажира ...

Работа с классами и пересечение их между собой (задача о городах и поездах)
Здравствуйте. Тут попалась в руки задачка, вкратце суть: Есть города, в каждом городе есть станция, на станции пассажиры, у пасажира...

4
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
19.12.2022, 12:27
Лучший ответ Сообщение было отмечено Anna_Batuk как решение

Решение

Отсутствует присваивание.
JavaScript
10
this.state *= 1.5;
Почему вы передаёте только один аргумент конструктору класса-родителя? Плюс опечатка в аргументе pagesCountr. Также у родителя есть свойство type, а здесь вы объявляете ещё одно свойство _type вместо перезаписывания старого.
JavaScript
28
29
30
31
32
33
class Magazine extends PrintEditionItem {
  constructor (name, releaseDate, pagesCount){
    super(name, releaseDate, pagesCount);
    this.type = "magazine";
  }
}
Судя по примерам, автор передаётся первым аргументом. Поправлен вызов конструктора-родителя с передачей всех его аргументов. Поле type было указано некорректно.
JavaScript
38
39
40
41
42
43
44
class Book extends PrintEditionItem {
  constructor (author, name, releaseDate, pagesCount){
    super(name, releaseDate, pagesCount);
    this.type = "book";
    this.author = author;
  }
}
Остальные констукторы исправить по аналогии:
JavaScript
49
50
51
52
53
54
class NovelBook extends Book {
  constructor (author, name, releaseDate, pagesCount){
    super(author, name, releaseDate, pagesCount);
    this.type = "novel";  
  }
}
Ну дальше каша какая-то. Смотрим исправленный вариант:
JavaScript
88
89
90
91
92
addBook(book) {
  if (book.state > 30){
    this.books.push(book);
  }
}
Поднимаем лекции с темой по работе с массивами. По идее там всё должно быть:
JavaScript
94
95
96
findBookBy(type, value){
  return this.books.find(book => book[type] == value) || null;
}
JavaScript
100
101
102
103
104
105
106
giveBookByName(bookName) {
  const book = this.findBookBy('name', bookName);
  if (book) {
    this.books.splice(this.books.indexOf(book), 1);
  }
  return book;
}
1
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1
19.12.2022, 15:50  [ТС]
Спасибо! Все исправила
0
0 / 0 / 0
Регистрация: 07.08.2024
Сообщений: 1
07.08.2024, 14:27
JavaScript
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
class PrintEditionItem {
    constructor (name, releaseDate, pagesCount) {
        this.name = name
        this.releaseDate = releaseDate
        this.pagesCount = pagesCount
        this.state = 100
        this.type = null
    }
 
    fix () {
        this.state *= 1.5
    }
 
    
    set state (number) {
        if (number < 0) {this.state = 0}
        if (number > 100) {this.state = 100}
        else {this.state = number}
    }
 
 
    get state () {
        return this.state
    }
}
 
class Magazine extends PrintEditionItem {
    constructor (name, releaseDate, pagesCount) {
        super (name, releaseDate, pagesCount)
        this.type = 'magazine'
    }
}
 
class Book extends PrintEditionItem {
    constructor (author, name, releaseDate, pagesCount) {
        super (name, releaseDate, pagesCount)
        this.author = author
        this.type = 'book'
    }
}
 
class NovelBook extends Book {
    constructor (author, name, releaseDate, pagesCount) {
        super (author, name, releaseDate, pagesCount)
        this.type = 'novel'
    }
}
 
class FantasticBook extends Book {
    constructor (author, name, releaseDate, pagesCount) {
        super (author, name, releaseDate, pagesCount)
        this.type = 'fantastic'
    } 
}
 
class DetectiveBook extends Book {
    constructor (author, name, releaseDate, pagesCount) {
        super (author, name, releaseDate, pagesCount)
        this.type = 'detective'
    }
}
 
 
class Library {
    constructor (name) {
        this.name = name
        this.books = []
    }
 
    addBook(book) {
        if (book.state > 30) {this.books.push(book)}
    }
 
    findBookBy(type, value) {
        return this.books.find(book => book[type] == value) || null;
    }
 
    giveBookByName(bookName) {
    const book= this.findBookBy('name', bookName);
        if (book) {
            this.books.splice(this.books.indexOf(book), 1);
        }
        return book;
    }
}
 
const libr = new Library('Библиотека')
 
libr.addBook(new DetectiveBook('Александр Пушкин',
    'Золотая рыбка',
    1850,
    25
))
 
console.log(libr.books)
Искал задачи по классам в JS и наткнулся на эту задачу и решил по условию сделать сам. Сделал, не работает, пошел смотреть подсказки отсюда, исправил, что не так, и все равно не работает.
Сейчас выдает ошибку "Maximum call stack size exceeded" на строку кода "else {this.state = number}" - это 18 строка
Подскажите, что еще не так..?
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3808 / 1646 / 428
Регистрация: 14.03.2022
Сообщений: 4,096
07.08.2024, 16:26
Цитата Сообщение от -Elisei- Посмотреть сообщение
Подскажите, что еще не так..?
Ты не верно делаешь сеттер и геттер... Потому-то и попадаешь в "не управляемую" рекурсию вызовов

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class PrintEditionItem {
    constructor (name, releaseDate, pagesCount) {
        this.name = name
        this.releaseDate = releaseDate
        this.pagesCount = pagesCount
        this._state = 100
        this.type = null
    }
    fix () {
        this._state *= 1.5
    }
    set state (number) {
        if (number < 0) {this._state = 0}
        if (number > 100) {this._state = 100}
        else {this._state = number}
    }
     get state () {
        return this._state
    }
}
Про "умные" сеттеры и геттеры
https://learn.javascript.ru/pr... ry-settery
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2024, 16:26
Помогаю со студенческими работами здесь

задача , с классами и классами наследниками
Ребят, нужно написать программу с классом фигура и классами наследниками другими фигурами типа тругольник, квадрат, итд... и с функциями...

Работа с классами и классами наследниками
Ребят, нужно написать программу с классом фигура и классами наследниками другими фигурами типа тругольник, квадрат, итд... и с функциями...

Задача с классами
написал код программы, а нужно с классами. Кто может помочь? Дано множество ромбов. Подсчитать ромбы, расположенные ниже оси абсцисс, и...

Задача с классами с++

Задача с классами
Здравствуйте, Первый класс будет находить квадрат числа от 1 до 10, используя цикл. Другой класс будет ждать, когда в первом классе квадрат...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru