Лаба 3. 9 вар
.doc
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. Тестирование: нечётный размер