Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Laboratornyy_praktikum_Programmirovanie_na_C

.pdf
Скачиваний:
42
Добавлен:
02.02.2015
Размер:
1.93 Mб
Скачать

или постфиксной форме. Запись перед переменной называется префиксной (++i), увеличивает значение переменной на единицу, а затем результат используется в выражении. Запись после переменной называется постфиксной (i++), в выражении использует исходное значение переменной, а затем увеличивает значение переменной на единицу.

Ниже приведѐн пример из справочной системы для оператора «++».

class MainClass

{

static void Main()

{

double x; //Определение переменной x x = 1.5; //Присваивание значения

Console.WriteLine(++x); //Увеличение и вывод x = 1.5;

Console.WriteLine(x++); //Вывод и увеличение Console.WriteLine(x); //Вывод увеличенного

}

}

/* Output 2.5 1.5 2.5 */

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

Кроме обычного оператора присвоения «=» есть группа операторов присвоения, совмещенных с арифметическими действиями, рассмотрите еѐ на примере оператора назначения сложения «+=». Запись «x += y» эквивалентна записи «x = x + y». Подобная запись удобна для изменения значения на шаг, отличный от единицы. Например, «x += 2» увеличивает значение переменной x на два.

2.4. ОПЕРАТОРЫ ВВОДА/ВЫВОДА

2.4.1. Операторы ввода

Для ввода данных в консольных приложениях используются метод Console.ReadLine(). ReadLine читает строку из стандартного устройства ввода (по умолчанию – клавиатуры). Так как метод воспринимает строку как набор символов, текст, то при использовании этого метода для ввода чисел необходимо конвертировать строку в целевой тип. В выражении:

double x = Convert.ToDouble(Console.ReadLine());

Объявляется переменная двойной точности x, вводится в консоли строка, которая конвертируется в числовой тип двойной точности, результат присваивается

31

переменной x. Аналогичное действие выполняет метод преобразования Parse, присутствующий у числовых типов:

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

При вводе в строке нескольких значений, строку можно разделить на массив составляющих строк методом Split(), задав его параметром символ-разделитель.

Класс Console принадлежит пространству имѐн System. Без указания использования пространства имѐн впервой строке using System, было бы необходимо указывать имя пространства имѐн перед именем классов, например:

System.Console.ReadLine().

Метод Console.Read() читает из стандартного устройства ввода по одному символу и возвращает код символа целого (int) типа.

Метод Console.ReadKey() ожидает нажатия и считывает код нажатой клавиши. Метод возвращает данные типа ConsoleKeyInfo, который является структурой и описывает нажатую клавишу консоли, включая символ, представленный этой клавишей, и состояние управляющих клавиш CTRL, SHIFT и ALT. Если список аргументов метода пуст или равен false, то в консоли отображается символ введѐнной клавиши. Значение аргумента true отключает вывод нажатых клавиш на консоль. Метод ReadKey часто используется для организации ожидания нажатия после завершения консольной программы (при отладке, чтобы окно результатов не закрывалось сразу после завершения программы), а также в программах, организующих интерактивное управление событиями, например, в играх.

2.4.2. Операторы вывода

Для вывода результатов используются методы Console.Write() и Console.WriteLine(). Оба метода выводят строку текста, но Write оставляет курсор в позиции окончания строки вывода, а WriteLine кроме этого добавляет операции перевода строки и возврата каретки, т.е. перемещает курсор в начало следующей строки. Пустой список метода Write недопустим, так как не имеет смысла, а WriteLine с пустым списком параметров добавляет новую строку (описывается символами перевода строки и возврата каретки), что аналогично управляющей последовательности "\n". Так, вызов метода Console.WriteLine("\n") переведѐт строку дважды – сам метод и управляющая последовательность.

Метод Write довольно часто используется для вывода подсказки перед оператором ввода ReadLine. Также метод Write можно вызывать в цикле для вывода строки массива. Для перехода к выводу новой строки массива используется метод WriteLine во внешнем цикле, что будет рассмотрено позже.

Если после строки необходимо вывести несколько других значений, эти значения объединяются знаками «+». Если необходимо выполнить операцию сложения между численными значениями, то эти операции необходимо взять в скобки.

Console.WriteLine("Вывод значений: "+2+3);

выведет: Вывод значений: 23, А выражение

Console.WriteLine("Вывод значений: "+(2+3));

выведет: Вывод значений: 5

32

2.4.3. Форматированный вывод

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

{argum, width: fmt}

где argum – номер аргумента, начиная с нуля; width – минимальная ширина поля; fmt – формат. Параметры width и fmt могут отсутствовать, что даѐт варианты спецификатора: {argum}, {argum, width}, {argum: fmt}. Если указанное целое знаковое значение минимальной ширины меньше длины форматируемой строки, то оно игнорируется, и в качетсве ширины поля используется длина форматируемой строки. Если width имеет положительное значение, то данные в поле выравниваются по правому краю (пробелы добавляются слева), если width имеет отрицательное значение, то выравнивание производится по левому краю.

Ниже в таблице приведены значения форматов.

 

Оп с т ль

 

 

Имя

 

 

Оп с н

 

 

Пр м ры

 

 

 

 

 

 

 

 

 

 

форм т

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"C" или "c"

 

Валюта

Результат: значение валюты.

123.456 ("C",

 

 

 

 

 

 

Поддерживается: всеми числовыми

en-US) →

 

 

 

 

 

 

типами данных.

$123.46

 

 

 

 

 

 

 

Описатель точности: количество цифр

 

 

 

 

 

 

 

 

 

дробной части.

 

 

 

 

 

 

 

 

"D" или "d"

 

Десятичное

Результат: целочисленные цифры с

1234 ("D") →

 

 

 

число

необязательным отрицательным

1234

 

 

 

 

 

 

 

знаком.

–1234 ("D6") →

 

 

 

 

 

 

Поддерживается: только цело-

–001234

 

 

 

 

 

 

численными типами данных.

 

 

 

 

 

 

 

 

 

Описатель точности: минимальное

 

 

 

 

 

 

 

 

 

число цифр, по умолчанию:

 

 

 

 

 

 

 

 

 

минимальное необходимое число

 

 

 

 

 

 

 

 

 

цифр.

 

 

 

 

 

 

 

 

"E" или "e"

 

Экспоненци

Результат: экспоненциальная нотация.

1052.032911275

 

 

 

альный

Поддерживается: всеми числовыми

6 ("E", en-US)

 

 

 

(научный)

типами данных.

 

 

 

 

 

 

Описатель точности: количество цифр

1.052033E+003

 

 

 

 

 

 

дробной части, по умолчанию: 6.

1052.032911275

 

 

 

 

 

 

 

 

 

6 ("E2", fr_FR)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

–1,05E+003

 

 

 

 

 

"F" или "f"

 

Фиксирован

Результат: цифры целой и дробной

1234.567 ("F",

 

 

 

ная запятая

частей с необязательным

de-DE) →

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

33

 

 

 

 

 

 

отрицательным знаком.

1234,57

 

 

Поддерживается: всеми числовыми

1234 ("F1", en-

 

 

типами данных.

US) → 1234.0

 

 

Описатель точности: количество цифр

–1234.56 ("F4",

 

 

дробной части.

de-DE) →

 

 

 

–1234,5000

 

 

 

 

"G" или "g"

Общие

Результат: наиболее компактная

–123.456 ("G",

 

 

запись из двух вариантов:

en-US) → –

 

 

экспоненциального и с фиксиро-

123.456

 

 

ванной запятой. Поддерживается:

 

 

 

всеми числовыми типами данных.

 

 

 

Описатель точности: количество

 

 

 

значащих цифр, по умолчанию:

 

 

 

определяется численным типом.

 

 

 

 

 

"N" или "n"

Число

Результат: цифры целой и дробной

1234.567 ("N",

 

 

частей, разделители групп и

en-US) →

 

 

разделитель целой и дробной частей с

1,234.57

 

 

необязательным отрицательным

1234 ("N", ru-

 

 

знаком.

RU) → 1 234,0

 

 

Поддерживается: всеми числовыми

–1234.56 ("N",

 

 

типами данных.

ru-RU) → –1

 

 

Описатель точности: желаемое число

234,560

 

 

знаков дробной части.

 

 

 

 

 

"P" или "p"

Процент

Результат: число, умноженное на 100

1 ("P", en-US)

 

 

и отображаемое с символом процента.

→ 100.00 %

 

 

Поддерживается: всеми числовыми

1 ("P", fr-FR) →

 

 

типами данных.

100,00 %

 

 

Описатель точности: желаемое число

–0.39678 ("P1",

 

 

знаков дробной части.

fr-FR) → –39,7

 

 

 

%

 

 

 

 

"R" или "r"

Приѐмо-

Результат: строка, дающая при

123456789.1234

 

передача

обратном преобразовании идентичное

5678 ("R") →

 

 

число.

123456789.1234

 

 

Описатель точности: игнорируется.

5678

 

 

 

 

"X" или "x"

Шестнад-

Результат: шестнадцатеричная строка.

255 ("X") → FF

 

цатеричный

Поддерживается: только

–1 ("x") → ff

 

 

целочисленными типами данных.

255 ("x4") →

 

 

Описатель точности: число цифр в

00ff

 

 

результирующей строке.

–1 ("X4") →

 

 

 

00FF

 

 

 

 

Любой

Неизвест-

Результат: порождение

 

другой

ный

исключения FormatException во время

 

 

 

 

 

 

 

34

 

символ

описатель

выполнения.

 

 

 

 

 

Следующий фрагмент кода описывает форматированный вывод данных в формате по умолчанию.

int X = 2, Y = 5, Z = 9; Console.WriteLine("{0} {1} {2}", X, Y, Z);

Фигурные скобки с номером в шаблоне определяют позицию, в которую выводятся перечисленные далее через запятую операторы, нумерующиеся с нуля (0:X, 1:Y, 2:Z), поэтому при выводе вместо {0} выведется значение X, т.е. 2, вместо {1} – 5 и вместо {2} – 9. На консоль выведется строка «2 5 9». В последующем примере форматированного вывода, хоть и присутствуют несколько параметров, но выводится только строка «2 2 2», т.к. в шаблоне указан вывод только нулевого параметра.

Console.WriteLine("{0} {0} {0}", X, Y, Z);

Например, необходимо вывести значения переменных a и f двойной точности. Переменную a в фиксированном формате шириной 8 знаков с точностью после запятой два знака, а f – в научном (экспоненциальном) виде с точностью до пяти знаков. Строку вывода можно записать следующим образом:

Console.WriteLine("a={0,8:F2}, f={1:E5}", a, f);

В параметрах метода WriteLine присутствует строка форматирования и два параметра со значениями, которые необходимо вывести. Так как нумерация начинается с нуля, то номера этих параметров 0 и 1. Текст, не включенный в фигурные скобки, выводится как есть, вместо фигурных скобок подставляются значения в указанном формате. Формат {0,8:F2} обозначает следующее: в данном положении вывести значение параметра 0 (переменной a), общая длина поля – восемь знаков, использовать формат с фиксированной запятой, с точностью после запятой два знака. Вывода следующего параметра производится в научном формате (E), с точностью пять знаков после запятой.

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

Console.WriteLine("a={0,8:F2}, \tf={1:E5}", a, f);

Управляющая последовательность «\t» вводит код горизонтальной табуляции, т.е. позиция последующего вывода смещается к кратной восьми позиции в строке.

Console.WriteLine("a={0,8:F2}, \nf={1:E5}", a, f);

Выводит каждое значение в новой строке, т.к. последовательность «\n» добавляет код перевода строки (перевод каретки + в начало строки).

Кроме форматированного вывода, форматировать вид отдельных значений в строку можно с помощью метода ToString (см. справку).

35

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

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

Описатель "0" является нулевым символом-заполнителем, заменяемым числом выводимого значения или нулѐм, если значение в данном порядке исчерпано. При указании в дробной части описателей меньше количества значимых чисел, выводимое число округляется до указанного в шаблоне уровня точности.

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

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

Символ ",", расположенный между описателями позиций цифр, служит в качестве описателя разделителя групп, расположенный слева от разделителя дробной части – описателя масштабирования чисел, где каждая запятая обозначает деление результата на 1 000 (с округлением результата).

Описатель "%" выводит знак процента и умножает выводимое число на 100. Символ промилле ("‰" или "\u2030") выводитсяв позицию, указанную в

формате и умножает выводимое число на 1 000.

Если в строке формата присутствует подстрока "E", "E+", "E-", "e", "e+" или "e-", за которой сразу следует по меньшей мере один ноль, то число форматируется с использованием экспоненциальной нотации. Между числом и экспонентой при этом вставляется символ "E" или "e". Минимальное число цифр экспоненты в результирующей строке определяется количеством нулей, стоящих после индикатора экспоненциальной нотации. Форматы "E+" и "e+" указывают на то, что перед экспонентой всегда должен стоять положительный или отрицательный знак. Форматы "E", "e", "E-" и "e-" указывают на то, что символ знака должен ставиться только перед экспонентой с отрицательным значением.

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

Разделитель секций ";" позволяет задать форматы для вывода в разной форме положительных, отрицательных и нулевых значений.

Далее перечисляются описатели формата, используемые для вывода даты и времени.

"d" – число, день месяца без лидирующих нулей.

"dd" – день месяца с добавлением лидирующих нулей до двух знаков (например,

01).

"ddd" – сокращѐнное название дня недели. "dddd" – полное название дня недели.

36

"f" – десятые доли секунды в значении даты и времени, "ff" – сотые доли и т.д. с добавлением количества символа f. Символ F в верхнем регистре определяет вывод только ненулевых значений.

"g", "gg" – период или эра.

"h", "hh" – вывод времени без и с лидирующим нулѐм в 12-часовом формате. "H", "HH" – в 24-часовом формате.

"K" – данные о часовом поясе.

"m", "mm" – минуты, без и с указанием лидирующего нуля.

"M", "MM" – номер месяца, без и с указанием лидирующего нуля. "MMM" – сокращѐнное название месяца.

"MMMM" – полное название месяца.

"t", "tt" – первый символ или весь указатель AM/PM (до полудня/ после полудня).

"y", "yy" – год без и с лидирующим нулѐм. "yyy" – год в формате как минимум трѐх цифр. "yyyy" – год в формате четырѐх цифр.

"z", "zz" – часовой сдвиг от времени в формате UTC (универсального времени), без нулей и с нулями в начале.

"zzz" – сдвиг в часах и минутах от времени в формате UTC (универсального времени).

":" – разделитель компонентов времени. ":" – разделитель компонентов даты.

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

"d" – короткий шаблон даты. "D" – полный шаблон даты.

"f" – полный шаблон даты и времени (короткий шаблон времени). "F" – полный шаблон даты и времени (полный шаблон времени). "g" – общий шаблон даты и времени (короткий шаблон времени). "G" – Общий шаблон даты и времени (полный шаблон времени). "M", "m" – шаблон дней месяца.

"O", "o" – шаблон обратного преобразования даты и времени.

"R", "r" – шаблон RFC1123.

"s" – сортируемый шаблон времени и даты. "t" – короткий шаблон времени.

"T" – полный шаблон времени.

"u" – универсальный сортируемый шаблон времени и даты. "U" – универсальный полный шаблон даты и времени.

"Y", "y" – шаблон месяца года.

Пример использования описателей формата в операторах вывода:

37

double x = 1234567890.456; DateTime d1 = DateTime.Now; Console.WriteLine("{0:#,0.00}\n{0:#.#####}", x); Console.WriteLine("{0:#.0###e+0}", x); Console.WriteLine("{0:d MMMM yyyy г., HH:mm, dddd}", d1);

выводит на экран строки (текущие дата и время):

1 234 567 890,46

1234567890,456

1,2346e+9

4 апреля 2011 года, 10:55, понедельник

Заметьте, что в числовом формате присутствуют разделители разрядов, число значимых знаков после запятой – два (с округлением). Во второй строке указание точности символом "#" проигнорировано, т.к. нет соответствующих значащих цифр в

числе. Третье число представлено в научном формате с указанием порядка числа x·10nn.

2.4.4. Перенаправление ввода/вывода

Модифицируйте шаблон проекта P02_1 как указано ниже.

using System; class P02_1

{

static void Main()

{

double x = double.Parse(Console.ReadLine()); Console.WriteLine(Math.Pow(x, 2.0));

}

}

Эта простая программа содержит единственный метод Main(), выполняемый при старте программы. В первой строке метода с консоли вводится число в переменную x. Во второй строке на консоль выводится квадрат введенного числа. Программа не содержит вывода пояснений, при запуске ждѐт ввода, затем выводит число – результат. Запустите программу (Ctrl+F5), введите любое число в диапазоне – 100..100, на экран будет выведен результат. Сверните Visual Studio.

Запустите файловый менеджер FAR, перейдите в папку

D:\Program\VS\P02_1\P02_1\bin\Debug, запустите на выполнение программу

P02_1.exe. Введите с клавиатуры число и нажмите Enter (для скрытия/ отображения окон в FAR используйте Ctrl+O). Следующим действием выведите результат в файл перенаправлением потока. Выполните команду «P02_1 > out.txt». Введите с клавиатуры число. Результат вместо экрана будет записан в текстовый файл out.txt. Создайте (Shift+F4) текстовый файл in.txt, запишите в него число, например 3,45. Выполните команду «P02_1 < in.txt». На экран, без ожидания ввода будет выведен результат возведения в квадрат числа, хранящегося в файле in.txt. Измените число в файле in.txt (F4) на –3,45e–2 (научное представление с указанием порядка числа, где «e–2» обозначает «·10–2». Повторите последнюю команду (Ctrl+E), на экран будет выведен новый результат. Выполните команду, сочетающую как перенаправление

38

ввода, так и перенаправление вывода: «P02_1 < in.txt > out.txt». Команда должна выполниться без ожидания ввода и без вывода на экран. Число загружается из файла in.txt и результат выводится в файл out.txt. Таким образом, программы консоли можно использовать совместно и в качестве конвейеров, объединяемых символом «|». Обычно перенаправление ввода/вывода и конвейерное выполнение используют в сценариях (CMD).

2.5. ПРОГРАММИРОВАНИЕ

Программы и проекты создавайте в папке D:\Program\VS, содержимое которой в конце работы необходимо удалить. Тексты программ перепишите в лабораторный журнал (можно вклеить распечатку).

Разверните Visual Studio.

Самостоятельно решите следующие линейные задачи. Каждую задачу оформите в виде отдельного проекта (P02_2, P02_3…). Значение π использовать из класса Math (справка по классу рассматривалась в прошлой работе).

2.5.1. Задача 1. Вычисление объёма цилиндра

Вычислить и вывести на экран с помощью строки форматирования с точностью для четырѐх знаков объѐм цилиндра. Значения радиуса и высоты вводить с клавиатуры.

2.5.2. Задача 2. Вычисление радиуса основания и высоты конуса

При сворачивании листа жести образуется пожарное ведро в виде конуса, у которого высота равна трѐм радиусам основания (представить высоту через радиус). Составить программу, выводящую с точностью до пятого знака значения радиуса и высоты. Значение объѐма вводить с клавиатуры. Переменные и литералы использовать одного типа.

2.5.3. Задача 3. Вычисление высоты

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

2.5.4. Задача 4. Найти массу шайбы

Найти массу шайбы (круглая стальная пластинка с отверстием внутри) и вывести с точностью до трѐх знаков, если внутренний диаметр в два раза меньше внешнего, значение внешнего лежит в диапазоне от 6 до 50 мм, толщина стальной пластины, из которой изготавливается шайба 1 мм, плотность стали 7,8 г/см3. Значение внешнего диаметра вводить с клавиатуры. Перед вычислениями все значения перевести в единую систему измерений.

2.5.5. Задача 5. Кинематика

Написать программу P02_6, вычисляющую значения высоты подъема h, расстояния падения l и времени в полѐте t мяча, брошенного под углом α к горизонту с начальной скоростью v0. Значения α (в градусах) и v0 (м/с) ввести с клавиатуры. В

39

программе градусы преобразовать в радианы (умножить на π/180). Все значения привести в единую систему измерений. Для вычислений использовать формулы:

h

v2

sin2

; t

2v sin

; l

v2 sin 2

0

 

0

0

 

2g

g

g

 

 

 

 

Покажите результаты работы преподавателю, закройте Visual Studio, а затем

уд л т с со д нны м о р мя р боты ф йлы п пк в папке

D:\Program\VS.

Вопросы к под ото к :

1.Какова структура программы в C#?

2.Правила записи идентификаторов в C#?

3.Какие типы данных вы знаете?

4.Что такое константы и для чего они нужны?

5.Что такое переменные и для чего они нужны?

6.Что такое литералы? Какие литералы вы знаете?

7.Для чего нужно приведение типов?

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]