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

В цикле почему-то проходит по условию только один раз - C++

Восстановить пароль Регистрация
 
igor9774
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 12
10.10.2010, 20:49     В цикле почему-то проходит по условию только один раз #1
Задача такая: Дан одномерный массив и натуральных чисел. Удалить из него все тройки подряд идущих равных чисел, и вывести размер полученного массива и его содержимое. Четырёх и более, подряд идущих равных чисел в массиве нет. Дополнительный массив не использовать.
Алгоритм вроде сделал, смотрели с друзьями. Вроде всё правильно, но когда начинаешь проверять. Получается что в одном цикле условие проверяется только один раз.
Например, если массив (10 чисел) такой - 1 1 1 2 3 4 5 6 7 8.
Результат - 7 (кол-во оставшихся чисел) 2 3 4 5 6 7 8. Вроде всё правильно, но если взять другие числа массива
1 2 2 2 3 4 5 6 7 8. результат - 10, 1 2 2 2 3 4 5 6 7 8.
Может быть есть ошибка в алгоритме?
Вот код

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
#include<iostream>
#include<conio.h>
#include<clocale>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    int n;
    int i;
    int j;
    cout << "Введите кол-во элементов: ";
    cin >> n;
    int k = n;
    int *d = new int[n];
    cout << "Введите элементы массива:\n";
    for (i = 0; i < n; i++)
        cin >> d[i];
    for (i = 0; i < k - 3; i++)// Проблема в этом цикле
    {
        if (d[i] == d[i+1] == d[i+2])
        {
            for (j = i; j < k - 3; j++)
                d[j] = d[j+3];
                        // cout << "a\n"; - вставлял в качестве индикатора прохождения условия
            k = k - 3;
                        i = i - 1;// нужно чтобы проверился снова этот элемент массива, потому что после сдвига именно с него может начинаться новая тройка равных чисел
        }
    }
    cout << "-------------\n";
    cout << "Размер массива - " << k << "\n";
    for (i = 0; i < k; i++)
        cout << d[i];
    delete d;
    _getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2010, 20:49     В цикле почему-то проходит по условию только один раз
Посмотрите здесь:

C++ Напечатать только те буквы слов, которые встречаются в обоих словах только один раз
C++ Элементы массива, которые встречаются только один раз
C++ Цикл выполняется только один раз.
C++ Как определить переменную только один раз?
C++ Напечатать только те буквы слов, котрые встречаются в обоих словах только один раз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheMachinist
 Аватар для TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
10.10.2010, 21:38     В цикле почему-то проходит по условию только один раз #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
#include<iostream>
#include<conio.h>
#include<clocale>
 
using namespace std;
 
int main()
{
        setlocale(LC_CTYPE, "Russian");
        int n;
        int i;
        int j;
        cout << "Введите кол-во элементов: ";
        cin >> n;
        int k = n;
        int *d = new int[n];
        cout << "Введите элементы массива:\n";
        for (i = 0; i < n; i++)
                cin >> d[i];
        for (i = 0; i < k - 3; i++)// Проблема в этом цикле
        {
                if (d[i] == d[i+1] && d[i] ==  d[i+2] )
                {
                       d[i] = d[i+3]; d[i+1] = d[i+4]; d[i+2] = d[i+5];
                       k = k-3;
                       for(j = i+3;j < k;++j)
                           d[j-1] = d[j];
                }
        }
        cout << "-------------\n";
        cout << "Размер массива - " << k << "\n";
        for (i = 0; i < k; i++)
                cout << d[i];
        delete d;
        _getch();
        return 0;
}
igor9774
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 12
10.10.2010, 21:53  [ТС]     В цикле почему-то проходит по условию только один раз #3
Не совсем правильно работает.
При массиве 1112333456 должен быть результат 4, 2456. А выдаёт 2323

Добавлено через 3 минуты
Работает правильно так:
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
#include<iostream>
#include<conio.h>
#include<clocale>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    int n;
    int i;
    int j;
    cout << "Введите кол-во элементов: ";
    cin >> n;
    int k = n;
    int *d = new int[n];
    cout << "Введите элементы массива:\n";
    for (i = 0; i < n; i++)
        cin >> d[i];
    for (i = 0; i < k - 3; i++)
    {
        if (d[i] == d[i+1] && d[i] == d[i+2])
        {
            for (j = i; j < k - 3; j++)
                d[j] = d[j+3];
            k = k - 3;
            i = i - 1; 
        }
    }
    cout << "-------------\n";
    cout << "Размер массива - " << k << "\n";
    for (i = 0; i < k; i++)
        cout << d[i];
    delete d;
    _getch();
    return 0;
}
TheMachinist
 Аватар для TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
10.10.2010, 22:03     В цикле почему-то проходит по условию только один раз #4
Извиняюсь

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
#include<iostream>
#include<conio.h>
#include<clocale>
 
using namespace std;
 
int main()
{
        setlocale(LC_CTYPE, "Russian");
        int n;
        int i;
        int j;
        cout << "Введите кол-во элементов: ";
        cin >> n;
        int k = n;
        int *d = new int[n];
        cout << "Введите элементы массива:\n";
        for (i = 0; i < n; i++)
                cin >> d[i];
        for (i = 0; i < k - 3; i++)// Проблема в этом цикле
        {
                if (d[i] == d[i+1] && d[i] ==  d[i+2] )
                {
                       d[i] = d[i+3]; d[i+1] = d[i+4]; d[i+2] = d[i+5];
                       k = k-3;
                      for(int j = i;j < k;++j)
                          d[j] = d[j+3];
                      continue;
                }
        }
        cout << "-------------\n";
        cout << "Размер массива - " << k << "\n";
        for (i = 0; i < k; i++)
                cout << d[i];
        delete d;
        _getch();
        return 0;
}
Yandex
Объявления
10.10.2010, 22:03     В цикле почему-то проходит по условию только один раз
Ответ Создать тему
Опции темы

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