Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
qwen1234
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 97
1

Обработка отдельных строк (столбцов) матрицы и работа с диагоналями. Двумерные массивы

04.11.2014, 13:47. Просмотров 2402. Ответов 12
Метки нет (Все метки)

Ввести целочисленный двумерный массив ANxM, вывести его. Найти сумму положительных угловых элементов. Найденной суммой заменить строку содержащую минимальный элемент и столбец, содержащий максимальный элемент.


Не могу разобраться, как это будет выглядеть, можете показать, как будет выглядеть данная задача? Желательно указать, где что происходит, что бы я понимал... Только разбираюсь в двумерных массивах.

Спасибо!

Добавлено через 19 часов 33 минуты
актуально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2014, 13:47
Ответы с готовыми решениями:

Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы
Дана матрица, размерность вводит пользователь, данные тоже. Осуществить...

C++ Двумерные массивы(матрицы),работа с элементами главной диагонали
Уважаемые коллеги, прошу помощи в решении парочки задачек,уж мозг в Си не...

Двумерные массивы матрицы
Что не так в программе помогите пожалуйста!! #include <iostream> #include...

Двумерные массивы- матрицы
Помогите, пожалуйста, разобраться и написать программу для задачи: Найти...

Двумерные массивы (матрицы)
Добрый день!!!!!! Помогите решить такую задачу: Характеристикой столбца...

12
kaznachei67
27 / 27 / 15
Регистрация: 17.03.2014
Сообщений: 103
04.11.2014, 15:53 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
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
#include <iostream>
#include <iomanip> // чтобы осуществить форматированный вывод массива
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "russian");
    const int a = 4, b = 4;
    int massive[a][b];
    for (int i = 0; i < a; i++)
        for (int j = 0; j < b; j++)
        {
            cout << "Введите A[<<" << i << ']' << '[' << j << "]   ->";
            cin >> massive[i][j];
        }
    cout << "Исходный массив:" << endl;
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < b; j++)
            cout << setw(4) << setiosflags(ios::left) << massive[i][j] << ' '; // стройный форматированны вывод
        cout << endl;
 
    }
    int min = massive[0][0], max = massive[0][0]; // объявляем переменные, для поиска максимального и минимального элементов массива
    int x = 0, y = 0; // переменная х будет хранить в себе номер строки с минимальным эл-том, а у - номер столбца с максимальным элементом
    for (int i = 0; i < a; i++)
        for (int j = 0; j < b; j++)
        {
            if (massive[i][j] < min) 
            {
                min = massive[i][j];
                x = i;
            }
            if (massive[i][j] > max)
            {
                max = massive[i][j];
                y = j;
            }
        }
    int sum = 0;    //находим сумму угловых положительных элементов
    if (massive[0][0] > 0) sum += massive[0][0];
    if (massive[0][b-1] > 0) sum += massive[0][b-1];
    if (massive[a-1][0] > 0) sum += massive[a-1][0];
    if (massive[a-1][b-1] > 0) sum += massive[a-1][b-1];
    for (int i = 0; i < b; i++) // замена значений строки
        massive[x][i] = sum;
    for (int i = 0; i < a; i++) // замена значений столбца
        massive[i][y] = sum;
    cout << "Массив после обработки:" << endl;
        for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < b; j++)
            cout << setw(4) << setiosflags(ios::left) << massive[i][j] << ' ';
        cout << endl;
 
    }
    system ("pause");
    return 0;
}
0
Константин_2012
53 / 54 / 37
Регистрация: 06.02.2013
Сообщений: 255
Записей в блоге: 1
04.11.2014, 16:23 3
qwen1234, вот, может как то проще можно было сделать, но я написал вот так
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
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    setlocale(0,"rus");
    int m,n,sum=0,min=1000, max=-1000, mmin, nmax;
    srand(time(NULL));
    do 
    {
        cout<<"Ââåäèòå Г°Г*çìåð Г¬Г*Г±Г±ГЁГўГ* MxN ÷åðåç ïðîáåë: ";
        cin>>m>>n;
    } while (m<=0 && n<=0);
    int **mas=new int *[m];
    for (int i=0; i<m; i++)
        for (int j=0; j<n; j++)
            mas[i]=new int[j];
        cout<<"ГЊГ*òðèöГ*:\n";        
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
        {
            mas[i][j]=-20 + rand() %40;
            cout<<setw(4)<<mas[i][j];            
            if (((i==0 && j==0) && (mas[i][j]>0 )) || ((i==m-1 && j==0) && (mas[i][j]>0 )) || 
            ((i==0 && j==n-1) && (mas[i][j]>0 )) || ((i==m-1 && j==n-1) && (mas[i][j]>0 )) )
                sum+=mas[i][j];
        }
        cout<<endl;
    }
    for (int i=0; i<m; i++)
        for (int j=0; j<n; j++)
        {
            if (mas[i][j]>max)
            {
                max=mas[i][j];
                nmax=j;
            }
            if (mas[i][j]<min)
            {
                min=mas[i][j];
                mmin=i;
            }
        }
    for (int i=0; i<m; i++)
        mas[i][nmax]=sum;
    for (int i=0; i<n; i++)
        mas[mmin][i]=sum;
    cout<<"ÍîâГ*Гї Г¬Г*òðèöГ*:\n";
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
            cout<<setw(4)<<mas[i][j];
        cout<<endl;
    }
    for (int i=0; i<m; i++)
        delete [] mas[i];
    delete [] mas;
    system("pause");
    return 0;    
}
0
kaznachei67
27 / 27 / 15
Регистрация: 17.03.2014
Сообщений: 103
04.11.2014, 16:40 4
Константин_2012, в задаче указано, что элементы массива необходимо ввести, а не сгенерировать.
Цитата Сообщение от Константин_2012 Посмотреть сообщение
int m,n,sum=0,min=1000, max=-1000, mmin, nmax;
В задачах, основывающихся на нахождении максимальных и/или минимальных элементов массива некорректно присваивать переменным константные значения. В данном случае, предположив,что вводимые все значения больше 1000, переменная nmin не получит значения, и обращению к элементу массива с использованием ее в качестве индекса, приведет к вероятному краху программы.
0
Константин_2012
53 / 54 / 37
Регистрация: 06.02.2013
Сообщений: 255
Записей в блоге: 1
04.11.2014, 17:09 5
kaznachei67, ну тогда да, я просто делал с генерацией... плохо задание прочел)
0
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
04.11.2014, 17:11 6
Цитата Сообщение от Константин_2012 Посмотреть сообщение
min=1000
А если минимальное число 58936 ?
0
Константин_2012
53 / 54 / 37
Регистрация: 06.02.2013
Сообщений: 255
Записей в блоге: 1
04.11.2014, 17:13 7
Тамика, каким образом оно такое получится?
0
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
04.11.2014, 18:57 8
Ну вот матрица из огромных чисел. Тогда Вы не найдете минимум.
0
qwen1234
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 97
09.11.2014, 02:26  [ТС] 9
Константин_2012, и в праду, зачем задавать значения минимума и максимума, лучше сделать так, что бы пользователь сам вводил их.
0
Константин_2012
53 / 54 / 37
Регистрация: 06.02.2013
Сообщений: 255
Записей в блоге: 1
10.11.2014, 10:05 10
Тамика, но в программе я то задал числа рандома)
0
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
10.11.2014, 10:28 11
Цитата Сообщение от Константин_2012 Посмотреть сообщение
Тамика, но в программе я то задал числа рандома)
Ладно, долой мышление. Скажу прямо.
Логичнее и правильнее было бы присваивать максимуму и минимуму стартовое значение в виде значения первого элемента массива. То есть - нулевого. Потому как если у Вас рандом будет из бОльших чисел, чем Вы задали стратовые, то случится фейл. Не надо так.

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

Добавлено через 3 минуты
qwen1234, молодца, смекнул. Только не полльзователь, а первый элемент массива.
0
dinamid
0 / 0 / 2
Регистрация: 10.11.2014
Сообщений: 10
10.11.2014, 14:04 12
как то так=)
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
#include <QFile>
#include <qstringlist.h>
#include <iostream>
#include <QTextStream>
using namespace std;
int main()
{
     QChar sym = ' '; //символ разреляющий числа во входном файле
     QFile fileIn("C://1//test.txt"), fileOut("C://1//out.txt"); // имена входного и выходного фалов
     int summ = 0, nMin = 0, nMax = 0, elMax, elMin;
     if(fileIn.open(QIODevice::ReadOnly |QIODevice::Text))
     {
         QString str = fileIn.readLine();       QStringList lst = str.split(sym);
         const int stro = lst.at(0).toInt();    const int stl = lst.at(1).toInt();
         int **mas = new int*[stro];
         for (int i = 0; i < stro; i++)   mas[i] = new int [stl];
         int k = 0;
         do{ str = fileIn.readLine();
             lst = str.split(sym);
             for (int j = 0; j < stl; j++)
             {
                 mas[k][j] = lst.at(j).toInt();  //заполнение массива 
                 //cout << mas[k][j] << '\t';
                 if (mas[k][j] < elMin)
                 {
                     nMin = k; elMin = mas[k][j];   //поиск самого малого эл-та матрици и строки
                 }
             }  //cout << endl;
             k++;
         }while (!fileIn.atEnd() && k < stro);
 
         elMax = mas[0][0];
         for (int i = 0; i < stl; i++)              //поиск максимального эл-та матрици и столбца
             for (int j = 0; j < stro; j++)
                 if (mas[j][i] > elMax)
                     nMax = i; elMax = mas[j][i];
 
         summ = max(mas[0][0],0) + max(mas[0][stl-1],0) + max(mas[stro-1][0],0) + max(mas[stro-1][stl-1],0); //подсчет суммы положительных уловых элементов
         for (int i = 0; i < stl; i++)  // замена всех элементов необходимой строки 
             mas[nMin][i] = elMin;
         for (int i = 0; i < stro; i++) // замена всех элементов необходимого столбца
             mas[i][nMax] = elMax;
 
         if(fileOut.open(QIODevice::WriteOnly |QIODevice::Text)) // сохранение результатов
         {
             QTextStream out(&fileOut);
             for (int i = 0; i < stro; i++)
             {
                 for (int j = 0; j < stl; j++)
                     out << mas[i][j] << "\t";
                out << endl;
             }
         }
         for (int i=0; i<stro; i++)
             delete [] mas[i];
         delete [] mas;
     }
     else
     {
         cout << "don't open file";
     }
     return 0;
}
входной файл
Кликните здесь для просмотра всего текста

10 8
-1 15 1 56 912 7 2 8
2 65 5 98 15 4 5 6
3 46 79 1 5 -9 78 -44
4 746 8 77 44 6 8 9
5 64 -98 9 7 9 5 6
6 -463 4 35 12 33 5 7
7 46 6 458 57 88 9 2
8 6 46 -97 187 66 8 7
9 66 45 6 332 2 55 7
5 71 9 87 5 66 7 -6

выходной
Кликните здесь для просмотра всего текста

-1 15 1 56 912 7 2 8
2 65 5 98 912 4 5 6
3 46 79 1 912 -9 78 -44
4 746 8 77 912 6 8 9
5 64 -98 9 912 9 5 6
-463 -463 -463 -463 912 -463 -463 -463
7 46 6 458 912 88 9 2
8 6 46 -97 912 66 8 7
9 66 45 6 912 2 55 7
5 71 9 87 912 66 7 -6


Добавлено через 49 минут
Ой, скобки на 36 строке потерял.
C++
1
{ nMax = i; elMax = mas[j][i]; }
0
Константин_2012
53 / 54 / 37
Регистрация: 06.02.2013
Сообщений: 255
Записей в блоге: 1
10.11.2014, 16:58 13
Цитата Сообщение от Тамика Посмотреть сообщение
з.ы. еще кое-что. Моё замечания относится к реальности и реальным программам, дабы сделать их более универсальными. В Вашем коде с массой ограничений, конечно, моё замечание не акуально. Потому оно плавно превращается в совет.
совет принят)
0
10.11.2014, 16:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2014, 16:58

Двумерные массивы (Определить Количество строк, номер столбца)
Дана целочисленная прямоугольная матрица.Определить: 1)Количество...

Двумерные массивы. Определить количество строк, максимальное из чисел
дана целочисленная прямоуголная матрица.Определить 1)количество строк , не...

Лабораторная работа\Двумерные массивы
Двумерные массивы Задана матрица порядка n и число k. Разделить элементы k-й...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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