Настройка компонент StringGrid
Для компоненты StringGrid1 значения ColCount и RowCount установите равными, например, 3 – три столбца и три строки, а FixedCols и FixedRows – 1.
Так как компоненты StringGrid2 и StringGrid3 имеют только один столбец, то у них ColCount = 1, RowCount = 3, а FixedCols = 0 и FixedRows = 1.
В свойстве Options строку goEditing для компонент StringGrid1 и StringGrid2 установите в положение true.
Для изменения размера n используется функция-обработчик EditChange, полученная двойным щелчком по компоненте Edit.
Рис. 6.1
Текст программы может иметь следующий вид:
. . .
int n = 3; // Глобальная переменная n
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text=IntToStr(n);
StringGrid1->ColCount = n+1; StringGrid1->RowCount = n+1;
StringGrid2->RowCount = n+1; StringGrid3->RowCount = n+1;
//---------- Ввод в левую верхнюю ячейку таблицы названия массивов -----------
StringGrid1->Cells[0][0] = "Матрица A";
StringGrid2->Cells[0][0] = "Массив B";
StringGrid3->Cells[0][0] = "Массив 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::Edit1Change(TObject *Sender)
{
int i;
n=StrToInt(Edit1->Text);
StringGrid1->ColCount = n+1;
StringGrid1->RowCount = n+1;
StringGrid2->RowCount = n+1;
StringGrid3->RowCount = n+1;
for(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)
{
double **a, *b, s; // Декларация указателей
int i, j;
a = new double*[n]; // Захват памяти под указатели
for(i=0; i<n;i++)
a[i] = new double[n]; // Захват памяти под элементы
b = new double[n];
// Заполнение массивов А и В элементами из таблиц StringGrid1 и StringGrid2
for(i=0; i<n;i++) {
for(j=0; j<n;j++)
a[i][j]=StrToFloat(StringGrid1->Cells[j+1][i+1]);
b[i]=StrToFloat(StringGrid2->Cells[0][i+1]);
}
// Умножение строки матрицы А на вектор В и вывод результата s в StringGrid3
for(i=0; i<n;i++){
for(s=0, j=0; j<n;j++)
s += a[i][j]*b[j];
StringGrid3->Cells[0][i+1] = FloatToStrF(s, ffFixed,8,2);
}
for(i=0; i<n;i++) delete []a[i];
delete []a;
delete []b;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
Пример создания консольного приложения
Текст программы может иметь следующий вид:
. . .
void main()
{
double **a, *b, s;
int i, j, n;
printf(" Input size N : ");
scanf("%d",&n);
a = new double*[n]; // Захват памяти под указатели
for(i=0; i<n;i++)
a[i] = new double[n]; // Захват памяти под элементы
b = new double[n];
puts("\n Input Massiv A:");
for(i=0; i<n;i++)
for(j=0; j<n;j++)
scanf("%lf", &a[i][j]);
puts("\n Input Massiv B:");
for( i=0; i<n;i++)
scanf("%lf", &b[i]);
puts("\n Massiv Y:");
for(i=0; i<n;i++){
for(s=0, j=0; j<n;j++)
s+=a[i][j]*b[j];
printf(" %8.2lf ", s);
}
for(i=0; i<n;i++)
delete []a[i];
delete []a;
delete []b;
puts("\n Delete !");
puts("\n Press any key ... ");
getch();
}
При вводе значений элементов массивов в одной строке через пробелы должен получиться следующий результат:
6.3. Индивидуальные задания
Написать программу по обработке динамических массивов. Размеры массивов вводить с клавиатуры. При создании оконного приложения скалярный (простой) результат выводить в виде компоненты Label, а массивы вводить и выводить с помощью компонент StringGrid, в которых 0-й столбец и 0-ю строку использовать для отображения индексов массивов.
1. Из матрицы размером N´M получить вектор B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, иначе 1.
2. Из матрицы размером N´M получить вектор B, присвоив его k-му элементу значение 1, если элементы k-й строки матрицы упорядочены по убыванию, иначе 0.
3. Из матрицы размером N´M получить вектор B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, иначе значение 0.
4. Задана матрица размером N´M. Определить количество «особых» элементов матрицы, считая элемент «особым», если он больше суммы остальных элементов своего столбца.
5. Задана матрица размером N´M. Определить количество элементов матрицы, у которых слева находится элемент больше его, а справа – меньше.
6. Задана матрицаразмером N´M. Определить количество различных значений матрицы, т.е. повторяющиеся элементы считать один раз.
7. В матрице размером N´M упорядочить строки по возрастанию их первых элементов.
8. В матрице размером N´M упорядочить строки по возрастанию суммы их элементов.
9. В матрице размером N´M упорядочить строки по возрастанию их наибольших элементов.
10. Определить, является ли квадратная матрица симметричной относительно побочной диагонали.
11. Задана матрица размером N´M. Определить количество элементов матрицы, у которых слева находится элемент меньше его, а справа – больше.
12. В квадратной матрице найти произведение элементов, лежащих выше побочной диагонали.
13. В квадратной матрице найти максимальный среди элементов, лежащих ниже побочной диагонали.
14. В матрице размером N´M поменять местами строку, содержащую элемент с наибольшим значением со строкой, содержащей элемент с наименьшим значением.
15. Из матрицы размером n получить матрицу размером n-1 путем удаления строки и столбца, на пересечении которых расположен элемент с наибольшим по модулю значением.
16. В матрице размером n найти сумму элементов, лежащих ниже главной диагонали, и произведение элементов, лежащих выше главной диагонали.