1

Тема: Допоможіть або поясніть як скласти таку програму будь ласка

задано масив А(М), М<=200 з дыйсними елементами.
1. Створити новий масив з елементів масиву А, що зустрічаються у масиві А не менше трьох разів.
2. Підрахувати, скільки елементтів першої половини масиву А зустрічаються у другій його половині. 
3. Інвертувати початковий масив без використання додаткового масиву.


3 завдання зробив а вот перші два нерозумію.

2 Востаннє редагувалося mamkin haker (10.11.2021 10:22:51)

Re: Допоможіть або поясніть як скласти таку програму будь ласка

1) чому ви використовуєте букви з російського алфавіту
2) скиньте рішення 3-го завдання взявши його в тего <code>, поділіться з майбутніми студентами :)

допомога (завд 1)
є масив [1, 1, 1, 3, 3, 2, 2, 2, 4, 4, 5, 5, 5]
результат [1,2,5]

проходимо по масиву взявши елемент [0], тобто 1
ставимо лічильник, наприклад k
якщо зустрічємо у масиві 1, видалаємо.
в кінці перевіряємо чи наш лічильник більший рівний за три, якщо так, залишаємо елемент на місці, якщо ні, видалаємо його

повторюємо процедуру декілька разів бравши наступний елемент спочатку [0] потім [1]
(це приблизно, я дав підсказку, рішення не ефективне)

допомога з 2 буде коли скинете код 1 та 3 завдання

Подякували: Dazai1

3

Re: Допоможіть або поясніть як скласти таку програму будь ласка

1)На клавіатурі мову не поміняв , вибачайте
2)

 for (i=0; i<sa/2; i++)
 {
     t = A [i]; 
    A [i] = A[sa-i-1];
    A[sa-i-1] = t;
 }
     printf("   Invert A[%d] : \n",sa);
             for(i=0;i<sa;i++) printf("%3d",A[i]);
               printf("\n");

4

Re: Допоможіть або поясніть як скласти таку програму будь ласка

Dazai написав:

1)На клавіатурі мову не поміняв , вибачайте
2)

for (i=0; i<sa/2; i++)
{
     t = A [i]; 
    A [i] = A[sa-i-1];
    A[sa-i-1] = t;
}
printf("   Invert A[%d] : \n",sa);
for(i=0;i<sa;i++) printf("%3d",A[i]);
printf("\n");

Ви працюєте з мовою С чи С++ ???

5

Re: Допоможіть або поясніть як скласти таку програму будь ласка

в мові сі разом з сі ++ у VS Code

6

Re: Допоможіть або поясніть як скласти таку програму будь ласка

Завдання 1 ось так :

for(j=0;j<(sa-1);j++)
         {
             f=i;
             for(i=(j+1);i<sa;i++)
             {
                 if(A[j]==A[i]) 
                 {
                f++;
                 }
             }
             if(f>2)
             {
                 B[k]=A[i];
                 k++;
             }
         }
         for(i=0;i<k;i++)
         {
             for(j=(i+1);j<k;j++)
             {
                 if(B[j]==B[i])
                 {
                 for(x=j;x<k;x++)
                 {
                     B[x]=B[x+1];
                 }
                 k--;
                 }
             }
         }
         for (i=0;i<k;i++)
         {
             printf("%d\n",B[i]);
         }
Подякували: koala1

7 Востаннє редагувалося mamkin haker (10.11.2021 10:54:18)

Re: Допоможіть або поясніть як скласти таку програму будь ласка

2 завдання теж простеньке
(приблизне рішення)
створюємо лічильник k який буде вказувати кількість повторюваних чисел
визначаємо довжину масиву(вона у нас уже є введена користувачом)
є 2 випадки, коли кількість елементів парна та непарна
куди дівати той 1 елемент вирішуйте самі

створюємо 2 масива, і копіюємо 2 половинки
перевіряєм чи в тих масивах немає повторень, якщо є, видаляємо їх

далі все просто проходимся елементами першого створеного масиву по другому(маю наувазі ті 2 половинки оригіналу)
якщо є подібний елемент в масиві то додаємо до лічильника 1

все.

приклад
[1, 2, 3, 5, 5, 5, 4, 2, 2, 2, 1, 3]

[1, 2, 3, 5, 5, 5]
[4, 2, 2, 2, 1, 3]

[1, 2, 3, 5]
[4, 2, 1, 3]

відповідь: 3

Подякували: Dazai1

8

Re: Допоможіть або поясніть як скласти таку програму будь ласка

Ну Хакер і нахакерив...
До "куди дівати той 1 елемент вирішуйте самі" все так, далі вже маємо 2 підмасиви: перший починається з 0 і закінчується середнім елементом, скажімо, з індексом mid-1; другий починається з mid і закінчується довжиною масиву - 1. Тобто цикл по першому підмасиву виглядає як

for(int i=0;i<mid;i++)
    //щось робимо із A[i]

а по другому

for(int j=mid+1;j<size;j++)
    //щось робимо із A[j]

А далі для кожного елемента першої половини шукаємо, чи немає його в другій, якщо є - збільшуємо лічильник, перериваємо пошук та переходимо до наступного елемента.

Подякували: Dazai1

9 Востаннє редагувалося mamkin haker (10.11.2021 13:30:57)

Re: Допоможіть або поясніть як скласти таку програму будь ласка

:D

скіки елементів буде в половині оцього масиву? [1, 1, 1] і скільки елементтів першої половини масиву зустрічаються у другій його половині?

тут виходить або відповідь 1 або 2
1) [1] [1] == [1] [1, 1]
2) [1, 1] [1] == [1, 1] [1, 1]

який правильний?

Подякували: Dazai1

10

Re: Допоможіть або поясніть як скласти таку програму будь ласка

ПравЕльних тут немає; а який правильний - залежить від того, як на половинки розбити.
В масиві [1] присутні обидва елементи масиву [1,1], і відповідь буде 2.  Так само як і для масивів [1,1] і [1,1].

Подякували: Dazai1

11 Востаннє редагувалося mamkin haker (10.11.2021 13:57:52)

Re: Допоможіть або поясніть як скласти таку програму будь ласка

а як тоді половинки розбити?
може просто користувачу сказати шо масив неможливо поділити на 2 рівні частинки?

Подякували: Dazai1

12

Re: Допоможіть або поясніть як скласти таку програму будь ласка

mamkin haker написав:

а як тоді половинки розбити?
може просто користувачу сказати шо масив неможливо поділити на 2 рівні частинки?

Я лінивий, просто робимо mid = size/2 - цілочисельне ділення. При цьому перша половинка може бути коротшою. Якщо викладач скаже переробити - тоді переробити.

13 Востаннє редагувалося lucas-kane (10.11.2021 23:45:53)

Re: Допоможіть або поясніть як скласти таку програму будь ласка

mamkin haker написав:

допомога (завд 1)
є масив [1, 1, 1, 3, 3, 2, 2, 2, 4, 4, 5, 5, 5]
результат [1,2,5]

проходимо по масиву взявши елемент [0], тобто 1
ставимо лічильник, наприклад k
якщо зустрічємо у масиві 1, видалаємо.
в кінці перевіряємо чи наш лічильник більший рівний за три, якщо так, залишаємо елемент на місці, якщо ні, видалаємо його

повторюємо процедуру декілька разів бравши наступний елемент спочатку [0] потім [1]
(це приблизно, я дав підсказку, рішення не ефективне)

А скажіть, коли масив буде невідсортованим, як тоді буде працювати Ваш алгоритм? Як саме ВИДІЛЯТИ/ВИДАЛЯТИ елемент масиву котрий повторюється? І якщо все ж таки Виділяти, то скільки на Вашу думку лічильник повторюваних елементів масиву, покаже скільки ж тик елементів? А якщо Видаляти, то яким чином (Заносити в масив якесь значення відмінне від інших елементів масиву? Використовувати структури даних? ...)

14 Востаннє редагувалося mamkin haker (11.11.2021 08:14:18)

Re: Допоможіть або поясніть як скласти таку програму будь ласка

=_= а яка нам різниця чи він відсортований чи ні?
ми беремо наприклад 2 і проходимся по всіх елементах. лічильник сразу встановлюємо на 1 (так як перший елемент ми уже взяли) ок, перемішаємо масив
5 2 4 1 3 5 3 5 3 2 5 7
знаходимо всі 5 + дивимся шо показує лічильник
масив який вийшов - [2 4 1 3 3 3 2 7]
лічильник - 4

4 >= 3 отже додаємо 1 до перемінної яка відповідає за кількість чисел які повторюються

далі беремо 2 (так як він 0 елемент(був першим але після видалення 5 став нульовим))
масив який вийшов [4 1 3 3 3 7]
лічильник - 2

2 < 3 отже пропускаємо
і так далі

все робиться поки масив не буде пустим
тобто 1 циклі while і 1 цикл фор який буде у while

15 Востаннє редагувалося mamkin haker (11.11.2021 08:21:45)

Re: Допоможіть або поясніть як скласти таку програму будь ласка

у мене ще була ідея дивитись який розмір мав масив, просто видаляти певні елементи(наприклад число 1) і потім віднімати від розміру масиву що був, те що вийшло, якшо різниця >= 3 то додаємо 1, але думаю викладач те не оцінить....

приклад
  3 8 2 7 6 1 37 1 2 63 1
розмір 11
видаляємо всі 1
отримуємо масив   3 8 2 7 6 37 2 63 - розммір 8
11 - 8 >= 3 отже додаємо 1 до лічильника