Консультация № 174966
07.12.2009, 02:31
0.00 руб.
09.12.2009, 17:56
0 1 1
Уважаемые эксперты, помогите, пожалуйста.
Дана действительная квадратная матрица порядка n.
Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы.
Код:


|*******|
| ***** |
| * |
| ***** |
|*******|


Оформить в виде функции пользователя.
___________________________________________
Программы должна быть написана на C++ и работать на Microsoft Visual C++ 6.0
Прошу написать как можно более доступным языком и закоментировать каждую строчку по максимуму. (ну почти каждую)
Еще ОЧЕНЬ ОЧЕНЬ нужна БлокСхема (пожалуйста хотя бы ручкой на бумаге набросайте как она должна выглядеть) (ну или кистью в пэйнте)
Плииз очень нужно.

Обсуждение

давно
Посетитель
7438
7205
10.12.2009, 23:53
общий
это ответ
Здравствуйте, Иванов Евгений Витальевич.
Программа в приложении

Приложение:
#include <iostream>
#include <locale>
#include <stdlib.h>
#include <time.h>

using namespace std;

/*****************************************************
Ищем максимальный элемент в квадратной матрице
на местах, показанных на рисунке
|*******|
| ***** |
| * |
| ***** |
|*******|
*****************************************************/
double calc_max(double *A, int n)
{
int i,j; //индексы строк и столбцов
int start; //стартовый столбец
int step; //поправка стартового столбца
double max = -1000.; //максимальный элемент

//Начальная поправка стартового столбца = 1 (сдвигаем вправо)
//Стартовый столбец = 0
//инкремент строки в теле цикла
for(step=1,i=start=0;i<n;) //цикл по строкам
{
for(j=start;j<n-start;j++) //цикл по столбцам
{
if (max < *(A+i*n+j)) //ищем максимальный элемент
max = *(A+i*n+j);
}
start+=step; //сдвигаем начальный столбец
i++; //инкремент строк
switch (step) //анализируем текущую поправку
{
case 1: //от начала к середине
if (i>n/2) //середина?
{
step=-1; //потом пойдем от середины к концу
start-=2; //на предыдущий столбец
}
else if(((n&1)==0) && (i==(n/2))) //для четного числа столбцов
{ //повторяем два средних элемента
step=0; //без смещения начального столбца
start--; //повторяем начальный столбец
}
break;
case 0: //для четного числа столбцов
step=-1; //продолжаем смещаться к началу
start--;
}
}
return max;
}

int main()
{
const int n = 6; //число строк и столбцов
double *A = new double[n*n]; //запросим память под матрицу

locale::global(locale("russian_russia.866")); //чтобы писалось по-русски

srand(time(0)); //инициализация случайных чисел
for(i=0;i<n;i++) //заполним массив числами 0-999
{
for(j=0;j<n;j++)
*(A+i*n+j)=rand()%1000;
}

//выведем матрицу
wcout << L"Исходная матрица:" << endl;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout << *(A+i*n+j) << "\t";
cout << endl;
}

//найдем и выведем максимальный элемент
cout << "Max = " << calc_max(A, n) << endl;

delete []A; //освободим память
system("pause"); //press any key
return 0;
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа