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

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

Войти
Регистрация
Восстановить пароль
 
LordCezis
4 / 4 / 2
Регистрация: 13.05.2012
Сообщений: 69
#1

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

25.05.2014, 20:04. Просмотров 462. Ответов 9
Метки нет (Все метки)

Написал код для задания: "Ввести двумерный массив А (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++
#include &lt;iostream&gt; using namespace std; int main() { int mas; for (int i = 0; i &lt; 3;) { for (int j = 0; j &lt; 4;j++) ...

Некорректно работает программа. Бесконечный цикл - C++
Код запускается, но после ввода данных просто ничего не происходит, не вылетает, не выдает ошибку. Помогите, что не так? Уверен ошибка...

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

Найти и исправить ошибки в коде (программа уходит в бесконечный цикл) - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() { int n,k,s; float a,b,c,F; cout&lt;&lt;&quot;vvedite...

Передача массивов в функцию: почему программа уходит в бесконечный цикл? - C++
Всем здравствуйте, спасибо, что проявили к моей теме интерес. у меня вопрос и даже не один. для начала код, который работает, после...

Объяснить почему программа уходит в бесконечный цикл (связные списки) - C++
Всем привет. Собрал связанный список, он работает, но при вводе типа char, программа уходит в бесконечный цикл. Без данного типа...

Бесконечный цикл c++ при значении 0.5 - C++
1) Здравствуйте, такая проблема что при значении dx = 0.5 цикл ничего не делает а только выводит первое значение бесконечно, при 1 все...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 1
25.05.2014, 20:28     Программа входит в бесконечный цикл при изменении двумерного массива #2
C++
1
 if (  (i+j)%2 != i+j  &&   -3 <= i+j  && i+j <= 5 ) {
LordCezis
4 / 4 / 2
Регистрация: 13.05.2012
Сообщений: 69
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
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 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
4 / 4 / 2
Регистрация: 13.05.2012
Сообщений: 69
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
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 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...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
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
4 / 4 / 2
Регистрация: 13.05.2012
Сообщений: 69
26.05.2014, 18:15  [ТС]     Программа входит в бесконечный цикл при изменении двумерного массива #8
dzrkot, благодарю за помощь (:
Ваш код помог мне увидеть глупую ошибку в параметрах цикла:
C++
1
for(int j = 1; j < column; j+2){
надо было писать j+=2. Пропустил символ и не смог заметить, совсем уже стал.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
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     Программа входит в бесконечный цикл при изменении двумерного массива
Еще ссылки по теме:

Бесконечный цикл при исключениях - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;exception&gt; #include &lt;locale.h&gt; using namespace std; int...

Бесконечный цикл при работе с бинарным деревом - C++
Добрый вечер. Помогите разобраться на третьем обьекте в бинарном дереве ухожу в бесконечный цикл. Где я допустил ошибку ? #include...

Почему если в консоли ввести вместо числа любой символ, программа впадает в бесконечный цикл? - C++
Всем привет! Недавно начал изучать С++ и столкнулся с проблемой при создании калькулятора. Если в консоли ввести вместо числа любой...

Бесконечный цикл при вводе несоответствующего типа данных - C++
Цикл, который просит ввести пользователя число, если это число ни одно из чисел 1, 2 или 3, то цикл повторяется вновь, как только получаем...

Бесконечный цикл при попытке ввода символа вместо числа - C++
При вводе буквы или символы вместо цифры,программа начинает бесконечно выводить последний записанный для выхода текст.Как это можно...


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

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

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

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