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

Лаба 3. 9 вар

.doc
Скачиваний:
65
Добавлен:
19.09.2017
Размер:
252.42 Кб
Скачать

8

1. Постановка задачи

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

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

2. Решение - часть 1

2.1. Описание алгоритма

При составлении алгоритма необходимо решить следующую проблему: некоторые символы строки могут быть не буквами. Более того, строка может быть вовсе не содержащей букв.

Алгоритм состоит из двух проходов по строке.

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

Проход 2: записать буквы в массив.

Объявление массива выполняется между проходами.

На рис. 1 представлена блок-схема второго прохода. Первый проход выполняется почти так же, но не нужен массив, на блок-схеме отсутствовал бы блок записи в ячейку массива. В табл. 1 представлен подробный пример второго прохода. Перед выполнением второго прохода count=0. После заключительной итерации цикла count имеет значение, равное числу букв в исходной строке.

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

Рис. 1. Блок-схема второго прохода по строке

Таблица 1

Пример записи в массив для строки source=«Дом 12А»

№ итерации

Текущий символ

Преобразования

0

Д

letters[0]=‘Д’, count=1

1

о

letters[1]=‘о’, count=2

2

м

letters[2]=‘м’, count=3

3

пробел

-

4

1

-

5

2

-

6

А

letters[3]=‘A’, count=4

2.2. Исходный код программы

using System;

namespace OneDimArray

{

class Program

{

static void Main(string[] args)

{

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

string source = Console.ReadLine();

int i, count = 0;

for (i = 0; i < source.Length; i++)

{

if (char.IsLetter(source[i]) == true)

count++;

}

if (count == 0)

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

else

{

char[] letters = new char[count];

count = 0;

for (i = 0; i < source.Length; i++)

{

if (char.IsLetter(source[i]) == true)

{

letters[count] = source[i];

count++;

}

}

Console.WriteLine("Массив букв");

for (i = 0; i < count; i++)

{

Console.WriteLine("A[{0}]='{1}'", i, letters[i]);

}

}

Console.ReadKey();

}

}

}

Для определения, является ли отдельный символ строки буквой, использован метод char.IsLetter.

2.3. Тестирование

При тестировании программы целесообразно рассмотреть следующие случаи:

1) букв в строке нет;

2) все символы строки - буквы;

3) часть символов строки - буквы.

При этом должны быть предусмотрены:

1) буквы как в верхнем, так и в нижнем регистре;

2) как символы кириллицы, так и символы латиницы.

На рис. 2-4 представлены результаты тестирования программы.

Рис. 2. Тестирование: строка без букв

Рис. 3. Тестирование: все символы - буквы

Рис. 4. Тестирование: часть символов - буквы

3. Решение - часть 2

3.1. Описание алгоритма

Для матрицы размера n x n элементы главной диагонали - все элементы вида A[i, i], i = 0…n-1, побочной - A[n - 1 - i, i], i=0…n-1.

Обмен местами элементов главной и побочной диагонали в i-ом столбце заключается в том, чтобы переставить элементы A[i, i] и A[n-1-i, i]. Перестановка выполняется по правилу «трёх стаканов». Аналогично тому, как нельзя обменять два стакана содержимым без третьего, нельзя и обменять две переменные значениями без третьей.

На рис. 5 представлен пример обмена элементов на диагоналях при n=4. Кругами в матрице слева выделены пары переставляемых элементов.

Рис. 5. Пример обмена элементов на диагоналях

3.2. Исходный код программы

using System;

namespace TwoDimArray

{

class Program

{

static void Main(string[] args)

{

Console.Write("Введите размер массива: ");

int n = Convert.ToInt32(Console.ReadLine()), i, j, buffer;

int [,] A = new int[n, n];

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

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

{

Console.Write("Введите A[{0},{1}]: ", i, j);

A[i, j] = Convert.ToInt32(Console.ReadLine());

}

Console.WriteLine("Вы ввели:");

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

{

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

Console.Write("{0, 5}", A[i, j]);

Console.WriteLine();

}

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

{

buffer = A[i, i];

A[i, i] = A[n - 1 - i, i];

A[n - 1 - i, i] = buffer;

}

Console.WriteLine("Результат:");

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

{

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

Console.Write("{0, 5}", A[i, j]);

Console.WriteLine();

}

Console.ReadKey();

}

}

}

Примечание: для нечётных n будет выполняться «холостая» перестановка центрального элемента самого с собой. На корректность результатов это не повлияет. Чтобы её избежать, в теле цикла перестановок можно ввести условие if(i != n-1-i), однако при больших n это может только ухудшить производительность.

3.3. Тестирование

На рис. 6-7 представлены тесты для чётного и нечётного n соответственно.

Рис. 6. Тестирование: чётный размер

Рис. 7. Тестирование: нечётный размер