МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


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


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


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

foreach ( тип имя in выражение ) тело_цикла





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

Массивы

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

Элементы массива имеют одно и то же имя, а различаются порядковым номером (индексом). Это позволяет компактно записывать множество операций с помощью циклов.

Массив относится к ссылочным типам данных, то есть располагается в динамической области памяти, поэтому создание массива начинается с выделения памяти под его элементы. Элементами массива могут быть величины как значимых, так и ссылочных типов (в том числе массивы). Массив значимых типов хранит значения, массив ссылочных типов — ссылки на элементы. Всем элементам при создании массива присваиваются значения по умолчанию: нули для значимых типов и null— для ссылочных.

На рис. 4.1 представлен массив, состоящий из пяти элементов любого значимого типа, например int или double, а рис. 4.2 иллюстрирует организацию массива из элементов ссылочного типа.

Вот, например, как выглядят операторы создания массива из 10 целых чисел и массива из 100 строк:

int[] a = new int[10];//массив из 10 целых чисел

string[] b = new string[100];//массив из 100 строк

 

 

Рисунок 4.1 – Простые переменные и массив из элементов значимого типа

Рисунок 4.2 – Массив из элементов ссылочного типа

 

В первом операторе описан массив a типа int[].Операция new выделяет память под 10 целых элементов, и они заполняются нулями. Во втором операторе описан массив b типа string[].Операция new выделяет память под 100 ссылок на строки, и эти ссылки заполняются значением null. Память под сами строки, составляющие массив, не выделяется — это будет необходимо сделать перед заполнением массива.

Количество элементов в массиве (размерность) не является частью его типа, это количество задается при выделении памяти и не может быть изменено впоследствии. Размерность может задаваться не только константой, но и выражением. Результат вычисления этого выражения должен быть неотрицательным, а его тип должен иметь неявное преобразование к int, uint, long или ulong.

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

a[4]//обращение к 5 элементу массива

 

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

Все массивы в С# имеют общий базовый класс Array, определенный в пространстве имен System. В нем есть несколько полезных методов, упрощающих работу с массивами, например методы получения размерности, сортировки и поиска.

В С# существуют три разновидности массивов: одномерные, прямоугольные и ступенчатые (не выровненные).

 

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

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

Тип имя;

Тип имя = new тип [ размерность ];

Тип имя = { список инициализаторов };

Тип имя = new тип [] { список инициализаторов };

Тип имя = new тип [ размерность ] { список инициализаторов }:

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

int[] a;//элементов нет

int[] b = new int[5];//элементы равны нулю

int[] c = { 3, 4, -4, 5 };//new подразумевается

int[] d = new int[] { 4, 1, -4, 2 };//размерность вычисляется

int[] e = new int[4] { 6, 3, 1, 0 };//избыточное описание

 

Здесь описано пять массивов. Отличие первого оператора от остальных состоит в том, что в нем, фактически, описана только ссылка на массив, а память под элементы массива не выделена. Если список инициализации не задан, размерность может быть не только константой, но и выражением типа, приводимого к целому. В каждом из остальных массивов по четыре элемента целого типа. Как видно из операторов 3-5, массив при описании можно инициализировать. Если при этом не задана размерность (оператор 4), количество элементов вычисляется по количеству инициализирующих значений. Для полей объектов и локальных переменных можно опускать операцию new, она будет выполнена по умолчанию (оператор 3). Если присутствует и размерность, и список инициализаторов, размерность должна быть константой (оператор 5).

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

 

Листинг 4.1 – пример 1

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab4

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Работа с одномерным массивом\n");

const int n = 6;

int[] a = new int[n] { 3, 12, 5, -9, 8, -4 };

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

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

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

Console.WriteLine();

int sum = 0, //сумма отрицательных элементов

num = 0; // кол-во отрицательных элементов

int max = a[0]; // максимальный элемент

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

{

if (a[i] < 0)

{

sum += a[i];

num++;

}

if (a[i] > max)

max = a[i];

}

Console.WriteLine("Сумма отрицательных: " + sum);

Console.WriteLine("Кол-во отрицательных: " + num);

Console.WriteLine("Максимальный элемент: " + max);

}

}

}

Рисунок 4.3 – Результат выполнения примера 1

Прямоугольные массивы

Прямоугольный массив имеет более одного измерения. Чаще всего в программах используются двумерные массивы. Варианты описания двумерного массива:

тип[,] имя;

тип[,] имя = new тип [ разм_1, разм_2 ];

тип[,] имя = { список инициализаторов };

тип[,] имя = new тип [,] { список инициализаторов };

тип[,] имя = new тип [ разн_1, разн_2 ] { список инициализаторов };

 

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

int[,] а; // 1 элементов нет

int[,] b = new int[2, 3]; //2 элементы равны О

int[,] с = {{1, 2, 3}, {4, 5, 6}}; // 3 new подразумевается

int[,] d = new int[,] {{1, 2, 3}, {4, 5, 6}}; // 4 размерность вычисляется

int[,] e = new int[2,3] {{1, 2, 3}, {4, 5, 6}};// 5 избыточное описание

 

Если список инициализации не задан, размерности могут быть не только константами, но и выражениями типа, приводимого к целому. К элементу двумерного массива обращаются, указывая номера строки и столбца, на пересечении которых он расположен, например: a[3,2];

В качестве примера 2 рассмотрим программу, которая для целочисленной матрицы размером 3x4 определяет среднее арифметическое ее элементов и количество положительных элементов в каждой строке.

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

 

Листинг 4.2 – пример 2

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab4

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Работа с двумерным массивом\n");

const int m = 3, n = 4;

int[,] arr = new int[m, n] {

{2, -2, 8, 9},

{-4, -5, 6, -2},

{7, 0, 1, 1}

};

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

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

{

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

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

Console.WriteLine();

}

double sum = 0.0;

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

{

int nPosEl = 0;

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

{

sum += arr[i, j];

if (arr[i, j] > 0)

nPosEl++;

}

Console.WriteLine("В строке {0} - {1} положительных элементов", i, nPosEl);

}

Console.WriteLine("Среднее арифметическое элементов: " + sum / n / m);

}

 

}

}

Рисунок 4.4 – результат выполнения примера 2

 

Ступенчатые массивы

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

Рис. 4.5 – Ступенчатый массив

 

Описание ступенчатого массива:

тип[][] имя;

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

int[][] а = new int[3][]; // выделение памяти под ссылки на три строки

а[0] = new int[5]; // выделение памяти под 0-ю строку (5 элементов)

а[1] = new int[3]; // выделение памяти под 1-ю строку (3 элемента)

а[2] = new int[41; // выделение памяти под 2-ю строку (4 элемента)

 

Здесь а[0], а[1] и а[2] — это отдельные массивы, к которым можно обращаться по имени (пример приведен в следующем разделе). Другой способ выделения памяти:

int[][] а ={new int[5], new int[3], new int[4] };

 

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

В остальном использование ступенчатых массивов не отличается от использования прямоугольных. Не выровненные массивы удобно применять, например, для работы с треугольными матрицами большого объема.

Листинг 4.3 – Пример 3

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab4

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Использование методов класса Array со ступенчатым массивом:\n");

int[][] arr = new int[3][];

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

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

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

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

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

{

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

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

Console.WriteLine();

}

}

 

}

}

Рисунок 4.6 –результат выполнения примера 3

Класс System.Array

Ранее уже говорилось, что все массивы в С# построены на основе базового класса Array, который содержит полезные для программиста свойства и методы, часть из которых перечислены в табл.

 

Таблица 4.1 – Основные элементы класса Array

Элемент Вид Описание
Length Свойство Количество элементов массива (по всем размерностям)  
Rank Свойство   Количество размерностей массива  
BinarySearch Статический метод Двоичный поиск в отсортированном массиве    
Clear Статический метод Присваивание элементам массива значений по умолчанию  
Сору Статический метод Получение значения элемента массива  
СоруТо Метод   Копирование всех элементов текущего одномерного массива в другой одномерный массив
GetValue Метод   Поиск последнего вхождения элемента в одномерный массив
IndexOf   Статический метод Поиск первого вхождения элемента в одномерный массив
LastIndexOf Статический метод Поиск последнего вхождения элемента в одномерный массив
Reverse Статический метод Изменение порядка следования элементов на обратный
SetValue Метод   Установка значения элемента массива
Sort Статический метод Упорядочивание элементов одномерного массива  

 

Свойство Length позволяет реализовывать алгоритмы, которые будут работать с массивами различной длины или, например, со ступенчатым массивом. Использование этого свойства вместо явного задания размерности исключает возможность выхода индекса за границы массива. Методы Sort, IndexOf и BinarySearch являются статическими, поэтому к ним обращаются через имя класса, а не экземпляра, и передают в них имя массива. Двоичный поиск можно применять только для упорядоченных массивов. Он выполняется гораздо быстрее, чем линейный поиск, реализованный в методе IndexOf.

Листинг 4.4 – пример 4

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab4

{

class Program

{

public static void PrintArray(string header, int[] a)

{

Console.WriteLine(header);

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

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

Console.WriteLine();

}

 

static void Main(string[] args)

{

Console.WriteLine("Использование методов класса Array с одномерным массивом:\n");

int[] arr = { 24, 50, 18, 3, 16, -7, 9, -1 };

PrintArray("Исходный массив: ", arr);

Console.WriteLine(Array.IndexOf(arr, 18)); //линейный поиск элемента

Array.Sort(arr); //сортировка массива

PrintArray("Упорядоченный массив: ", arr);

Console.WriteLine(Array.BinarySearch(arr, 18)); //бинарный поиск элемента

}

 

}

}

Рисунок 4.7 – результат выполнения примера 4

Оператор foreach

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

foreach ( тип имя in выражение ) тело_цикла

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

 

Например, пусть задан массив:

 

int[] а = {24, 50, 18, 3, 16, -7, 9, -1};

 

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

foreach (int x in а)

Console.WriteLine(x);

 

Этот оператор выполняется так: на каждом проходе цикла очередной элемент массива присваивается переменной х и с ней производятся действия, записанные в теле цикла(пример 5).

 

Листинг 4.5 – пример 5

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab4

{

class Program

{

public static void PrintArray(string header, Array arr)

{

Console.WriteLine(header);

foreach (int elem in arr)

Console.Write("\t" + elem);

Console.WriteLine();

}

 

static void Main(string[] args)

{

Console.WriteLine("Работа с одномерным массивом с использованием цикла foreach\n");

int[] arr = { 3, 12, 5, -9, 8, -4 };

PrintArray("Исходный массив", arr);

int sum = 0, num = 0;

int max = arr[0];

foreach (int elem in arr)

{

if (elem < 0)

{

sum += elem;

num++;

}

if (elem > max)

max = elem;

}

Console.WriteLine("Сумма отрицательных: " + sum);

Console.WriteLine("Кол-во отрицательных: " + num);

Console.WriteLine("Максимальный элемент: " + max);

}

}

}

 

Рисунок 4.7 – результат выполнения примера 5

Символы и строки

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

Символы

Символьный тип char предназначен для хранения символов в кодировке Unicode. Символьный тип относится к встроенным типам данных С# и соответствует стандартному классу Char библиотеки .NET из пространства имен System. В этом классе определены статические методы, позволяющие задать вид и категорию символа, а также преобразовать символ в верхний или нижний регистр и в число. Основные методы приведены в таблице.

Таблица 4.2 – Основные методы класса System.Char

Метод Описание Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае
GetNumericValue Возвращает категорию Unicode-символа1
GetUnicodeCategory Возвращает true, если символ является управляющим
IsControl Возвращает true, если символ является десятичной цифрой
IsDigit Возвращает true, если символ является буквой
IsLetter Возвращает true, если символ является буквой или цифрой
IsLetterOrDigit Возвращает true, если символ задан в нижнем регистре
IsLower Возвращает true, если символ является числом (десятичным или шестнадцатеричным)
IsNumber Возвращает true, если символ является знаком препинания
IsPunctuation Возвращает true, если символ является разделителем
IsSeparator Возвращает true, если символ записан в верхнем регистре
Isllpper Возвращает true, если символ является пробельным (пробел, перевод строки и возврат каретки)
IsWhiteSpace Преобразует строку в символ (строка должна состоять из одного символа)
Parse Преобразует символ в нижний регистр
ToLower Преобразует символ в верхний регистр
ToUpper Возвращают символы с максимальным и минимальным кодами (эти символы не имеют видимого представления)
MaxValue, MinValue Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае

В листинге 4.6 продемонстрировано использование этих методов.

Листинг4.6 – Использование методов класса System.Char

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace lab4

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Использование методов класса System.Char");

try

{

char b = 'B', c = '\x63', d = '\u0032'; //1

Console.WriteLine("{0} {1} {2}", b, c, d);

Console.WriteLine("{0}, {1}, {2}", char.ToLower(b), char.ToUpper(c),

char.GetNumericValue(d));

char a;

do //2

{

Console.Write("Введите символ ");

a = char.Parse(Console.ReadLine());

Console.WriteLine("Введен символ {0}, его код {1}", a, (int)a);

if (char.IsLetter(a)) Console.WriteLine("Буква");

if (char.IsUpper(a)) Console.WriteLine("Верхний регистр");

if (char.IsLower(a)) Console.WriteLine("Нижний регистр");

if (char.IsControl(a)) Console.WriteLine("Управляющий");

if (char.IsNumber(a)) Console.WriteLine("Число");

if (char.IsPunctuation(a)) Console.WriteLine("Разделитель");

} while (a != 'q');

}

catch

{

Console.WriteLine("Возникло исключение");

return;

}

}

}

}

Результат выполнения:

Рисунок 4.8 – Использование методов класса System.Char

В операторе 1 описаны три символьных переменных. Они инициализируются символьными литералами в различных формах представления. Далее выполняются вывод и преобразование символов.

В цикле 2 анализируется вводимый с клавиатуры символ. Можно вводить и управляющие символы, используя сочетание клавиши Ctrl с латинскими буквами. При вводе использован метод Parse, преобразующий строку, которая должна содержать единственный символ, в символ типа char. Поскольку вводится строка, ввод каждого символа следует завершать нажатием клавиши Enter. Цикл выполняется, пока пользователь не введет символ q.

Вывод символа сопровождается его кодом в десятичном виде1. Для вывода кода используется явное преобразование к целому типу. Явное преобразование из символов в строки и обратно в С# не существует, неявным же образом любой объект, в том числе и символ, может быть преобразован в строку2, например:

string s = 'к' + 'о' + 'т'; // результат - строка "кот"

При вводе и преобразовании могут возникать исключительные ситуации, например, если пользователь введет пустую строку. Для «мягкого» завершения программы предусмотрена обработка исключений.

Массивы символов

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

Листинг 4.7 – Работа с массивом символов

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace lab4

{

class Program

{

public static void PrintArray(string str, Array arr)

{

Console.WriteLine(str);

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

Console.Write(arr.GetValue(i));

Console.WriteLine("\n");

}

 

static void Main(string[] args)

{

Console.WriteLine("Работа с массивом символов\n");

char[] a = { 'm', 'a', 's', 's', 'i', 'v' }; // 1

char[] b = "а роза упала на лапу азора".ToCharArray(); // 2

PrintArray("Исходный массив a: ", a);

int pos = Array.IndexOf(a, 'm');

a[pos] = 'M';

PrintArray("Исходный массив b: ", b);

Array.Reverse(b);

PrintArray("Измененный массив b: ", b);

}

}

}

Результат работы программы:

Рисунок 4.9 – Работа с массивом символов

Символьный массив можно инициализировать, либо непосредственно задавая его элементы (оператор 1), либо применяя метод ToCharArray класса string, который разбивает исходную строку на отдельные символы (оператор2).

Строки типа string

Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Ему соответствует базовый класс System.String библиотеки .NET.

Создать строку можно несколькими способами:

string s; // инициализация отложена

string t = "qqq"; // инициализация строковым литералом

string u = new string(' ', 20); // конструктор создает строку из 20 пробелов

char[] а = { '0', '0', '0' }; // массив для инициализации строки

string V = new string( а ); // создание из массива символов

Для строк определены следующие операции:

- присваивание (=);

- проверка на равенство (==);

- проверка на неравенство (!=);

- обращение по индексу ([]);

- сцепление (конкатенация) строк (+).

Несмотря на то что строки являются ссылочным типом данных, на равенство и неравенство проверяются не ссылки, а значения строк. Строки равны, если имеют одинаковое количество символов и совпадают посимвольно.

Обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения. Это связано с тем, что строки типа string относятся к так называемым неизменяемым типам данных. Методы, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые «старые» копии автоматически удаляются сборщиком мусора.

В классе System.String предусмотрено множество методов, полей и свойств, позволяющих выполнять со строками практически любые действия. Основные элементы класса приведены в табл. 4.3

Таблица 4.3 – Основные элементы класса System.String

Название Вид Описание
Compare Статический метод Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки и подстроки с учетом и без учета регистра и особенностей национального представления дат и т.д.
CompareOrdi nal Статический метод Сравнение двух строк по кодам символов. Разные реализации метода позволяют сравнивать строки и подстроки
CompareTo Метод Сравнение текущего экземпляра строки с другой строкой
Concat Статический метод Конкатенация строк. Метод допускает сцепление произвольного числа строк
Copy Статический метод Создание копии строки
Empty Статическое поле Пустая строка (только для чтения)
Format Статический метод Форматирование в соответствии с заданными спецификаторами формата (см. далее)
IndexOf, IndexOf Any, LastlndexOf, LastIndexOfAny   Методы Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора
Insert Метод Вставка подстроки в заданную позицию
Intern, Islnterned   Статические методы Возвращает ссылку на строку, если такая уже существует. Если строки нет, Intern добавляет строку во внутренний пул, Is Intern возвращает null.
Join Статический метод Слияние массива строк в единую строку. Между элементами массива вставляются разделители (см. далее)
Length Свойство Длина строки (количество символов)
PadLeft, PadRight Методы Выравнивание строки по левому или правому краю путем вставки нужного числа пробелов в начале или в конце строки
Remove Метод Удаление подстроки из заданной позиции
Replace Метод Замена всех вхождений заданной подстроки или символа новыми подстрокой или символом
Split Метод Разделяет строку на элементы, используя заданные разделители. Результаты помещаются в массив строк
StartsWith, EndsWith Методы Возвращает true или false в зависимости от того, начинается или заканчивается строка заданной подстрокой
Substring Метод Выделение подстроки, начиная с заданной позиции
ToCharArray Метод Преобразование строки в массив символов
ToLower, Tollpper Методы Преобразование символов строки к нижнему или верхнему регистру  
Tim, TrimStart, TrimEnd   Методы Удаление пробелов в начале и конце строки или только с одного ее конца (обратные по отношению к методам PadLeft и PadRight действия)

Пример применения методов приведен в листинге 4.8.

Листинг 4.8 – Работа со строками типа string

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace lab4

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Работа со строками типа string\n");

string s = "Прекрасная королева Изольда";

Console.WriteLine(s);

string sub = s.Substring(3).Remove(12, 2); // 1

Console.WriteLine(sub);

string[] mas = s.Split(' '); // 2

string joined = string.Join("! ", mas);

Console.Write(joined);

Console.WriteLine("Введите строку");

string x = Console.ReadLine(); //3

Console.WriteLine("Вы ввели строку " + x);

double a = 12.234;

int b = 29;

Console.WriteLine(" a = {0,6:C} b = {1,2:X}", a, b); // 4

Console.WriteLine(" a = {0,6:0.##} b = {1,5:0.# ' руб. '}", a, b); //5

Console.WriteLine("a = {0:F3} b = {1:D3}", a, b); //6

}

}

}

Результат работы программы:

Рисунок 4.10 – Работа со строками типа string

В операторе 1 выполняются два последовательных вызова методов: метод Substring возвращает подстроку строки s, которая содержит символы исходной строки, начиная с третьего. Для этой подстроки вызывается метод Remove, удаляющий из нее два символа, начиная с 12-го. Результат работы метода присваивается переменной sub.

Аргументом метода Split (оператор 2) является разделитель, в данном случае символ пробела. Метод разделяет строку на отдельные слова, которые заносятся в массив строк mas. Статический метод Join (он вызывается через имя класса) объединяет элементы массива mas в одну строку, вставляя между каждой парой слов строку "! ". Оператор 3 напоминает вам о том, как вводить строки с клавиатуры.

Форматирование строк

В операторе 4 из листинга 4.8 неявно применяется метод Format, который заменяет все вхождения параметров в фигурных скобках значениями соответствующих переменных из списка вывода. После номера параметра можно задать минимальную ширину поля вывода, а также указать спецификатор формата, который определяет форму представления выводимого значения.

В общем виде параметр задается следующим образом:

{n [m[:спецификатор_формата]]}

Здесь n – номер параметра. Параметры нумеруются с нуля, нулевой параметр заменяется значением первой переменной из списка вывода, первый параметр – второй переменной и т. д. Параметр m определяет минимальную ширину поля, которое отводится под выводимое значение. Если выводимому числу достаточно меньшего количества позиций, неиспользуемые позиции заполняются пробелами. Если числу требуется больше позиций, параметр игнорируется.

Спецификатор формата, как явствует из его названия, определяет формат вывода значения. Например, спецификатор С (Currency) означает, что параметр должен форматироваться как валюта с учетом национальных особенностей представления, а спецификатор X (Hexadecimal) задает шестнадцатеричную форму представления выводимого значения.

В операторе 5 используются так называемые пользовательские шаблоны форматирования. Если приглядеться, в них нет ничего сложного: после двоеточия задается вид выводимого значения посимвольно, причем на месте каждого символа может стоять либо #, либо 0. Если указан знак #, на этом месте будет выведена цифра числа, если она не равна нулю. Если указан 0, будет выведена любая цифра, в том числе и 0. В табл. 6.4 приведены примеры шаблонов и результатов вывода.

Таблица 4.4. – Примеры применения пользовательских шаблонов форматирования

Число Шаблон Вид  
1,243 00.00 01,24
1,243 ##.# 1,24
0,1 00.00 00,10
0,1 ##.# ,1  

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

Строки типа StringBuilder

Возможности, предоставляемые классом string, широки, однако требование неизменности его объектов может оказаться неудобным. В этом случае для работы со строками применяется класс StringBuilder, определенный в пространстве имен System.Text и позволяющий изменять значение своих экземпляров.

При создании экземпляра обязательно использовать операцию new и конструктор, например:

StringBuilder а = new StringBuilder( ); // 1

StringBuilder b = new StringBuilder( "qwerty" ); // 2

StringBuilder с = new StringBuilder( 100 ); // 3

StringBuilder d = new StringBuilder("qwerty", 100 ); // 4

StringBuilder e = new StringBuilder( "qwerty", 1, 3, 100 ); // 5

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

Если применяется конструктор без параметров (оператор 1), создается пустая строка размера, заданного по умолчанию (16 байт). Другие виды конструкторов задают объем памяти, выделяемой строке, и/или ее начальное значение. Например, в операторе 5 объект инициализируется подстрокой длиной 3 символа, начиная с первого (подстрока "wer"). Основные элементы класса StringBuilder приведены в табл. 4.5.

Таблица 4.5 – Основные элементы класса System.Text.StringBuilder

Название Вид Описание
Capacity Свойство Получение или установка емкости буфера. Если устанавливаемое значение меньше текущей длины строки или больше максимального, генерируется исключение ArgumentOutOfRangeExcepti on
MaxCapacity Свойство Максимальный размер буфера
Replace Метод Замена всех вхождений заданной подстроки или символа новой подстрокой или символом
ToString Метод Преобразование в строку типа string
Replace Метод Замена всех вхождений заданной подстроки или символа новой подстрокой или символом
ToString Метод Преобразование в строку типа string

Пример применения методов приведен в листинге 4.9.

Листинг 4.9 – Работа со строками типа StringBuilder

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace lab4

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Работа со строками типа StringBuilder\n");

Console.WriteLine("Введите зарплату: ");

double salary = double.Parse(Console.ReadLine());

StringBuilder a = new StringBuilder();

a.Append("зарплата ");

a.AppendFormat("{0,6:C} - в год {1, 6:C}", salary, salary * 12);

Console.WriteLine(a);

a.Replace("р.", "$");

Console.WriteLine("А лучше было бы: " + a);

}

}

}

Результат работы программы:

Рисунок 4.11 – Работа со строками типа StringBuilder

А лучше было бы: зарплата 3 500,00 тыс.$ - в год 42 000.00 тыс.$ Емкость буфера не соответствует количеству символов в строке и может увеличиваться в процессе работы программы как в результате прямых указаний программиста, так и вследствие выполнения методов изменения строки, если строка в результате превышает текущий размер буфера. Программист может уменьшить размер буфера с помощью свойства Capacity, чтобы не занимать лишнюю память.

Индивидуальные задания.

Индивидуальное задание №1

Вариант 0

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

1) сумму отрицательных элементов массива;

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

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

Вариант 1

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

1)сумму положительных элементов массива;

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

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

Вариант 2

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

1)произведение элементов массива с четными номерами;

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

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

Вариант 3

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

1)сумму элементов массива с нечетными номерами;

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

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

Вариант 4

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

1)максимальный элемент массива;

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

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

Вариант 5

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

1)минимальный элемент массива;

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

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

Вариант 6

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

1)номер максимального элемента массива;

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

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

Вариант 7

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

1)номер минимального элемента массива;

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

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

Вариант 8

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

1)максимальный по модулю элемент массива;

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

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

Вариант 9

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

1)минимальный по модулю элемент массива;

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

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

Вариант 10

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

1)номер минимального по модулю элемента массива;

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

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

Вариант 11

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

1)номер максимального по модулю элемента массива;

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

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

Вариант 12

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

1)количество элементов массива, лежащих в диапазоне от А до В;

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

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

Вариант 13

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

1)количество элементов массива, равных нулю;

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

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

Вариант 14

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

1)количество элементов массива, больших С;

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

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

Вариант 15

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

1)количество отрицательных элементов массива;

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

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

Вариант 16

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

1)количество положительных элементов массива;

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

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

Вариант 17

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

1)количество элементов массива, меньших С;

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

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

Вариант 18

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

1)произведение отрицательных элементов массива;

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

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

Вариант 19

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

1)произведение положительных элементов массива;

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

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

 

Индивидуальное задание №2

Вариант 0

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

1)количество строк, не содержащих ни одного нулевого элемента;

2)максимальное из чисел, встречающихся в заданной матрице более одного раза.

Вариант 1

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

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

2)номера строк и столбцов всех седловых точек матрицы.

 

Вариант 2

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

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

Вариант 3

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

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

2)номер строки, в которой находится самая длинная серия одинаковых элементов.

Вариант 4

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

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

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

Вариант 5

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

1)сумму элементов в тех столбцах, которые не содержат отрицательных элементов;

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

Вариант 6

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

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

2)номера строк и столбцов всех cедловых точек матрицы.

Вариант 7

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

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

Вариант 8

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

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

Вариант 9

Соседями элемента A{j в матрице назовем элементы Аы, где i-l<k<i+l ,

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

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

Вариант 10

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

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

Вариант 11

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

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

Вариант 12

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

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

Вариант 13

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

Вариант 14

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

Вариант 15

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

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

Вариант 16

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

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

Вариант 17

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

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

Вариант 18

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

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

2)номер столбца, в котором находится самая длинная серия одинаковых элементов.

Вариант 19

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

1)сумму элементов в тех строках, которые не содержат отрицательных элементов;

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

 

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

 

Индивидуальное задание №3

Вариант 0

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

Вариант 1

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

Вариант 2

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

Вариант 3

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

Вариант 4

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

Вариант 5

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

Вариант 6

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

Вариант 7

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

Вариант 8

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

Вариант 9

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

Вариант 10

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

Вариант 11

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

Вариант 12

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

Вариант 13

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

Вариант 14

Написать программу, которая считывает текст из консоли и выводит его на экран, заменив цифры от 0 до 9 словами «ноль», «один», «девять», начиная каждое предложение с новой строки.

Вариант 15

Написать программу, которая считывает текст из консоли, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте.

Вариант 16

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

Вариант 17

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

Вариант 18

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

Вариант 19

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

Пример выполнения варианта №0

Задание 1.

1.Условие

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

1) сумму отрицательных элементов массива;

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

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

 

2.Листинг программы

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab4

{

class Program

{

static void Main(string[] args)

{

 

Console.WriteLine("Лабораторная работа №4. Выполнил студент XXXXX группы XXXXX");

 

Console.WriteLine("Вариант №0\n Задание1:\n В одномерном массиве из n вещественных элементов вычислить:\n1) сумму отрицательных элементов массива\n2) произведение элементов массива, расположенных между максимальным\n и минимальным элементами\n3) упорядочить элементы массива по возрастанию");

 

Console.Write("Введите количество элементов: ");

 

int n = int.Parse(Console.ReadLine());

double[] arr = new double[n];

 

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

{

Console.Write("Введите " + i.ToString() + " элемент: ");

arr[i] = double.Parse(Console.ReadLine());

}

double sum = 0;

foreach (double i in arr)

if (i < 0.0)

sum += i;

 

double minval = arr[0], maxval = arr[0];

 

int minpos = 0, maxpos = 0;

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

{

if (arr[i] < minval)

{

minval = arr[i];

minpos = i;

}

if (arr[i] > maxval)

{

maxval = arr[i];

maxpos = i;

}

}

double mul = 1;

for (int i = Math.Min(maxpos, minpos); i <= Math.Max(minpos, maxpos); i++)

mul *= arr[i];

 

Array.Sort(arr);

 

Console.WriteLine("Сумма отрицательных элементов равна : " + sum.ToString());

Console.WriteLine("Произведение элементов между минимальным и максимальным элементами равно : " + mul.ToString());

Console.WriteLine("Массив после сортировки:");

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

Console.Write(arr[i].ToString() + " ");

Console.WriteLine("");

}

}

}

3.Результат выполнения

Рисунок 4.12 – Результат выполнения задания 1

4.Анализ

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

Задание 2.

1.Задание

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

1)количество строк, не содержащих ни одного нулевого элемента;

2)максимальное из чисел, встречающихся в заданной матрице более одного раза.

2.Листинг программы

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab4

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Лабораторная работа №4");

Console.WriteLine("Выполнил студент XXX группы XXX");

Console.WriteLine("Задание №2");

Console.WriteLine("Дана прямоугольная матрица. Определить:");

Console.WriteLine("1) Количество строк, не содержащих ни одного нулевого элемента");

Console.WriteLine("2) Максимальное из чисел, встречающихся более одного паза\n");

const int inf = 1 << 30;

int n, m;

Console.Write("Введите кол-во строк: ");

string buf;

buf = Console.ReadLine();

n = Convert.ToInt32(buf);

Console.Write("Введите кол-во столбцов: ");

buf = Console.ReadLine();

m = Convert.ToInt32(buf);

Random rnd = new Random();

int [,] arr = new int [n, m];

int[] tmp = new int[n * m]; //вспомогательный массив для 2го подзадания

Console.WriteLine("Изначальный массив:");

int num = 0; // кол-во строк, не содержащих нулевого элемента

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

{

bool was = false;

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

{

arr[i, j] = rnd.Next(-100, 100





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.