 |
Вітаю Вас, Гість · RSS |
 |
Задачі шкільного рівня.
| |
kom_adm |
Дата: Tu, 11.03.2008, 02:09 | Повідомлення № 1 |
Ветеран спілкування
Повідомлень: 3767
| У гостьовій книзі користувач роман попросив розв’язати кілька простих задач для свого сина. Я вирішив допомогти йому і заодно створити тему, де хтось буде писати умову цікавої задачі шкільного рівня, а інші будуть пропонувати розв’язки цієї задачі. І ми разом серед кількох варіантів розв’язку вибиратимемо найоптимальніший, методично правильний. Тема досить актуальна і цікава. Сподіваюсь, допоможе вчителям, які з різних причин погано знаються на задачах з програмування навіть шкільного рівня (наприклад вчитель, який інформатику читає не за спеціальністю). Отож, задачі з гостьової книги: Задача 1. Дано натуральне число N (1000 < =N<=9999). Визначити, чи є числo поліндромом, тобто таким числом, яке зліва направо і справа наліво читається однаково (всі чотири цифри враховуються; наприклад, 0110). Задача 2. Василина Премудра грала в шашки зі змієм Гориничем на дуже великій дошці. Спочатку Василина з’їла у Горинича 3 шашки, а Горинич у Василини – 5 шашок, потім Василина у Горинича з’їла 9 шашок, а Горинич у Василини – 10 шашок, на третьому ході Василина проковтнула 15 шашок, а Горинич- 20. Ця серйозна гра тривала ще довго, аж поки Горинич не втомився і після N-го ходу не з’їв саму Василину. Скільки всього шашок проковтнув Змій Горинич? Кількість шашок завжди достатня. Задача 3 . Знайти всі дільники натурального числа N. Розв’язки: Задача 1. var n,n1,n2,n3,n4,r:integer; begin write('Введіть будь-яке чотирьохзначне число: '); readln(n); n1:=n div 1000; n2:=(n div 100) mod 10; n3:=(n div 10) mod 10; n4:= n mod 10; r:=n4*1000+n3*100+n2*10+n1; if r=n then writeln ('Введене число ',n,' являється поліндромом.') else writeln ('Введене число ',n,' не є поліндромом.') end. Задача 3. var i,n:integer; begin writeln('Введіть натуральне число'); readln(n); writeln('Дільники числа ',n,': '); for i:=1 to n do if n mod i = 0 then write(i,' '); end. Розв’язок задачі 2 напишу незабаром. А зараз хотілося б почути ваші думки з приводу того, чи оптимально розв’язані задачі 1 та задачі 3. Звичайно, задача 1 не враховує захист від введення не чотиризначного числа, та це легко можна виправити розгалуженням. Шановні форумчани!!!!! Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!
|
|
| |
oleg_teacher |
Дата: We, 12.03.2008, 08:13 | Повідомлення № 16 |
Любитель дискутувати
Повідомлень: 177
| Quote (роман) йому потрібні для наукової роботи, Дані задачі для наукової роботи... Дана задача на застосування циклу while або repeat. Для обчислення значення функції необхідно застосовувати команду розгалуження. P.S. Quote (Ковальчук_Олександр) Я вирішив допомогти йому і заодно створити тему, де хтось буде писати умову цікавої задачі шкільного рівня, а інші будуть пропонувати розв’язки цієї задачі. Я розумію, що не всі вміють програмувати і ми маємо допомгти, але коли ми замість людини розвяжмо то вона мало чому навчиться. Наша мета дати поштовх до навчання (куди копати). Quote (Ковальчук_Олександр) І ми разом серед кількох варіантів розв’язку вибиратимемо найоптимальніший, методично правильний. Дана задача як на мене ніякого найоптимальнішого чи методично правильного розвязку НЕМАЄ, вона СТАНДАРТНА (хоч і функція задана як система функцій)!!!
|
|
| |
Varkan |
Дата: We, 12.03.2008, 09:45 | Повідомлення № 17 |
Викладач ВУЗу
Повідомлень: 425
| Quote (роман) будь ласка напишыть ще друге задачу! Дякую наперед Quote (Varkan) 2 задача. без врахування шашок які зїла Василина: k:=5; m:=2; for i:=2 to n do begin k:=k+5*m m:=m+2; end; з врахуванням шашок які зїла Василина: k1:=3 k2:=5; m1:=3 m2:=2; for i:=2 to n do begin k1:=k1+3*m1 m1:=m1+2; k2:=k2+5*m2 m2:=m2+2; end; k:=k1+k2; Уже все написано.
|
|
| |
роман |
Дата: We, 12.03.2008, 18:59 | Повідомлення № 18 |
Новий користувач
Повідомлень: 4
| Program E7; const k1=3; k2=5; m1=3; m2=2; var k3,m3,m4,k4,n,i,k:integer; begin writeln ('Ââåä³òü ê³ëüê³ñòü ç¿äåíèõ øàøîê ï³ñëÿ N-ãî õîäó'); readln (n); for i:=2 to n do begin k3:=k1+3*m1; m3:=m1+2; k4:=k2+5*m2; m4:=m2+2; end; k:=k1+k2; writeln ('k=',k); end.Додано (12.03.2008, 18:59) --------------------------------------------- це задача 2 скажіть що тут не так?
|
|
| |
dpi |
Дата: Th, 20.03.2008, 13:09 | Повідомлення № 19 |
Досвідчений вчитель
Повідомлень: 1438
| 1 задача Можно один условный оператор и сразу ответ (If n div 1000 = n mod 100 ... и тд) 2 задача Или я что не понял или так ... b=3; k=5; for i:=2 to n do begin b=b+6; k=k*2; end; Ответ: k+b 3 задача Quote (Ковальчук_Олександр) for i:=1 to n do как все правильно написали заменить на for i:=1 to n/2 do и в конце вывести n (n тоже делитель). Quote (роман) 4. 3. Обчислити описану нижче функцію на проміжку (-2;2) з інтервалом 0,5. здесь самое трудное это то, что -2 и 2 в "промiжок" не входит.
|
|
| |
kom_adm |
Дата: Th, 20.03.2008, 20:43 | Повідомлення № 20 |
Ветеран спілкування
Повідомлень: 3767
| Мені здається, у другій задачі взагалі не варто враховувати шашки, що з’їла Василина. Code ... x:=5; i:=1; while i<n do begin x:=X*2; i:=i+1; end; writeln ('Горинич проковтнув ',x,' шашок'); end. Додано (20.03.2008, 20:43) --------------------------------------------- Щоб теми не зав’яли, наступні дві задачі від мене: 1. Написати програму, що знаходить саме довге слово в заданому рядку 2. Написати програму, що визначає кількість слів, що містять хоча б одну букву «ю» Згадаймо рядкові величини. Ну, хто буде першим? Увага! Публікуємо повний розв’язок!
|
|
| |
Varkan |
Дата: Fr, 21.03.2008, 17:04 | Повідомлення № 21 |
Викладач ВУЗу
Повідомлень: 425
| Quote (Ковальчук_Олександр) 2. Написати програму, що визначає кількість слів, що містять хоча б одну букву «ю» uses crt; var s:string; n,i,k:integer; begin clrscr; writeln('S>'); readln(s); n:=length(s); k:=0; i:=1; while i<=n do begin if s[i]='1' then begin k:=k+1; while (i<=n) and (s[i]<>' ') do i:=i+1; end; i:=i+1; end; writeln(k); end. Правда шукав цифру "1" для зручності, а ви вже міняйте на "ю"
|
|
| |
KulAlex |
Дата: Sa, 22.03.2008, 08:55 | Повідомлення № 22 |
Знаток програмування
Повідомлень: 326
| 2. Написати програму, що визначає кількість слів, що містять хоча б одну букву «ю» Я рекомендую не використтовувати українські чи російські букви в задачах, але даю свій розвязок. var s:string; k:byte; begin readln(s); s:=s+' '; k:=0; while pos(' ',s)<>0 do begin if pos('ю',copy(s,1,pos(' ',s)))<>0 then inc(k); delete(s,1,pos(' ',s)) end; writeln(k) end. 1. Написати програму, що знаходить саме довге слово в заданому рядку var s,ms:string; m,l:byte; begin readln(s); s:=s+' '; m:=0; while pos(' ',s)<>0 do begin l:=pos(' ',s)-1; if l>m then begin m:=l; ms:=copy(s,1,l) end; delete(s,1,pos(' ',s)) end; writeln(ms) end. Ну і зауваженя до попередніх та наступних розвязків: Краще використовувати var n:byte absolute s ніж n:=length(s);
|
|
| |
kom_adm |
Дата: Su, 23.03.2008, 21:18 | Повідомлення № 23 |
Ветеран спілкування
Повідомлень: 3767
| Quote (KulAlex) Я рекомендую не використтовувати українські чи російські букви в задачах, але даю свій розвязок. Чому? Як це впливає на програму? Питаю це тому, що брав дані дадачі із збірника задач по програмуванню.
|
|
| |
filnick |
Дата: Mo, 24.03.2008, 00:05 | Повідомлення № 24 |
Мудрий вчитель
Повідомлень: 2238
| Quote (Ковальчук_Олександр) Цитата (KulAlex ) Я рекомендую не використтовувати українські чи російські букви в задачах, але даю свій розвязок. Чому? Як це впливає на програму? Питаю це тому, що брав дані дадачі із збірника задач по програмуванню. Можливо хоча б тому Quote (роман) writeln ('Ââåä³òü ê³ëüê³ñòü ç¿äåíèõ øàøîê ï³ñëÿ N-ãî õîäó');
Відредаговано: filnick - Mo, 24.03.2008, 00:08 |
|
| |
Varkan |
Дата: Mo, 24.03.2008, 11:41 | Повідомлення № 25 |
Викладач ВУЗу
Повідомлень: 425
| Quote (KulAlex) Ну і зауваженя до попередніх та наступних розвязків: Краще використовувати var n:byte absolute s ніж n:=length(s); Якщо ви даєте зауваження то будь-ласка аргументуйте. Якщо не помиляюсь то ви писали що inc працює швидше ніж і:=і+1, а це не так чому і прошу аргументувати. Додано (24.03.2008, 09:14) ---------------------------------------------
Quote (filnick) Цитата (Ковальчук_Олександр ) Цитата (KulAlex ) Я рекомендую не використтовувати українські чи російські букви в задачах, але даю свій розвязок. Чому? Як це впливає на програму? Питаю це тому, що брав дані дадачі із збірника задач по програмуванню. Можливо хоча б тому Цитата (роман ) writeln ('Ââåä³òü ê³ëüê³ñòü ç¿äåíèõ øàøîê ï³ñëÿ N-ãî õîäó'); Паскаль використовує російські букви через таблицю АСКІ (ASCI по моєму) і з цими символами ніяких проблем немає. А ця абра кадабра може бути в декількох варіантах: 1. використовувалось кодування не АСКІ 2. не працює або не коректно працює кейрус.ком (цей файл тра запускати перед запуском паскаля щоб відображалась кирилиця) Додано (24.03.2008, 10:45) ---------------------------------------------
а якщо введений рядок уже буде мати 255 символів? Додано (24.03.2008, 11:41) ---------------------------------------------
Quote (Ковальчук_Олександр) 1. Написати програму, що знаходить саме довге слово в заданому рядку uses crt; var ms,s1,s:string; n,i:integer; begin clrscr; writeln('S>'); Readln(s); n:=length(s); s1:=''; ms:=''; i:=1; while i<=n do begin if s[i]<>' 'then begin s1:=s1+s[i]; i:=i+1; end else begin if length(s1)>length(ms) then ms:=s1; s1:=''; while (s[i]=' ') and (i<=n) do i:=i+1; end; end; if length(s1)>length(ms) then ms:=s1; writeln(ms,' ',length(ms)); readkey; end.
|
|
| |
filnick |
Дата: Mo, 24.03.2008, 17:48 | Повідомлення № 26 |
Мудрий вчитель
Повідомлень: 2238
| Quote (Varkan) Паскаль використовує російські букви через таблицю АСКІ (ASCI по моєму) і з цими символами ніяких проблем немає. А ця абра кадабра може бути в декількох варіантах: 1. використовувалось кодування не АСКІ 2. не працює або не коректно працює кейрус.ком (цей файл тра запускати перед запуском паскаля щоб відображалась кирилиця) Погоджуюсь, що причина - непідтримка таблиці кодів ASCII. Quote (Varkan) uses crt; var ms,s1,s:string; n,i:integer; begin clrscr; writeln('S>'); Readln(s); n:=length(s); s1:=''; ms:=''; i:=1; while i<=n do begin if s[i]<>' 'then begin s1:=s1+s[i]; i:=i+1; end else begin if length(s1)>length(ms) then ms:=s1; s1:=''; while (s[i]=' ') and (i<=n) do i:=i+1; end; end; if length(s1)>length(ms) then ms:=s1; writeln(ms,' ',length(ms)); readkey; end. Після закінчення слова у реченні може бути не лише символ пробела, а також кома "," або крапка".", або знаки"!", чи "?".
|
|
| |
KulAlex |
Дата: Mo, 24.03.2008, 19:43 | Повідомлення № 27 |
Знаток програмування
Повідомлень: 326
| Quote (Varkan) Якщо ви даєте зауваження то будь-ласка аргументуйте. Якщо не помиляюсь то ви писали що inc працює швидше ніж і:=і+1, а це не так чому і прошу аргументувати. По-перше відносно inc(i) і i:=i+1 я навів приклад програми давав, і ви могли б переконатися. По-друге читайте літературу у якій написано що inc є командою ассемблер і виконується вона швидше ніж i:=i+1 (хоча по правді сказати, що в багатьох книжках пишуть що по часу однаково); var i:byte absolute s; це є пряме посилання на s[0] що є довжиною рядкової величини, таким чином ми описуємо зміну "і" один раз. Якщо в задачі буде змінюватися довжина рядка то зміна "і" автоматично буде змінюватися і не прийдеться використовувати багато раз функцію length, і мій варіант виконується швидше Quote (Varkan) а якщо введений рядок уже буде мати 255 символів? Спеціально для Вас var s,ms:string; m,l:byte; begin readln(s); m:=pos(' ',s)-1; ms:=copy(s,1,m); delete(s,1,m+1); s:=s+' '; while pos(' ',s)<>0 do begin l:=pos(' ',s)-1; if l>m then begin m:=l; ms:=copy(s,1,l) end; delete(s,1,l+1) end; writeln(ms) end. Додано (24.03.2008, 19:43) --------------------------------------------- Відносно кирилиці. Хто використовує Turbo Pascal, потрібно підключати keyrus і тут виникають проблеми з Windows XP щоб його підключити і немає одного стандарту кожний настроює його під себе. Для тих хто використовує FreePascal то він використовує кирилицю Windows (сам windows - це велика проблема) Впринципі робіть що вважаєте за потрібне, а це мої рекомендації, просто не раз зустрічавс з проблемами кирилиці у паскаль.
Відредаговано: KulAlex - Mo, 24.03.2008, 20:08 |
|
| |
Varkan |
Дата: Tu, 25.03.2008, 10:01 | Повідомлення № 28 |
Викладач ВУЗу
Повідомлень: 425
| Quote (filnick) while (s[i]=' ') and (i<=n) do i:=i+1; Quote (filnick) Після закінчення слова у реченні може бути не лише символ пробела, а також кома "," або крапка".", або знаки"!", чи "?". після закінчення слова в реченні не може бути знаків питання крапок і окликів, ці имволи ставляться тільки після закінчення речення. Тому я і враховую не тільки символ а і довжину рядка. а на рахунок ком то можна в умову ще додати логічних виразів адже розділових знакі не так і багато. Quote (KulAlex) По-перше відносно inc(i) і i:=i+1 я навів приклад програми давав, і ви могли б переконатися. Робив перевірку на інтелі 486 в циклі на декілька тисяч повторень, і от шо я скажу саме і:=і+1 працює швидше (правда там різнця зовсім не суттєва близько 5 тіків) перевіряв декілька разів і всеодно час був один і тойже проти досліду не попреш, до речі інк це не команда асемблера вбудована в паскаль а оператор. Література може обманювати. Quote (KulAlex) var i:byte absolute s; це є пряме посилання на s[0] що є довжиною рядкової величини, таким чином ми описуємо зміну "і" один раз. Якщо в задачі буде змінюватися довжина рядка то зміна "і" автоматично буде змінюватися і не прийдеться використовувати багато раз функцію length, і мій варіант виконується швидше Тоді краще відразу брати код аскі нулевого символу (не буде передач значень змінних) І не про швидкість тра думати а про надійність. у розвязку задачі 2 у вас також додається знак " " Quote (KulAlex) var s:string; k:byte; begin readln(s); s:=s+' '; k:=0; while pos(' ',s)<>0 do begin if pos('ю',copy(s,1,pos(' ',s)))<>0 then inc(k); delete(s,1,pos(' ',s)) end; writeln(k) end.
Відредаговано: Varkan - Tu, 25.03.2008, 10:07 |
|
| |
oleg_teacher |
Дата: Tu, 25.03.2008, 10:31 | Повідомлення № 29 |
Любитель дискутувати
Повідомлень: 177
| Quote (Varkan) до речі інк це не команда асемблера вбудована в паскаль а оператор. ЦЕ ПРОЦЕДУРА!!! Яка вбудована в модуль System Паскаля. Мовчав але скажу... По перше навіщо запам'ятовувати процедуру inc(i) якшо можна обійтися операцією додавання і:=і+1? причому вона працює лише з цілим типом даних!!! Quote (filnick) я навів приклад програми давав, і ви могли б переконатися. Де переконатися? Коли у вас і мене стоїть вінХР як мінімум, а там є антивірусні програми, програми які працюють в оперативній пам'яті і т.д., причому це багатозадачна ОС. Яка ймовірність того що на результат (вашої найпростішої програм перевірки швидкості) виконання не вплинуть інші фактори (антивірус захотів нонвитися ....). Ви на даному часі не перевірете!!! Quote (Varkan) на інтелі 486 в циклі Оце вже інша справа. Тут я погоджуюсь. Мені цікаво як це процедура яка виконує операцію додавання повинна бути швидша за саму операцію додавання? (каламбур але ...)
|
|
| |
dpi |
Дата: Tu, 25.03.2008, 13:15 | Повідомлення № 30 |
Досвідчений вчитель
Повідомлень: 1438
| Quote (Varkan) 1. Написати програму, що знаходить саме довге слово в заданому рядку А такой вариант: прочитать предложение как массив слов и используя функцию длины слова найти больший элемент массива.
|
|
| |
© Форум інформатиків України, 2007-2022.  |