Ви використовуєте застарілий браузер. Цей та інші сайти можуть відображатися в ньому некоректно. Необхідно оновити браузер або спробувати використовувати https://www.google.com/chrome/
Нужна помошь в C# ну или вообще програмиста
🟡 21:35 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
Вообщем вопрос такой... нужно написать прогу - кредитный калькулятор..... Не могу расчитать сроки выплаты при динамическом погашении кредита (т.е. когда с каждой выплатой сумма кредита уменьшается)... Формула выглядит примерно так:
платеж в месяц составит:
1 мес. - (сумма/срок)+(сумма*%/100)
2 мес. - (остаток(т.е. сумма минус выплата за первый мес)/срок)+(остаток*%/100) ........... и.т.д.
Внимание вопрос! Как это реализовать циклом??? что-то совсем в голову не лезет... видать перетрудился
з.ы. при этом все промежуточные значения, т.е. остатки после каждого месяца и суммы выплат должны выводиться на экран
lomachka ща проверю отпишусь... но заранее спасибо за совет
все работает, но выдает неправильные результаты.. получается что платишь ментше чем взял))) фигня... вообщем пошел спать, на свежую голову утром посмотрю.. спасибо за помощь
Я нигде не видела запрета на объявление переменных в цикле, а основная рекоммендация по объявлению переменных - "объявляйте переменные там где они нужны". В данном случае мне нужны результаты рассчетов внутри цикла и я ограничиваю область видимости этих переменных циклом. Если Вам больше нравится объявлять все переменные перед циклом - пожалуйста, но мне такой подход не по душе.
нес овсем так. вы не учли срок кредитования (или это не без срочный кредит) и переменную "погашено кредита" нужно привязывать к месяцам, т.к. в условии не оговорено что сумма погашения будет равной.
п.с. поэтому и предложения пошли кредиты - у вас брать
А тут видимо ошибка у Вас во второй формуле:
возможно в первой скобке необходимо брать сумма/срок а не остаток/срок. таким образом с каждым месяцем будет падать выплата процента но база оставаться на месте. В Вашем случае база тоже уменьшается.
Итого:
Код:
int period = 12; //период кредитования
double kreditSum = 1000; //сумма кредита
double kreditRate = 0.2; //ставка по кредиту
double paidSum = 0; //погашено кредита
for (int month = 1; month <= period; month++)
{
double rest = kreditSum - paidSum; //остаток по кредиту на текущий месяц
double paid = (kreditSum / period) + (rest * kreditRate / 100); //выплата по кредиту за текущий месяц
Console.WriteLine("{0}", paid);
paidSum += paid;
}
Console.WriteLine("Sum: {0}", paidSum);
Console.ReadKey();
lomachka ща проверю отпишусь... но заранее спасибо за совет
все работает, но выдает неправильные результаты.. получается что платишь ментше чем взял))) фигня... вообщем пошел спать, на свежую голову утром посмотрю.. спасибо за помощь
Вообщем вопрос такой... нужно написать прогу - кредитный калькулятор..... Не могу расчитать сроки выплаты при динамическом погашении кредита (т.е. когда с каждой выплатой сумма кредита уменьшается)...
Внимание вопрос! Как это реализовать циклом??? что-то совсем в голову не лезет... видать перетрудился
з.ы. при этом все промежуточные значения, т.е. остатки после каждого месяца и суммы выплат должны выводиться на экран
а на который срок?
если на год-два (в смысле, не ипотека), то проще в Экселе за пару минут ячейки формулами связать и всё ...
не забивайте микроскопом гвозди ...
а на который срок?
если на год-два (в смысле, не ипотека), то проще в Экселе за пару минут ячейки формулами связать и всё ...
не забивайте микроскопом гвозди ...
а вообще, сорри ...
пропустил в старт-посте требование, что нужно написать именно прогу ...
подумал, типа, для личного пользования что-нить ... не подумал, что это может быть заданием в ВУЗе, скажем ...
вот именно в C# выносить определение переменной из цикла как-раз и не следует, это может привести к снижению производительности Так что девушка оказалась опытнее вас
P.S.: Вот мой вариант
Код:
Decimal credit = 1000M; // Сумма кредита
Decimal period = 12M; // Срок кредита
Decimal rate = 15.0M; // Процентная ставка
Decimal body = credit; // Тело кредита
Decimal totalSum = 0M; // Сумма выплат по кредиту
Decimal paidMonth = Math.Round(body / period, 2); // Месячный платеж
while (Math.Round(body,2) > 0)
{
// выплата по телу кредита:
Decimal paidBody = paidMonth > body ? body : paidMonth;
// выплата процентов на тело кредита:
Decimal paidPercent = Math.Round((body * rate) / 100M, 2);
totalSum += paidBody + paidPercent;
Console.WriteLine("body={0}\tpaid={1}\tpercent={2}\tSum={3}", Math.Round(body, 2), Math.Round(paidBody, 2), Math.Round(paidPercent, 2), Math.Round(totalSum, 2));
body -= paidBody;
}
Console.WriteLine("======");
Console.WriteLine("Total Paid Sum: {0}", Math.Round(totalSum, 2));
Console.WriteLine("Overpaid: {0}", Math.Round(totalSum-credit, 2));
Console.ReadKey();
В жизни не поверю в это. Не в то, что она опытнее, а в то, что вы правы.
Написал программку, которая последовательно запускает 2 метода:
оба содержат циклы с большим числом итераций, при чем первый метод содержит внутри переменную (с её инициализацией), а во втором эта же переменная инициализируется до цикла, но в каждой итерации идёт присваивание её значения.
также оба эти метода замеряют разницу во времени перед началом цикла и после его завершения, дабы узнать длительность.
на небольших итерациях (до 1 миллиона) разницы не было.
но вот при 1000000000 итераций, длительность была следующая:
24741415
24671411
надеюсь, не нужно объяснять, какой метод дольше работал.
Так что проверяйте свои аргументы перед тем, как кого-то учить.
вообще-то это рекомендация микрософта - не заниматься подобными "оптимизациями" в C#, и вообще древнейший баян (то что в C# подобная оптимизация приносит только вред). Есть соответствующая тема на RSDN, гдето 3-4 летней давности. Там подробно этот вопрос исследован.
Если коротко, то когда ты декларацию переменной не выносишь за тело цикла, оптимизатор компилятора видит узкую область видимости переменной и сделает все оптимальным образом, а вот если ты вынесешь за тело цикла, то оптимизатор увидит что переменная имеет большую область видимости и возможностей для оптимизации у него уже будет меньше.
Не поленись откопать эту тему на RSDN, там сотни умнейших людей, наступивших как и ты на эти грабли все разложили по полочкам, от и до. Начиная от тестов, и заканчивая выводами почему так происходит.
Написал программку, которая последовательно запускает 2 метода:
оба содержат циклы с большим числом итерацийно вот при 1000000000 итераций, длительность была следующая:
24741415
24671411
надеюсь, не нужно объяснять, какой метод дольше работал.
во первых ответьте на вопрос - на каком языке вы проводили этот тест? на C#? или это был вообще не дотнет? Мои слова касались именно дотнета!
Во вторых - давайте сюда исходник теста, чтобы не говорить об абстрактном софте с непонятными цифрами...
Ну если гуглом пользоваться не умеете, я вам подкину тему с RSDN, читайте: Посилання видалено
На этой же сортировке с удивлением обнаружил, что цикл for(int i = 0;
i < arr.Length; ++i) выполняется быстрее, чем если длину массива
записать в отдельную переменную... (после вынесения arr.Length в
отдельную переменную время сортировки увеличилось с 86 до 116 сек).
Но на семинаре по гайдам МС всегда приводят эту строку в пример — говорят, не пытайтесь думать за компилятор — он неплохо соображает и знает что делать...
Кстати, что касается касается самой декларации, то в C# вообще нет никакой разницы, где определена переменная, вне тела цикла или внутри. Чтобы доказать это, делаем две тестовых программки:
1.cs:
Код:
using System;
class Program
{
static void Main()
{
int sum = 0;
for(int i=0; i < 10; i++)
{
int a = i + i;
sum += a;
}
}
}
2.cs:
Код:
using System;
class Program
{
static void Main()
{
int sum = 0, a;
for(int i=0; i < 10; i++)
{
a = i + i;
sum += a;
}
}
}
как видим разнизца заключается только в том что ячейки поменялись местами - вместо 1-й стала 2-я, а вместо 2-й стала 1-ая. Тоесть код абсолютно одинаков, только переменные хранятся в другом порядке (это заморочки компилятора - как ему было удобнее, так и сделал). Вот и вся разница
байт-код. а исходники давать не буду, замерь свой код, разница будет такой же.
возможно, физически разница видна только на больших промежутках времени, но тем не менее, результаты стабильны.
я завтра поговорю с одним человеком, и тогда уже смогу точно сказать, что не прав. пока что аргументов в свою пользу у меня, действительно, нет.
от-жеж Фома-неверующий Ты будешь доказывать что время работы программы имеет сильную зависимость от того что переменную A мы будем хранить в ячейке 0, а переменную B в ячейке 1, а если наоборот то все будет работать заметно медленее?
Результат компиляции я приводил выше - разницы в коде нет!
Измеряем, для этого дополним вышеуказанный код таким образом:
Код:
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
int sum = 0;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
for (long j = 0; j < 1000000000; j++) // loop to minimize measurement error
for (int i = 0; i < 10; i++)
{
int a = i + i;
sum += a;
}
stopWatch.Stop();
Console.WriteLine("time: {0}", stopWatch.Elapsed);
}
}
итого, если декларацию не выносить, то работает быстрее Шутка, на самом деле время одинаковое, разница объясняется погрешностью измерений и многопоточностью windows