Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67

Написать метод-калькулятор дохода с депозита в классе-наследнике

23.01.2021, 22:46. Показов 3474. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста.
Задача:
Переопределить абстрактный метод Income() базового класса Deposit.
(вот он)
C#
1
public abstract decimal Income();
Переопределить, с такой целью: этот метод должен высчитывать суммарный доход с депозита и возвращать его значение.
Ставка депозита = 5%.
Пример:
Сумма на счету базовая (amount) - 1000,00
Через 1 месяц: сумма на счету: 1050,00 сумма дохода - 50,00
Через 2 месяца: сумма на счету: 1102,50 сумма дохода - 102,50
Через 3 месяца: сумма на счету: 1157,62 сумма дохода - 157,62

Моя реализация:

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
namespace Aggregation
{
    class BaseDeposit : Deposit
    {
        public readonly decimal amount;
        public readonly int period;
        public BaseDeposit(decimal amount, int period) : base(amount, period)
        {
            this.amount = amount;
            this.period = period;
 
        }
        public override decimal Income()
        {
            decimal income = 0;
 
            decimal amount1 = 0;
            decimal amount2 = 0;
 
            do
            {
                if (period == 0) { income = 0; }
                if (period == 1) { income = amount / 100 * 5; amount1 = amount + income; }
                if (period == 2) { income += amount1 / 100 * 5; amount2 = amount1 + income; }
                if (period == 3) { income += amount2 / 100 * 5; }
 
 
            }
            while (period == 5);
 
            return income;
 
        }
    }
}
Пробовал просто
C#
1
while (period == 5){do something}
-> такой же результат.

Ещё пробовал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public override decimal Income()
        {
            decimal income = 0;
            decimal income1 = 0;
            decimal income2 = 0;
          
 
            decimal amount1 = 0;
            decimal amount2 = 0;
           for (int i; i < period; i++)
            if (i == 0) { return income; }
                if (i == 1) { income1 = amount / 100 * 5; amount1 = amount + income1; return income1; }
                if (i == 2) { income2 = income1 + (amount1 / 100 * 5); amount2 = amount1 + income2; return income2; }//здесь amount2 рассчитывается на будущее
               
 
            return income; //наверное не обязательно в этом варианте
 
        }
пробовал что-то вроде
C#
1
if (period == 0){} // также 1,2
юнит тесты, которые проходят в обоих случаях:
Code
1
1000,0,0 //сумма 1000, период 0, доход 0
Code
1
1000,1,50 //сумма 1000, период 1, доход 50

юнит тесты, которые не проходят в обоих случаях:
Code
1
1000,2,102.5d //сумма 1000, период 2, доход 102.5d
Code
1
1000,3,157.625d //сумма 1000, период 3, доход 157.625d
Я смотрю в сторону: почему циклы выполняются именно 2 раза, а не 1, или 0?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2021, 22:46
Ответы с готовыми решениями:

В классе OnlyData написать метод, который выводит значение переменной i и вызвать этот метод в том же классе
Я конечно понимаю, что задача оч простая, но все же. В классе OnlyData нужно написать метод, который выводит значение переменной i и...

Объявить в классе-наследнике указатель, указывающий туда же, куда указывает указатель в классе-родителе
Здравствуйте. Имеется базовый класс MainWindow: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &quot;globaltime.h&quot; class...

ParentWindow в классе наследнике
Создал класс: class TPlayList : public TsTabSheet { public: bool __fastcall GetTracksList(AnsiString fname); private: ...

18
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 12:51
ne_poslednij, зачем там циклы если есть формулы? разве что можно написать поднесение к степени для decimal
C#
1
2
3
4
5
6
7
8
9
10
11
12
decimal Calc(decimal amount, decimal percent, int period)
{
    return amount * Power((1m + percent/100m), period);
}
 
decimal Power(decimal x, int pow)
{
    var r = 1m;
    for(var i = 0; i < pow; i++)
        r *= x;
    return r;
}
Добавлено через 39 секунд
C#
1
Console.WriteLine(Calc(1000, 5, 2));
1
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
24.01.2021, 13:08  [ТС]
JustinTime, Ваш код ок. Но не знаю, как его внедрить в мой класс...В контекст.
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 13:19
Лучший ответ Сообщение было отмечено ne_poslednij как решение

Решение

ne_poslednij,
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
namespace Aggregation
{
    class BaseDeposit : Deposit
    {
        public readonly decimal amount;
        public readonly int period;
        public BaseDeposit(decimal amount, int period) : base(amount, period)
        {
            this.amount = amount;
            this.period = period;
        }
        
        public override decimal Income()
        {
            return Calc(amount, 5m, period);
        }
        
        decimal Calc(decimal amount, decimal percent, int period)
        {
            return amount * Power((1m + percent/100m), period)
            - amount; // - amount убрать если нужна сумма на счету, а не сумма дохода
        }
        
        decimal Power(decimal x, int pow)
        {
            var r = 1m;
            for(var i = 0; i < pow; i++)
                r *= x;
            return r;
        }
    }
}
1
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
24.01.2021, 14:04  [ТС]
JustinTime, объясните, пожалуйста, что значат переменные x, r; что такое 1m/5m/100m ?
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 14:25
ne_poslednij, число с m (5m) - это литерал типа decimal(чтобы компилятор понимал какой тип).
метод Power возведение в степень через циклическое умножение.
1
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
24.01.2021, 17:10  [ТС]
JustinTime, а где Вы взяли эту формулу? Мне просто надо похожее задание реализовать, а идей нет. Реализация грубовата у меня...
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 17:16
ne_poslednij, Сложные проценты
1
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
24.01.2021, 18:42  [ТС]
JustinTime, воюю с ещё одной задачей...Может у Вас получится помочь, или какую лёгкую подсказку дать.
Задача: переписать метод Income() в классе-наследнике SpecialDeposit.
Метод должен возвращать сумму дохода с депозита.
Процент в первый месяц: 1%;
Процент во второй месяц: 2% от суммы, полученной после первого месяца;
И так далее.
Пример: базовая сумма: 1000,00
Через 1 месяц: сумма 1010,00 , доход - 10,00
Через 2 месяца: сумма 1030,20, доход - 30,20
Я попробовал взять предыдущий код и в него дописать нарастание процентов:
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
 public override decimal Income()
        {
            return Calc(amount, 5m, period);
        }
        decimal Calc(decimal amount, decimal percent, int period)
        {
            return amount * Power(1m + PowerPercent(percent) / 100m, period) - amount; //добавил тут
        }
 
        decimal Power(decimal x, int pow)
        {
            var r = 1m;
            for (var i = 0; i < pow; i++)
                r *= x;
            return r;          
        }
        decimal PowerPercent(decimal x, int pow) //добавил тут
        {
            var r = 1m;
            for (var i = 0; i < pow; i++)
                r *= x;
            return r;
        }
    }
Всё оказалось не так просто. Студия ругается на разные типы данных, идти в сторону приведения к одному типу = поменять весь код и зайти в тупик.
Как-то эта формула кажется подходящей, но с какой стороны подойти к коду, чтоб увеличивались и проценты, не знаю.
Уже и пробовал просто percent++; куда-нибудь прилепить. Хочется по-простому написать, а такое ощущение, что для этого нужен опыт в пару лет, оттого сейчас и выходят одни костыли
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 19:07
ne_poslednij,
C#
1
2
3
4
5
6
decimal CalcSpecial(decimal amount, int period)
{
    if(period == 1) return period/100m*amount;
    var prev = CalcSpecial(amount, period - 1);
    return prev + (prev + amount) * period/100m;
}
0
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
24.01.2021, 19:27  [ТС]
JustinTime, извините, не доходит, куда вписать Ваш код?
Пробую и так, и эдак...
мой класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace Aggregation
{
    class SpecialDeposit : Deposit
    {
        public readonly decimal amount;
        public readonly int period;
 
        public SpecialDeposit(decimal amount, int period) : base(amount, period)
        {
            this.amount = amount;
            this.period = period;
        }
        public override decimal Income()
         //где-то здесь:)
     }
}
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 19:32
Цитата Сообщение от ne_poslednij Посмотреть сообщение
//где-то здесь
да, там, а вызывайте его по аналогии с предыдущим, в методе Income
0
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
24.01.2021, 20:41  [ТС]
JustinTime, вот так, не работает; пробую и с тремя парами фигурных скобок; без парметров. Какое-то угадывание у меня
C#
1
2
3
4
5
6
7
8
9
10
        public override decimal Income()
            {
                return CalcSpecial(amount, period);
            }
            decimal CalcSpecial(decimal amount, int period)
            {
                if (period == 1) return period / 100m * amount;
                var prev = CalcSpecial(amount, period - 1);
                return prev + (prev + amount) * period / 100m;
            }
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 21:24
Цитата Сообщение от ne_poslednij Посмотреть сообщение
вот так, не работает;
как не работает?
0
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
24.01.2021, 21:25  [ТС]
JustinTime,так:
C#
1
2
3
4
5
6
7
8
9
10
        public override decimal Income()
            {
                return CalcSpecial(amount, period);
            }
            decimal CalcSpecial(decimal amount, int period)
            {
                if (period == 1) return period / 100m * amount;
                var prev = CalcSpecial(amount, period - 1);
                return prev + (prev + amount) * period / 100m;
            }
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
24.01.2021, 23:27
ne_poslednij, что для вас значит "не работает"? я тестировал метод, он рабочий, вам трудно скопировать и вставить его в нужный класс?
0
1 / 1 / 0
Регистрация: 14.01.2021
Сообщений: 67
25.01.2021, 15:19  [ТС]
JustinTime, я имею в виду, что в моём классе не работает. Юнит тесты не проходят. После запуска тестов студия выдаёт "Прекращена работа программы .NET Host".
Вот как я скопировал и вставил код. Выходит, для меня это трудно сейчас.
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
namespace Aggregation
{
    class SpecialDeposit : Deposit
    {
        public readonly decimal amount;
        public readonly int period;
        public SpecialDeposit(decimal amount, int period) : base(amount, period)
        {
            this.amount = amount;
            this.period = period;
        }
        public override decimal Income()
        {
            return CalcSpecial(amount, period);
        }
            decimal CalcSpecial(decimal amount, int period)
            {
                if (period == 1) return period / 100m * amount;
                var prev = CalcSpecial(amount, period - 1);
                return prev + (prev + amount) * period / 100m;
            }
        
    }
}
Добавлено через 4 часа 28 минут
JustinTime, помогите, пожалуйста. Не бросайтесь камнями))
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
25.01.2021, 15:50
ne_poslednij, класс у вас правильный, возможно причины в чем то другом
1
0 / 0 / 0
Регистрация: 18.02.2021
Сообщений: 1
22.04.2021, 00:38
JustinTime Не знаю почему но реально крашит VS
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2021, 00:38
Помогаю со студенческими работами здесь

Перегрузка метода в классе-наследнике
...доброго времени суток, уважаемые форумчане!... ...Возник вопрос: не могу сообразить как перегрузить метод Testing в этой библиотеке: ...

Перегрузка операций в классе наследнике
всем привет товарищи программисты, есть вопрос. делал как то перегрузку операций, но делал ее просто в классе, а теперь хочу сделать в...

Перекрытие InitializeComponent в классе наследнике
В общем есть wpf окно &quot;Window1&quot;, соответственно имеем Window1.xaml и Window1.xaml.cs и после компиляции объектный файл окна (baml?) в...

Вызов невиртуального метода в классе-наследнике
Добрый день! Имеется следующий код: #include &lt;iostream&gt; using namespace std; namespace some {

Реализовать перегрузку оператора ввода в классе-наследнике
вопрос, наверное, глупый. Есть класс, содержащий массив (размер задется пользователем) и наследник (4 элемента). Можно ли вызвать...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru