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

Программирование с использованием массивов

Цель лабораторной работы: изучить свойства компонента TStringGrid. Написать программу с использованием массивов.

4.1.Работа с массивами

Массив - это упорядоченный набор однотипных элементов, объединенных под одним именем. Каждый элемент массива обозначается именем, за которым следует один или несколько индексов, каждый в квадратных скобках, например: a[l], bb[I], cl2[I][j*2], q[l][l][I*j-l]. В качестве индекса можно использовать любые порядковые типы. В С++ индексы массива всегда начинаются с нуля. Примеры описания массивов:

const Nmax=10;                        // Задание максимального значения индекса;

typedef double mas1[Nmax];          // Описание типа одномерного массива;

typedef double mas2[Nmax][Nmax]; // Описание типа двухмерного массива;

mas1 A;                                                                        // B - массив типа masl;

mas2 B;                                                                       //A - массив типа mas2;

int Ss[10];                                                // Ss - массив из десяти целых чисел;

char Y[5][10];                             // Y - двухмерный массив символьного типа.

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

F=2*A[3]+A[Ss[I]+1]*3;

A[n]=1+sqrt(fabs(A[n-1]));.

4.2.Компонент TStringGrid

При работе с массивами ввод и вывод информации на экран удобно организовывать в виде таблиц. Компонент TStringGrid предназначен для отображения информации в виде двухмерной таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично окну TEdit). Доступ к информации осуществляется с помощью свойства Cells[ACol, ARow: Integer]: string, где ACol, ARow - индекс элемента двухмерного массива (ACol - номер столбца, ARow - номер строки). Свойства ColCount и RowCount устанавливают количество столбцов и строк в таблице, а свойства FixedCols и FixedRows задают количество столбцов и строк фиксированной зоны. Фиксированная зона выделена другим цветом, и в нее запрещен ввод информации с клавиатуры.

4.3. Порядок выполнения задания

Задание: Рассчитать значения вектора , где А – квадратная матрица размером N´N, а Y и B – одномерные массивы размером N. Элементы вектора Y определяются по формуле .Значение N вводить в компонент TEdit, А и B - в компонент TStringGrid. Результат, после нажатия кнопки типа TButton, вывести в компонент TStringGrid.

 Панель диалога приведена на рис. 4.1.

 

Рис 4.1.

Настройка компонента TStringGrid

 Для установки компонента TStringGrid на форму необходимо на странице Additional меню компонентов щелкнуть мышью по пиктограмме r1. После этого щелкнуть мышью в нужном месте формы. Захватывая кромки компонента, отрегулируйте его размер. В инспекторе объектов значения свойств ColCount и RowCount установить 2 (два столбца и две строки), а FixedCols и FixedRows установить 1 (один столбец и одна строка с фиксированной зоной). Так как компоненты StringGrid2 и StringGrid3 имеют только один столбец, то у них: ColCount=1, RowCount=2, FixedCols=0 и FixedRows=1. По умолчанию в компонент TStringGrid запрещен ввод информации с клавиатуры, поэтому необходимо свойство Options goEditing для компонентов StringGrid1 и StringGrid2 установить в положение True.

 Текст программы:

//--------------------------------------------------------------------------

#include <vcl.h>

#pragma   hdrstop

 #include "Unit1.h"

//--------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*dfm"

TForm1 *Form1;

//--------------------------------------------------------------------------

___fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//--------------------------------------------------------------------------

const Nmax=10; // Максимальная размерность массива

typedef double mas2[Nmax][Nmax]; // Объявление типа двухмерного

массива

typedef double mas1[Nmax]; // Объявление типа одномерного массива int N=3;

void__ fastcall TForm1::FormCreate(TObject *Sender)

{

//Задание числа строк и столбцов в таблицах

         Edit1->Text=FloatToStr(N);

StringGrid1->ColCount=N+1;

StringGrid1->RowCount=N+1;

StringGrid2->RowCount=N+1;

StringGrid3->RowCount=N+1;

//Ввод в левую верхнюю ячейку таблицы названия массива

StringGrid1->Cells[0][0]="Массив A";

StringGrid2->Cells[o][o]="Массив B";

StringGrid3-Сеlls[o][o]="МассивY";

for(int i=1; i<=N;i++)

{

StringGrid1->Cells[0][i]="i="+IntToStr(i);

StringGrid1->Cells[i][0]="j="+IntToStr(i);

}

}

//-----------------------------------------------------------------------------

void__ fastcall TForm1::Button1Click(TObject *Sender)

{

N=StrToInt(Edit1->Text);

StringGrid1->ColCount=N+1;

StringGrid1->RowCount=N+1;

StringGrid2->RowCount=N+1;

StringGrid3->RowCount=N+1;

StringGrid1->Cells[0][0]="Массив A";

StringGrid2->Cells[o][0]="Массив B";

StringGrid3-Cells[o][o]="Массив Y";

for(int i=1; i<=N;i++)

{

StringGrid1->Cells[0][i]="i="+IntToStr(i);

StringGrid1->Cells[i][0]="j="+IntToStr(i);

}

}

//--------------------------------------------------------------------------

void__fastcall TForm1::BitBtn1Click(TObject *Sender)

{

mas2 a; // Объявление двухмерного массива

mas1 b,y; // Объявление одномерных массивов

int i,j;

//Заполнение массива А элементами из таблицы StringGridl

for(i=0; i<N;i++) for(j=0; j<N;j++)

a[i][j]=StrToFloat(StringGrid1->Cells[i+1][j+1]);

//Заполнение массива B элементами из таблицы StringGrid2

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

b[i]=StrToFloat(StringGrid2->Cells[0][i+1]);

//Умножение массива А на массив В

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

{

double s=0;

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

s+=a[j][i]*b[j]; y[i]=s;

//Вывод результата в таблицу StringGrid3

StringGrid3->Cells[0][i+1]=FloatToStrF(y[i],ffFixed,8,2);

}

}

//---------------------------------------------------------------------

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

Во всех заданиях по теме «Массивы» скалярные переменные вводить с помощью компонента TEdit с соответствующим пояснением в виде компонента TLabel. Скалярный результат выводить в виде компонента TLabel. Массивы вводить с формы и выводить на форму, используя компонент TStringGrid, в котором 0-й столбец и 0-ю строку использовать для отображения индексов массивов. Вычисления выполнять после нажатия кнопки типа TВutton.

1.     Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и значение 1 - в противном случае.

2.     Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если элементы k-й строки матрицы упорядочены по убыванию, и значение 0 - в противном случае.

3.     Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, и значение 0 - в противном случае.

4.       Задана матрица размером NxM. Определить k - количество “особых” элементов матрицы, считая элемент «особым», если он больше суммы остальных элементов своего столбца.

5.       Задана матрица размером NxM. Определить k - количество “особых” элементов матрицы, считая элемент “особым”, если в его строке слева от него находятся элементы, меньше его, а справа - больше.

6.       Задана символьная матрица размером NxM. Определить k - количество различных элементов матрицы (т.е. повторяющиеся элементы считать один раз).

7.       Дана матрица размером NxM. Упорядочить ее строки по возрастанию их первых элементов.

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

9.       Дана матрица размером NxM. Упорядочить ее строки по возрастанию их наибольших элементов.

10.    Определить, является ли заданная квадратная матрица n-го порядка симметричной относительно побочной диагонали.

11.    Для матрицы размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце, или наоборот.

12.    В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.

13.    В матрице n-го порядка найти максимальный среди элементов, лежащих ниже побочной диагонали, и минимальный среди элементов, лежащих выше главной диагонали.

14.    В матрице размером NxM поменять местами строку, содержащую элемент с наибольшим значением со строкой, содержащей элемент с наименьшим значением.

15.    Из матрицы n-го порядка получить матрицу порядка n-1 путем удаления из исходной матрицы строки и столбца, на пересечении которых расположен элемент с наибольшим по модулю значением.

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

17.    Дан массив, содержащий от 1 до k символов, за которым следует точка. Вывести этот текст в обратном порядке.

18.    Дан непустой массив из цифр. Вывести на экран цифру, наиболее часто встречающуюся в этом массиве.

19.     Отсортировать элементы массива X по возрастанию.

20.      Элементы массива X расположить в обратном порядке.

21.      Элементы массива X циклически сдвинуть на k позиций влево.

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

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