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

Преобразование типов и цикл for в консольном приложении

09.10.2020, 17:30. Показов 1621. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте есть задача сделать консольное приложение, которое посчитает сумму вклада ( вводится пользователем) под 8 % на 10 лет, а также показать как прирастает вклад и на какую сумму в течении 10 лет, процент начисляется раз в год. В задании есть условие - все переменные должны быть с типом decimal. Код я написал а вот когда начал в формулах применять преобразование типов то началась беда. 1 - при расчете стоимости вклада по истечении 10 лет код нагло врет и пишет 14000 а на бумаге 15 112,474 если до третьего знака округлить. 2 - я не понимаю почему цикл for не работает. Буду признателен если объясните. Основная беда насколько я понял в том , что процент у меня в decimal.

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
36
37
38
namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal amount, total, term;
            term = 10;
            decimal interest = 0.08M;
            // amount - первоначальная сумма вклада, total сумма по прошествии 10 лет, term - временной период в 10 лет
            //interest процентная ставка
            Console.Write("Введите сумму вклада в долларах США: ");
            amount = decimal.Parse(Console.ReadLine());
            // тут цикл выполняет требование по минимальному вкладу
            while (amount <= 5000)
            {
                Console.WriteLine("Сумма вклада должна превышать 5000$");
                Console.Write("Введите сумму вклада в долларах США: ");
                amount = decimal.Parse(Console.ReadLine());
            }
            total = amount * Convert.ToInt64(Math.Pow(1 + Convert.ToDouble(interest), Convert.ToDouble(term)));
            decimal output = Math.Round(total, 3);
            Console.WriteLine("Заявленная сумма вклада: {0} долларов США.", amount);
            Console.WriteLine("Процентная ставка: {0}.", interest);
            Console.WriteLine("Срок вклада: {0} лет.", term);
            Console.WriteLine("Стоимость вклада на конец периода: {0} долларов США.", total);
            for (int i = 1; i <= 10; i++)
            {
                decimal peryear = amount * Convert.ToInt32(Math.Pow(1 + Convert.ToDouble(interest), i));
                decimal intperyear = (amount * Convert.ToInt32(Math.Pow(1 + Convert.ToDouble(interest), i)) - amount);
                // peryear это сумма вклада за каждый год, intperyear это проценты за каждый год.
                Console.WriteLine("Сумма вклада {0} год = {1} долларов США", i, peryear);
                Console.WriteLine("Сумма процентов {0} год = {1} долларов США", i, intperyear);
            }
            Console.ReadKey();
        }
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2020, 17:30
Ответы с готовыми решениями:

Как в консольном приложении задать бесконечный цикл
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { ...

Код который работает в консольном приложении в приложении Windows Forms выдает ошибку
Есть код для записи видео с экрана. В консольном приложении он работает, записывает все как нужно. Вставляю код классов в приложение...

DispatcherTimer в консольном приложении
Можно ли использовать таймер DispatcherTimer в консольном приложении c#? И если можно, то как (пример)?

5
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
09.10.2020, 18:14
Цитата Сообщение от Payhamster Посмотреть сообщение
Основная беда насколько я понял в том , что процент у меня в decimal.
Нет. Основная беда в том, что данные между делом конвертируются в int.
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
36
37
38
39
40
41
42
namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal amount, total, term;
            term = 10m;
            decimal interest = 0.08m;
            // amount - первоначальная сумма вклада, total сумма по прошествии очередного года, term - временной период в 10 лет
            // interest - процентная ставка
            Console.Write("Введите сумму вклада в долларах США: ");
            amount = decimal.Parse(Console.ReadLine());
            // тут цикл выполняет требование по минимальному вкладу
            while (amount <= 5000)
            {
                Console.WriteLine("Сумма вклада должна превышать 5000$");
                Console.Write("Введите сумму вклада в долларах США: ");
                amount = decimal.Parse(Console.ReadLine());
            }
 
            //            total = amount * Convert.ToInt64(Math.Pow(1 + Convert.ToDouble(interest), Convert.ToDouble(term))); - вот это что и зачем?
            //            decimal output = Math.Round(total, 3);
            total = amount;
            for (int i = 1; i <= 10; i++)
            {
                decimal peryear = total * interest;
                total += peryear;
 
                // peryear это проценты. сумма вклада - это total
                Console.WriteLine("Сумма вклада {0} год = {1} долларов США", i, total);
                Console.WriteLine("Сумма процентов {0} год = {1} долларов США", i, peryear);
            }
            Console.WriteLine("Заявленная сумма вклада: {0} долларов США.", amount);
            Console.WriteLine("Процентная ставка: {0}.", interest);
            Console.WriteLine("Срок вклада: {0} лет.", term);
            Console.WriteLine("Стоимость вклада на конец периода: {0} долларов США.", total);
 
            Console.ReadKey();
        }
    }
}
1
1 / 1 / 0
Регистрация: 20.09.2020
Сообщений: 14
09.10.2020, 20:06  [ТС]
C#
1
2
3
 
total = amount * Convert.ToInt64(Math.Pow(1 + Convert.ToDouble(interest), Convert.ToDouble(term))); 
           decimal output = Math.Round(total, 3);
это расчет суммы за 10 лет = первоначальная сумма вклада * на (1+процентная ставка) ^ срок вклада . Я пытался вообще типы не менять но тогда Math.Pow пишет ошибку из-за типа данных decimal.
0
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
09.10.2020, 21:13
Лучший ответ Сообщение было отмечено Payhamster как решение

Решение

Зачем вообще что-то куда-то конвертировать? И никаких степеней не надо, все и так прогрессивно считается.
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
static void Main(string[] args)
        {
            
            decimal amount, total, term;
            term = 10m;
            decimal interest = 0.08m;
            Console.Write("Введите сумму вклада в долларах США: ");
            amount = decimal.Parse(Console.ReadLine());
            while (amount <= 5000m)
            {
                Console.WriteLine("Сумма вклада должна превышать 5000$");
                Console.Write("Введите сумму вклада в долларах США: ");
                amount = decimal.Parse(Console.ReadLine());
            }
 
            total = amount; // все, про total забыли до окончательного вывода
            Console.SetBufferSize(80, 80); // это необязательно, просто чтобы консоль была побольше
            for (int i = 1; i <= 10; i++)
            {
                decimal peryear = total * interest; // вот считается процент за последний год. прогрессивный, естественно
                total += peryear; // а это новые данные состояния счета после зачисления процентов
 
                Console.WriteLine("Сумма после {0} год/лет = {1} долларов США", i, Math.Round(total, 3));
                Console.WriteLine("Сумма процентов {0} год = {1} долларов США", i, Math.Round(peryear,3));
                Console.WriteLine();
            }
            Console.WriteLine("Заявленная сумма вклада: {0} долларов США.", amount);
            Console.WriteLine("Процентная ставка: {0}.", interest);
            Console.WriteLine("Срок вклада: {0} лет.", term);
            Console.WriteLine("Стоимость вклада на конец периода: {0} долларов США.", Math.Round(total, 3));
 
        }
Вот результат:
Code
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
Введите сумму вклада в долларах США: 5001
Сумма после 1 год/лет = 5401.08 долларов США
Сумма процентов 1 год = 400.08 долларов США
 
Сумма после 2 год/лет = 5833.166 долларов США
Сумма процентов 2 год = 432.086 долларов США
 
Сумма после 3 год/лет = 6299.820 долларов США
Сумма процентов 3 год = 466.653 долларов США
 
Сумма после 4 год/лет = 6803.805 долларов США
Сумма процентов 4 год = 503.986 долларов США
 
Сумма после 5 год/лет = 7348.110 долларов США
Сумма процентов 5 год = 544.304 долларов США
 
Сумма после 6 год/лет = 7935.958 долларов США
Сумма процентов 6 год = 587.849 долларов США
 
Сумма после 7 год/лет = 8570.835 долларов США
Сумма процентов 7 год = 634.877 долларов США
 
Сумма после 8 год/лет = 9256.502 долларов США
Сумма процентов 8 год = 685.667 долларов США
 
Сумма после 9 год/лет = 9997.022 долларов США
Сумма процентов 9 год = 740.520 долларов США
 
Сумма после 10 год/лет = 10796.784 долларов США
Сумма процентов 10 год = 799.762 долларов США
 
Заявленная сумма вклада: 5001 долларов США.
Процентная ставка: 0.08.
Срок вклада: 10 лет.
Стоимость вклада на конец периода: 10796.784 долларов США.
Какое условие задачи не выполнено?

Добавлено через 14 минут
Если надо сначала сразу посчитать прибыль, то вот:
C#
1
decimal cens = amount * (decimal)Math.Pow((double)interest + 1, 10);
1
1 / 1 / 0
Регистрация: 20.09.2020
Сообщений: 14
11.10.2020, 14:56  [ТС]
То есть получается что если поставить
C#
1
Console.WriteLine("Стоимость вклада на конец периода: {0} долларов США.", Math.Round(total, 3));
уже после цикла то он считает что это уже total 10 циклов?
0
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
11.10.2020, 15:05
Именно так. Это, собственно, и стоит уже после окончания расчетов.
Промежуточный результат выводится в каждой итерации.
А вот это -
C#
1
decimal cens = amount * (decimal)Math.Pow((double)interest + 1d, 10);
- считает сразу, без промежуточных результатов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2020, 15:05
Помогаю со студенческими работами здесь

MessageBox в консольном приложении
Как вызвать MessageBox в консоли

Музыка в консольном приложении
#include &lt;conio.h&gt; #include &lt;Windows.h&gt; #include &lt;Mmsystem.h&gt; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #pragma comment (lib,...

Таблица в консольном приложении
for (int i = 1; i &lt;= 255; i++) { Console.Write(Convert.ToChar(i)); Console.Write(Convert.ToChar(&quot; &quot;)); ...

Графика в консольном приложении
Помогите создать приблизительно такую штуку, которая будет высвечиваться при запуске консольной программы, и по нажатию на любую клавишу...

Ошибка в консольном приложении
{ class Program { public struct Point { public int X; public int Y; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru