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

Бесконечный цикл. Двумерные массивы - C++

Восстановить пароль Регистрация
 
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
18.12.2015, 17:12     Бесконечный цикл. Двумерные массивы #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
#include <stdio.h>
#include <iostream>
const int N=6;
using namespace std;
void main()
{
int M[N][N], n1, n2, n3, C[N], I[N], a;
for (int i = 0; i < N; i++)
{
    for(int j=0;j<N;j++)    
    M[i][j] = rand() % 199-99;
}
 
for (int j = 0; j < N; j++)
{
    for (int i = 0; i < N; i++) 
    {
        if (i==0 && M[i][j]<0) n1=abs(M[i][j]); else n1=0;
        if (i==2 && M[i][j]<0) n2=abs(M[i][j]); else n2=0;
        if (i==4 && M[i][j]<0) n3=abs(M[i][j]); else n3=0;
    }
    if (j==0) C[0]=n1+n2+n3;
    if (j==1) C[1]=n1+n2+n3;
    if (j==2) C[2]=n1+n2+n3;
    if (j==3) C[3]=n1+n2+n3;
    if (j==4) C[4]=n1+n2+n3;
    if (j==5) C[5]=n1+n2+n3;
}   
 
for (int j=0;j<N;j++) I[j]=j;
for (int i=0;i<N-1;i++)
{
    for (int j=i+1;i<N;i++)
    {
        if (C[I[j]]<C[I[i]]) 
        {
            a=I[i];I[i]=I[j];I[j]=a;
        }
    }
}
 
for (int i=0;i<N;i+1) {
    for (int j=0;j<N;j+1)
    {
       cout<<M[i][I[j]];
    }
 cout<<endl;
}
 
system("pause");
}

Бесконечный цикл с -58.
Нашел в дебаге, что это I[j] принимает очень больше число, а так же все значения массива C равны 0.
Почему?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2015, 17:12     Бесконечный цикл. Двумерные массивы
Посмотрите здесь:

Бесконечный цикл C++
C++ Бесконечный цикл
Бесконечный цикл C++
C++ Бесконечный цикл
C++ Бесконечный цикл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Apostol584
235 / 141 / 71
Регистрация: 26.11.2012
Сообщений: 365
Завершенные тесты: 2
18.12.2015, 17:19     Бесконечный цикл. Двумерные массивы #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for (int j = 0; j<N; j++) I[j] = j;
    for (int i = 0; i<N - 1; i++)
    {
        for (int j = i + 1; j<N; j++)
        {
            if (C[I[j]]<C[I[i]])
            {
                a = I[i]; I[i] = I[j]; I[j] = a;
            }
        }
    }
 
    for (int i = 0; i<N; i++) {
        for (int j = 0; j<N; j++)
        {
            cout << M[i][I[j]];
        }
        cout << endl;
    }
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
18.12.2015, 17:41  [ТС]     Бесконечный цикл. Двумерные массивы #3
Благодарю!

Столько крови уже выпила эта задача

Добавлено через 5 минут
Теперь у меня числа неслучайные, они все время повторяются.
Как это исправить?
Apostol584
235 / 141 / 71
Регистрация: 26.11.2012
Сообщений: 365
Завершенные тесты: 2
18.12.2015, 17:51     Бесконечный цикл. Двумерные массивы #4
подключить
C++
1
#include <time.h>
и
C++
1
2
for(int j=0;j<N;j++)    
    M[i][j] = rand() % 199-99;
заменить на
C++
1
2
3
4
for(int j=0;j<N;j++){ 
    srand (time(NULL));
    M[i][j] = rand() % 199-99;
}
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
18.12.2015, 17:57  [ТС]     Бесконечный цикл. Двумерные массивы #5
Теперь у меня случайные числа, но зато вот какие:
Миниатюры
Бесконечный цикл. Двумерные массивы  
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.12.2015, 18:00     Бесконечный цикл. Двумерные массивы #6
srand (time(NULL));
убрать
вызвать один раз только в начале майна
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
18.12.2015, 18:09  [ТС]     Бесконечный цикл. Двумерные массивы #7
Работает, только теперь сортировка неправильная:

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
#include <stdio.h>
#include <iostream>
#include <time.h>
 
const int N=6;
using namespace std;
void main()
{
    srand (time(NULL));
int M[N][N], n1, n2, n3, C[N], I[N], a;
for (int i = 0; i < N; i++)
{
    for(int j=0;j<N;j++){ 
    
    M[i][j] = rand() % 199-99;
}
}
 
for (int j = 0; j < N; j++)
{
    for (int i = 0; i < N; i++) 
    {
        if (i==0 && M[i][j]<0) n1=abs(M[i][j]); else n1=0;
        if (i==2 && M[i][j]<0) n2=abs(M[i][j]); else n2=0;
        if (i==4 && M[i][j]<0) n3=abs(M[i][j]); else n3=0;
    }
    if (j==0) C[0]=n1+n2+n3;
    if (j==1) C[1]=n1+n2+n3;
    if (j==2) C[2]=n1+n2+n3;
    if (j==3) C[3]=n1+n2+n3;
    if (j==4) C[4]=n1+n2+n3;
    if (j==5) C[5]=n1+n2+n3;
}   
 
for (int j=0;j<N;j++) I[j]=j;
for (int i=0;i<N-1;i++)
{
    for (int j=i+1;i<N;i++)
    {
        if (C[I[j]]<C[I[i]]) 
        {
            a=I[i];I[i]=I[j];I[j]=a;
        }
    }
}
 
for (int i=0;i<N;i++) {
    for (int j=0;j<N;j++)
    {
       cout<<M[I[j]][i]<<"\t";
    }
 cout<<endl;
}
 
system("pause");
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.12.2015, 19:17     Бесконечный цикл. Двумерные массивы #8
C++
1
2
3
4
5
6
    for (int i = 0; i < N; i++) 
    {
        if (i==0 && M[i][j]<0) n1=abs(M[i][j]); else n1=0;
        if (i==2 && M[i][j]<0) n2=abs(M[i][j]); else n2=0;
        if (i==4 && M[i][j]<0) n3=abs(M[i][j]); else n3=0;
    }
бред и индусский код.
for (int i = 0; i < N; i=i+2) - так сложно что ли сделать?
C++
1
2
3
4
5
6
    if (j==0) C[0]=n1+n2+n3;
    if (j==1) C[1]=n1+n2+n3;
    if (j==2) C[2]=n1+n2+n3;
    if (j==3) C[3]=n1+n2+n3;
    if (j==4) C[4]=n1+n2+n3;
    if (j==5) C[5]=n1+n2+n3;
для таких индусов как ты изобрели циклы. Хотел помочь, но от таких строчек желание как-то резко снижается.
и вообще,
Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов.
а то что ты складываешь, это элементы на нечётных местах.
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
18.12.2015, 19:33  [ТС]     Бесконечный цикл. Двумерные массивы #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
так сложно что ли сделать?
Неопытность, не подумал о таком, в следующий раз применю.

Про циклы согласен, тут оправдания мне нету. Мог исправить, но раз вводилось в массив одно и то же, решил оставить.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а то что ты складываешь, это элементы на нечётных местах.
Так в чем проблема, если нечетные и нужны?

Спасибо за совет, теперь, если буду выкладывать куда свой код, лениться не буду.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.12.2015, 20:04     Бесконечный цикл. Двумерные массивы #10
Цитата Сообщение от jirtreck Посмотреть сообщение
Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов
это верно?
Если да, то почему ты считаешь i==0 i==2 i==4 ?

Добавлено через 1 минуту
элементы M[1][j] M[3][j]...итд принципиально что ли не могут быть чётными?

Добавлено через 40 секунд
может условие должно быть (M[i][j]%2==0 && M[i][j]<0) ???
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
19.12.2015, 04:53  [ТС]     Бесконечный цикл. Двумерные массивы #11
Что-то не доходило, - думал что надо было четные по порядку, а не по значению.

(M[i][j]%2!=0 && M[i][j]<0)

Так когда нулю равно, значит четное, или я чего-то не понимаю?

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
or (int i = 0; i < N; i=i+2)
Как тогда из этого я смогу нормально найти n1 n2 n3 и добавить их? Понимаю из этого способа только сделать так, чтобы уменьшилось количество итераций в 2 раза, когда остальной код останется прежним.

Добавлено через 7 минут
Не получается у меня по-другому, только так:

C++
1
2
3
4
5
6
7
8
9
10
for (int j = 0; j < N; j++)
{
    for (int i = 0; i < N; i=i+2) 
    {
        if (i==0 && M[i][j]<0 && M[i][j]%2!=0) n1=abs(M[i][j]); else n1=0;
        if (i==2 && M[i][j]<0 && M[i][j]%2!=0) n2=abs(M[i][j]); else n2=0;
        if (i==4 && M[i][j]<0 && M[i][j]%2!=0) n3=abs(M[i][j]); else n3=0;
    }
     C[j]=n1+n2+n3;
}
Добавлено через 17 минут
Я бред написал...

Все еще пытаюсь по местам нечетные взять, когда значения надо
Apostol584
235 / 141 / 71
Регистрация: 26.11.2012
Сообщений: 365
Завершенные тесты: 2
19.12.2015, 04:56     Бесконечный цикл. Двумерные массивы #12
C++
1
2
3
4
5
6
7
8
9
10
    for (int j = 0; j < N; j++)
    {
        C[j] = 0;//сумма модулей равна 0
        for (int i = 0; i < N; i++)//идем по столбцу
        {
            if (M[j][i] % 2 != 0 && M[j][i] > 0)//если отрицательное не четное
                C[j] += abs(M[j][i]);
        }
 
    }
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
19.12.2015, 05:34  [ТС]     Бесконечный цикл. Двумерные массивы #13
Спасибо!
Буду в таких случаях знать про волшебное += )))

Добавлено через 15 минут
Модернизировал программу, но вывод не по сортировке:

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
#include <stdio.h>
#include <iostream>
#include <time.h>
 
const int N=6;
using namespace std;
void main()
{
    srand (time(NULL));
int M[N][N], C[N], I[N], a;
for (int i = 0; i < N; i++)
{
    for(int j=0;j<N;j++){ 
    
    M[i][j] = rand() % 199-99;
}
}
 
for (int j = 0; j < N; j++)
{
C[j] = 0;//сумма модулей равна 0
for (int i = 0; i < N; i++)//идем по столбцу
{
if (M[j][i] % 2 != 0 && M[j][i] > 0)//если отрицательное и нечетное
C[j] += abs(M[j][i]);
}
 
}
 
for (int j=0;j<N;j++) I[j]=j;
for (int i=0;i<N-1;i++)
{
    for (int j=i+1;i<N;i++)
    {
        if (C[I[j]]<C[I[i]]) 
        {
            a=I[i];I[i]=I[j];I[j]=a;
        }
    }
}
 
for (int i=0;i<N;i++) {
    for (int j=0;j<N;j++)
    {
       cout<<M[i][I[j]]<<"\t";
    }
 cout<<endl;
}
 
system("pause");
Apostol584
235 / 141 / 71
Регистрация: 26.11.2012
Сообщений: 365
Завершенные тесты: 2
19.12.2015, 06:49     Бесконечный цикл. Двумерные массивы #14
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
#include <stdio.h>
#include <iostream>
#include <time.h>
 
const int N = 6;
using namespace std;
void main()
{
    srand(time(NULL));
    int M[N][N], C[N], I[N], a;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++){
            M[i][j] = rand() % 199 - 99;
            std::cout << M[i][j] << '\t';
        }
        std::cout << '\n';
    }
 
    std::cout << '\n';
    std::cout << '\n';
    for (int j = 0; j < N; j++)
    {
        C[j] = 0;//сумма модулей равна 0
        for (int i = 0; i < N; i++)//идем по столбцу
        {
            if (M[i][j] % 2 != 0 && M[i][j] > 0)//если отрицательное и нечетное
                C[j] += abs(M[i][j]);
        }
        std::cout << C[j] << '\t';
 
    }
    std::cout << '\n';
    std::cout << '\n';
    for (int j = 0; j < N; j++) I[j] = j;
 
    
    for (int i = 1; i < N; i++)
    {
        int temp = I[i];
        int item = i - 1; 
 
        while (item >= 0 && C[I[item]] > C[temp])
        {
            I[item + 1] = I[item]; 
            I[item] = temp;
            item--;
        }
    }
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
        {
            cout << M[i][I[j]] << "\t";
        }
        cout << endl;
    }
 
    system("pause");
}
jirtreck
1 / 1 / 0
Регистрация: 25.09.2015
Сообщений: 32
19.12.2015, 11:29  [ТС]     Бесконечный цикл. Двумерные массивы #15
Благодарю! Все работает, только надо заменить знак больше на меньше в если.

C++
1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 1; i < N; i++)
    {
        int temp = I[i];
        int item = i - 1; 
 
        while (item >= 0 && C[I[item]] > C[temp])
        {
            I[item + 1] = I[item]; 
            I[item] = temp;
            item--;
        }
    }
Если не трудно, можно расставить комментарии в этой части?
В некоторых местах в логику не врубился
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2015, 11:47     Бесконечный цикл. Двумерные массивы
Еще ссылки по теме:

C++ Бесконечный цикл
C++ Бесконечный цикл for
C++ Бесконечный цикл

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

Или воспользуйтесь поиском по форуму:
Apostol584
235 / 141 / 71
Регистрация: 26.11.2012
Сообщений: 365
Завершенные тесты: 2
19.12.2015, 11:47     Бесконечный цикл. Двумерные массивы #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//сортировка вставками
 for (int i = 1; i < N; i++)
    {
        int temp = I[i];//здесь, храним текущий элемент
        int item = i - 1; //индекс предыдущего элемента
 
        while (item >= 0 && C[I[item]] > C[temp])//пока не первый элемент или предыдущий столбец больше текущего 
        {
            I[item + 1] = I[item]; //меняем элементы местами
            I[item] = temp;
            item--;
        }
    }
Yandex
Объявления
19.12.2015, 11:47     Бесконечный цикл. Двумерные массивы
Ответ Создать тему
Опции темы

Текущее время: 06:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru