42723

Основы языка С# и знакомство с основными элементами управления C#

Лабораторная работа

Информатика, кибернетика и программирование

В C как и в C C нумерация элементов массива идет с нуля. Естественно что в нашем примере у массива 6 =23 элементов k[00] первый k[12] последний.rry Элемент Вид Описание Length Свойство Количество элементов массива по всем размерностям Rnk Свойство Количество размерностей массива BinrySerch Статический метод Двоичный поиск в отсортированном массиве Cler Статический метод Присваивание элементам массива значений по умолчанию Copy Статический метод Копирование заданного диапазона элементов одного массива в другой массив CopyTo...

Русский

2013-10-30

430 KB

197 чел.

ЛАБОРАТОРНАЯ РАБОТА №1

ПО ДИСЦИПЛИНЕ «ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ»

Тема занятия -  Основы языка С# и знакомство с основными элементами управления C#:

  1.  Составление линейных программ
  2.  Работа с массивами

  1.  Теоретическое введение

1.1 История создания C# и среда выполнения NET Runtime.

C# (произносится Си-Шарп) - это новый язык программирования от компании Microsoft. Он входит в новую версию Visual Studio - Visual Studio.NET.

Одна из причин разработки нового языка компанией Microsoft - это создание компонентно-ориентированного языка для новой платформы .NET. Другие языки были созданы до появления платформы .NET, язык же C# создавался специально под эту платформу и не несет с собой груза совместимости с предыдущими версиями языков.

Еще одна из причин разработки компанией Microsoft нового языка программирования - это создание альтернативы языку Java. Реализация Java у Microsoft не была лицензионно. Компания Sun, владелица Java, подала на Microsoft в суд, и Microsoft этот суд проиграла. Тогда Microsoft решила вообще отказаться от Java, и создать свой Java-подобный язык, который и получил название C#. Что будет с Java после выхода C# - пока неизвестно. Скорей всего эти языки будут существовать оба, хотя ясно, что одна из целей разработки C# - это противоборство именно с Java (недаром C# называют еще Java-killer'ом).

Код, получаемый в результате компиляции программы,  написанной на C# выполняется в среде NET Runtime. Среда выполнения NET Runtime  основана не на ассемблере (т. е. не на коде, родном для процессора), а на некотором промежуточном коде. Отдаленно он напоминает виртуальную Java машину. Только если в случае Java был только один язык для виртуальной машины, то для NET Runtime таких языков может быть несколько. Теоретически программа для среды NET Runtime может выполняться под любой операционной системой, в которой NET Runtime установлена. Но на практике пока единственная платформа для этого - это Windows.

NET Runtime состоит из нескольких частей. Одна из них - это Common Language Runtime. Это, говоря кратко, это некоторый набор стандартов, которые должны поддерживать все языки платформы .NET. Например, в предыдущих версиях Visual Studio была такая проблема, что разные языки по-разному хранили данные одного по идее типа. Так, скажем, тип целого в Visual Basic'е занимал два байта, а в Visual C++ - четыре. А это порождало проблемы при совместном использовании языков. Common Language Runtime как раз в частности и определяет стандартные для все языков .NET типы данных. И уже есть гарантии, что целый тип в одном языке будет в точности соответствовать одноименному типу в другом.

Еще одна важная часть NET Runtime - это набор базовых классов. Их очень много (порядка несколько тысяч). Кроме того, эти классы относятся не к конкретному языку, а к NET Runtime. То есть мы получается набор классов, общий для всех языков .NET, что достаточно удобно.

Именно NET Runtime берет на себя некоторые рутинные функции. Например, в нем организована сборка мусора. И если раньше программисту приходилось самому освобождать объекты, созданные динамически, то теперь эту задачу берет на себя среда NET Runtime. Еще одно свойство среды NET Runtime - это проверка типов. Означает это вот что. Когда программа выполняется, то в принципе некоторой функции можно подсунуть параметр неправильного типа. Скажем вместо целого подставить действительное число или еще что-нибудь в этом роде. Языки типа C++ свои параметры функций не проверяют, в результате чего записанная переменная большего размера может повредить чужую область памяти и программа может просто рухнуть. Еще классический пример на эту тему - это выход за пределы массива. В NET Runtime же такого невозможно. NET Runtime сама позаботится о проверке типов и других вещах.

Существует несколько языков для NET Runtime. В настоящее время это C#, VB.NET и Visual C++. Кроме того фирма Borland объявила, что ее продукты C++ Builder и Delphi тоже будут поддерживать NET Runtime.

1.2 Линейные программы на C#

Для создания консольного приложения на C# выполняем следующие действия:

  1.  Запускаем Visual Studio.NET. Для создания нового пустого проекта C# нажимаем на кнопку в New Project  или нажимаем комбинацию клавиш Ctrl + Shift + N, или просто заходим в меню File и далее выбираем New и затем Project.
  2.  В появившемся окне New Project слева выбираем Visual C#, а справа тип приложения - Console Application:
  3.  В качестве имени проекта (Name) набираете любое имя.
  4.  Программа просто выведет некоторое фиксированное слово в консольное окно. Ее листинг имеет вид:

using System;

namespace first

{

   /// <summary>

   /// Summary description for Class1.

   /// </summary>

   class Class1

   {

       /// <summary>

       /// The main entry point for the application.

       /// </summary>

       [STAThread]

       static void Main(string[] args)

       {

           //

           // TODO: Add code to start application here

           //

           Console.WriteLine("Привет из C#");

       }

   }

}

Запускаем программу, нажав Ctrl+F5.

Разберем текст программы подробнее. В.NET Runtime существуют пространства имен. Одно из таких пространств - это System. Оно добавляется автоматически в любой проект на C#. Так как в программу добавили строку

...

using System;

...

то можно вместо длинных имен использовать более короткие. В частности, вместо System.Console можно писать просто Console. Что и делается в строке

...

Console.WriteLine("Привет из C#");

...

Далее  в программе объявляем класс Class1. В C# не существует глобальных функций, так что  требуется   завести сначала класс и затем функцию Main в нем. Функция Main обязательно должна быть в каждой программе на C#, и именно с этой функции и начинается выполнение программы. Эта функция пишется с прописной (большой) буквы. C# различает строчные и прописные буквы. Кроме того, эта функция объявлена с модификатором static. Это означает, что она не относится к конкретному экземпляру класса Class1, а принадлежит всему классу. В нашей функции Main мы просто выводим на экран некоторую строку методом WriteLine.

1.3 Переменные языка C#

Для каждого типа данных C# существует соответствующий тип данных в CRL (Common Language Runtime). Это, в частности, означает, что каждый тип имеет два названия - полное (из CLR, его можно использовать в любом языке .NET) и сокращенное, которое используется в C#.

Основные типы данных перечислены в следующей таблице 1.

Таблица 1 Основные типы данных C#

Тип C#

Тип CLR

Размер в байтах

Пояснение

int

Int32

4

Целое (со знаком)

float

Single

4

Вещественное число

char

Char

-

Символ (Unicode)

bool

Boolean

-

Логический тип

short

Int16

2

Короткое целое (со знаком)

long

Int64

8

Длинное целое (со знаком)

string

String

-

строка

byte

Byte

1

байт

decimal

Decimal

8

Вещественное число фиксированной точности

Если  использовать длинные имена, то следует  писать что-то вроде System.Int32 для типа int и т. п. (т. е. приписывать слово System перед CLR-именем). Или же  добавить строку

using System;

в начале программы (хотя, впрочем, она там скорей всего и так есть).

Таким образом, следующие три объявления переменной k равносильны:

  1.  int k;

  1.  using System;

...

Int32 k;

  1.  System.Int32 k;

Объявление переменной можно совместить с инициализацией (заданием начального значения): int z=88;

Набор операторов для C# достаточно стандартен + , -, *, / - действуют как и в любом другом языке. Отметим только, что / (деление) применительно к целым числам дает целую часть от деления. Так, фрагмент

 int k=100999, n=1000, s;

 s=k/n;

 Console.WriteLine(s.ToString());

выведет на экран 100, а не 101, т. е. никакого округления не происходит.

Есть еще один оператор - %. Это - остаток от деления. Следующий фрагмент выведет на экран 999:

 int k=100999, n=1000, s;

 s=k%n;

 Console.WriteLine(s.ToString());

Как и в других C-подобных языках, в C# существуют операторы инкремента и декремента. Так, после следующего фрагмента k увеличится на 1, а n - уменьшится на 1:

k++;

n--;

1.4 Логические операторы

Как и в других C-подобных языках, в C# существуют следующие логические операторы (см. таблицу 2):

Таблица 2 Логические операторы C#

Оператор

Описание

Пример

&&

Логическое И. Результат равен true, только если оба операнда равны true

(x==8) && (y==5)

||

Логическое ИЛИ. Результат равен false, только если оба операнда равны false

(y>8) || (y<5)

!

Отрицание. Изменяет логическое значение на противоположное

if(!(a==b))...

Все эти операторы возвращают результат типа bool.

Для знака == («равно») существует парный знак != («не равно»). Так, приведенный выше пример для оператора ! можно переписать так:

if(!(a==b))...

В C#, в отличии от многих других языков программирования, нельзя вместо false использовать 0, а вместо true - любое ненулевое число. Так, следующий фрагмент содержит ошибку:

 int k;

 ...

 If  (k) //Ошибка!

 ...

1.5  Массивы в C#

Массивы в C# несколько отличаются от других C-подобных языков.

Пример первый:

 ...

 int[] k;     //k - массив

 k=new int [3];    //Определяем массив из 3-х целых

 k[0]=-5; k[1]=4; k[2]=55;  //Задаем элементы массива

 //Выводим третий элемент массива

 Console.WriteLine(k[2].ToString());

 ...

Смысл приведенного фрагмента ясен из комментариев. Обратите внимание на некоторые особенности. Во-первых, массив определяется именно как

int[] k;

а не как один из следующих вариантов:

int k[]; //Неверно!

int k[3]; //Неверно!

int[3] k; //Неверно!

Во-вторых, так как массив представляет из себя ссылочный объект, то для создания массива необходима строка

k=new int [3];

Именно в ней мы и определяем размер массива. Хотя, вообще говоря, возможны конструкции вида

int[] k = new int [3];

Элементы массива можно задавать сразу при объявлении. Вот пример:

int[] k = {-5, 4, 55};

Разумеется, приведенные конструкции применимы не только к типу int и не только к массиву размера 3.

В C#, как и в C/C++, нумерация элементов массива идет с нуля. Таким образом в нашем примере начальный элемент массива - это k[0], а последний - k[2]. Элемента k[3], разумеется, нет.

Теперь переходим к многомерным массивам. Вот так задается двумерный массив:

int[,] k = new int [2,3];

Обратите внимание, что пара квадратных скобок только одна. Естественно, что в нашем примере у массива 6 (=2*3) элементов (k[0,0] - первый, k[1,2] - последний).

Аналогично мы можем задавать многомерные массивы. Вот пример трехмерного массива:

int[,,] k = new int [10,10,10];

А вот так можно сразу инициализировать многомерные массивы:

int[,] k = {{2,-2},{3,-22},{0,4}};

Приведенные выше примеры многомерных массивов называются прямоугольными. Если их представить в виде таблицы (в двумерном случае), то массив будет представлять из себя прямоугольник.

Наряду с прямоугольными массивами существуют так называемые ступенчатые. Вот пример:

 //Объявляем 2-мерный ступенчатый массив

 Int [][ ] k = new int [2][ ];

 //Объявляем 0-й элемент нашего ступенчатого массива

 //Это опять массив и в нем 3 элемента

 k[0]=new int[3];

 //Объявляем 1-й элемент нашего ступенчатого массива

 //Это опять массив и в нем 4 элемента

 k[1]=new int[4];

 k[1][3]=22; //записываем 22 в последний элемент массива

 ...

У ступенчатых массивов задается несколько пар квадратных скобок (столько, сколько размерность у массива). И точно так же мы что-нибудь делаем с элементами массива - записываем, читаем и т. п.

Самая важная и интересная возможность у ступенчатых массивов - это их "непрямоугольность". Так, в приведенном выше примере в первой "строке" массива k три целых числа, а во второй - четыре. Часто это оказывается очень к месту.

1.6 Функции класса System.Array

Массивы в C# основаны на классе System.Array. Методы и свойства  данного класса приведены в таблице 3

Таблица 3 Методы и свойства  класса  System.Array

Элемент

Вид

Описание

Length

Свойство

Количество элементов массива (по всем размерностям)

Rank

Свойство

Количество размерностей массива

BinarySearch

Статический метод

Двоичный поиск в отсортированном массиве

Clear

Статический метод

Присваивание элементам массива значений по умолчанию

Copy

Статический метод

Копирование заданного диапазона элементов одного массива в другой массив

CopyTo

Метод

Копирование всех элементов текущего одномерного массива в другой одномерный массив

GetValue

Метод

Получение значения элемента массива

IndexOf

Статический метод

Поиск первого вхождения элемента в одномерный массив

LastIndexOf

Статический метод

Поиск последнего вхождения элемента в одномерный массив

Reverse

Статический метод

Изменение порядка следования элементов на обратный

SetValue

Метод

Установка значения элемента массива

Sort

Статический метод

Упорядочение элементов одномерного массива

Вот пример:

using System;

namespace test

{

   class Test

   {

       static void Main(string[] args)

       {

           //Объявление массива.

           int [] num = {4, -5, 2, 0, 23};

           //Выводим массив.

           foreach (int i in num)

           {

               Console.WriteLine(i.ToString());

           }

           //Переворачиваем массив.

           Console.WriteLine("Перевернутый массив");

           Array.Reverse(num);

           foreach (int i in num)

           {

               Console.WriteLine(i.ToString());

           }

           //Сортируем массив.

           Array.Sort(num);

           Console.WriteLine("Отсортированный массив");

           foreach (int i in num)

           {

               Console.WriteLine(i.ToString());

           }

           //Обнуляем массив.

           Array.Clear(num, 0, 5);

           Console.WriteLine("Обнуленный массив");

           foreach (int i in num)

           {

               Console.WriteLine(i.ToString());

           }

       }

   }

}

Тут мы используем статические методы класса Array для сортировки, переворачивания и очистки массива. Разумеется, эти методы не единственные.

В классе Array есть, например, еще встроенный статический метод IndexOf предназначенный для поиска элемента в массиве. Вот пример его использования:

           ...

           int k=-5;

           Console.WriteLine("Число {0} находится на {1} месте.", k, Array.IndexOf(num, k));

           ...

Этот метод возвращает индекс искомого элемента (нумерация с нуля). Если такого элемента нет, то возвращается -1.

Обратите внимание, что эти методы действуют для встроенных типов (в нашем примере массив был типа int). Для пользовательских типов данных их применение тоже возможно, но для этого на приложить некоторые дополнительные усилия.

Как видите, с массивами в C# можно автоматически делать много чего полезного. В Visual C++, например, такого удобства не было.

1.7  Операторы if и switch

If служит для разветвления программы на два направления. Если некоторое условие выполняется, то программа идет в одну сторону, если не выполняется - то в другую. Вот сразу пример, определяющий, четное или нечетное число ввел пользователь:

   ...

   class Class1

   {

       ...

       static void Main(string[] args)

       {

           int k = Int32.Parse(Console.ReadLine());

           if (k%2==0)

           {

               Console.WriteLine("Четное число");

           }

           else

           {

               Console.WriteLine("Нечетное число");

           }

           Console.ReadLine();

       }

   }

Как и в других C-подобных языках, фигурные скобки можно не писать в случае одного оператора. Также написание ветви else тоже не является необходимым - все зависит от конкретной задачи.

Оператор switch примеряется тогда, когда программа должна разделится более чем на два направления.

Вот пример:

           int k = Int32.Parse(Console.ReadLine());

           Console.WriteLine(k.ToString());

           switch (k){

               case 1:

               case 2:

                   Console.WriteLine("Неудовлетворительно");

                   break;

               case 3:

                   Console.WriteLine("Удовлетворительно");

                   break;

               case 4:

                   Console.WriteLine("Хорошо");

                   break;

               case 5:

                   Console.WriteLine("Отлично");

                   break;

               default:

                   Console.WriteLine("Ошибка");

                   break;

           }

В приведенном примере в зависимости от введенного пользователем числа на экран выводится та или иная оценка. Если число k не лежит в промежутке от 1 до 5, то выполняются операторы в ветке default и выводится надпись "Ошибка". Ветка default не обязательна. Обратите внимание на оператор break. Если его не написать, то будут выполнятmся операторы из следующей ветки case до строки с break'ом (т. е. в данном примере если пользователь введет 1 или 2, то программы выведет "Неудовлетворительно"). Обратите внимание, что если в некоторой ветке case или default есть операторы, то написание break обязательно. Так, в следующих двух фрагментах кода есть ошибки:

...

   case 1:

       Console.WriteLine("Совсем неудовлетворительно");

       //Ошибка! Тут пропущен break

   case 2:

       Console.WriteLine("Неудовлетворительно");

       break;

   ...

...

   default:

       Console.WriteLine("...");

       //Ошибка! Тут пропущен break

   }

1.8 Циклы for и foreach

Пример цикла for:

int k = Int32.Parse(Console.ReadLine());

int sum=0;

for(int i=1; i<=k; i++)

{

   sum+=i;

}

Console.WriteLine(sum);

Этот пример подсчитывает сумму чисел от 1 до введенного пользователем числа k. Сумма записывается в переменную sum и выводится на экран.

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

int[] a = {-5, 4, 55};

int sum=0;

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

{

   sum+=a[i];

}

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

Теперь рассмотрим пример цикла foreach:

int[] m = {-5, 4, 10};

int sum=0;

foreach(int i in m)

{

   sum+=i;

}

В данном примере мы суммируем все элементы массива m, записывая сумму в sum.

В приведенном примере цикл перебирает все элементы массива m. На это нам указывает строка

...

foreach(int i in m){

...

которая интерпретируется так: для каждого целого числа из массива m делам что-то там. Если бы элементами массива были бы не целые, а, скажем, вещественные, то надо было бы  записать:

...

foreach(float i in m){

...

Т. е. пишется именно тип элементов массива.

1.9 Цикл while

Циклы while бывают двух видов - собственно цикл while и do-while. Оба эти цикла используются, как правило, тогда, когда точно не известно, сколько раз цикл должен выполниться.

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

Самое важное отличие между while и do-while в том, что while может не выполниться ни одного раза, тогда как do-while по крайней мере один раз выполнится. Вот примеры их использования:

string password;

do

{

   password=Console.ReadLine();

}while(password!="wi98zK");

int k=0; //Количество попыток

//заводим новую последовательность случайных чисел

Random rnd=new Random(112); //Пишем любой параметр

while(rnd.Next(1, 6)!=5)

{

   k++;

};

Console.WriteLine("С "+(k+1).ToString()+"-го раза выпало 5");

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

2 Примеры программ на С#

2.1. Составление линейных программ

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

Для известной переменной «А» вычислить Z(A)=cos(A)+sin(A)+Cos(3A)+Sin(3A);

Для решения данной задачи создайте форму, изображенную на рисунке 1.

 

Рисунок 1 – Форма для вычисления Z(A)

Для события  Click кнопки Button1 запишите следующий программный код:

private void button1_Click(object sender, EventArgs e)

{

 double a = Convert.ToDouble(textBox1.Text);

 double z = Math.Cos(a) + Math.Sin(a) + Math.Cos(3 * a) + Math.Sin(3 * a);

 textBox2.Text = Convert.ToString(z);

}

Проверьте работу приложения.

2.2. Работа с массивами

1.2.1. Одномерные массивы

Работу с одномерными массивами рассмотрим на следующем примере:

В одномерном массиве, состоящем из п вещественных элементов, вычислить

сумму элементов массива, расположенных до минимального элемента.

Для решения данной задачи создайте форму, изображенную на рисунке 2.

Рисунок 2 – Форма для работы с одномерным массивом

Список используемых элементов управления приведен в таблице 4.

Таблица 4 Список используемых элементов управления

Элемент управления

Класс

Описание

Button1

Button

Командная кнопка «Очистить»

Button2

Button

Командная кнопка «Заполнить»

Button3

Button

Командная кнопка «Сумма элементов массива до минимального»

Label1

Label

 Метка «Количество элементов»

Label2

Label

Метка «Сумма элементов массива до минимального»

textBox1

textBox

Окно ввода количества элементов в массиве

textBox2

textBox

Многострочное окно вывода  массива

textBox3

textBox

Окно вывода суммы элементов массива до минимального

Последовательность действий:

  1.  Установите у элемента управления textBox2 свойство Multiline=true для вывода каждого элемента массива в отдельной строке
  2.  Установите у элемента управления textBox2 свойство ScrollBars=Vertical для обеспечения скроллинга.
  3.  Объявите следующие глобальные переменные:

int[] a ;

int n;

  1.   Для события  Click кнопки Button1 запишите следующий программный код:

private void button1_Click(object sender, EventArgs e)

       {

           textBox2.Clear();

       }

  1.  Для события  Click кнопки Button2 запишите следующий программный код:

 private void button2_Click(object sender, EventArgs e)

       {

           n = Convert.ToInt32(textBox1.Text);

           a = new int[n];

           Random b = new Random();

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

           {

                a[i] = b.Next(10);

         textBox2.Text+=Convert.ToString(a[i])+(char)13+(char)10;

           }

       }

  1.  Для события  Click кнопки Button3 запишите следующий программный код:

private void button3_Click(object sender, EventArgs e)

       {

           int sum = 0;

           int min = a[0];

           int minind=0;

           for (int i = 1; i < n; ++i)

           {

               if (a[i] <min)

               {

                   min = a[i];

                   minind = i;

               }

           }

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

sum += a[i];

            textBox3.Text = Convert.ToString(sum);

       }

2.2.2. Двумерные «прямоугольные » массивы

Работу с двумерными  «прямоугольными» массивами рассмотрим на следующем примере задачи умножения прямоугольных матриц С=А*В.

Для решения данной задачи будем использовать элемент управления  DataGridView.

Элемент управления DataGridView позволяет отображать таблицы. Главное назначение DataGridView - связывание с таблицами внешних источников данных, прежде всего с таблицами баз данных. Но данный элемент имеет и другое применение - ввод и отображение матриц - двумерных массивов.

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

Рисунок 5- Приложение, для  перемножения матриц

Список используемых элементов управления приведен в таблице 5.

Таблица 5 Список используемых элементов управления

Элемент управления

Класс

Описание

label1

label

Надпись «матрица А»

label2

label

Надпись «матрица В»

label3

label

Надпись «матрица C»

label4

label

Надпись «m»

label5

label

Надпись «n»

label6

label

Надпись «p»

label7

label

Невидимая надпись для вывода сообщения вида «Значение элемента A[i,j]  не корректно. Повторите ввод»

label8

label

Невидимая надпись для вывода сообщения вида «Значение элемента B[i,j]  не корректно. Повторите ввод»

textBox1

TextBox

Окно ввода m

textBox2

TextBox

Окно ввода n

textBox3

TextBox

Окно ввода p

dataGridView1

DataGridView

Матрица А

dataGridView2

DataGridView

Матрица В

dataGridView3

DataGridView

Матрица С

button1

Button

Командная кнопка «Создание матриц»

button2

Button

Командная кнопка «Проверка корректности ввода»

button3

Button

Командная кнопка «Перемножение матриц»

  1.  Зададим поля, определяющие размеры матриц и сами матрицы:

int m,   n,   p;  //размеры матриц

double[,]   А,   В,   С;      //сами матрицы

  1.  Рассмотрим теперь, как выглядит обработчик события «Click» командной кнопки «Создание матриц». Предполагается, что пользователь разумен и, прежде чем нажать эту кнопку, задает размеры матриц в соответствующих текстовых окнах. При перемножении матриц размеры матриц должны быть согласованы - число столбцов первого сомножителя должно совпадать с числом строк второго сомножителя, а размеры результирующей матрицы определяются размерами сомножителей. Поэтому для трех матриц в данном случае достаточно задать не шесть, а три параметра, определяющих размеры. Обработчик события выполняет три задачи - создает сами матрицы, осуществляет чистку элементов управления DataGridView, удаляя предыдущее состояние, затем добавляет столбцы.и строки в эти элементы в полном соответствии с заданными размерами матриц. Вот текст обработчика:

 private void button1_Click(object sender, EventArgs e)

       {

           m = Convert.ToInt32(textBox1.Text);

           n = Convert.ToInt32(textBox2.Text);

           p = Convert.ToInt32(textBox3.Text);

           A = new double[m, n];

           B = new double[n, p];

           C = new double[m, p];

           // Чистка DataGridView, усли они не пусты

           int k = 0;

           k = dataGridView1.ColumnCount;

           if (k != 0)

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

                   dataGridView1.Columns.RemoveAt(0);

           dataGridView2.Columns.Clear();

           dataGridView3.Columns.Clear();

           // Заполнение DataGridView столбцами

           AddColumns(n, dataGridView1);

           AddColumns(p, dataGridView2);

           AddColumns(p, dataGridView3);

           // Заполнение DataGridView строками

           AddRows(m, dataGridView1);

           AddRows(n, dataGridView2);

           AddRows(m, dataGridView3);

       }

Чистка предыдущего состояния элементов DataGridView сводится к удалению столбцов. В программе показаны два возможных способа выполнения этой операции. Для первого элемента показано, как можно работать с коллекцией столбцов. Организуется цикл по числу столбцов коллекции и в цикле выполняется метод RemoveAt, аргументом которого является индекс удаляемого столбца. Поскольку после удаления столбца происходит перенумерация столбцов, то на каждом шаге цикла удаляется первый столбец, индекс которого всегда равен нулю. Удаление столбцов коллекции можно выполнить  сразу - вызывая метод С1еаг() коллекции, что и делается для остальных двух элементов DataGridView.

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

  1.  Текст  процедуры AddColumns:

private void AddColumns(int n, DataGridView dgw)

       {

           // добавляет n столбцов в элемент управления dgw

           DataGridViewColumn column;

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

           {

               column = new DataGridViewTextBoxColumn();

               column.DataPropertyName = "Column" + i.ToString();

               column.Name = "Column" + i.ToString();

               dgw.Columns.Add(column);

           }

       }

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

  1.  Текст  процедуры  AddRows:

private void AddRows(int m, DataGridView dgw)

       {

           // добавляет m строк в элемент управления dgw

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

           {

               dgw.Rows.Add();

               dgw.Rows[i].HeaderCell.Value = "row" + i.ToString();

           }

       }

Создав столбцы, нужно создать еще и нужное количество строк у каждого из элементов DataGridView. Делается это аналогичным образом, вызывая метод Add коллекции Rows. Чуть по-другому задаются имена строк, - для этого используется специальный объект HeaderCell, имеющийся у каждой строки и задающий ячейку заголовка.

  1.  После того как сформированы строки и столбцы, элемент DataGridView готов к тому, чтобы пользователь или программа вводила значения в ячейки сформированной таблицы.
  2.  Обработчик события «Click»  командной кнопки «Проверка корректности ввода» имеет вид:

private void button2_Click(object sender, EventArgs e)

       {

           string elem = "";

           bool correct = true;

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

                for (int j = 0; j < n; j++)

                {

                    try

                    {

                        elem=dataGridView1.Rows[i].Cells[j].Value.ToString();

                        A[i,j]=Convert.ToDouble(elem);

                        label7.Text="";

                    }

                    catch (Exception any)

                    {

                        label7.Text="Значение элемента A["+ i.ToString()+" , "+j.ToString()+" ] не корректно. Повторите ввод";

                        dataGridView1.Rows[i].Cells[j].Selected=true;

                        return;

                    }

                }

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

               for (int j = 0; j < p; j++)

               {

                   try

                   {

                       elem = dataGridView2.Rows[i].Cells[j].Value.ToString();

                       B[i, j] = Convert.ToDouble(elem);

                       label8.Text = "";

                   }

                   catch (Exception any)

                   {

                       label8.Text = "Значение элемента B[" + i.ToString() + " , " + j.ToString() + " ] не корректно. Повторите ввод";

                       dataGridView2.Rows[i].Cells[j].Selected = true;

                       return;

                   }

               }

       }

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

  Основная задача переноса данных из таблицы элемента DataGridView в соответствующий массив не вызывает проблем. Конструкция Rows[i].Cells[j] позволяет добраться до нужного элемента таблицы, после чего остается присвоить его значение элементу массива.

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

  В данном варианте нет цикла, работающего до тех пор, пока не будет введено корректное значение. Обработчик исключения просто прерывает работу по переносу данных, вызывая оператор return. Но предварительно он формирует информационное сообщение об ошибке и выводит его в форму. (Специально для этих целей у формы были заготовлены две метки).

  В сообщении пользователю предлагается исправить некорректно заданный элемент и повторить ввод - повторно нажать командную кнопку «перенести данные в массив».

  1.  Обработчик события «Click» командной кнопки «Перемножение матриц» реализует умножение матриц и отображает полученный результат в таблице соответствующего элемента DataGridView:

private void button3_Click(object sender, EventArgs e)

       {

           MulMatr(A, B, C);

           FillDG();

       }

  1.  Процедура перемножения  матриц MulMatr имеет вид:

void MulMatr(double[,] A, double[,] B, double[,] C)

       {

           int m = A.GetLength(0);

           int n = A.GetLength(1);

           int p = B.GetLength(1);

           double s = 0;

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

               for (int j = 0; j < p; j++)

               {

                   s = 0;

                   for (int k = 0; k < n; k++)

                       s += A[i, k] * B[k, j];

                   C[i, j] = s;

               }

       }

  1.  Процедура вывода результата перемножения в элемент управления dataGridView3  имеет вид:

void FillDG()

       {

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

               for (int j = 0; j < p; j++)

                   dataGridView3.Rows[i].Cells[j].Value = C[i, j].ToString();

       }

Задача решена!!!

ПРИМЕЧАНИЕ. Приложения для работы с  двумерными массивами можно выполнить как консольное приложение.

2.2.3. Двумерные «ступенчатые» массивы

Для демонстрации работы со «ступенчатыми» массивами рассмотрим консольное приложение и будем использовать класс Array. Листинг приложения имеет вид:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace stmas

{

   class Program

   {

       static void Main(string[] args)

       {

           int[][] a=new int [3][];

           a[0]=new int [5]{24,50,18,3,16};

           a[1]=new int [3]{7,9,-1};

           a[2]=new int [4]{6,15,3,1};

           Console.WriteLine("Исходный массив:");

           for (int i=0;i<a.Length;++i)

           {

               for (int j=0;j<a[i].Length;++j)

                   Console.Write("\t"+a[i][j]);

               Console.WriteLine();

           }

           Console.WriteLine(Array.IndexOf(a[0],18));

       }

   }

}

Результат работы приложения приведен на рисунке 4.

Рисунок 4 – Пример работы со «ступенчатыми массивами»

3.Задания для самостоятельной работы

3.1 Линейные программы

Напишите программу расчета по двум формулам

Вариант

Формула 1

Формула 2

1

z1=cosα + sinα +cos3α +sin3α

2

z1=cosα + sinα +cos3α +sin3α

3

z2=2sinα

4

z2=tg3α

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

3.2  Массивы в C#

3.2.1 Одномерные массивы

Вариант 1

В одномерном массиве, состоящем из п вещественных элементов, вычислить

  •  сумму отрицательных элементов массива;
  •  произведение элементов массива, расположенных между максимальным и минимальным элементами.

Упорядочить элементы массива по возрастанию.

Вариант 2

В одномерном массиве, состоящем из п вещественных элементов, вычислить

  •  сумму положительных элементов массива;
  •  произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.

Упорядочить элементы массива по убыванию.

Вариант 3

В одномерном массиве, состоящем из п целочисленных элементов, вычислить:

  •  произведение элементов массива с четными номерами;
  •  сумму элементов массива, расположенных между первым и последним нулевыми элементами.

Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом — все отрицательные (элементы, равные нулю, считать положительными).

Вариант 4

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  сумму элементов массива с нечетными номерами;
  •  сумму элементов массива, расположенных между первым и последним отрицательными элементами.

Сжать массив, удалив из него все элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 5

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  максимальный элемент массива;
  •  сумму элементов массива, расположенных до последнего положительного элемента.

Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а, b]. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 6

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  минимальный элемент массива;
  •  сумму элементов массива, расположенных между первым и последним положительными элементами.

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

Вариант 7

В одномерном массиве, состоящем из п целочисленных элементов, вычислить:

  •  номер максимального элемента массива;
  •  произведение элементов массива, расположенных между первым и вторым нулевыми элементами.

Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине — элементы, стоявшие в четных позициях.

Вариант 8

В одномерном массиве, состоящем из п вещественных элементов, вычислить

  •  номер минимального элемента массива;
  •  сумму элементов массива, расположенных между первым и вторым отрицательными элементами.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает единицу, а потом — все остальные.

Вариант 9

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  максимальный по модулю элемент массива;
  •  сумму элементов массива, расположенных между первым и вторым положительными элементами.

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

Вариант 10

В одномерном массиве, состоящем из и целочисленных элементов, вычислить:

  •  минимальный по модулю элемент массива;
  •  сумму модулей элементов массива, расположенных после первого элемента  равного нулю.

Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине — элементы, стоявшие в нечетных позициях.

Вариант 11

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  номер минимального по модулю элемента массива;
  •  сумму модулей элементов массива, расположенных после первого отрицательного элемента.

Сжать массив, удалив из него все элементы, величина которых находится в интервале [а, b]. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 12

В одномерном массиве, состоящем из п вещественных элементов, вычислить

  •  номер максимального по модулю элемента массива;
  •  сумму элементов массива, расположенных после первого положительного элемента.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [а, b], а потом — все остальные.

Вариант 13

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  количество элементов массива, лежащих в диапазоне от А до В;
  •  сумму элементов массива, расположенных после максимального элемента.

 Упорядочить элементы массива по убыванию модулей.

Вариант 14

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  количество элементов массива, равных нулю;
  •  сумму элементов массива, расположенных после минимального элемента.

Упорядочить элементы массива по возрастанию модулей.

Вариант 15

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  количество элементов массива, больших С;
  •  произведение элементов массива, расположенных после максимального по модулю элемента.

Преобразовать массив таким образом, чтобы сначала располагались все отрицательные элементы, а потом — все положительные (элементы, равные нулю, считать положительными).

Вариант 16

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  количество отрицательных элементов массива;
  •  сумму модулей элементов массива, расположенных после минимального по модулю элемента.

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

Вариант 17

В одномерном массиве, состоящем из п целочисленных элементов, вычислить:

  •  количество положительных элементов массива;
  •  сумму элементов массива, расположенных после последнего элемента, равного нулю.

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

Вариант 18

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  количество элементов массива, меньших С;
  •  сумму целых частей элементов массива, расположенных после последнего отрицательного элемента.

Преобразовать массив таким образом, чтобы сначала располагались все элементы,  отличающиеся от максимального не более чем на 20%, а потом — все остальные.

Вариант 19

В одномерном массиве, состоящем из п вещественных элементов, вычислит

  •  произведение отрицательных элементов массива;
  •  сумму положительных элементов массива, расположенных до максимального элемента.

Изменить порядок следования элементов в массиве на обратный.

Вариант 20

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

  •  произведение положительных элементов массива;
  •  сумму элементов массива, расположенных до минимального элемента.

Упорядочить по возрастанию отдельно элементы, стоящие на четных местах
и элементы, стоящие на нечетных местах.

3.2.3. Двумерные «прямоугольные» массивы

Вариант 1

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

  •  количество строк, не содержащих ни одного нулевого элемента;
  •  максимальное из чисел, встречающихся в заданной матрице более одного раза.

Вариант 2

Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента.

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

Вариант 3

Дана целочисленная квадратная матрица. Определить:

  •  произведение элементов в тех строках, которые не содержат отрицательных элементов;
  •  максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.

Вариант 4

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

  •  количество столбцов, содержащих хотя бы один нулевой элемент;
  •  номер строки, в которой находится самая длинная серия одинаковых элементов.

Вариант 5

Дана целочисленная квадратная матрица. Определить:

  •  сумму элементов в тех столбцах, которые не содержат отрицательных элементов;
  •  минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.

Вариант 6

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

  •  сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент;
  •  номера строк и столбцов всех седловых точек матрицы.

ПРИМЕЧАНИЕ  Матрица А имеет седловую точку Aij , если Aij является минимальным элементом в i-й строке и максимальным — в j столбце.

Вариант 7

Для заданной матрицы размером 8x8 найти такие к, при которых kстрока матрицы совпадает с kстолбцом.

Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

Вариант 8

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

Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.

Вариант 9

Соседями элемента Aij в матрице назовем элементы  Akl, где i - 1 < k < i + 1,

 j- 1 < l <j + 1, (k, l) ≠ (i,j). Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент которой получается как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы. Построить результат сглаживания заданной вещественной матрицы размером 10 х 10.

В сглаженной матрице найти сумму модулей элементов, расположенных ниже главной диагонали.

Вариант 10

Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей (определение соседних элементов см. в варианте 9). Подсчитать количество локальных минимумов заданной матрицы размером 10 х 10.

Найти сумму модулей элементов, расположенных выше главной диагонали.

Вариант 11

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

Найти количество строк, среднее арифметическое элементов которых меньше заданной величины.

Вариант 12

Уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполненные нулями.

Найти номер первой из строк, содержащих хотя бы один положительный элемент.

Вариант 13

Осуществить циклический сдвиг элементов прямоугольной матрицы на п элементов вправо или вниз (в зависимости от введенного режима), п может бьть больше количества элементов в строке или столбце.

Вариант 14

Осуществить циклический сдвиг элементов квадратной матрицы размером М х N вправо на k элементов таким образом: элементы первой строки сдвигаются в последний столбец сверху вниз, из него — в последнюю строку справа налево, и: нее — в первый столбец снизу вверх, из него — в первую строку; для остальных: элементов — аналогично.

Вариант 15

Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент.

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

Вариант 16

Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке.

Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.

Вариант 17

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

Найти номер первой из строк, не содержащих ни одного положительного элемента.

Вариант 18

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

  •  количество строк, содержащих хотя бы один нулевой элемент;
  •  номер столбца, в котором находится самая длинная серия одинаковых элементов.

Вариант 19

Дана целочисленная квадратная матрица. Определить:

  •  сумму элементов в тех строках, которые не содержат отрицательных элементов;
  •  минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.

Вариант 20

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

  •  количество отрицательных элементов в тех строках, которые содержат хотя бы один нулевой элемент;
  •  номера строк и столбцов всех седловых точек матрицы.

ПРИМЕЧАНИЕ Матрица А имеет седловую точку Aij, если Аij является минимальным элементе в i-й строке и максимальным — в j-м столбце.


 

А также другие работы, которые могут Вас заинтересовать

62256. Самостоятельная работа на уроках русского языка как средство активизации познавательного интереса 34.33 KB
  В этом смысле особое значение приобретает проблема внедрения эффективных приемов самостоятельной работы в учебно-воспитательный процесс. Значит учителям необходимо учить детей самостоятельной работе.
62257. Самым лучшим уроком жизни бывает армия 20.01 KB
  Армия Что на самом деле дает этот важный урок в нашей жизни Вопрос на самом деле очень интересен и важен но в то же время кажущимся бесполезным для всех тех героев которые отслужили и вернулись домой. Армия Отнимает она на первый взгляд кажется больше чем дает. При всем моем огромном желании возможностях и начальных способностях я не умею воевать Задавим количеством А если Китай Что же на самом деле дает Армия Ты вглядываешься на жизнь совсем с другой стороны учишься жить в большом непростом коллективе когда каждый сам за...
62259. Счет победителей. Невыученные уроки войн, проигранных Россией 442.6 KB
  Прекратилась ли после этого информационная психологическая война Запада против России Сошла ли на нет русофобия Не прекратилась и не сошла. Вовторых восприятие России Западом как Чужого повидимому сохранится до тех пор пока Россия и Запад будут существовать в их нынешнем виде. Втретьих Запад в долгосрочной перспективе будет стремиться к максимальному ослаблению вплоть до раздробления России об этом откровенно говорили и говорят многие на Западе включая друга Билла Клинтона в октябре 1995 г. до такой степени при которой...