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

Учебное пособие 302

.pdf
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
368.11 Кб
Скачать

Многомерные массивы

Многомерный массив-это массив, элементами которого являются массивы. Если массив имеет порядок N, то элементами такого массива являются массивы порядка N-1. Порядок еще называется рангом массива. Массив может иметь любой ранг, хотя вряд ли вам пригодится массив ранга 10, обычно используют одно-, двухранговые (двумерные) массивы. В некоторых случаях применяются массивы с рангом три.

Рассмотрим двумерный массив. Двумерный массив, который состоит из N строк и М столбцов. Значит, его размерность составляет N на М.

Если вы захотите объявить такой массив, то это необходимо сделать следующим образом: int[,] arr = new inc[N,M] ,

Каждая из N строк содержит по М элементов (столбцов). При обращении к элементумассиваследуетуказатьномерстрокииномерстолбца. Int n = arr[N,M] Таким же способом можно работать с трех-, четырех-, N-мерными

массивами.

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

using System;

namespace Multidimensional

{

class MainApp

static voidMain (string[ ] args) {string [, ] arr;

Const int firstidx = 2; const int secondidx = 3; //создаем массив

arr = new string [firstidx, secondidx] ; //заполняем двумерный массив

for int i = 0; i < firstidx; i++ )

for (int j = 0; j < secondldx; j+ + ) {arr[i,j] = "arr " + (i) + "-" + (j) ; } //выводим значения из массива for(int i = 0; i < firstldx; i++)

{

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

{

Console.WriteLine("Поле " + i + "-" + j);

} } } } }

Оператор foreach

Синтаксис оператора foreach следующий: foreach (тип in выражение)

21

Рассмотрим следующий код программы:

using System;

using System Collections; namespace FогЕасhAрр

{

class MyArray

{

public ArrayList peoples; publicМуАггау()

{

Peoples= new ArrayList(); peoples.Add("Иванов"); реoples.Add("Петров"); peoples.Add("Сидоров");

}

static void Main (string [] args)

{

MyArray arr = new MyArray(); for(int i =0,- i < arr.peoples.Count; i+ )

{

Console.WriteLine ("{0}", arr.peoples [i]) ;

}}}}

Для перебора всех элементов массива используется цикл for. Такой способ наиболее прижился среди программистов на C++. Однако такой способ имеет ряд проблем: необходимость инициализации переменной цикла, проверки булева значения, наращивания переменной цикла, использования переменной определенного типа для выделения элемента массива. Использование оператора foreach позволяет избежать всех этих неудобств. Вот как можно переписать предыдущий пример с помощью оператора foreach.

foreach(string people in arr.peoples)

{

Console.WriteLine("{0}",people);

}

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

Сортировка

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

22

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

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

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

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

Пример программы, использующей пузырьковую сортировку.

using System; namespace Sorting

{

class TestApp

{public static void Main()

{int [] arr;

arr = new int [10]; Console.WriteLine("Исходный массив:"); (for int i = 0; i < arr.Length; i++)

{

arr[i] - 10 - i; Console.Write("{0} ", arr[i]);

}

bool bSort = false; do

{ bSort = false;

For int i = 1; i < arr.Length; i + + ) if (arr [i] < arr[i-i])

{

int с = arr[i]; arr[i] = arr [i-1] ; arr[i-l] = c; bSort = true;

} } }

while(bSort); Console.WriteLine("Отсортированный массив:"); For int i =0; i < arr.Length; i++)

{

Console.Write{"(0} ", arr[i]);

}}}}

23

Здесь сортировка выполняется до тех пор, пока хотя бы одна пара элементов массива будет переставлена. О перестановке сигнализирует флаг bSort, который устанавливается в false при начале обхода массива и изменяется на true, если хотя бы одна пара элементов была переставлена.

Задания.

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

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

2.Составить программу, которая выводит массив, каждый элемент которого равен квадрату его индекса. Размерность массива задается пользователем.

3.Расположить элементы массива в убывающем порядке. Размерность

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

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

5.Составить программу, которая формирует одномерный массив вводом с клавиатуры и находит среднее арифметическое его элементов.

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

7.Найти минимальное значение в массиве, введенном пользователем,

изаменить его на заданное число.

8.Введите массив N и определите, есть ли в нем элементы с одинаковыми значениями.

9.Составим программу, которая формирует одномерный массив, выполняет поиск минимального элемента и удаляет его из массива.

10.Найти максимальный элемент в массиве и заменить его значение значением его индекса.

Двумерные массивы

11.Дана вещественная матрица (N*M), все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.

12.Написать программу, которая позволяет выяснить: является ли последовательность символов S…Sn палиндроном (перевёртышем), т.е. верно

ли, что S1=Sn,S2=Sn-1 … .

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

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

24

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

16.Написать программу транспонирования данной квадратной матрицы (т.е. 1-ый столбец становится 1-ой строкой).

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

18.Дан двумерный массив вещественных чисел. Упорядочить массив по убыванию элементов второй строки и напечатать max и min элементы матрицы.

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

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

21.Дан двумерный массив целых чисел. Нечётные строки этого массива заменить на Х.

22.Дан двумерный массив целых чисел. Элементы первых трех строк заменить.

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

24.Дан двумерный вещественный массив. Упорядочить его строки по неубыванию их наибольших элементов.

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

Лабораторная работа №5 Работа со строками

Цель: освоить основные методы и средства обработки строк.

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

Еще одним распространенным типом переменных является string. В приведенных ниже примерах показано, как объявляются и инициализируются переменные этого типа:

//

Объявление с отложенной инициализацией string someStringl;

someStringl = "Это

строка";

//

Инициализация при объявлении

string someString2 =

"Это строка";

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

25

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

string someString = "Это строка и это строка"; / А вот так – верно

string someString = "Это строка\nи это строка";

При выводе на экран при помощи вызова Console.WriteLine вы увидите текст, размещенный в двух строках:

Это строка

и это строка

Строка не является ни перечислимым типом, ни типом-значением — в процессоре не существует встроенного типа строки. К строкам применим только один распространенный оператор — оператор сложения, который просто объединяет две строки в одну, например:

string

s = "Это предложение." + " И это тоже."; Приведенный

код присваивает строке s значение:

"Это

предложение. И это тоже."

Строка без символов, записанная как "" (пара двойных кавычек), является корректной для типа string и называется пустой строкой. Пустая строка отличается от нулевого символа ' \ 0 ' и от строки, содержащей любое количество пробелов (" ").

Удобнее инициализировать строки значением String. Empty, которое означает то же, что и " ", но его труднее понять неправильно:

string mySecretName = String.Empty; // Свойство типа String

Кстати, все остальные типы данных — типы-значения (value types). Строковый тип типом-значением не является.

Типы переменных имеют фиксированный размер, за исключением типа string. Переменные типов с постоянным размером всегда занимают одно и то же количество памяти. Так, при присваивании а = b С# может переместить значение b в а, не предпринимая дополнительных мер, необходимых при работе с типами переменного размера. Эта характеристика поясняет, почему данные типы называются типами-значениями.

Особенности типа System.String

С# обрабатывает строки как встроенные типы, которые являются гибкими, мощными и удобными. Каждый объект строки - это неизменная последовательность символов Unicode. Другими словами, те методы, которые изменяют строки, на самом деле возвращают измененную копию, а первоначальная строк остается неповрежденной.

Объявляя строку на С# с помощью ключевого слова string, вы фактически объявляете объект типа System.String, являющийся одним из встроенных

26

типов, обеспечиваемых .NET Framework библиотекой классов. С# строка-это объект типа System.String, и я буду употреблять эти имена попеременно на протяжении всей главы.

Объявление класса System.String следующее: public sealed class String: IComparable, ICloneable, IConvertible, enumerable

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

темных интерфейса-IComparable, ICloneable, IConvertible и enumerable -

которые определяют функциональные возможности System.String за счет его дополнительного использовния с другими классами в .NET Framework.

Интерфейс IComparable определяет тип, реализующий его как тип, значения которого могут упорядочиваться. Строки, например, могут быть расположены в алфавитном порядке; любую строку можно сравнить с другими строками, чтобы определить, какая из них должна стоять первой в упорядоченном списке. IComparable классы реализуют метод ComраrеТо.enumerable интерфейс позволяет вам использовать инструкцию foreach, чтобы перебирать элементы строки как набор символов.

ICloneable объекты могут создавать новые экземпляры объектов с теми же самыми значениями, как и первоначальный вариант. В данном случае возможно клонировать строку таким образом, чтобы создать новую с тем же самым набором символов, как и в оригинале. ICloneable классы реализуют метод Clone().

IConvertible классы реализуют методы для облегчения преобразования объектов класса к другим встроенным типам, например, ToDouble(), ToDecimal() и т. д.

Создание строк

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

string newStrinq = " Новая строка";

Указанная строка может содержать служебные символы типа «\n» или «\t», которые начинаются с наклонной черты (\) и используются для указания перевода строки или вставки символа табуляции. Поскольку наклонная черта влево самостоятельно используется в некоторых синтаксисах строк, типа URL или путей каталога, то в такой строке наклонной черте влево должен предшествовать другой символ наклонной черты влево.

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

27

System.Object.ToString()

Другой способ создать строку состоит в том, чтобы вызвать у объекта метод ToString() и установить результат переменной типа string. Все встроенные типы имеют этот метод, что позволяет упростить задачу преобразования значения (часто числового значения) к строковому виду. В следующем примере вызывается метод ToString() для типа int, чтобы сохранить его значение в строку. Int mymt = 10;

ToString( ) ;

Вызов метода ToString() у объекта mylnt вернет строковое представление числа 10.

Класс System.String в .NET поддерживает множество перегруженных конструкторов, которые обеспечивают разнообразные методы для инициализации строковых значений различными типами. Некоторые из этих конструкторов дают возможность создавать строку в виде массива символов или в виде указателя на символы. При создании строки в виде массива символов CLR создает экземпляр новой строки с использованием безопасного кода. При создании строки на основе указателя применяется «небезопасный» код, что крайне нежелательно при разработке приложений .NET.

Манипулирование строками

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

Empty — свойство, определяющее, пустая ли строка; Compare () — функция сравнения двух строк;

CompareOrdinal () — сравнивает строки в независимости от региональных настроек;

Concat () — создает новую строку из двух и более исходных строк; Сору () — создает дубликат исходной строки;

Equais () — определяет, содержат ли две строки одинаковые значения; Format () — форматирует строку, используя строго заданный формат; Intern () — возвращает ссылку на существующий экземпляр строки; Join () — добавляет новую строку в любое место уже существующей

строки;

Chars — индексатор символов строки; Length — количество символов в строке;

Clone () — возвращает ссылку на существующую строку; CompareTo () — сравнивает одну строку с другой;

CopyTo () — копирует определенное число символов строки в массив

Unicode символов;

EndsWith () — определяет, заканчивается ли строка определенной последовательностью символов;

Equals () — определяет, имеют ли две строки одинаковые значения;

28

Insert () — вставляет новую строку в уже существующую;

LastlndexOf ()-возвращает индекс последнего вхождения элемента в строку;

PadLeft () — выравнивает строку по правому краю, пропуская все пробельные символы или другие (специально заданные);

PadRight () — выравнивает строку по левому краю, пропуская все пробельные символы или другие (специально заданные);

Remove () — удаляет необходимое число символов из строки;

Split () — возвращает подстроку, отделенную от основного массива определенным символом;

StartsWith () — определяет, начинается ли строка с определенной последовательности символов;

Substring ()- возвращает подстроку из общего массива символов; ToCharArray () — копирует символы из строки в массив символов; ToLower () — преобразует строку к нижнему регистру;

ToUpper () — преобразует строку к верхнему регистру;

Trim () — удаляет все вхождения определенных символов в начале и в конце строки;

TrimEnd () — удаляет все вхождения определенных символов в конце строки;

TrimStart () — удаляет все вхождения определенных символов в начале строки.

Задания

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

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

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

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

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

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

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

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

29

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

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

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

внем введенное с клавиатуры слово.

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

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

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

Библиографический список

1.Биллиг, В. А. Основы программирования на С # / В. А. Биллиг. – М. : Изд-во «Интернет-университет информационных технологий – ИНТУИТ.ру», 2006. – 488 с.

2.Гуннерсон, Э. Введение вС#. Библиотека программиста / Э. Гуннерсон. –

СПб.: Питер, 2007. -304 с.

3.Либерти Д. Программирование на С # / Д. Либерти. – СПб. :

Символ-Плюс, 2003. – 688 с.

4.Секунов, Н. Самоучитель С# / Н. Секунов. — СПб.: БХВ-Петербург, 2001. – 576 с.

Оглавление

 

Лабораторная работа №1 Знакомство и приемы работы в среде

 

Visual Studio .NET. Язык С#. ………………………………………………...

3

Лабораторная работа №2. Ветвление программ

 

и циклическая обработка данных …………………………………………...

12

Лабораторная работа №3-4 Массивы одномерные и двумерные.................

20

Лабораторная работа №5 Работа со строками………………………..…......

25

Библиографический список…………………………………………………..

30

30