Программирование / Заочники / Инфорамтика и программирование / Методичка (1 сем) / Урок 1
.5.pdf
name обязательно должна быть написана без кавычек, иначе мы получим на экране вместо фактически введённого имени пользователя просто “ Здравствуйте, name !”.
В некоторых случаях без конкатенации строк не обойтись, но когда нужно вывести только отформатированную строку – большое количество знаков + и “ может сильно запутать, поэтому следует использовать следующую запись:
Console.WriteLine("Здравствуйте, {0} !",name);
В таком виде строка выглядит более наглядно – сначала задаётся её формат, а
затем следуют перечисления переменных, которые будет подставлены в эту строку.
Первая переменная должна быть обозначена как {0}, вторая {1} и.т.д.
Измените приветствие пользователя в соответствии с вышеприведённым форматом.
Шаг 6. Теперь необходимо запросить баллы по трём предметам. Попробуем это сделать следующим образом:
static void Main(string[] args)
{
string name; // Объявляем строковую переменную Console.WriteLine("Как вас зовут ?");
name = Console.ReadLine();// присваиваем значение переменной name Console.WriteLine("Здравствуйте, " + name + " !");
Console.Write("Введите баллы по русскому языку:"); //сохраняем в переменной rus баллы по русскому string rus = Console.ReadLine(); Console.Write("Введите баллы по математике:"); //сохраняем в переменной mat баллы по математике string mat = Console.ReadLine(); Console.Write("Введите баллы по обществознанию:"); //сохраняем в переменной obs баллы по обществознанию string obs = Console.ReadLine();
Console.WriteLine("{0}, cумма баллов равна {1}",name, rus + mat + obs); Console.ReadKey();
}
Листинг 3.
Обратите внимание на строчку
Console.WriteLine("{0}, cумма баллов равна {1}",name, rus + mat + obs);
Здесь, мы выводим сразу несколько переменных для вывода. Мы обращаемся к пользователю по имени (name) и затем выводим сумму баллов (rus+mat+obs).
Запустите программу, нажав F5.
Шаг 7. Программа работает, однако сумму баллов выводит неверно, вместо выполнения арифметической операции сложения, выполняется операция конкатенации, так как именно она определена для переменных строкового типа.
Необходимо использовать числовые типы данных, например int, long, float или
double. Но если мы поменяем тип данных, к примеру, на int у переменной rus, то получим ошибку – « Неявное преобразование типа "string" в "int" невозможно».
string и int разные типы данных, и не всегда возможно приведение одного типа к другому.
Используя класс Convert и его методы (например, Convert.ToInt32), мы можем преобразовать переменную типа string в переменную типа int, но только в том случае если такое преобразование вообще возможно, т.е. преобразовать строку “39”
в число 39 возможно, а строку “a39” или “ -+39” в число – нельзя.
Создадим новую переменную sum, в который будет храниться сумма баллов
(листинг 4).
static void Main(string[] args)
{
string name; // Объявляем строковую переменную Console.WriteLine("Как вас зовут ?");
name = Console.ReadLine();// присваиваем значение переменной name Console.WriteLine("Здравствуйте, " + name + " !"); Console.Write("Введите баллы по русскому языку:");
//сохраняем в переменной rus баллы по русскому string rus = Console.ReadLine(); Console.Write("Введите баллы по математике:"); //сохраняем в переменной mat баллы по математике string mat = Console.ReadLine(); Console.Write("Введите баллы по обществознанию:"); //сохраняем в переменной obs баллы по обществознанию string obs = Console.ReadLine();
int sum =Convert.ToInt32(rus)+Convert.ToInt32(mat)+ Convert.ToInt32(obs); Console.WriteLine("{0}, cумма баллов равна {1}",name, sum);
Console.ReadKey();
}
Листинг 4.
Запустите программу, нажав F5.
Ниже приведён список типов данных и методов класса Covnert для преобразования.
Таблица 2. Методы класса Convert
|
Тип данных на входе |
Метод преобразования |
Тип данных на выходе |
|
|
|
|
|
|
|
|
|
Convert.ToInt32 |
int |
|
|
|
|
|
|
|
|
Convert.ToInt16 |
short |
|
|
|
|
|
|
|
|
Convert.ToInt64 |
long |
|
|
|
|
|
|
Любой |
|
Convert.ToSingle |
float |
|
|
|
|
|
|
|
|
|
|
|
|
|
Convert.ToDouble |
double |
|
|
|
|
|
|
|
|
Convert.ToDecimal |
decimal |
|
|
|
|
|
|
|
|
Convert.ToString |
string |
|
|
|
|
|
|
|
|
Convert.ToDateTime |
DateTime |
|
|
|
|
Convert.ToByte |
byte |
|
|
|
|
Convert.ToSByte |
sbyte |
|
|
|
Контрольные вопросы.
1.Что такое переменная?
2.Что такое операция конкатенации? Для какого типа данных она определена?
3.Могут ли меняться переменные во время выполнения программы?
4.Как можно узнать минимальное и максимальное принимаемое значение для типа данных int?
5.Зачем используется операция %? Возможно ли применение этой операции для строк? Чему равно 13%5?
6.Как обозначается пустая строка?
7.Чему будет равна целочисленная переменная val после выполнения следующего присваивания: val = 7/2;
8.Для чего используется метод Convert.ToInt32 ?
9.Возможно ли преобразовать строку "700-500" к типу int? Почему?
Самостоятельное задание 1.2.
Измените учебную программу так, чтобы она выводила не только сумму баллов,
но и их среднее арифметическое (точность допустима до целых).
Урок 3: Вещественные переменные и константы.
Основная цель урока.
1.Научиться работать с вещественными переменными.
2.Познакомиться с именованными и неименованным константами.
3.Познакомиться с математическими методами класса Math.
Краткая справка.
К вещественным переменным (числа с плавающей точкой) относят переменные типов float, double, decimial. Значения этих типов содержат целую и дробную части.
Ниже приведена таблица сравнения этих типов.
Таблица 3. Сравнение вещественных типов данных
Тип |
Память |
Значения |
Точность (знаки |
|
|
|
|
|
после запятой) |
|
|
|
|
|
float |
4 |
байта |
-3,402823*1038 – 3,402823*1038 |
9 |
|
|
|
|
|
double |
8 |
байт |
-1,79769313486232*10308 |
17 |
|
|
|
1,79769313486232*10308 |
|
|
|
|
|
|
decimal |
16 байт |
-79228162514264337593543950335 |
30 |
|
|
|
|
79228162514264337593543950335 |
|
|
|
|
|
|
Операции над целыми числами всегда дают точный результат, в то время как при обработке вещественных чисел может возникнуть определенная погрешность.
Тип decimal подходит для финансовых вычислений, требующих большой точности.
Для того чтобы уточнить, к какому именно типу данных принадлежит то или иное значение, в C# вы можете использовать суффиксы.
Суффиксы — это символы алфавита, которые следуют сразу за значением и определяют его тип. Например вы хотите чтобы программа вывела на экран результат деления 3 на 5, можно написать
Console.WriteLine("3/5={0}", 3 / 5);
Но в результате выполнения этой программы вы получите 0, т.к. с точки зрения компилятора 3 и 5 это целые числа типа int. Конечно, можно создать 2 переменные типа double, присвоить им значения a=3 и b=5, а затем поделить a / b. Но есть гораздо более простой путь, чтобы указать, что значения являются типом double,
нужно поставить .0 в конце.
Console.WriteLine("3/5={0}", 3.0 / 5.0);
Если вы хотите, чтобы числа 3 и 5 интерпретировались как вещественные числа типа float, нужно добавить суффикс F.
Console.WriteLine("3/5={0}", 3.0F / 5.0F);
Можно провести сравнение точности различных вещественных типов, написав следующую программу:
Console.WriteLine("{0}", 1.0F / 3.0F);//1/3 тип float Console.WriteLine("{0}", 1.0 / 3.0); //1/3 тип double Console.WriteLine("{0}", 1.0M / 3.0M);//1/3 тип decimal
По количеству отображаемых троек после запятой можно судить о точности того или иного типа данных. Ниже приведена таблица суффиксов.
Таблица 3. Суффиксы типов данных
Тип данных |
Суффикс |
Пример |
|
|
|
decimal |
M |
567M |
|
|
|
double |
D (можно без суффикса) |
1235D, 15.37132 |
|
|
|
float |
F |
617.5F |
|
|
|
int |
Без суффикса |
100 |
|
|
|
long |
L |
438473847L |
|
|
|
ulong |
UL |
32938302132UL |
|
|
|
uint |
U |
984843U |
|
|
|
Константы. |
|
|
Константы во многом подобны переменным, лишь с той разницей, что константе присваивается некоторое значение при объявлении, которое затем уже не может быть изменено. Именованные константы объявляются следующим образом:
сonst [Имя_типа] [Имя_переменной];
Пример.
const int Max = 100;
const string password = "45699";
Max = 50;//ошибка: константу нельзя изменять!
Помимо именованных констант существуют так же неименованные – это все числа и строки, записанные в исходном коде. Так число 7 – является неименованной константой типа int, число 12.5 является неименованной константой типа double, “Вася” – неименованная константа типа string и.т.д.
Изменить именованную константу довольно легко, для этого достаточно изменить одну строку исходного кода, в котором определено ее значение. В то же время изменять неименованную константу весьма неудобно: нужно найти и модифицировать каждую строку кода, в которой она используется. Поэтому для облегчения модификации программы рекомендуется использовать именованные константы.
Учебное задание 1.3.
Написать программу, решающую квадратные уравнения вида a*x^2 + b*x + c = 0,
где коэффициенты a, b, c задаются пользователем.
Технология выполнения учебного задания 1.3.
Шаг 1. Создайте проект нового консольного приложения, назовите его Lab13.
Шаг 2. Откройте файл Program.cs, дважды кликнув по нему в окне « Обозреватель решений».
Шаг 3. Для начала реализуем пользовательский ввод коэффициентов a,b,c.
Будем использовать вещественный тип данных double, это позволит вводить не только целые числа. При вводе дробных чисел в консоли (т.е. в уже работающем приложении) следует использовать запятую, а не точку при вводе дробных чисел
(т.е. вводить 1,5, а не 1.5). Но при написании кода вещественные числа пишутся с точкой (например, double a = 1.5;).
static void Main(string[] args)
{
double a, b, c;
Console.WriteLine("a*x^2 + b*x + c = 0"); Console.WriteLine("Введите a:");
a = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Введите b:");
b = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Введите c:");
c = Convert.ToSingle(Console.ReadLine());
Console.ReadKey();
}
Листинг 5.
Шаг 4. Следующий шаг – нахождение дискриминанта. Для нахождения квадратного корня воспользуемся методом Sqrt, класса Math.
Класс Math содержит методы, необходимые для выполнения математических вычислений, ниже приведены некоторые из них.
|
|
|
|
Таблица 4. Методы класса Math |
Метод |
|
Описание |
Пример |
|
|
|
|
|
|
Math.Pow(x,y) |
|
Возводит число x в степень y |
|
Math.Pow(3, 2); //=9 |
|
Math.Pow(2,3); //=8 |
|||
|
|
|
|
|
|
|
|
|
Math.Pow(25, 0.5); //=5 |
Math.Sqrt(x) |
|
Извлекает квадратный корень из x |
Math.Sqrt(49); //=7 |
|
|
|
|
|
|
Math.Round(x,y) |
|
Округляет число x до указанного |
|
Math.Round(2.0 / 3.0, 3); //=0.667 |
|
|
числа дробных разрядов y |
|
Math.Round(0.3298437,2); //=0.33 |
|
|
|
|
|
|
|
|
|
|
Math.Ceiling(x)
Math.Floor(x)
Math.PI
Возвращает наименьшее целое число, которое больше или равно числу x (округление « вверх»).
Возвращает наибольшее целое число, которое меньше или равно числу x (округление « вниз»).
Возвращает значение константы
« пи».
Math.Ceiling(0.38); // =1 Math.Ceiling(0.78); // =1 Math.Ceiling(-0.38); // =0 Math.Ceiling(-0.78); // =0
Math.Floor(0.78); // =0 Math.Floor(0.38); // =0 Math.Floor(-0.38); // =-1 Math.Floor(-0.78); // =-1
Math.PI;//=3.14159265358979323846
Вычислив дискриминант, вычисляем значения корней уравнения (листинг 6).
static void Main(string[] args)
{
double a, b, c;
Console.WriteLine("a*x^2 + b*x + c = 0"); Console.WriteLine("Введите a:");
a = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Введите b:");
b = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Введите c:");
c = Convert.ToSingle(Console.ReadLine());
double D = Math.Sqrt(b * b - 4 * a * c); double x1 = (-b+D)/2*a;
double x2 = (-b-D)/2*a; Console.WriteLine("x1 = {0}", x1); Console.WriteLine("x2 = {0}", x2);
Console.ReadKey();
}
Листинг 6.
Шаг 5. Запустите программу, нажав F5. В случае если вы введёте коэффициенты, при которых дискриминант будет < 0, результатом вычислений будет NaN (Not-a-Number). Это одно из особых состояний чисел с плавающей точкой, которое обычно говорит о том, что предыдущая математическая операция завершилась с неопределённым результатом. NaN – это константа (double.NaN).
Кроме того у чисел с плавающей точкой (кроме decimal) есть константы определяющие плюс-бесконечность (double.PositiveInfinity) и минус-бесконечность
(double.NegativeInfinity). Пример.
double t = 0.0;
t = 1.0 / t; //t = double.PositiveInfinity
В результате выполнения этого кода (1/0), переменная t будет равна плюс-
бесконечности.
Корни уравнения выводятся с максимальной точностью, которую может позволить себе тип данных double. Для получения более красивого результата, округлим корни уравнения до сотых. Для этого можно воспользоваться методом Math.Round.
static void Main(string[] args)
{
double a, b, c;
Console.WriteLine("a*x^2 + b*x + c = 0"); Console.WriteLine("Введите a:");
a = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Введите b:");
b = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Введите c:");
c = Convert.ToSingle(Console.ReadLine());
double D = Math.Sqrt(b * b - 4 * a * c); double x1 = (-b+D)/2*a;
double x2 = (-b-D)/2*a;
Console.WriteLine("x1 = {0}", Math.Round(x1,2)); Console.WriteLine("x2 = {0}", Math.Round(x2,2));
Console.ReadKey();
}
Листинг 7.
Контрольные вопросы.
1.Чем отличается тип данных float от double?
2.Какие значения могут принимать вещественные переменные?
3.Для чего используются суффиксы?
4.Приведите пример именованной и неименованной константы.
5.Какое ключевое слово добавляется перед типом данных при объявлении константы?
6.Какой метод класса Math следует использовать для возведения переменной a
в третью степень?
7. Чему будет равно n в результате выполнения следующей программы?
double n = 0.0; n = n / n;
Почему?
Самостоятельное задание 1.3.
Напишите программу, которая находит диаметр круга, по его окружности (длину окружности вводит пользователь). Диаметр круга должен быть округлён до 3-его знака после запятой.
Урок 4: Работа с датами.
Основная цель урока.
1.Научиться работать с переменными типа DateTime.
2.Научиться находить разницу между датами, представлять дату в различных форматах
3.Продолжить изучение методов классов Convert и Math.
4.Познакомиться с методом ToString
Краткая справка.
Тип значения DateTime представляет дату и время в диапазоне от 00:00:00 1
января 0001 года (н. э.) до 23:59:59 31 декабря 9999 года (н. э.). Значения времени измеряются в 100-наносекундных единицах, называемых тактами, и точная дата представляется числом тактов с 00:00 1 января 0001 года н. э. Например, значение тактов, равное 31241376000000000L, представляет пятницу 1 января 0100 года
00:00:00.
Задать значение переменной типа DateTime можно следующими способами:
1.Создав новый экземпляр DateTime с помощью оператора new.
Таким образом создаётся переменная dat, которая представляет дату
01.09.2011.
DateTime dat = new DateTime(2011,09,1);
2.Выполнив преобразование из строки в дату (с помощью класса Convert).
DateTime dat = Convert.ToDateTime("01.09.2011");
Так же всегда можно получить текущую дату\время.
DateTime dat = DateTime.Now;//dat = текущей дате\времени
Из переменной типа DateTime всегда можно извлечь текущий год, день, месяц, час,
минуту, секунду…
DateTime dat = DateTime.Now;//dat = текущей дате\времени Console.WriteLine("Сейчас {0} год и {1} месяц ", dat.Year, dat.Month);
Можно добавить к переменной типа DateTime некоторое количество дней, часов,
минут и.т.д.
DateTime datNow = DateTime.Now; DateTime datNext = datNow.AddDays(27);
Console.WriteLine("Сейчас {0}, а через 27 дней будет {1}", datNow, datNext);
Методы AddDays (AddHours, AddMinutes, и.т.п) не изменяют текущую
переменную, добавляя заданное количество дней(часов, минут), они лишь
возвращают новое, изменённое значение. Т.е. datNow.AddDays(27) – не изменит значение переменной datNow, но вернёт новое значение типа DateTime, котрое может быть присвоено некоторой переменной, либо использовано как аргумент метода WriteLine.
Для типа DateTime определены операции сложения и вычитания. В результате выполнения операции вычитания получается значение нового типа –TimeSpan
(временной промежуток). Операция сложения может использоваться только с значениями типа TimeSpan, т.е. нельзя найти сумму двух дат, но можно добавить к дате некоторый временной промежуток.
Учебное задание 1.4.
Создать консольное приложение вычисляющее возраст пользователя по его дате рождения. Так же программа должна вычислять количество дней до следующего дня рождения.
Технология выполнения учебного задания 1.4.
Шаг 1. Создайте проект нового консольного приложения, назовите его Lab14.
Шаг 2. Откройте файл Program.cs, дважды кликнув по нему в окне
« Обозреватель решений».
Шаг 3. Для хранения даты используется тип DateTime, он сохраняет не только дату, но и время. Если время не указывается явно, по умолчанию оно считается
00:00:00. Т.к. метод ReadLine считывает пользовательский ввод в строковом формате, так же как и для других типов необходимо преобразование. Это можно сделать методом ToDateTime из класса Convert.
Для начала попробуем получить дату рождения пользователя и вывести её на экран (см. листинг 8).
static void Main(string[] args)
{
Console.WriteLine("Укажите дату вашего рождения..."); //дата в формате DD.MM.YYYY
string line = Console.ReadLine();
DateTime dtmBirthday = Convert.ToDateTime(line); Console.WriteLine("Дата вашего рождения {0}", dtmBirthday);
Console.ReadKey();
}
Листинг 8.
