Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке C# Консольные и оконные приложения. Лабораторный практикум. Учебное пособие
.pdf
Рис. 3. Вид окна среды Microsoft Visual Studio с открытым меню создания проекта
Рис. 4. Сообщение об ошибке компиляции. В нижней строке суммарное количество ошибок
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab1
{
class Program
{
static void Main(string[] args)
{
}
}
}
директивы препроцессору
текст заготовки головной
программы приложения
Рис. 5. Текстовая заготовка для написания кода программы
5
Препроцессор – часть компилятора, которая производит предварительную обработку текста программ. Пре-
процессор узнает свои операторы по ключевым словам. Здесь слово using.
11
5

В эту заготовку пользователь вписывает код головной программы, добавляет собственные процедуры и собственные структуры данных (а в дальнейшем – процедуры обработки
событий) с использованием средств текстового редактора (рис. 6).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab1
{
class Program
{
static void Main(string[] args)
{
int a = 5, b = 6;
int c = a + b;
Console.Write("Ответ: "); Console.WriteLine (c);
}
}
}
директивы препроцессору
текст программы приложения
Рис. 6. Фрагмент с кодом программы, предназначенной для вычисления суммы двух чисел
При создании проекта среда Visual Studio создаёт несколько вложенных папок, в которых
размещает несколько файлов. Другими словами, даже для простого консольного приложения
создаётся группа взаимосвязанных файлов. Пример состава папок и файлов приведён на рис. 7.
Содержимое папки для
проекта – исходные
коды и ресурсы
Содержимое папки
obj|Debug
Содержимое папки
bin|Debug
Рис. 7. Содержимое папок проекта
Следует отметить, что современные системы программирования все чаще являются
кроссплатформенными, т. е. позволяют из единого исходного кода создавать исполняемые
модули для различных систем, для 32-разрядного компьютера с установленной такой же
Windows, или для 64-разрядной, или для UNIX, или для MAC Apple. Берется один и тот же
исходный код или вписываются команды условной
компиляции, где указываются небольшие
12

необходимые изменения для различных исполняющих систем. А на стадии компиляции в
среде программирования указывается, какое именно исполняемое приложение необходимо
построить.
Содержимое этих папок синтезируется средой автоматически и не требует вмешательства разработчика проекта. Но иметь представление об их содержимом необходимо.
Об ошибках
Разработка алгоритма решения задачи и запись текста программы в редакторе почти
всегда сопровождается ошибками.
Основные виды ошибок:
Ошибки компиляции – ошибки в синтаксисе написания языковых конструкций.
Ошибки выполнения – это такие ошибки, которые не нарушают синтаксис языка,
но приводят к ошибочным операциям в процессе выполнения программы (например, деление на ноль, зацикливание, выход за границу индексов и т. д.). В этом случае система выдаст
сообщение об ошибке, но уже на этапе выполнения программы, или произойдет «зависание»
программы, т. е. она не будет завершена или не будет реагировать на управляющие клавиши.
Ошибки алгоритма – те, которые при верных исходных данных и безошибочной
работе программы приводят к неверным результатам. Эти ошибки должен обнаруживать сам
программист или специалисты по тестированию при тестировании программы на корректность результатов на контрольных данных.
Об инструкциях ввода-вывода
Правильно спроектированная программа консольного типа ввод данных сопровождает
осмысленными сообщениями, чтобы пользователь знал, каких данных ждет от него
программа. Для вывода сообщений и результатов достаточно использовать оператор
Console.Write() или оператор Console.WriteLine(). В скобках указывается, что
необходимо вывести на экран. Второй оператор выполняет вывод аналогично первому, но
после вывода переходит на новую строку. Другими словами, следующий вывод будет
происходить уже в новой строке. Примеры использования оператора вывода Write():
Console.Write("Стартуем:");
Console.Write(d);
Console.Write("Значение d: " + d);
Console.Write("Получили a = {0} b = {1} c = {2}", a, b, c);
Оператор Write() имеет несколько форматов. Часто это текст или одна переменная.
Но текст может быть «склеен» из нескольких кусков и переменных, как показано в третьей
строке, если, конечно, компилятор сможет автоматически перевести значение в текст,
например, для целого типа. Более общий вид оператора содержит текстовую строку и список
переменных. Строка может
содержать текст и управляющие символы для вывода переменных. Так в четвёртой строке показан необходимый текст, а конструкции {0}, {1}, {2} указывают, значение какой переменной здесь необходимо вывести6.
Операторы ввода будут описаны в последующих лабораторных.
Варианты заданий
Разработать программу консольного типа на языке C# для вычисления по формуле,
приведенной в соответствующем варианте. Вычисления проводить непосредственно по
указанной формуле. Не упрощать выражение. В программе описать необходимые переменные вещественного и целого типа.
В коде программы:
выполнить ввод и инициализацию исходных переменных;
осуществить вычисление по формуле;
6
Текст ‘a =’ и т. п. никакого отношения к имени переменной a не имеет. Просто необходимо вывести такой
текст, а затем значение переменной a, которая в списке переменных на вывод и имеет индекс 0.
13

выполнить вывод результата.
Откомпилировать программу и исправить, если необходимо, синтаксические ошибки.
Запустить программу несколько раз и выполнить вычисления для различных исходных
данных.
Вариант 1
i
yxtek
sin tg .
k
3
7
q
Вариант 2
1
7tg2 .
yi n a
3||
u
te
w
Вариант 3
q
i
yxwh
sin tg .
3,7
k
3
e
h
14

Лабораторная работа № 2
Использование условных операторов при реализации ветвящихся процессов
Цель работы: получить практические навыки в разработке программ, использующих
условные операторы.
Методические указания
Даже в ходе простых вычислений приходится анализировать полученные результаты и
выбирать путь дальнейших вычислений. Для этого в программах используются условные
операторы. В языке C# таких два оператора.
Условный оператор if
Условный оператор if предназначен для выполнения одной из двух последовательности действий в зависимости от истинности или ложности некоторого условия. Условный
оператор имеет две формы – сокращённую и полную: if и if…else…. Оператор if в сокращённой форме имеет вид
if (условие) оператор;
Заметим, что круглые скобки обязательны. В них и размещается условие, истинность
которого проверяется. Если условие истинно, то выполняется оператор справа от скобки.
Условием может быть любое выражение, преобразуемое в булевый тип. Если условие выполняется, то результатом условного выражения является значение – истина (true), тогда
указанный оператор в конструкции if выполняется. В противном случае результатом условного выражения является значение – ложь (false) и управление сразу передается следую-
щему за конструкцией if оператору. Например, в результате выполнения операторов
С = А;
if (В > А) С = В;
переменная С станет равна максимальному из чисел А и В. Первый из операторов, оператор
присваивания, в качестве предполагаемого максимального значения присваивает значение из
переменной A. И только при В > А оператор С = В будет выполнен, т. е. только если В превышает предполагаемый максимум, то C станет равным B.
Полная форма
if (условие) оператор1; else оператор2;
условного оператора if…else… имеет вид
Здесь если условие истинно (возвращает true), то выполняется оператор1, если
ложно – оператор2 (после else).
Обратите внимание, что после первого оператора, перед ключевым словом else, ста-
вится знак «
if (g == 0)
Console.WriteLine ("Деление на нуль");
else
p = i/g;
;» – точка с запятой. Приведем примеры использования этой формы оператора:
В конструкции if в качестве и первого, и второго оператора могут использоваться и
составные операторы. Составной оператор – это группа операторов, заключённая в фигурные скобки. Составной оператор интерпретируется как единый оператор и может использоваться везде, где допускается применение одного оператора:
if (g == 0)
{
Console.WriteLine ("Деление на нуль");
p = 0;
}
else
p = i/g;
15

Следует обратить внимание, что после фигурной скобки, перед else, знак точка с запя-
той не ставится.
В качестве оператора в конструкции if может быть тоже if. В таких вложенных конструкциях if могут возникнуть неоднозначности в понимании7 того, к какой из вложенных
конструкций if относится элемент else. Компилятор всегда считает, что else относится к
последней из конструкций if, в которой не было раздела else. Например, в конструкции
if (условие1)
if (условие2)
оператор1;
else оператор2;
ключевое слово else будет отнесено компилятором ко второй конструкции if, т. е. оператор2 будет выполняться в случае, если первое условие истинно, а второе – ложно. Иначе
говоря, такая конструкция будет прочитана компилятором как
if (условие1)
{
if (условие2) оператор1;
else оператор2;
}
Если нет уверенности в правильности понимания соответствия else и if, то операторные скобки и дают однозначность в понимании. Если же требуется отнести else к первому if, это надо записать в явном виде с помощью фигурных скобок:
if (условие1)
{
if (условие2) оператор1;
}
else оператор2;
Вывод простой: если есть неуверенность в приоритетах в формулах или в конструкции
сложного оператора, то необходимо применять скобки.
Условная тернарная операция «?:»
Условная операция «?:» – трехчленная (тернарная) операция в C#, имеющая три опе-
ранда. Синтаксис оператора:
условие ? выражение 1 : выражение 2;
Первый операнд является условием, второй – содержит значение условного выражения
в случае, если условие истинно (возвращает ненулевое значение), а третий – равен значению
условного выражения, если условие ложно (возвращает нуль). Например, оператор
d = a < b ? a : b;
найдёт минимальное значение из двух переменных и занесёт его в d. Здесь тернарная операция входит в состав оператора присваивания.
Оператор с тернарной операцией выполняет фактически те же действия, что и оператор
if…else… . Но в ряде случаев применение условной операции компактнее и нагляднее оператора if…else… . К тому же иногда условная операция может использоваться в таких ситуациях, когда применение оператора if…else… синтаксически невозможно. Но необходимо помнить, что тернарная операция в C# применяется в ограниченных случаях, например в
операторах присваивания.
7
Компилятор как программа, работающая по точному алгоритму, однозначно построит логическое дерево.
Программист должен записать такую группу операторов так, чтобы компилятор построил нужную
последовательность машинных команд.
16

Алгоритм выделения цифр в числе
При решении некоторых задач требуется разобрать число на отдельные разряды, т. е.
выделить цифры, стоящие в каждом из разрядов. Пусть имеется число В = 7634. Требуется
получить значение первой и последней цифр в этом числе (первая цифра а1 = 7, а последняя а4 = 4).
Для решения подобной задачи
целесообразно воспользоваться методами целочислен-
ной арифметики языка C#:
а1=В/1000; // деление целых есть число целое, то есть
а4=В%10; // остаток от деления целого на целое, то есть
7634
7634
1000
10
7
763,
;
а в остатке 4.
Но такой экспресс-метод допустим, когда известен порядок числа и нужны крайние
цифры. Любое же число можно «разобрать на цифры», используя следующий алгоритм.
b1 = B / 10; a1 = B % 10; b2 = b1 / 10; a2 = b1 % 10;
b3 = b2 / 10; a3 = b2 % 10; b4 = b3 / 10; a4 = b3 % 10;
Тогда в переменных a4, a3, a2, a1 будут цифры-разряды от старшего к младшему.
Такой алгоритм можно свернуть в цикл. Критерием останова является то, что очередное bi (здесь b4) будет равно 0. Другими словами, были выбраны все значащие цифры исходного числа.
Контрольные вопросы
1. Как запустить среду разработки Microsoft Visual Studio?
2.
Как создать приложение консольного типа?
3. Какие окна среды используются при разработке приложения?
4. Какие виды условного оператора вы знаете?
5. Как записать оператор вывода?
6. Каковы назначение и формат записи тернарной операции?
Варианты задания
Для практического закрепления навыков использования условного оператора напишите
три короткие программы.
Вариант 1
1. Найти сумму
цифр четырехзначного целого числа.
2. Даны три числа. Наибольшее из них заменить на сумму двух остальных.
3. Определить квадрант декартовой системы координат, в котором находится точка
A(a1, a2).
Вариант 2
1. Сколько раз цифра 1 входит в трехзначное целое число?
2. Даны три числа. Найти пару чисел, отличающихся друг от друга на
1.
3. Определить, принадлежит ли точка A(a1, a2) кругу с радиусом R и центром в
начале координат.
Вариант 3
1. Определить наибольшую цифру трехзначного целого числа.
2. Даны три числа. Известно, что два из них оканчиваются цифрой 5. Найти третье
число.
3. Определить, принадлежит ли точка A(a1, a2) прямоугольнику с заданными
вершинами.
17

Лабораторная работа № 3
Использование оператора переключения при реализации ветвящихся процессов
Цель работы: получить практические навыки в разработке программ, использующих
операторы условные и переключения.
Методические указания
Условный оператор if позволяет выбрать одну из двух ветвей дальнейших вычислений. Но иногда требуется выполнить выбор между тремя и более ветвями альтернативных
вычислений.
Оператор переключения (выбора) switch
Оператор выбора switch обеспечивает ветвление по нескольким направлениям и имеет вид
switch (выражение)
оператор;
Оператор (в составе переключателя switch) обычно является составным оператором
(т. е. заключается в фигурные скобки), в котором некоторые операторы могут быть помечены следующим образом:
case <константное выражение> : оператор; break;
Константное выражение – это целая или литерная константа (например, 1 или
«A») либо выражение, составленное из таких констант с использованием операций.
Один (и только один) из операторов (обычно в последней группе) может быть помечен
ключевым словом default:
default : оператор; break;
Порядок выполнения условного оператора переключения следующий:
Вычисляется выражение, значение которого должно быть целое.
Оператор, помеченный константным выражением, выполняется, если целое зна-
чение выражения в switch равно значению этого константного выражения.
Если же значение выражения не равно ни одному из константных выражений,
управление передается на оператор, располагающийся после оператора выбора. Если же оператор выбора содержит оператор, помеченный меткой default, то управление передается
на него, а уже после выполнения всего блока управление будет передано на оператор, следующий за переключателем.
Необходимо помнить, что после выполнения выбранной альтернативы будет выполняться оператор, располагающийся после оператора выбора. Для выхода из альтернативы и
собственно из переключателя используется оператор break;. Например, для выполнения
нескольких действий, в зависимости от значения целочисленной переменной f, оператор
switch может выглядеть так:
switch (f)
{
case 1 : d = a + b; break;
case 2 : d = a * b; break;
default : cout << a << “;˽” << b << “;˽” <<d; break;
};
Здесь если целая переменная f равна 1 то выполняется суммирование, если 2 – умножение, если любое другое значение – печатаются значения переменных a, b, d.
Обратите внимание, что здесь каждый case-блок должен заканчиваться оператором
break. Другими словами, перехода от одной альтернативы к другой, как в языке C++ здесь нет.
Важно отметить, что заданное выражение в операторе switch должно быть целочисленного типа (char, byte, short или int), перечислимого или же строкового. А выражения
18

других типов, например с плавающей точкой, в операторе switch не допускаются. Зачастую
выражение, управляющее оператором switch, просто сводится к одной переменной. Кроме
того, константы выбора должны иметь тип, совместимый с типом выражения. В одном операторе switch не допускается наличие двух одинаковых по значению констант выбора.
Контрольные вопросы
1. Как записать оператор switch?
2. Назначение оператора switch?
3. Что общего и какие отличия имеют операторы if и switch?
4. Для чего предназначена метка default?
Варианты задания
Для практического закрепления навыков использования условного оператора и оператора переключения напишите две короткие программы.
Вариант 1
1. Вычислить значение кусочной функции
ye i
sin , 0;
aix i
i
k
3
sin 5 , 4 0;
3
i
7tg2, 4.
ini
3
2. С клавиатуры вводится номер квадранта. Определить знаки координат точек, при-
надлежащих данному квадранту.
Вариант 2
2
3
x
k
1. Вычислить значение кусочной функции
2tg , 2;
1
yxex
7
7
kxe x
sin 2 , 2 7;
tg 2 , 7.
nxn x
2. С клавиатуры вводится число от 1 до 12. Вывести название соответствующего ему
месяца.
Вариант 3
k
6
1. Вычислить значение кусочной функции
yik a
1, 1 , 0, 5 1, 5;
ei a
3
sin , 1, 5 3;
1
4
k
tg 2 , остальные .
na
m
2. С клавиатуры вводится возраст – число от 1 до 100. Вывести на экран подпись для
этого числа: «год», «года» или «лет». Например, 1 год, 23 года, 45 лет.
19

Лабораторная работа № 4
Организация повторений на C#
Цель работы: приобрести опыт в проектировании циклических алгоритмов и получить
практические навыки работы с операторами цикла.
Методические указания
Мощь компьютерной техники и смысл использования программирования раскрываются
при обработке больших объёмов данных. Часто это однотипные данные, например значения
одного измеряемого параметра, но измерения при этом выполнены многократно. Это могут
быть показатели температуры воздуха, снятые с метеоприбора в течение длительного времени;
единственный медицинский показатель, но снятый с большого количества пациентов.
Одномерные и двумерные массивы в языке C#
В языке программирования C# для хранения и обработки в оперативной памяти большого числа однотипных элементов используются массивы. Массив, как и простая переменная, должен быть описан, проинициализирован (заполнен значениями) и обработан, для получения результата.
Описание массива в языке C# отличается от описания простых переменных. При описании
переменной типа «массив» выполняется указание, что это переменная типа «массив» и сразу же
выделяется память соответствующего объема8. Описание выполняется аналогично простой переменной, но с указанием, что это именно массив. Формат описания массива имеет вид
<тип>[] имя_массива = new <тип> [количество_элементов];
Часто для решения задач используются матрицы и другие структуры с двойной индексацией. Для хранения данных таких математических элементов используются двумерные
массивы. Формат описания двумерного массива:
<тип>[,] имя_массива = new <тип> [кол-во_строк, кол-во_столбцов];
Примеры описания массивов и матриц:
int[] a = new int [10]; //массив из 10 целых чисел
double[] b = new double [365]; //массив из 365 вещественных чисел
double[,] m = new double [7, 9];
//двумерный массив (матрица) из 63-х (7*9) вещественных чисел
Обращение к отдельному элементу массива выполняется по имени массива и индексу
ячейки в массиве – a[7], а для двумерного массива по двум индексам – m[3, 7]. В двумерном массиве первый индекс означает номер строки матрицы, а второй – номер колонки
(номер элемента в строке). Например, типовые алгоритмы заполнения массива и матрицы,
путём ввода
for (i = 0; i <10 ; i++) Console.WriteLine (a[i]);
for (i = 0; i <7 ; i++)
значений с клавиатуры (с экрана) выглядят следующим образом:
for (j = 0; j < 9; j++)
Console.WriteLine (m[i, j]);
Обратите внимание, что нумерация элементов массива в C# начинается с нуля. Другими словами, первое значение в массиве находится в ячейке a[0], а в двумерном массиве – в ячейке m[0, 0].
В некоторых случаях удобно ячейки массива инициировать значениями непосредственно при описании. Для этого при описании массива указывается набор значений, как показано в примерах:
double[] arr = new double[3] {1.2, 2.3, 3.4};
double[,] mtr = new double[2, 3] {{ 1.2, 2.3, 3.4 },
{ 4.5, 5.6, 6.7 }};
8
В отличие от языков C++ и Pascal здесь нет статических массивов. Из-за технологии .NET здесь используется
только один тип массивов, аналогичный динамическим массивам других языков.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
