ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ C#
Учебное пособие
для студентов химических специальностей
в том числе для иностранных студентов
Утверждено
редакционно-издательским
советом университета,
протокол № 2 от 24.12.15 г.
Харьков
НТУ «ХПИ»
2016
УДК 519.682
ББК 22.18
С 60
Р е ц е н з е н т ы:
В.М. Колодяжный, д-р физ.-мат. наук, проф., профессор ХНАДУ;
Д.А. Лисин, канд. техн. наук, доцент ХНУ им. В.Н. Каразина.
ISBN 978-617-05-0166-0
Введение ................................................................................................................... 6
3
ГЛАВА 6 МЕТОДЫ ............................................................................................... 68
6.1 Синтаксис определения метода ..................................................................... 68
6.2 Способы передачи параметров ...................................................................... 71
6.2.1 Параметры – значения ............................................................................. 72
6.2.2 Параметры – ссылки ................................................................................ 72
6.2.3. Выходные параметры .............................................................................. 74
4
10.4.3 Задачи для выполнения лабораторных работ (часть 2) ..................... 241
10.4.4 Задачи для выполнения лабораторных работ (часть 3) ..................... 243
10.4.5 Задачи для выполнения лабораторных работ (часть 4) ..................... 243
10.5 Двумерные массивы................................................................................... 245
10.5.1. Примеры решения задач ..................................................................... 245
10.5.2. Задачи для выполнения лабораторных работ (часть 1) .................... 265
10.5.3. Задачи для выполнения лабораторных работ (часть 2) .................... 269
10.5.4. Задачи для выполнения лабораторных работ (часть 3) .................... 273
10.6 Методы ....................................................................................................... 274
10.6.1 Примеры решения задач ...................................................................... 274
10.6.2. Задачи для выполнения лабораторных работ (часть 1) .................... 314
10.6.3. Задачи для выполнения лабораторных работ (часть 2) .................... 315
10.7 Строки ........................................................................................................ 318
10.7.1. Примеры решения задач ..................................................................... 318
10.7.2. Задачи для выполнения лабораторных работ .................................... 327
10.8 Структуры, перечисления .......................................................................... 330
10.8.1 Примеры решения задач ...................................................................... 330
10.8.2 Задачи для выполнения лабораторных работ ..................................... 333
10.9 Файлы ......................................................................................................... 334
10.9.1. Примеры решения задач ..................................................................... 334
5
Введение
6
возможность для эффективного написания программ, предназначенных
для вычислительной среды современных предприятий. Это, без сомнения,
один из самых важных языков программирования XXI века.
В настоящем учебном пособии применяется эффективный подход к
изучению основ программирования: теория чередуется с практическими
работами.
Данное учебное пособие состоит из 10 глав, каждая из которых
содержит для закрепления и углубления полученных теоретических знаний
контрольные вопросы или варианты заданий.
В главе 1 изложены общие сведения о языке С#: элементы языка,
типы данных, переменные, константы, операции и выражения,
математические функции (методы).
В главе 2 рассмотрены операторы присваивания, ветвления, оператор
безусловного перехода, приведены примеры программ линейной и
разветвленной структуры.
В главе 3 представлены операторы цикла.
Главы 4 и 5 посвящены изучению одномерных массивов и обработки
матриц: объявление, ввод – вывод элементов массива, накопление суммы и
произведения элементов массива.
В главе 6 студент познакомится со способами создания методов:
изучит синтаксис метода, типы параметров метода, вызов метода.
Глава 7 посвящена обработке строк. Описаны методы обработки
строк.
Глава 8 познакомит студента с основами объектно-ориентированного
программирования, с понятиями классы и объекты. Кроме того, в главе 8
рассмотрены еще две категории типов значений: структуры и
перечисления.
В главе 9 описано использование файлов в языке С#. Приводятся
примеры файлового хранения числовых и текстовых данных.
Глава 10 – лабораторный практикум, в котором по каждой теме
приведены примеры решения задач и варианты для самостоятельной
работы.
7
ГЛАВА 1
ОБЩИЕ СВЕДЕНИЯ О ЯЗЫКЕ C#
Элементы языка C#
8
Окончание таблицы 1.1
into interface internal is join
let lock long namespace new
null object on operator orderby
out override params partial private
protected public readonly ref return
sbyte sealed select short sizeof
stackalloc static string struct switch
this throw true try typeof
uint ulong unchecked unsafe ushort
using value var virtual volatile
void where while
Long от – 9 223 372 036 854 775 808 Длинный целочисленный 8 байтов
до 9 223 372 036 854 775 807
Ulong от 0 Длинный целочисленный без 8 байтов
до 18 446 744 073 709 551 615 знака
9
Окончание таблицы 1.2
1 2 3 4
Short От –32768 до 32767 Короткий целочисленный 2 байта
Константы
Пример
10 – это целочисленная константа;
a – это символьная константа (символ, заключенный в апострофы);
15.347 – это вещественная константа с фиксированной точкой;
1.34e3 – это вещественная константа с порядком (1.34e3 = 1,34 103 1340 ).
True – это константа типа bool;
False – это константа типа bool.
10
типов: int, uint, long, ulong в зависимости от значения константы. Явно
указать тип константы можно с помощью суффикса.
Пример
12 – константа типа int
12L – константа типа long
10.23F –это константа типа float
Пример
Информатика – это строковая константа (набор символов, заключенных в
двойные кавычки).
Помимо обычных символов, строковая константа может содержать одну
или несколько управляющих последовательностей символов. Среди них
самые распространенные:
\n – перевод строки;
\t – горизонтальная табуляция.
Пример
Console.WriteLine(Первая строка\nВторая строка\nТретья строка);
Console.WriteLine(Один\tДва\tТри);
Результат:
Первая строка
Вторая строка
Третья строка
Один Два Три;
Пример
Console.WriteLine(@Первая строка
Вторая строка
Третья строка);
11
Результат:
Первая строка
Вторая строка
Третья строка
Именованные константы
Переменные
Пример
int i, k; bool b1;
float x; char c;
double z;
12
присваивания. Кроме того, задать начальное значение переменной, т.е.
инициализировать ее, можно при ее объявлении. Ниже приведен синтаксис
оператора инициализации переменной:
Синтаксис оператора:
тип имя_переменной = значение;
где
значение – это конкретное значение, задаваемое при создании переменной.
Оно должно соответствовать указанному типу переменной.
Пример
int i=10; // задать начальное значение 10 переменной i
float y = 1.245F; // переменная f инициализируется числовым значением 1,245
double z = 5.76; // или z = 5.76D; z = -76.45d;
s1 = ABCDEF;
b1 = true;
Пример
double a = 123.0;
float w = 827.0f;
13
Тип decimal предназначен для денежных расчетов. При
присваивании константы переменной типа decimal следует использовать
суффикс M(m), например:
Decimal cost = 13569.34m, size = 9845M;
Пример
bool b1= true, b2= false;
тип bool – это булевы переменные, для них определены только два
значения: true (истина) и false (ложь).
Пример
Char a = x; // символьная переменная
string b = первая строка; // строковая переменная
Пример
var y = 4.5783F; // переменная отнесена к типу float
14
которые не приведут к потере информации. Поэтому данные типов bool,
double, decimal не могут быть неявно преобразованы ни в какие типы
данных. Тип float может быть преобразован в double; int может быть
преобразован в long, float, double, decimal; long может быть
преобразован в float, double, decimal.
Явное преобразование выполняется следующим образом:
Пример
x = (float)56.3; // константа типа double преобразуется в float
i = (int)8.6; // результат i = 8
Пример:
a*b–Math.sin(x)
15
следующие группы: арифметические, операции сравнения, булевские
(логические) операции, поразрядные логические и сдвиговые операции,
строковая операция (конкатенация) и др.
Арифметические операции сложения, вычитания, умножения и
деления применимы к любым числовым типам. Арифметические операции
обозначают привычными знаками +, –, *, /, %.
При работе с целыми числами операция / дает частное, а операция %
остаток от деления. Последняя операция допустима только для целых. При
делении целых чисел остаток будет отброшен. Для деления двух целых
необходимо менять тип хотя бы одного из них.
Пример
i = 14; k = 4; x = (float)i/k;
Кроме того, у класса Math есть два полезных поля: число и число
e . Список математических методов класса System.Math приведен в таблице
1.4.
16
Таблица 1.3 – Арифметические операции
Операция Знак Запись Действие
Арифметическое сложение + a+b Складывает два числа
Унарный плюс + +а
Арифметическое вычитание – a–b Вычитает из одного числа другое
Унарный минус – –a
Умножение * a*b Умножает два числа
Деление / a/b Делит два числа и возвращает
результат с плавающей точкой
Деление по модулю % a%b Получение остатка от целочис-
(операция вычисления ленного деления (7%3=1).
остатка) Можно применять и к типам с
плавающей точкой (10.0%3.0=1).
Присваивание = a=b Задает новое значение переменной
Инкремент ++ i++; постфиксная форма, i = i+1;
++i; префиксная форма, i = i+1.
Декремент –– i– –; постфиксная форма, i = i–1;
– – i; префиксная форма, i = i–1.
Доступ к элементу . (точка) Выбор члена (класса или объекта)
Выделение памяти new Создание объекта (создание
экземпляра)
17
Окончание таблицы 1.4
1 2 3
Math.Exp(x) ex Экспонента.
e – основание натурального логарифма,
возведенное в степень x .
Math.Floor(x) Округление до меньшего целого.
Возвращает ближайшее целое число,
меньшее, чем значение аргумента x .
Пример
Math.Floor(1.04) даст в результате 1
Math.IEERemainder(x,y) Остаток от деления.
Возвращает остаток от деления числа x на
число y
Math.Log(x) ln x Натуральный логарифм x , где x 0
Math.Log10(x) lg x Десятичный логарифм x
Math.Log(x, a) log a x Логарифм x по основанию a
Math.Max(x,y) Максимум из двух чисел.
Math.Min(x,y) Минимум из двух чисел.
Math.PI – константа Значение числа =3,1415926
Math.Pow(x,y) xy Возведение x в степень y
Math.Round(x) Округление.
Округляет заданное число до ближайшего
целого (арифметическое округление)
Пример
Math.Round(3.1) даст в результате 3.
Math.Round(3.8) даст в результате 4.
Math.Round(x, n) Округление.
Округляет число с плавающей запятой до
заданного количества дробных разрядов n
Math.Sign(x) Знак числа.
Возвращает значение, определяющее знак
1 x0
целого числа. Sign( x) 0 если x 0
1 x0
Math.Sin(x) sin x Синус угла x . Угол x задается в радианах.
Math.Sqrt(x) x Корень квадратный из числа x , где x 0
Math.Tan(x) tg x Тангенс угла x . Угол x задается в радианах.
Math.Truncate(x) Вычисляет целую часть заданного
десятичного числа.
Rnd(x) Случайное число из диапазона 0 – 1
18
Примечание. Результат вычисления большинства математических функций –
тип double, аргументы функций также должны быть типа double, например,
Math.Sin(double x). Названия функций пишутся с большой буквы. Результат
функции Math.Sign(x) имеет тип int.
19
операндов дает значение true, а другой – false. Если оба операнда
истины или ложны, то все условие будет целиком ложным.
В C# предусмотрены также условные версии (&& и ||) логических
операторов (& и |). Они называются условными И и ИЛИ, так как второй
операнд в них вычисляется только при необходимости. Если значение
левого операнда однозначно определяет значение всего выражения, то
значение второго операнда не вычисляется. В выражении x&&y значение y
не вычисляется, если x имеет значение false. В выражении x||y
значение y не вычисляется, если x равно true. Операции && и ||
предназначены для получения более эффективного кода.
Контрольные вопросы
20
ГЛАВА 2
ОПЕРАТОРЫ ПРИСВАИВАНИЯ, ВЕТВЛЕНИЯ, ОПЕРАТОР goto
21
реализует многократное выполнение оператора. Базовые конструкции
приведены на рис.2.1.
Синтаксис оператора:
имя_переменной = выражение;
22
Здесь имя переменной должно быть совместимо с типом выражения.
Пример
y=a+b/2.0– Math.Cos(a);
Пример
int x, y, z;
x=y=z=100; // присвоить значение 100 переменным x, y и z
Такой способ присваивания удобен для задания общего значения целой
группе переменных.
Операция инкремента:
i++; постфиксная форма, равнозначно i=i+1; или i+=1;
++i; префиксная форма, равнозначно i=i+1; или i+=1;
Операция декремента:
i--; постфиксная форма, равнозначно i=i-1; или i-=1;
--i; префиксная форма, равнозначно i=i-1; или i-=1;
23
оператор инкремента или декремента используется в длинном выражении,
то тогда отличие в форме его записи уже имеет значение. Когда оператор
инкремента или декремента предшествует своему операнду, то
результатом операции становится значение операнда после инкремента
или декремента. А когда оператор инкремента или декремента следует
после своего операнда, то результатом операции становится значение
операнда до инкремента или декремента.
Пример 1
x=10;
y=++x;
Значение переменной y будет равно 11, так как значение переменной x
сначала увеличивается на 1, а затем присваивается переменной y.
Пример 2
x=10;
y=x++;
Значение переменной y будет равно 10, так как в этом случае значение
переменной x сначала присваивается переменной y, а затем увеличивается
на 1. В обоих случаях значение переменной x оказывается равным 11.
Отличие состоит лишь в том, когда именно это значение станет равным 11:
до или после его присваивания переменной y.
24
Библиотека FCL является одним из важнейших компонентов всей
платформы Microsoft NET Framework.
Класс Console определён в пространстве имён System. Почти во
всех консольных программах применяются методы этого класса:
Write(выводимая строка);
WriteLine(выводимая строка);
ReadLine() – возвращает введенную строку.
Важное обстоятельство: метод ReadLine() всегда возвращает
данные типа string, в случае необходимости преобразования должны быть
запрограммированы.
Аргументом методов Write, WriteLine тоже должна быть
символьная строка. Разница между Write и WriteLine заключается в том,
что после вывода строки WriteLine осуществляется автоматически
переход на следующую строку на экране, Write этого не делает.
Для преобразования типов данных можно использовать методы
класса Convert. Например, ToInt32 выполняет перевод в int, ToDouble
выполняет перевод в double, ToString выполняет перевод в string.
Какие методы имеются в классе Convert можно узнать очень легко:
достаточно набрать это слово, поставить точку и на экране появится весь
перечень его методов.
Линейные программы
Программный код:
using System;
namespace C130
{
class Program
{
25
static void Main(string[] args)
{
int i;
double x, y, z;
Console.Write("Введите i= "); // подсказка при вводе
// Ввод, совмещенный с преобразованием,
// вводится строка, которая преобразуется в целое число
i=Convert.ToInt32(Console.ReadLine());
Console.Write("Введите x= ");
x = Convert.ToDouble(Console.ReadLine());
y = i * x;
z = Math.Pow((2*i-x), 3);
// Вывод с автоматическим преобразованием
Console.WriteLine("y=" + y);
// Вывод с явным преобразованием
Console.WriteLine(Convert.ToString(z));
Console.ReadLine();
}
}
}
26
Перед каждым оператором может быть помещена метка, отделяемая
от оператора двоеточием. В качестве метки используется произвольно
выбранный программистом идентификатор.
27
Рисунок 2.3 – Структурная схема условного оператора
Синтаксис оператора:
if (условие) оператор_1; else оператор_2;
где
if, else – зарезервированные слова,
условие – это условное выражение,
оператор_1, оператор_2 – любые исполняемые операторы или блоки опе-
раторов.
Условный оператор работает следующим образом. Вначале вычисля-
ется логическое выражение. Если логическое выражение равно true,
выполняется оператор_1. В противном случае, когда выражение равно
false, выполняется оператор_2.
Ниже приведена общая форма оператора if, в котором используются
блоки операторов.
if (условие)
{
последовательность операторов
}
else
{
последовательность операторов
}
28
Допустима сокращенная форма условного оператора, в которой
отсутствует else и оператор_2. В этом случае при ложности проверяемого
условия никакие действия не выполняются, например:
if(a>0) a=-a;
Оператор_1 и оператор_2 могут быть условными, что позволяет
организовать цепочку проверок условий любой глубины вложенности. В
этих цепочках каждый из условных операторов (после проверяемого
условия и после else) может быть как полным условным, так и иметь
сокращенную форму записи. При этом могут возникать ошибки
неоднозначного сопоставления if и else. Синтаксис языка предполагает,
что при вложениях условных операторов каждое else соответствует
ближайшему к нему предшествующему if.
Пример фрагмента программы, в котором переменной result необходимо
присвоить максимальное из трех значений переменных x, y, z.
if (x<y)
if (y<z) result=z;
else result=y;
else
if (x<z) result=z;
else result=x;
Конструкция if – else – if
if (условие)
оператор;
else if (условие)
оператор;
else if (условие)
оператор;
.
.
.
else
оператор;
29
Логические выражения в такой конструкции вычисляются сверху
вниз. Как только обнаружится истинное условие, выполняется связанный с
ним оператор, а все остальные операторы в многоступенчатой
конструкции опускаются. Если ни одно из условий не является истинным,
то выполняется последний оператор else. Когда же последний оператор
else отсутствует, а все остальные проверки по условию дают ложный
результат, то никаких действий вообще не выполняется.
Программный код:
using System;
namespace C129
{
class Program
{
static void Main(string[] args)
{
double x;
Console.WriteLine("Введите число");
x = Convert.ToDouble(Console.ReadLine());
Console.Write("Введено число " + x + "-");
if (x < 0)
Console.WriteLine("отрицательное число");
else if (x == 0)
Console.WriteLine("нулевое число");
else
Console.WriteLine("положительное число");
Console.ReadLine();
}
}
}
30
Рисунок 2.4 – Результаты решения задачи 2.3
3a 2 b a 0, b 0 a 2; b 5;
z a b если a 0, b 0 при a 3,5; b 7;
a 1 a 0, b 0 a 5; b 8;
Программный код:
using System;
namespace C135
{
class Program
{
static void Main(string[] args)
{
double a, b, z;
Console.WriteLine(" Введите a= ");
a=Convert.ToDouble(Console.ReadLine());
Console.WriteLine(" Введите b= ");
b = Convert.ToDouble(Console.ReadLine());
z = 0;
if (a > 0 && b > 0)
z = 3 * a * a - b;
else if (a < 0 && b < 0)
z = a + b;
else if (a > 0 && b < 0)
z = a - 1;
Console.WriteLine("a= {0}; b={1}; z={2,5:F2}", a, b, z);
Console.ReadLine();
}
}
}
32
Синтаксис оператора:
switch (выражение)
{
сase константа 1:
последовательность операторов_1;
break;
сase константа 2:
последовательность операторов_2;
break;
.
.
.
сase константа n:
последовательность операторов_n;
break;
default:
последовательность операторов;
break;
}
где
switch, сase, default – зарезервированные слова.
Программный код:
using System;
namespace C8a
{
class Program
{
static void Main(string[] args)
{
int M;
Console.Write("Введите номер текущего месяца -> ");
M = Convert.ToInt32(Console.ReadLine());
switch (M)
{
case 12:
case 1:
case 2:
Console.WriteLine("Зима");
break;
case 3:
case 4:
case 5:
Console.WriteLine("Весна");
break;
case 6:
case 7:
case 8:
Console.WriteLine("Лето");
break;
case 9:
case 10:
case 11:
Console.WriteLine("Осень");
break;
default:
Console.WriteLine("Число должно быть в диапазоне 1..12");
34
break;
}
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C133
{
class Program
{
static void Main(string[] args)
{
int age; // возраст человека
Console.WriteLine("Введите возраст: ");
age = Convert.ToInt32(Console.ReadLine());
int p = 0;
if ((age >= 0) && (age < 7)) p = 1;
if ((age >= 7) && (age < 17)) p = 2;
if ((age >= 17) && (age < 25)) p = 3;
if ((age >= 25) && (age < 50)) p = 4;
if ((age >= 50) && (age < 80)) p = 5;
if (age>=80) p=6;
35
switch(p)
{
case 1:
Console.WriteLine("ребёнок");
break;
case 2:
Console.WriteLine("школьник");
break;
case 3:
Console.WriteLine("юноша");
break;
case 4:
Console.WriteLine("взрослый человек");
break;
case 5:
Console.WriteLine("пожилой человек");
break;
case 6:
Console.WriteLine("старый человек");
break;
default:
Console.WriteLine("Вы ввели отрицательное число ");
break;
}
Console.ReadLine();
}
}
}
Результаты расчета см. рис.2.8.
Контрольные вопросы
1. Назовите базовые конструкции структурного программирования.
2. Напишите синтаксис оператора присваивания.
3. Какие Вы знаете сокращенные записи арифметических операций?
4. Как осуществляется ввод – вывод в консольном режиме?
5. Какие вы знаете операторы ветвления?
36
ГЛАВА 3
ОПЕРАТОРЫ ЦИКЛА: for, while, do-while
Условие Операторы
Операторы Модификация
параметра
цикла
Модификация
параметра
Условие
цикла
Синтаксис:
for (инициализация; условие; итерация) оператор;
где
инициализация, как правило, представлена оператором присваивания,
38
задающим первоначальное значение переменной, которая выполняет роль
счетчика и управляет циклом;
условие – это логическое выражение, определяющее необходимость
повторения цикла;
итерация – выражение, определяющее величину, на которую должно
изменяться значение переменной, управляющей циклом, при каждом
повторе цикла.
Выполнение цикла for будет продолжаться до тех пор, пока
проверка условия дает истинный результат. Как только эта проверка дает
ложный результат, цикл завершится, а выполнение программы будет
продолжено с оператора, следующего после цикла for.
Цикл for может продолжаться как в положительном, так и в
отрицательном направлении, изменяя значение переменной управления
циклом на любую величину.
В операторе for разрешается использовать две или более
переменных для управления циклом. В этом случае операторы
инициализации и инкремента каждой переменной разделяются запятой.
Программный код:
using System;
namespace C13
{
class Program
{
static void Main(string[] args)
{
int i;
for (i = 1; i <= 10; i++) Console.WriteLine(" " + i);
Console.ReadLine();
}
}
}
39
Рисунок 3.2 – Результаты решения задачи 3.1
Программный код:
using System;
namespace C13a
{
class Program
{
static void Main(string[] args)
{
int k;
for (k=20; k>=-20; k=k-5)
Console.WriteLine(k);
Console.ReadLine();
}
}
}
40
Задача 3.3. Использование в операторе for две или более перемен-
ных для управления циклом
Программный код:
using System;
namespace C14
{
class Program
{
static void Main(string[] args)
{
int i, j;
for (i = 0, j = 10; i < j; i++, j--)
Console.WriteLine("i и j: " + i + " " + j);
Console.ReadLine();
}
}
}
Синтаксис:
while (условие) оператор;
41
while (условие)
{
последовательность операторов
}
где
оператор – это единственный оператор или же блок операторов,
условие означает конкретное условие управления циклом и может быть
любым логическим выражением.
Цикл выполняется следующим образом: сначала проверяется
условие, если оно истинно, то выполняется тело цикла. Цикл повторяется
до тех пор, пока условие истинно. Как только условие становится
ложным, цикл завершается, и управление программой передается строке
кода, следующей непосредственно после цикла.
Программный код:
using System;
namespace C15
{
class Program
{
static void Main(string[] args)
{
int i = 1;
while (i <= 10)
{
Console.WriteLine(" " + i);
i++;
}
Console.ReadLine();
}
}
}
42
Рисунок 3.5 – Результаты решения задачи 3.4
Синтаксис:
do
{
операторы;
}
while (условие);
43
Задача 3.5. Вывести на консоль значения первых десяти целых чисел
при помощи оператора цикла do-while.
Программный код:
using System;
namespace C17
{
class Program
{
static void Main(string[] args)
{
int i = 1;
do
{
Console.Write(" " + i);
i++;
}
while (i <= 10);
Console.WriteLine();
Console.ReadLine();
}
}
}
44
Программный код:
using System;
namespace C18
{
class Program
{
static void Main(string[] args)
{
for (int i = -5; i <= 5; i++)
{
if (i > 0) break; //завершить цикл, как только
//переменная i станет положительная
Console.Write(i + " ");
}
Console.WriteLine();
Console.ReadLine();
}
}
}
namespace C19
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i <= 10; i++)
{
if ((i % 2) != 0) continue; //перейти к след. шагу итерации
Console.Write(" " + i);
}
Console.WriteLine();
Console.ReadLine();
}
}
}
Контрольные вопросы
46
ГЛАВА 4
ОДНОМЕРНЫЕ МАССИВЫ
47
Здесь под общим именем Fam объединено 12 ячеек памяти,
содержащих однотипные строковые величины – фамилии; i– индекс
(номер) элемента в массиве.
При обращении к элементам массива указывается имя массива, а в
скобках – его индекс, например:
Fam[1]= " Виноградова "
Fam[9]= " Мудров "
В C# массивы реализованы в виде объектов, поэтому перед
использованием массивы требуется описать и создать оператором new (во-
первых, необходимо объявить переменную, которая может обращаться к
массиву; и во-вторых, нужно создать экземпляр массива, используя
оператор new). Кроме того, реализация в виде объектов дает такие
преимущества, как наличие методов и автоматическую очистку памяти
(сборка мусора) после использования массивов (как и других объектов).
Пример
Создается массив из 8 элементов вещественных чисел. Операция new
выделяет память под 8 вещественных элементов, и они заполняются нуля-
ми:
double[] A = new double[8];
Пример
Создается массив из 12 строк:
string[] Fam = new string[12];
где
тип – объявляет конкретный тип элементов массива; тип
сопровождают квадратные скобки, они указывают на то, что объявляется
одномерный массив.
размер – определяет число элементов массива.
48
Перед использованием массива он должен быть инициализирован,
т.е. под него должна быть выделена память.
Пример 1
int []A; // 1 объявлен массив без выделения памяти
// память под элементы массива выделена ниже
// в строке 5
.
.
.
int n; // 2
Console.WriteLine(Введите количество элементов); // 3
n = Convert.ToInt32(Console.WriteLine()); // 4
A = new int[n]; // 5
Пример 2
int []B = new int[30];
49
Пример
int [] В;
В = new int [30];
Пример 3
int []Q = new int[5] {2, 5, 8, 23, 45}; // 6
или
int []Q = new int[] {2, 5, 8, 23, 45}; // 7
или
int []Q = {2, 5, 8, 23, 45}; // 8
50
Таблица 4.1 – Основные элементы класса Array
Элемент Вид Описание
Length Свойство Количество элементов массива (по всем размерностям)
Copy Статический Копирование заданного диапазона элементов одного
метод массива в другой
CopyTo Метод Копирование всех элементов текущего одномерного
массива в другой одномерный массив
IndexOf Статический Поиск первого вхождения элемента в одномерный
метод массив
LastIndexOf Статический Поиск последнего вхождения элемента в одномерный
метод массив
Reverse Статический Изменение порядка следования элементов на обратный
метод
Sort Статический Упорядочивание элементов одномерного массива
метод
Программный код:
using System;
namespace C101
{
class Program
{
static void Main(string[] args)
{
int[] A = new int[10];
int i;
// Вычисление элементов массива
for (i = 0; i <= 9; i = i + 1)
A[i] = i;
// Вывод элементов массива
Console.WriteLine(" Элементы массива: ");
Console.WriteLine();
for (i = 0; i <= 9; i = i + 1)
51
Console.WriteLine(" A[{0}]={1} ", i, A[i]);
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C102
{
class Program
{
static void Main(string[] args)
{
int[] A = new int[10];
int i; double s, p;
// Вычисление элементов массива
for (i = 0; i <= 9; i = i + 1)
A[i] = i + 2;
// Вывод элементов массива
Console.WriteLine(" Элементы массива: ");
for (i = 0; i <= 9; i = i + 1)
52
Console.WriteLine(" A[{0}]={1} ", i, A[i]);
// Накопление суммы и произведения элементов массива
s = 0; p = 1.0;
for (i = 0; i <= 9; i = i + 1)
{
s = s + A[i];
p = p * A[i];
}
Console.WriteLine("Сумма элементов массива равна " + s);
Console.WriteLine("Произведение элементов массива " + p);
Console.ReadLine();
}
}
}
namespace C103
{
class Program
{
static void Main(string[] args)
{
Random rnd = new Random();
for (int i = 0; i <= 9; i++)
Console.WriteLine("{0,4:D} ", rnd.Next(1, 10));
Console.ReadLine();
}
}
}
54
Рисунок 4.3 – Результаты решения задачи 4.3
Программный код:
using System;
namespace C105
{
class Program
{
static void Main(string[] args)
{
double Scale = 10.0, Shift = -5;
Random rnd = new Random();
for (int i = 0; i <= 9; i++)
Console.WriteLine(" {0,8:F3} ",
rnd.NextDouble() * Scale + Shift);
Console.ReadLine();
}
}
}
Результаты расчета см. рис. 4.5.
Программный код:
using System;
namespace C45a
{
class Program
{
static void Main(string[] args)
{
const int n = 10;
int i;
int[] A = new int[n] { 1,-4,-7,8,-10,12,-14,-17,20,21 };
Console.WriteLine("Массив А: ");
for (i = 0; i <= n - 1; i++)
Console.Write(" " + A[i]);
Console.WriteLine();
long sum = 0; // сумма отрицательных элементов
long num = 0; // количество отрицательных элементов
for (i=0; i<=n-1; i++)
if (A[i] < 0)
{
sum = sum + A[i];
num = num + 1;
}
Console.WriteLine("Сумма отрицательных элементов = " + sum);
Console.WriteLine("Кол-во отрицательных элементов = " + num);
Console.ReadLine();
}
}
}
57
4.5 Оператор цикла foreach для работы с одномерными массивами
Синтаксис оператора:
foreach (тип имя_переменной_цикла in коллекция) оператор;
Программный код:
using System;
namespace C45
{
class Program
{
static void Main(string[] args)
{
const int n = 7;
int[] A = new int[n];
58
int i;
int sum=0;
// Заполнение массива значениями и вывод на экран
Console.WriteLine(" Массив А: ");
for (i = 0; i <= (n - 1); i++)
{
A[i] = 2 * i +7;
Console.Write(" " + A[i]);
}
Console.WriteLine();
foreach (int k in A) sum = sum + k;
Console.WriteLine("\nСумма элементов массива sum = " +sum);
Console.ReadLine();
}
}
}
Контрольные вопросы
59
ГЛАВА 5
ДВУМЕРНЫЕ МАССИВЫ
j 0 1 2 3
i
0 7,8 9 7 15
1 –8 4,5 2 –5
2 8,3 15,7 7,1 5,6
3 10 1,8 –3 –18
4 5 15 4,6 –9,2
60
тип[,] имя = new тип [,] { список_инициализаторов };
тип[,] имя = new тип [ разм_1, разм_2 ] { список_инициализаторов };
где
разм_1 – количество строк;
разм_2 – количество столбцов.
Пример
int[,] B = new int[2,2];
// объявляется и инициализируется двумерный массив B из 2×2 целых чисел
или
int[][] B = new int[2][2];
// вместо запятых можно указать нужное количество квадратных скобок
Пример
int[,] C = new int[2,3] {{1,2,4}, {3,5,7}};
// объявляется двумерный массив C из 2×3 целых чисел,
// одновременно массив наполняется нужными значениями.
61
используются вложенные циклы. Массивы принято заполнять построчно.
Программный код:
using System;
namespace C106
{
class Program
{
static void Main(string[] args)
{
int i, j;
int[,] A = new int[3, 4];
Console.WriteLine(" Массив А: ");
for (i = 0; i <= 2; i++)
{
for (j = 0; j <= 3; j++)
{
A[i, j] = i + 4 * j + 1;
Console.Write(A[i, j] + " ");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
}
62
Как и одномерный массив, двумерный массив можно объявлять и
одновременно наполнять нужными значениями.
Пример
Значения элементов двумерного массива заданы в программном коде:
int[,] A= {{1, 2, 3},
{4, 5, 6 },
{7, 8, 9 }};
У многомерных массивов свойство Length возвращает общее количество
элементов в массиве.
Программный код:
using System;
namespace C107
{
class Program
{
static void Main(string[] args)
{
const int n = 5;
int[,] A = new int[n, n];
Random rnd = new Random();
int sum = 0;
63
for (int i = 0; i <= (n - 1); i++)
{
for (int j = 0; j <= (n - 1); j++)
{
A[i, j] = rnd.Next(1, 10);
sum = sum + A[i, j];
Console.Write("A[{0},{1}] = {2} ", i, j, A[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("Сумма элементов массива А= " + sum);
Console.ReadLine();
}
}
}
64
Пример матрицы
A0,0 A0,1 A0, 2 A0,3
A1,0 A1,1 A1,2 A1,3
A2,0 A2,1 A2,2 A2,3
A3,0 A3,1 A3, 2 A3,3
Программный код:
using System;
namespace C44
{
class Program
{
static void Main(string[] args)
{
const int n=5;
int[,] A = new int[n,n];
int[] C = new int[n]; //элементы главной диагонали
int[] S = new int[n]; //элементы побочной диагонали
Random rnd = new Random();
int sumC = 0; // сумма элементов главной диагонали
int sumS = 0; // сумма элементов побочной диагонали
int i,j;
// Накопление и вывод элементов массива
Console.WriteLine(" Массив А: \n ");
65
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (n - 1); j++)
{
A[i, j] = rnd.Next(1, 10);
Console.Write(" " + A[i, j]);
}
Console.WriteLine();
}
//Создание одномерных массивов С[n] и S[n] и накопление их сумм
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (n - 1); j++)
{
if (i == j)
{
C[i] = A[i, j];
sumC = sumC + C[i];
}
if (i == n - j - 1)
{
S[i] = A[i, j];
sumS = sumS + S[i];
}
}
}
Console.WriteLine();
Console.WriteLine("Элементы главной диагонали: ");
for (i = 0; i <= (n - 1); i++) Console.Write(" " + C[i]);
Console.WriteLine("\nСумма элементов главной диагонали:" + sumC);
Console.WriteLine("\nЭлементы побочной диагонали: ");
for (i = 0; i <= (n - 1); i++) Console.Write(" " + S[i]);
Console.WriteLine("\nСумма элементов побочной диагонали:"+sumS);
Console.ReadLine();
}
}
}
66
Результаты расчета см. рис. 5.3.
Контрольные вопросы
67
ГЛАВА 6
МЕТОДЫ
где
доступ – необязательный модификатор доступа. Отсутствие
подразумевает private, определяет закрытый метод, доступный только
внутри класса. Открытый модификатор public позволяет вызывать метод
из любой другой части программы. Программы текущей работы
выполняются внутри одного класса, поэтому этот модификатор будет
пропущен.
возвращаемый_тип определяет, значение какого типа вычисляется с
помощью метода. Часто употребляется термин «метод возвращает
значение», поскольку после выполнения метода происходит возврат в то
место вызывающей функции, откуда был вызван метод, и передача туда
значения выражения, записанного в операторе return. Если метод не
68
возвращает никакого значения, в его заголовке задается тип void, а
оператор return отсутствует.
список_параметров – последовательность пар, состоящих из типа и
идентификатора и разделенных запятыми. При отсутствии параметров
список остается пустым. Параметры, задаваемые в описании метода, также
называются формальными параметрами (или просто параметрами).
Параметры, используемые при вызове метода, называются фактическими
параметрами или аргументами.
При вызове подпрограммы сохраняется адрес оператора,
следующего за ее вызовом, и управление передается операторам
подпрограммы. Значения формальных параметров, как поля бланка,
заполняются значениями аргументов. После завершения выполнения
подпрограммы управление переходит к оператору, адрес которого был
сохранен перед вызовом. Если тип метода отличен от void и метод
вызывается внутри выражения, то в место вызова метода подставляется
возвращаемое значение. Если метод вызывается не в выражении, то
возвращаемое значение игнорируется.
Константы и переменные, заданные вне методов в классе доступны
во всех методах класса (и из экземпляров других классов, если описаны с
модификатором public) и являются для методов класса глобальными.
Переменные (и параметры) внутри методов являются локальными и
теряются при выходе из метода. Более того, переменные могут быть
локальными внутри программного блока {} в теле метода.
Примечание. Метод, не возвращающий значение, вызывается отдельным
оператором, а метод, возвращающий значение, – в составе выражения в правой части
оператора присваивания.
Параметры методов
69
мент (аргументы как бы накладываются на параметры и замещают их).
4. Выполняется тело метода.
5. Если метод возвращает значение, оно передается в точку вызова;
если метод имеет тип void, управление передается на оператор,
следующий после вызова.
При этом проверяется соответствие типов аргументов и параметров и
при необходимости выполняется их преобразование. При несоответствии
типов выдается диагностическое сообщение.
Примечание. Главное требование при передаче параметров состоит в том, что
аргументы при вызове метода должны записываться в том же порядке, что и параметры
в заголовке метода. Количество аргументов должно соответствовать количеству
параметров. На имена никаких ограничений не накладывается: имена аргументов могут
как совпадать, так и не совпадать с именами параметров.
Программный код:
using System;
namespace C52a
{
class Program
{
// площадь поверхности параллелепипеда
static double ps(double L, double w, double h)
{
return (L * w + L * h + w * h) * 2;
}
70
h = Convert.ToDouble(Console.ReadLine());
s = ps(L, w, h);
Console.WriteLine(" \nПлощадь поверхности = {0,5:F2}
кв. см.", s);
Console.ReadLine();
}
}
}
Результаты расчета см. рис. 6.1.
71
Ключевое слово предшествует описанию типа параметра. Если оно
опущено, параметр считается параметром- значением. Массив параметров
может быть только один и должен располагаться последним в списке,
например:
public int Calculate( int a, ref int b, out int c, params int[] d)…
72
одна проблема возникает, если в методе требуется изменить значение
каких- либо передаваемых в него величин. В этих случаях используются
параметры - ссылки.
Признаком параметра - ссылки является ключевое слово ref перед
описанием параметра:
ref тип имя
Пример заголовка метода, имеющего один параметр - ссылку целого
типа:
void P( ref int x)
При вызове метода в область параметров копируется не значение
аргумента, а его адрес, и метод через него имеет доступ к ячейке, в кото-
рой хранится аргумент. Таким образом, параметры - ссылки передаются по
адресу (чаще употребляется термин «передача по ссылке»). Метод рабо-
тает непосредственно с переменной из вызывающей функции и, следова-
тельно, может ее изменить, поэтому если в методе требуется изменить
значения параметров, они должны передаваться только по ссылке.
73
Результаты расчета см. рис. 6.2.
namespace C48
{
class Program
{
static void P(int a, out int b)
{
a = 44; b = 33;
Console.WriteLine(" внутри метода {0} {1}", a, b);
}
74
P(a, out b);
Console.WriteLine(" после вызова {0} {1}", a, b);
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C116
{
class Program
{
static void print(string line)
{
Console.WriteLine("Длина строки: " + line.Length);
Console.WriteLine("Значение строки: " + line);
}
75
print(numbers);
numbers = change(numbers);
print(numbers);
Console.ReadLine();
}
}
}
Примечание.
В классе Program три статических метода. В объявлении каждого метода класса
входит модификатор static, и такой метод называют статическим методом класса.
Метод print() с типом void получает исходные данные в виде строки-
параметра и выводит длину и значение этой строки. В точку вызова метод print()
ничего не возвращает.
Метод change() имеет тип отличный от void. Он получает в качестве
параметра строку, формирует ее перевернутое значение и возвращает в точку вызова
этот результат.
В функции Main с типом void определена строка numbers, ее значение
"123456789".
В отдельном операторе вызывается метод print(numbers), который выводит
сведения о строке. Затем вызывается метод change(numbers) и реверсное значение
строки присваивается строковой переменной numbers. Повторное обращение к
методу print() иллюстрирует изменения.
76
Программный код:
using System;
namespace C117
{
class Program
{
static void fun(double x, out int n, out double fra)
{
n = (int)x;
fra = x - n;
}
Программный код:
using System;
namespace C119
{
class Program
{
77
static void ps(int[] mas, out int k)
{
int i;
k = -8;
for (i = 0; i <= mas.Length - 1; i++)
if (mas[i] < 0)
{
k = i;
break;
}
}
Контрольные вопросы
78
ГЛАВА 7
СИМВОЛЫ И СТРОКИ
7.1 Символы
79
Символьный тип относится к встроенным типам данных C# и
соответствует стандартному классу Char библиотеки .NET из пространства
имен System. В этом классе определены статические методы, позволя-
ющие задать вид и категорию символа, а также преобразовать символ в
верхний или нижний регистр и в число.
80
Задача 7.1. Применение методов класса System.Char
Программный код:
using System;
namespace C68
{
class Program
{
static void Main(string[] args)
{
char b='B', c='\x63', d='\u0032';
Console.WriteLine("{0} {1} {2}", b, c, d);
Console.WriteLine("{0} {1} {2}", char.ToLower(b),
char.ToUpper(c), char.GetNumericValue(d));
char a;
do
{
Console.Write("Введите символ: ");
a = Convert.ToChar(Console.ReadLine());
Console.WriteLine("Введен символ {0}, его код - {1}", a,
(int)a);
if (char.IsLetter(a)) Console.WriteLine("Буква ");
if (char.IsUpper(a)) Console.WriteLine("Верхний регистр");
if (char.IsLower(a)) Console.WriteLine("Нижний регистр");
if (char.IsControl(a)) Console.WriteLine("Управляющий");
if (char.IsNumber(a)) Console.WriteLine("Число ");
if (char.IsPunctuation(a)) Console.WriteLine("Разделитель");
Console.WriteLine("\n");
}
while (a != 'q');
Console.ReadLine();
}
}
}
81
Рисунок 7.1 – Результаты решения задачи 7.1
7.2 Строки
82
понятная пользователю текстовая информация. Строки содержат шаблоны
форматирования результатов вычислений. Выводом строк можно
манипулировать и направлять его на различные устройства: на экран, на
принтер, записывать в файлы. Со строками выполняют следующие
операции: клонирование, объединение / вставка, усечение / удаление,
извлечение подстроки, изменение регистра символов, поиск
подстроки и т.д.
В C# строки, как и массивы, являются объектами, поэтому
строковый тип – ссылочный. Переменная, ссылающаяся на экземпляр
строки, может изменяться, присваивая ссылку на новый объект. Сам
экземпляр строки меняться не может. Операции, манипулирующие
строками, создают новые строковые объекты и возвращают ссылки на них.
Для сравнения, Pascal воспринимает строку как массив символов,
которые можно читать и записывать отдельно непосредственно в памяти,
выделенной для хранения строки. В C# к отдельным символам строки
также можно обратиться по индексу (нумерация с нуля), указанному в
квадратных скобках, как к элементу символьного массива char[], но в
режиме только чтения.
Для работы со строками предназначен тип string, он является
встроенным типом C#. Ему соответствует базовый класс System.String
библиотеки .NET.
Создание строк:
1. Объявление с инициализацией, используется строковая константа
string str = Строки в C# весьма эффективны
83
4. Конструктор класса String может сформировать строку, повторяя
заданный символ (первый параметр) заданное число раз (второй параметр).
Пример
string str2 = new string(3, 2);
namespace C69
{
class Program
{
static void Main(string[] args)
{
char[] charray = { 'Э', 'т', 'о', ' ', 'с', 'т', 'р', 'о',
'к', 'а', '.'};
string str1 = new string(charray);
string str2 = "Вторая строка.";
Console.WriteLine(str1);
Console.WriteLine(str2);
Console.ReadLine();
}
}
}
84
7.2.1 Операции, которые можно совершать над строками
присваивание (=);
проверка на равенство (==);
проверка на неравенство (!=);
обращение по индексу ([]);
сцепление (конкатенация) строк (+).
Форма 2:
public static string Concat(string str0, string str1, string str2)
В данной форме функция Concat() возвращает строку, состоящую
из последовательного сцепления строк str0, str1, str2).
2. Операция сравнения
Строки можно сравнивать с помощью операторов == и !=. Причем
имеется в виду, что равные строки идентичны, т.е. одинаково не только
количество элементов, но и их последовательный набор (т.е. все
содержимое). В обоих случаях выполняется порядковое сравнение.
Порядковое сравнение означает, что строки сравниваются на основании
двоичных значений символов, из которых они состоят.
if (str==str1)…….
if (str!=str1)…….
Строки можно также сравнивать с учетом различных особенностей
культурной среды, например, в лексикографическом порядке. Это так
85
называемое сравнение с учетом культурной среды (функция Equals(), где
непременно нужно указать способ сравнения в виде аргумента
StringComparison.CurrentCulture). Для сравнения строк существует
также метод Compare(). Этот метод служит для сравнения строк с целью
определить отношение порядка, например, для сортировки. Если же
требуется проверить символьные строки на равенство, то для этой цели
лучше воспользоваться функцией Equals() или строковыми операторами.
Кроме того, строки можно сравнивать с учетом или без учета ре-
гистра.
Доступ к символу – элементу строки производится через его индекс.
Элементы строки нумеруются от нуля. С помощью индекса можно только
прочитать символ, но нельзя присвоить символу другое значение. Новое
значение можно присвоить только всей строке.
Пример
string str = "информатика";
char c = str[2];
Console.WriteLine(c);
1. Метод Copy
Копирует строку – аргумент (str1) в строку (str2). Количество
элементов в строках не может быть различным.
2. Метод IndexOf
Определяет номер элемента строки (индекс) первого вхождения
заданной подстроки в строке (может быть и один символ). Если нужное
сочетание не найдено, то возвращается значение –1.
Форма 1:
public int IndexOf(char value)
87
найден, то возвращается значение –1. При таком поиске символа
настройки культурной среды игнорируются. Следовательно, в данном
случае осуществляется порядковый поиск первого вхождения символа.
Форма 2:
public int IndexOf(String value)
Форма 3:
public int IndexOf(String value, StringComparison comparisonType)
3. Метод LastIndexOf
Применяется для обнаружения последнего вхождения символа или
строки в исходной строке. Если нужное сочетание не найдено, то
возвращается значение –1.
Форма 1:
public int LastIndexOf(char value)
Форма 2:
public int LastIndexOf(String value)
Форма 3:
public int LastIndexOf(String value, StringComparison
comparisonType)
88
Во второй форме метода поиск последнего вхождения строки,
обозначаемой параметром value, осуществляется с учетом культурной
среды. А в третьей форме предоставляется возможность указать значение
типа StringComparison, обозначающее способ поиска. А если искомая
строка не найдена, то во второй и третьей формах данного метода
возвращается значение –1.
Пример
string str1 = "информатика";
string str2 = "и";
int k1 = str1.IndexOf(str2); // поиск первого вхождения буквы "и"
// в строку str2
int k2=str1.LastIndexOf(str2); // поиск последнего вхождения буквы
//"и" в строку str2
Console.WriteLine(k1);
Console.WriteLine(k2);
Программный код:
using System;
namespace C81
{
class Program
{
89
static void Main(string[] args)
{
// Продемонстрировать поиск в строке
string str="C# обладает эффективными средствами обработки строк";
int idx;
Console.WriteLine("Строка str: " + str);
idx=str.IndexOf('о');
Console.WriteLine("\nИндекс первого вхождения символа 'о':" + idx);
idx = str.LastIndexOf('о');
Console.WriteLine("\nИндекс последнего вхождения символа 'о':"+ idx);
if(str.EndsWith("строк", StringComparison.Ordinal))
Console.WriteLine("\nСтрока str оканчивается подстрокой \"строк\"");
Console.ReadLine();
}
}
}
90
Рисунок 7.3 – Результаты решения задачи 7.3
91
верхнем регистре (все буквы в вызывающей строке делает прописными)
Пример
text = text.ToUpper;
namespace C74
{
class Program
{
static void Main(string[] args)
{
string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Console.WriteLine("строка str: " + str);
Console.WriteLine();
// выделение подстроки
Console.Write("подстрока str.Substring(15) ");
string substr = str.Substring(15);
Console.WriteLine(substr);
Console.WriteLine();
// выделение подстроки
92
Console.Write("подстрока str.Substring(0, 15) ");
substr = str.Substring(0, 15);
Console.WriteLine(substr);
Console.ReadLine();
}
}
}
namespace C76
{
class Program
{
static void Main(string[] args)
{
string str = "это тест";
Console.WriteLine("Исходная строка: " + str);
// вставить строку
str = str.Insert(4, "простой ");
Console.WriteLine("Новая строка: " + str);
Console.ReadLine();
}
}
}
93
Результаты расчета см. рис. 7.5.
namespace C71
{
class Program
{
static void Main(string[] args)
{
string str = "это простой тест";
Console.WriteLine("Исходная строка: " + str);
// удалить часть строки
str = str.Remove(4,5);
Console.WriteLine("Новая строка: " + str);
94
Console.ReadLine();
}
}
}
namespace C70
{
class Program
{
static void Main(string[] args)
{
string str = "это простой тест";
Console.WriteLine("Исходная строка: " + str);
// заменить строку
str = str.Replace("простой", "непростой");
Console.WriteLine("Новая строка: " + str);
// заменить символы в строке
str = str.Replace('е', 'о');
95
Console.WriteLine("Новая строка: " + str);
Console.ReadLine();
}
}
}
namespace C82
{
class Program
{
static void Main(string[] args)
{
//Применение метода Contains()
string str = "C# сочетает эффективность с производительностью.";
if(str.Contains("эффективность"))
Console.WriteLine("Обнаружена подстрока \"эффективность\".");
if (str.Contains("эффе"))
Console.WriteLine("Обнаружена подстрока \"эффе\".");
96
if (!str.Contains("эффективный"))
Console.WriteLine("Подстрока \"эффективный\" не обнаружена.");
Console.ReadLine();
}
}
}
Форма 2:
public string Trim(params char[] trimChars)
Форма 2:
public string PadLeft(int totalWidth, char paddingChar)
97
В первой форме метода PadLeft() вводятся пробелы с левой
стороны вызывающей строки, чтобы ее общая длина стала равной
значению параметра totalWidth. А во второй форме данного метода
символы, обозначаемые параметром paddingChar, вводятся с левой
стороны вызывающей строки, чтобы ее общая длина стала равной
значению параметра totalWidth.
В обеих формах возвращается получающаяся в итоге строка.
Форма 1:
public string PadRight(int totalWidth)
Форма 2:
public string PadRight(int totalWidth, char paddingChar)
namespace C84
{
class Program
{
static void Main(string[] args)
{
// Пример обрезки и заполнения строк
string str = "тест";
Console.WriteLine("Исходная строка: " + str);
98
// Заполнить строку пробелами слева
str = str.PadLeft(10);
Console.WriteLine("|" + str + "|");
// Обрезать пробелы
str = str.Trim();
Console.WriteLine("|" + str + "|");
// Обрезать символы #
str = str.Trim('#');
Console.WriteLine("|" + str + "|");
Console.ReadLine();
}
}
}
99
Форма 1:
public string[] Split(params char[] separator)
Форма 2:
public string[] Split(params char[] separator, int count)
Форма 2:
public static string Join(string separator, string[] value, int
StartIndex, int count)
namespace C83
{
100
class Program
{
static void Main(string[] args)
{
// Разделить и соединить строки
string str = "Один на суше, другой на море.";
char[] seps = {' ', '.', ',' };
// Разделить строку на части
string[] parts = str.Split(seps);
Console.WriteLine("Результат разделения строки: ");
for (int i = 0; i <= (parts.Length - 1); i++)
Console.WriteLine(parts[i]);
// А теперь соединим части строк
string whole = string.Join("|", parts);
Console.WriteLine("Результат соединения строки: ");
Console.WriteLine(whole);
Console.ReadLine();
}
}
}
Форма 1:
public bool Equals(string value)
101
Выполняется порядковое сравнение с учетом регистра, но без учета
культурной среды.
Форма 2:
public bool Equals(string value, StringComparison comparisonType)
Форма 3:
public static bool Equals(string a, string b, StringComparison
comparisonType)
Пример
string str1;
string str2;
int k = str1.CompareTo(str2);
Создание массива
Способ 1:
string [] strArr = null;
strArr = new string[3];
103
strArr[0] = first;
strArr[1] = second;
strArr[2] = third;
namespace C75
{
class Program
{
static void Main(string[] args)
{
string[] strArr = new string[3] {"second", "first",
"third"};
for (int i = 0; i <= (strArr.Length - 1); i++)
Console.WriteLine(strArr[i]);
Console.WriteLine("\n");
// отсортируем массив строк
Array.Sort(strArr);
for (int i = 0; i <= (strArr.Length - 1); i++)
Console.WriteLine(strArr[i]);
Console.ReadLine();
}
}
}
104
Примечание. Если перед выводом содержимого массива строк
отсортировать его методом Sort() класса Array, то вывод строк будет
осуществлен в лексикографическом порядке.
где
argnum – это номер отображаемого аргумента, начиная с нуля;
105
width – минимальная ширина поля;
frm – спецификатор формата.
Параметры width и frm не являются обязательными. Поэтому в
своей простейшей форме команда форматирования просто указывает
конкретные аргументы для отображения. Например, команда {0}
указывает аргумент arg0, команда {1} – аргумент arg1 и т.д.
Если в команде форматирования указывается параметр frm, то
данные отображаются в указанном формате. В противном случае
используется формат, выбираемый по умолчанию. Если же в команде
форматирования указывается параметр width, то выводимые данные
дополняются пробелами для достижения минимально необходимой
ширины поля.
Пример
Double v=1723.56345;
Console.WriteLine(v={0:F2},v);
Результат:
v=1723.56
106
Окончание таблицы 7.2
1 2 3
G или g Формат общего вида. Применяется для см. спецификаторы E и F
вывода значений с фиксированной
точностью или в экспоненциальном формате
в зависимости от того, какой формат требует
меньшего количества позиций. По умолча-
нию для типа single – 7 позиций.
N или n Представление чисел с фиксированной Задает количество
точкой (и запятой в качестве разделителя десятичных разрядов
групп разрядов)
P или p Вывод числа в процентном формате Задает количество
десятичных разрядов
R или r Отмена округления числа при преобразова- Не используется
нии в строку.
X или x Вывод значений в шестнадцатеричном Задает минимальное
формате. количество цифр
Пример 1
double v=17455.34267;
string str=String.Format({0:F2},v);
Console.WriteLine(str);
Пример 2
string str=String.Format(Сумма:{0,3:D} Произведение:{1,8:D}, sum, prod);
Пример
double v=17455.34267;
107
string str= v.ToString(F2);
Console.WriteLine(str);
Примеры
Console.WriteLine({0:##.###}, a);
Console.WriteLine(a={0,6:#.##} b={1,5:#.###}, a, b);
Контрольные вопросы
108
ГЛАВА 8
КЛАССЫ, СТРУКТУРЫ, ПЕРЕЧИСЛЕНИЯ
Объектно-ориентированное программирование
Объектно-ориентированное направление программирования (ООП)
появилось в конце семидесятых годов XX века из-за необходимости
реализации больших проектов, которым уже не удовлетворяли
возможности структурного программирования.
Все программы на С# являются объектно-ориентированными.
ООП основано на следующих свойствах: абстракция, инкапсуляция,
полиморфизм и наследование.
Классы, объекты
Класс – разновидность абстрактного типа данных в ООП,
характеризуемый способом своего построения. Класс представляет собой
шаблон для создания объектов. Объекты являются экземплярами классов.
Класс – логическая абстракция, описание, по которому строятся объекты.
Объекты – реальные структуры реализации классов, занимающие после
создания оперативную память. Классы можно сравнить с чертежами, по
которым можно создать реальные объекты. Для создания класса выделяют
логически различимое направление рассматриваемой области
(абстракция). Классы, как и получаемые по их описаниям объекты, состоят
из объединения членов (инкапсуляция) – данных-полей и кода-методов.
Методы объектов близкой спецификации могут иметь одинаковые имена и
назначение, но выполнять действия, характерные для конкретного объекта
(полиморфизм). При необходимости получения новых возможностей
можно добавить дочернему классу недостающие члены, позаимствовав
уже существующие у родительского класса (наследование).
Абстракция
Абстракция – это придание объекту характеристик, которые
отличают его от всех других объектов, четко определяя его
109
концептуальные границы. Основная идея состоит в том, чтобы отделить
способ использования составных объектов данных от деталей их
реализации в виде более простых объектов, подобно тому, как
функциональная абстракция разделяет способ использования функции и
деталей её реализации в терминах более примитивных функций. Таким
образом, данные обрабатываются функцией высокого уровня с помощью
вызова функций низкого уровня.
Такой подход является основой объектно-ориентированного
программирования. Это позволяет работать с объектами, не вдаваясь в
особенности их реализации. В каждом конкретном случае применяется тот
или иной подход: инкапсуляция, полиморфизм или наследование.
Например, при необходимости обратиться к скрытым данным объекта,
следует воспользоваться инкапсуляцией, создав, так называемую,
функцию доступа или свойство.
Правильно сконструированный класс должен определять только
одну логическую сущность. Например, класс описания технологического
оборудования не содержит описание сотрудника и наоборот. В правильно
сконструированном классе должна быть сгруппирована логически
связанная информация, иначе структурированность кода будет нарушена.
Абстракция выделяет рассматриваемый объект, определяет набор данных,
описывающих его и действия, которые можно с ними производить.
Класс может иметь модификатор abstract, который указывает, что
описываемый класс является абстрактным, т.е. не может использоваться
для создания экземпляров, а только для создания дочерних классов.
Инкапсуляция
Инкапсуляция – свойство языка программирования, позволяющее
объединить и защитить данные и код в объекте и скрыть реализацию
объекта от пользователя (прикладного программиста). При этом
пользователю предоставляется только спецификация (интерфейс) объекта.
Пользователь может взаимодействовать с объектом только через этот
интерфейс. Реализуется с помощью ключевого слова: public.
Пользователь не может использовать закрытые данные и методы.
Реализуется с помощью ключевых слов: private, protected, internal.
110
Таблица 8.1 Модификаторы доступа, указывающие уровень доступ-
ности к членам класса
Объявленная доступность Описание
public Неограниченный доступ
protected Доступ ограничен содержащим классом или
типами, которые являются производными от
содержащего класса
internal Доступ ограничен текущей сборкой
protectedinternal Доступ ограничен текущей сборкой или типами,
которые являются производными от
содержащего класса
private Доступ ограничен содержащим типом
Полиморфизм
Полиморфизм (греч., множество форм) – возможность объектов с
одинаковой спецификацией иметь различную реализацию.
Полиморфизм позволяет писать более абстрактные программы и
повысить коэффициент повторного использования кода. Общие свойства
объектов объединяют в систему, которую могут называть по-разному –
интерфейс, класс. Общность имеет внешнее и внутреннее выражение:
внешняя общность проявляется как одинаковый набор методов с
одинаковыми именами и сигнатурами (именем методов и типами
аргументов и их количеством);
111
внутренняя общность – одинаковая функциональность методов. Её
можно описать интуитивно или выразить в виде строгих законов,
правил, которым должны подчиняться методы. Возможность
приписывать разную функциональность одному методу (функции,
операции) называется перегрузкой метода.
Наследование
Наследование – механизм ООП, позволяющий описать новый класс
на основе уже существующего (родительского), при этом свойства и
функциональность родительского класса заимствуются новым классом.
В дочернем классе можно переписать функциональность метода, уже
существующего в родительском классе, скрывая наследованные члены.
Для этого строку описания перекрывающего метода необходимо начать с
модификатора new (см. справку). Для расширения реализации
наследуемого члена вместо скрытия используется модификатор override
(см. справку). При наследовании нового класса от родительского, имя
родительского класса указывается через двоеточие.
Оператор new
Перед обращением к объекту, его нужно создвть, т.к. класс – всего
лишь абстракция, описание. Экземпляр объекта создается оператором new.
Переменная экземпляра объекта является ссылочной, т.е. хранит ссылку на
область памяти, в которой создан объект, а не сам объект. Присваивание
переменной, ссылающейся на объект другой переменной такого же типа,
заменит в ней ссылку на копию первой, что может быть причиной утери
ссылки на второй объект.
112
Поля и методы, имеющие модификатор static, создаются
автоматически при старте программы и описывают статический член,
принадлежащий всему типу, а не конкретному объекту. Модификатор
static можно использовать с классами, полями, методами, свойствами,
операторами, событиями и конструкторами, но нельзя – с индексаторами,
деструкторами или типами, отличными от классов. К статическим методам
относится метод Main(), который может быть только в одном классе, и с
которого начинается программа.
Конструкторы
При создании объекта, обычно сразу заполняют его поля
(присваивают значение), но при большом количестве полей некоторые из
них можно пропустить. Такой прием, хотя и не запрещен, не применяют в
профессиональном программировании. Для инициализации объектов
применяют так называемые конструкторы – код, похожий на методы. У
них отсутствует указанный явно возвращаемый тип, и их имя совпадает с
именем класса. Кроме присвоения начальных значений полям объекта,
конструкторы могут выполнять другие действия для формирования
полноценного объекта. В классе могут присутствовать несколько
конструкторов, различающихся количеством параметров. В случае
отсутствия конструкторов, С# добавляет конструктор по умолчанию,
который инициализирует все переменные объекта в значения по
умолчанию (числа – в ноль, строки и другие ссылочные типы – в null,
логические – false). После определения собственного конструктора,
конструктор по умолчанию не используется. Также конструкторами по
умолчанию называют явно заданные конструкторы, у которых
отсутствуют параметры. У конструктора практически всегда указывается
модификатор public для обеспечения доступа к конструктору извне класса.
Закрытие (private) конструкторы используется для явного обозначения
невозможности создания экземпляра данного класса при отсутствии у
класса полей или методов. Статический (static) конструктор используется
для инициализации статических данных или выполнения определенного
действия, которое необходимо выполнить только один раз, он вызывается
автоматически (его нельзя вызвать явно) перед созданием первого
113
экземпляра или ссылкой на какие-либо статические члены. Конструкторы
не наследуются, т.к. при отсутствии конструкторов используется
конструктор по умолчанию, в каждом классе необходимо явно описывать
свои конструкторы.
Текст программы:
using System;
namespace C137
{
class Obj1
{
public double x, y;
public Obj1() : this(0.0, 0.0) { }
public Obj1(double X, double Y) { x = X; y = Y; }
public Obj1(Obj1 Copy) : this(Copy.x, Copy.y) { }
public double Sum() { return x + y; }
public double Op() { return Sum() + 1; }
}
class Program
{
static void Main(string[] args)
{
Obj1 A1 = new Obj1(); A1.x = 1; A1.y = 2;
Obj2 A2 = new Obj2(3, 4); Obj1 A3;
Console.WriteLine("Obj1: " + A1.Sum() + " " + A1.Op() +
"\nObj2: " + A2.Sum() + " " + A2.Op());
114
A3 = A1; Console.WriteLine("1: " + A3.x + " " + A3.y);
A3 = A2; Console.WriteLine("2: " + A3.x + " " + A3.y);
A3 = new Obj2(A2);
Console.WriteLine("3: " + A3.x + " " + A3.y);
Console.ReadLine();
}
}
}
Рисунок 8.1
115
Sum() и Op(). Первый возвращает сумму x и y, второй – добавляет к сумме
единицу.
Второй класс Obj2 наследуется от класса Obj1, поэтому Obj2
содержит те же поля и методы, что и Obj1. Т.к. конструкторы не
наследуются, они описаны явно, но использование ключевого слова base
позволяет обратиться к коду родительского объекта с соответствующими
параметрами, поэтому сам код конструкторов отсутствует. Для
демонстрации в классе Obj2 наследуемый метод класса Obj1 Op() был
скрыт модификатором new и переписан с новым кодом (вместо единицы
добавляет двойку).
При запуске программы выполняется код статического метода
Main(), в котором объявляется ссылочная переменная А1 типа Obj1 и
присваивается ей ссылка на созданный в памяти оператором new
экземпляр объекта (по шаблону класса Obj1). При создании объекта
используется конструктор по умолчанию, обнуляющий значения полей.
Затем полям экземпляра объекта А1 присваиваются значения. Имена полей
(как и любых других членов) соединяются с именами содержащих их
объектов точкой. Такая запись присвоения полям значений допустима, но
не приветствуется, т.к. менее понятна, громоздка и прямое обращение к
полям может привести к ошибкам.
При создании экземпляра А2 класса Obj2 используется конструктор,
инициализирующий значения полей значениями аргументов, данный
метод является предпочтительным.
Ссылочная переменная А3 класса Obj1 только описывается, но ей не
присваивается никакого значения.
Далее оператором WriteLine выводятся результаты работы методов
объектов (для второго объекта результат выводится с новой строки "\n").
Заметьте, что у А2 наследуемый от Obj1 метод Sum() производит
вычисления со «своими» данными, как и метод Op().
Далее демонстрируется присвоение ссылки на объекты. Переменной
А3 присваивается ссылка на объект, хранящаяся в А1, и выводится
значение полей первого объекта. При этом А1 и А3 ссылаются на один и
тот же объект. Затем переменной А3 присваивается ссылка на второй
объект, хранящаяся в А2 и соответственно выводятся значения полей
116
второго объекта. Соответственно ссылки А2 и А3 ссылаются на один и тот
же объект.
И в конце програмы переменной А3 присваивается ссылка на
создаваемый новый экземпляр объекта класса Obj2.
2v0 sin
t Время движения
g
v sin
t1 0 Время подъема
g
v02 sin 2
h Высота подъема
2g
v02 sin 2
L Дальность полета
g
vk v0 Скорость тела в момент падения
Текст программы:
using System;
namespace C138
{
class Obj
{
public double v0, vk, L, t, t1, h, alfa;
public const double g = 9.8;
public Obj(double a, double v)
{
alfa = a * Math.PI / 180; v0 = v;
vk = v0; t1 = Time1(); t = Time();
L = Length(); h = Height();
}
117
public double Length()
{
return v0 * v0 * Math.Sin(2 * alfa) / g;
}
class Program
{
static void Result(int n, Obj R)
{
String Format = "A{0} пролетел {1:#.##} м " +
"за {2:#.##} с, поднявшись на {3:#.##} м "+
"(v0={4:#.##}, a={5:#.##})";
Console.WriteLine(Format,n,R.L,R.t,R.h,R.v0,R.alfa);
}
118
Результаты расчета см. рис.8.2.
Рисунок 8.2
8.2. Структуры
120
Задача 8.3. Программа демонстрирует применение структуры для
хранения информации о книге.
Программный код:
using System;
namespace C115
{
// Определить структуру
struct Book
{
public string Author;
public string Title;
public int Copyright;
public int stran;
// Применение структуры
class Program
{
static void Main(string[] args)
{
// Создаётся массив структур
Book[] X = new Book[30];
X[0].Author = "Павловская Т.А.";
X[0].Title = "C#. Программирование на языке высокого уровня";
X[0].Copyright = 2013;
X[0].stran=430;
X[1] = new Book("Герберт Шилдт", "Полный справочник по
C# 4.0", 2010, 900);
X[2]= new Book("Лукин С.Н.", "Понятно о Visual Basic.Net.
Самоучитель. В трёх томах", 2005, 800);
X[3] = new Book("Гусева О.Л.", "Практикум по Visual
Basic", 2007, 544);
for (int i = 0; i <= 3; i++)
Console.WriteLine(X[i].Author + " " + X[i].Title + " "
121
+ X[i].Copyright + "г " + X[i].stran + "с");
Console.ReadLine();
}
}
}
8.3. Перечисления
где
имя – имя типа перечисления,
список_перечисления – список идентификаторов, разделяемых
запятыми.
Пример
Объявляется перечисление Apple различных сортов яблок:
enum Apple { Jonathan, GoldenDel, RedDel, Winesap,
Cortland, McIntosh };
namespace C136
{
class Program
{
enum Apple { Jonathan, GoldenDel, RedDel, Winesap, Cortland,
McIntosh };
123
Результаты расчета см. рис.8.4.
Контрольные вопросы:
124
ГЛАВА 9
ФАЙЛЫ
125
1. Подключить пространство имен, в котором описываются
стандартные классы для работы с файлами (using System.IO).
2. Создать файловый поток и связать его с физическим файлом.
3. Произвести операции обмена (ввод-вывод).
4. Закрыть файл
где
"FileName" обозначает имя открываемого файла, включая и полный путь
к нему;
режим – порядок открытия файла
(FileMode.Open– открывает существующий файл,
FileMode.Create – создает новый выходной файл.
Существующий файл с таким же именем будет разрушен)
126
правило – проверять факт существования файла перед созданием объекта
типа FileStream с помощью статического метода Exists()
библиотечного класса File:
if (File.Exists (FileName))
{
…// здесь и создаем объект типа FileStream
}
Если файл с указанным именем не существует, а мы попытаемся
открыть его на чтение, то результат будет отрицательным (в смысле
возврата логического значения false методом Exists() класса File).
В то же время, попытка открыть файл на запись (в режимах
FileMode.Create и FileAccess.Write) всегда будет успешной: при
существующем файле его прежнее содержимое аннулируется, а при
несуществующем файле он автоматически создается.
Пример
FileStream fs = new FileStream("file1.dat", FileMode.Create,
FileAccess.Write);
Мы открываем на запись файл с именем file1.dat, которого ранее
не существовало.
Если при открытии файла путь к файлу не указан, то файл данных
ищется или создается в том же каталоге, где находится исполняемый файл
программы:
D:\ ProgramVS\ C95\ C95\ bin\ Debug\ file1.dat
При записи в тексте программы пути к файлу следует помнить, что
символ \ в строковых константах обозначает начало специальной
последовательности символов, например, \n. Поэтому при записи имени
файла символ \ следует продублировать, например
d:\\C#\\input.txt
Для чтения / записи числовых данных типа int или double лучше
создать объекты классов BinaryWriter и BinaryReader, чьи методы
Write() (перегружен для разных типов данных), ReadInt32() и
ReadDouble() как нельзя лучше подходят для этой задачи.
Проиллюстрируем работу методов Write(), ReadInt32() (для
127
чтения целых чисел типа int) и ReadDouble()(для чтения вещественных
чисел типа double) на примере следующей программы.
Программный код:
using System;
using System.IO;
namespace C95
{
class Program
{
static void Main(string[] args)
{
int m = 5;
double d = 8.34;
int iRes = 0;
double dRes = 0;
// Запись в файл
FileStream fsW = new FileStream("file1", FileMode.Create,
FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fsW);
bw.Write(m);
bw.Write(d);
bw.Close();
fsW.Close();
// Чтение файла
if (File.Exists("file1"))
{
FileStream fsr = new FileStream("file1", FileMode.Open,
FileAccess.Read);
BinaryReader br = new BinaryReader(fsr);
iRes = br.ReadInt32();
dRes = br.ReadDouble();
br.Close();
fsr.Close();
}
Console.WriteLine("iRes i= {0}; dRes = {1}", iRes, dRes);
128
Console.ReadLine();
}
}
}
namespace C96
{
129
class Program
{
static void Main(string[] args)
{
int[] iArr = {1,5,7,10,12 };
double[] dArr = {1.34, 3.56, 5.12, 7.45, 9.17};
int[] iArrRes = new int[5];
double[] dArrRes = new double[5];
int i;
// Запись в файл
FileStream fsW = new FileStream("file2", FileMode.Create,
FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fsW);
for (i = 0; i <= (iArr.Length - 1); i++)
bw.Write(iArr[i]);
for (i = 0; i <= (dArr.Length - 1); i++)
bw.Write(dArr[i]);
bw.Close();
fsW.Close();
// Чтение файла
if (File.Exists("file2"))
{
FileStream fsR = new FileStream("file2", FileMode.Open,
FileAccess.Read);
BinaryReader br = new BinaryReader(fsR);
for (i = 0; i <= (iArrRes.Length - 1); i++)
iArrRes[i] = br.ReadInt32();
for (i = 0; i <= (dArrRes.Length - 1); i++)
dArrRes[i] = br.ReadDouble();
br.Close();
fsR.Close();
}
for (i = 0; i <= (iArrRes.Length - 1); i++)
Console.WriteLine("iArrRes[{0}]={1};" +
"\tdArrRes[{0}]={2}", i, iArrRes[i], dArrRes[i]);
Console.ReadLine();
}
}
}
130
Рисунок 9.2 – Результаты решения задачи 9.2
Задача 9.3.
Программный код:
using System;
using System.IO;
namespace C97
{
class Program
{
static void Main(string[] args)
{
int[] iArr = { 1, 5, 7, 10, 12 };
int[] iArrRes = new int[8];
int i;
// Запись в файл
FileStream fsW = new FileStream("file3", FileMode.Create,
FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fsW);
for (i = 0; i <= (iArr.Length - 1); i++)
bw.Write(iArr[i]);
bw.Close();
fsW.Close();
// Чтение файла
131
if (File.Exists("file3"))
{
FileStream fsR = new FileStream("file3", FileMode.Open,
FileAccess.Read);
BinaryReader br = new BinaryReader(fsR);
i = 0;
while (br.PeekChar() != -1 && i < 8)
{
iArrRes[i] = br.ReadInt32();
i++;
}
br.Close();
fsR.Close();
}
for (i = 0; i <= (iArrRes.Length - 1); i++)
Console.WriteLine("iArrRes[{0}]={1}" , i, iArrRes[i]);
Console.ReadLine();
}
}
}
namespace C98
{
class Program
{
static void Main(string[] args)
{
string Str;
// Чтение файла
if (File.Exists("file5.txt"))
{
FileStream fsR = new FileStream("file5.txt",
FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
while ((Str = sr.ReadLine()) != null)
Console.WriteLine("Str= {0}", Str);
sr.Close();
fsR.Close();
}
Console.ReadLine();
}
}
}
134
Задача 9.5. Текстовые файлы
Программный код:
using System;
using System.IO;
namespace C99
{
class Program
{
static void Main(string[] args)
{
string str1 = "Текстовый";
string str2 = "редактор";
// Запись в файл
FileStream fsW = new FileStream("file6", FileMode.Create,
FileAccess.Write);
StreamWriter sw = new StreamWriter(fsW);
sw.WriteLine(str1);
sw.WriteLine(str2);
sw.Close();
fsW.Close();
// Чтение из файла
FileStream fsR = new FileStream("file6", FileMode.Open,
FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
str1 = sr.ReadLine();
str2 = sr.ReadLine();
sr.Close();
fsR.Close();
Console.WriteLine("str1= {0}\nstr2= {1}\n", str1, str2);
Console.ReadLine();
}
}
}
Результаты расчета см. рис. 9.5.
Программный код:
using System;
using System.IO;
namespace C100
{
class Program
{
static void Main(string[] args)
{
string Name, str;
int ind;
Console.Write("Введите фамилию: ");
Name = Console.ReadLine();
// Чтение файла
136
if (File.Exists("file8.txt"))
{
FileStream fsR = new FileStream("file8.txt",
FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
while ((str = sr.ReadLine()) != null)
{
ind = str.IndexOf(Name, 0);
if (ind != -1)
{
Console.WriteLine("---------------------");
Console.WriteLine("{0}", str);
}
}
sr.Close();
fsR.Close();
}
Console.WriteLine("----------------------\n");
Console.WriteLine("Конец");
Console.ReadLine();
}
}
}
Контрольные вопросы
137
ГЛАВА 10
ЛАБОРАТОРНЫЙ ПРАКТИКУМ
Цель работы:
для консольного приложения: изучить операторы объявления и инициализации
переменных и констант; операторы присваивания, комментарии; методы ввода/ вывода:
Console.Write(), Console.WriteLine(), Console.Read(), Console.ReadLine()
138
Пуск /Программы /Программирование /Microsoft Visual Studio 2012
/ ∞ Microsoft Visual Studio 2012
Загрузить систему можно также при помощи ярлыка на панели
быстрого запуска.
После загрузки Visual Studio отображается окно, основное
пространство которого занимает Начальная страница, содержащая
команды создания и открытия проектов, ссылки на последние проекты,
справочные материалы, расширения Visual Studio, ресурсы сообщества.
Начальный пользовательский интерфейс представлен на рис. 10.2.
a 3,2
b 17,5
x 4,8
a
y btg 2 x 2
sin ( x a)
a
d a e cos(bx a )
139
Рисунок 10.2 – Начальный пользовательский интерфейс Visual C# 2012
140
Рисунок 10.3 – Окно Создать проект
141
После строки static void Main() начинаем вводить программный код.
Программный код :
using System; // Подключение стандартных библиотек
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace С1
{
class Program
{
static void Main(string[] args)
{
// Программа 1
const double a = 3.2, b = 17.5, x = -4.8;
double y, d;
y = b * Math.Pow(Math.Tan(x),2) - a/Math.Pow(Math.Sin(x/a),2);
d = a * Math.Exp(-Math.Sqrt(a)) * Math.Cos(b * x / a);
Console.WriteLine("y={0,9:F3}; d={1,8:F4}", y, d);
Console.WriteLine("Нажмите Enter для выхода");
Console.ReadLine(); // Задержка консольного окна на дисплее
}
}
}
3. Вызовите контекстное меню редактора, нажав правой кнопкой
мыши на пустом месте в окне редактирования кода. Выполните команду
Управление директивами using/Удалить неиспользуемые директивы using.
Ниже представлена программа после выполнения команды.
Программный код :
using System; //Подключение стандартных библиотек
namespace С1
{
class Program
{
static void Main(string[] args)
{
// Программа 1
const double a = 3.2, b = 17.5, x = -4.8;
142
double y, d;
y = b * Math.Pow(Math.Tan(x), 2)- a/Math.Pow(Math.Sin(x/a),2);
d = a * Math.Exp(-Math.Sqrt(a)) * Math.Cos(b * x / a);
Console.WriteLine("y={0,9:F3}; d={1,8:F4}", y, d);
Console.WriteLine("Нажмите Enter для выхода");
Console.ReadLine();
}
}
}
Пояснение к программе:
1) using System;
Приложение начинается с директив использования пространств имён
библиотеки .NET. Строка using System; означает, что в программе
используется пространство имён System. В C# пространство имён
определяет область объявлений. Мы вынуждены использовать
пространства имен тех библиотек, средства которых применяются в наших
программах. Пространство имён System объединяет те классы из
библиотеки классов среды .NET Framework, которые наиболее часто
используются в консольных программах на C#.
143
Применение в программе библиотеки классов предполагает либо
создание объектов классов этой библиотеки, либо обращения к
статическим полям и методам библиотечных классов. Из пространства
имён System в нашей программе используется класс Console и два
статических метода этого класса WriteLine() и ReadLine(). Поместив в
программу оператор using System, можно обращаться к названным
методам с помощью сокращённых составных имён Console.WriteLine() и
Console.ReadLine(). Если эту строку не писать, то тогда при записи в
программе, например метода Console.WriteLine() надо будет указывать
пространство имён, к которому этот метод принадлежит, т.е.
System.Console.WriteLine(). Указывать пространство имён System
всякий раз, когда используется член этого пространства, – утомительное
занятие, и поэтому большинство программистов на C# вводят директиву
using System в начале своих программ.
2) namespace С1
Это объявление вводит для программы собственное пространство
имён с обозначением С1. Это имя мы определили при создании проекта.
Программа содержит созданный автоматически класс (Program), а в
составе этого класса – метод Main().
3) class Program
В соответствии с объектной ориентацией языка C# всякая программа
на языке C# представляет собой класс или совокупность классов. В нашей
программе ключевым словом class объявляется класс с именем Program.
Имя класса можно выбирать произвольно. Далее в фигурных скобках –
тело класса. В классе Program только один метод с заголовком
static void Main().
144
означают, что этому методу не передается никакой информации. Весь код,
составляющий тело метода, находится между открывающими и
закрывающими фигурными скобками.
6) // Программа 1
Это однострочный комментарий, начинается с символов //, область
действия которого распространяется до конца строки, используется для
кратких пояснений.
Многострочные комментарии ограничиваются символами /* */.
Пример записи многострочного комментария
/* Программа для работы с файлами
последовательного доступа */
8) double y, d;
Объявляются две переменные y и d – вещественные (дробные) числа
двойной точности типа double. Переменные должны быть объявлены до
их применения. Для объявления переменной (переменных) сначала
указывается тип, а затем имя (имена, разделенные запятой).
Для вещественных переменных чаще используется тип double, для
целых – тип int. При объявлении переменной (указания имени и типа) под
эту переменную будет зарезервирован участок компьютерной памяти
соответствующего размера. В этом участке и будет храниться числовое
значение переменной.
145
9) y = b * Math.Pow(Math.Tan(x), 2) - a / Math.Pow(Math.Sin(x /a),2);
Оператор присваивания. Математические функции C# являются
методами класса Math. Их можно увидеть, набрав Math и поставив (.). В
выпадающем списке вы увидите множество математических функций: abs,
sin, cos… и др. и две константы E=2,71 (основание натуральных
логарифмов) и PI=3,14 (число диаметров, уложенных вдоль окружности).
Результат вычисления математической функции – тип double, аргументы
функций также должны быть типа double, например, sin(double x).
12) Console.ReadLine();
146
Используется для организации ожидания нажатия клавиши <Enter>
после завершения консольной программы (при отладке, чтобы окно
результатов не закрывалось сразу после завершения программы).
Два последних оператора используются для задержки консольного
окна на дисплее.
namespace C2
{
class Program
{
static void Main(string[] args)
{
// Программа 2
double a, b, x, y, d;
a = 3.2; b = 17.5; x = -4.8;
y = b * Math.Pow(Math.Tan(x), 2) - a/Math.Pow(Math.Sin(x/a),2);
d = a * Math.Exp(-Math.Sqrt(a)) * Math.Cos(b * x / a);
Console.WriteLine("y={0,9:F3}; d={1,8:F4}", y, d);
Console.WriteLine("Нажмите Enter для выхода");
Console.ReadLine();
}
}
}
147
Пояснение к программе:
1) a = 3.2; b = 17.5; x = -4.8;
Значения исходным данным задаем при помощи операторов
присваивания. В коде программы при записи вещественных чисел
десятичным разделителем является < . >, но при работе программы в
операциях ввода/ вывода используется десятичный разделитель, указанный
в настройках системы < , >.
a
y btg 2 x 2
sin ( x a )
a
d a e cos(bx a )
namespace C3
{
class Program
{
static void Main(string[] args)
{
//Программа 3
double a, b, x, y, d;
Console.WriteLine(" Введите a, b, x: ");
a = Convert.ToDouble(Console.ReadLine());
b = Convert.ToDouble(Console.ReadLine());
x = Convert.ToDouble(Console.ReadLine());
Console.WriteLine();
y = b * Math.Pow(Math.Tan(x), 2) - a/Math.Pow(Math.Sin(x/a),2);
d = a * Math.Exp(-Math.Sqrt(a)) * Math.Cos(b * x / a);
Console.WriteLine("y={0,9:F3}; d={1,8:F4}", y, d);
Console.WriteLine("Нажмите Enter для выхода");
Console.ReadLine();
}
}
}
Пояснение к программе:
1) Console.WriteLine(" Введите a, b, x: ");
149
Метод выводит на консоль (экран) строку символов
Введите a, b, x:
Курсор переводится на новую строку.
2) a = Convert.ToDouble(Console.ReadLine());
b = Convert.ToDouble(Console.ReadLine());
x = Convert.ToDouble(Console.ReadLine());
Операторы присваивания. Переменным a, b, x присвоить
значение, вводимое с консоли (клавиатуры).
Пользователь в ответ на приглашение «Введите a, b, x:» вводит с
клавиатуры числа: значения переменных, заканчивая ввод каждого числа
нажатием клавиши Enter.
Метод Console.ReadLine() вводит строку символов.
Функция Convert.ToDouble конвертирует (преобразует) текст в
числовой тип двойной точности.
Когда в программе встречается оператор ReadLine() ее действие
приостанавливается до тех пор, пока не будет введено исходное данное.
150
Рисунок 10.9 – Начальный пользовательский интерфейс Visual C# 2012
2. Создать проект.
Вызвать команду Создать проект, которая располагается слева
начальной страницы.
В окне Создать проект (рис. 10.10) в левой колонке находится
список инсталлированных шаблонов (Installed Templates). Среди них –
шаблоны языков программирования, встроенных в Visual Studio, в т.ч.
Visual Basic, Visual C#, Visual C++ и др. Нам нужен язык VisualC#.
Над центральной панелью должна быть выбрана версия
.NET Framework 4. В средней колонке выберем шаблон (Templates)
Приложение Windows Forms Visual C#.
Зададим имя: W1 →OK
При создании нового проекта среда сформирует шаблон Windows-
приложения. В результате увидим окно, представленное на рис. 10.11. В
этом окне изображена экранная форма – Form1, в которой программисты
располагают различные компоненты графического интерфейса пользова-
теля или, как их иначе называют, элементы управления. Это поля для
ввода текста TextBox, командные кнопки Button, метки Label и др.
151
Рисунок 10.10 – Окно Создать проект
152
3. Проверить, чтобы были загружены панель элементов и панель
свойств.
Вид / Панель элементов / Стандартные элементы управления
Вид / Окно свойств
153
Окончание таблицы 10.1
1 2 3
Выделить метки Label1-Label4 TextAlign TopCenter
( клавиша[Shift] +мышь) и установить Font Times New Roman, обычный, 12
одинаковые для всех меток свойства
Текстовое поле TextBox1 Name txta
Text 3,2
Текстовое поле TextBox2 Name txtb
Text 17,5
Текстовое поле TextBox3 Name txtx
Text -4,8
Выделить текстовые поля TextBox1 – TextAlign Center
TextBox3 и установить одинаковые для всех Font Times New Roman, обычный, 12
полей свойства
Командная Button1 Name cmdStart
кнопка Text Вычислить
Font Times New Roman, жирный, 12
Командная Button2 Name cmdEnd
кнопка Text Завершение работы
Font Times New Roman, жирный, 12
ПрефиксИмя,
154
где Имя – информативное с точки зрения функционального
назначения имя объекта.
Ниже приведены примеры использования префиксов для задания
имен объектов.
6. Программирование.
Прежде чем приступить к программированию, необходимо
определить те события, для которых необходимо разработать алгоритмы и
описать их на языке программирования. В нашем примере есть следующие
события: щелчок мышью по командной кнопке <Вычислить> и щелчок
мышью по командной кнопке <Завершение работы>. Создадим методы для
обработки этих событий (обработчики событий). В теле обработчиков
событий программист пишет код, который будет выполняться при
наступлении события.
}
В качестве имени метода присваивается имя элемента управления, за
которым следует символ подчеркивания и имя обрабатываемого события –
cmdStart_Click (рис. 10.14).
Заполним этот обработчик.
155
Рисунок 10.14 – Вкладка программного кода
Программный код :
using System;
using System.Windows.Forms;
namespace W1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
156
a = Convert.ToDouble(txta.Text);
b = Convert.ToDouble(txtb.Text);
x = Convert.ToDouble(txtx.Text);
y = b*Math.Pow(Math.Tan(x), 2)-a/Math.Pow(Math.Sin(x/a), 2);
d = a * Math.Exp(-Math.Sqrt(a)) * Math.Cos(b * x / a);
label4.Text = "y= " + y.ToString("F3") + " d= " +
d.ToString("F4");
}
157
Пояснение к программе:
1) using System.Windows.Forms;
Пространство System.Windows.Forms содержит огромное количество
типов, являющихся строительными блоками Windows- приложений.
2) a = Convert.ToDouble(txta.Text);
Оператор присваивания. Переменной a присвоить значение,
вводимое в текстовое поле с именем txta. Visual C# считает содержимое
текстового поля текстом, а не числом, если даже оно состоит из цифр.
Следовательно, переменные, берущие свое значение из текстового поля,
язык Visual C# тоже считает текстовыми, а не числовыми. Функция
Convert.ToDouble конвертирует (преобразует) текст в числовое
вещественное значение двойной точности (конвертирует строковую
переменную txta.Text в число a).
158
10.1.2 Задачи для выполнения лабораторных работ – часть 1
159
Окончание таблицы 10.2
1 2 3
8 f 3 m tg t c sin t m 2; c 1
t 1,2; b 0,7
z m cos(bt sin t ) c
9 y ln 3 (1 x 2 ) x 1, 45
7x 2
F sin x 2 cos
3,75
10 f ln(a x 2 ) sin 2 ( x b) a 10,2; b 9, 2
cx x xa x 2,2; c 0,5
ze
x x b
160
Ниже приведен рекомендуемый вид экрана программы
Вычисление площади треугольника
Введите длину стороны треугольника a –> 25
Введите длину стороны треугольника b –> 17
Введите величину угла между сторонами треугольника –> 30
161
Окончание таблицы 10.3
1 2 3
Math.Sign(x) Знак числа.
Возвращает значение, определяющее знак
1 x0
целого числа. Sign( x) 0 если x 0
1 x0
Math.Sin(x) sin x Синус угла x . Угол x задается в радианах.
Math.Sqrt(x) x Корень квадратный из числа x , где x 0
Унарный плюс + +а
162
Таблица 10.5 – Операторы сравнения и логические операторы
Операторы сравнения Логические операторы
Оператор Знак Оператор Значение
равно == & логическое И (AND)
не равно != | логическое ИЛИ (OR)
больше > ^ логическое исключающее ИЛИ (XOR)
меньше < && условное И (AND)
больше или равно >= || условное ИЛИ (OR)
меньше или равно <= ! логическое отрицание НЕ (NOT)
Цель работы:
для консольного приложения: изучить операторы ветвления if и switch
163
Начало
a = 5.2
Ввод
x
нет
x<0
да
y x2 5 a y 12 a
Вывод
x, y
Конец
Программный код :
using System;
namespace C4
{
class Program
{
static void Main(string[] args)
{
double a, x, y;
a = 5.2;
164
Console.Write("Введите x= ");
x = Convert.ToDouble(Console.ReadLine());
if (x<0)
y=x*x+5/a;
else
y=12+a;
Console.WriteLine("x={0,6:F2}; y={1,6:F3}", x, y);
Console.ReadLine();
}
}
}
1 cos a y y 1
f (ay b) 2 если 1 y 4
a 1 y4
165
y 1 1 y 4
f 1 cos a y f (ay b) 2 f a 1
Программный код:
using System;
namespace C5
{
166
class Program
{
static void Main(string[] args)
{
double a, b, y, f;
a = 0.2; b = 0.001;
Console.Write(" Введите y= ");
y = Convert.ToDouble(Console.ReadLine());
if (y < 1)
f = 1 - Math.Cos(a) - y;
else if ((1 <= y) && (y <= 4))
f = (a * y + b) / 2;
else
f = a + 1;
Console.WriteLine("y={0,6:F2}; f={1,6:F3}", y, f);
Console.ReadLine();
}
}
}
167
Пояснение к программе:
Математическое выражение 1 y 4 в языке программирования С#
разделяется на два выражения, объединенные оператором && (И):
(1 <= y) && (y <= 4).
Т.к. операции сравнения имеют более высокий приоритет чем
логические, то скобки можно не ставить:
1 <= y && y <= 4.
ПОРЯДОК ДЕЙСТВИЙ
3. Программирование.
Напишите обработчики событий щелчок мышью по командной кноп-
ке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W2
{
169
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
3)listBox1.Items.Add(str);
Вывод данных (текстовой строки) в поле ListBox. Элемент управления ListBox –
поле списка. Для добавления элементов в список программным способом предназначен
метод Add коллекции Items элемента ListBox.
Программный код:
using System;
namespace C6
{
class Program
{
static void Main(string[] args)
{
double x, z, y;
Console.Write(" Введите x= ");
x = Convert.ToDouble(Console.ReadLine());
Console.Write(" Введите z= ");
z = Convert.ToDouble(Console.ReadLine());
if (x > 0 && z > 0)
y = Math.Pow((x * z), 2);
else if (x < 0 && z < 0)
y = Math.Pow(x, -z);
else
y = 5;
171
Console.WriteLine("x={0}; z={1}; y={2} ", x, z, y);
Console.ReadLine();
}
}
}
x x0
3
x 6 x 1
y x 2 2 если 2 x 7
x
3 x 0 или x 100
5 в противном случае
172
yx
y x3 6
2 x7 y x2 2
yx
3
y5
Программный код:
using System;
namespace С7
{
173
class Program
{
static void Main(string[] args)
{
double x, y;
Console.Write("Введите x= ");
x = Convert.ToDouble(Console.ReadLine());
if (x == 0)
y = x;
else if (x == 1)
y = x * x * x + 6;
else if (2 <= x && x <= 7)
y = x * x + 2;
else if (x < 0 || x > 100)
y = x / 3;
else
y = 5;
Console.WriteLine("x={0}; y={1} ", x, y);
Console.ReadLine();
}
}
}
174
Задача 10.6. Пример программы, которая запрашивает у
пользователя номер дня недели и затем выводит его название. Если
введены неправильные данные, программа должна вывести сообщение об
ошибке. Используется оператор switch.
Программный код:
using System;
namespace C8
{
class Program
{
static void Main(string[] args)
{
int nom;
Console.Write("Введите номер дня недели -> ");
nom = Convert.ToInt32(Console.ReadLine());
switch (nom)
{
case 1:
Console.WriteLine("Понедельник" );
break;
case 2:
Console.WriteLine("Вторник");
break;
case 3:
Console.WriteLine("Среда");
break;
case 4:
Console.WriteLine("Четверг");
break;
case 5:
Console.WriteLine("Пятница");
break;
175
case 6:
Console.WriteLine("Суббота");
break;
case 7:
Console.WriteLine("Воскресенье");
break;
default:
Console.WriteLine("Число должно быть в диапазоне 1..7");
break;
}
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C7a
{
class Program
{
176
static void Main(string[] args)
{
double a, b, c, D, x1, x2;
Console.WriteLine(" Введите a, b, c: ");
a = Convert.ToDouble(Console.ReadLine());
b = Convert.ToDouble(Console.ReadLine());
c = Convert.ToDouble(Console.ReadLine());
Console.WriteLine();
D = b * b - 4 * a * c;
if (D >= 0 && a != 0)
{
x1 = (-b + Math.Sqrt(D)) / (2 * a);
x2 = (-b - Math.Sqrt(D)) / (2 * a);
Console.WriteLine("x1={0}; x2={1}", x1, x2);
}
else
{
Console.WriteLine(" Нет решения ");
}
Console.ReadLine();
}
}
}
177
Таблица 10.7 – Варианты задач
№ Функция Исходные данные
вар.
1 2 3
1 x 0,5; y 2,5
x2 2x y x 0, y 0
x 2,31; y 4, 2
z x y если x 0, y 0 x 5; y 7
x y в ост. случаях
2 sin 2 x x0 с 1,57
3 x 3; 2,5; 0
y ln (1 x 2 ) если x 0
x c x0
3 y 3 0,3 y0 y z 2;
z 3; 1,5; 0
g 0 если 0 y 1
2 y 1
y y
4
( xy ) z y 0, z 0 y 1; 0,5; 0
c ( x 5 y z ) 2 если y 0, z 0 z 0,5; 1,5; 3
0 остальное x 0,5
5
(t 2 1)bc t 0
b 0,5; c 1, 2;
m 1/ (t 1) если 0 t 4
2 t 2; 3; 5, 67
sin (t 1) t4
6
at 2 lnt 1 t 2 a 0,5
y 1 если t 1 b2
at t2 t 1,5; 0,5; 2,3
e cos bt
7
x 3 x a xa
a 2,5
x sin ax если x a
ax x 3; 2,5; 1
e cos ax xa
178
Окончание таблицы 10.7
1 2 3
8
4a 2 b a 0, b 0 a 2; b 5;
z 2cos a ln b если a 0, b 0 a 3,5; b 7;
a 12 a 0, b 0 a 8; b 12;
9
x x 1
3
x 6 1 x 2
y если x 0,5; 1, 2; 2; 4
2 x2
x 2
0 x2
10
ax3 a cos 2 x x0
ax 2 bx x0 a 2; b 1
g если
b x0 и x 2 x 2; 0; 3,5; 1,5
ax b x0
179
Исходные данные:
тип топлива (бензин 92, 95, 98 или дизельное топливо);
количество литров.
Использовать оператор выбора switch.
Ниже приведен рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Бензин
Марка бензина:
1 – 92
2 – 95
3 – 98
4 – DT
Ваш выбор –> 2
Литров –> 25
--------------------------
Цена за литр: 10 грн.
Литров: 25
Фото
Размер:
1 – 9×12
2 – 10×15
3 – 18×24
Ваш выбор –> 1
Количество –> 12
-----------------------
180
Цена: 3.50 грн.
Количество: 12 шт.
Сумма: 42.00 грн.
Скидка: 4.20 грн.
К оплате: 37.80 грн.
10.3 Циклы
Цель работы:
для консольного приложения: изучить операторы цикла: for, while, do-while.
181
Программный код:
using System;
namespace C9
{
class Program
{
static void Main(string[] args)
{
double x, y; // аргумент и значение функции
double xn = -2.0; // начальное значение переменной x
double xk = 2.0; // конечное значение переменной x
double dx = 0.5; // шаг изменения переменной
Console.WriteLine("-------------------");
Console.WriteLine(" x y ");
Console.WriteLine("-------------------");
for (x = xn; x <= xk; x = x + dx)
{
y = -2.4 * x * x + 5 * x - 3;
Console.WriteLine("{0,6:F2}\t {1,6:F3}", x, y);
}
Console.ReadLine();
}
}
}
Пояснение:
1) Console.WriteLine("{0,6:F2}\t {1,6:F3}", x, y);
182
Выводит строку результатов в заданном формате в консольное окно.
Строковая константа "{0,6:F2}\t {1,6:F3}" содержит управляющую
последовательность символов \t – горизонтальная табуляция
namespace C10
{
class Program
{
static void Main(string[] args)
{
double x, y; // аргумент и значение функции
double xn = -2.0; // начальное значение переменной x
double xk = 2.0; // конечное значение переменной x
double dx = 0.5; // шаг изменения переменной
Console.WriteLine("-------------------");
Console.WriteLine(" x y ");
Console.WriteLine("-------------------");
x = xn;
while (x <= xk)
{
y = -2.4 * x * x + 5.0 * x - 3.0;
Console.WriteLine("{0,6:F2}\t {1,6:F3}", x, y);
x = x + dx;
}
Console.ReadLine();
}
}
}
183
Программный код:
using System;
namespace C11
{
class Program
{
static void Main(string[] args)
{
double x, y; // аргумент и значение функции
double xn = -2; // начальное значение переменной x
double xk = 2; // конечное значение переменной x
double dx = 0.5; // шаг изменения переменной
Console.WriteLine("-------------------");
Console.WriteLine(" x y ");
Console.WriteLine("-------------------");
x = xn;
do
{
y = -2.4 * x * x + 5 * x - 3;
Console.WriteLine("{0,6:F2}\t {1,6:F3}", x, y);
x = x + dx;
}
while (x <= xk);
Console.ReadLine();
}
}
}
ПОРЯДОК ДЕЙСТВИЙ
184
Рисунок 10.30 – Форма к задаче 10.8
185
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
186
Рисунок 10.32 – Результаты решения задачи 10.8
Пояснение:
1)listBox1.Items.Add(x.ToString("F2") + "\t" + y.ToString("F3"));
Вывод данных в поле listBox. Строковая константа "\t" содержит управляющую
последовательность символов \t – горизонтальная табуляция.
Программный код:
using System;
namespace C12
{
class Program
{
static void Main(string[] args)
{
int i, k;
double p;
Console.Write(" Введите k= ");
k = Convert.ToInt32(Console.ReadLine());
p = 1;
for (i = 1; i <= k; i++)
p = p * i;
Console.WriteLine("{0}! = {1}", k, p);
187
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C16a
{
class Program
{
static void Main(string[] args)
{
int n; // кол-во суммируемых членов ряда
int i; // номер элемента ряда
double elem; // значение элемента ряда
double sum; // сумма элементов ряда
Console.Write("Введите количество суммируемых членов ряда n->");
n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(" n= " + n);
sum = 0;
for (i = 1; i <= n; i = i + 1)
{
elem = 1.0 / i;
188
sum = sum + elem;
}
Console.WriteLine();
Console.WriteLine(" Сумма первых {0} членов ряда =
{1,6:F4} ", n, sum);
Console.ReadLine();
}
}
}
t , x0
y t x если 0 x 10
2t x 10
при t =5.
Программа должна выводить таблицу, состоящую из двух столбцов:
значений аргумента и соответствующих им значений функции.
Программный код:
using System;
namespace C16
{
class Program
{
static void Main(string[] args)
{
double x, y, t=5;
double xn = -2; // начальное значение аргумента
189
double xk = 12; // конечное значение аргумента
double dx = 2; // шаг изменения аргумента
// заголовок таблицы
Console.WriteLine("------------------");
Console.WriteLine(" x y ");
Console.WriteLine("------------------");
// расчет и вывод таблицы
for (x = xn; x <= xk; x = x + dx)
{
if (x<0)
y=t;
else if (0<=x && x<10)
y=t*x;
else
y=2*t;
Console.WriteLine("{0,6:F2}\t {1,6:F3}", x, y);
}
Console.ReadLine();
}
}
}
R S1 S2
1.00 12.566 1.571
. . .
. . .
. . .
. . .
1.40 24.630 3.079
191
Задача 9. Написать программу, которая выводит таблицу значений
функции:
3sin 3 ( x) 2,3
y для 3 x 9, с шагом h = 0,5;
x 2cos3 ( x )
y sin 3 ( x ) 0,6 x2 для 1 x 10, с шагом h = 1.
192
всех чисел от 0 до x с шагом 0,1. Задачу решить двумя способами – с
использованием операторов for и while.
193
7×5=35
7×6=42
7×7=49
7×7=56
7×9=63
Цель работы:
для консольного приложения: изучить операторы объявления массивов, способы
наполнения массивов, ввод- вывод элементов массивов, накопление суммы и
произведения элементов массивов., сортировку элементов массива, а также нахождение
максимального элемента одномерного массива и его индекса.
для Windows-приложения: изучить элементы управления: метка Label, кнопка Button,
поле ввода TextBox, список ListBox, комбинированное окно ComboBox.
namespace С21
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
int i; double z, s;
double[] Y = new double[n] { 1.0, 2.5, 3.7, 4.8, 5.0, 6.2,
7.3, 8.0, 9.5, 10.0, 12.0, 14.0 };
Console.WriteLine("Элементы массива: ");
// Вывод элементов массива
for ( i = 0; i <= n-1; i = i + 1)
Console.WriteLine( " " + Y[i]);
// Накопление суммы элементов с 4-го по 10-ый
s = 0;
for (i = 4; i <= 10; i = i + 1)
s = s + Y[i];
z = s;
Console.WriteLine();
Console.WriteLine("Сумма элементов массива= {0}", z);
Console.ReadLine();
}
}
}
Результаты расчета см. рис.10.36.
Программный код:
using System;
namespace C23
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
double [] Y = new double[n];
int i; double z, s;
Console.WriteLine("Элементы массива: ");
Console.WriteLine();
for (i = 0; i <= n-1; i = i + 1)
{
Y[i] = i / 2.0 + 7;
Console.WriteLine("Y[{0}]={1} ", i, Y[i]);
}
s = 0;
for (i = 4; i <= 10; i = i + 1)
s = s + Y[i];
z = s;
Console.WriteLine("\nСумма элементов массива= {0}", z);
Console.ReadLine();
}
}
}
196
Рисунок 10.37 – Результаты решения задачи 10.12
Пояснение:
1)double [] Y = new double[n];
Объявляется массив Y из n вещественных чисел типа double , при этом все n элемен-
тов автоматически (неявно) инициализируются нулями;
n может быть не только константой, но и выражением типа, приводимого к целому.
2)Y[i] = i/2.0 + 7;
Если написать Y[i] = i/2+7; получим деление целых чисел. При делении целых
чисел остаток будет отброшен, чтобы этого не произошло необходимо менять тип хотя
бы одного из них, т.е. i/2.0.
Программный код:
using System;
namespace C24
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
double[] Y = new double[n];
int i; double z, s;
Console.WriteLine("Ввод элементов массива: ");
197
for (i = 0; i <= n-1; i = i + 1)
{
Console.Write("Введите " + i + "элемент массива = ");
Y[i] = Convert.ToDouble(Console.ReadLine());
}
Console.WriteLine();
Console.WriteLine("Вывод элементов массива: ");
for (i = 0; i <= n-1; i = i + 1)
{
Console.WriteLine("Y[{0}]={1} ", i, Y[i]);
}
s = 0;
for (i = 4; i <= 10; i = i + 1)
s = s + Y[i];
z = s;
Console.WriteLine("Сумма элементов массива= {0} ", z);
Console.ReadLine();
}
}
}
Результаты расчета см. рис.10.38.
namespace C26
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
double[] Y = new double[n];
int i; double z, s;
Random rnd = new Random();
Console.WriteLine("Элементы массива: ");
for (i = 0; i <= n-1; i = i + 1)
{
Y[i] = rnd.NextDouble()*10;
Console.WriteLine("Y[{0}]={1,5:F2} ", i, Y[i]);
}
s = 0;
for (i = 4; i <= 10; i = i + 1)
s = s + Y[i];
z = s;
Console.WriteLine();
Console.WriteLine("Сумма элементов массива= {0,6:F3}", z);
Console.ReadLine();
}
}
}
Результаты расчета см. рис.10.39.
ПОРЯДОК ДЕЙСТВИЙ
1. Расположите на форме объекты, как показано на рис. 10.40, 10.41.
На форме расположить: две метки (Label), одно поле списка
(ListBox), две командных кнопки (Button).
200
Рисунок 10.41 – Форма к задаче 10.12
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
201
// Вывод элементов массива в поле списка
listBox1.Items.Add( Y[i].ToString("F2"));
}
s = 0;
for (i = 4; i <= 10; i = i + 1)
s = s + Y[i];
z = s;
Console.WriteLine();
label2.Text=("Сумма элементов массива\n с 4-го по 10-ый = "
+ z.ToString("F3"));
}
Пояснение:
1)double[] Y = new double[n];
Объявляется массив Y из n вещественных чисел типа double и
одновременно все элементы массива автоматически (неявно)
инициализируются нулями.
202
2) listBox1.Items.Add( Y[i].ToString("F2"));
Вывод элементов массива Y в поле listBox1. При выводе числа его
необходимо преобразовать в последовательность символов, т.е. в строку.
Для этого применяется метод ToString(). В качестве параметра функции
ToString() указана символьная константа, которая задаёт формат строки-
результата. Символьная константа "F2" означает формат F(Fixed) – число
с фиксированной точкой, три знака после запятой.
3) label2.Text = ("Сумма элементов массива\n с 4-го по 10-ый = "
+ z.ToString("F3"));
Вывод данных в поле label2. Для вывода на метку используется
свойство Text – надпись на метке.
Программный код:
using System;
namespace С27
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
double[] A = new double[n];
int i; double z, p;
Console.WriteLine("Элементы массива: ");
Console.WriteLine();
for (i = 0; i<=n-1; i = i + 1)
{
A[i] = (i+3.0)/7.0;
Console.WriteLine("A[{0}]={1,5:F2} ", i, A[i]);
}
203
p = 1;
for (i = 0; i <= n-1; i = i + 1)
p = p * A[i];
z = p;
Console.WriteLine();
Console.WriteLine("Произведение элементов массива=
{0,7:F3} ", z);
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C28
{
class Program
{
static void Main(string[] args)
{
204
const int n = 10; // количество элементов массива
int i;
int[] A = new int[n] { 12, 4, 7, 9, 10, 5, 15, 2, 3, 1 };
Console.WriteLine("Исходный массив");
// Вывод элементов исходного массива
for (i = 0; i <=n-1; i = i + 1)
Console.Write(" " + A[i]);
Console.WriteLine();
Array.Sort(A);
Console.WriteLine();
Console.WriteLine("Отсортированный массив");
// Вывод элементов отсортированного массива
for (i = 0; i <= n - 1; i = i + 1)
Console.Write(" " + A[i]);
Console.WriteLine();
Console.ReadLine();
}
}
}
namespace C30
{
class Program
{
205
static void Main(string[] args)
{
int n; // количество элементов массива
int i;
double s; // сумма элементов массива
double sr; // среднее арифм. значение элементов массива
Console.Write("Введите количество элементов массива= ");
n = Convert.ToInt32(Console.ReadLine());
int[] A = new int[n];
Random rnd = new Random();
Console.WriteLine("Элементы массива: ");
s = 0;
for (i = 0; i <= n-1; i = i + 1)
{
A[i] = rnd.Next(1, 20);
Console.WriteLine("A[{0}]={1} ", i, A[i]);
s = s + A[i];
}
sr = s / n;
Console.WriteLine("Среднее арифметическое элементов
массива = {0,6:F3}", sr);
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C31
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
double max; // максимальный элемент
int imax; // индекс максимального элемента
int i;
double[] A = new double[n] { 1.0, -2.5, 3.7, 94.8, 15.0,
65.2, -7.3, 18.0, 29.5, 10.0, 17.0, 14.0 };
Console.WriteLine("Элементы массива: ");
Console.WriteLine();
// Вывод элементов массива
for (i = 0; i <= (n - 1); i = i + 1)
Console.WriteLine("A[{0}]={1} ", i, A[i]);
max = A[0]; imax = 0;
for (i = 0; i <= (n - 1); i = i + 1)
{
if (A[i] > max)
{
max = A[i];
imax = i;
}
}
Console.WriteLine();
Console.WriteLine("Максимальный элемент массива= {0}", max);
Console.WriteLine("Индекс максимального элемента= {0}", imax);
Console.ReadLine();
}
}
}
207
Результаты расчета см. рис. 10.46.
ПОРЯДОК ДЕЙСТВИЙ
208
один объект комбинированное окно (ComboBox) для выбора
способа заполнения массива,
одно поле списка (ListBox)
четыре командных кнопки (Button).
209
Окончание таблицы 10.10
1 2 3 4
Командная Button1 Name cmdMas
кнопка text Заполнение массива
Командная Button2 Name cmdSred
кнопка text Вычисление среднего
арифметического
Командная Button3 Name cmdMax
кнопка text Вычисление максимального
элемента массива и его индекса
Командная Button4 Name cmdEnd
кнопка text Завершение работы
Комбинированное ComboBox1 Name ComboBox1
окно Text Выберите способ заполнения
массива
Items Случайными числами
Рассчитать по формуле
3. Программирование.
1) Напишите обработчик события щелчок мышью по командной кнопке
<Заполнение массива>.
2) Напишите обработчик события щелчок мышью по командной кнопке
<Вычисление среднего арифметического>.
3) Напишите обработчик события щелчок мышью по командной кнопке
<Вычисление максимального элемента массива и его индекса>.
210
4) Напишите обработчик события щелчок мышью по командной кнопке
<Завершение работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W7
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int n;
double[] A;
211
private void cmdSred_Click(object sender, EventArgs e)
{
double s; // сумма элементов массива
double sr; // среднее арифметическое элементов массива
int i;
s = 0;
for (i = 0; i <= (n - 1); i = i + 1)
{
s = s + A[i];
}
sr = s / n;
label3.Text = "Среднее арифметическое= " +sr.ToString("F3");
}
212
Способ 1. Заполнение массива случайными числами
n = 12
A=
(5, 8, 0, 14, -15,
17, 0, -20, 0, 23,
25, -30)
i = 0, n-1
Вывод
ai
k=0
s=0
i = 0, n-1
нет нет
ai 0 ai 0
да да
ai 2ai k k 1 s s ai
i = 0, n-1
Вывод
ai
Вывод
Конец
k, s
namespace C32
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
int i, k; double s;
int[] A = new int[n] {5,8,0,14,-15,17,0,-20,0,23,25,-30};
// Вывод элементов массива
Console.WriteLine("Исходный массив А: ");
for (i = 0; i <= n - 1; i = i + 1)
Console.Write(" " + A[i]);
Console.WriteLine();
Console.WriteLine();
k = 0; s = 0;
for (i = 0; i <= (n - 1); i = i + 1)
{
if (A[i] > 0)
A[i] = 2 * A[i];
else if (A[i] == 0)
k = k + 1;
else
s = s + A[i];
}
// Вывод элементов нового массива
Console.WriteLine("Новый массив А: ");
for (i = 0; i <= n - 1; i = i + 1)
Console.Write(" " + A[i]);
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Количество элементов равных нулю = {0}", k);
Console.WriteLine("Сумма всех отрицательных элементов = {0}", s);
Console.ReadLine();
}
}
}
namespace C33
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
int i, k; double s;
int[] A = new int[n] { 2,3,7,9,11,12,14,15,16,17,18,20 };
// Вывод элементов массива
Console.WriteLine("Массив А: ");
for (i = 0; i <= n - 1; i = i + 1)
Console.Write(" " + A[i]);
Console.WriteLine("\n");
k = 0; s = 0;
Console.WriteLine("Элементы кратные трем: ");
for (i = 0; i <= (n - 1); i = i + 1)
{
if (A[i] % 3 == 0)
{
k = k + 1;
s = s + A[i];
Console.Write(" " + A[i]);
}
}
Console.WriteLine("\n");
Console.WriteLine("Количество элементов кратных трем = {0}", k);
216
Console.WriteLine("Сумма элементов кратных трем = {0}", s);
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C35
{
class Program
{
static void Main(string[] args)
{
const int n = 10; // кол-во элементов каждого массива
double s, p;
double[] X = new double[n];
double[] Y = new double[n];
//Вычисление и вывод элементов массива X
Console.WriteLine(" Массив X ");
217
for (int i = 0; i <= (n - 1); i = i + 1)
{
X[i] = i / 3.0;
Console.WriteLine("X[{0}]={1,7:F3} ", i, X[i]);
}
Console.WriteLine();
//Вычисление и вывод элементов массива Y
Console.WriteLine(" Массив Y ");
for (int i = 0; i <= (n - 1); i = i + 1)
{
Y[i] = i / 2.0 + 4;
Console.WriteLine("Y[{0}]={1,7:F3} ", i, Y[i]);
}
Console.WriteLine();
//Накопление суммы
s = 0;
for (int i = 0; i <= (n - 1); i = i + 1)
{
s = s + (X[i] + 5.6 * Y[i]);
}
p = s;
Console.WriteLine("p= {0,7:F3}", p);
Console.ReadLine();
}
}
}
Вывод xi
s s ( xi 5.6 * y (i ))
Ввод
yi ibi 2 4
Вывод yi
Вывод xi
в поле списка
ListBox1
s s ( xi 5.6* y (i ))
Ввод
yi bii 2 4
Вывод yi
в поле списка
ListBox2
220
ПОРЯДОК ДЕЙСТВИЙ
Форма Form1
Метка Label1 text Массив X
Метка Label2 text Массив Y
Метка Label3
Поле списка ListBox1
Поле списка ListBox2
Командная Button1 Name cmdMas
кнопка text Вычисление и вывод
элементов массивов X и Y
Командная Button2 Name cmdP
кнопка text Вычисление P
Командная Button3 Name cmdEnd
кнопка text Завершение работы
221
Рисунок 10.58 – Форма к задаче 10.20
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычисление и вывод элементов массивов X и Y>, щелчок мышью
по командной кнопке <Вычисление P>, щелчок мышью по командной
кнопке <Завершение работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
222
listBox1.Items.Add( X[i].ToString("F3"));
}
//Вычисление и вывод элементов массива Y
for (int i = 0; i <= (n - 1); i = i + 1)
{
Y[i] = i / 2.0 + 4.0;
listBox2.Items.Add(Y[i].ToString("F3"));
}
}
223
Задача 10.21. Вычислить значения элементов одномерного массива
Q(10) по формуле:
qi e x (ai bi ) 2 k ,
где x = 2; k = 3,5;
ai – элемент одномерного массива A(10); i 0,1,...9 ;
bi – элемент одномерного массива B(10); i 0,1,...9 ;
qi – элемент одном. массива Q(10) i 0,1,...9 .
Значения элементов массивов A и B задать в программном коде.
Блок-схема представлена на рис. 10.60.
224
Qi e x ( Ai Bi ) 2 k
Вывод
Ai , Bi , Qi
225
Результаты решения см. рис. 10.61.
ПОРЯДОК ДЕЙСТВИЙ
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке
<Завершение работы>.
227
Программный код:
using System;
using System.Windows.Forms;
namespace W8
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
9
F c 3 xi a ,
i 0
namespace C36
{
class Program
{
static void Main(string[] args)
{
229
const int n = 10; // количество элементов массива
const double a = 7.5, c = 2.45;
int i;
double p, F;
double[] X = new double[n] { 1.5, 2.3, 3.5, 4.8, 5.8,
6.1, 7.3, 8.2, 9.3, 10.5 };
Console.WriteLine("Элементы массива: ");
Console.WriteLine();
// Вывод элементов массива
for (i = 0; i <= (n - 1); i = i + 1)
Console.WriteLine("X[{0}]={1} ", i, X[i]);
// Накопление произведения
p=1;
for (i = 0; i <= (n-1); i = i + 1)
p=p*(X[i]+a);
F = c * Math.Pow(p, (1.0 / 3.0));
Console.WriteLine();
Console.WriteLine("F= {0,7:F3}", F);
Console.ReadLine();
}
}
}
230
Вывод X i
p p * ( X i a)
F c 3 p
231
Способ 2. Для данной задачи создать Windows-приложение.
Блок-схема обработчика событий cmdStart_Click представлена на
рис. 10.66.
ПОРЯДОК ДЕЙСТВИЙ
232
Рисунок 10.68 – Форма к задаче 10.22
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке
<Завершение работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
233
const double a = 7.5, c = 2.45;
int i;
double p, F;
double[] X = new double[n] { 1.5, 2.3, 3.5, 4.8, 5.8,
6.1, 7.3, 8.2, 9.3, 10.5 };
// Вывод элементов массива
for (i = 0; i <= (n - 1); i = i + 1)
listBox1.Items.Add( X[i]);
// Накопление суммы элементов с 4-го по 10-ый
p = 1;
for (i = 0; i <= (n - 1); i = i + 1)
p = p * (X[i] + a);
F = c * Math.Pow(p, (1.0 / 3.0));
label2.Text= "F= " + F.ToString("F3");
}
234
10.4.2 Задачи для выполнения лабораторных работ (часть 1)
Задача 10.23.
a) Создать одномерный массив A(12). Элементы массива ai
вычисляются по формуле:
ai 12 i sin( i 1) ; i 0,1,...11
b) Вычислить сумму элементов массива с n-го по k-й (при
n 5; k 7 )
Вычисление суммы осуществить с помощью операторов цикла FOR,
WHILE или DO.
c) Вывести элементы массива:
в обратном порядке (по убыванию индекса) с k-го по n-й;
четные (нечетные) по индексу или каждый n-й элемент массива.
namespace C37
{
class Program
{
static void Main(string[] args)
{
const int n = 12; // количество элементов массива
double[] A = new double[n];
int i;
double s;
// Вычисление и вывод элементов массива
Console.WriteLine(" Массив A: ");
Console.WriteLine();
for (i = 0; i <= (n - 1); i = i + 1)
{
A[i] = 12 + i / Math.Sin(i + 1);
Console.WriteLine("A[{0}]={1,7:F4} ", i, A[i]);
}
Console.WriteLine();
// Вычисление суммы элементов массива с 5-го по 7-ой
Console.WriteLine("Сумма элементов массива с 5-го по 7-ой ");
235
s = 0;
for (i = 5; i <= 7; i = i + 1)
s = s + A[i];
Console.WriteLine("s= {0,7:F4}", s);
Console.WriteLine();
//Вывод элем. массива в обратном порядке с 7-го по 5-ый
Console.WriteLine("Вывод элементов массива в обратном
порядке с 7-го по 5-ый" );
for (i = 7; i >= 5; i = i - 1)
Console.WriteLine("A[{0}]={1,7:F4} ", i, A[i]);
Console.WriteLine();
//Вывод четных по индексу элементов массива
Console.WriteLine("Вывод четных по индексу элементов массива");
for (i = 2; i <= 10; i = i + 2)
Console.WriteLine("A[{0}]={1,7:F4} ", i, A[i]);
Console.ReadLine();
}
}
}
1 2 3
1 ai 1 2i 1 3i ; i 0,1,...11 n 3; k 5
2 ai 2 i 1 2i ; i 0,1,...11 n 2; k 4
ПОРЯДОК ДЕЙСТВИЙ
237
Рисунок 10.71 – Форма к задаче 10.23
238
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке
<Завершение работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W11
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
240
10.4.3 Задачи для выполнения лабораторных работ (часть 2)
где
ai – элементы одномерного массива A(10); i=0,1,…9.
242
zi – элементы одномерного массива Z(16); i = 0,1,…15.
243
Задача 4. В одномерном массиве C(15) вычислить количество
положительных элементов.
244
10.5 Двумерные массивы
Цель работы:
для консольного приложения: изучить операторы объявления двумерных
массивов, способы наполнения массивов, ввод- вывод элементов массивов, накопление
суммы и произведения элементов массивов.
для Windows- приложения: изучить элементы управления: метка Label, кнопка
Button, поле ввода TextBox, список ListBox, один компонент для представления
таблицы на форме DataGridView.
Программный код:
using System;
namespace C38
{
class Program
{
static void Main(string[] args)
{
const int n=4; // количество строк массива А
const int m=6; // количество столбцов массива А
int i, j, k;
double s;
double[,] A = new double[n,m];
//Вычисление элементов массива по формуле и вывод их на экран
245
Console.WriteLine("Массив А ");
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (m - 1); j++)
{
A[i, j] = (double)(i * i - 5) / (i + j + 1);
Console.Write( A[i, j].ToString("F3") + "\t ");
}
Console.WriteLine();
}
Console.WriteLine();
// Вычисление суммы положительных и количества
// отрицательных элементов массива
s = 0; k = 0;
for (i = 0; i <= (n - 1); i++)
{
for (j=0; j<=(m-1); j++)
{
if (A[i,j] >=0)
s=s+A[i,j];
else
k=k+1;
}
}
Console.WriteLine("Сумма полож. элементов= {0,7:F3}",s);
Console.WriteLine("Количество отриц. элементов= {0}", k);
Console.ReadLine();
}
}
}
246
Пояснение:
1) double[,] A = new double[n,m];
Объявляется двумерный массив А из n m вещественных чисел типа double.
Одновременно массив инициализируется (заполняется нулями);
n и m должны быть или константами или выражениями типа, приводимого к целому.
s0
k 0
a ij 0
i2 5
aij
i j 1
s s a ij
Вывод
aij
247
среднее арифметическое ее элементов и количество положительных
элементов в каждой строке.
Программный код:
using System;
namespace C40
{
class Program
{
static void Main(string[] args)
{
const int n = 3, m = 4;
int i, j;
int[,] A = new int[n, m]
{{2, -2, 8, 9},
{-4, -5, 6, -2},
{7, 0, 1, 1}};
Console.WriteLine("Массив A: ");
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= m - 1; j++)
Console.Write("{0}\t", A[i, j]);
Console.WriteLine();
}
Console.WriteLine();
double sum = 0; //сумма всех элементов
int k; //количество положит. элементов в каждой строке
double sr; //среднее арифметическое всех элементов
for (i = 0; i <= (n - 1); i++)
{
k = 0;
for (j = 0; j <= m - 1; j++)
{
sum = sum + A[i, j];
if (A[i, j] > 0) k = k + 1;
}
Console.WriteLine("В строке {0} положит. элементов
{1} ", i, k);
}
sr = sum / (n * m);
248
Console.WriteLine("Среднее арифметическое всех
элементов= {0,7:F3} ",sr);
Console.ReadLine();
}
}
}
Пояснение:
int[,] A = new int[n, m]
{{2, -2, 8, 9},
{-4, -5, 6, -2},
{7, 0, 1, 1}};
Объявляется двумерный массив А из n m целых чисел типа int. Одновременно массив
наполняется нужными значениями. В данном случае когда задан список инициализации
n и m должны быть только константами.
Задача 10.26.
а) Создать двумерный массив A размером 4 6,
A (aij ; i 0,1,...3; j 0,1,...5)
Массив содержит данные типа double. Элементы массива задать в
программном коде.
б) Получить одномерный массив SA(4) , численные значения
элементов равны среднему арифметическому элементов строк. Вывести на
экран одномерный массив SA(4) . Вычислить произведение элементов
одномерного массива SA(4) .
249
в) Откорректировать программу для случая, когда требуется
получить одномерный массив, численные значения элементов которого
равны среднему арифметическому значению элементов столбцов.
Для решения задачи создать консольное приложение.
Программный код:
using System;
namespace C39
{
class Program
{
static void Main(string[] args)
{
const int n = 4; // количество строк массива А
const int m = 6; // количество столбцов массива А
int i, j;
double s, p;
double[,] A = new double[n,m]
{{1,2,3,4,5,6},
{7,8,9,10,11,12},
{13,14,15,16,17,18},
{19,20,21,22,23,24}};
double[] SA = new double[n];
// Вывод элементов массива А на экран
Console.WriteLine(" Массив А: ");
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (m - 1); j++)
Console.Write("{0,5:F2}\t", A[i, j]);
Console.WriteLine();
}
Console.WriteLine();
//Создание и вывод одномерн. массива, элементы которого равны
//среднему арифметическому элементов строк двумерн. массива А
Console.WriteLine(" Массив CA: ");
for (i = 0; i <= (n - 1); i++)
{
s = 0;
for (j = 0; j <= (m - 1); j++)
s = s + A[i, j];
250
// Вычисление элементов одномерного массива
SA[i] = s / m;
// Вывод элементов одномерного массива
Console.WriteLine("SA[{0}]= {1,6:F2}", i, SA[i]);
}
Console.WriteLine();
//Вычисление произведения элементов одномерного массива
p = 1;
for (i = 0; i<=(n-1); i++)
p = p * SA[i];
Console.WriteLine("Произведение элементов одном. массива
= {0,7:F3}", p);
Console.ReadLine();
}
}
}
251
Программный код:
using System;
namespace C41
{
class Program
{
static void Main(string[] args)
{
const int n = 5; // количество строк и столбцов матрицы
const double x = 7;
int i, j;
double[,] A = new double[n, n];
double[,] B = new double[n, n];
Random rnd = new Random();
// Заполнение матрицы А
for (i=0; i<=(n-1); i++)
{
for (j=0; j<=(n-1); j++)
A[i,j] = rnd.NextDouble()*10+7;
}
// Вывод элементов исходной матрицы А
Console.WriteLine(" Матрица A: ");
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (n - 1); j++)
Console.Write("{0,5:F3}\t", A[i, j]);
Console.WriteLine();
}
Console.WriteLine();
// Вычисление элементов матрицы В
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (n - 1); j++)
if (i % 2 == 0)
B[i, j] = A[i, j];
else
B[i, j] = x;
}
Console.WriteLine();
252
// Вывод новой матрицы В
Console.WriteLine(" Матрица В: ");
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (n - 1); j++)
Console.Write("{0,5:F3}\t", B[i, j]);
Console.WriteLine();
}
Console.ReadLine();
}
}
}
Пояснение:
if (i % 2 == 0)
B[i, j] = A[i, j];
else
B[i, j] = x;
Если остаток от деления номера строки равен нулю (т.е. строка четная) элементу
матрицы В присваивается значение элемента матрицы А, иначе элементу матрицы В
присваивается значение x.
253
Элементы массива вычислить по формуле:
aij 2i 3 j 5
Вычислить произведение элементов каждого столбца матрицы.
Результат получить в виде вектора D, т.е. вычислить
3
d j aij , где j 0,1,...4
i0
Для решения задачи создать Windows- приложение.
ПОРЯДОК ДЕЙСТВИЙ
254
Таблица 10.16 – Значения свойств объектов к задаче 10.28
Объект Имя объекта по умолчанию Свойство Значение свойства
(значение свойства Name)
Форма Form1
Метка Label1 text Количество строк
Метка Label2 text Количество столбцов
Метка Label3 text Матрица А
Метка Label4 text Массив D
Текстовое поле TextBox1 Name txtN
TextAlign Center
Текстовое поле TextBox2 Name txtM
TextAlign Center
Поле списка ListBox1
Поле списка ListBox2
Командная Button1 Name cmdStart
кнопка text Вычислить
Командная Button2 Name cmdEnd
кнопка text Завершение работы
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
255
Программный код:
using System;
using System.Windows.Forms;
namespace W12
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
256
for (j = 0; j <= (m-1); j++)
{
p = 1;
for (i = 0; i <= (n-1); i++)
p = p * A[i, j];
D[j] = p;
listBox2.Items.Add(D[j].ToString("F2"));
}
}
ПОРЯДОК ДЕЙСТВИЙ
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
Программный код:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace W12d
{
public partial class Form1 : Form
{
259
public Form1()
{
InitializeComponent();
}
260
for (int i = 0; i <= n - 1; ++i)
{
for (int j = 0; j <= m - 1; ++j)
{
if (A[i, j] > 0)
{
summ = summ + A[i, j];
//увеличиваем на 1 кол-во просуммированных элементов
nn = nn + 1;
}
}
}
//Рассчитываем среднее арифметическое и выводим на метку
sr = summ / nn;
label3.Text = "Среднее арифметическое = " + sr;
}
261
ПОРЯДОК ДЕЙСТВИЙ
262
Окончание таблицы 10.18
1 2 3 4
Командная кнопка Button1 Name cmdMas
text Ввод массива
Командная кнопка Button2 Name cmdStart
text Вычислить
Командная кнопка Button2 Name cmdEnd
text Завершение работы
3. Программирование.
Напишите обработчики событий: щелчок мышью по командной
кнопке <Ввод массива>, щелчок мышью по командной кнопке
<Вычислить>, щелчок мышью по командной кнопке <Завершение работы>.
Программный код:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace W12c
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
263
int n; // количество строк матрицы
int m; // количество столбцов матрицы
int[,] A;
265
(i 2 5)
aij .
(i j 3)
Вычислить сумму положительных и произведение отрицательных
элементов массива.
266
Задача 6 Создать двумерный массив A размером 10 5,
A (aij ; i 0,1,...9; j 0,1,...4)
Элементы массива рассчитать по формуле:
aij j 2 8i 35 .
Определить сумму элементов каждого столбца матрицы.
12,8 40 34,8 56
A 102 78,4 140 112
178 40 65 95,4
Определить сумму элементов по периметру матрицы.
267
Найти минимальный элемент массива и его индексы.
1 7 9 12
8 21 7 11
A
15 42 18 20
2 12 31 14
268
Задача 15 Создать двумерный массив A размером 5 8,
A (aij ; i 0,1,...4; j 0,1,...7)
Элементы массива рассчитать по формуле:
aij i 2 5 j 2 30 .
Получить транспонированную матрицу и напечатать ее по строкам.
Для транспонирования матрицы необходимо заменить строки матрицы ее
столбцами, а столбцы – строками, т.е. вычислить
269
1 3 5, 4 8,1 10,3 15
A 7 21 15 23 27,5 34
54 23,7 100 45,8 22,5 105
Вычислить среднее арифметическое значение положительных
элементов массива.
270
Задача 7 Создать двумерный массив A размером 4 3.
A (aij ; i 0,1,...3; j 0,1,...2) .
Элементы массива задать в программном коде.
2 15 8
15 34,8 12
A
0 2 15
45, 4 15 3
Определить строки, которые содержат только положительные
элементы. Выпечатать эти строки и найти сумму элементов этих строк.
273
стороны матрицы n ввести с клавиатуры, вычислить и вывести на консоль
среднее арифметическое диагоналей матрицы. Учесть, что при нечетном
значении n центральный элемент принадлежит обеим диагоналям.
10.6 Методы
Цель работы:
для консольного приложения: изучить синтаксис метода, типы параметров
метода, вызов метода.
для Windows- приложения: изучить элементы управления: метка Label, кнопка
Button, поле ввода TextBox, список ListBox.
namespace C50
{
class Program
{
static double Aver(double x, double y, double z)
{
return (x + y + z) / 3;
}
274
static void Main(string[] args)
{
double res, x1, x2, x3;
x1 = 4.5; x2 = 5.6; x3 = 7.8;
res = Aver(x1, x2, x3);
Console.WriteLine(" x1 = {0,5:F2}; x2 = {1,5:F2};
x3 ={2,5:F3}", x1,x2,x3);
Console.WriteLine(" Среднее арифметическое трех чисел =
{0,6:F3}", res );
Console.ReadLine();
}
}
}
Пояснение:
static double Aver(double x, double y, double z) – это
заголовок метода;
Aver – имя метода;
(double x, double y, double z) – параметры -значения.
Фактически вычисление среднего арифметического значения из трех
заданных чисел осуществляется из тела главного метода Main с помощью вызова
метода Aver:
res = Aver(x1, x2, x3);
При вызове этого метода передаются в качестве аргументов (фактических
параметров) переменные x1, x2, x3 типа double. Соответственно, в
определении метода Aver идентификаторы x,y и z называются формальными
параметрами.
275
Программный код:
using System;
namespace C52
{
class Program
{
// Объем цилиндра
static double ps(double h, double r)
{
return Math.PI * r * r * h;
}
Программный код:
using System;
namespace C51
{
class Program
{
// пересчитывает температуру
// из градусов Фаренгейта в градусы Цельсия
static double ps(double f)
{
double c;
c = (double)5 / 9 * (f - 32);
return (c);
}
277
Console.ReadLine();
}
}
}
namespace C59
{
class Program
{
static double ps(double a, double b)
{
return Math.Sqrt(a*a+b*b+ Math.Pow(Math.Sin(a*b),2));
}
278
Console.WriteLine(" x= {0,5:F2}; y= {1,5:F2};
z={2,5:F2}", x,y,z);
Console.WriteLine(" W= {0:F3}", W);
Console.ReadLine();
}
}
}
namespace C53
{
class Program
{
static double factorial(int K)
{
double p=1;
for (int i = 2; i <= K; i++)
p = p * i;
return(p);
}
279
Console.ReadLine();
}
}
}
ПОРЯДОК ДЕЙСТВИЙ
3. Программирование.
Напишите обработчики событий щелчок мышью по командной кноп-
ке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W13
{
public partial class Form1 : Form
{
281
public Form1()
{
InitializeComponent();
}
Программный код:
using System;
namespace C57
{
class Program
{
static int MySum(int M, int N)
{
int i, sum;
sum = 0;
for (i = M; i <= N; i++)
sum = sum + i;
return sum;
}
283
Задача 10.36. Написать метод, который возвращает среднее
арифметическое элементов массива
Программный код:
using System;
namespace C58
{
class Program
{
static double ps(int n, int[] A)
{
int i;
double sum = 0;
for ( i = 0; i <= (n - 1); i++)
sum = sum + A[i];
return sum / n;
}
284
Рисунок 10.97 – Результаты решения задачи 10.36
Задача 10.37.
1. Создать двумерный массив A размером 4 5,
A (aij ; i 0,1,...3; j 0,1,...4)
Элементы массива вычислить по формуле:
2
aij 20 i 0,5 j 1
Программный код:
using System;
namespace C62
{
class Program
{
285
// Функция накапливает сумму элементов по данной строке
int j;
double c;
c = 0;
for (j = 0; j <= (m - 1); j++)
c = c + B[i, j];
return c;
}
Программный код:
using System;
namespace C60
{
class Program
{
static double ps(int n1, int n2, double k1, double k2,
double k3, double [] A)
{
int i;
double s=0;
for ( i=n1; i<=n2; i++)
s= s + Math.Pow((k1*A[i]+k2),k3);
return s;
}
287
static void Main(string[] args)
{
const int n = 12; // Количество элементов масива
double[] A = new double[n];
int i;
double r1, r2, r3, f;
Console.WriteLine(" Массив A: ");
for (i = 0; i <= (n - 1); i++)
{
A[i] = (i + 2) / 7.0;
Console.WriteLine("A[{0}]={1:F3} ", i, A[i]);
}
r1 = ps(1, 5, 1.78, 5.4, 2, A);
r2 = ps(1, 8, 0.1, 1.25, 4, A);
r3 = ps(0, 10, 8.2, -17.02, 3, A);
f = r1 + r2 - r3;
Console.WriteLine();
Console.WriteLine(" f= {0:F3}" , f );
Console.ReadLine();
}
}
}
288
Ai i 2 7
Вывод
Ai
k3
s s k1 Ai k 2
где
xi – элементы одномерного массива X(8); i = 0,1,…7.
yi – элементы одномерного массива Y(10); i = 0,1,…9;
zi – элементы одномерного массива Z(12); i = 0,1,…11.
Элементы массивов вычислить по формулам:
i 1 i2 5 i8
xi ; yi ; zi 2 .
3 7 i 1
В виде метода оформить вычисление произведения вида
n2
F k1 ai .
i n1
Создать консольное приложение для решения данной задачи.
Программный код:
using System;
namespace C66
{
class Program
{
static double ps(int n1, int n2, double k1, double[] A)
{
int i;
double p=1;
for (i = n1; i <= n2; i++)
p = p * A[i];
p = k1 * p;
return p;
}
290
static void Main(string[] args)
{
double[] X = new double[8];
double[] Y = new double[10];
double[] Z = new double[12];
double F, r1, r2, r3;
int i;
Console.WriteLine(" Массив X: ");
for (i = 0; i <= 7; i++)
{
X[i] = (i + 1) / 3.0;
Console.Write("{0,5:F2} ", X[i]);
}
Console.WriteLine("\n");
Console.WriteLine(" Массив Y: ");
for (i = 0; i <= 9; i++)
{
Y[i] = (i * i + 5.0) / 7.0;
Console.Write("{0,5:F2} ", Y[i]);
}
Console.WriteLine("\n");
Console.WriteLine(" Массив Z: ");
for (i = 0; i <= 11; i++)
{
Z[i] = (i + 8.0) / (i * i + 1);
Console.Write("{0,5:F2} ", Z[i]);
}
Console.WriteLine("\n");
r1= ps(1, 7, 4, X);
r2= ps(3, 9, 8.34, Y);
r3= ps(0, 11, 1, Z);
F = r1 + r2 - r3;
Console.WriteLine(" F={0,6:F3} ", F);
Console.ReadLine();
}
}
}
namespace C63
{
class Program
{
292
static void ps(double radius, ref double ploshad, ref double
dlina)
{
ploshad = Math.PI * radius * radius;
dlina = 2 * Math.PI * radius;
}
Пояснение:
static void ps(double radius, ref double ploshad, ref double
dlina) – это заголовок метода;
В списке параметров метода имеются параметры- значения и параметры-
ссылки. Признаком параметра-ссылки является ключевое слово ref перед
описанием параметра.
double radius – параметр-значение, он не может быть изменен
функцией;
ref double ploshad, ref double dlina – параметры- ссылки.
293
При вызове метода в область параметров копируется не значение аргумента,
а его адрес, и метод через него имеет доступ к ячейке, в которой хранится аргумент.
Таким образом, параметры-ссылки передаются по адресу (чаще употребляется
термин «передача по ссылке»). Метод работает непосредственно с переменной из
вызывающей функции и, следовательно, может её изменить, поэтому если в методе
требуется изменить значения параметров, они должны передаваться только по
ссылке.
Модификатор ref указывается перед объявлением параметра в самом методе
и перед аргументом при вызове метода. Параметр типа ref должен быть
инициализирован определённым значением до вызова метода.
При вызове метода из главного метода Main() ему передается в качестве
входного параметра значение радиуса: R=5.
namespace C63a
{
class Program
{
294
Результаты расчета см. рис. 10.103.
Пояснение:
Методы могут возвращать в вызывающую программу одно или несколько
значений с помощью списка аргументов.
В данном случае метод ps()
static void ps(double radius, out double ploshad, out double
dlina) предназначен для вычисления площади круга и длины окружности;
ps – имя метода, после имени в скобках указываются параметры с нужным
типом данных Среди них есть параметры- значения и выходные параметры.
Признаком выходного параметра является ключевое слово out перед описанием
параметра.
double radius – параметр-значение, он не может быть изменен
функцией;
out double ploshad, out double dlina – выходные параметры.
Модификатор параметра out служит только для передачи значения за
пределы метода. Поэтому переменной, используемой в качестве параметра out, не
нужно присваивать какое-то значение. Более того, в методе параметр out считается
неинициализированным, т.е. предполагается, что у него отсутствует первоначальное
значение. Это означает, что значение должно быть присвоено данному параметру в
методе до его завершения. Следовательно, после вызова метода параметр out будет
содержать некоторое значение.
При вызове метода из главного метода Main ему передается в качестве
входного параметра значение радиуса: R=5.
295
xi – элементы одномерного массива X(12); i = 0,1,…11;
yi – положительные элементы одномерного массива Y(12); i = 0,1,…11.
Элементы массивов вычислить по формулам:
xi i 2 5 ;
yi i 4 1 .
n2
В виде метода оформить вычисление суммы k1 k 2 zi k 3 и
i n1
расчет количества суммируемых элементов.
Программный код:
using System;
namespace С65
{
class Program
{
static void sum(double k1, double k2, int n1, int n2, double
[]Z, double k3, out double s, out int q)
{
int i;
s = 0; q = 0;
for (i = n1; i <= n2; i++)
{
s = s + (Z[i] + k3);
q = q + 1;
}
s = k1 * Math.Pow(s, (1 / k2));
}
296
const double a = 3.0, b = 7.0;
double[] X = new double[n];
double[] Y = new double[n];
double F, s1, s2;
int i, q1, q2;
Console.WriteLine(" Массив X: ");
for (i = 0; i <= (n - 1); i++)
{
X[i] = i / 2.0 + 5;
Console.Write("{0,5:F2} ", X[i]);
}
Console.WriteLine("\n");
Console.WriteLine(" Массив Y: ");
for (i = 0; i <= (n - 1); i++)
{
Y[i] = i / 4.0 + 1;
Console.Write("{0,5:F2} ", Y[i]);
}
Console.WriteLine("\n");
sum(1.5, 3, 1, 7, X, a, out s1, out q1);
sum(8.2, 2, 0, 10, Y, b, out s2, out q2);
F = s1 - s2;
Console.WriteLine("F={0,6:F3} q1={1} q2={2}", F, q1, q2);
Console.ReadLine();
}
}
}
297
Xi i 2 5
Вывод
Xi
yYi i i 44 11
Вывод
Yi
s s ( Z i k 3)
q q 1
s k1 s1 k 2
298
Способ 2. Cоздать Windows-приложение. Блок- схема решения зада-
чи представлена на рис. 10.106.
xi i 2 5
Вывод xi
s s ( zi k 3)
yi i 4 1
Вывод yi
s k1 s1 k 2
ПОРЯДОК ДЕЙСТВИЙ
299
На форме расположить:
три метки (Label),
два поля списка (ListBox),
три командных кнопки (Button).
300
Рисунок 10.108 – Форма к задаче 10.41
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычисление и вывод элементов массивов>, щелчок мышью по
командной кнопке <Вычисление F>, щелчок мышью по командной кнопке
<Завершение работы>.
Программный код:
using System;
using System.Windows.Forms;
namespace W16
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static void sum(double k1, double k2, int n1, int n2,
double[] Z, double k3, out double s, out int q)
{
301
int i;
s = 0; q = 0;
for (i = n1; i <= n2; i++)
{
s = s + (Z[i] + k3);
q = q + 1;
}
s = k1 * Math.Pow(s, (1 / k2));
}
302
Пояснение
const int n=12; // Количество элементов массива
double[] X = new double[n];
double[] Y = new double[n];
const double a=3.0, b=7.0;
303
Вывод
Bi
p p ( Bi k 2)k 3
q q 1
p k1 p
Программный код.
using System;
namespace C61a
{
class Program
{
static void ps(int n1, int n2, double k1, double k2, double
k3, double[] B, out double p, out int q)
{
int i;
p = 1; q = 0;
for (i = n1; i <= n2; i++)
{
p = p * Math.Pow((B[i] + k2), k3);
q = q + 1;
}
p = k1 * p;
}
305
Результаты расчета см. рис. 10.111.
ПОРЯДОК ДЕЙСТВИЙ
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
Программный код.
using System;
using System.Windows.Forms;
307
namespace W15
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static void ps(int n1, int n2, double k1, double k2, double
k3, double[] B, out double p, out int q)
{
int i;
p = 1; q = 0;
for (i = n1; i <= n2; i++)
{
p = p * Math.Pow((B[i] + k2), k3);
q = q + 1;
}
p = k1 * p;
}
308
private void cmdEnd_Click(object sender, EventArgs e)
{
Close();
}
}
}
309
Нахождение суммы, произведения элементов массива,
максимального элемента массива и сортировку элементов массива
осуществить при помощи методов.
Программный код:
using System;
namespace C67
{
class Program
{
310
if (max<B[i])
{
max=B[i];
index=i;
}
}
}
311
Console.WriteLine("Массив PS1:произведение элементов строк");
for (i = 0; i <= (n - 1); i++)
{
ps(A, i, out PS1[i]);
Console.Write("{0,5:F2} ", PS1[i]);
}
Console.WriteLine("\n");
// Нахождение макс. элементов массивов и их индексов
MAXIM(SS1, out smax, out indexss);
Console.WriteLine("Максимальный элемент в массиве SS1:");
Console.WriteLine("SS1[{0}]={1,5:F2} ", indexss, smax);
Console.WriteLine();
MAXIM(PS1, out pmax, out indexps);
Console.WriteLine("Максимальный элемент в массиве PS1:");
Console.WriteLine("PS1[{0}]={1,5:F2} ", indexps, pmax);
Console.WriteLine();
// Определение разности между максимальными элементами
r = smax - pmax;
Console.WriteLine("Разность между максимальными
элементами r= {0,5:F2}" , r);
Console.WriteLine();
// Сортировка массива SS1
Console.WriteLine(" Отсортированный массив SS1");
Array.Sort(SS1);
// Вывод элементов отсортированного массива SS1
for (i = 0; i <= (n - 1); i = i + 1)
Console.Write("{0,5:F2} ", SS1[i]);
Console.WriteLine("\n");
// Сортировка массива PS1
Console.WriteLine(" Отсортированный массив PS1");
Array.Sort(PS1);
// Вывод элементов отсортированного массива PS1
for (i = 0; i <= (n - 1); i = i + 1)
Console.Write("{0,5:F2} ", PS1[i]);
Console.WriteLine();
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C118
{
class Program
{
313
p = 15.8; z = 4.5; k = 8.0;
double[] b = {10.0, 20.5, 30.2, 38.0};
s1 = ps(p, z, k);
s2 = ps(5.2, 15.7, 24.8, 27.0, 32.5);
s3 = ps(b);
Console.WriteLine("s1={0:F3} s2={1:F3} s3={2:F3}",s1,s2,s3);
Console.ReadLine();
}
}
}
S pp ( pp x)( pp y)( pp z ) ;
p x y z;
pp p 2 ;
где x, y, z – стороны треугольника (входные параметры);
p и s – периметр и площадь (выходные параметры).
314
Задача 2. Написать метод, обеспечивающий решение квадратного
уравнения.
F ( K1 K 2) * M 1 ( S1 S 2) * M 2 ,
где:
K1 – количество отрицательных чисел массива A(n) ,
K 2 – количество отрицательных чисел массива B (k )
S1 – сумма отрицательных чисел массива A(n) ,
S 2 – сумма отрицательных чисел массива B (k ) ,
M 1 – максимальный элемент массива A(n) ,
M 2 – максимальный элемент массива B (k )
Примечание:
1) Значения n , k , способ создания массива, тип элементов выбрать
самостоятельно.
2) Для определения значений K1 , K 2 , M 1 , S1 , S 2 , M 2 разработать
методы.
315
Таблица 10.22 – Условия задач и значения величин
№ Задания
вар.
1 2
1 11 9
F m 1,5 ai m 3 ai ,
i 0 i 3
где m 3, 45 ;
ai – элементы одномерного массива A(12) ; i 0,1,...11.
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
2 9 8
2 2
F yi a 2,5 yi b ,
i 0 i2
где a 0, 25; b 0,78;
yi – элементы одномерного массива Y (10) ; i 0,1,...9 .
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
3 14 12 10
P 1,9 bi2 7 bi3 0, 4 bi1 2 ,
i 0 i2 i 5
где
bi – положительные элементы одномерного массива B (15) ; i 0,1,...14 .
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
4 11 9 8
Y 2 ai 1,3 bi ci ,
i 0 i 0 i 0
где
ai – элементы одномерного массива A(12) ; i 0,1,...11;
bi – элементы одномерного массива B (10) ; i 0,1,...9 ;
ci – элементы одномерного массива C (9) ; i 0,1,...8 .
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
316
Продолжение таблицы 10.22
1 2
5 11 10
P 10,1 xi3 a 3 xi2 a ,
i 0 i 2
где a 3;
xi – элементы одномерного массива X (12) ; i 0,1,...11;
В виде метода оформить вычисление произведения и расчет
количества перемножаемых элементов.
6 11 9 10
Y xi2 i 4,5 xi3 i xi4 i ,
i 0 i 1 i 3
где
xi – элементы одномерного массива X (12) ; i 0,1,...11;
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
7 8 7
Y 0,018 ai 0, 4 bi ,
i 0 i 2
где
ai – элементы одномерного массива A(9) ; i 0,1,...8 ;
bi – элементы одномерного массива B (9) ; i 0,1,...8 ;
В виде метода оформить вычисление произведения и расчет
количества перемножаемых элементов.
8 9 7
3
Y
i 0
bi2
7 bi 2,5 ,
i2
где
bi – элементы одномерного массива B (10) ; i 0,1,...9 ;
В виде метода оформить вычисление произведения и расчет
количества перемножаемых элементов.
9 11 9
Z 12,5 bi 3 ai ,
i 0 i 3
где
ai – элементы одномерного массива A(10) ; i 0,1,...9 ;
bi – элементы одномерного массива B (12) ; i 0,1,...11;
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
317
Окончание таблицы 10.22
1 2
10 11 10
2 2
Z 0,75 3 xi a xi a ,
i 0 i 3
где a 0,02 ;
xi – элементы одномерного массива X (12) ; i 0,1,...11.
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
11 14 4
2
Z Cos pi 2 Cos 2 pi 0,5
i 10 i 1
где pi – элементы oдномерного массива P (16) ; i 0,1,...15
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
12 20 18
F (b 1) ai (b 3) ai ,
i 3 i 1
где
b 2,15 ;
ai –элементы одномерного массива A(21) ; i 0,1,...20 .
В виде метода оформить вычисление суммы и расчет количества
суммируемых элементов.
10.7 Строки
namespace C77
{
class Program
{
318
static void Main(string[] args)
{
string s1 = "Типы данных в языке программирования C#";
string s2 = "C#";
string s3 = string.Copy(s1);
string s4 = new string('-', 70);
// Вывод строки s1
Console.WriteLine("Строка:\t\t" + s1);
319
Console.WriteLine(s4);
Console.ReadLine();
}
}
}
namespace C73
{
class Program
{
static void Main(string[] args)
{
string str = "Информатика";
int len = str.Length;
for (int i = 0; i <= (len - 1); i++)
{
char ch=str[i];
Console.WriteLine("Символ на {0} позиции есть \t
{1}", i, ch);
}
320
Console.ReadLine();
}
}
}
Программный код:
using System;
namespace C80
{
class Program
{
static void Main(string[] args)
{
Console.Write(" Введите текст: ");
string s1 = Console.ReadLine();
int word = 0;
int i;
for (i = 0; i <= (s1.Length - 1); i++)
if (s1[i] == ' ')
word = word + 1;
Console.WriteLine(" Количество слов: " + (word+1));
321
Console.ReadLine();
}
}
}
namespace C88
{
class Program
{
static void Main(string[] args)
{
string a = "информатика";
string b;
Console.WriteLine("Исходный текст:\t" +a );
b=a.Replace('а', 'о');
b=b.Replace('м', 'н');
Console.WriteLine("Новый текст:\t" + b);
Console.ReadLine();
}
}
}
Результаты расчета см. рис. 10.120.
322
Способ 2.
Программный код:
using System;
namespace C85
{
class Program
{
static void Main(string[] args)
{
string a = "информатика", b = "";
char c;
int L = a.Length;
Console.WriteLine("Исходный текст:\t" + a );
for (int i = 0; i <= (L - 1); i++)
{
c = a[i];
if (c == 'а')
b = b + 'о';
else if (c == 'м')
b = b + 'н';
else
b = b + c;
}
Console.WriteLine("Новый текст:\t" + b);
Console.ReadLine();
}
}
}
323
Способ 3.
Программный код:
using System;
namespace C87
{
class Program
{
static void Main(string[] args)
{
string a = "информатика", b = "";
string c;
Console.WriteLine("Исходный текст:\t" +a);
int L = a.Length;
for (int i = 0; i <= (L - 1); i++)
{
c = a.Substring(i,1);
if (c == "а")
b = b + "о";
else if (c == "м")
b = b + "н";
else
b = b + c;
}
Console.WriteLine("Новый текст:\t" + b);
Console.ReadLine();
}
}
}
324
Программный код:
using System;
namespace C108
{
class Program
{
static void Main(string[] args)
{
string s1 = "МАРТЫНОВ АНТОН ГРИГОРЬЕВИЧ";
char[] c = { 'а', 'А', 'у', 'У', 'о', 'О', 'ы', 'Ы',
'и', 'И', 'э', 'Э', 'я', 'Я', 'ю', 'Ю', 'е', 'Е' };
int n = 0; // количество гласных букв
// Вычисление количества гласных букв
for (int i = 0; i <= (s1.Length - 1); i++)
{
char c0 = s1[i];
for (int j = 0; j <= (c.Length - 1); j++)
{
if (c0 == c[j])
{
n = n + 1;
break;
}
}
}
Console.WriteLine(s1);
Console.WriteLine("Количество гласных символов= " + n);
Console.ReadLine();
}
}
}
325
Пояснение: Задан символьный массив c, содержащий гласные буквы,
строка s1 перебирается посимвольно в цикле до длины строки, обращаясь к
элементам строки по индексу. Каждый символ во вложенном цикле по очереди
сравнивается с элементами массива гласных букв. В случае сравнения значение
счетчика n увеличивается и внутренний цикл прерывается оператором break
для исключения бессмысленного продолжения цикла, т.к. сравнение уже
выполнено успешно и совпадений далее быть не может.
Программный код:
using System;
namespace C79
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите слово: ");
string s1 = Console.ReadLine();
char[] s2 = s1.ToCharArray();
Array.Reverse(s2);
s1 = new string(s2);
Console.WriteLine(s2);
Console.ReadLine();
}
}
}
326
10.7.2. Задачи для выполнения лабораторных работ
327
Ниже приведено решение задачи для варианта №26.
Программный код:
using System;
namespace C92
{
class Program
{
static void Main(string[] args)
{
string str = "АСТАХОВА АННА ВЛАДИМИРОВНА";
string f1; // Фамилия
string f2; // Имя
string f3; // Отчество
int i;
int k; // Длина строки
int k1; // Длина имени
int n; // Количество букв "А" в строке
string[] strWords;
k = str.Length;
Console.WriteLine("Длина строки = " + k + "\n ");
// Определяем количество букв "А" в строке
n = 0;
for (i = 0; i <= (k - 1); i++)
{
if ((str[i] == 'А') || (str[i] == 'а'))
n = n + 1;
}
Console.WriteLine("В строке количество букв <А> равно "
+ n + "\n");
// Строку разделяем на составные части.
// В итоге возвращается массив, содержащий подстроки
strWords = str.Split(" ".ToCharArray());
f1 = strWords[0]; // Фамилия
f2 = strWords[1]; // Имя
f3 = strWords[2]; // Отчество
Console.WriteLine(f1 + "\n" + f2 + "\n" + f3 + "\n");
//Определяем длину имени
k1 = f2.Length;
328
Console.WriteLine("Длина имени = " + k1);
// Выводим первую букву отчества
Console.WriteLine(f3[0]);
Console.ReadLine();
}
}
}
329
10.8 Структуры, перечисления
Задача 10.51.
Программный код:
using System;
namespace C114
{
struct Stud
{
public string Name, Group, Addr, PhoneNum;
public DateTime BirthDate, EntryDate;
public double CurrentAverageScore;
public Stud(string n, string g, string a, string p,
DateTime b, DateTime e, double c)
{
Name = n; Group = g; Addr = a;
PhoneNum = p; BirthDate = b;
EntryDate = e; CurrentAverageScore = c;
}
}
class Program
{
330
"ул.Центральная 3,8", "7771234",
new DateTime(1992, 5, 28),
new DateTime(2011, 7, 15), 4.3);
Y = TD.Year - X[1].BirthDate.Year;
if (X[1].BirthDate > TD.AddYears(-Y)) Y--;
Console.WriteLine("{0}, {1} лет", X[1].Name, Y);
Console.ReadLine();
}
}
}
Задача 10.52.
Программный код:
using System;
namespace C113
{
class Program
{
331
enum Colors
{
Black, Blue, Green, Cyan, Red, Magenta, Brown, White,
Gray, LtBlue, LtGreen, LtCyan, LtRed, LtMagenta,
Yellow, LtWhite
}
332
список порядкового номера цвета, имя текущего элемента списка перечисления
и элемент строкового массива в качестве описания текущего цвета. В строке
формата кроме номера параметра через запятую указывается размер поля, что
формирует таблицу. Так как размер поля положительный, выравнивание в поле
производится по правому краю.
По умолчанию номер каждого следующего элемента списка перечислення
больше предыдущего на единицу. Нумерация начинается с нуля. Внутри списка
любому элементу можно присвоить целое число – номер больший, чем номер по
умолчанию. Нумерацию можно начинать не с нуля, а например с двух.
Пример
enum Colors
{
Black = 2, Blue, Green, Cyan, Red, Magenta, Brown, White,
Gray, LtBlue, LtGreen, LtCyan, LtRed, LtMagenta, Yellow, LtWhite
}
В этом примере все последующие после Black элементы будут иметь
номер на единицу больше предыдущего.
Задавать номер элемента можно также и внутри списка:
Пример
enum Colors
{
Black, Blue, Green, Cyan, Red, Magenta, Brown, White, Gray = 31,
LtBlue, LtGreen, LtCyan, LtRed, LtMagenta, Yellow, LtWhite
}
Если номер элемента White равен семи, то номер элемента Gray равен
31 и, соответственно, все последующие за ним элементы имеют номер, на
единицу больше предыдущего.
333
средний балл студента больше 4,0
студенты имеют оценки 4 и 5
студенты имеют хотя бы одну оценку 2.
Если таких студентов нет, вывести соответствующее сообщение.
10.9 Файлы
334
namespace C124
{
class Program
{
static void Main(string[] args)
{
const int n = 15; // количество элементов массива
double[] F = new double[n];
double[] FRES = new double[n];
int i;
double s;
// Файл открывается для записи
FileStream fsW = new FileStream("F:\\file1.dat",
FileMode.Create, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fsW);
Console.WriteLine("Вычисленные элементы массива");
for (i = 0; i <= (n - 1); i++)
{
F[i] = i * i + i / 15.0 - 12;
// Вычисленные элементы массива выводятся на экран
Console.WriteLine(F[i].ToString("F3"));
// Элементы массива записываются в файл
bw.Write(F[i]);
}
Console.WriteLine();
bw.Close();
fsW.Close();
s = 0;
// Файл открывается для чтения
FileStream fsR = new FileStream("F:\\file1.dat",
FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fsR);
Console.WriteLine("Прочитанные элементы файла");
for (i = 0; i <= (n - 1); i++)
{
// Элементы файла вычитываются и записываются
// в элементы массива
FRES[i] = br.ReadDouble();
Console.WriteLine(FRES[i].ToString("F3"));
s = s + FRES[i];
}
335
br.Close();
fsR.Close();
Console.WriteLine();
Console.WriteLine("s={0,7:F3} ", s);
Console.ReadLine();
}
}
}
Пояснение:
1) Для того чтобы использовать в программе файлы, необходимо:
а) Подключить пространство имен, в котором описываются стандартные
классы для работы с файлами (using System.IO).
б) Создать файловый поток и связать его с физическим файлом.
336
в) Произвести операции обмена (ввод-вывод).
г) Закрыть файл
Для работы с числовыми данными типа int или double лучше создать
объекты классов BinaryWriter и BinaryReader, чьи методы Write()
(перегружен для разных типов данных), ReadInt32() и ReadDouble() как
нельзя лучше подходят для этой задачи.
3) bw.Write(F[i]);
С помощью перегруженного метода Write() класса BinaryWriter в
открытый файл циклически поэлементно записываются элементы массива.
4) bw.Close();
fsW.Close();
Пишущий объект и файл закрываются одноименными методами Close().
6) FRES[i] = br.ReadDouble();
Содержимое файла "F:\\file1.dat" последовательно «вычитывается»
337
от имени объекта br типа BinaryReader методом ReadDouble() в массив-
приёмник FRES.
Для проверки результата, значения элементов массива выводятся в
консольное окно программы с помощью статического метода WriteLine()
библиотечного класса Console:
Console.WriteLine(FRES[i].ToString("F3"));
7) br.Close();
fsR.Close();
Читающий объект и файл закрываются одноименными методами Close().
338
Программный код:
using System;
using System.IO;
namespace C128
{
class Program
{
static void Main(string[] args)
{
const int n = 15; // количество элементов массива
double[] FRES = new double[n];
int i;
int n1; // количество элементов файла file2.dat
int n2; // количество элементов файла file3.dat
// Файл открывается для чтения
FileStream fsR = new FileStream("F:\\file1.dat",
FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fsR);
// Файл открывается для записи
FileStream fsW1 = new FileStream("F:\\file2.dat",
FileMode.Create, FileAccess.Write);
BinaryWriter bw1 = new BinaryWriter(fsW1);
// Файл открывается для записи
FileStream fsW2 = new FileStream("F:\\file3.dat",
FileMode.Create, FileAccess.Write);
BinaryWriter bw2 = new BinaryWriter(fsW2);
n1 = 0; n2 = 0;
Console.WriteLine("Элементы файла file1.dat ");
for (i = 0; i <= (n - 1); i++)
{
// Чтение файла
FRES[i] = br.ReadDouble();
// Вывод элементов файла на экран
Console.WriteLine(FRES[i].ToString("F3"));
if (FRES[i] >= 0)
{
bw1.Write(FRES[i]);
n1 = n1 + 1;
}
339
else
{
bw2.Write(FRES[i]);
n2 = n2 + 1;
}
}
br.Close();
fsR.Close();
bw1.Close();
fsW1.Close();
bw2.Close();
fsW2.Close();
Console.WriteLine();
Console.WriteLine("n1={0}; n2={1}", n1, n2);
Console.WriteLine();
// Файл открывается для чтения
FileStream fsR2 = new FileStream("F:\\file2.dat",
FileMode.Open, FileAccess.Read);
BinaryReader br2 = new BinaryReader(fsR2);
// Файл открывается для чтения
FileStream fsR3 = new FileStream("F:\\file3.dat",
FileMode.Open, FileAccess.Read);
BinaryReader br3 = new BinaryReader(fsR3);
double[] F2 = new double[n1];
double[] F3 = new double[n2];
Console.WriteLine("Элементы файла file2.dat ");
for (i = 0; i <= (n1 - 1); i++)
{
// Чтение файла
F2[i] = br2.ReadDouble();
// Вывод элементов файла на экран
Console.WriteLine(F2[i].ToString("F3"));
}
Console.WriteLine();
Console.WriteLine("Элементы файла file3.dat \n");
for (i = 0; i <= (n2 - 1); i++)
{
// Чтение файла
F3[i] = br3.ReadDouble();
// Вывод элементов файла на экран
340
Console.WriteLine(F3[i].ToString("F3"));
}
br2.Close();
fsR2.Close();
br3.Close();
fsR3.Close();
Console.ReadLine();
}
}
}
namespace C123
{
class Program
{
static void Main(string[] args)
{
// Файл открывается для записи
FileStream fsW = new FileStream("F:\\file4.txt",
FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fsW);
double x, y; // аргумент и значение функции
double xn = 1.0; // начальное значение переменной x
double xk = 10.0; // конечное значение переменной x
double dx = 1.0; // шаг изменения переменной
string s;
Console.WriteLine("Вычисленные значения функции y ");
for (x = xn; x <= xk; x = x + dx)
{
y = 5 * x + 3 * Math.Sin(x) + 7;
// Вычисленные значения y выводятся на экран
Console.WriteLine("x={0,6:F2} y={1,6:F3}", x, y);
// Вычисленные значения y записываются в файл
s = String.Format("x={0,6:F2} y={1,6:F3}", x, y);
sw.WriteLine(s);
}
Console.WriteLine();
sw.Close();
fsW.Close();
// Файл открывается для чтения
FileStream fsR = new FileStream("D:\\file4.txt",
FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
Console.WriteLine("Прочитанные элементы файла");
// Цикл выполняется пока не достигнут конец файла
while((s=sr.ReadLine()) !=null)
Console.WriteLine(s);
sr.Close();
342
fsR.Close();
Console.ReadLine();
}
}
}
Пояснение:
С текстовыми файлами лучше работать с помощью пишущих и читающих
объектов специализированных классов StreamWriter и StreamReader. Здесь
используются методы Write() и ReadLine().
Программа за один вызов метода ReadLine() читает по одной
физической строке. Условие полной вычитки текстового файла – возврат
методом ReadLine() значения null.
Запись строк в текстовый файл лучше осуществлять не методом Write(),
а методом WriteLine().
343
Содержимое текстового файла (F:\\file5.txt ):
Село! В душе моей покой.
Село в Украйне дорогой,
И, полный сказок и чудес,
Кругом села зелёный лес.
Цветут сады, белеют хаты,
А на горе стоят палаты,
И перед крашеным окном
В шелковых листьях тополя,
А там всё лес, и все поля,
И степь, и горы за Днепром.
Программный код:
using System;
using System.IO;
namespace C125
{
class Program
{
static void Main(string[] args)
{
string s1 = "файловое хранение текстовых данных";
char[] c1 = { 'а', 'А', 'у', 'У', 'о', 'О', 'ы', 'Ы',
'и', 'И', 'э', 'Э', 'я', 'Я', 'ю', 'Ю', 'е',
'Е', 'ё', 'Ё' };
char[] c2 = { 'б', 'Б', 'в', 'В', 'г', 'Г', 'д', 'Д',
'ж', 'Ж', 'з', 'З', 'й', 'Й', 'к', 'К', 'л', 'Л', 'м',
'М', 'н', 'Н', 'п', 'П', 'р', 'Р', 'с', 'С', 'т', 'Т',
'ф', 'Ф', 'х', 'Х', 'ц', 'Ц', 'ч', 'Ч',
'ш', 'Ш', 'щ', 'Щ'};
int n1 = 0; // количество гласных букв
int n2 = 0; // количество согласных букв
string Str;
// Файл открывается для чтения
FileStream fsR = new FileStream("F:\\file5.txt",
FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
while ((Str = sr.ReadLine()) != null)
{
Console.WriteLine(Str);
// Вычисление количества гласных букв
344
for (int i = 0; i <= (Str.Length - 1); i++)
{
char c0 = Str[i];
for (int j = 0; j <= (c1.Length - 1); j++)
if (c0 == c1[j])
n1 = n1 + 1;
for (int j = 0; j <= (c2.Length - 1); j++)
if (c0 == c2[j])
n2 = n2 + 1;
}
}
sr.Close(); fsR.Close(); Console.WriteLine();
Console.WriteLine("Количество гласных символов: " + n1);
Console.WriteLine("Количество согласных символов: " + n2);
Console.ReadLine();
}
}
}
Результаты расчета см. рис.10.131
345
Задача 10.57. Записать в файл значения функции
y ( x) cos( x) , 3 x 3 . Прочитать созданный файл.
namespace C109
{
class Program
{
static void Main(string[] args)
{
// Файл открывается для записи
FileStream fsW = new FileStream("F:\\file6.txt",
FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fsW);
double x, y; // аргумент и значение функции
string s;
Console.WriteLine("Вычисленные значения функции y ");
// Вывод на экран названий столбцов
Console.WriteLine("-----------------");
Console.WriteLine(" x y ");
Console.WriteLine("-----------------");
// Запись в файл названиий столбцов
sw.WriteLine("-----------------");
sw.WriteLine(" x y ");
sw.WriteLine("-----------------");
for (x = -3; x <= 3; x = x + 0.5)
{
y = 5 * x + 3 * Math.Sin(x) + 7;
// Вычисленные значения y выводятся на экран
Console.WriteLine("{0,6:F2} {1,7:F3}", x, y);
// Вычисленные значения y записываются в файл
s = String.Format("{0,6:F2} {1,7:F3}", x, y);
sw.WriteLine(s);
}
Console.WriteLine();
sw.Close();
346
fsW.Close();
// Файл открывется для чтения
FileStream fsR = new FileStream("F:\\file6.txt",
FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
Console.WriteLine("Прочитанные элементы файла");
// Цикл выполняется пока не достигнут конец файла
while ((s = sr.ReadLine()) != null)
Console.WriteLine(s);
sr.Close();
fsR.Close();
Console.ReadLine();
}
}
}
347
Способ 2. Создать Windows- приложение
ПОРЯДОК ДЕЙСТВИЙ
Форма Form1
Поле списка ListBox1
Командная Button1 Name cmdStart
кнопка Text Вычислить
Командная Button2 Name cmdEnd
кнопка Text Завершение работы
348
Рисунок 10.134 – Форма к задаче 10.57
3. Программирование.
Напишите обработчики событий щелчок мышью по командной
кнопке <Вычислить> и щелчок мышью по командной кнопке <Завершение
работы>.
Программный код:
using System;
using System.IO;
using System.Windows.Forms;
namespace W18
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
349
// Запись в файл названиий столбцов
sw.WriteLine("---------------------");
sw.WriteLine(" x y ");
sw.WriteLine("---------------------");
for (x = -3; x <= 3; x = x + 0.5)
{
y = 5 * x + 3 * Math.Sin(x) + 7;
// Вычисленные значения y записываются в файл
s = String.Format("{0,7:F2} {1,7:F3}", x, y);
sw.WriteLine(s);
}
sw.Close();
fsW.Close();
// Файл открывается для чтения
FileStream fsR = new FileStream("F:\\file7.txt",
FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
// Цикл выполняется пока не достигнут конец файла
while ((s = sr.ReadLine()) != null)
listBox1.Items.Add(s);
sr.Close(); fsR.Close();
}
}
}
350
Задача 10.58. Создать квадратную матрицу A размером n n.
Матрицу заполнить случайными целыми числами.
Матрицу построчно вывести на экран.
В текстовый файл "F:\\file10.txt"записать сначала n – число
строк и столбцов матрицы, а затем саму матрицу.
Прочитать полученный файл.
Программный код:
using System;
using System.IO;
namespace C112
{
class Program
{
static void Main(string[] args)
{
int n; // количество строк и столбцов матрицы А
Console.Write("Введите n= ");
n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
int i, j, k;
double[,] A = new double[n, n];
string S;
Random rnd=new Random();
// Файл открывается для записи
FileStream fsW = new FileStream("F:\\file10.txt",
FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fsW);
// В файл записывается сначала размер матрицы n,
// затем сама матрица построчно
Console.WriteLine("n={0}", n);
sw.WriteLine(n);
// Заполнение матрицы А,
// вывод матрицы A на экран и запись в файл
Console.WriteLine("Элементы матрицы A ");
for (i = 0; i <= (n - 1); i++)
{
for (j = 0; j <= (n - 1); j++)
{
351
k = rnd.Next(1, 9);
Console.Write(k + " ");
sw.Write(k + " ");
}
Console.WriteLine(); sw.WriteLine();
}
Console.WriteLine();
sw.Close();
fsW.Close();
// Файл открывается для чтения
FileStream fsR = new FileStream("D:\\file10.txt",
FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsR);
S = sr.ReadLine(); // Прочитать строку
n = Convert.ToInt32(S); // Получить размер матрицы
Console.WriteLine("n= {0}", n);
Console.WriteLine("Элементы файла file10.dat ");
// Чтение файла и вывод на экран
for (i = 0; i <= (n - 1); i++)
{
// Построчно читать данные
S = sr.ReadLine();
// Разобрать данные строки, разделяя числа пробелом
// либо знаком табуляции
string[] SA = S.Split(new Char[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries);
// Заполнить строку массива числами строки файла
for (j = 0; j <= (n - 1); j++)
{
A[i, j] = Convert.ToInt32(SA[j]);
Console.Write( A[i, j] + " " );
}
Console.WriteLine();
}
Console.WriteLine();
sr.Close(); fsR.Close();
Console.ReadLine();
}
}
}
352
Результаты расчета см. рис.10.136.
Пояснение:
string[] SA = S.Split(new Char[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries);
353
Список литературы
354
Навчальне видання
ПРОГРАМУВАННЯ НА МОВІ C#
Навчальний посібник
для студентів хімічних спеціальностей
в тому числі для іноземних студентів
Російською мовою
В авторській редакції
355
План 2015 р., поз. 36
356