Типовые алгоритмы и их реализация на языке C#

Страница создана Александра Панина
 
ПРОДОЛЖИТЬ ЧТЕНИЕ
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
   федеральное государственное бюджетное образовательное учреждение
                 высшего профессионального образования
«УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

                        В. В. Воронина

            Типовые алгоритмы
        и их реализация на языке C#

     Методические указания для проведения учебной практики
                Для студентов направления 2307909
                   «Прикладная информатика»

                            Ульяновск
                             УлГТУ
                              2013
УДК 004.42 (076)
ББК 32.973-018.1 я7
   В 12

         Рецензент:
       доцент кафедры «Вычислительная техника» канд. техн. наук
       А. Г. Игонин

         Одобрено секцией методических пособий научно-методического
       совета университета

         Воронина, В. В.
В 12     Типовые алгоритмы и их реализация на языке C# : методические
       указания для проведения учебной практики для студентов
       направления 2307909 «Прикладная информатика» / В. В. Воронина. –
       Ульяновск : УлГТУ, 2013. – 34 с.

         Составлены в соответствии с учебным планом направления 2307909. Цель
       данного практикума – ориентировать студентов на содержание и порядок
       выполнения практических задач во время прохождения ими учебной практики.
       Даются методические материалы по программированию на языке C# в среде
       Visual Studio 2008-2010, темы занятий по практике, а также примеры заданий.
         Работа подготовлена на кафедре «Информационные системы».
         Печатается в авторской редакции.

                                                            УДК 004.42 (076)
                                                           ББК 32.973-018.1 я7

                                                © Оформление. УлГТУ, 2013.
                                                © Воронина В. В., 2013.

                                        2
Оглавление
Введение ......................................................................................................................................... 4
Теоретические основы .................................................................................................................. 5
Начало работы ............................................................................................................................... 6
Основы синтаксиса ....................................................................................................................... 7
  Вывод информации на экран ................................................................................................... 7
  Комментарии ............................................................................................................................. 7
  Объявление переменных .......................................................................................................... 7
  Ввод информации с клавиатуры .............................................................................................. 8
  Циклы, условия, базовые операции ......................................................................................... 9
    Цикл while ............................................................................................................................ 10
    Цикл do ... while ................................................................................................................... 10
    Цикл for ................................................................................................................................ 11
    Условный оператор if.......................................................................................................... 12
    Некоторые базовые операции .............................................................................................. 9
Общий шаблон решения учебных задач ................................................................................... 12
Типовые алгоритмы и рекомендации по их реализации на языке С#.................................... 14
  Считывание одномерного массива с клавиатуры ................................................................ 14
  Вывод одномерного массива на экран .................................................................................. 15
  Считывание двумерного массива с клавиатуры................................................................... 15
  Вывод двумерного массива на экран .................................................................................... 17
  Поиск максимума или минимума в одномерном массиве .................................................. 18
  Поиск количества определенных элементов в одномерном массиве ................................ 18
  Поиск суммы и среднего арифметического определенных элементов ............................. 19
  Запись элементов массива в строку ....................................................................................... 19
  Работа с простыми числами ................................................................................................... 19
  Работа с совершенными числами .......................................................................................... 19
  Работа со строками.................................................................................................................. 19
  Поиск количества единиц в записи числа............................................................................. 21
  Добавление элементов в массив в определенную позицию ............................................... 21
  Удаление элементов из массива ............................................................................................ 21
  Сортировка одномерного массива ......................................................................................... 22
  Сортировка двумерного массива ........................................................................................... 22
  Работа с файлами..................................................................................................................... 25
Перечень тем практических задач и критерии оценки ............................................................ 25
Примеры учебных задач ............................................................................................................. 26
  Работа с числами ..................................................................................................................... 27
  Работа со строками.................................................................................................................. 27
  Поиск в массиве....................................................................................................................... 28
  Перестановка ........................................................................................................................... 29
  Вставка в массив...................................................................................................................... 30
  Удаление из массива ............................................................................................................... 31
  Поиск и перестановка в двумерном массиве ........................................................................ 32
  Вставка и удаление в двумерном массиве ............................................................................ 32
  Сортировки массивов.............................................................................................................. 33
  Работа с файлами..................................................................................................................... 34

                                                                      3
Введение
      Данные методические указания разработаны для проведения
учебной практики у студентов направления 2307909 «Прикладная
информатика». Согласно ФГОС ВПО основная образовательная программа
подготовки бакалавра включает в себя кроме программ учебных курсов,
программы учебной и производственной практик. Учебная практика
является обязательным типом занятий и представляет собой вид учебных
занятий, непосредственно ориентированных на профессионально-
практическую подготовку обучающихся. Конкретные виды практик, а
также их цели и задачи определяются вузом.
      Рассмотрим подробнее цели и задачи учебной практики студентов
первого курса. Основное, что студенты должны освоить за период этих
учебных     занятий:    основные    элементы     синтаксиса   объектно-
ориентированного языка, с которым будут работать в курсе «Объектно-
ориентированное программирование». В данном случае это язык C#.
Отработка основных элементов синтаксиса позволит более продуктивно
использовать учебное время в семестре, а также выявить наиболее
талантливых студентов, которым можно будет давать задачи более
высокой сложности. Конкретные задачи практики:
      1. Приобретение навыков работы с элементарными типами
         данных(числа) и составными(массивы, строки) в рамках
         написания консольных приложений в среде Visual Studio;
      2. Освоение базовых принципов объектно-ориентированного
         подхода;
      3. Работа с файлами: ввод-вывод данных.
      Для прохождения практики требуется дисплейный класс с
установленной средой разработки Visual Studio 2008-2012.
      По итогам практики студент получает оценку в соответствии с
методикой, рассмотренной ниже в соответствующем разделе.
      В данных методических указаниях рассматриваются следующие
вопросы. Теоретические основы объектоно-ориентированного подхода и
пример созданий консольного приложения в среде Visual Studio. Кроме
этого рассмотрены основы синтаксиса языка C# на конкретных примерах.
Далее рассмотрено словесное описание типовых алгоритмов, применяемых
в решении основных практических задач, а также рекомендации по
реализации их на языке C# и примеры кода для наиболее важных
моментов. В заключении рассматривается план прохождения учебной
практики, приводятся критерии оценки, а также примеры учебных задач.

                                   4
Теоретические основы
      Класс – это тип, описывающий устройство объектов.
      Поля – это переменные, принадлежащие классу.
      Методы – это функции (процедуры), принадлежащие классу.
      Объект – это экземпляр класса, сущность в адресном пространстве
компьютера.
      Можно сказать, что класс является шаблоном для объекта,
описывающим его структуру и поведение. Поля класса определяют
структуру объекта, методы класса – поведение объекта.
      С точки зрения практической реализации (в самом тексте
программы) класс является типом данных, а объект – переменной этого
типа.
      Объявление класса состоит из двух частей: объявление заголовка
класса и объявление тела класса. Заголовок класса состоит из
модификатора доступа, ключевого слова class и имени самого класса. Тело
класса – есть конструкция, заключенная в фигурные скобки и содержащая
объявление полей и методов, принадлежащих классу.
      Пример объявления класса:
     public class MyClass { int a; }
     Объявление объекта (создание объекта как экземпляра класса)
состоит из двух частей: создание переменной-ссылки на область памяти, в
которой будет располагаться объект, выделение памяти для объекта и
заполнение этой памяти начальными значениями, иначе говоря
инициализация данной переменной-ссылки. Объявление переменной-
ссылки, а иными словами объекта, подчиняется общему правилу
объявления переменных в C#. Переменные могут объявляться в любом
месте в теле методов, за исключением тел условных операторов.
Переменная, объявленная вне тела метода, но внутри тела класса,
становится полем. Синтаксис объявления переменных имеет вид:
 .
     Пример объявления целочисленной переменной:
     int a;
     Пример объявления переменной-объекта класса MyClass:
     MyClass MyObj;
      При объявлении переменная может быть сразу инициализирована
(ей может быть присвоено какое-либо значение).
      Пример инициализации переменной при объявлении:
     int a=0;
     Выделение памяти осуществляет оператор new, а задачу заполнения
памяти начальными значениями решает специальный метод объекта,
называемый конструктором. Конструктор – метода объекта, объявленный

                                       5
следующим образом: для этого метода всегда используется модификатор
доступа public, нет типа возвращаемого значения (нет даже void), имя
метода совпадает с именем класса. Однако компилятор С# не требует
обязательного определения конструктора для класса. Если конструктор не
объявлен, компилятор вызовет так называемый конструктор по
умолчанию, который создаст сам.
      Таким образом, создание объекта класса MyClass будет иметь вид:
     MyClass MyObj=new MyClass();

Начало работы
      Для создания консольного приложения в Microsoft Visual Studio
необходимо сделать следующее.
      В меню «File»(«Файл») выбрать пункт «New»(«Новый») и в нем
выбрать подпункт «Project»(«Проект»).
      Далее в появившемся диалоговом окне, в разделе Project types
необходимо выбрать пункт Visual C# и подпункт Windows. В разделе
Templates выбрать Console Application. В нижней части окна необходимо
задать имя проекта и папку, где он будет сохраняться. При этом
необходимо следить, чтобы папка, в которую сохраняется проект, была
доступна для записи.
      Ввод данных с клавиатуры осуществляется посредством метода
ReadLine() класса Console. Данный метод возвращает строку, которую
ввел с клавиатуры пользователь.
      Вывод данных на экран осуществляется посредством метода
WriteLine() класса Console.
   Код программы пишем между фигурными скобками (внутри тела)
этого метода:
     public static void Main(string[] args)
     {

     }
     Пример консольного приложения:
     using System;
     public class Program
     {
       public static void Main(string[] args)
        {
        Console.WriteLine(“Введите свое имя”);
        string st=Console.ReadLine();
        Console.WriteLine(“Привет {0}”,st);

                                        6
Console.ReadLine();
         }
     }

Основы синтаксиса
Вывод информации на экран
   Осуществляется конструкцией:

     Console.WriteLine();

    Или:

         Console.WriteLine(“{0},{1}”,, );

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

     int a=999;
     Console.WriteLine(“Значение a={0}”,a.toString());

Комментарии
// Для того чтобы закомментировать строку кода,
// перед ней ставим два слеша.

Объявление переменных
   int a=0; //целочисленная переменная а
   string b=” ”; //строковая переменная b
   char c=’ ‘; //символьная переменная с
   float r=0; //дробная переменная r
   double r=0; //дробная переменная, но большего разряда
   bool у=true; //логическая переменная у
   int[] mas=new int[]; //массив целых чисел.  –
количество элементов массива. Может выражаться или целым числом или
целочисленной переменной.

                                     7
Ввод информации с клавиатуры
    С клавиатуры вы получаете всегда СТРОКУ. Соответственно, для
получения чисел или символов необходимо выполнять преобразования.

Получение строки с клавиатуры:

string s=string.Empty; //сюда мы сохраним введенную информацию
s=Console.ReadLine();//непосредственно считывание.

Можно более кратко:

string s=Console.ReadLine();//объявление и считывание.

Получение числа с клавиатуры:

int a=0; //сюда мы сохраним итоговое число
string s=Console.ReadLine();//объявление и считывание.
a=Convert.ToInt32(s); //получение числа

Можно более кратко:

int a=Convert.ToInt32(Console.ReadLine()); //объявление, считывание и
//преобразование.

    С помощью класса Convert можно преобразовывать ко всем простым
типам данных. Для выполнения преобразования после имени Convert
ставите точку и в появившемся списке ищите нужный вам метод (по имени
типа данных). Ниже приведен рисунок 1, иллюстрирующий это:

                                  Рис.1

                                    8
Циклы, условия, базовые операции
Некоторые базовые операции
     В таблице 1 приведен список основных арифметических операций с
примерами использования.
                                                                   Таблица 1
                              Арифметические операции

Значок     Назначение            Пример использования
операции
    1             2                                 3
+          Сложение              Запишем в переменную с результат сложения
                                 значений а и у:

                                 int a=10;
                                 int y=12;
                                 int c=a+y;

-          Вычитание             Запишем в переменную с результат вычитания
                                 у из а:
                                 int a=10;
                                 int y=12; int c=a-y;

                                                        Продолжение таблицы 1

     1            2                                3
++         Увеличение на 1   Увеличим переменную с на 1:
                             int c=10;
                             c++;
--         Уменьшение на 1   Уменьшим переменную с на 1:
                             int c=10;
                              c--;
%          Остаток        от Проверим, делится ли переменная           а   на
           деления           переменную с без остатка:

                                int a=10;
                                int c=2;

                                if (a%c==0)
                                 Console.WriteLine(“Да”);
                                else
                                 Console.WriteLine(“Нет”);
==         Проверка          на Проверим, равны ли а и с:
           равенство            int a=10;
                                int c=2;

                                       9
if (a==c)
                              Console.WriteLine(“Да”);
                             else
                              Console.WriteLine(“Нет”);
!=           Проверка     на Проверим, различны ли а и с:
             различие        int a=10;
             (не равно)      int c=2;

                             if (a!=c)
                              Console.WriteLine(“Да”);
                             else
                              Console.WriteLine(“Нет”);

    Кроме перечисленных выше операций, вам, возможно, понадобятся
такие как: *(умножение),/(деление),(больше). Они работают
аналогично. Кроме базовых операций язык C# предоставляет вам
возможность использовать операции-сокращения, состоящие из знака
операции и знака равно. Например, рассмотрим использование
сокращенной операции «+=» на следующем примере:
     int a=5;
     a=a+5; //обычная операция +
     a+=5; //аналогичная примененной выше сокращенная операция +=

Цикл while
Это цикл с предусловием. Имеет следующий синтаксис:

       while (УсловиеПродолжения) {Операторы; }

      Пример

int i=0;
while(i
Пример

int i=0;
do
i++;
while(i
//int i = 0; – нельзя
          for (int i = 0; i < 10; i++) Console.WriteLine(i);

Условный оператор if
       Условный оператор if имеет следующие правила использования.
После ключевого слова if располагается взятое в круглые скобки условное
выражение (булево выражение), следом за которым располагается
оператор (блок операторов) произвольной сложности. Далее в операторе if
... else ... после ключевого слова else размещается еще один оператор
(блок операторов).

         Пример

if (i>0)
  Console.WriteLine(i);
else
  Console.WriteLine(i-10);

Общий шаблон решения учебных задач
     1.    Создать пустой проект ConsoleApplication
    2.     Добавить в проект свой класс, который будет решать
поставленные задачи. Для этого необходимо сделать следующее. Во-
первых, открыть окно Solution Explorer. По умолчанию оно располагается
справа на вашем экране, но если по каким-то причинам его там нет, можно
вызвать его, нажав на кнопку, с изображением лупы на верхней панели.
Или же найти его в пункте меню View. Далее на выделенном жирным
имени вашего проекта необходимо щелкнуть правой кнопкой мыши
выбрать Add -> Class...
    Появится новое окно. Внизу, в поле Name требуется ввести имя
вашего класса. Например, вы решили назвать класс MyClass, тогда после
нажатия Add появится файл следующего содержания:

     using System;
     using System.Collections.Generic;
     using System.Text;

     namespace ConsoleApplication1
     {
     class MyClass
     {

     }
     }

                                           12
Далее мы будем работать в теле этого класса (внутри фигурных
скобок, выделенных цветом).
    3.     Объявить метод, который будет решать поставленную задачу.
Объявление метода состоит из следующих частей:
    - Ключевое слово public
    - Тип возвращаемого значения
    - Имя метода
    - Принимаемые параметры(в скобках)
    - Тело метода
    Для нашего случая метод должен будет возвращать строку и
принимать строку. Логика его работы такова: в метод через параметр
передается строка, которую ввел с клавиатуры пользователь. Метод
обрабатывает эту строку и возвращает результирующую строку, которую
необходимо вывести на экран. Возвращаемую строку объявляем в самом
начале тела метода, а перед закрывающей скобочкой тела возвращаем ее,
используя ключевое слово return. После этого шага ваш класс должен
принять вид:

    class MyClass
    {
      public string method(string s)
      {
        string result=””;

              //код метода

            return result;
        }
    }

     Вместо «//код метода» вам необходимо написать последовательность
операторов, решающих поставленную задачу. Итог решения записать в
result.

    4.     Переходим в файл Program.cs и в методе Main прописываем
следующее:
    - Создаем объект вашего класса
    - Выводим пользователю приглашение к вводу данных
    - Считываем данные с клавиатуры
    - Вызываем у объекта наш спроектированный метод, передавая ему в
    качестве параметра введенные данные. Результат работы метода
    сохраняем в переменную.

                                       13
- Выводим на экран значение переменной из прошлого шага.
     - Дописываем в конце Console.ReadLine() для того, чтобы программа
     ожидала нажатия Enter для закрытия. Метод Main должен иметь вид
     наподобие такого:

      public static void Main(string[] args)
       {
         MyClass MyObj=new MyClass();
         Console.WriteLine(“Введите строку с данными”);
         string st=Console.ReadLine();
         string result=MyObj.method(st);
         Console.WriteLine(“Результат: {0}”,result);
         Console.ReadLine();
       }

Типовые алгоритмы и рекомендации по их реализации на
языке С#
      В данном разделе рассмотрено словесное описание типовых
неоптимизированных алгоритмов. Задача студента при выполнении задач
учебной практики не только воспроизвести данные алгоритмы на языке
C#, но и оптимизировать их там, где это возможно.

Считывание одномерного массива с клавиатуры
     Мы предполагаем, что пользователь вводит элементы массива в
строку через пробел, по окончанию ввода нажимает Enter.
     Пусть в строке s находятся считанные с клавиатуры данные. Тогда,
делаем следующее:
     - Объявляем переменную-массив строк и записываем в нее результат
работы метода Split, вызванного у переменной s:

     string[] st = s.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);

    //В одинарных кавычках стоит ПРОБЕЛ.
    - Объявляем переменную-массив чисел с размером, равным размеру
объявленного ранее строкового массива. Размер можно получить, поставив
после имени массива точку и в выпавшем списке найдя Length. Его
сохраним в дополнительную переменную size, которая нам в дальнейшем
пригодится для различных циклов перебора(условие границы):

     int size= st.Length;
     int[] mas=new int[size];

                                          14
Если в вашей задаче необходимо что-то вставлять в массив, то в
числовом массиве указываем размер в два раза больший:

    int size=st.Length;
    int[] mas=new int[2*size];

    - Организуем цикл перебора элементов строкового           массива,
преобразования их в числа и записи в числовой массив:

    for(int i=0;i
восклицательный знак для разделения строк массива. Цикл будет
продолжаться, пока пользователь не введет решетку:

     do
     {
     Console.WriteLine(“Введите элементы строки массива через пробел”);
     string str=Console.ReadLine();
     if (str.trim()!=”#”)
     s+=str+”!”;
     }while(str.trim()!=”#”);

      Теперь в строке s находятся считанные с клавиатуры данные. Строки
массива разделяются знаком «!», а элементы в них – пробелом. Нам
необходимо на основе этих данных сформировать двумерный массив.
Делаем следующее:
      - объявляем переменную типа массив строк и записываем в нее
результат работы метода Split, вызванного у переменной s:

     string[] stroki = s.Split(new char[] { '!' },
StringSplitOptions.RemoveEmptyEntries);

     - запоминаем в переменную типа int размер этого строкового массива:
это будет количество строк нашего двумерного массива:

     int countRow= stroki.Length;

     - организовываем цикл перебора элементов строкового массива,
применяя к каждому метод Split с целью извлечения чисел. Кроме того,
при работе с первым элементом выделяем память под наш двумерный
массив. Количество строк мы получили ранее(countRow), количество
столбцов будет равно количеству чисел в первом элементе строкового
массива. Изначально это переменная равна нулю, а само значение запишем
в нее, когда перейдем к первому элементу строкового массива stroki.

     int countCol=0;
     for(int i=0;i< countRow;i++)
     {
     string[] stolbci = stroki[i].Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
     if (i==0)
     { countCol=stolbci.Length;
     massiv=new int[countRow,countCol];}}

                                             16
- теперь объявим цикл для перебора второго строкового массива и
занесения элементов в числовой. Так как пользователь мог ввести в разных
строках разное количество элементов, то нам необходимо будет это
учитывать при определении границ цикла перебора. Осуществить это
можно с помощью конструкции Math.Min(a,b), где a – наша переменная
countCol, b – количество чисел в текущей обрабатываемой строке.
Понятно, что в каждой строке нашего числового массива будет столько
элементов, сколько пользователь ввел в первой строке. Таким образом,
лишние элементы игнорируются, а недостающие заполняются нулями. В
теле второго цикла будем преобразовывать строковый элемент в число, и
записывать его в наш массив:

     int countCol=0;
     for(int i=0;i< countRow;i++)
     {
     string[] stolbci = stroki[i].Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
     if (i==0)
     {
           countCol=stolbci.Length;
     massiv=new int[countRow,countCol];
     }
     for(int j=0;j< Math.Min(countCol,stolbci.Length);j++)
     massi[i,j]=Convert.ToInt32(stolbci[j]);
     }

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

Вывод двумерного массива на экран
    В данном случае задача немного усложняется тем, что массив должен
быть выведен «табличкой» и элементы должны располагаться строго друг
под другом. Для решения этой задачи организуем циклы перебора по
строкам и столбцам. В теле второго цикла приводим элемент массива к
строке и вызываем у него метод PadLeft с параметром равным
максимальному количеству разрядов вашего числа с учетом знака.
Например, если у вас в массиве будут числа в диапазоне от -999 до 999,
значит максимальное количество разрядов у вас три, с учетом знака – 4.
Этот метод необходим для того, чтобы ваши числа всегда занимали одно и
тоже количество разрядов. Затем выводим этот преобразованный элемент с
помощью Console.Write, а в теле первого цикла не забываем вызвать
Console.WriteLine для перехода на новую строку:

                                        17
for (int i = 0; i < mas.GetLength(0); i++)
               {
                 for (int j = 0; j < mas.GetLength(1); j++)
                     Console.Write(mas[i,j].ToString().PadLeft(3)+" ");
                 Console.WriteLine();
               }

Поиск максимума или минимума в одномерном массиве
      Для реализации этого алгоритма на языке C# вам потребуются:
заданный одномерный массив, цикл for и условный оператор if, а также
дополнительная переменная. Данный алгоритм состоит из следующих
шагов:
 1. Объявить переменную с типом, совпадающим с типом элементов
    массива и присвоить ей значение первого подходящего элемента
    массива.
 2. Организовать цикл перебора элементов массива
 3. В цикле сравнивать текущий элемент с объявленной переменной и если
    он больше(для минимума) или меньше(для максимума), чем текущий,
    то сохранять текущий элемент в объявленную переменную.
    Примечание:     нельзя изначально инициализировать объявленную
переменную нулем, т.к. в массиве могут быть только отрицательные
элементы, тогда максимум посчитается некорректно. Или только
положительные элементы, тогда минимум посчитается некорректно.
Кроме того, задача может заключаться в нахождении минимального
четного, тогда нельзя инициализировать даже первым элементом массива,
а необходимо искать первый четный элемент и инициализировать его уже
им. Для того, чтобы определить позицию минимального или
максимального элемента, необходимо объявить доп.переменную и в нее
сохранять индекс тогда, когда элемент с этим индексом записывается в
первую объявленную переменную. Или же обойтись только одной
переменной, хранящей позицию требуемого элемента. Данное изменение в
алгоритме продумать самостоятельно.

Поиск количества определенных элементов в одномерном массиве
      Для реализации этого алгоритма на языке C# вам потребуются:
заданный одномерный массив, цикл for и условный оператор if, а также
дополнительная переменная.
   1. Объявить числовую переменную, присвоить ей 0.
   2. Организовать цикл перебора элементов массива
   3. В теле цикла через условный оператор проверять подходит ли
      элемент критерию, если подходит, то увеличивать объявленную
      переменную на 1.

                                        18
Поиск суммы и среднего арифметического определенных элементов
      Для реализации этого алгоритма на языке C# вам потребуются:
заданный одномерный массив, цикл for и условный оператор if, а также
дополнительная переменная.
Сумма:
   1. Объявить переменную с типом, совпадающим с типом элементов
      массива, присвоить ей 0.
   2. Организовать цикл перебора элементов массива
   3. В теле цикла через условный оператор проверять подходит ли
      элемент критерию, если подходит, то прибавлять к объявленной
      переменной элемент массива, записывая результат в эту же
      переменную.
Среднее арифметическое:
   4. По предыдущему алгоритму посчитать количество и разделить на
      него результат работы предыдущего алгоритма.

Запись элементов массива в строку
    Строится на основе алгоритма суммы, только переменная объявляется
с типом string, а в третьем шаге перед сложением элемента массива и
объявленной переменной необходимо приводить элемент к строке через
вызов метода toString(). Например, пусть у нас есть массив mas, для
приведения к строке его первого элемента необходимо записать
mas[0].toString();

Работа с простыми числами
    Простым числом называется такое, которое делится без остатка
только на 1 и само себя. Соответственно, алгоритм определения простоты
числа заключается в следующем: если число равно 1, то оно простое.
Иначе посчитаем количество его делителей в диапазоне от 1 до самого
числа. Если оно равно двум, то число простое.

Работа с совершенными числами
     Совершенным является число, которое равняется сумме своих
делителей. При этом 1 считается делителем, а само число нет. Для
определения совершенное число или нет, организуем цикл от 1 до число-1.
В этом цикле ищем сумму делителей, а после цикла сравниваем эту сумму
с самим числом.

Работа со строками
Для работы со строками вам понадобятся следующие конструкции.

Работа с регистрами символов:

                                  19
Char.IsUpper() – возвращает true, если  – в верхнем
регистре(большая буква).
Char.IsLower() – возвращает true, если  – в нижнем
регистре(маленькая буква).
Char.ToUpper()     –   возвращает     символ    в   верхнем
регистре(большая буква).
Char.ToLower()     –   возвращает      символ   в   нижнем
регистре(маленькая буква).

Поиск вхождения символа в строку:
IndexOf() – возвращает неотрицательное число, если такой
символ есть и -1 в противном случае. Например, определим, входит ли
символ ‘с’ в строку s:

     if (s.IndexOf(‘c’)>-1)
       Console.WriteLine(“Yes”);
     else
       Console.WriteLine(“No”);

Пример: подсчет количества заглавных букв в строке

     string s=”asrtYeurYewY”;
     int kol=0;
     for(int i=0;i
{
    if(s[i]==’y’) s=s.Remove(i,1);
    }

Replace –   Возвращает строку, которая получается из исходной путем
замены подстроки в заданной позиции на новую подстроку. Например,
заменим в строке s 0 все буквы y:

    string s=”asrtyeuryewy”;
    s=s.Replace(“y”,”0”);

Если нужно заменить только определенные символы, то это выполняется
комбинацией из Insert и Remove.

Поиск количества единиц в записи числа
     Самый простой вариант преобразовать число в строку через метод
toString() и работать с ним как с набором символов по алгоритмам,
рассмотренным в предыдущем пункте.

Добавление элементов в массив в определенную позицию
      Для реализации этого алгоритма на языке C# вам потребуются:
заданный одномерный массив, с предусмотренным местом под новые
эелемнты, несколько циклов for и условный оператор if, а также несколько
дополнительных переменных.
   1. Организовать цикл от 0 до size. size – переменная, про которую
      описано в пункте «Считывание массива с клавиатуры».
   2. В теле цикла записать условный оператор, проверяющий,
      удовлетворяет ли элемент критерию.
   3. Если элемент удовлетворяет критерию(т.е. после него надо
      вставлять), то организовать цикл от количества_элементов_массива-
      1 (если массив назван mas, то это запишется как mas.Length-1) до
      позиции следующего элемента, стоящего за удовлетворяющем
      критерию. Шаг цикла будет -1 (т.е. шаговая переменная--). В теле
      этого цикла присваивать текущему элементу предыдущий.
   4. В теле условного оператора, но вне тела цикла элементу
      следующему за текущим присвоить вставляемое значение, увеличить
      size на 1 и увеличить на 1 шаговую переменную первого цикла.
      Для вывода массива в качестве его размера использовать size.

Удаление элементов из массива
        Для реализации этого алгоритма на языке C# вам потребуются:
заданный одномерный массив, несколько циклов for и условный оператор
if, а также несколько дополнительных переменных.

                                     21
1. Организовать цикл от 0 до size. size – переменная, про которую
     описано в пункте «Считывание массива с клавиатуры».
  2. В теле цикла записать условный оператор, проверяющий,
     удовлетворяет ли элемент критерию.
  3. Если элемент удовлетворяет критерию(т.е. после него надо
     вставлять), то организовать цикл от текущего(удаляемого) элемента
     до количества_элементов_массива-1 (если массив mas, то это
     запишется как mas.Length-1). Шаг цикла равен               1 (т.е.
     переменная++). В теле этого цикла присваивать текущему элементу
     следующий.
  4. В теле условного оператора, но вне тела цикла уменьшить size на 1 и
     уменьшить на 1 шаговую переменную первого цикла.
Для вывода массива в качестве его размера использовать size.

Сортировка одномерного массива
       Существует несколько алгоритмов сортировки массива. Мы
рассмотрим сортировку простым выбором. Для реализации этого
алгоритма на языке C# вам потребуются: заданный одномерный массив,
несколько циклов for и условный оператор if, а также несколько
дополнительных переменных.
       Данный алгоритм состоит из следующих шагов:
 1. Организовать цикл перебора элементов массива
 2. В теле этого цикла сделать следующее. Объявить переменную(х) с
    типом, совпадающим с типом элементов массива и присвоить ей
    значение текущего элемента массива. Объявить числовую
    переменную(у) и сохранить в нее индекс текущего элемента массива.
 3. Организовать цикл от следующего элемента до конца массива.
 4. В цикле сравнивать текущий для этого цикла элемент с х и если он
    больше(для сортировки по возрастанию) или меньше(для сортировки
    по убыванию), чем текущий, то сохранять текущий элемент в х, а его
    позицию в у.
 5. В теле первого цикла, но вне тела второго объявить переменную(z) с
    типом, совпадающим с типом элементов массива и записать в нее
    значение текущего элемента массива. В текущий элемент массива
    записать значение x. В элемент массива индексом y сохранить значение
    z.
     Данный алгоритм неоптимален за счет использования одной лишней
переменной. Вам предлагается самостоятельно устранить этот недостаток.

Сортировка двумерного массива
     Для реализации этого блока алгоритмов на языке C# вам
потребуются: заданный двумерный массив, несколько циклов for и

                                   22
условный оператор if, а также несколько дополнительных переменных.
Алгоритмы в той или иной степени неоптимальны. Их оптимизацией
предлагается заняться самостоятельно.
      В двумерном массиве можно осуществлять следующие виды
сортировки:
 1. Сортировка строк(столбцов) массива для достижения упорядочения
    элементов в каком-либо столбце(строке).
 2. Сортировка всех элементов в рамках массива(или в рамках какой-либо
    области);
 3. Сортировка элементов по периметру массива;
     Рассмотрим каждый из этих вариантов по отдельности.
     Первый алгоритм представляет собой небольшую модификацию
сортировки одномерного массива. Допустим, нам необходимо
отсортировать строки массива по первому столбцу. Тогда алгоритм будет
следующим:
 1. Организовать цикл перебора строк массива(по переменной i)
 2. В теле этого цикла сделать следующее. Объявить переменную(х) с
    типом, совпадающим с типом элементов массива и присвоить ей
    значение текущего элемента массива в первом столбце. Объявить
    числовую переменную(imin) и сохранить в нее индекс текущей строки
    массива.
 3. Организовать цикл от следующей строки до конца массива(по
    переменной j).
 4. В цикле сравнивать текущий для этого цикла элемент в первом
    столбце с объявленной переменной х и если он больше(для сортировки
    по возрастанию) или меньше(для сортировки по убыванию), чем
    текущий, то сохранять текущий элемент в первом столбце в первую
    объявленную переменную(х), а номер его строки – во вторую(imin).
 5. В теле первого цикла(по переменной i), но вне тела второго объявить
    переменную с типом, совпадающим с типом элементов массива и
    присвоить ей значение равное нулю. Организовать цикл перебора
    столбцов массива(по переменой k). В теле этого цикла делать
    следующее: в объявленную на этом шаге переменную записать
    значение текущего элемента массива(с индексами i,k). В текущий
    элемент массива(с индексами i,k) записать значение элемента массива
    с индексами imin,k. В элемент массива индексом с индексами imin,k
    сохранить значение переменной, объявленной на данном шаге.
Для сортировки столбцов все аналогично, только меняется порядок
индексов при обращении к элементам массива.
     Второй алгоритм также является модификацией сортировки
одномерного массива. Он будет выглядеть следующим образом:

                                  23
1. Организовать      циклы     перебора     элементов     массива     по
    строкам(переменная i) и столбцам(переменная j)
 2. В теле цикла по j сделать следующее. Объявить переменную(x) с
    типом, совпадающим с типом элементов массива и присвоить ей
    значение текущего элемента массива. Объявить первую числовую
    переменную и сохранить в нее индекс текущей строки массива(i_row).
    Объявить вторую числовую переменную и сохранить в нее индекс
    текущего столбца массива(i_col).
 3. Далее организовать циклы перебора строк столбцов от текущей строки
    и текущего столбца, если текущей столбец не последний или от
    следующей строки первого столбца, если текущий столбец последний.
 4. В теле вложенного цикла сравнивать текущий для этого цикла элемент
    с объявленной переменной x и если он больше(для сортировки по
    возрастанию) или меньше(для сортировки по убыванию), чем
    текущий, то сохранять текущий элемент в x, а его позицию в i_row и
    i_col соответственно.
 5. В теле первого цикла по столбцам, но вне тела второго объявить
    переменную с типом, совпадающим с типом элементов массива и
    записать в нее значение текущего элемента массива. В текущий
    элемент массива записать значение первой объявленной переменной.
    В элемент массива на позиции i_row и i_col, сохранить значение
    переменной, объявленной на данном шаге.
     Третий алгоритм представляет собой модификацию второго,
заключающуюся в том, что нужно рассматривать не весь массив целиком,
а только первые и последние строки и столбцы. Он будет выглядеть так:
 1. Организовать цикл перебора элементов массива по первой
    строке(первый индекс 0), второй – меняется в цикле (переменная j).
 2. В теле этого цикла сделать следующее. Объявить переменную(x) с
    типом, совпадающим с типом элементов массива и присвоить ей
    значение текущего элемента массива. Объявить числовую переменную
    и сохранить в нее индекс текущего столбца массива(i_col).
 3. Далее организовать циклы просмотра первой строки(со следующего
    элемента), последних столбца и строки, а также первого столбца.
 4. В теле этого цикла находить минимальный или максимальный
    элемент(в зависимости от направления сортировки) и менять его с
    текущим.
 5. После окончания цикла по первой строке сделать аналогичные циклы
    для последних строки и столбца, а также первого столбца.

                                   24
Работа с файлами
        Если вы хотите открыть текстовый файл, соответствующий поток
данных будет заключен в оболочку из текстового декодера StreamReader
или StreamWriter. Рассмотрим примеры записи и чтения текстовых файлов.
-------------------------------------------------------
      //Не забудьте прописать в начале файла следующий код:
      using System.IO;
      // Пример записи в файл “temp.txt”
      string destFilename = “temp.txt”;
      using (StreamWriter writer = File.CreateText(destFilename))
      {
      writer.WriteLine(“Записываемый текст”);
      }
-------------------------------------------------------
      //Не забудьте прописать в начале файла следующий код:
      using System.IO;
      // Пример чтения информации из файла и вывода ее на экран
      string destFilename = “temp.txt”;
      using (StreamReader reader = File.OpenText(destFilename))
      {
      string line = null;
      do
      { line = reader.ReadLine();
      Console.WriteLine(line);
      } while (line != null); }}}
------------------------------------------------------

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

 Номер Тема                           Что необходимо уметь
 1     Работа с числом,               Найти все делители числа, определить,
       введенным      с               простое число или нет, совершенное или нет.
       клавиатуры                     Сколько нулей используется в записи данного
                                      числа. Расчет факториала числа(факториал –
                                      произведение чисел от 1 до этого числа).

 2         Работа                со Найти все гласные в строке, инвертировать
           строками                 регистр всех согласных, посчитать количество
                                    букв а, заменить кириллицу латиницей.

                                               25
Номер Тема                  Что необходимо уметь
3     Поиск          в      Найти максимум, минимум, количество
      одномерном            четных, количество нечетных, количество
      массиве               нулей, количество единиц
4     Перестановка          Поменять местами первый и третий элементы,
      элементов      в      минимум и максимум, первый четный и
      одномерном            последний нечетный
      массиве
5     Вставка        в      Вставить минимум после нулевого элемента,
      одномерный            после отрицательного и т.д.
      массив
6     Удаление      из      Удалить все четные элементы, все нечетные,
      одномерного           ноль и единицу
      массива
7     Двумерные            Поменять местами первый и третий столбец,
      массивы: поиск и     строки, содержащие минимум и максимум,
      перестановка         первый четный и последний нечетный
                           элементы на главной диагонали
8       Двумерные          Вставить 0 в строки после каждого нечетного,
        массивы: вставка и вставить строку во вторую позицию
        удаление
9       Сортировка         Отсортировать половину массива, только
        двумерных        и четные элементы, только нечетные элементы
        одномерных         и т.д.
        массивов
10      Работа с файлами Записать в файл результат решения задачи,
                           выданной     преподавателем    (задача   по
                           прошлым темам). Уметь считывать элементы
                           массива или строки текста для обработки из
                           файла.

     Работа на практическом занятии происходит следующим образом.
Студент приходит на свое рабочее место, получает у преподавателя задачу
по одной из указанных тем и решает ее за отведенное время. Таким
образом, за время прохождения практики студент должен решить
определенный объем учебных задач. Критерии оценки: 8 решенных задач
по разным темам – 3; 9 решенных задач по разным темам – 4; 10 решенных
задач по разным темам – 5.

                                  26
Примеры учебных задач
Работа с числами
  1. Число вводится своим двоичным представлением (длина числа не
     превышает 10000 двоичных разрядов). Необходимо определить,
     делится ли число на 15.
  2. Вывести на экран число 2n!, n
3. Дана строка-предложение на русском языке. Преобразовать строку
     так, чтобы каждое слово начиналось с заглавной буквы.
  4. Дана строка-предложение, содержащая избыточные пробелы.
     Преобразовать ее так, чтобы между словами был ровно один пробел.
  5. Дана строка-предложение на русском языке. Зашифровать ее, через
     циклическую замену каждой буквы на следующую за ней в алфавите
     и сохраняя при этом регистр букв ("А" перейдет в "Б", "а" — в "б",
     "Б" — в "В", "я" — в "а" и т.д.). Букву "ё" в алфавите не учитывать
     ("е" должна переходить в "ж"). Знаки препинания и пробелы не
     изменять.
  6. Дана строка, содержащая несколько круглых скобок. Если скобки
     расставлены правильно (то есть каждой открывающей соответствует
     одна закрывающая), то вывести число 0. В противном случае
     вывести или номер позиции, в которой расположена первая
     ошибочная закрывающая скобка, или, если закрывающих скобок не
     хватает, число –1.
  7. Дана строка, состоящая из русских слов, разделенных пробелами
     (одним или несколькими). Определить количество слов, которые
     содержат ровно три буквы "А".
  8. Дана строка, состоящая из русских слов, разделенных пробелами
     (одним или несколькими). Определить длину самого длинного слова.
  9. Дана строка-предложение на русском языке. Подсчитать количество
     содержащихся в строке гласных букв.
  10. Дана строка-предложение на русском языке. Вывести самое длинное
     слово в предложении (если таких слов несколько, то вывести первое
     из них).

Поиск в массиве
  1. Найти в массиве все числа, составленные из одних и тех же цифр
  2. В заданной последовательности целых чисел найти максимально
     длинную подпоследовательность чисел такую, что каждый
     последующий элемент подпоследовательности делился нацело на
     предыдущий.
  3. Дан целочисленный массив размера N. Определить максимальное
     количество его одинаковых элементов.
  4. Дан целочисленный массив размера N. Назовем серией группу
     подряд идущих одинаковых элементов, а длиной серии —
     количество этих элементов (длина серии может быть равна 1).
     Вывести строку, содержащую длины всех серий исходного массива.
  5. Дан целочисленный массив размера N. Вывести вначале все его
     четные элементы, а затем — нечетные.

                                  28
6. Дано N целых чисел. Требуется выбрать из них три таких числа,
      произведение которых максимально.
  7. Дан массив ненулевых целых чисел размера N. Проверить,
      чередуются ли в нем четные и нечетные числа. Если чередуются, то
      вывести 0, если нет, то вывести номер первого элемента,
      нарушающего закономерность.
  8. Дан массив из координат х N точек на прямой. Найти такую точку из
      данного множества, сумма расстояний от которой до остальных его
      точек минимальна, и саму эту сумму.
  9. Дан целочисленный массив размера N. Преобразовать его, прибавив
      к четным числам последний элемент. Первый и последний элементы
      массива не изменять.
  10. Дан целочисленный массив A размера 11. Вывести номер первого из
      тех его элементов A[i], которые удовлетворяют двойному
      неравенству: A[1] < A[i] < A[10]. Если таких элементов нет, то
      вывести 0.

Перестановка
  1. Дан массив целых чисел x[1]..x[m+n], рассматриваемый как
     соединение двух его отрезков: начала x[1]..x[m] длины m и конца
     x[m+1]..x[m+n] длины n. Не используя дополнительных массивов,
     переставить начало и конец. (Число действий порядка m+n.)
  2. Дан массив a[1..n] и число b. Переставить числа в массиве таким
     образом, чтобы слева от некоторой границы стояли числа, меньшие
     или равные b, а справа от границы - большие или равные b.
  3. Пользователь вводит массив: 2 3 4 1 7 9 12 8 9 10. Переставить
     элементы массива таким образом, чтобы суммы двух его частей
     отличались не более чем в 1,5 раза. Если этого сделать нельзя, то
     указать это.
  4. Поменять местами максимальный по модулю отрицательный
     элемент и минимальный положительный. Тестовый массив 4 5 6 7 -
     12 -3 4 -5 -7 2 Результат: первый элемент равен -12, на позиции 4,
     второй элемент равен 2, на позиции 9. Результат перестановки 4 5 6 7
     2 -3 4 5 -7 -12
  5. Дан массив размера 10. Переставить в обратном порядке элементы
     массива, расположенные между его минимальным и максимальным
     элементами.
  6. Дан массив размера N. Определить количество его промежутков
     монотонности (то есть участков, на которых его элементы
     возрастают или убывают) и переставить местами первый и
     последний из них.

                                   29
7. Дан массив размера N. Найти два элемента массива, сумма которых
      наиболее близка к максимуму массива, и поменять их местами.
  8. Поменять местами первый четный и последний отрицательный
      элементы
  9. Поменять местами элементы на 3 и 5 позициях
  10. Поменять местами первое простое и первое совершенное числа в
      массиве

Вставка в массив
  1. Дан целочисленный массив размера N. Назовем серией группу
     подряд идущих одинаковых элементов, а длиной серии —
     количество этих элементов (длина серии может быть равна 1).
     Преобразовать массив, увеличив каждую его серию на один
     элемент(добавив в серию).
  2. Вставить в массив максимальный элемент после каждого участка, на
     котором его элементы образуют возрастающую последовательность.
  3. Дан массив размера N. Вставить ноль после каждого четного
     элемента и осуществить циклический сдвиг элементов массива
     вправо на одну позицию.
  4. Вставить 0 после элементов, которые будут делителями для суммы
     его первого, второго и последнего элементов(элементы
     рассматривать по модулю). Тестовый пример 2 3 4 5 -1 -2 -3 -4.
     Результат: Сумма первого, второго и последнего 9, Результат
     вывода: 2 3 0 4 5 -1 0 -2 -3 0 -4
  5. Дан массив размера N. Найти два элемента массива, сумма которых
     наиболее близка к максимуму этого массива и вставить после
     каждого из них их сумму.
  6. Вставить 0 после каждого элемента, большего по модулю среднего
     арифметического положительных элементов. Тестовый массив 4 5 6
     -4 -5 -12 -34 3 4 Результат: среднее арифметическое равно 4,4,
     результат вывода: 4 5 0 6 0 -4 -5 0 -12 0 -34 0 3 4
  7. Вставить разницу между минимальным и максимальным элементом
     после каждого четного отрицательного. Тестовый массив: -12 -3 -4 5
     3 4 5 -12 -4 -5 6 5 4 Результат: минимальный элемент равен -12,
     максимальный=6, разница=-6, результат вывода: -12 -6 -3 -4 -6 5 3 4 5
     -12 -6 -4 -6 -5 6 5 4
  8. Вставить минимальное отрицательное после каждого четного
     положительного. Тестовый пример -12 -3 -4 5 3 4 5 -12 -4 -5 6 5 4
     Результат: минимальное отрицательное=-12, результат вывода: -12 -
     3 -4 5 3 4 -12 5 -12 -4 -5 6 -12 5 4 -12

                                    30
9. Вставить 1 после каждого четного отрицательного числа и 0 после
     каждого нечетного положительного исходного массива. Тестовый
     пример 4 3 4 5 -1 -2 -3 2. Результат: 4 3 0 4 5 0 -1 -2 1 -3 2.
  10. Вставить максимальное положительное после каждого нечетного
     отрицательного. Тестовый пример -12 -3 -4 5 3 4 5 -12 -4 -5 6 5 4
     Результат: максимальное положительное=6, результат вывода: -12 -3
     6 -4 5 3 4 5 -12 -4 -5 6 6 5 4

Удаление из массива
  1. Дан целочисленный массив размера N. Удалить из массива все
      элементы, встречающиеся ровно два или ровно три раза.
  2. Дан целочисленный массив размера N. Назовем серией группу
      подряд идущих одинаковых элементов, а длиной серии —
      количество этих элементов (длина серии может быть равна 1).
      Удалить из массива самую длинную серию.
  3. Дан целочисленный массив размера N. Назовем серией группу
      подряд идущих одинаковых элементов, а длиной серии —
      количество этих элементов (длина серии может быть равна 1).
      Заменить серию, длина которой больше 3 , на один нулевой элемент.
  4. Удалить элементы, большие среднего арифметического в массиве.
      Тестовый массив 4 5 6 -4 -5 -12 -34 3 4 Результат: среднее
      арифметическое равно -3,7. Результат удаления -4 -5 -12 -34
  5. Удалить элементы массива кратные его первому элементу(первый
      элемент при этом не рассматривать). Тестовый пример 2 3 4 5 -1 -2 -3
      -4. Результат: 2 3 5 -1 -3.
  6. Удалить        элементы массива НЕ кратные его последнему
      элементу(последний элемент при этом не рассматривать). Тестовый
      пример 4 3 4 5 -1 -2 -3 2. Результат: 4 4 -2 2.
  7. Удалить элементы массива кратные разнице его первого и
      последнего элементов(элементы и разницу рассматривать по
      модулю). Тестовый пример 2 3 4 5 -1 -2 -3 -4. Результат: Разница
      первого и последнего 2, результат 3 5 -1 -3.
  8. Удалить из массива максимальный нечетный элемент и
      минимальный четный. Тестовый массив 4 5 6 7 -12 -3 4 -5 -7 2
      Результат: первый элемент равен 7, на позиции 3, второй элемент
      равен -12, на позиции 4. Результат 4 5 6 -3 4 -5 -7 2
  9. Удалить из массива максимальный элемент, кратный трем и
      минимальный четный. Тестовый массив 4 5 6 7 -12 -3 4 -5 -7 2
      Результат: первый элемент равен 6, на позиции 2, второй элемент
      равен -12, на позиции 4. Результат перестановки 4 5 7 -3 4 -5 -7 2
  10. Удалить элементы массива, которые будут делителями для суммы
      его первого и последнего элементов(элементы рассматривать по

                                    31
модулю). Тестовый пример 2 3 4 5 -1 -2 -3 -4. Результат: Сумма
     первого и последнего 6, результат 4 5 -4.

Поиск и перестановка в двумерном массиве
  1. Поменять местами столбцы с максимальным нечетным элементом и
      минимальным четным.
  2. Найти количество цифр в массиве и определить, какая из них
      сколько встречается.
  3. Найти количество цифр, встречающихся в четных элементах массива
      больше одного раза и количество цифр в нечетных элементах
      массива, встречающихся больше одного раза. Определить, чего
      больше и вывести эти цифры с количеством
  4. Заменить нулями все положительные нечетные элементы под
      побочной и над главной диагоналями.
  5. Поменять местами столбцы, содержащие максимальный по модулю
      отрицательный элемент и минимальный положительный.
  6. Поменять местами столбец с первым отрицательным в последней
      строке и последним положительным в первой.
  7. Поменять местами столбец со вторым четным и последним
      отрицательным элементами массива в первой строке.
  8. Найти минимум в первой половине массива и максимум во
      второй(по столбцам). Определить, кто из них больше. Если первый
      больше, найти сумму элементов на главной диагонали, иначе в
      первой строке.
  9. Найти количество элементов, больших среднего арифметического в
      массиве над главной диагональю и сумму этих элементов под ней.
  10. Найти сумму в первой половине массива и сумму во второй(по
      столбцам). Определить, какая из этих сумм больше. Если первая
      больше, заменить нулями элементы в первом столбце, иначе в
      первой строке.

Вставка и удаление в двумерном массиве
  1. Удалить столбец, содержащий минимальное отрицательное.
  2. Добавить столбец, содержащий      разницу между столбцами с
     минимальным и максимальным элементом после каждого столбца с
     четным отрицательным элементом.
  3. Добавить в массив столбец нулей 0 после каждого столбца с
     элементом, большим по модулю среднего арифметического
     положительных элементов.
  4. Добавить столбец, содержащий сумму отрицательных после каждого
     столбца с положительным числом.

                                 32
5. Добавить строку, содержащую сумму положительных после каждой
      строки с отрицательным числом.
  6. Добавить(дублировать) строку, содержащую максимальный элемент
      после строк с элементами массива, которые будут делителями для
      суммы его первого и последнего элементов(элементы рассматривать
      по модулю).
  7. Добавить(дублировать)     строку,   содержащую      максимальное
      положительное после каждого строки с нечетным отрицательным
      элементом.
  8. Добавить строку, содержащую нули после каждой строки с
      элементами, меньшими по модулю среднего арифметического
      отрицательных элементов(по модулю).
  9. Добавить строку, содержащую сумму минимального нечетного
      отрицательного и максимального четного положительного
      элементов после каждой строки.
  10. Добавить строку нулей после строки с элементами, которые будут
      делителями для суммы его первого, второго(в первой строке) и
      последнего элементов(элементы рассматривать по модулю).

Сортировки массивов
  1. Отсортировать по убыванию строки матрицы по столбцу,
     содержащему минимальный элемент матрицы.
  2. Отсортировать по убыванию столбцы матрицы по строке,
     содержащей максимальный элемент матрицы.
  3. Упорядочить элементы в матрице по убыванию(слева направо,
     сверху вниз)
  4. Упорядочить элементы в матрице по возрастанию(слева направо,
     сверху вниз)
  5. Упорядочить элементы в матрице по убыванию(справа налево, снизу
     вверх)
  6. Упорядочить элементы в матрице по возрастанию(справа налево,
     снизу вверх)
  7. Отсортировать по возрастанию строки матрицы по столбцу,
     содержащему максимальный элемент матрицы.
  8. Отсортировать по возрастанию столбцы матрицы по строке,
     содержащей минимальный элемент матрицы.
  9. Отсортировать элементы по периметру матрицы по возрастанию.
     Направление: слева направо, сверху вниз. Пример
     1 6 3 после сортировки: 0 1 3
     479                        973
     036                        664

                                 33
10. Отсортировать матрицу по возрастанию. Направление: слева
      направо, сверху вниз. Пример:
     1 6 3 после сортировки: 0 1 3
     479                         346
     036                         679

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

БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Жилин, С. А. Информатика. Теория и практика решения задач. Курс
   углубленного изучения / С. А. Жилин, И. Б. Жилина. – М. : РКНК,
   2001. – 301 с.
2. Златопольский, Д. М. Сборник задач по программированию /
   Д. М. Златопольский. – 2-е изд., перераб. и доп. — СПб. : БХВ-
   Петербург, 2007. — 240 с.
3. Материалы библиотеки msdn. URL www.msdn.microsoft.com. Дата
   актуальности: 12.03.2013.

                                 34
Учебное электронное издание

                 ВОРОНИНА Валерия Вадимовна

 ТИПОВЫЕ АЛГОРИТМЫ И ИХ РЕАЛИЗАЦИЯ НА ЯЗЫКЕ С#
                     Методические указания

                Объем данных 0,37 Мб. ЭИ № 125.

Ульяновский государственный технический университет, ИПК «Венец»
             432027, г. Ульяновск, ул. Сев. Венец, д. 32.
                         Тел.: (8422) 778-113.
                        E-mail: venec@ulstu.ru
                      http://www.venec.ulstu.ru
Вы также можете почитать