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

Программа входит в бесконечный цикл при изменении двумерного массива - C++

Восстановить пароль Регистрация
 
LordCezis
 Аватар для LordCezis
2 / 2 / 1
Регистрация: 13.05.2012
Сообщений: 67
25.05.2014, 20:04     Программа входит в бесконечный цикл при изменении двумерного массива #1
Написал код для задания: "Ввести двумерный массив А (NxM). Каждый второй элемент в массиве с нечётной суммой индексов, чьё значение лежит в диапазоне [-3; 5] заменить единицей. Массив вывести до и после преобразования."

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

Код
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
#pragma hdrstop
#pragma argsused
 
#include <iostream.h>
#include <iomanip>
 
int _tmain()
{   int row, column;
    cout<<("Input rows count: ");
    cin>>row; //кол-во строк
    cout<<("\nInput columns count: ");
    cin>>column; //кол-во столбцов
 
    int ** A = new int * [row];     //указатель на двумерный массив
    for (int i = 0; i < row; i++)
        A [i] = new int [column];
 
    srand(time(NULL));
 
    //заполнение массива
    for(int i = 0; i < row; i++){   
        for(int j = 0; j < column; j++){   
            A[i][j] = 1 + rand() % 100;  //заполняем текущую ячейку
        }
    }
 
        //Вывод изначального массива
    cout << "\nThe original array\n";
    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < column; j++)
            cout << setw(4) << A[i][j];
        cout << endl;
    }// конец вывода
 
    cout<<("test 1"); //для проверки
 
    //изменяем массив
    for(int i = 0; i < row; i++){   
        for(int j = 1; j < column; j+2){   
            if ( ( (i+j)%2!=(i+j) ) & (-3 <= (i+j) <= 5) ) {    //проверка условия
            A[i][j]=1;  //заменяем текущий элемент на 1
            
                   cout<<("test 2");//для проверки
            }
        }
    }
    cout<<("\ntest 3"); //для проверки
    cout << "\nThe resulting array\n";
 
    //вывод изменённого массива
    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < column; j++)
            cout << setw(4) << A[i][j];
        cout << endl;
    }//конец вывода
    system("pause");
 
    return 0;
}


В таком виде программа выводит изначальный массив, затем выводит test1, а после начинает заполнять консольку надписью test2, до тех пор, пока не закроешь консоль.
Если закомментить цикл, в котором массив изменяется, то программа выводит массив 2 раза, и ожидает нажатия на кнопку. Пробовал в условии оставить только проверку на нечётность суммы индексов элемента, но эффект тот же
  • Во-первых, есть сомнения по поводу правильности этой части условия: (-3 <= (i+j) <= 5). Можно ли так записать проверку вхождения суммы индексов элемента в интервал [-3; 5]? Или надо писать (-3 <= (i+j) ) & ( (i+j) <=5)?
  • Во-вторых, появились сомнения по поводу использования if внутри цикла, но если не использовать if в цикле, то как тогда выполнить изменение массива по критериям?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2014, 20:04     Программа входит в бесконечный цикл при изменении двумерного массива
Посмотрите здесь:

C++ Бесконечный цикл
C++ Программа зацикливается при изменении всех 2 на 2
C++ бесконечный цикл при исключениях
C++ При обращении к индексу двумерного массива char программа вылетает с ошибкой
Метод Ньютона - программа уходит в бесконечный цикл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,207
Завершенные тесты: 1
25.05.2014, 20:28     Программа входит в бесконечный цикл при изменении двумерного массива #2
C++
1
 if (  (i+j)%2 != i+j  &&   -3 <= i+j  && i+j <= 5 ) {
LordCezis
 Аватар для LordCezis
2 / 2 / 1
Регистрация: 13.05.2012
Сообщений: 67
25.05.2014, 21:28  [ТС]     Программа входит в бесконечный цикл при изменении двумерного массива #3
Цитата Сообщение от zss Посмотреть сообщение
Код C++
1
*if ( *(i+j)%2 != i+j *&& * -3 <= i+j *&& i+j <= 5 ) {
% - это ведь остаток от деления.
В вашем коде всегда будет false возвращаться после (i+j)%2 != i+j, ведь что 2/2 ≠ 2, что 3/2 ≠ 3.

Я через остаток от деления определяю нечётность суммы индексов.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,207
Завершенные тесты: 1
25.05.2014, 21:34     Программа входит в бесконечный цикл при изменении двумерного массива #4
Цитата Сообщение от LordCezis Посмотреть сообщение
В вашем коде всегда будет false
для i+j <=1 условие (i+j)%2 != i+j дает false, а для остальных - true,
т.е. его можно записать как i+j>1 и с учетом этого сократить оператор до
C++
1
if ( 1 < i+j  && i+j <= 5 ) {
LordCezis
 Аватар для LordCezis
2 / 2 / 1
Регистрация: 13.05.2012
Сообщений: 67
26.05.2014, 11:08  [ТС]     Программа входит в бесконечный цикл при изменении двумерного массива #5
Цитата Сообщение от zss Посмотреть сообщение
для i+j <=1 условие (i+j)%2 != i+j дает false, а для остальных - true,
Как так? Если % - остаток от деления, то, к примеру, (2+1)/2 = 1,5 => остаток 5 => 5 ≠ (2+1)

C++
1
if ( 1 < i+j  && i+j <= 5 ) {
Так тоже не подходит, ведь в условии: "Каждый второй элемент в массиве с нечётной суммой индексов, чьё значение лежит в диапазоне [-3; 5] заменить единицей."

( (i+j) % 2 !=0) - это проверка нечётности суммы индексов элемента двумерного массива, если эту часть убрать и прописать ваш код, то как же тогда определять, что элемент обладает нечётной суммой индексов ???
К тому же я могу изменить параметры рандома и массив будет заполняться отрицательными и положительными числами, так что проверка на вхождение самого элемента в диапазон [-3;5] тоже нужна.

Так же появился ещё 1 вопрос:
Я в обработке массива в цикле начинаю перебор строк с i=0, а перебор по столбцам с j=1 и увеличиваю j на 2.
C++
1
2
3
4
5
6
7
8
9
//изменяем массив
    for(int i = 0; i < row; i++){   //строки массива
        for(int j = 1; j < column; j+2){   //столбцы массива
            if ( ((i+j)%2!=0) & (-3 <= (i+j)) & ((i+j) <= 5)) {  //проверка условия
 
            A[i][j]=1;
            }
        }
    }
Если я выберу размерность массива 3х5, то получится, что в каждой строке будут перебираться только элементы: 1, 3, 5 - каждый второй элемент строки=массива.

Но если я выберу размерность массива 3х6, то в каждой строке будут перебираться: 1, 3, 5, а затем в след. строке снова 1, 3 и 5.
Получается, что тогда пропадут элементы на позициях Nx6 и Nx0, т.е. 2 элемента подряд, а это значит, что будет проверяться не каждый второй элемент массива, а каждый второй элемент строки.

Это значит, что в
C++
1
for(int j = 1; j < column; j+2){   //столбцы массива
надо вместо 1 подставлять некую переменную и вводить перед этим оператор выбора, основанный на чётности/нечётности кол-ва столбцов?
Для нечётного кол-во столбцов начинать перебор с Nx1, а для чётного - с Nx0.

Или же можно как-то иначе проверить только каждый второй элемент массива?

Добавлено через 12 часов 44 минуты
Приснилось решение для условия:
C++
1
    if ( ((i+j)%2!=0) && (-3 <= A[i][j] ) && ( A[i][j] <= 5)) {  //проверка условия
Что-то меня до этого клинило и я проверял сумму индексов на вхождение в интервал [-3;5], а по условию надо проверять значение элемента на вхождение в этот интервал.

Но бесконечный цикл так никуда и не делся
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,207
Завершенные тесты: 1
26.05.2014, 16:28     Программа входит в бесконечный цикл при изменении двумерного массива #6
Цитата Сообщение от LordCezis Посмотреть сообщение
for(int j = 1; j < column; j+2){
Равно забыли
C++
1
 for(int j = 1; j < column; j+=2){
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
26.05.2014, 16:53     Программа входит в бесконечный цикл при изменении двумерного массива #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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <vector>
#include <iterator>
#include <algorithm>>
#include <cmath>
using namespace std;
 
void show(const int &t)
{
  cout<<setw(4)<<t;
}
 
int setrandom(int &a)
{
  return a=-5+rand()%10;
}
int main()
{
srand(time(0));
int x,y;
cin>>x>>y;
 
vector< vector <int> > a(x, vector <int > (y));
 
for (int i=0;i<x;i++)
  {
  transform(a[i].begin(),a[i].end(),a[i].begin(),setrandom);
  for_each(a[i].begin(),a[i].end(),show);
  cout<<endl;
  }
cout<<endl;
for (int i=0;i<x;i++)
{
  for (int j=1;j<y;j+=2)
  {
    if ((a[i][j]<5) && (a[i][j]>-3) && ((i+j)%2))
      a[i][j]=1;
      cout<<"\ni: "<<i<<"     j: "<<j;
  }
  cout<<endl;
}
  for (int i=0;i<x;i++)
  {
  for_each(a[i].begin(),a[i].end(),show);
  cout<<endl;
  }
 
return 0;
}
LordCezis
 Аватар для LordCezis
2 / 2 / 1
Регистрация: 13.05.2012
Сообщений: 67
26.05.2014, 18:15  [ТС]     Программа входит в бесконечный цикл при изменении двумерного массива #8
dzrkot, благодарю за помощь (:
Ваш код помог мне увидеть глупую ошибку в параметрах цикла:
C++
1
for(int j = 1; j < column; j+2){
надо было писать j+=2. Пропустил символ и не смог заметить, совсем уже стал.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
26.05.2014, 18:18     Программа входит в бесконечный цикл при изменении двумерного массива #9
Цитата Сообщение от LordCezis Посмотреть сообщение
надо было писать j+=2.
zss раньше вам указал на вашу ошибку =)

я просто потренироваться с STL хотел лишний раз)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2014, 19:36     Программа входит в бесконечный цикл при изменении двумерного массива
Еще ссылки по теме:

При расширении первой строки двумерного массива (с помощью realloc) программа вылетает C++
C++ Некорректно работает программа. Бесконечный цикл
Бесконечный цикл при работе с бинарным деревом C++

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

Или воспользуйтесь поиском по форуму:
LordCezis
 Аватар для LordCezis
2 / 2 / 1
Регистрация: 13.05.2012
Сообщений: 67
26.05.2014, 19:36  [ТС]     Программа входит в бесконечный цикл при изменении двумерного массива #10
dzrkot, точно. Ваш код вылез первым и я пост zss не приметил, подумал, что его уже читал вчера.
Нажал пасибку и на zss

Добавлено через 6 минут
P.S. ответы даны исчерпывающие, на ошибки указания получил. Тему можно закрывать.
Yandex
Объявления
26.05.2014, 19:36     Программа входит в бесконечный цикл при изменении двумерного массива
Ответ Создать тему
Опции темы

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