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

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

19.12.2022, 02:13. Показов 7049. Ответов 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
3839 / 1688 / 431
Регистрация: 14.03.2022
Сообщений: 4,293
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru