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

Исключения и замыкания

29.12.2022, 02:35. Показов 4367. Ответов 7

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

Задача1. Форматтер чисел

Ваши коллеги разработали форму, которая принимает от пользователя количество покупаемых единиц товара. Вас попросили написать функцию-преобразователь, которая возвращает число, если всё ок, и генерирует ошибку, если ввели не число в десятичной системе счисления.
Используйте возможности стандартной библиотеки JS для преобразования строки в число.

Как выполнить задачу
1. Напишите функцию `parseCount`:
* аргумент функции — значение, которое нужно распарсить;
* для парсинга воспользуйтесь функцией `Number.parseInt`;
* если результат парсинга значение `NaN`, выбрасывайте исключение с ошибкой *«Невалидное значение»*;
* верните результат парсинга из функции.

2. Напишите функцию `validateCount`:
* аргумент функции — значение, которое нужно распарсить;
* распарсите значение с помощью функции `parseCount`;
* если получилось, возвращайте результат;
* перехватывайте исключение, которое может выбрасывать функция `parseCount`;
* возвращайте ошибку из функции в случае перехвата исключения.
Как правильно реализовать первые два пункта про распарить? Распарить - это же перевести строку в число? Как правильно написать конструкцию try...catch для перехвата исключений? Я же правильно понимаю, что ее нужно использовать? И еще в первом пункте: аргумент, который нужно распарить, это я его сама должна ввести, как новую переменную?

Задача2. Треугольник
Вася решил сделать онлайн-калькулятор геометрических фигур. Помогите Васе сделать калькулятор треугольников, который проверяет существование треугольника и считает площадь и периметр.

Как выполнить задачу
1. Напишите класс `Triangle`:
* конструктор класса должен принимать 3 стороны треугольника;
* если сумма двух сторон меньше третьей, выбрасывайте исключение с ошибкой *«Треугольник с такими сторонами не существует»*;
* метод `getPerimeter` должен возвращать периметр треугольника;
* метод `getArea` должен возвращать площадь треугольника. Для подсчёта площади воспользуйтесь [формулой Герона]. Точность вычисляется с точностью до трёх знаков после запятой.
2. Напишите функцию `getTriangle`:
* аргументами функции являются 3 значения длин сторон;
* попытайтесь вернуть новый объект треугольника;
* в случае перехвата исключения возвращайте объект с двумя методами `getArea` и `getPerimeter`, которые возвращают строку: *«Ошибка! Треугольник не существует»*.
А здесь у меня какая-то каша с методами, я периметр везде отдельно считаю, а нужно как-то написать, чтобы взять данные из метода, где уже есть расчет периметра?
И в пункте 2 последнее про перехват - мне написали пояснение, что нужно использовать объекты и реализовать обычный объект с методами getArea и getPerimeter, которые будут возвращать строки.Вызывается функция getTriangle со сторонами треугольника, который не существует. Функция возвращает объект с методами getArea и getPerimeter. Эти методы могут вызываться и ожидается, что эти методы будут возвращать строки ‘Ошибка! Треугольник не существует’. У вас в коде при вызове данной функции выполняется попытка создания объекта треугольника, и это действие вызывает ошибку (в конструкторе треугольника проверяется условие и выбрасывается ошибка). Эта ошибка перехватывается в блоке catch в функции getTriangle. В ней остаётся вернуть из функции какой-то объект, который будет похож на треугольник, но не будет им являться. То есть у этого объекта должны быть методы как у треугольника, но реализации никакой не должно быть.

Но с реализаций не получилось у меня. Ниже мое решение, подскажите, есть ли в нем верное решение и с какой стороны мне подойти к решению пунктов по работе с исключениями?

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
/*Задача1*/
let a = String;
function parseCount (a){
    a = Int(a);
    Number.parseInt(a);
    if (Number.isNaN(a)) {
       throw new Error ("невалидное значение");
      }
        return parseCount;
    }
function validateCount (a){
    try {
        parseCount (a)
    } catch {(error);
}
}
 
 /*Задача2*/
    class Triangle{
        constructor (a,b,c){
            if (a > b + c || b > a + c || c > a + b){
            throw new Error ("The triangle does not exist")
        }
        Triangle.getPerimeter (a, b, c) =function(){
            return (a+b+c);
     }
        Triangle.getArea (a, b, c) = function(){
            const p = (a + b + c) / 2;
            return (p * (p - a) * (p - b) * (p - c)) ** 0.5;
          }  
    }   
}  
function getTriangle (a,b,c){
      try {getTriangle}
      catch {
        this.getPerimeter;
        this.getArea;
      }
 
    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2022, 02:35
Ответы с готовыми решениями:

Замыкания, и замыкания в объекте. Где данные?
Помогите пожалуйста разобраться где хранятся данные. Ниже 2 примера. В первом все вроде как понятно - Есть переменная counter которая...

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class SQLEntityException : ApplicationException ...

Замыкания
Доброго времени суток. Имеется такая задача на замыкания: Используя замыкания функций, объявите внутреннюю функцию, которая...

7
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
29.12.2022, 04:41
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
Распарить - это же перевести строку в число
В данном случае да, только буковка пропущена в слове.
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
Как правильно написать конструкцию try...catch для перехвата исключений? Я же правильно понимаю, что ее нужно использовать?
Во второй функции да, а в первой нужно использовать throw. По второй функции не очень понятен последний пункт. Что значит возвращать ошибку? Можно так сделать
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
    function parseCount(n) {
        let parseResult = Number.parseInt(n);
        if(Number.isNaN(parseResult)) throw ("Невалидной значение");
        return parseResult;
    }
 
    function validateCount(n) {
        try {
            return parseCount(n);
        } catch (e) {
            return e;
        }
    }
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
аргумент, который нужно распарить, это я его сама должна ввести, как новую переменную?
Тебе же в самом начале задания написали
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
Ваши коллеги разработали форму, которая принимает от пользователя количество покупаемых единиц товара. Вас попросили написать функцию-преобразователь, которая возвращает число, если всё ок, и генерирует ошибку, если ввели не число в десятичной системе счисления.
Данные будут браться из этой формы и передаваться в твою функцию.
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
А здесь у меня какая-то каша с методами, я периметр везде отдельно считаю, а нужно как-то написать, чтобы взять данные из метода, где уже есть расчет периметра?
Здесь дело не только в этом. Ты в принципе не обращаешься к членам класса, из-за чего у тебя класс служит чем-то вроде упаковщика методов.Cтороны должны задаваться в конструкторе один раз и эти значения должны использоваться всеми методами. Это делается через this
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        class Triangle
        {
            constructor(a, b, c)
            {
                this.a = a;
                this.b = b;
                this.c = c;
                if (a > b + c || b > a + c || c > a + b)
                {
                    throw new Error("The triangle does not exist")
                }
                getPerimeter() 
                {
                    return (this.a + this.b + this.c);
                }
                getArea()
                {
                    const p = this.getPerimeter() / 2;
                    return (p * (p - this.a) * (p - this.b) * (p - this.c)) ** 0.5;
                }
            }
        }
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
Напишите функцию `getTriangle`
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
        function getTrangle (a, b, c)
        {
            try
            {
                return new Triangle(a, b, c);
            } catch (e)
            {
                return {
                    getArea: function () { return "Ошибка! Треугольник не существует" },
                    getPerimeter: function () { return "Ошибка! Треугольник не существует" }
                }
            }
        }
4
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1
29.12.2022, 19:06  [ТС]
Можно еще попросить разобраться с задачами:
Когда в Jasmine проверяю, то в первой задаче не все проверки прошли:

функция parseCount не должна парсить невалидное значение
(Expected function to throw an Error, but it threw 'Невалидное значение'.)

функция validateCount не должна парсить невалидное значение
(Expected 'Невалидное значение' to equal Error: Невалидное значение.)

функция validateCount должна возвращать перехваченную ошибку
(TypeError: Cannot read properties of undefined (reading 'includes'))

Еще есть сам файл тестовый, но мне он никак не помог((

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
  it('функция parseCount должна парсить значение 123', () => {
            expect(parseCount("123")).toEqual(123);
        });
    
        it('функция parseCount должна парсить значение 012', () => {
            expect(parseCount("012")).toEqual(12);
        });
    
        it('функция parseCount не должна парсить невалидное значение', () => {
            expect(() => parseCount("ыфва")).toThrowError("Невалидное значение");
        });
    
        it('функция validateCount должна парсить валидное значение', () => {
            expect(validateCount("56")).toEqual(56);
        });
    
        it('функция validateCount не должна парсить невалидное значение', () => {
            expect(validateCount("ыфва")).toEqual(new Error("Невалидное значение"));
        });
 
        it('функция validateCount должна возвращать перехваченную ошибку', () => {
            expect(validateCount("ыфва").stack.includes("parseCount")).toBeTruthy();
        });
    });
Добавлено через 1 минуту
А вторая задача про треугольник вообще не прошла(
объект Triangle должен создаваться
объект Triangle должен создаваться и правильно считаться периметр и прощадь №1
объект Triangle должен создаваться и правильно считаться периметр и прощадь №2
объект Triangle не должен создаваться №1
объект Triangle не должен создаваться №2
объект Triangle не должен создаваться №3
функция getTriangle должна возвращать объект треугольника
функция getTriangle не должна возвращать объект треугольника

Вот тестовый файл
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
  it('объект Triangle должен создаваться', () => {
            expect(new Triangle(1,3,3)).toBeDefined();
        });
    
        it('объект Triangle должен создаваться и правильно считаться периметр и прощадь №1', () => {
            const triangle = new Triangle(2,5,5);
            expect(triangle).toBeDefined();
            expect(triangle.getPerimeter()).toEqual(12);
            expect(triangle.getArea()).toEqual(4.899);
        });
    
        it('объект Triangle должен создаваться и правильно считаться периметр и прощадь №2', () => {
            const triangle = new Triangle(6,10,15);
            expect(triangle).toBeDefined();
            expect(triangle.getPerimeter()).toEqual(31);
            expect(triangle.getArea()).toEqual(20.123);
        });
    
        it('объект Triangle не должен создаваться №1', () => {
            expect(() => new Triangle(1,3,100)).toThrowError("Треугольник с такими сторонами не существует");
        });
    
        it('объект Triangle не должен создаваться №2', () => {
            expect(() => new Triangle(100,3,10)).toThrowError("Треугольник с такими сторонами не существует");
        });
    
        it('объект Triangle не должен создаваться №3', () => {
            expect(() => new Triangle(1,300,10)).toThrowError("Треугольник с такими сторонами не существует");
        });
    
        it('функция getTriangle должна возвращать объект треугольника', () => {
            expect(getTriangle(2,5,5)).toEqual(new Triangle(2,5,5));
        });
    
        it('функция getTriangle не должна возвращать объект треугольника', () => {
            const triangle = getTriangle(1,3,100);
            expect(triangle.getArea()).toEqual('Ошибка! Треугольник не существует');
            expect(triangle.getPerimeter()).toEqual('Ошибка! Треугольник не существует');
        });
    })
 
});
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
29.12.2022, 19:33
Лучший ответ Сообщение было отмечено Anna_Batuk как решение

Решение

Цитата Сообщение от Anna_Batuk Посмотреть сообщение
функция parseCount не должна парсить невалидное значение
(Expected function to throw an Error, but it threw 'Невалидное значение'.)
Здесь по всей видимости должно быть так
JavaScript
1
2
3
4
5
6
        function parseCount (n)
        {
            let parseResult = Number.parseInt(n);
            if (Number.isNaN(parseResult)) throw new Error("Невалидной значение");
            return parseResult;
        }
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
функция validateCount не должна парсить невалидное значение
(Expected 'Невалидное значение' to equal Error: Невалидное значение.)
Если первое исправить, то это будет возвращать что надо.
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
функция validateCount должна возвращать перехваченную ошибку
(TypeError: Cannot read properties of undefined (reading 'includes'))
Здесь не понял, что им надо. Укажи на какие данные пришел такой результат.
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
А вторая задача про треугольник вообще не прошла(
Я там немного ошибся и вставил методы класса в конструктор. Не проверял из-за того, что думал, что ты разберешься вместо того чтобы готовое решение отправить. Вот так это задумывалось. Но надо проверить
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
        class Triangle
        {
            constructor(a, b, c)
            {
                this.a = a;
                this.b = b;
                this.c = c;
                if (a > b + c || b > a + c || c > a + b)
                {
                    throw new Error("The triangle does not exist")
                }
 
            }
 
            getPerimeter ()
            {
                return (this.a + this.b + this.c);
            }
 
            getArea ()
            {
                const p = this.getPerimeter() / 2;
                return (p * (p - this.a) * (p - this.b) * (p - this.c)) ** 0.5;
            }
        }
2
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1
30.12.2022, 02:17  [ТС]
С задачей 2 я разобралась). В смысле, не отправляла сразу файл на проверку, я скопировала себе, но еще сидела и разбирала что и для чего.
В общем я вынесла два метода вне конструктора и еще была ошибка в написании функции
function getTrangle (a, b, c) => function getTriangle (a, b, c)
Но Jasmine выдал ошибку по причине, что я или не обновила страницу или изменения не сохранила


Сейчас остались только остались две ошибки, мне нужно вычисления площади и периметра округлить до трех знаков после запятой. Нужно же использовать toFixed() и скобках указать число (это и будет кол-во знаков после запятой)?

Добавлено через 5 минут
По задаче 1 все прошло. Спасибо огромное!
Нормально все объяснили и показали, мне теперь есть с чем поработать.

Никогда бы не подумала, что решив учиться по конкретному направлению, буду также сидеть и все искать сама и разбирать материал... как это делала до обучения, но просто сама, бесплатно...
0
0 / 0 / 0
Регистрация: 24.04.2023
Сообщений: 2
24.04.2023, 19:52
Anna_Batuk, Здравствуйте Анна, похоже вы учитесь в Нетологии. Я тоже там учусь и сейчас мы как раз проходим эту задачу. Скажите, не могли бы вы поделиться решением последней функции getTriangle? Я всю голову уже сломал и все еще не могу понять, что от меня хотят.
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1
25.04.2023, 13:09  [ТС]
timurGabitov,
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
 function getTriangle (a, b, c)
 {
     try
     {
         return new Triangle(a, b, c);
     } catch (e)
     {
         return {
             getArea: function () { return "Ошибка! Треугольник не существует" },
             getPerimeter: function () { return "Ошибка! Треугольник не существует" }
         }
     }
 }
0
0 / 0 / 0
Регистрация: 24.04.2023
Сообщений: 2
25.04.2023, 19:49
Anna_Batuk, Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2023, 19:49
Помогаю со студенческими работами здесь

замыкания?
Вот тут умный дядя рассказывает про замыкания. var values = new List<int>() { 100, 110, 120 }; var funcs = new...

Замыкания
В этом примере создается внутренняя функция func, изнутри которой доступны как локальные переменные, так и переменные внешней функции...

Замыкания в js
Здравствуйте. Объясните пожалуйста что такое замыкания? Нашёл много объяснений но все они расходятся во мнении где то пишут что это когда...

Замыкания и this
Здравствуйте. Вопрос таков: у меня есть две функции, по сути одинаковые геттеры, но при компиляции кода, функция, где мы возвращаем...

Замыкания
чего-то я не понял почему данный код работает function multiplier( factor) { return function( number) { return...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru