Задача с матрицей -- C++

условие задачи:

Элемент матрицы назовем седловой точкой, если он является наименьшим в
своей строке и одновременно наибольшим в своем столбце или, наоборот,
является наибольшим в своей строке и наименьшим в своем столбце. Для
заданной целой матрицы размером 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 ==========

господа, че делать, почему не работает??

vedro-compota's picture

в каком смысле "не работает"? программа на запускается?
как таковой ошибки в предупреждения студии нет - если вы хотите избавиться от всех предупреждения - поищите в гугл каждое из них - и вынесете его отдельной ссылкой начиная со слов "ошибка " (потом тексn) - можно и наоборот.

если не понимаете в чём дело - при этом пути к компилируемым файлам из заголовков убираются - т.к. общей смысловой нагрузки не несут.

_____________
матфак вгу и остальная классика =)

baton's picture

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

хотя я так подозреваю, не срабатывает один из циклов - я не могу понять, почему.

да, еще : при завершении через диспетчер выводится системный отчет об ошибке (который предлагают отправить Биллу)
"AppName: chernovik 6 task.exe AppVer: 0.0.0.0 ModName: chernovik 6 task.exe ModVer: 0.0.0.0 Offset: 000116eb"

vedro-compota's picture

как мы выяснили сегодня проблема (которая вызывала ошибку) была в строке:

if(mass[ind_a[n3]][ind_b[n3]] == mass[ind1_a[n3]][ind1_b[n3]])

потому что к сожалению элемент - по номеру подобному по величине этому:

ind_a[345672567]

отсутствовал =)))

_____________
матфак вгу и остальная классика =)

baton's picture

а вот хрен мне на дизельном топливе. все-таки я себе не изменил и неповторимо криво написал третий цикл.
ниже привожу полностью код задачи:

	#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's picture

здесь два момента:
1) Вы проверяли правильность работы первых двух циклов? (выводили ли полученные массивы на экран - это действительно максимумы/минимумы)

2) далее - комментарий -

/*
.....если значения (координаты) совпадают - координаты добавляются в строку,
 из которой после выведутся на экран.......
        */

не соответствует действительности - хотя надо отметить что уровень написания комментариев значительно повышен (поздравляю)

с вынесением первого условия во внешний цикл

это нуждается в обосновании - хотя бы и не имеет его , как и всякая ошибка. в первом условии есть элемент ,который изменяется в каждом витке внутреннего цикла, а потому перенесён быть не может.

_____________
матфак вгу и остальная классика =)

baton's picture

вообще для меня уже сомнительно существование седловых точек в матрице заполняемой рандомным способом - и я ради эксперимента заполнил матрицу так:

	// вариант заполнения числами от нуля до 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's picture

задайте вручную (в коде) матрицу 5 на 5 - в которой будет пара седловых точек
выведите её (матрицу) на экран
выведите найденные точки

измените число седловых точек - и ещё раз запустите программу.
действительно - наличие седловых точек - не столь уж вероятное событие.

_____________
матфак вгу и остальная классика =)

baton's picture

дело именно во втором цикле. я не знаю в чем именно - где в трех строках ошибка - но она там.
привожу код, который срабатывает, полностью - его особенность заключается в кастрации второго цикла (который совершает поиск минимума в строках). прилагаю скриншоты экрана до и после кастрации:



	#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 ;
}

до кастрации:

http://cs323220.userapi.com/v323220498/44ca/UlwgVwEcXU0.jpg

после:
http://cs323220.userapi.com/v323220498/44d3/OVUZpWhrYAo.jpg

обратите внимание, что третий цикл (сравнение результатов цикла 1 и 2, вывод седловой точки) - срабатывает. как и первый цикл(поиск максимума в столбцах)

vedro-compota's picture

скриношоты это удобно - но вы уверены, что код "до изменения" выглядит именно так (а вы утверждаете именно это)?:

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's picture

это уже кастрированный код, с которого вы убрали часть

 //комментариев

- суть кастрации заключаласть так же в

ind_b[i] = 0; // перемещено....

вся строка b насильно заполняется нулями, хотя цикл должен это делать самостоятельно.

код "до" приведен на два поста выше - см. полный код
кстати, ошибку так и не понял

baton's picture

ща выложу рабочий код
и объясню в чем на самом деле был косяк.

baton's picture

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

	#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's picture

вроде бы все работает исправно

	#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's picture

для того чтобы проверить код вручную запилил вариант с вводом матрицы 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's picture

спасибо за помощь товарищ - ты часто выручаешь)))))
через сутки подкину еще один косяк.