Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
#1

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

18.06.2011, 16:28. Просмотров 1131. Ответов 17
Метки нет (Все метки)

Доброго времени суток!
Имеется задача:

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

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

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

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

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

В символьной строке удалить все слова, состоящие из нечетного количества букв. - C++
Привет. Нужна ваша помощь в написании проги на С. Не на С++ =) Ниже приведено условие: В символьной строке удалить все слова,...

Вставить после каждого нечетного значения массива нулевой элемент - C++
3адан целочисленный массив размера N. Вставить после каждого нечетного значения нулевой элемент. Ребята, помогите :)

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

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

Определить количество отрицательных элементов в строках матрицы, содержащих хотя бы один нулевой элемент - C++
Дана целочисленная прямоугольная матрица. Определить количество отрицательных элементов в тех строках, которые содержат хотя бы один...

17
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 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-й блок заменяем на один ноль
0
diagon
Higher
1936 / 1202 / 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;
}
0
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
18.06.2011, 23:31  [ТС] #4
diagon, а можно просто по-русски объяснить, если не трудно?
На данном этапе освоения языка С++ наибольшую трудность испытываю именно с пониманием задачи.
На конкретном примере - что должна делать программа? Понятно, что перебрать по порядку каждое значение массива. Сравнить, равно ли оно нулю. Если да, то.... Что она должна делать?

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

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

Не по теме:

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

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

0
hepr
61 / 33 / 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
0
Refuzz
0 / 0 / 0
Регистрация: 14.06.2011
Сообщений: 11
19.06.2011, 17:13  [ТС] #7
А как можно по-простому заменить несколько нулей одним? Какую команду использовать? Надо сделать все макcимально просто, на уровне недельных знаний языка.

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

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

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

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

С уважением.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2011, 23:14 #10
Код
цикл от 0 до N - 1
{
    находим максимум i -го столбца
    меняем местами максимальный  и [i, i] элементы
}
0
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();
}
}
И окончательно запутался, что к чему :-(
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
20.06.2011, 11:52 #12
Где, в своей программе? Ну так распутывайся! Откомментируй свой код, глядишь и распутаешься. А если где-то ошибаешься — тебя поправят.

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

Добавлено через 53 секунды
Например, создаётся впечатление, что строки 45 и 46 выполняются в одном цикле. Но это не так.
0
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();
 
}
Все равно нихрена не работает.
Помогите разобраться пожалуйста!
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
21.06.2011, 16:18 #14
Ну вот циклы в строках 37—53. Поиск идёт по строкам, а в задании, вроде по столбцам. Ну это ладно. Хуже, что по мере нахождения значений, которые больше предыдущих, они сразу меняются с диагональными. Надо же во внутреннем цикле только найти максимум, а после его завершения один раз обменять.
0
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]), а вот с подсчетом нулей - трудности :-( Может вкратце накидаете кусочек кода?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 16:55
Привет! Вот еще темы с ответами:

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

В прямоугольной матрице узнать сумму элементов строк, которые содержат хотя бы один нулевой элемент - C++
Приветствую. Помогите решить задачу. Есть только шаблон для заполнения массива: #include &lt;iostream&gt; #include&lt;stdlib.h&gt; ...

Массив: Количество отрицательных элементов в тех строках, которые содержат хотя бы один нулевой элемент - C++
Дана целочисленная прямоугольная матрица. Определить: 1) количество отрицательных элементов в тех строках которые содержат хотя бы...

Подсчитать количество отрицательных элементов в строках матрицы, которые содержат хотя бы один нулевой элемент - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(int argc, char** argv) { int...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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