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

Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
22.11.2009, 16:40     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #1
Здравствуйте.
Изучаю c++ меньше месяца, помогите решить следующую задачу:
"Дан массив с большим количеством нулевых элементов. Размер массива вводить с клавиатуры. Заменить в нем каждую группу из нечетного количества подряд идущих нулей на один нуль, а из четного - на два."

Как я понимаю, нужно задать массив, элементы сгенерировать из случайного количества нулей, а затем
Заменить в нем каждую группу из нечетного количества подряд идущих нулей на один нуль, а из четного количества - на два.

Вроде задача простая, но что-то я не понимаю как её реализовать на c++, буду рад любой помощи.
Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2009, 16:40     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль
Посмотрите здесь:

C++ функция. количество идущих подряд нулей.
C++ В массиве каждую группу рядом стоящих одинаковых элементов заменить одним и тем же значением
В массиве вставить нуль после первого нечетного элемента и единицу перед последним четным элементом C++
C++ В массиве вставить нуль после первого нечетного эл
Заменить все группы подряд встречающихся нулей на один нуль C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
22.11.2009, 16:45     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #2
Это не нулевой массив..

Объявить интовский массив, засунуть рандомизацию rand()%1, для каждой группы нулей сделать цикл, в котором считать их количество. Если четно - заменять группа на 00, если нечетно - на 0.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
22.11.2009, 19:00     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream.h>
#include <windows.h>
#include <stdlib.h> 
#include <time.h> 
int main ()
{
    int *mas, n, i,j, temp;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand(time(NULL));
    cout<<"Ââåäèòå êîëè÷åñòâî ýëåìåГ*òîâ Г¬Г*òðèöû: "<< endl;
    cin>>n;
    mas=new int[n];
    cout<<"èñõîäГ*Г*Гї Г¬Г*òðèöГ*"<<endl;
    for(i=0; i<n; i++)
    {   
        j=rand()%(5);
        if(j==4)
            mas[i]=1;
        else
            mas[i]=0;
        cout<<mas[i]<<" ";
    }
 
          cout<<endl;
    for(i=0; i<n; i++)
        if(mas[i]==0)
        {
            j=i;
            while(mas[j]==0 && j<n)
                j++;
            if((j-i)%2==1)
            {
                i++;
                temp=j;
                for(; j<n; j++)
                    mas[i+j-temp]=mas[j];
                n-=(temp-i);
            }
            else
            {
                i+=2;
                temp=j;
                for(; j<n; j++)
                    mas[i+j-temp]=mas[j];
                n-=(temp-i);
            }
            
        }
    cout<<"ïîëó÷åГ*Г*Г*Гї Г¬Г*òðèöГ*"<<endl;
    for(i=0; i<n; i++)
        cout<<mas[i]<<" ";
    cout<<endl;
 
    return 0; 
}
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
23.11.2009, 21:27  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #4
эммм...
а можно с объяснением?)
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.11.2009, 07:12     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #5
Я прокоментирую строки самой замены нулей. Остальное я надеюсь не вызовет у Вас затруднений (если вызовет, обращайтесь.)
Итак сама замена нулей осуществляется в строках 26-49 кода.
Начинаем просмотр элементов массива с начала. Если вдруг встретили нулевой элемент
Цитата Сообщение от valeriikozlov Посмотреть сообщение
if(mas[i]==0)
то переменной j присваиваем значение i (текущий индекс массива). Идем далее, пока очередной элемент массива равен нулю и массив не закончился, увеличиваем J
Цитата Сообщение от valeriikozlov Посмотреть сообщение
while(mas[j]==0 && j<n)
j++;
После того как подряд идущие нули закончились, вычисляем четное их количество или не четное
Цитата Сообщение от valeriikozlov Посмотреть сообщение
if((j-i)%2==1)
Далее, в зависимости от четного или нечетного количества нулей, основной счетчик i увеличиваем на 1 или на 2 (порпускаем один или два нуля).
Затем переписываем все элементы массива, которые идут после нулей, на новые места, начиная с того места куда указывает наш основной счетчик i.
Цитата Сообщение от valeriikozlov Посмотреть сообщение
for(; j<n; j++)
mas[i+j-temp]=mas[j];
И в конце уменьшаем верхнюю границу массива, на количество удаленных нулей.
Цитата Сообщение от valeriikozlov Посмотреть сообщение
n-=(temp-i);
После этого продолжаем те же действия дальше.
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
25.11.2009, 17:27  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #6
ув. valeriikozlov,
Я понимаю задание так:
вроде бы как должна быть матрица вида:
(00 000 00 0 0000 0 000 000 000), т.е. каждый элемент состоит из случайного кол-ва нулей, и вот те элементы, в которых четное кол-во нулей менять на 00, а нечетное на 0, пользователь задает лишь размер. В вашем примере кода, мне кажется, каждый элемент равен "0", а не случайному их кол-ву. Или я не правильно понял. Вообщем я запутался еще больше)).
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.11.2009, 18:59     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #7
Цитата Сообщение от 3y6_DyIIJloBu4 Посмотреть сообщение
"Дан массив с большим количеством нулевых элементов. Размер массива вводить с клавиатуры. Заменить в нем каждую группу из нечетного количества подряд идущих нулей на один нуль, а из четного - на два."
Я воспринял это так: массив имеет вид такой например 10010000110011011100
Почему я так это воспринял? Вот почему: "Дан массив с большим количеством нулевых элементов", не написано же что все элементы массива из нулей. И далее "каждую группу из нечетного количества подряд идущих нулей", и здесь указывается про группу нулей, а не элементы массива.
Вот поэтому я так это воспринял. Хотя, если Вы сомневаетесь, лучше уточнить у преподавателя.
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
09.12.2009, 20:28  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #8
А можно ли саму замену группы нулей реализовать по другому, не пропуском?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
09.12.2009, 21:06     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #9
Можно замену нулей реализовать по-всякому, как хотите, просто при таком условии:
Цитата Сообщение от 3y6_DyIIJloBu4 Посмотреть сообщение
Заменить в нем каждую группу из нечетного количества подряд идущих нулей на один нуль, а из четного - на два."
она подрузамевает именно пропуск, если количество нулей больше двух.
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
15.12.2009, 14:50  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #10
valeriikozlov, вот что у меня получилось, но массив после замены нулей, не выводится правильно.
Укажите на ошибки пожайлуста:
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
#include <stdio.h>
#include <clocale>
#include <time.h>
#include <stdlib.h>
int     *arr,count, i,a,n;
        
        
int main()
{
    setlocale(LC_ALL,"Russian");
    arr=new int[count];
        srand (1);
        srand((unsigned)time(NULL));
        printf("Введите размер массива:\n");
        scanf("%d",&count);
        printf("Введите границу:\n");
        scanf("%d",&n);
        printf("Исходный массив:\n");
        for(i=0; i<count; i++)
        {
        arr[i]=rand()%n;
        printf("%d ",arr[i]);
        }
 
printf("\nИзмененный массив:\n");
 for(i=0; i<count; i++)
 {
                if(arr[i]==0)
                {int end;
                        a=i;
            while((arr[a]==0)||(a<count))
            a++;
                        if((a-i)%2==0)
                        {
                          i+=2;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);
                        }
                        else
                        {
                               i++;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);                                                                
                        }
                        }
 }
 for(i=0; i<count; i++)
 {
       printf("%d ",arr[i]);
 }
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 19:28     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #11
Строку 31 Вашего кода замените на :
C++
1
while((arr[a]==0)&&(a<count))
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
16.12.2009, 20:22  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #12
Все равно выводит что-то непонятное, если ввести много элементов. Но вроде бы с циклом замены это не связано.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.12.2009, 21:48     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #13
3y6_DyIIJloBu4, Можете описать что именно выводит непонятное (лучше с примером). Проверяю с 50-тью элементами, выводит как нужно в задании.
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
16.12.2009, 22:31  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #14
Ввожу, к примеру, размер 20, границу 4. Получается вот что:
[404]
я имею ввиду код, который указал в посте №10, строку 31 заменил.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.12.2009, 22:53     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #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
51
52
53
54
55
#include <stdio.h>
#include <clocale>
#include <time.h>
#include <stdlib.h>
int             *arr,count,     i,a,n;
                
                
int main()
{
        setlocale(LC_ALL,"Russian");
        arr=new int[count];
                srand (1);
                srand((unsigned)time(NULL));
                printf("Введите размер массива:\n");
                scanf("%d",&count);
                printf("Введите границу:\n");
                scanf("%d",&n);
                printf("Исходный массив:\n");
                for(i=0; i<count; i++)
                {
                arr[i]=rand()%n;
                printf("%d ",arr[i]);
                }
 
printf("\nИзмененный массив:\n");
 for(i=0; i<count; i++)
 {
                if(arr[i]==0)
                                {int end;
                        a=i;
                        while((arr[a]==0)&&(a<count))
                        a++;
                        if((a-i)%2==0)
                        {
                          i+=2;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);
                        }
                        else
                                                {
                               i++;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);                                                                
                                                }
                        }
 }
 for(i=0; i<count; i++)
 {
       printf("%d ",arr[i]);
 }
}
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
16.12.2009, 23:11  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #16
Все равно выводится тоже самое, заметил что номера элементов которые всегда выводятся неправильно:13,14,15,16,17. Даже не знаю в чем дело(
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.12.2009, 23:16     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #17
3y6_DyIIJloBu4, Скопируйте Ваш код сюда на страницу, который Вы сейчас запускаете.
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
16.12.2009, 23:19  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #18
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
#include <stdio.h>
#include <clocale>
#include <time.h>
#include <stdlib.h>
int             *arr,count,     i,a,n;
                
                
int main()
{
        setlocale(LC_ALL,"Russian");
        arr=new int[count];
                srand (1);
                srand((unsigned)time(NULL));
                printf("Введите размер массива:\n");
                scanf("%d",&count);
                printf("Введите границу:\n");
                scanf("%d",&n);
                printf("Исходный массив:\n");
                for(i=0; i<count; i++)
                {
                arr[i]=rand()%n;
                printf("%d ",arr[i]);
                }
 
printf("\nИзмененный массив:\n");
 for(i=0; i<count; i++)
 {
                if(arr[i]==0)
                                {int end;
                        a=i;
                        while((arr[a]==0)&&(a<count))
                        a++;
                        if((a-i)%2==0)
                        {
                          i+=2;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);
                        }
                        else
                                                {
                               i++;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);                                                                
                                                }
                        }
 }
 for(i=0; i<count; i++)
 {
       printf("%d ",arr[i]);
 }
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.12.2009, 23:26     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот так попробуйте:
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 <clocale>
#include <time.h>
#include <stdlib.h>
int             *arr,count,     i,a,n;
                
                
int main()
{
        setlocale(LC_ALL,"Russian");
 
                srand (1);
                srand((unsigned)time(NULL));
                printf("Введите размер массива:\n");
                scanf("%d",&count);
                       arr=new int[count];
                printf("Введите границу:\n");
                scanf("%d",&n);
                printf("Исходный массив:\n");
                for(i=0; i<count; i++)
                {
                arr[i]=rand()%n;
                printf("%d ",arr[i]);
                }
 
printf("\nИзмененный массив:\n");
 for(i=0; i<count; i++)
 {
                if(arr[i]==0)
                                {int end;
                        a=i;
                        while((arr[a]==0)&&(a<count))
                        a++;
                        if((a-i)%2==0)
                        {
                          i+=2;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);
                        }
                        else
                                                {
                               i++;
                                end=a;
                                for(; a<count; a++)
                                        arr[i+a-end]=arr[a];
                                count-=(end-i);                                                                
                                                }
                        }
 }
 for(i=0; i<count; i++)
 {
       printf("%d ",arr[i]);
 }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2009, 23:30     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль
Еще ссылки по теме:

C++ Определить наибольшее количество подряд идущих нулей в целочисленном массиве
C++ Разреженный одномерный массив: заменить группу из подряд идущих нулей
Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел C++

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

Или воспользуйтесь поиском по форуму:
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
16.12.2009, 23:30  [ТС]     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль #20
Сейчас работает)
Т.е.
C++
1
arr=new int[count];
надо было написать после ввода count
Yandex
Объявления
16.12.2009, 23:30     Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль
Ответ Создать тему
Опции темы

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