Серия «Введение в основы программирования.»

2

Конструкции повторения. Синтаксис C#

В 1969 году Эдсгер Дейкстра доказал, что для решения любой логической задачи необходимо три алгоритмических структуры: следование, ветвление и повторение.

Следование и ветвление вам уже известны. Переходим к рассмотрению алгоритмической структуры — повторение.

Алгоритмическая структура повторение, применяется для многократного повторения одной и той же операции, называемой циклом. Цикл состоит из итераций. Итерация однократное выполнение операции цикла.

При выполнении операций повторения используются управляющие конструкции с операторами — while, do…while и for.

Основой алгоритма цикла является проверка некоторого условия, представляющего собой логическое выражение. Алгоритм цикла схож м алгоритмом операции ветвления.

Если результатом вычисления логического выражения является значение true, выполняется итерация цикла, если false, цикл завершается. Таким образом, выходом из цикла, является изменение, с true на false, результата вычисления логического выражения в операторе цикла

Конструкция повторения состоит из

  • Оператор цикла, с логическим выражением выполнения условия итераций

  • Тело цикла

  • Счетчик количества итераций или оператор — break.

Счетчик итераций применяется, когда количество итераций известно, оператор break, в случаях, когда количество итераций неизвестно.

Счетчик итераций имеет обязательные параметры.

  • Начальное значение. Целое число.

  • Операция изменения начального значения. Выбор, с определенным шагом, значения из числового ряда в диапазоне ограниченным начальным и конечным значением.

  • Конечное значение. Логическая операция. В основном, операция отношения с числом или переменной с примитивным типом данных.

Для операции изменения начального значения с шагом в единицу, в конструкциях ветвления, применяются унарные операторы.

Унарная операция — операция с одним операндом, имеет конструкцию вида « х++ »  и заменяет запись « х = х + 1». Приращение на единицу называется операцией инкремент — « х++ »  , уменьшение« х-- »  — декремент. Унарные операции делятся на префиксную и постфиксную.

Префиксная запись: ++x — сначала значение переменной x увеличивается на 1, а потом ее значение возвращается в качестве результата операции.

Постфиксная запись: x++ — сначала значение переменной x возвращается в качестве результата операции, а затем к нему прибавляется 1.

Отличие результатов применения префиксной и постфиксной записи инкремента.

static void Main(string[] args)

{

int x = 3;

Console.WriteLine(x);  // Результат: 3

Console.WriteLine(x++); // Результат: 3

Console.WriteLine(x);  // Результат: 4

Console.WriteLine();

int y = 3;

Console.WriteLine(y);  // Результат: 3

Console.WriteLine(++y); // Результат: 4

Console.WriteLine(y);  // Результат: 4

}

Вернемся к операциям повторения и рассмотрим конструкцию с оператором — for, вида:

static void Main(string[] args)

{

for (int variable = 0; variable < 3; variable++)

{

Console.WriteLine("Итерация ");

}

}

Где, for (int variable = 0; variable < 3; variable++) — конструкция с оператором «for » с счетчиком.

  • Выражение int variable = 0 — начальное значение счетчика

  • Выражение variable < 3 — логическое выражение. В случае истинности выполняется итерация цикла, результат — false, заканчивает цикл.

  • Унарная операция variable++ — операция по изменению счетчика.

Здесь, каждую итерацию, значение переменной variable изменяется на единицу, в диапазоне от нуля до трех.

При достижении числа три, логической выражение вернет в программный код результат «false», итерация не будет выполнена и  цикл будет завершен. Начальным значением может быть любое число, но диапазон чисел должен соответствовать необходимому количеству итераций. К примеру, 1 <= 3 или 5  <  8

Эту же задачу можно решить с помощью конструкции повторения с операторам « while »

static void Main(string[] args)

{

int i = 0;

while(i<3)

{

Console.WriteLine("Итерация ");

i++;

}

}

Отличие конструкции с операторам « while » от конструкции с оператором « for » в расположении элементов счетчика. Начальное значение инициализируется перед циклом, а операция по изменению начального значения происходит каждую итерацию в теле цикла.

Счетчик может как приращиваться, так и уменьшаться.

Выведем числа от десяти до нуля в одну строку через запятую. Изменяя начальное или логическое выражение на экран, можно выводить любой числовой ряд. Выражение в виде Console.WriteLine(i);  часто используют для вывода нумерации строк.

static void Main(string[] args)

{

int i = 10;

while (i > 0)

{

Console.Write(i + ", ");

i--;

}

}

При написании цикла необходимо внимательно отнестись к параметрам счетчика, так если не указать изменение счетчика или неверно составить логическое выражение, параметр в круглых скобках оператора никогда не изменит значения с true на false и цикл никогда не завершится, т.е. станет бесконечным.

Как это не парадоксально звучит, но и бесконечный цикл нашел большое применение в операциях повторения и применяется в случаях, когда необходимо ввести неизвестное количество значений.

Для этого, оператору while в качестве параметра передается значение true, а для выхода из цикла применяется операция ветвления, которая может принять либо true либо false. Один из блоков операции ветвления содержит оператор — break.

Напишем программу проверки ввода логина. Логин — строчное значение 123.

static void Main(string[] args)

{

Console.WriteLine("Введите логин. Для отказа нажмите пробел");

while (true)

{

string value = Console.ReadLine();

if(value == " ")

{

break;

}

if (value != "123")

{

Console.WriteLine("Неверно. Введите логин");

}

else

{

Console.WriteLine("Логин принят");

Console.ReadKey();

break;

}

}

Заключение.

Алгоритмическая структура повторение используется при решении задач с неоднократно повторяющимися операциями вычисления. Наиболее известными конструкциями структуры повторения являются конструкции с операторами while и for. Циклы делятся на две группы. Циклы с известным количеством итераций, для которых предпочтительно использовать конструкцию с оператором for, и с неизвестным количеством итераций, в том числе и бесконечные циклы, для которых лучше подходит конструкция с оператором while.

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью
2

Конструкция с оператором множественного выбора. Синтаксис C#

Из этой лекции вы узнаете о конструкции с оператором множественного выбора switch…case.

Помимо широко используемой конструкции с оператором условного перехода «if», в ветвлении применяется конструкция с оператором множественного выбора switch…case. По своему функционалу, Switch…case, похож на расширенную форму конструкции с условным оператором «if», if…else if…else, но в отличии от оператора «if», оператор switch не производит вычисления логического выражения, а сравнивает полученное значение с константой в операторе «case».

Так как операция сравнения возможна только между одинаковыми типами данных, то и тип данных в переменной и константе должен быть одинаковыми.

Тип данных константы, определяется неявно, по формату записи. Целочисленные — тип данных int, с плавающей точкой — double, набор символов заключенных в двойные кавычки — string, true или false — bool.

Получив на вход значение, оператор switch сравнивает его с константами оператора case. Найдя совпадения, переходит к выполнению программного кода в соответствующем блоке. После того как программный код выполнен, оператор — break прекращает работу оператора switch и выполнение возвращается следованию. Для случаев, когда не найдено ни одно соответствие константы сравниваемому значению, применяется блок— default. Если такой блок отсутствует, выполнение возвращается следованию.

Конструкция Switch…case имеет следующий вид

switch(variable) — Сравниваемая с константами переменная

{

case 1:  — Оператор case с константой 1

Блок кода, выполняемый в случае, если переменная равна 1

break;

case 2: — Оператор case с константой 2

Блок кода, в случае если переменная равна 2

break; 

default:

Блок кода, выполняемый если переменная отлична от всех констант

break;

}

Как видите конструкция множественного выбора switch…case достаточна проста и в отличие от if…else if…else нет необходимости строить конструкцию с множеством ветвлений, что сокращает количество ошибок и повышает удобочитаемость текста.

Напишем программу, производящую арифметические действия над двумя числами

static void Main(string[] args)

{

int a = 5;

int b = 3;

Console.WriteLine("Для операции сложения нажмите +, для вычитания -");

string variable = Console.ReadLine();

switch (variable)

{

case "+":

Console.WriteLine("Сумма чисел: " + (a + b));

break;

case "-":

Console.WriteLine("Разница чисел: " + (a - b));

break;

default:

Console.WriteLine("Операция указана не верно");

break;

}

}

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

В таких случаях, применяется подмена значения неоднозначной трактовки, числовым значением.

К примеру, программа, показывающая блюда меню на завтрак, обед, ужин

static void Main(string[] args)

{

Console.Write("Посмотреть блюда на завтрак — нажмите 1,");

Console.Write(" на обед — нажмите 2,");

Console.WriteLine(" на ужин — нажмите 3");

int variable = int.Parse(Console.ReadLine());

switch (variable)

{

case 1:

Console.WriteLine("Омлет");

break;

case 2:

Console.WriteLine("Курица");

break;

case 3:

Console.WriteLine("Рыба");

break;

default:

Console.WriteLine("Операция указана не верно");

break;

}

}

В блоках конструкции swith…case, так же как и в блоках конструкции с оператором if, можно размещать блоки программного кода.

Программа переводящая значение температуры по Цельсию в значение по Фаренгейту и Кельвину.

static void Main(string[] args)

{

double c = 25;

Console.Write("Температура по Фаренгейту — нажмите 1,");

Console.WriteLine(" по Кельвину — нажмите 2");

int variable = int.Parse(Console.ReadLine());

switch (variable)

{

case 1:

double f=c * 9 / 5 + 32;

Console.WriteLine("Температура по Фаренгейту — " + f);

break;

case 2:

double k = c  + 273.15;

Console.WriteLine("Температура по Кельвину — " + k);

break;

default:

Console.WriteLine("Операция указана не верно");

break;

}

}

В заключении.

Конструкция ветвления swith…case удобна своей простотой и удобочитаемостью, поэтому нашла применения в виде различных меню консольных программ или при выборе значения из некоторого списка. Во избежание ввода неверного значения сравниваемой переменной, рекомендуется приводить неоднозначно трактуемые значение к более упрощенной форме. К примеру, подмену строкового значения числовым.

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью
4

Тернарная операция и логические операторы. Синтаксис C#

Из этой лекции вы узнаете о логических операторах, тернарной операции, познакомитесь с сокращенной формой конструкции ветвления с оператором «if».

Классическую и расширенную форму конструкции ветвления с оператором «if», удобно использовать при написании информативного кода, когда один из блоков содержит справочную информацию о выполнение или невыполнение операции. За такую информативность ветвления приходится платить нагрузкой на аппаратную часть вычислительной системы, так как увеличивается количество операций. Страдает удобочитаемостью кода. К примеру, классическая формы if…else занимает восемь строк программного кода, поэтому каждая операция вложения одной формы в другую, будет увеличивать программный код на восемь строк.

В случае отсутствия необходимости в информативности, операции отношения укрупняют. Для этого используют цепочки из операций отношения, связанных логическими операторами. В данной связка операции отношения являются операндами, а логический оператор выступает в роли оператора связки.

Нам для учебных целей понадобятся нижеследующие логические операторы

Логический оператор— И —&&. Результатом связки двух операций отношений будет true, если результат в обоих операндах (операциях отношения)) будет true, в остальных случаях — false. Заменяет операцию вложения в конструкции ветвления.

Логический оператор — ИЛИ —||. Результатом связки двух операций отношений будет true, если результат в одном из операндов будет true, в остальных случаях — false. Заменяет расширенную конструкцию if…else if…else.

Логическая инверсия (отрицание)—НЕ —!= (отрицание). Используется для изменения результата вычисления операции отношения с true на false или наоборот.

Нижеприведенная таблица помогает правильно составить логические выражения. Где, 0 — ложь, а 1 — истина.

Тернарная операция и логические операторы. Синтаксис C# Основы, Программирование, Учебные курсы, Длиннопост

Напишем программу, определяющую принадлежность точки отрезку с координатами [0, 5].

Тернарная операция и логические операторы. Синтаксис C# Основы, Программирование, Учебные курсы, Длиннопост

Для получения результата о принадлежности точки заданному отрезку, составим логическое выражение, состоящее из отношения 0 < = point и point <= 5 соединенное логическим оператором &&.

static void Main(string[] args)

{

int point = -2;

if ((0 <= point) && (point <= 5))

{


{

Console.WriteLine("Точка принадлежит отрезку");

}

}

else

{

Console.WriteLine("Точка не принадлежит отрезку");

}

}

Логическое выражение —(0 <= point) && (point <= 5) вычисляет результат двух операций отношения, а оператор && (логическое И) заменяет собой операцию вложения классической формы конструкции ветвления с оператором if.

Усложним задачу и проверим принадлежность точки двум отрезкам с координатами [0, 5]  и [6, 9]

Для этого добавим в предыдущий код проверку принадлежности второму отрезку.

static void Main(string[] args)

{

int point = 8;

if (((0 <= point) && (point <= 5)) || ((6 <= point) && (point <= 9)))

{


{

Console.WriteLine("Точка принадлежит одному из отрезков");

}

}

else

{

Console.WriteLine("Точка не принадлежит ни одному из отрезков");

}

}

Здесь, в качестве операндов выступают логические выражения с оператором &&, а оператором связкой является логический оператор —||.

Логический оператор « | | — ИЛИ» заменяет расширенную форму  if…else if…else. Таким образом, получился компактный, но малоинформативный программный код, который не может сообщить, какому именно отрезку принадлежит точка.

Ну и уж если мы начали писать компактный, но малоинформативный программный код, познакомимся с неполной(сокращенной) формой оператора if и тернарной операцией.

Неполная форма конструкции с оператором if  — это форма без блока else. Тем не менее, даже неполная форма может менять ход выполнения программы. 

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

static void Main(string[] args)

{

int job = 0;

double rate = 15;

if(job==0)

{

rate = rate * 1.1;

}

Console.WriteLine("Ставка по кредиту = " + rate);

}

Тот же самый результат можно получить, используя тернарную операцию.

Тернарная операция, это операция над тремя операндами (это повлияло на название). Тернарная операция представляет собой конструкцию, где переменная инициализируется значением второго или третьего операнда.

string result = 0 < 1? "Истина" : "Ложь";

Первый операнд — это логическое выражение 0 <1, после оператора «?», через двоеточие, перечисляются значения второго «Истина»  и третьего операнда «Ложь».

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

Пример программы с тернарной операцией по проверке положительности числа.

static void Main(string[] args)

{

int number = 2;

string result = 0 < number ? "Положительное" : "Отрицательное";

Console.WriteLine("Число " + number + " " + result);

}

Значениями операндов могут выступать не только значения, но и переменные.

Решим задачу по проверке принадлежности точки двум отрезкам с координатами [0, 5]  и [6, 9]

static void Main(string[] args)

{

int point = -8;

bool compare = (((0 <= point) && (point <= 5)) || ((6 <= point) && (point <= 9)));

string textTrue = "Точка принадлежит одному из отрезков";

string textFalse = "Точка не принадлежит ни одному из отрезков";

string result = compare ? textTrue : textFalse;

Console.WriteLine(result);

}

В заключении.

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

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью 2
5

Расширенная форма и вложения оператора if. Синтаксис C#

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

Но мир задач намного разнообразней и зачастую одному условию соответствует выбор из множества путей.

Но мир задач намного разнообразней и зачастую одному условию соответствует выбор из множества путей. Для решения таких задач используется расширенная форма конструкции с оператором условного перехода «if» вида — if…else if…else.

Напишем программу сравнения двух чисел, где единственным условием является сравнение чисел, но используется при этом в трех вариациях.

static void Main(string[] args)

{

int a = 2;

int b = 2;

if (a < b)

{

Console.WriteLine("A меньше B");

}

else if (a > b)

{

Console.WriteLine("A больше B");

}

else

{

Console.WriteLine("Значения переменных равны");

}

}

В противовес «одно условие, множество путей» существуют задачи, где один путь зависит от выполнения нескольких взаимосвязанных условий. Для решения таких задач используются, вложенные друг в друга, конструкции с классической  формой if…else.

Напишем код проверяющий логин и пароль, где доступ разрешен только после проверки пароля. Пароль в свою очередь проверяется, только после получения результата «истинность» проверки логина.

Допустим, что логин состоит из символов— 123, а пароль —456.

static void Main(string[] args)

{

string login = "123";

string password = "456";

Console.WriteLine("Введите логин");

string loginIn = Console.ReadLine();

if (loginIn == login)

{

Console.WriteLine("Введите пароль");

string passwordIn = Console.ReadLine();

if(passwordIn == password)

{

Console.WriteLine("Доступ разрешен");

}

else

{

Console.WriteLine("Пароль не верен");

}

}

else

{

Console.WriteLine("Логин не верен");

}

}

Здесь, в строке if (loginIn == login) происходит вычисление операции отношения между оригиналом и введенным значением пароля. В случае результата true, управление программой переходит конструкции ветвления с проверкой пароля, в случае false, блок else выводит сообщение «Логин не верен».

Если проверка логина прошла успешно, управление программой передается блоку проверки пароля.

Расширенная форма и вложения оператора if. Синтаксис C# Введение, Основы, Программирование, Учебные курсы, Длиннопост

Вложенность операций позволяет сделать сколько угодно вложений, как в блок истинности условного оператора, так и в его блок ложности.

Напишем программу проверки, будет ли гражданин призван на срочную службу. Оценим это по следующим признакам. Возраст от 18 до 30 лет. Количество детей менее двух.

static void Main(string[] args)

{


string message = "Гражданин не будет призван на срочную службу";

Console.WriteLine("Введите возраст гражданина");

byte age = byte.Parse(Console.ReadLine());

if (age >= 18)

{

if (age < 30)

{

Console.WriteLine("Введите количество детей");

byte children = byte.Parse(Console.ReadLine());

if (children < 2)

{

Console.WriteLine("Гражданин будет призван на срочную службу");

}

else

{

Console.WriteLine(message + ". Дети");

}

}

else

{

Console.WriteLine(message + ". Старше 30");

}

}

else

{

Console.WriteLine(message + ". Моложе 18");

}

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

В заключении.

Для решения задач с независящими друг от друга условиями, применяйте расширенную форму if … else if … else, которую можно представить, как нумерованный список.

вложенные друг в друга, конструкции с классической формой if…else.

Для решения задач с зависящими условиями, применяйте вложенные друг в друга, конструкции с классической формой if…else. Можно представить, как нумерованный список с подпунктами.

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью 1
2

ВЕТВЛЕНИЕ и bool. Синтаксис C#

Из этой лекции вы узнаете о базовой структуре структурного программирования — ветвлении и логическом типе данных bool.

Ветвление — это одна из базовых структур структурного программирования, позволяющая пользователю решать задачи с неопределенными условиями, к примеру, получить ответ от компьютера на заданный вопрос. Структура «ветвления» является вложенной структурой в структуру следования и на алгоритмической блок-схеме представлена как разветвляющийся алгоритм.

Операция ветвления — это операция выбора выполнения программного кода в зависимости от выполнения или невыполнения какого-то условия. Эту операцию можно представить как ответ на некоторый вопрос, который подразумевает один из ответов. Либо — да, либо — нет. Именно этот ответ создает иллюзорную видимость интеллекта вычислительной системы. В зависимости от полученного ответа выполняется заранее определенный программный код.

В операциях ветвления используются операции отношения, содержащие операторы сравнения и равенства.

Операторы сравнения

>  строго больше

<=  меньше или равно

<  строго меньше

>= больше или равно

Операторы равенства

= =  равно

!=  не равно

Все операторы интуитивно понятны. Из-за того, что оператор « = » является оператором присваивания, то для операции « равно » используется оператор « = = ».

Тут нужно указать, что операция равенства делится на две операции — равенство и строгое равенство. В C#, операция строго равенства выполняется с помощью метода Equals(). О ней мы расскажем позже.

Операция ветвления состоит из двух этапов. Вычисление условия и переход на выбранную ветку программного кода.

Вычисление условия — это логическая операция, состоящая из операции отношения. Результатом операции отношения является одно из двух логических значений либо true, либо false — ответ на вопрос, либо да, либо нет. Для хранения результата используется тип данных — bool.

Тип данных bool относится к примитивным типам данных, хранится в стеке и имеет размер 8 бит. В отличие от других типов данных, хранимые значения определены заранее — это либо true, истинность, либо false, ложь.

static void Main(string[] args)

{

bool a = true;

bool b = false;

}

Обычно переменные логического типа инициализируются операциями отношения между двумя значениями, переменными или их вариациями. Результатом такой операции будет все те же true и false.

static void Main(string[] args)

{

int x = 1;

bool a = x < 2;

bool b = 1 > 2;

Console.WriteLine("A = " + a + " B = " + b);

}

Для выбора блока исполняемого кода используется конструкция с оператором — if. Эта конструкция имеет множество форм, классической из которых является форма if … else (если…иначе).

Оператор if выполняет вычисление логического выражения и в случае результата «true», выполняет программный код своего блока. В случае результате «false», выполняется программный в блоке оператора — else.

Напишем программу проверки на положительное число.

static void Main(string[] args)

{

int number = 2;

bool compare;

compare = 0 < number;

if (compare)

{

Console.WriteLine("Число положительное");

}

else

{

Console.WriteLine("Число отрицательное");

}

}

Помимо вывода сообщений, соответствующие блоки могут содержать программный код.

Программа для извлечения квадратного корня. Так как корень нельзя извлекать из отрицательного числа, производится проверка числа на положительное.

static void Main(string[] args)

{

int number = -2;

if (0 < number)

{

double sqr = Math.Sqrt(number);

sqr = Math.Round(sqr, 2);

Console.WriteLine("Корень числа: " + number + " = " + sqr);

}

else

{

Console.WriteLine("Число не является положительным");

}

}

Забежим вперед и используя генератор случайных чисел напишем игру «Угадай число»

static void Main(string[] args)

{

Random rnd = new Random();

int value = rnd.Next(1, 3);

Console.WriteLine("Введите число от одного до трех");

int number = int.Parse(Console.ReadLine());

if (value == number)

{

Console.WriteLine("Вы выиграли");

}

else

{

Console.WriteLine("Вы проиграли");

}

}

Здесь, в строке int value = rnd.Next(1, 3);, генерируется случайное число в диапазоне от одного до трех, которое затем сравнивается с введенным числом

В заключении.

Для решения задач с неопределенными условиями, используются операции отношения. Результат вычисления операции отношения, принимает два значения — true и false и хранятся в переменных с типом данных —bool. Операции отношения используются в программах с базовыми структурами структурного программирования — ветвление и повторение.

Одной из конструкций ветвления является конструкция if…else. Оператор if выполняет операцию по вычислению операции отношения и в зависимости от полученного результата, выполняется либо блок программного кода относящегося к оператору « if», либо блок кода оператора «else»

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью

Проверка знаний о значениях. Синтаксис C#

Напишите программу расчета кредитной ставки для заемщика.

Программа должна запрашивать с клавиатуры следующие данные

  • Фамилию и имя заемщика

  • Возраст заемщика

  • Заработная плата заемщика

  • Трудовой стаж заемщика

  • Требуемая сумма кредита

  • Коммунальные расходы в месяц

  • Другие расходы

  • Первоначальная ставка по кредиту. К примеру, ставка ЦБ РФ.

Пример ввода:

  • Фамилия и имя заемщика — Иванов Иван

  • Возраст заемщика — 45

  • Заработная плата заемщика — 150000

  • Трудовой стаж заемщика—30

  • Требуемая сумма кредита—1000000

  • Коммунальные расходы в месяц—5000

  • Другие расходы—10000

  • Первоначальная ставка по кредиту—16

Формулы для расчета промежуточных значений и вычисление окончательного результата.

  • Рассчитайте коэффициент возраста. Для этого —Трудовой стаж /Возраст. Округлите результат до второго знака после запятой.

  • Рассчитайте коэффициент заработной платы по следующей формуле — 1000*(Базовая ставка – ((Заработная плата * Базовая ставка)/ (Заработная плата + Базовая ставка))). Округлите результат до второго знака после запятой.

  • Вычислите конечную ставку кредита по формуле— (Базовая ставка – коэффициент возраста заемщика – коэффициент заработной платы). Преобразуйте полученный результат в целое число с наилучшим типом данных.

  • Рассчитайте по формуле период погашения кредита в полных месяцах — (Сумма кредита * конечную ставку)/ (Заработная плата – коммунальные расходы – другие расходы).

Вывод должен содержать следующую информацию

  • Фамилия, имя заемщика в одну строку

  • Сумма кредита

  • Ставка по кредиту конечная

  • Период погашения в полных месяцах

Пример вывода

  • Фамилия, имя заемщика— Иванов Иван

  • Сумма кредита—1000000 руб.

  • Ставка по кредиту конечная—14%

  • Период погашения в полных месяцах—104 мес.

Для получения возможного решения отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью
4

Преобразование типов

Из этой лекции вы узнаете, об особенностях применения неявного типа var и о преобразовании типов данных.

Начнем эту лекцию с написания программы подсчета населения двух стран Индии и Китая. Для инициализации переменных будем использовать неявный тип данных — var, который не рекомендуется применять на начальном этапе обучения.

Неявный тип данных var — это операция, при которой тип данных переменной назначается по формату записи значения. Это свойство не позволяет объявить переменную, поэтому переменная с типом данных var инициализируется.

Напомним соответствие формата записи и типа данных. Значения, состоящего из цифр —тип данных int, для чисел с точкой— double, набор любых символов заключенных в двойные кавычки — string.

static void Main(string[] args)

{

var text = "Высота Эйфелевой башни ";

var number = 328;

Console.WriteLine(text + number + " метров");

}

Применение var удобно, но в процессе написания кода, во избежание непредсказуемых результатом из-за несовместимости различных типов данных, необходимо контролировать тип данных у переменных.

Для определения типа данных у переменной применяется метод GetType(), который  выводит на экран тип данных с классом которому принадлежит этот тип, и его аналог GetTypeCode(), который показывает тип данных без принадлежности к классу. Для просмотра типа данных достаточно поставить точку после переменной и написать имя метода, точечная нотация. Не забываем формат метода — две круглые скобки в конце названия.

static void Main(string[] args)

{

var text = "Высота Эйфелевой башни ";

var number = 328;

Console.WriteLine(text + number + " метров");

Console.WriteLine("Тип данных text- " + text.GetTypeCode());

Console.WriteLine("Тип данных number- " + number.GetTypeCode());

}

В этой программе есть один недостаток, а именно переменной number, которой VS автоматически назначила тип данных int, что создает не нужную нагрузку на аппаратную часть. Здесь больше подойдет тип данных ushort.

Так как тип данных var определяет назначаемый тип по присваиваемому значению, то достаточно явно изменить тип этого значения.

static void Main(string[] args)

{

var text = "Высота Эйфелевой башни ";

var number = (ushort)328;

Console.WriteLine(text + number + " метров");

Console.WriteLine("Тип данных text- " + text.GetTypeCode());

Console.WriteLine("Тип данных number- " + number.GetTypeCode());

}

Операция по явному изменению типа данных называется — явное привидение типов или преобразование типов.

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

static void Main(string[] args)

{

var day1 = -3.1;

var day2 = 1.2;

var day3 = 5.5;

var result = (int) ((day1 + day2 + day3) / 3);

Console.WriteLine("Средняя температура: " + result);

}

Или снизить разрядность переменной с 32 ячеек до 8.

static void Main(string[] args)

{

var day1 = -3.1;

var day2 = 1.2;

var day3 = 5.5;

var result = (byte)((day1 + day2 + day3) / 3);

Console.WriteLine("Средняя температура: " + result);

Console.WriteLine("Тип данных: " + result.GetTypeCode());

}

Преобразование типов участвует не только в операциях с типом var, но и с другими типами. Та же самая программа с явными типами данных.

static void Main(string[] args)

{

double day1 = -3.1;

double day2 = 1.2;

double day3 = 5.5;

byte result = (byte)((day1 + day2 + day3) / 3);

Console.WriteLine("Средняя температура: " + result);

Console.WriteLine("Тип данных: " + result.GetTypeCode());

}

Еще одно применение преобразование нашло в учебном вводе с клавиатуры. Почему в учебном расскажем ниже

Для ввода информации будем использовать метод ReadLine. Вызов метода аналогичен вызову метода WriteLine. По правилам хорошего тона, перед вводом, пишется строка приглашение, иначе как понять мигающий курсор.

static void Main(string[] args)

{

Console.WriteLine("Введите Ваш текст. По окончанию нажмите enter");

string text = Console.ReadLine();

Console.Clear();

Console.WriteLine("Вы ввели следующий текст: " + text);

}

Поздравляем! Вы создали первую диалоговую программу, а Пользователь получил в свое распоряжение программный интерфейс для управления ходом вычислений.

Перезапустим программу и сделаем немыслимое — введем числовое значение, которым будет инициализирована переменная с типом данных string. Но ошибки не последовало, и программа вывела на экран число.

Возникает вопрос, как числовое значение поместилось в область памяти, предназначенное для строковых значений. Ответ - никак. Метод Console.ReadLine(); принимает на вход набор символов. Введённое нами число было принято, как строка и передано в строковую переменную как строка, и на экране мы видим не число, но слово (строку) в виде числа.

Для инициализации переменной типом данных отличным от типа данных string требуется явное преобразование типа данных.

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

Попробуйте инициализировать переменную с типом данных int, значением, содержащим символ отличным от цифры, а метод Console.ReadLine() именно инициализирует строку вводимым значением. К ошибке приведет даже неверный выбор точки или запятой в значении переменной с типом данных double.

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

Преобразуем строку состоящую из цифр в полноценное числовое значение

static void Main(string[] args)

{

Console.WriteLine("Введите число");

int number = int.Parse(Console.ReadLine());

Console.Clear();

Console.WriteLine("Вы ввели число: " + number);

}

Для преобразования типа данных используется следующая конструкция преобразования типа данных string в тип данных int— int.Parse(Console.ReadLine()). Для byte, соответственно это будет byte.Parse(), для short — short.Parse() и т.д.  

Пример программы с различными типами данных

static void Main(string[] args)

{

Console.WriteLine("Введите ваше имя. Нажмите enter");

string text = Console.ReadLine();

Console.WriteLine("Введите ваш возраст. Нажмите enter");

int numberInt = int.Parse(Console.ReadLine());

Console.WriteLine("Введите число Pi до 5 знака после запятой. Нажмите enter");

double numberDouble = double.Parse(Console.ReadLine());

Console.Clear();

Console.WriteLine("Ваше имя: " + text);

Console.WriteLine("Ваш возраст: " + numberInt);

Console.WriteLine("Число Pi: " + numberDouble);

}

В заключении.

Неявное преобразование(приведение) типов данных может приводить к непредсказуемым результатам. Примите за правило, в процессе обучения, явно указывать типы данных у переменных.

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью
1

Особенности применения чисел с плавающей точкой

Особенности применения чисел с плавающей точкой.

Тема чисел с плавающей точкой достаточна сложна. Исходя из принципа: польза — вред, суть представления чисел с плавающей точкой будет опущена и речь в лекции пойдет об особенностях применения таких чисел. Автор считает, что на начальном этапе обучения, знания об операциях чисел с плавающей точкой на аппаратном уровне, не принесут практической пользы.

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

Для хранения значений с плавающей точкой, используются нижеприведенные типы данных.

Типы с плавающей запятой (float, double)

float: хранит число с плавающей точкой от -1.5*10-45 до 3.4*1038 и занимает 4 байта. Формат значения для float — в конце операнда-значения указывается суффикс « f »

double: хранит число с плавающей точкой от ±5.0*10-324 до ±1.7*10308 и занимает 8 байта. Формат для double  — операнд-значение записывается с указанием дробной части, если дробная часть равно нулю, то указывается ноль.

Отдельно стоит тип данных —decimal, который хранит число с плавающей точкой от ±1.0*10-28 до ±7.9*1028 и занимает 16 байта. Формат для decimal — в конце операнда-значения указывается суффикс «M». Операции с типом данных рассмотрены не будут.

Типы данных для вещественных чисел, так же, как и для целых относятся к примитивным типам данных, хранятся в стеке и обладают теми же особенностями применения, что и целочисленные значения. Использование float, за счет небольшого размера, позволяет эффективно использовать аппаратные ресурсы вычислительной системы в ущерб точности, double позволяет достичь более высокой точности, но занимает 8 байт.

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

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

Пример 1. Формат значения

Напишем программу деления целочисленного числа 10 на целочисленное число 6.

static void Main(string[] args)

{

double variable = 10/6;

Console.WriteLine("Десять разделить на шесть = " + variable);

}

Несмотря на то, что в памяти компьютера было выделено место для записи значения с плавающей точкой, в переменную variable было записана только целая часть полученного результата. Объяснение этому кроется в формате полученного результата от операции деления целого числа на целое. Результатом такой операции всегда будет значение с автоматически присвоенным типом данных int, который не предназначен для хранения значения с дробной частью, поэтому дробная часть была отброшена, и в переменную с типом данных double, именем variable, была записана только целая часть. 

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

static void Main(string[] args)

{

double variable = 10 / 6.0;

Console.WriteLine("Десять разделить на шесть = " + variable);

}

Пример 2. Округление

Не всегда есть необходимость большой точности. Так, результату финансовых вычислений вполне удовлетворит точность с двумя знаками после запятой. Для округления используется метод Round(), в круглые скобки которого помещается имя переменной, а через запятую указывается количество знаков после запятой. Для хранения результата округления используется тип данных — double. В отличии от метода WriteLine(), который принадлежит классу Console, метод  Round() принадлежит классу Math, поэтому для вызова метода, используется конструкция  Math.Round().

static void Main(string[] args)

{

float weight = 1.3f;

float price = 5.22f;

double total = Math.Round(weight * price, 2);

Console.WriteLine("Сумма = " + total);

}

В случае если точность не будет указана, значение будет округлено до целой части. Целую часть числа с плавающей точкой можно так же получить явным привидением типов.

3. Операции над переменными

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

static void Main(string[] args)

{

float a = 1.2f;

float b = 1.2f;

float sumFloat = a + b;

double sumDouble = a + b;

Console.WriteLine("sumFloat = " + sumFloat);

Console.WriteLine("sumDouble = " + sumDouble);

}

5. Ограничение по размеру выделяемой области памяти

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

static void Main(string[] args)

{

float floatPi = 3.14159265358980f;

double  doublePi = 3.14159265358980;

Console.WriteLine("Тип данных float = " + floatPi);

Console.WriteLine("Тип данных double = " + doublePi);

}

В заключение.

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

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Показать полностью
Отличная работа, все прочитано!