SLC21 Week2 - Programmin arrays
Вітаю всіх з початком другого тижня Steemit Learning Challenge.
Мабуть ви вже звикли що задачі попередніх уроків мають продовження в наступних, так і цього разу.
Минулого разу я не просто так дав завдання знайти найбільше значення серед кількох значень.
Найбільше серед двох шукаємо так:
if (a>b) max=a; else max=b;
але додавання третього вже спричиняє декілька проблем.
Ніби перше що спало на думку здається цілком правильним та логічним - але це не так
if (a>b && a>c) max=a; else if(b>a && b>c) max=b; else max=c;
існують значення що приводять до невірного результату. Наприклад який буде результат при значеннях a=5; b=5; c=3;?
вірна відповідь 5, в той час як дана логіка дасть результат 3. Це приклад контр прикладу (counterexample), тобто counterexample - це такий приклад який показує помилковість чогось(формули, логіки, чогось)
Для виправлення слід включити рівність до аналізу.
if (a>=b && a>=c) max=a; else if(b>=a && b>=c) max=b; else max=c;
а для чотирьох змінних
if (a>=b && a>=c && a>=d) max=a; else if(b>=a && b>=c && b>=d) max=b; else if (c>=a && c>=b && c>=d ) max=c; else max=d;
if (a>=b && a>=c && a>=d) max=a;
else if(b>=a && b>=c && b>=d) max=b;
else if(c>=a && c>=b && c>=d) max=c;
else max=d;
З додаванням ще одного числа для обробки ми маємо додати ще одну if
та додати аналіз додаткової змінної в кожну умову.
А якщо глянути на задачу зі зворотного боку (як у випадку з задачею +1 x2)
max=d;
if(c>=a && c>=b && c>=d) max=c;
if(b>=a && b>=c && b>=d) max=b;
if (a>=b && a>=c && a>=d) max=a;
Ніби нічого не змінилося крім порядку.... та що коли зробити так:
max=d;
if(c>d) max=c;
if(b>c && b>d) max=b;
if(a>b && a>c && a>d) max=a;
Стало коротше.... а чи можна ще спростити
max=d;
if(c>max) max=c; // адже d=max - вони однакові - можна замінити в порівнянні на еквівалент
if(b>c && b>d) max=b;///??????
це рядок можна замінити на if(b>max) max=b;
а порівняння з двома змінними можна не робити - з c
та d
порівняли раніше, і max
вже містить найбільше значення з c
та d
залишається max
оновити коли b
ще більше.
Аналогічно і з a
- коли дійдемо до аналізу змінної a
в max
вже буде знаходитися найбільше з b,c,d
, знов лишається оновити max
коли a
ще більше.
Отже код запишеться так:
max=d;
if(c>max) max=c;
if(b>max) max=b;
if(a>max) max=a;
цей код став простішим, більш зрозумілим, коротшим - а отже містить менше помилок.
Для зручності його можна ще розвернути
max=a;
if(b>max) max=b;
if(c>max) max=c;
if(d>max) max=d;
Тепер ще й додавати нові змінні легше.
але коли данних буде 100, 1000 ... напевне якось не так, адже де взяти 100 чи 1000 імен змінних.
Для зручності їх можна назвати а1, а2, а3,а4....а100,.....а1000
Але проблема набору великої кількості рядків залишиться.
Якби можна було якось комбінувати ім'я та номер.... але вигадали дещо інше - одне ім'я для 1000 змінних. І зветься цей "винахід" - масив, масив змінних.
Оголошується так: int a[1000];
, тобто схоже на оголошення звичайної змінної але праворуч від неї стоїть в квадратних дужках кількість оголошуваних змінних.
але це ще не все - у масивів є певні особливості/властивості.
- всі елементи масиву мають одне ім'я;
- всі елементи одного типу;
- всі елементи розташовані в пам'яті поруч.
Це класичні, традиційні властивості масиву - в сучасних же реаліях деякі правила можуть бути розширені.
Наприклад оголосимо масив з чотирьох цілих чисел так int t[4];
Пам'ятаєте, там буде сміття, там не слід очікувати нулі. Тому масив слід ініціалізувати - наприклад значеннями - 10.20,30,40.
t[0]=10; t[1]=20; t[2]=30; t[3]=40;
Як і в звичайній змінній можна оголошувати і ініціалізовувати разом так і окремо -
для змінної одразу int k=17;
або після оголошення int k; k=17;
для масиву int t[4]={10,20,30,40};
- одразу , і після оголошення t[0]=10; t[1]=20; t[2]=30; t[3]=40;
написати ж присвоєння відразу всьому масиву t={10,20,30,40}
; - не вийде((
Головна трудність з якою стикаються новачки тут така:
int b[3];
Елементу b[3] не існує - що здається парадоксальним, адже в запису int b[3];
3 писати можна - а при записі b[3]
- ні.
Тут справа в тлумаченні трійки в [3]
у випадку int b[3];
3 - кількість, а у випадку b[3]
трійка це індекс що позначає четвертий елемент. якого немає, як і немає b[4]
b[5]
b[100]
b[1000]
чи b[-1]
- від'ємний індекс? як таке може бути - що це означає?
При оголошенні масиву int a[2];
скільки змінних з'являється? Як гадаєте? Якщо скажете що дві - буде вірно, адже ми оголошували масив для двох цілих чисел, саме це число записане в []. Але що таке а?
І я показував раніше як оголошувати та ініціалізовувати масив - а як його вивести?
Можливо хто вважає що як і звичайні змінні? cout<<a;
І вірно, і не вірно))
Вірно - тому що це не дасть помилки, програма виведе не екран результат.
А не вірно - так як програма не виведе весь масив як очікували.
То що ж виведе програма, що за змінна a? - це адреса масиву!!! отже cout<<a;
виведе адресу масиву. (адресу першого елемента масиву) А що виведе cout<<a+1;?
Масиви дуже зручно обробляти з допомогою циклів, так як в квадратні дужки можна вставити іншу змінну(індекс-порядковий номер елемента в масиві)
І циклу все рівно (як і програмісту що його написав) скільки елементів у масиві -10, 100 чи 1000...
Ось, наприклад, ініціалізація масиву на 50 елементів.
int x[50];
for(int i=0; i<50; i++)
x[i]=50;
А ось їх вивід на консоль
int x[50];
for(int i=0; i<50; i++)
cout<<x[i]<<" ";
У мене особлива любов до чисел, зокрема до випадкових чисел і до функції rand(), яка дозволить заповнити масиви.
for(int i=0; i<50; i++)
x[i]=rand()%37;
в масив попадуть числа від 0 до 36.
Homework
1 | Оголосіть масив будь якого типу:поясніть як користуватися масивом, як здійснювати доступ до елементів масиву. Надайте деяким його елементам значень, та скористайтеся цими значеннями (виведіть на екран)Які переваги масиву над звичайними змінними | 1.5 |
2 | Чим є ім'я масиву? Що буде якщо вивести це значення на екран? Що значить cout<<a+2; та cout<<a-2; ? Якщо при виводі cout<<a; виведеться 4000 - то скільки буде a+1? | 1.5 |
3 | Чи може у масив бути два розміри? | 1 |
4 | Запишіть в змінну k випадкове число int k=(rand()%101) * (rand()%101) * (rand()%101)+500; Задачу минулого уроку пошуку дільників спробуйте розв'язати ефективніше(щоб дільники відшукувалися швидше) та запишіть результати (не на екран) а в масив. Так як передача масивів у функцію не проста тема - заповнення масиву не оформляти в вигляді функції!!! | 2 |
5 | Заповніть масив на 55 чисел випадковими числами від 10 до 50. Якщо серед елементів масиву є число 37 виведіть yes а якщо такого числа нема - виведіть no | 1 |
6 | Заповніть масив на 66 чисел випадковими числами від 12 до 60. Замініть парні елементи на 7, а непарні на 77 | 1 |
7 | Заповніть масив на 77 чисел випадковими числами від 102 до 707. Знайдіть два найбільших числа. Але фраза "два найбільших числа" може мати багато тлумачень. Тому спочатку добре поясніть як цю фразу зрозуміли. А потім розв'язуйте завдання. | 2 |
Правила проведення
Публікувати можна на будь-якій мові, в будь якій спільноті чи просто у власному блозі, посилання на вашу роботу додайте сюди коментарем
Щоб я швидко знайшов, перевірив та оцінив ваші роботи залиште посилання в коментарі під цим текстом а в роботі поставите тег #slc21w2sergeyk
До всіх завдань код наводити скріншотом, не текстом. Демонструвати теж скріншотом результат роботи програми.
Будьте обережні стосовно ідеальних та надефективних рішень, звичайній людині, початківцю їх не легко найти.
Не надавати рішення задач з допомогою матеріалів, які не вчили. Наприклад масивів, котрі ми ще не вчили. Це обмеження не стосується тих студентів які вже практично знайомі з програмуванням, та надають розширені відповіді на завдання, що більш схоже на лекцію.
Плагіат і використання ШІ заборонено.
Учасники мають бути перевіреними та активними користувачами платформи.
Використані зображення мають належати автору або бути вільними від авторських прав. (Не забудьте вказати джерело.)
Учасники не повинні використовувати будь-які сервіси ботів для голосування, не брати участь у купівлі голосів.
Порекомендуйте прийняти участь своїм друзям.
Роботи слід опублікувати з Monday 04 Nov 24 to Sunday 11 Nov 24
Ваші роботи будуть мною прокоментовані, оцінені та відібрані чотири кращі роботи.
In question 4,
Did you mean this?
int k= rand()%101 * rand()%101 * rand()%101 + 500;
I see no modulus sign though in your question. Just want to confirm.
0.00 SBD,
0.35 STEEM,
0.35 SP
int k=(rand()%101) * (rand()%101) * (rand()%101)+500;
thanks, I fixed it - it should have been like that
0.00 SBD,
0.07 STEEM,
0.07 SP
https://steemit.com/slc21w2sergeyk/@event-horizon/slc21-week2-programming-arrays
0.00 SBD,
0.09 STEEM,
0.09 SP
@tipu curate
;) Holisss...
--
This is a manual curation from the @tipU Curation Project.
Upvoted 👌 (Mana: 4/7) Get profit votes with @tipU :)
My Participation
https://steemit.com/slc21w2sergeyk/@arinaz08/slc21-week2-programming-arrays
I need some more detail of this question
Thank you
My entry.
https://steemit.com/slc21w2sergeyk/@josepha/slc21-week2-programmin-arrays
https://steemit.com/slc21w2sergeyk/@akmalshakir/slc21-week2-programming-arrays
My entry:
https://steemit.com/slc21w2sergeyk/@kouba01/slc21-week2-programmin-arrays
Here is my entry: https://steemit.com/slc21w2sergeyk/@mohammadfaisal/slc21-week2-programming-arrays