ПЕРЕМЕННЫЕ. ФОРМАТЫ ВЫВОДА


Переменные
Переменная - это ячейка в памяти компьютера, которая имеет имя и хранит некоторое значение, соответствующее типу.

Слово "переменная" говорит нам о том, что ее значение может меняться в ходе выполнения программы.  При сохранении нового значения переменной - старое стирается.


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

Например,
- целые переменные – тип int (от английского integer – целый), занимают 4 байта в памяти;
- вещественные переменные, которые могут иметь дробную часть (тип float – от английского floating point – плавающая точка) , занимают 4 байта в памяти;
- символы (тип char – от английского character – символ), занимают 1 байт в памяти.

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

Разберем для примера программу:
using System;
class Program {
    static void Main()
    {
        int a = 6, b; // объявили две переменных целого типа, в переменную а сразу сохранили значение 6. 
                      // Переменной b начальное значение не задали; 
                      // что будет находиться в памяти в этом случае мы не знаем.
    }
}


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

Пример
Попробуем написать калькулятор для простых чисел.

Наша задача вывести на экран некоторое арифметическое выражение и заставить компьютер его подсчитать.
Например такое: 
5+7=12
Причем вместо 5 и 7 могут быть разные числа, зависящие от значений переменных a и b в программе.

В операторе вывода можно выводить не просто текст, но и значения переменных, а также результат арифметического выражения. Причем последовательность вывода может быть различной. Например, для того, чтобы вывести вышеуказанное выражение необходимо записать так:
Console.WriteLine(a + "+" + b + "=" + (a+b));
Если хотим вывести значение переменной, то просто необходимо указать ее имя без кавычек. Если мы хотим вывести результат арифметического выражения, то достаточно просто записать правильно арифметическое выражение. Обратите внимание: 
Переменные и текст отделяются друг от друга оператором "+", при этом текст пишется в кавычках, а переменные без них.
 

Оператор ввода
Для того, чтобы пользователь смог сам задавать значение переменной, необходимо иметь возможность вводить значения с клавиатуры. 
В C# есть два оператора ввода значений: Console.Read(); и Console.ReadLine();
 
Read читает только один символ из введенных значений или -1, если доступных для чтения символов не осталось. Причем, метод возвращает целочисленный код символа, поэтому чтобы получить символьную переменную надо выполнить преобразование с помощью метода Convert.ToChar().
 
int x = Console.Read();      // считывание кода символа
char a = Convert.ToChar(x);  // преобразование полученного кода в значение символьной переменной 
 
С помощью ReadLine() можно считать строковую последовательность до перехода на новую строку. В результате метод может вернуть строку или null если строки закончились.

Например, запись считывает строку:
string line = Console.ReadLine();

Для считывания целочисленного значения надо считать строку и преобразовать ее в число:
 
int a = int.Parse(Console.ReadLine());
 
Если числа идут в линию, то надо считать строку,  и получить из нее массив строчек используя в качестве разделителя символ пробела. А потом каждый элемент массива преобразовывать в число:
string[] numbers = Console.ReadLine().Split(' ');
int a = int.Parse(numbers[0]);
int b = int.Parse(numbers[1]);

Спецификаторы вывода
Для вывода вещественных значений достаточно вызвать метод Console.Write или Console.WriteLine:
 
double a = 0.9999;
Console.Write(a);
 
Но иногда требуется предварительно отформатировать вывод значений, это удобно сделать с помощью метода String.Format, подробнее здесь.
Вывод с определенной точностью
Для форматирования дробных чисел используется спецификатор f, число после которого указывает, сколько знаков будет после разделителя.
double a = 12.123;
Console.WriteLine(String.Format("{0:f2}", a));
В результате будет выведено 12,12, но если использовать значение 0.9999, то произойдет неконтролируемое округление и будет выведено  1,00.

Поэтому для отбрасывания знаков, а не округления используется следующий алгоритм:
1) умножаем исходное значение на 10, столько раз сколько знаков после запятой нужно оставить;
2) с помощью метода  Math.Truncate оставляем только целую часть;
3) делим получившиеся значение на 10, столько раз сколько знаков после запятой нужно оставить.

Пример для вывода с точностью два знака: 
double a = 0.9999;
a = a * Math.Pow(10, 2);
a = Math.Truncate(a);
a = a / Math.Pow(10, 2);
 
Тип разделителя при выводе результата (точка или запятая) зависит от региональных настроек компьютера, поэтому чтобы всегда использовать в качестве разделителя точку надо изменить региональные параметры на инвариантные, итоговый пример:
 
CultureInfo ci = new CultureInfo("");
double a = 0.9999;
a = a * Math.Pow(10, 2);
a = Math.Truncate(a);
a = a / Math.Pow(10, 2);
Console.WriteLine(a.ToString(ci));