C++ Задача с матрицей: Рассчет индекса седловых точек, попытки решения
Primary tabs
условие задачи:
Элемент матрицы назовем седловой точкой, если он является наименьшим в
своей строке и одновременно наибольшим в своем столбце или, наоборот,
является наибольшим в своей строке и наименьшим в своем столбце. Для
заданной целой матрицы размером 10 ? 15 напечатать индексы всех ее
седловых точек.
попытка решения:
#include "stdio.h"
#define _USE_MATH_DEFINES
#include "math.h"
#include "string"
#include "conio.h"
#include "iostream"
#include "time.h"
using std::cout;
using std::cin;
using std::endl;
int main(){
int a = 0, b = 0;
int mass[10][15];
int ind_a [256];
int ind_b [256];
int ind1_a [256];
int ind1_b [256];
//как вариант, ввод массива с клавиатуры
/* while (a<= 10 && b <= 15){
cout << "введите очередной элемент массива: ";
cin >> mass[a][b];
b++;
if(b == 15){
a++;
}
} */
// заполнение случайными числами
time_t;
int i, j;
for (int i= 0; i < 10; i ++){
for (int j = 0; j < 15; j++){
mass[i][j] = 0 + rand( );
}
}
int a1 = 0, b1 = 0, n1 = 0;
//цикл1 поиск максимума в столбцах (первый номер элемента -номер
строки, второй номер - номер столбца) найденый максимум записывается в
строку
while (a1 <= 10 && b1 <= 15){
if(a1 < 10){
if(mass[a1][b1] < mass[a1++][b1]){
ind_a[n1] = a1++;
ind_b[n1] = b1;
}
a1++;
}
else
b1++;
n1++;
}
//цiкл2 минимум в строках
int a2 = 0, b2 = 0, n2 = 0;
while (a2 <= 10 && b2 <= 15){
if(b2 < 15){
if(mass[a2][b2] > mass[a2][b2++]){
ind1_a[n2] = a2;
ind1_b[n2] = b2;
}
b2++;
}
else
a2++;
n2++;
}
//цикл3 - сравнение результатов
цикла1 и цикла2, вывод результатов
int a3 = 0, b3 = 0, n3 = 0;
while (n3 <= 256){
if(mass[ind_a[n3]][ind_b[n3]] == mass[ind1_a[n3]][ind1_b[n3]]) {
cout << ind_a[n3] << ind_b[n3] << endl;
n3++;
}
}
getch () ;
return 0 ;
}
код ошибки:
1>------ Построение начато: проект: chernovik 6 task, Конфигурация: Debug Win32 ------ 1> body.cpp 1>c:\documents and settings\грш\мои документы\visual studio 2010\projects\chernovik\chernovik 6 task\chernovik 6 task\body.cpp(90): warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details. 1> c:\program files\microsoft visual studio 10.0\vc\include\conio.h(128): см. объявление "getch" 1>c:\documents and settings\грш\мои документы\visual studio 2010\projects\chernovik\chernovik 6 task\chernovik 6 task\body.cpp(44): warning C4101: i: неиспользованная локальная переменная 1>c:\documents and settings\грш\мои документы\visual studio 2010\projects\chernovik\chernovik 6 task\chernovik 6 task\body.cpp(43): warning C4101: t: неиспользованная локальная переменная 1>c:\documents and settings\грш\мои документы\visual studio 2010\projects\chernovik\chernovik 6 task\chernovik 6 task\body.cpp(44): warning C4101: j: неиспользованная локальная переменная 1> LINK : не найден или не выполнена сборка C:\Documents and Settings\Грш\Мои документы\Visual Studio 2010\Projects\chernovik\chernovik 6 task\Debug\chernovik 6 task.exe при последней инкрементной компоновке; выполняется полная компоновка 1> chernovik 6 task.vcxproj -> C:\Documents and Settings\Грш\Мои документы\Visual Studio 2010\Projects\chernovik\chernovik 6 task\Debug\chernovik 6 task.exe ========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========
господа, че делать, почему не работает??
- Log in to post comments
- 37942 reads
vedro-compota
Wed, 01/16/2013 - 08:55
Permalink
в каком смысле "не работает"?
в каком смысле "не работает"? программа на запускается?
как таковой ошибки в предупреждения студии нет - если вы хотите избавиться от всех предупреждения - поищите в гугл каждое из них - и вынесете его отдельной ссылкой начиная со слов "ошибка " (потом тексn) - можно и наоборот.
если не понимаете в чём дело - при этом пути к компилируемым файлам из заголовков убираются - т.к. общей смысловой нагрузки не несут.
_____________
матфак вгу и остальная классика =)
baton
Wed, 01/16/2013 - 16:26
Permalink
понимаете в чем дело -
понимаете в чем дело - программа строится успешно.
вылетает пустая консоль и подвисает - ее приходится завершат через диспетчер.
посмотрите пожалуйста код - может быть косяк в чем-то несложном - я в первый раз использую двумерный массив - может что-то напутал при инициализации, например?
хотя я так подозреваю, не срабатывает один из циклов - я не могу понять, почему.
да, еще : при завершении через диспетчер выводится системный отчет об ошибке (который предлагают отправить Биллу)
"AppName: chernovik 6 task.exe AppVer: 0.0.0.0 ModName: chernovik 6 task.exe ModVer: 0.0.0.0 Offset: 000116eb"
vedro-compota
Wed, 01/16/2013 - 23:01
Permalink
как мы выяснили сегодня
как мы выяснили сегодня проблема (которая вызывала ошибку) была в строке:
потому что к сожалению элемент - по номеру подобному по величине этому:
отсутствовал =)))
_____________
матфак вгу и остальная классика =)
baton
Thu, 01/17/2013 - 22:58
Permalink
ну и что бы вы думали - заработала задача?
а вот хрен мне на дизельном топливе. все-таки я себе не изменил и неповторимо криво написал третий цикл.
ниже привожу полностью код задачи:
#include "stdio.h" #define _USE_MATH_DEFINES #include "math.h" #include "string" #include "conio.h" #include "iostream" #include "time.h" #include "ctime" using std::cout; using std::cin; using std::endl; using namespace std; void strprint(int * arr, int long_str){ printf("\n"); for(int i = 0; i < long_str; i++){ printf("-%i\n",arr[i]); } printf("_ _ _ _ _ _ _ _ _ _\n"); } int main() { setlocale(LC_ALL, "Russian"); int mass[10][15]; int ind_x [15]; int ind_y [15]; int ind_a [10]; int ind_b [10]; //int*mas = &mass[0][0]; //как вариант, ввод массива с клавиатуры /* int a = 0, b = 0; while (a<= 10 && b <= 15){ cout << "введите очередной элемент массива: "; cin >> mass[a][b]; b++; if(b == 14){ a++; } } */ // заполнение случайными числами printf("вывод результата заполенения матрицы\n"); time_t; srand(time(NULL)); /* (!!!!!!!!!!!!!!!!!!) не вполне понял, как работает эта строка */ for (int i = 0; i < 10; i++){ printf("\n"); for (int j = 0; j < 15; j++){ mass[i][j] = rand(); printf("%i ", mass[i][j]); } } //цикл1 поиск максимума в столбцах (первый номер элемента -номер // строки, второй номер - номер столбца) найденый максимум // записывается в строку /* есть заполненная матрица 10*15 превый цикл ищет максимум в столбцах а именно - два вложенных цикла - внешний перебирает столбцы, в нашем случае значения счетчика от 0 до 14 (равным второму индексу элемента массива); получив втолрой столбец мы ищем в нем максимальный элемент (задача внутреннего цикла). формально - поиск max сводится к поиску его же в строке, который реализуется следующим образом: обьявляется переменаая мах - ей по умолчанию присваивается значение первого элемента - с этой переменной в цикле сравнивается каждый последующий элелемнт строки, если очередной элемент больше мах, то мах присваивается его значение (мах = i[]). т.к. нам важны координаы мах, а не его значение, при каждом присвоении махimymy значения очередного элемента, в строки записываются индексы этого элемента. при нахождении мах в столбце - мах есть последний присвоенный элемент - внутренний цикл закончился по достижении счетчиком числа строк - внешний цикл переходит следующее значение столбца матрицы и индексов строк. когда счетчик внешнего цикла достигает 15, цикл1 заканчивается и в действие вступает цикл2, в котором тем же образом производится поиск минимума в каждой строке. */ // цикл1 - мах в столбцах int max; int x; // номер строки максимума int y; // номер столбца максимума for (int i = 0; i < 15; i++){ // перебор столбцов max = mass[0][i]; // первый элемент iтого столбца for(int h = 0; h < 10; h++){ /* перебор элементов строк принадлежащий определенному выше столбцу */ if(max < mass[h][i]){ max = mass[h][i]; x = h; y = i; } } ind_x[i] = x; ind_y[i] = y; } // цикл2 - min в строках int min; int a; // номер строки минимума int b; // номер столбца минимума for (int i = 0; i < 10; i++){ // перебор строк min = mass[i][0]; // первый элемент iтой строки for(int h = 0; h < 15; h++){ //перебор элементов столбцов принадлежащий определенной выше строке if(min > mass[i][h]){ min = mass[i][h]; a = i; // а аналогично х в первом цикле b = h; // b аналогично у } } ind_a[i] = a; ind_b[i] = b; } // вывод результата заполнения строк printf("вывод результата заполенеия строк\n"); strprint(ind_x, 15); strprint(ind_y, 15); strprint(ind_a, 10); strprint(ind_b, 10); printf("вывод седловых точек\n"); //цикл3 - сравнение результатов цикла1 и цикла2, вывод результатов /* третий цикл (два вложенных цикла) - сопоставление минимума и максимума - поиск седловых точек. каждые 2 элемента ind_x[i] и ind_y[i] сопоставляются с каждыми двумя элементами int ind_a и int ind_b, если значения (координаты) совпадают - координаты добавляются в строку, из которой после выведутся на экран если совпадений нет - принтф "седловых точек нет". */ for (int i = 0; i < 15; i++) { for(int n = 0; n < 10 ; n++){ if (ind_x[i] == ind_a[n]){ if(ind_y[i] == ind_b[n]) { //if(mass[ind_x[i]][ind_y[i]] == mass[ind_a[n]][ind_b[n]]){ printf("%d", ind_x[i]); printf("%d\n", ind_y[i]); //} } } else printf("седловая точка не найдена\n"); } } getch (); return 0 ; }третий цикл (ПРОВЕРКА и ВЫВОД) работать должен дословно так:
внешний цикл и первое условие вложенного цикла - сравниваются координаты мин и макс по строкам, вложенный цикл и второе условие - сравниваются координаты мин и макс по столбцам.
еще хотел сделать проверку значений минимумов и максимумов - но пока эту строку (после второго условия вложенного цикла) закомментил.
проблема - ни одной седловой точки не находит.
устранение проблемы - завтра вручную проверю результаты заполнения строк координатами и если седловые точки есть, перепишу ПРОВЕРКУ заново с вынесением первого условия во внешний цикл
vedro-compota
Fri, 01/18/2013 - 18:54
Permalink
здесь два момента:
здесь два момента:
1) Вы проверяли правильность работы первых двух циклов? (выводили ли полученные массивы на экран - это действительно максимумы/минимумы)
2) далее - комментарий -
/* .....если значения (координаты) совпадают - координаты добавляются в строку, из которой после выведутся на экран....... */не соответствует действительности - хотя надо отметить что уровень написания комментариев значительно повышен (поздравляю)
это нуждается в обосновании - хотя бы и не имеет его , как и всякая ошибка. в первом условии есть элемент ,который изменяется в каждом витке внутреннего цикла, а потому перенесён быть не может.
_____________
матфак вгу и остальная классика =)
baton
Fri, 01/18/2013 - 22:44
Permalink
нашел косяк
вообще для меня уже сомнительно существование седловых точек в матрице заполняемой рандомным способом - и я ради эксперимента заполнил матрицу так:
// вариант заполнения числами от нуля до 149 int m = 0; for (int i = 0; i < 10; i++){ printf("\n"); for (int j = 0; j < 15; j++){ mass[i][j] = m++; printf("%i ", mass[i][j]); } }при этом выявилось, что третья и четвертая строки (координаты минимумов строк матрицы) - не заполняются.
над косяком работаю - хотя я без понятия - в чем он.
vedro-compota
Fri, 01/18/2013 - 22:54
Permalink
задайте вручную (в коде)
задайте вручную (в коде) матрицу 5 на 5 - в которой будет пара седловых точек
выведите её (матрицу) на экран
выведите найденные точки
измените число седловых точек - и ещё раз запустите программу.
действительно - наличие седловых точек - не столь уж вероятное событие.
_____________
матфак вгу и остальная классика =)
baton
Sat, 01/19/2013 - 00:47
Permalink
косяк определен точно
дело именно во втором цикле. я не знаю в чем именно - где в трех строках ошибка - но она там.
привожу код, который срабатывает, полностью - его особенность заключается в кастрации второго цикла (который совершает поиск минимума в строках). прилагаю скриншоты экрана до и после кастрации:
#include "stdio.h" #define _USE_MATH_DEFINES #include "math.h" #include "string" #include "conio.h" #include "iostream" #include "time.h" #include "ctime" using std::cout; using std::cin; using std::endl; using namespace std; void strprint(int * arr, int long_str){ printf("\n"); for(int i = 0; i < long_str; i++){ printf("-%i\n",arr[i]); } printf("_ _ _ _ _ _ _ _ _ _\n"); } int main() { setlocale(LC_ALL, "Russian"); int mass[10][15]; int ind_x [15]; int ind_y [15]; int ind_a [10]; int ind_b [10]; // заполнение случайными числами printf("вывод результата заполенения матрицы\n"); // вариант заполнения числами от нуля до 149 int m = 0; for (int i = 0; i < 10; i++){ printf("\n"); for (int j = 0; j < 15; j++){ mass[i][j] = m++; printf("%i ", mass[i][j]); } } //первый номер элемента -номер строки, второй номер - номер столбца // цикл1 - мах в столбцах int max; int y; // номер столбца максимума int x; // номер строки максимума for (int i = 0; i < 15; i++){ // перебор столбцов max = mass[0][i]; // первый элемент iтого столбца for(int h = 0; h < 10; h++){ if(max < mass[h][i]){ max = mass[h][i]; x = h; y = i; } } ind_x[i] = x; ind_y[i] = y; } // цикл2 - min в строках int min; int a; // номер столбца минимума //int b; // номер строки минимума for (int i = 0; i < 10; i++){ // перебор строк min = mass[i][0]; // первый элемент iтой строки //for(int h = 0; h < 15; h++){ //!!!!!!!!! наверно ошибка тут! // if(min > mass[i][h]){ //!!!!!!!!!! ошибка где-то тут! //min = mass[i][h]; //!!!!!!!!! или тут! a = i; // ind_b[i] = 0; // перемещено по сравнению с кодом, // приведенном в позапрошлом ответе, // т.к. по-другому не срабатывает. //} //} ind_a[i] = a; //ind_b[i] = b; } // вывод результата заполенеия строк printf("\n\n"); printf("вывод результата заполенеия строк\n"); strprint(ind_x, 15); strprint(ind_y, 15); strprint(ind_a, 10); strprint(ind_b, 10); printf("\n"); printf("вывод седловых точек:\n"); printf("_ _ _ _ _ _ _ _ _ _\n"); //цикл3 - сравнение результатов for (int i = 0; i < 15; i++) { for(int n = 0; n < 10 ; n++){ if (ind_x[i] == ind_a[n]){ if(ind_y[i] == ind_b[n]) { if(mass[ind_x[i]][ind_y[i]] == mass[ind_a[n]][ind_b[n]]){ // cout << ind_x[i] << ind_y[i] << endl; printf("%d", ind_x[i]); printf("%d\n", ind_y[i]); } } } //else // printf("седловая точка не найдена\n"); } } printf("других седловых точек не найдено\n"); getch (); return 0 ; }до кастрации:
после:

обратите внимание, что третий цикл (сравнение результатов цикла 1 и 2, вывод седловой точки) - срабатывает. как и первый цикл(поиск максимума в столбцах)
vedro-compota
Sat, 01/19/2013 - 00:54
Permalink
скриношоты это удобно - но
скриношоты это удобно - но вы уверены, что код "до изменения" выглядит именно так (а вы утверждаете именно это)?:
for (int i = 0; i < 10; i++){ // перебор строк min = mass[i][0]; // первый элемент iтой строки for(int h = 0; h < 15; h++){ //!!!!!!!!! наверно ошибка тут! if(min > mass[i][h]){ //!!!!!!!!!! ошибка где-то тут! min = mass[i][h]; //!!!!!!!!! или тут! a = i; // ind_b[i] = 0; // перемещено по сравнению с кодом, // приведенном в позапрошлом ответе, // т.к. по-другому не срабатывает. } } ind_a[i] = a; //ind_b[i] = b; }_____________
матфак вгу и остальная классика =)
baton
Sat, 01/19/2013 - 19:33
Permalink
та невже
это уже кастрированный код, с которого вы убрали часть
- суть кастрации заключаласть так же в
вся строка b насильно заполняется нулями, хотя цикл должен это делать самостоятельно.
код "до" приведен на два поста выше - см. полный код
кстати, ошибку так и не понял
baton
Sat, 01/19/2013 - 13:28
Permalink
эврика
ща выложу рабочий код
и объясню в чем на самом деле был косяк.
baton
Sat, 01/19/2013 - 18:36
Permalink
упс
опять криво
при рандомном заполнении матрицы находит несуществующие седловые точки.....
#include "stdio.h" #define _USE_MATH_DEFINES #include "math.h" #include "string" #include "conio.h" #include "iostream" #include "time.h" #include "ctime" using std::cout; using std::cin; using std::endl; using namespace std; void strprint(int * arr, int long_str){ printf("\n"); for(int i = 0; i < long_str; i++){ printf("-%i\n",arr[i]); } printf("_ _ _ _ _ _ _ _ _ _\n"); } int main() { setlocale(LC_ALL, "Russian"); int mass[10][15]; int ind_x [15]; int ind_y [15]; int ind_a [10]; int ind_b [10]; printf("вывод результата заполенения матрицы\n"); //как вариант, ввод массива с клавиатуры /* int a = 0, b = 0; while (a<= 10 && b <= 15){ cout << "введите очередной элемент массива: "; cin >> mass[a][b]; b++; if(b == 14){ a++; } } /**/ // заполнение случайными числами /* // вариант заполнения числами от нуля до 149 int m = 0; for (int i = 0; i < 10; i++){ printf("\n"); for (int j = 0; j < 15; j++){ mass[i][j] = m++; printf("%i ", mass[i][j]); } } /**/ /* */ time_t; srand(time(NULL)); // (!) не вполне понял, как работает эта строка for (int i = 0; i < 10; i++){ printf("\n"); for (int j = 0; j < 15; j++){ mass[i][j] = rand() %100; printf("%i ", mass[i][j]); } } /**/ //цикл1 поиск максимума в столбцах (первый номер элемента -номер // строки, второй номер - номер столбца) найденый максимум // записывается в строку // цикл1 - мах в столбцах int max; int y; // номер столбца максимума int x; // номер строки максимума for (int i = 0; i < 15; i++){ // перебор столбцов max = mass[0][i]; // первый элемент iтого столбца for(int h = 0; h < 10; h++){ // перебор элементов строк принадлежащий определенному выше столбцу if(max < mass[h][i]){ max = mass[h][i]; x = h; y = i; } else x = 0; y = i; } ind_x[i] = x; ind_y[i] = y; } // цикл2 - min в строках int min; int a; // номер столбца минимума int b; // номер строки минимума for (int i = 0; i < 10; i++){ // перебор строк //b = 0; min = mass[i][0]; // первый элемент iтой строки for(int h = 0; h < 15; h++){ // перебор элементов столбцов принадлежащий определенной выше строке if(min > mass[i][h]){ min = mass[i][h]; a = i; // а аналогично х в первом цикле b = h; // b аналогично у } else a = i; b = 0; ind_a[i] = a; ind_b[i] = b; } } // вывод результата заполенеия строк printf("\n\n"); printf("вывод результата заполенеия строк\n"); strprint(ind_x, 15); strprint(ind_y, 15); strprint(ind_a, 10); strprint(ind_b, 10); printf("\n"); printf("вывод седловых точек:\n"); printf("_ _ _ _ _ _ _ _ _ _\n"); //цикл3 - сравнение результатов цикла1 и цикла2, вывод результатов /* третий цикл (два вложенных цикла) - сопоставление минимума и максимума - поиск седловых точек. каждые 2 элемента ind_x[i] и ind_y[i] сопоставляются с каждыми двумя элементами int ind_a и int ind_b, если значения (координаты) совпадают - кооринаты добавляются в строку, из которой после выведутся на экран если совпадений нет - принтф "седловых точек нет". */ for (int i = 0; i < 15; i++) { for(int n = 0; n < 10 ; n++){ if (ind_x[i] == ind_a[n]){ if(ind_y[i] == ind_b[n]) { if(mass[ind_x[i]][ind_y[i]] == mass[ind_a[n]][ind_b[n]]){ // cout << ind_x[i] << ind_y[i] << endl; printf("["); printf("%d", ind_x[i]); printf("] ["); printf("%d", ind_y[i]); printf("] \n"); } } } } } printf("других седловых точек не найдено\n"); /* for (int i = 0; i != 0; i++){ // ?????????????? // for (int j = 0; j < 15; j++){ delete[]mass[i]; // Удаляем каждый элемент //} } delete [] mass; // А потом массив */ getch (); return 0 ; }baton
Sun, 01/27/2013 - 15:37
Permalink
готовый рабочий код v2.0
вроде бы все работает исправно
#include "stdio.h" #define _USE_MATH_DEFINES #include "math.h" #include "string" #include "conio.h" #include "iostream" #include "time.h" #include "ctime" using std::cout; using std::cin; using std::endl; using namespace std; void strprint(int * arr, int long_str){ printf("\n"); for(int i = 0; i < long_str; i++){ printf("-%i\n",arr[i]); } printf("_ _ _ _ _ _ _ _ _ _\n"); } int main() { setlocale(LC_ALL, "Russian"); int mass[10][15]; int ind_x [15]; int ind_y [15]; int ind_a [10]; int ind_b [10]; printf("вывод результата заполенения матрицы\n"); // заполнение случайными числами /**/ // вариант заполнения числами от нуля до 149 int m = 150; for (int i = 0; i < 10; i++){ printf("\n"); for (int j = 0; j < 15; j++){ mass[i][j] = m--; printf("%i ", mass[i][j]); } } /**/ /* time_t; srand(time(NULL)); // (!!!!!) не вполне понял, как работает эта строка for (int i = 0; i < 10; i++){ printf("\n"); for (int j = 0; j < 15; j++){ mass[i][j] = rand() %100; printf("%i ", mass[i][j]); } } /**/ //цикл1 поиск максимума в столбцах (первый номер элемента -номер // строки, второй номер - номер столбца) найденый максимум // записывается в строку /* есть заполненная матрица 10*15 превый цикл ищет максимум в столбцах а именно - два вложенных цикла - внешний перебирает столбцы, в нашем случае значения счетчика от 0 до 14 (равным второму индексу элемента массива); получив втолрой столбец мы ищем в нем максимальный элемент (задача внутреннего цикла). формально - поиск max сводится к поиску его же в строке, который реализуется следующим образом: обьявляется переменаая мах - ей по умолчанию присваетвается значение первого элемента - с этой переменной в цикле сравнивается каждый последующий элелемнт строки, если очередной элемент больше мах, то мах присваивается его значение (мах = i[]). т.к. нам важны координаы мах, а не его значение, при каждом присвоении махimymy значения очередного элемента, в строки записываются индексы этого элемента. при нахождении мах в столбце - мах есть последний присвоенный элемент - внутренний цикл закончися по достижении счечиком числа строк - внешний цикл переходит следующее значение столбца матрици и индексов строк. когда счетчик внешнего цикла достигает 15, цикл1 заканчивается и в действие вступает цикл2, в котором тем же образом произоводится поиск минимума в каждой строке. */ // цикл1 - мах в столбцах int max; int y; // номер столбца максимума int x; // номер строки максимума for (int i = 0; i < 15; i++){ // перебор столбцов max = mass[0][i]; // первый элемент iтого столбца x = 0; y = i; for(int h = 0; h < 10; h++){ // перебор элементов строк принадлежащий определенному выше столбцу if(max < mass[h][i]){ max = mass[h][i]; x = h; y = i; } } ind_x[i] = x; ind_y[i] = y; } // цикл2 - min в строках int min; int a; // номер столбца минимума int b; // номер строки минимума for (int i = 0; i < 10; i++){ // перебор строк b = 0; a = i; min = mass[i][0]; // первый элемент iтой строки for(int h = 0; h < 15; h++){ // перебор элементов столбцов принадлежащий определенной выше строке if(min > mass[i][h]){ min = mass[i][h]; a = i; // а аналогично х в первом цикле b = h; // b аналогично у } ind_a[i] = a; ind_b[i] = b; } } // вывод результата заполенеия строк printf("\n\n вывод результата заполенеия строк\n"); strprint(ind_x, 15); strprint(ind_y, 15); strprint(ind_a, 10); strprint(ind_b, 10); printf("\n вывод седловых точек:\n"); printf("_ _ _ _ _ _ _ _ _ _\n"); //цикл3 - сравнение результатов цикла1 и цикла2, вывод результатов /* третий цикл (два вложенных цикла) - сопоставление минимума и максимума - поиск седловых точек. каждые 2 элемента ind_x[i] и ind_y[i] сопоставляются с каждыми двумя элементами int ind_a и int ind_b, если значения (координаты) совпадают - кооринаты добавляются в строку, из которой после выведутся на экран. если совпадений нет - принтф "седловых точек нет". */ int chislo = 0; for (int i = 0; i < 15; i++) { for(int n = 0; n < 10 ; n++){ if (ind_x[i] == ind_a[n]){ if(ind_y[i] == ind_b[n]) { if(mass[ind_x[i]][ind_y[i]] == mass[ind_a[n]][ind_b[n]]){ // cout << ind_x[i] << ind_y[i] << endl; chislo++; printf("["); printf("%d", ind_x[i]); printf("] ["); printf("%d", ind_y[i]); printf("] \n"); } } } } } printf("\n других седловых точек не найдено\n"); printf("\n всего седловых точек: %d", chislo); /* for (int i = 0; i != 0; i++){ // ?????????????? // for (int j = 0; j < 15; j++){ delete[]mass[i]; // Удаляем каждый элемент //} } delete [] mass; // А потом массив */ getch (); return 0 ; }baton
Sun, 01/27/2013 - 18:09
Permalink
код для матрицы 3 на 3
для того чтобы проверить код вручную запилил вариант с вводом матрицы 3Х3 с клавиатуры.
вроде бы все в порядке.
#include "stdio.h" #define _USE_MATH_DEFINES #include "math.h" #include "string" #include "conio.h" #include "iostream" #include "time.h" #include "ctime" using std::cout; using std::cin; using std::endl; using namespace std; void strprint(int * arr, int long_str){ printf("\n"); for(int i = 0; i < long_str; i++){ printf("-%i\n",arr[i]); } printf("_ _ _ _ _ _ _ _ _ _\n"); } int main() { setlocale(LC_ALL, "Russian"); int mass[3][3]; int ind_x [3]; int ind_y [3]; int ind_a [3]; int ind_b [3]; //как вариант, ввод массива с клавиатуры..... for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ cin>> mass[i][j]; } } printf("вывод результата заполенения матрицы\n"); for (int i = 0; i < 3; i++){ printf("\n"); for (int j = 0; j < 3; j++){ printf("%i ", mass[i][j]); } } /* // вариант заполнения матрицы числами от нуля до 9 int m = 0; for (int i = 0; i < 3; i++){ printf("\n"); for (int j = 0; j < 3; j++){ mass[i][j] = m++; printf("%i ", mass[i][j]); } } /**/ //заполнение матрицы случайными числами /* time_t; srand(time(NULL)); for (int i = 0; i < 3; i++){ printf("\n"); for (int j = 0; j < 3; j++){ mass[i][j] = rand() %100; printf("%i ", mass[i][j]); } } /**/ /*цикл1 поиск максимума в столбцах (первый номер элемента -номер строки, второй номер - номер столбца) найденый максимум записывается в строку */ // цикл1 - мах в столбцах int max; int y; // номер столбца максимума int x; // номер строки максимума for (int i = 0; i < 3; i++){ // перебор столбцов max = mass[0][i]; // первый элемент iтого столбца x = 0; y = i; for(int h = 0; h < 3; h++){ // перебор элементов строк принадлежащий определенному выше столбцу if(max < mass[h][i]){ max = mass[h][i]; x = h; y = i; } } ind_x[i] = x; ind_y[i] = y; } // цикл2 - min в строках int min; int a; // номер столбца минимума int b; // номер строки минимума for (int i = 0; i < 3; i++){ // перебор строк b = 0; a = i; min = mass[i][0]; // первый элемент iтой строки for(int h = 0; h < 3; h++){ // перебор элементов столбцов принадлежащий определенной выше строке if(min > mass[i][h]){ min = mass[i][h]; a = i; // а аналогично х в первом цикле b = h; // b аналогично у } ind_a[i] = a; ind_b[i] = b; } } // вывод результата заполенеия строк printf("\n\n вывод результата заполенеия строк\n"); strprint(ind_x, 3); strprint(ind_y, 3); strprint(ind_a, 3); strprint(ind_b, 3); printf("\n вывод седловых точек:\n"); printf("_ _ _ _ _ _ _ _ _ _\n"); //цикл3 - сравнение результатов цикла1 и цикла2, вывод результатов int chislo = 0; for (int i = 0; i < 3; i++) { for(int n = 0; n < 3 ; n++){ if (ind_x[i] == ind_a[n]){ if(ind_y[i] == ind_b[n]) { if(mass[ind_x[i]][ind_y[i]] == mass[ind_a[n]][ind_b[n]]){ chislo++; printf("["); printf("%d", ind_x[i]); printf("] ["); printf("%d", ind_y[i]); printf("] \n"); } } } } } printf("\n других седловых точек не найдено\n"); printf("\n всего седловых точек: %d", chislo); getch (); return 0 ; }baton
Sun, 01/27/2013 - 18:12
Permalink
благодарствую
спасибо за помощь товарищ - ты часто выручаешь)))))
через сутки подкину еще один косяк.