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

Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент - C++

Восстановить пароль Регистрация
 
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
18.06.2011, 16:28     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #1
Доброго времени суток!
Имеется задача:

Задан массив A[N], содержащий большое количество нулевых элемен-тов. Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент, а из четного - на два.

Вполне мог бы написать программу сам, если бы понимал, что именно от меня хотят.

Кто-то может в словесной форме объяснить суть задачи? Был бы очень признателен!

Заранее спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2011, 16:28     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент
Посмотрите здесь:

C++ Заменить в массиве каждую группу из нечетного количества подряд идущих нулей на один нуль
C++ Найти количество отрицательных элементов в тех строках матрицы, которые содержат хотя бы один нулевой элемент
Определить количество отрицательных элементов в тех строках матрицы, которые содержат хотя бы один нулевой элемент C++
C++ В символьной строке удалить все слова, состоящие из нечетного количества букв.
Вставить после каждого нечетного значения массива нулевой элемент C++
C++ Подсчитать количество отрицательных элементов в строках матрицы, которые содержат хотя бы один нулевой элемент
Найти количество отрицательных элементов строк, которые содержат хотя бы один нулевой элемент C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.06.2011, 16:34     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #2
имееться массив
Код
1 2 3 4 0 0 0 0 0 0 5 6 7 0 0 0 1 2  //1-й блок 6 нолей, 2-й три ноля
нужно получить массив
Код
1 2 3 4 0 0 5 6 7 0 1 2 //1-й блок заменяем на два ноля, 2-й блок заменяем на один ноль
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.06.2011, 18:28     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #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
#include <iostream>
#include <list>
#warning быдлокод
int main(){
    int tmp[]={0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 1, 2, 0, 0, 0, 0};
    std::list<int> arr(tmp,tmp+sizeof(tmp)/sizeof(*tmp));
    std::cout << "Before:\n";
    for (std::list<int>::iterator i = arr.begin(); i != arr.end(); ++i)
        std::cout << *i << ' ';
    unsigned zerocount = 0;
    for (std::list<int>::iterator i = arr.begin(); i != arr.end()||zerocount; ++i)
        if (zerocount&&*i){
            while (!*--i)
                i = arr.erase(i);
            zerocount=!(zerocount&1);
            for (zerocount+=2;--zerocount;)
                i=arr.insert(++i,0);
        }           
        else
        if (!*i) ++zerocount;
    std::cout << "\nAfter:\n";
    for (std::list<int>::iterator i = arr.begin(); i != arr.end(); ++i)
        std::cout << *i << ' ';
    return 0;
}
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
18.06.2011, 23:31  [ТС]     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #4
diagon, а можно просто по-русски объяснить, если не трудно?
На данном этапе освоения языка С++ наибольшую трудность испытываю именно с пониманием задачи.
На конкретном примере - что должна делать программа? Понятно, что перебрать по порядку каждое значение массива. Сравнить, равно ли оно нулю. Если да, то.... Что она должна делать?

Извиняюсь за тупые вопросы...

С уважением.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.06.2011, 23:38     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #5
если идущих подряд нолей четное количество, то все эти ноли заменяем на 2 ноля, если нечетное то на один ноль

Не по теме:

боже, как же трудно понять...

Цитата Сообщение от diagon Посмотреть сообщение
if (zerocount&&*i)
diagon, действительно быдлокод

hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
18.06.2011, 23:40     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #6
Смотри
0 0 0 - 3 нуля, нечетная группа
0 0 0 0 - 4 нуля, четная группа
И так далее
P.S.
if (кол-во подряд идущих нулей%2==1)
то заменить кол-во подряд идущих нулей на 1
else на 2
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
19.06.2011, 17:13  [ТС]     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #7
А как можно по-простому заменить несколько нулей одним? Какую команду использовать? Надо сделать все макcимально просто, на уровне недельных знаний языка.

Еще бы по поводу двумерного массива объяснил кто-нибудь:

"Найти максимальные элементы каждого столбца действительной матрицы К размерности NхN и поместить их на главную диагональ, а диагональные элементы – на место соответствующего элемента столбца."

Максимальный элемент столбца могу найти, а вот чтоб ставить именно на главную диагональ - не знаю как!

Заранее извиняюсь и благодарю за помощь!
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2011, 18:09     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #8
Цитата Сообщение от Refuzz Посмотреть сообщение
"Найти максимальные элементы каждого столбца действительной матрицы К размерности NхN и поместить их на главную диагональ, а диагональные элементы – на место соответствующего элемента столбца."
элементы главной диагонали имеют одинаковые индексы i=j
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
19.06.2011, 22:14  [ТС]     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #9
Дак это понятно, что i=j - элементы диагонали. Непонятно как именно это реализовать.
Еще раз говорю, кода не надо, хочется самому дойти. Надо, в идеале, просто по-русски объяснить суть задач. Код как-нибудь уж сам придумаю.

С уважением.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2011, 23:14     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #10
Код
цикл от 0 до N - 1
{
    находим максимум i -го столбца
    меняем местами максимальный  и [i, i] элементы
}
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
20.06.2011, 10:46  [ТС]     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #11
Написал в итоге вот что:

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 <stdio.h> 
#include <stdlib.h> 
#include <conio.h>
const int N = 5; 
int random (int N) { return rand() % N; }  
int i,j,Max,Maxi,Maxj,tmp,A[N][N];
main() 
{
 for (i = 0;i < N; i++)
 {
     for (j = 0; j < N; j++)
  A[i][j] = random(10);
}  
//------------------------
printf("Nachalni massiv A\n\n"); 
for ( i = 0; i < N; i ++ ) {     
 for ( j = 0; j < N; j ++ )     
   printf ( "%4d", A[i][j] );  
   printf("\n");                  
 }
//-------------------------        
Max = A[0][0];
 
for (i = 0; i < N; i++)
{
 for (j = 0; j < N; j++)
 { 
if (A[i][j] > Max)
{
Maxi = 0;
Maxj = 0;
Max = A[i][j];
Maxi = i;
Maxj = j;
}
tmp = A[i][i];
A[i][i] = A[Maxi][Maxj];
A[Maxi][Maxj] = tmp;
}
//---------------------
printf("Konechni massiv A\n\n"); 
for ( i = 0; i < N; i ++ ) {      
 for ( j = 0; j < N; j ++ )     
   printf ( "%4d", A[i][j] );  
   printf("\n");                  
//---------------------
       
       
}        
getch();
}
}
И окончательно запутался, что к чему :-(
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
20.06.2011, 11:52     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #12
Где, в своей программе? Ну так распутывайся! Откомментируй свой код, глядишь и распутаешься. А если где-то ошибаешься — тебя поправят.

Добавлено через 29 секунд
И отступы поаккуратнее расставить бы

Добавлено через 53 секунды
Например, создаётся впечатление, что строки 45 и 46 выполняются в одном цикле. Но это не так.
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
21.06.2011, 16:08  [ТС]     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #13
Исправил недочеты, вот что получилось:

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
62
63
64
65
66
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h>
#include <time.h>
 
const int N = 5; 
int random (int N) { return rand() % N; }  
int i,j,MaxIndex,tmp,A[N][N];
main() 
{
//-----ГЈГҐГ*ГҐГ°Г*òîð ñëó÷Г*Г©Г*ûõ Г·ГЁГ±ГҐГ«-----
srand(time(NULL));
//-----------------------------------
 
 
//---------Г‡Г*ïîëГ*ГЁГҐ Г¬Г*Г±Г±ГЁГўГ*--------------
 for (i = 0;i < N; i++)
 {
     for (j = 0; j < N; j++)
        A[i][j] = random(10);
 }  
//-------------------------------------
 
 
//---------Âûâîä ïåðâîГ*Г*Г·Г*ëüГ*îãî Г¬Г*Г±Г±ГЁГўГ*---------------
printf("Nachalni massiv A\n\n"); 
for ( i = 0; i < N; i ++ ) {      // öèêë ГЇГ® ñòðîêГ*Г¬ 
   for ( j = 0; j < N; j ++ )     // âûâîä îäГ*îé ñòðîêè (Гў öèêëå)
     printf ( "%4d", A[i][j] );  // 4 ñèìâîëГ* Г*Г* ÷èñëî  
   printf("\n");                  // ïåðåõîä Г*Г* äðóãóþ ñòðîêó 
 }
//-----------------------------------        
 
 
 
for (i = 0; i < N; i++)
{
   MaxIndex = 0; //Г*Г*Г·Г*ëüГ*îå Г§Г*Г*Г·ГҐГ*ГЁГҐ ГЁГ*äåêñГ*
   for (j = 0; j < N; j++)
   { 
      if (A[i][j] > A[MaxIndex][j]) //ïðîâåðêГ* Г*Г* Г¬Г*êñèìóì
       {
        MaxIndex = i;          
        tmp = A[i][i]; //ìåГ*ГїГҐГ¬ ìåñòГ*ìè
        A[i][i] = A[MaxIndex][j];
        A[MaxIndex][j] = tmp;
       }
 
 
 
   }
}
//-------Âûâîä ГЄГ®Г*ГҐГ·Г*îãî Г¬Г*Г±Г±ГЁГўГ*--------------
printf("Konechni massiv A\n\n"); 
for ( i = 0; i < N; i ++ ) {      // öèêë ГЇГ® ñòðîêГ*Г¬ 
   for ( j = 0; j < N; j ++ )     // âûâîä îäГ*îé ñòðîêè (Гў öèêëå)
     printf ( "%4d", A[i][j] );  // 4 ñèìâîëГ* Г*Г* ÷èñëî  
printf("\n");                  // ïåðåõîä Г*Г* äðóãóþ ñòðîêó 
//----------------------------------------------
       
       
        
}
getch();
 
}
Все равно нихрена не работает.
Помогите разобраться пожалуйста!
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
21.06.2011, 16:18     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #14
Ну вот циклы в строках 37—53. Поиск идёт по строкам, а в задании, вроде по столбцам. Ну это ладно. Хуже, что по мере нахождения значений, которые больше предыдущих, они сразу меняются с диагональными. Надо же во внутреннем цикле только найти максимум, а после его завершения один раз обменять.
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
21.06.2011, 16:55  [ТС]     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #15
Уфф, наконец-то разобрался.
Вот правильный кусок кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (j = 0; j < N; j++)
{
   for (i = 0; i < N; i++)
   { 
      if (A[i][j] > A[MaxIndex][j]) //проверка на максимум
       {
        MaxIndex = i;
       }           
 
   }
tmp = A[j][j]; //меняем местами
A[j][j] = A[MaxIndex][j];
A[MaxIndex][j] = tmp;
MaxIndex = 0; //обнуляем
 
}
Уважаемый grizlik78, а по первой задачке не поможете (с нулями которая)?

Как передвигать вроде бы разобрался (на место a[i] записываем a[i+1]), а вот с подсчетом нулей - трудности :-( Может вкратце накидаете кусочек кода?
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
21.06.2011, 17:06     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #16
Предположим, что a[i] это первый найденный ноль.
Тогда подсчитать число нулей в этой последовательности можно так
C
1
2
3
4
j = i;
cnt = 1;
while (a[++j] == '0')
  ++cnt;
В результате cnt равен количеству нулей, а j указывает на первый не ноль. Можно было обойтись одним только j, так как в результате cnt == j - i

Добавлено через 1 минуту
Ой, это для символов в строке. Но для массивов тоже самое, только надо ещё проверять, что j не вышел за границу массива. Это домашнее задание
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
21.06.2011, 18:05  [ТС]     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #17
Вот что пока предварительно получилось:
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
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h>
#include <time.h>
 
const int N = 15; 
int random (int N) { return rand() % N; }  
int i,j,ZeroCount,A[N];
main() 
{
//-----генератор случайных чисел-----
srand(time(NULL));
//-----------------------------------
 
 
//---------Заполние массива--------------
for (i = 0;i < N; i++)
   A[i] = random(2);
  
//-------------------------------------
 
 
//---------Вывод первоначального массива---------------
printf("Nachalni massiv A\n\n"); 
for ( i = 0; i < N; i ++ ) {      // цикл по строкам 
   printf ( "%4d", A[i] );  // 4 символа на число  
   }
//-----------------------------------        
for (i = 0; i < N;i++)
  { 
  if (A[i] == 0)
    {
          
     j = i;      
     ZeroCount = 1;
     while (A[j++] == 0)
        ZeroCount++;   
     }
  if (ZeroCount %2 == 1) //Если кол-во нулей - нечетное
    {  
    A[i+1] = A[i+ZeroCount]; //оставляем один ноль, остальные элементы сдвигаем
    }             
  else 
  A[i+2] = A[i+ZeroCount] ; //оставляем 2 нуля, остальные сдвигаем
}     
 
//-------Вывод конечного массива--------------
printf(" \nKonechni massiv A\n\n"); 
for ( i = 0; i < N; i ++ )
    printf ( "%4d", A[i] );  // 4 символа на число  
  
//----------------------------------------------
       
       
        
 
getch();
}
Работает как-то некорректно, судя по тому, что конечный массив не уменьшается...

PS Проверку j пока не делал - не могу сообразить какой цикл лучше использовать!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 18:11     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент
Еще ссылки по теме:

Массив: Количество отрицательных элементов в тех строках, которые содержат хотя бы один нулевой элемент C++
C++ Замените в тексте входного файла все группы подряд идущих пробелов на один пробел
Найти произведение элементов в тех строках, которые содержат хотя бы один нулевой элемент C++
Определить количество отрицательных элементов в тех строчках матрицы, где есть хотя бы один нулевой элемент C++
Найти сумму элементов в столбцах, которые содержат хотя бы один нулевой элемент. C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
21.06.2011, 18:11     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент #18
Цитата Сообщение от Refuzz Посмотреть сообщение
Работает как-то некорректно, судя по тому, что конечный массив не уменьшается...
А с чего бы ему уменьшаться? Единственное, что можно сделать для статического массива — вычислить новую границу, до которой числа имеют значения. Всё что выше — ненужный мусор.

Цитата Сообщение от Refuzz Посмотреть сообщение
PS Проверку j пока не делал - не могу сообразить какой цикл лучше использовать!
Да любой. Хоть бы и тот же while
C
1
while (j < N && A[j++] == 0)
Добавлено через 2 минуты
Только у меня инкремент был префиксный, в сравнении это важно.
С ним так
C
1
while (++j < N && A[j] == 0)
Yandex
Объявления
21.06.2011, 18:11     Группы элементов, состоящие из нечетного количества нулей, замените на один нулевой элемент
Ответ Создать тему
Опции темы

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