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

Введение в программирование на языке C#

.pdf
Скачиваний:
75
Добавлен:
23.02.2015
Размер:
1.13 Mб
Скачать

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

(FLOPS -Floating point Operations Per Second).

Программа и полученные данные демонстрируются преподавателю. В отчет следует поместить листинг программы с комментариями к каждому оператору, таблицу результатов и выводы.

Примечание. Для расчета производительности используйте производные единицы измерения:

1 килофлопс = 103 флопс, 1 мегафлопс = 106 флопс, 1 гигафлопс = 109 флопс, 1 терафлопс = 1012 флопс.

III. Операторы циклов и режим отладки

Цель работы : циклические вычисления, приемы пошагового выполнения, оперативный контроль и коррекция значений, числовые матрицы

Введение

Среда программирования Microsoft Visual предоставляет широкие возможности для отладки программного кода. Управление отладкой осуществляется с помощью меню Debug :

Рисунок 8. Меню управления отладочным режимом Технология отладки в общем случае сводится к следующим операциям:

пометить некотрую строку программы, как точку останова (клавишей F9 или мышкой в полосе, расположенной слева в окне редактирования);

выполнить часть кода до точки останова (F5);

следующий за точкой останова отлаживаемый фрагмент программы проша-

гать с помощью клавиш F10 или F11 по отдельным операторам, наблюдая за изменениями объектов в окне Локальные.

ЗАДАНИЕ 1. Наберите код примера Cicly1. Назначьте точку останова на операторе объявления переменной. В пошаговом режиме выполните 6 повторений цикла while, после чего поместите в отчёт эскиз консольного окна и окна Локальные.

11

using System; class Cicly1

{

 

static void Main()

 

 

{

 

 

char c = 'A';

 

 

while (c <= 'Z')

 

 

Console.Write(" " + c++ );

 

}

}

 

 

 

ЗАДАНИЕ 2. Используя возможности окна Локальные

(не меняя программный

код)

добейтесь, чтобы следующей после буквы F в консольное окло была выведена

буква (по указанию преподавателя) :

 

R,

S, T, V, W, d, f, h, q, r, t,

v, w, z,

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

Исследование двойных циклов

ЗАДАНИЕ 3. Наберите код примера Cicly2. Разместите точку останова таким образом, чтобы при запуске на выполнение в режиме отладки (F5), в консольное окно были выведены две строки следующего вида:

Рисунок 9 . Содержимое консольного окна.

Укажите (в отчёте), в какой строке размещена точка останова, поместите в отчёт эскиз окна Локальные в точке останова.

using System; class Cicly2

{

static void Main()

{

for (int i = 0; i < 10; i++)

{

Console.WriteLine("\n i= {0}", i); for (int j = 0; j < 10; j += 2)

Console.Write(" j= {0}", j);

}

Console.WriteLine();

}

}

ЗАДАНИЕ 4. Выполните модификацию примера Cicly2 для осуществления следующих действий (по указанию преподавателя):

1.Вывод на экран значения переменной i после окончания цикла;

2.Вывод на экран значения переменной j после окончания цикла;

3.Вывод на экран полного количества повторений внутреннего цикла;

12

4.Вывод на экран суммы всех значений переменной i;

5.Вывод на экран суммы всех значений переменной j;

6.Вывод на экран таблицы целых чисел (10х10), каждый элемент которой – произведение номера строки на номер столбца;

7.Вывод на экран таблицы целых чисел (10х10), каждый элемент которой – сумма номера строки и номера столбца;

8.Вывод на экран таблицы целых чисел (10х10), каждый элемент которой – разность номера столбца и номера строки;

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

Стандартные приёмы обработки числовых матриц

ЗАДАНИЕ 5. Наберите код примера Array1, запустите на выполнение. Замените цикл foreach, который выводит элементы на экран, на двойной цикл for, с условием, чтобы вывод на экран массива mas остался в прежней форме. Продемонстрируйте результат преподавателю. Фрагмент программы, в котором выполнены изменения, поместите в отчёт.

using System; class Array1

{static void Main()

{int[,] mas = new int[10,10]; Random Gen = new Random();

for (int i = 0; i < mas.GetLength(0); i++) for (int j = 0; j < mas.GetLength(1); j++)

mas[i,j] = Gen.Next(0,100); Console.WriteLine("\t\t\t\tЭлементы массива"); int k = 0;

foreach (int j in mas)

{Console.Write("{0,8}", j); k++;

if (k % 10 == 0) Console.WriteLine();

}

int сумма=0 ;

foreach (int j in mas) сумма+=j; Console.WriteLine("Сумма элементов массива = {0}",сумма);

}

}

ЗАДАНИЕ 6. Выполните модификацию примера Array1 для расчета и вывода на экран одной из характеристик массива (по указанию преподавателя):

1.максимум нижнетреугольной части матрицы;

2.максимум верхнетреугольной части матрицы;

3.минимум нижнетреугольной части матрицы;

4.минимум верхнетреугольной части матрицы;

5.минимум главной диагонали матрицы;

6.максимум главной диагонали матрицы;

13

7.минимум второстепенной диагонали матрицы;

8.максимум второстепенной диагонали матрицы;

9.среднеарифметическое значение строк матрицы;

10.среднеарифметическое значение столбцов матрицы;

11.среднеарифметическое значение элементов нижнетреугольной части матри-

цы;

12.среднеарифметическое значение элементов верхнетреугольной части мат-

рицы;

13.суммы строк матрицы;

14.суммы столбцов матрицы;

15.минимальные значения строк;

16.минимальные значения столбцов;

17.максимальные значения строк;

18.максимальные значения столбцов;

19.среднеарифметические значения строк;

20.среднеарифметические значения столбцов;

21.результат умножения матрицы на вектор, задаваемый с клавиатуры;

22.результат умножения матрицы на матрицу;

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

IV. Алгоритмы сортировки

Цель работы: освоение и исследование основных методов упорядочения числовых данных

а) Метод минимакс б) Метод пузырёк

Рисунок 10. Блок схемы методов сортировки одномерного массива

14

ЗАДАНИЕ 1. Наберите код примера Сортировка1, реализующий метод минимакса для сортировки массива m, запустите на выполнение.

using System; class Сортировка1

{

static void Main()

{

string s;

Console.WriteLine("Задайте количество элементов массива"); s = Console.ReadLine();

int k = Convert.ToInt32(s); int[] m = new int[k]; Random Gen = new Random();

for (int i = 0; i < m.Length; i++) m[i] = Gen.Next(1,100); Console.WriteLine("Элементы массива");

foreach (int j in m) Console.Write("{0,8}", j);

Минимакс(m);

Console.WriteLine("\nМассив после сорт. по возрастанию"); foreach (int j in m) Console.Write("{0,8}", j);

}

static void Минимакс(int[] m)

{

int min, imin;

for (int j = 0; j < m.Length - 1; j++)

{

min = m[imin = j];

for (int i = j + 1; i < m.Length; i++) if (min > m[i]) min = m[imin = i];

m[imin] = m[j]; m[j] = min;

}

}

}

Исследование методов сортировки

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

DateTime d1 = DateTime.Now;

Минимакс(m);

DateTime d2 = DateTime.Now; TimeSpan interval = d2 - d1;

Console.WriteLine("\nМассив после сорт по возрастанию"); foreach (int j in m) Console.Write("{0,8}", j); Console.WriteLine("Время Минимакс {0:d} тиков",

interval.Ticks);

15

Array.Reverse(m);//обратный порядок элементов

Console.WriteLine("\nМассив после Reverse"); foreach (int j in m) Console.Write("{0,8}", j); d1 = DateTime.Now;

Array.Sort(m);// сортировка массива по возрастанию d2 = DateTime.Now;

interval = d2 - d1; Console.WriteLine("\nМассив после Sort"); foreach (int j in m) Console.Write("{0,8}", j);

Console.WriteLine("Время Sort {0:d} тиков",interval.Ticks);

ЗАДАНИЕ 2. Проверьте работоспособность полученного варианта. Закомменти-

руйте все строки, осуществляющие вывод на экран элементов массива. Найдите количество элементов массива, для которого продолжительность сортировки методом Array.Sort(), измеренная в тиках, отлична от нуля (в отчёт). Рассчитайте, во сколько раз метод Минимакс выполняется дольше, чем Array.Sort() для данного количества элементов.

ЗАДАНИЕ 3. Замените в программном коде метод Минимакса на метод Пузырёк, который сортирует массив m по убыванию. Результаты продемонстрируйте преподавателю. По образцу ЗАДАНИЯ2 исследуйте быстродействие пузырковой сортировки (с использованием и без использования условия досрочного завершения) для одного из указанных преподавателем вариантов:

1.Сортируемый массив – типа short;

2.Сортируемый массив – типа byte;

3.Сортируемый массив – типа ushort;

4.Сортируемый массив – типа sbyte;

5.Сортируемый массив – типа uint;

6.Сортируемый массив – типа long;

7.Сортируемый массив – типа ulong;

8.Сортируемый массив – типа float;

9.Сортируемый массив – типа double;

10.Сортируемый массив – типа decimal;

Результаты продемонстрируйте преподавателю, в отчёте заполните таблицу:

Тип сортируемого массива

Количество элементов

Продолжительность сортировки методом Array.Sort(), тик

Продолжительность сортировки методом Пузырёк() с использованием досрочного завершения, тик

Продолжительность сортировки методом Пузырёк() без использования досрочного завершения, тик

 

 

 

 

 

 

 

 

 

 

16

В отчёте сформулируйте выводы о соотношении продолжительности различных методов сортировки (минимакса, пузырька, встроенной).

V. Работа с комплексными числами

Цель работы: разработка и использование пользовательского типа, перегрузка операций и переопределение методов

Введение

Геометрической интерпретацией комплексного числа является, как известно, радиус-вектор: действительная и мнимая составляющие комплексного числа служат координатами этого вектора в декартовой системе, а модуль и угол – координатами в полярной системе (рис. 11,а ).

а) геометрический смысл;

б) размещение в типе Complex

 

Рисунок 11. Комплексное число

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

using System; class Complex1 {struct Complex

{

double Real,Image;

public Complex(int inR, int inI)

{ Real = inR; Image = inI; } public override string ToString()

{ string s;

if (Image >= 0) s = Real + "+j" + Image; else s = Real + "-j" + Image*(-1);

return s;

}

public static Complex operator +(Complex arg1,Complex arg2)

{Complex argout;

argout.Real = arg1.Real + arg2.Real; argout.Image = arg1.Image + arg2.Image;

return argout;

}

}

static void Main()

{int re1, re2, im1, im2; re1=ReadInt("Real1"); im1=ReadInt("Image1");

17

re2=ReadInt("Real2");

im2=ReadInt("Image2");

Complex a

=

new

Complex(re1, im1),

b

=

new

Complex(re2, im2);

Complex

c = a + b;

string s = c.ToString(); Console.WriteLine("Суммарное значение " + s);

}

static int ReadInt(string str)//метод ввода с клавиатуры

{Console.WriteLine("Задайте значение " + str);

string

s = Console.ReadLine();

int i= Convert.ToInt32(s); return i;

}

}

ЗАДАНИЕ 1. Наберите код примера Complex1, проверьте его работоспособность. Добавьте в тип Complex элементы, необходимые для размещения полярных координат комплексного числа (либо в форме полей, либо в форме свойств).

ЗАДАНИЕ 2. Реализуйте в типе Complex функцию обработки комплексных чисел

спомощью неособого и операторного метода ( по указанию преподавателя):

1.Умножение комплексных чисел в декартовых координатах;

2.Деление комплексных чисел в декартовых координатах;

3.Возведение комплексных чисел в целую степень в полярных координатах;

4.Умножение комплексных чисел в полярных координатах;

5.Деление комплексных чисел в полярных координатах;

6.Сложение комплексных чисел в полярных координатах;

7.Вычитание комплексных чисел в полярных координатах;

8.Поворот радиус-вектора на заданный угол (в декартовых координатах);

9.Растяжение/сжатие радиус-вектора в заданное число раз (в декартовых координатах);

Справка : для двух комплексных чисел complex1= Re1+jIm1

и

complex2= Re2+jIm2 справедливы следующие соотношения:

 

а) в декартовых координатах

 

complex1*complex2=(Re1*Re2-Im1*Im2) + j(Re1*Im2+Re2*Im1),

 

complex1/complex2=(Re1*Re2+Im1*Im2)/(Re22+Im22)+

 

+j(Re2*Im1–Re1*Im2)/(Re22+Im22),

 

б) в полярных координатах

 

complex1*complex2=Mod1*Mod2(Cos(α1+α2)+j sin(α1+α2)),

 

complex1/complex2=Mod1/Mod2(Cos(α1-α2)+j sin(α1-α2)),

 

complex1n=Mod1n (Cos(n*α1) + j sin(n*α1)),

 

complex1+complex2=ModΣ( Cos(αΣ) + j sin(αΣ)),

 

18

ModΣ =

√ (Re1 + Re2)2 + (Im1 + Im2)2 ,

αΣ = arctg ( ( Im1 + Im2)/(Re1 + Re2) ).

В отчет по данному пункту должен содержать: задание; текст программы;

схему разработанного типа; блок-схему программы.

VI Курсовая работа "Оценка точности методов численного интегрирования"

Введение

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

а) б)

Рисунок 12. Метод входящих а) и выходящих б) прямоугольников Так в методе прямоугольников площадь под графиком функции (и определен-

ный интеграл от a до b) может быть определен : а) для входящих прямоугольников

b

f(x)dx≈ ((b-a)/n) (y0+y1+…+yn-1)

a

б) для выходящих прямоугольников

b

f(x)dx≈ ((b-a)/n) (y1+y2+…+yn),

a

где n – кратность (количество шагов) интегрирования, yi = f(xi) .

Для уточнения значения интеграла существует т.н. формула остаточного члена:

 

b a 3

*

 

H

2

 

 

24n

 

 

 

 

где

max

 

f

 

 

 

 

 

 

 

 

( x)

 

 

x [ a,b]

 

 

 

 

В методе трапеций (рис.13) площадь криволинейной трапеции, ограниченной линиями x=a, x=b, y=0, y=f(x), а значит (следуя из геометрического смысла), и

19

значение интеграла, приблизительно равна сумме площадей обычных трапеций с основаниями yi-1 и yi и высотой h=(b-a)/n.

Рисунок 13. Геометрическая интерпретация метода трапеций

Площадь каждой трапеции, как известно, равна произведению полусуммы осно-

вания на высоту. Так для первой трапеции

S1= y0 y1 *h y0 y1 * b a

2

2

n

Весь интеграл может быть вычислен по формуле:

b

 

 

y

y

1

 

y

y

2

 

 

y

 

y

n

 

 

 

 

y

 

y

1

 

y

 

y

2

 

 

y

y

n

 

a f ( x)dx

 

 

0

 

h

 

1

h

...

 

n 1

 

h h(

 

0

 

 

 

1

 

...

 

n 1

)

 

 

2

 

 

2

 

 

2

 

 

2

 

 

 

2

 

 

2

 

h(

y0 2y1

2y2

... 2yn 1 yn

) h(

 

y0 yn

 

2y1

 

 

2y2

 

...

2yn 1

 

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b a

 

y0

yn

 

2

 

 

 

 

 

 

2

2

 

 

2

 

 

 

 

2

 

 

 

 

 

 

 

 

(

y1 y2

... yn 1 )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Формула остаточного члена для метода трапеций имеет вид:

Н

( b a

)

* * h 2 ,

 

 

12

 

 

где max f ( x)

x [ a,b]

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

Уравнение параболы с осью, параллельной оси Oy, имеет вид: y Ax2 Bx C . Коэффициенты A, B и C однозначно определяются из условия, что парабола

проходит через три заданные точки. Аналогичные параболы строятся и для других пар отрезков. Сумма площадей параболических трапеций и даст приближённое значение интеграла.

При этом площадь одной параболической трапеции равна:

h

S 3(y0 4y1 y2 ) ,

где y0 и y2- крайние ординаты, а y1- ордината кривой в середине отрезка. Доказательство:

20