Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
TBIKC
web dev
104 / 91 / 1
Регистрация: 23.09.2010
Сообщений: 738
#1

Найти максимальный среди всех элементов тех строк заданной матрицы, которые упорядочены - C++

07.10.2011, 13:59. Просмотров 2724. Ответов 10
Метки нет (Все метки)

Доброго времени суток, у меня есть задача ( практика,паскаль, процедуры ) так вот я не могу решить задачу
Помогите пожалуйста составить алгоритм, и написать программу (C++, разберусь ибо осилив функции, приступил к изучению массивов, только как можно проще и понятнее)

Найти максимальный среди всех элементов тех строк заданной матрицы, которые упорядочены (либо по возрастанию, либо по убыванию)
В основной программе обеспечить ввод всех данных, обращение к функции (подпрограмме) и вывод результата.
В функции(под программе) описать саму функцию.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2011, 13:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти максимальный среди всех элементов тех строк заданной матрицы, которые упорядочены (C++):

Массивы. Найти максимальный элемент среди всех элементов тех строк заданной матрицы, которые упорядочены - C++
Здравствуйте! помогите написать программу на языке C++. Найти максимальный элемент среди всех элементов тех строк заданной матрицы, которые...

Найти максимальный элемент среди всех элементов тех строк заданной матрицы А (4,4), которые упорядочены по возрастанию - C++
нужно найти максимальный элемент среди всех элементов тех строк заданной матрицы А (4,4), которые упорядочены по возрастанию. Если...

Дана матрица размера N×M. Найти максимальный среди элементов тех строк|столбцов, которые упорядочены либо по возрастанию - C++
Дана матрица размера N×M. Найти максимальный среди элементов тех строк|столбцов, которые упорядочены либо по возрастанию, либо по убыванию....

Среди тех строк целочисленной матрицы, которые содержат только нечетные элементы, найти строку с максимальной суммой модулей элементов - C++
#include <iostream> #include <conio.h> #include <cmath> const int m=3,n=3; using namespace std; int a; void poisk(); int...

Найти максимальный элемента среди минимальных элементов строк матрицы - C++
Здравствуйте помогите написать код , пытался написать сам но ничего не получается вот: #include<iostream> #include<locale> using...

Дан файл целых чисел которые упорядочены по убыванию. Среди этих чисел найти те что больше среднего арифметического суммы всех элементов - C++
Всем привет, можете доделать прогу, а то сортирует на оборот ( как сделать чтоб виводило числа больше среднего?) Дан файл целых чисел...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.10.2011, 14:45 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
bool is_sorted(int * arr, int n, int& max) {
 
    bool sorted=true;
 
    for (int i=1; i<n ; i++) {
        if (arr[i]<arr[i-1]) {
            sorted=false;
            break;
        }
    }
 
    if (sorted) {
        max = arr[n-1];
        return true;
    }
    
    for (int i=1; i<n ; i++) {
        if (arr[i]>arr[i-1]) {
            max=0;
            return false;
        }
    }
 
    max=arr[0];
    return true;
 
}
это среди 1 строки.
co6ak
Кошковед
407 / 500 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
07.10.2011, 14:59 #3
вот довольно топорный вариант проверки )))
только сама функция проверки на упорядоченность + вывод строки


логика: 2 флага проверки. Max->Min и Min->Max соответственно.
Упорядоченной считается строка, в которой флаг равен количеству столбцов. не важно какой из 2 счетчиков. при выполнении условия - вывод результата
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void check ( int ** matr, int ROW, int COLUMN )
{
    for ( int i = 0; i < ROW; i ++ )
    {
        unsigned short int flagMinMax = 0;
        unsigned short int flagMaxMin = 0;
        for ( int j = 0; j < COLUMN - 1; j ++ )
        {
            if ( matr[i][j] < matr [i][j + 1] ) // check sort MIN->MAX            
            {
                flagMinMax ++;
            }
            else flagMaxMin ++;
        }
        if ( ( flagMaxMin == COLUMN  ) || (  flagMinMax == COLUMN ) ) {
            int max = matr[i][0];
            for ( int k = 0; k < COLUMN; k ++ )
                if ( max < matr[i][k] ) max = matr[i][k];
            std::cout << "Max = " << max << "\n";
        }
                             
    }
}
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 15:45 #4
TBIKC, всё же отмечу что вот это
Цитата Сообщение от OstapBender Посмотреть сообщение
if (arr[i]<arr[i-1])
ни есть полный критерий отсортированности, в любом случае в реальных условиях в матрицах могут идти одинаковые элементы например такая строка
1 2 2 3 является сортированной!
При этом 3 2 2 1 тоже сортированная,
только порядок элементов по убыванию, ниже код на С++ с моим взглядом на решение данной задачи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <conio.h>
using namespace std;
 
//Проверяет отсортирована ли строка row
bool isSorted(long n, long * row);
//Возвращает макс элемент строки
long GetMax(long n, long * row);
 
int main()
{
    long i,j,m,n,val, maxv;
    long ** arr;//Пусть будет массив с длинными целыми
    bool bSorted = false;//Флаг сигнализирующий есть ли 
    //в массиве хоть 1-на сортированная строка     
    do
    {
        //Вводим строки и столбцы матрицы
        std::cout<<"Rows in matrix : ";std::cin>>m;
        std::cout<<"Cols in matrix : ";std::cin>>n;
 
        arr = new long*[m];//Память под указатели на строки матрицы
        for(i = 0; i < m; i++)
        {
            arr[i] = new long[n];//Память под элементы строки
            for(j = 0; j < n;  j++)
            {
                std::cout<<"arr["<<i + 1<<"]["<<j + 1<<"] = ";
                std::cin>>arr[i][j];//Вводим эл-ты массива
            }
        }
        //Теперь отыскиваем отсортированную строку
        //конечно если такие строки есть
 
        //я решил сэкономить на коде и попутно ищу
        //первый максимальный элемент сортированных строк
        //как только строка isSorted в maxv уже
        //будет первый макс элемент отсортированных строк
        //при этом поиск последующих строк уже буду вести 
        //с i-ой строки - вобщем удобно
        while(0 < (i--) )
        {
            if((bSorted = isSorted(n, arr[i])))
            {
                maxv = GetMax(n, arr[i]);
                break;
            }
        }
        if(!bSorted)
            //Если сортированных строк в массиве нет bSorted = false
            //выводим соответсвующее уведомление
            std::cout<<"Input array not contain sorted rows!\r\n";
        else
        {
            //Завершаем пробор массива
            while(0 < (i--))
            {
                if(isSorted(n, arr[i]))//Работаем только с сортированными строками
                if(maxv < (val = GetMax(n, arr[i])))
                    maxv = val;
            }
            std::cout<<"Max value in sorted rows : "<<maxv<<"\r\n";
        }
        std::cout<<"Press Y for new input\r\n";
    }//Если нажали Y можем повторить алгоритм для новй матрицы
    while(toupper(getch()) == 'Y');
    return 0;
}
 
bool isSorted(long n, long * row)
{
    bool bRet = true;//полагаем вначале ччто строка отсортирована
    long i; 
    //Ну а теперь сравниваем элементы строки row
    //Проверяем сортированность по возрастанию
    for(i = 0; i < n - 1 && bRet; i++)
    {
        if(row[i] > row[i + 1])
            bRet = false;
    }
    //если строка не отсортирована по возрастанию
    //проверим отсортирована ли она по убsванию
    if(!bRet)
    {
        bRet = true;
        for(i = n - 1; 0 <= i && bRet; i--)
        {
            if(row[i] < row[n - i - 1])
                bRet = false;
        }
    }
    return bRet;
}
 
long GetMax(long n, long * row)
{
    long ret = row[0];
    for(long i = 1; i < n; i++)
    {
        if(ret < row[i])
            ret = row[i];
    }
    return ret;
}
Миниатюры
Найти максимальный среди всех элементов тех строк заданной матрицы, которые упорядочены  
Вложения
Тип файла: rar SortedArr.exe.rar (45.2 Кб, 40 просмотров)
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.10.2011, 16:15 #5
в моей программе всё правильно работает.
только не проверяется если массив состоит из 1 символа.
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 16:55 #6
Цитата Сообщение от OstapBender Посмотреть сообщение
в моей программе всё правильно работает.
только не проверяется если массив состоит из 1 символа.
- вставил вашу функцию в свой код
Ваша функция в моей программе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <conio.h>
using namespace std;
 
bool isSorted(long * arr, int n, long& max);
 
int main()
{
    long i,j,m,n,val, maxv;
    long ** arr;//Пусть будет массив с длинными целыми
    bool bSorted = false;//Флаг сигнализирующий есть ли 
    //в массиве хоть 1-на сортированная строка     
    do
    {
        //Вводим строки и столбцы матрицы
        std::cout<<"Rows in matrix : ";std::cin>>m;
        std::cout<<"Cols in matrix : ";std::cin>>n;
 
        arr = new long*[m];//Память под указатели на строки матрицы
        for(i = 0; i < m; i++)
        {
            arr[i] = new long[n];//Память под элементы строки
            for(j = 0; j < n;  j++)
            {
                std::cout<<"arr["<<i + 1<<"]["<<j + 1<<"] = ";
                std::cin>>arr[i][j];//Вводим эл-ты массива
            }
        }
        //Теперь отыскиваем отсортированную строку
        //конечно если такие строки есть
 
        //я решил сэкономить на коде и попутно ищу
        //первый максимальный элемент сортированных строк
        //как только строка isSorted в maxv уже
        //будет первый макс элемент отсортированных строк
        //при этом поиск последующих строк уже буду вести 
        //с i-ой строки - вобщем удобно
        while(0 < (i--) )
        {
            if((bSorted = isSorted(arr[i],n,maxv)))
                break;
        }
        if(!bSorted)
            //Если сортированных строк в массиве нет bSorted = false
            //выводим соответсвующее уведомление
            std::cout<<"Input array not contain sorted rows!\r\n";
        else
        {
            //Завершаем пробор массива
            while(0 < (i--))
            {
                if(isSorted(arr[i],n,val))//Работаем только с сортированными строками
                if(maxv < val)
                    maxv = val;
            }
            std::cout<<"Max value in sorted rows : "<<maxv<<"\r\n";
        }
        std::cout<<"Press Y for new input\r\n";
    }//Если нажали Y можем повторить алгоритм для новй матрицы
    while(toupper(getch()) == 'Y');
    return 0;
}
 
bool isSorted(long * arr, int n, long& max) {
 
        bool sorted=true;
        int i;
        for (i=1; i<n ; i++) {
                if (arr[i]<arr[i-1]) {
                        sorted=false;
                        break;
                }
        }
 
        if (sorted) {
                max = arr[n-1];
                return true;
        }
        
        for (i=1; i<n ; i++) {
                if (arr[i]>arr[i-1]) {
                        max=0;
                        return false;
                }
        }
 
        max=arr[0];
        return true;
 
}

Ниже скрин работы, как видите не очень то правильно работает

Не по теме:

Если есть желание проверьте ваш алгоритм на такой ввод сами

Миниатюры
Найти максимальный среди всех элементов тех строк заданной матрицы, которые упорядочены  
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.10.2011, 17:38 #7
и в чём проблема?
2 строчки "1 1" и "2 0"
они обе сортированы.
максимальное значение = 2
-=ЮрА=-
07.10.2011, 18:58
  #8

Не по теме:

Цитата Сообщение от OstapBender Посмотреть сообщение
в чём проблема?
2 строчки "1 1" и "2 0"
они обе сортированы.
максимальное значение = 2
- я разобрался, простите за замечание!

OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.10.2011, 20:18 #9
-=ЮрА=-, да нет проблем!
Aragourn
3 / 3 / 0
Регистрация: 18.02.2013
Сообщений: 15
23.02.2013, 16:47 #10
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <locale.h>
#include <time.h>
int main()
{
 long i, j, n, k = 0, k1 = 0, max, m;
 srand((unsigned)time(NULL));
 setlocale(LC_ALL, "rus");
 printf("Ââåäèòå n ГЁ m: ");
 scanf("%d%d",&n,&m);
 printf("\n");
 
 long **a = (long**)calloc(n,sizeof(long*));
 
for(i = 0; i < n; i++)
*(a + i)=(long*)calloc(n,sizeof(long));
 
 
for(i = 0; i < n; i++)
    for(j = 0 ; j < n; j++)
    scanf("%d", &*(*(a + i) + j));
    
for(i = 0; i < n; i++)    
    printf((i == 0)?"%6d":"%5d", i);
    
printf("\n\n");         
            
 for(i = 0; i < n; i++)
 {printf("%2d", i);
    for(j = 0 ; j < n; j++)
    {
        printf("%4d ",*(*(a + i) + j));
    }
    printf("\n");
 }
printf("\nÐåçóëüòГ*ГІ: \n\n");
 
max = -RAND_MAX;
 
 for(i = 0; i < n; i++, k = k1 = 0)
      {
       for(j = 0; j < m - 1; j++)
           {
          if(*(*(a + i) + j) <= *(*(a + i) + j + 1))
           k++;
          else
           if(*(*(a + i) + j) >= *(*(a + i) + j + 1))
            k1++;
              
                         } 
if((k == m - 1) || (k1 == m - 1))
for(i = 0; i < n; i++)
    for(j = 0; j < m; j++)
       if(*(*(a + i) + j) > max)
           max = *(*(a + i) + j);
                           
} 
                  
printf((max != -RAND_MAX)?("%4d\n\n"):("Г’Г*ГЄГЁГҐ ñòðîê Г*ГҐГІ!"), max);
    
 
for(i = 0; i < n; i++)
      free(*(a + i));
free(a);        
system("pause");
}
Apollo1222
1 / 1 / 0
Регистрация: 10.10.2016
Сообщений: 124
12.10.2016, 23:39 #11
кто может помочь нарисовать блок-схему?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2016, 23:39
Привет! Вот еще темы с ответами:

Файл: Для заданной в файле матрицы A (n на m) определить количество строк, которые упорядочены по возрастанию - C++
помогите написать программу Для заданной в файле матрицы A (n на m) определить количество строк, которые упорядочены по возрастанию

Найти сумму элементов тех строк матрицы, которые хотя бы один отрицательный элементсодержат - C++
Помогите написать 3 программы на C++ Заранее спасибо!Надеюсь на вашу помощь..

Среди строк заданной матрицы найти строку с максимальной по модулю суммой элементов - C++
Среди строк заданной матрицы, содержащих только нечетные элементы, найти строку с максимальной по модулю суммой элементов.

Найти среди строк заданной целочисленной матрицы D строку с максимальным произведением элементов - C++
Составьте программу на языке С++, позволяющую находить среди строк заданной целочисленной матрицы D размера 4*4, компоненты которой не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2016, 23:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru