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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
3y6_DyIIJloBu4
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 14
#1

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

22.11.2009, 16:40. Просмотров 2693. Ответов 19
Метки нет (Все метки)

Здравствуйте.
Изучаю c++ меньше месяца, помогите решить следующую задачу:
"Дан массив с большим количеством нулевых элементов. Размер массива вводить с клавиатуры. Заменить в нем каждую группу из нечетного количества подряд идущих нулей на один нуль, а из четного - на два."

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

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

Разреженный одномерный массив: заменить группу из подряд идущих нулей - C++
Дан одномерный массив с большим количеством нулевых элементов. Заменить в нем каждую группу из подряд идущих нулей на 2 элемента:...

Заменить все группы подряд встречающихся нулей на один нуль - C++
Парни нужна помощь.Решение на языке с++.Заранее спасибо!!! Дан массив В, содержащий большое количество нулевых элементов. ...

Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент - C++
Доброго времени суток! Имеется задача: Задан массив A, содержащий большое количество нулевых элемен-тов. Группы элементов, состоящие...

Определить наибольшее количество подряд идущих нулей в целочисленном массиве - C++
Здравствуйте! Задание: Дан целочисленный массив A. Определить наибольшее количество подряд идущих нулей. написала код, но он мне в...

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

В массиве вставить нуль после первого нечетного эл - C++
Дан массив целых чисел из n элементов. Вставить нуль после первого нечетного элемента и единицу перед последним четным элементом.Массив...

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

Объявить интовский массив, засунуть рандомизацию rand()%1, для каждой группы нулей сделать цикл, в котором считать их количество. Если четно - заменять группа на 00, если нечетно - на 0.
valeriikozlov
Эксперт C++
4670 / 2496 / 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++
4670 / 2496 / 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++
4670 / 2496 / 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++
4670 / 2496 / 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++
4670 / 2496 / 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++
4670 / 2496 / 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++
4670 / 2496 / 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]);
 }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2009, 22:53
Привет! Вот еще темы с ответами:

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

функция. количество идущих подряд нулей. - C++
Помогите пожалуйста написать эту функцию=.=

В массиве вставить нуль после первого нечетного элемента и единицу перед последним четным элементом - C++
Используя динамические массивы, выполните следующие задания на обработку элементов одномерного массива: Дан массив целых чисел из n...

Определить длину наибольшей подпоследовательности из подряд идущих нулей - C++
Дана последовательность из 100 целых чисел. Определить количество чисел в наиболее длинной подпоследовательности из подряд идущих нулей. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.12.2009, 22:53
Ответ Создать тему
Опции темы

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