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

Исправить расчет процентов

18.09.2016, 22:06. Показов 5053. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Напишите программу, которая, используя метод Console.ReadLine(), вводит строку, содержащую три числа через пробел — сумму, процентную ставку (в процентах) и срок вклада, а потом на основе этих значений вычисляет накопившуюся сумму на момент окончания вклада. Результат нужно вывести на консоль. Я написал метод, который решает данную задачу, но он выдает неверный результат. Помогите найти ошибку, пожалуйста, а то уже 4 часа сижу.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static double Calculate(string userInput)
        {
            userInput = Console.ReadLine();
            string[] numbers = userInput.Split(' ');
            int[] num = new int[numbers.Length];
 
            for (int i = 0; i < numbers.Length; i++)
            {
                num[i] = Convert.ToInt32(numbers[i]);
            }
 
            double q = (double)((num[1] / 100) + 1);
            double sum = (num[0] * ((Math.Pow(q, num[2])-1)/(q-1)));
            return sum;
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2016, 22:06
Ответы с готовыми решениями:

Исправить расчет и вывод дроби
Здравствуйте! Помогите пожалуйста! Нужно исправить вывод. Вожу например: 5 7 * 5 7 и на выходе получается 25/0. Вот как мне сделать...

Расчет процентов
Здравствуйте! мне нужно создать форму, состоящую из большой таблицы, где есть столбцы с числовыми значениями 1,2 и 3. Как мне присвоить...

Расчет банковских процентов
Пользователь делает вклад в размере “a” РУблей сроком на 1 год. Если пользователь заберёт проценты в конце срока, то получит 10%, если...

11
215 / 211 / 146
Регистрация: 20.11.2014
Сообщений: 1,184
18.09.2016, 23:11
в чем вводите срок вклада?
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
18.09.2016, 23:29
да тут типичная ошибка с делением целых чисел:
C#
1
(double)((num[1] / 100) + 1); // исправить: (double)num[1] / 100 + 1
откуда q всегда равно 1 и в формуле суммы геом. пр. возникает деление на 0 (нужно, наверное, рассмотреть этот случай отдельно).
0
0 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 99
19.09.2016, 16:17  [ТС]
Не совсем вас понял, можно подробнее?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.09.2016, 17:26
Bein, кстати, для финансовых операций нельзя использовать double, из-за его недостаточной точности. Переделай на decimal.
0
0 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 99
19.09.2016, 17:30  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static double Calculate(string userInput)
        {
            var numStr = userInput.Split(' ');
            double numOne = double.Parse(numStr[0]);
            double numTwo = double.Parse(numStr[1]);
            double numThree = double.Parse(numStr[2]);
 
            double s;
 
            s = numOne*((Math.Pow(numTwo, numThree)-1)/(numTwo-1));
            Console.WriteLine(s);
            return s;
        }


Данный метод решает задачу по расчету суммы вклада с процентами. Он работает, но при вводе чисел 10 12 1 (гарантируется, что они вводятся через пробел и сразу три) выдает ответ 10, вместо 10.1. Где я ошибся в формуле?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.09.2016, 17:53
Цитата Сообщение от Bein Посмотреть сообщение
Math.Pow(numTwo, numThree)
12 в степени 1 = 12
Цитата Сообщение от Bein Посмотреть сообщение
(Math.Pow(numTwo, numThree)-1)
12 - 1 = 11
Цитата Сообщение от Bein Посмотреть сообщение
numTwo-1
12 - 1 = 11
Цитата Сообщение от Bein Посмотреть сообщение
((Math.Pow(numTwo, numThree)-1)/(numTwo-1))
11 / 11 = 1
Цитата Сообщение от Bein Посмотреть сообщение
numOne*((Math.Pow(numTwo, numThree)-1)/(numTwo-1))
10 * 1 = 10
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
19.09.2016, 18:15
Цитата Сообщение от Bein Посмотреть сообщение
вместо 10.1
Но ведь 12% от 10 это 1.2, должно быть 11.2. В твоей формуле (b*(q^n-1)/(q-1)) суммируется начальный вклад, а должны суммироваться проценты, либо накопительно (для сложных) либо фиксированная сумма от начального вклада. Разберись с математикой.
Кликните здесь для просмотра всего текста
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
static double СложныеПроцентов(double Вклад, double Процент, double ЧислоМесяцев)
{
    return Вклад * (1 + Процент * ЧислоМесяцев);
}
 
static double ПростыеПроценты(double Вклад, double Процент, double ЧислоМесяцев)
{
    return Вклад * Math.Pow(Процент + 1, ЧислоМесяцев);
}
 
static void Main()
{
    var userInput = Console.ReadLine().Split(' ');
    double вклад = double.Parse(userInput[0]);
    double процент = double.Parse(userInput[1]) / 100;
    double число_месяцев = double.Parse(userInput[2]);
 
    Console.WriteLine("Со сложными процентами: {0:F2}", 
        СложныеПроцентов(вклад, процент, число_месяцев));
 
    Console.WriteLine("С простыми процентами: {0:F2}",
        ПростыеПроценты(вклад, процент, число_месяцев));
 
    Console.ReadLine();
}
0
0 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 99
19.09.2016, 19:09  [ТС]
Все равно не понял. У меня-то что не так? Я же примени формулы геометрической прогрессии (формулу нахождения суммы). Где я ошибся?
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
19.09.2016, 19:54
Bein, в кратце: в вашей прогрессии первый элемент это 'сумма вклада", значит нужна не формула суммы прогрессии, а формула n'го члена. Либо берите "процентную ставку" за первый элемент.
0
0 / 0 / 0
Регистрация: 07.02.2020
Сообщений: 1
07.02.2020, 22:19
Aael,Все равно не помогло.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,119
Записей в блоге: 2
07.02.2020, 23:59
Цитата Сообщение от LaskaTarakanov Посмотреть сообщение
Aael,Все равно не помогло.
Этой теме 4 года.
Попробуйте такой вариант.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        /// <summary>Возвращает накопившуюся сумму на момент окончания вклада</summary>
        /// <param name="deposit">Сумма вклада</param>
        /// <param name="interest">Вознаграждение за период в процентах</param>
        /// <param name="term">Количество периодов хранения</param>
        /// <returns></returns>
        public static decimal DepositTermination(decimal deposit, decimal interest, uint term)
        {
            if (deposit <= 0)
                throw new ArgumentOutOfRangeException(nameof(deposit), "Депозит должен быть больше нуля");
            if (interest < 0)
                throw new ArgumentOutOfRangeException(nameof(interest), "Вознаграждение не может быть отрицательным");
 
            decimal growth = 1m + interest / 100m;
 
            for (int i = 0; i < term)
                deposit *= growth;
 
            return deposit;
        }
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
        /// <summary>Метод ввода с консоли данных для расчёта суммы вклада</summary>
        /// <returns>Кортеж с начальной суммой вклада, интересом за период и количеством периодов</returns>
        public static  (decimal deposit, decimal interest, uint term) InputDataDeposit()
        {
            while (true)
            {
                Console.WriteLine("Введите в одну строку через пробел данные для расчёта вклада:\r\n" +
                    "Сумма депозита (десятичное число),\r\n" +
                    "Ставка вознагражения в процентах (десятичное число),\r\n" +
                    "Количество расчётных периодов (натуральное число).");
 
                string[] input = Console.ReadLine().Split();
 
                if (
                        input.Length == 3
                        && decimal.TryParse(input[0], out decimal deposit) && deposit > 0
                        && decimal.TryParse(input[1], out decimal interest) && interest >= 0
                        && uint.TryParse(input[2], out uint term)
                    )
                    return (deposit, interest, term);
 
                Console.WriteLine(new string('*', 80) + "\r\nВы ввели неверные данные!\r\n" +
                    "Повторите ввод!\r\n" + new string('*', 80) + "\r\n");
            }
        }
C#
1
2
3
4
5
6
        static void Main(string[] args)
        {
 
            var input = InputDataDeposit();
            Console.WriteLine("Накопившаяся сумма на момент окончания вклада составит: " 
                + DepositTermination(input.deposit, input.interest, input.term));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2020, 23:59
Помогаю со студенческими работами здесь

Расчет процентов по вкладу
Миша положил в банк 1 тыс рублей под 18% годовых через сколько лет он станет миллионером

Расчет годововых процентов по дням
Товарищи, в общем я как не программер, страшно туплю и не могу сделать формулу расчета. Есть Вложенная сумма Полученная сумма как...

Задача на расчет процентов по вкладу
Задача Счет в 2050 д.е. открыт в начале года. В конце второго, шестого и восьмого месяца были соответственно внесены 170, 175 и 225 д.е....

Расчет процентов по кредиту в MS Access
Добрый день! У меня вопрос по Access. Пишу базу данных по учету деятельности предприятия. Она большая, поэтому приводить ее нет...

Таблицы. Расчет процентов вкладов
дан список людей 26 человек и для каждого(!!!) нужно высчитать проценты по вкладу и итоговую сумму вместе с процентами у каждого свой...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru