Пн, 23.10.2017, 10:42
Форум інформатиків України
Головна Реєстрація Вхід
Вітаю Вас, Гість · RSS
Вітання на форумі
Незнайомець
Вітаємо на форумі,
Незнайомцю!

   
зареєструйтесь
Перед реєстрацією обов’язково прочитайте:
Оновлення Учасники Пошук
Особисті повідомлення
Видавництво ’’Аспект’’ Видавництво

Сторінка 2 з 10«1234910»
Модератор форуму: Bandalak, Ktara, НІКОЛЯ, volevikt 
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Задачі шкільного рівня. (Методично правильні розв’язки цікавих задач шкільної прогр.)
Задачі шкільного рівня.
Ковальчук_Олександр Дата: Вт, 11.03.2008, 03:09 | Повідомлення № 1
Ветеран спілкування
Повідомлень: 3620
Нагороди: 17
Рейтинг: 192
У гостьовій книзі користувач роман попросив розв’язати кілька простих задач для свого сина.
Я вирішив допомогти йому і заодно створити тему, де хтось буде писати умову цікавої задачі шкільного рівня, а інші будуть пропонувати розв’язки цієї задачі. І ми разом серед кількох варіантів розв’язку вибиратимемо найоптимальніший, методично правильний. Тема досить актуальна і цікава. Сподіваюсь, допоможе вчителям, які з різних причин погано знаються на задачах з програмування навіть шкільного рівня (наприклад вчитель, який інформатику читає не за спеціальністю).

Отож, задачі з гостьової книги:
Задача 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 Дата: Ср, 12.03.2008, 09:13 | Повідомлення № 16
Любитель дискутувати
Повідомлень: 177
Нагороди: 0
Рейтинг: 2
Quote (роман)
йому потрібні для наукової роботи,

Дані задачі для наукової роботи... biggrin
Дана задача на застосування циклу while або repeat. Для обчислення значення функції необхідно застосовувати команду розгалуження.

P.S.

Quote (Ковальчук_Олександр)
Я вирішив допомогти йому і заодно створити тему, де хтось буде писати умову цікавої задачі шкільного рівня, а інші будуть пропонувати розв’язки цієї задачі.

Я розумію, що не всі вміють програмувати і ми маємо допомгти, але коли ми замість людини розвяжмо то вона мало чому навчиться. Наша мета дати поштовх до навчання (куди копати).
Quote (Ковальчук_Олександр)
І ми разом серед кількох варіантів розв’язку вибиратимемо найоптимальніший, методично правильний.

Дана задача як на мене ніякого найоптимальнішого чи методично правильного розвязку НЕМАЄ, вона СТАНДАРТНА (хоч і функція задана як система функцій)!!!
Varkan Дата: Ср, 12.03.2008, 10:45 | Повідомлення № 17
Викладач ВУЗу
Повідомлень: 425
Нагороди: 0
Рейтинг: 6
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;

Уже все написано.

роман Дата: Ср, 12.03.2008, 19:59 | Повідомлення № 18
Новий користувач
Повідомлень: 4
Нагороди: 0
Рейтинг: 1
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 Дата: Чт, 20.03.2008, 14:09 | Повідомлення № 19
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
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жок" не входит.
Ковальчук_Олександр Дата: Чт, 20.03.2008, 21:43 | Повідомлення № 20
Ветеран спілкування
Повідомлень: 3620
Нагороди: 17
Рейтинг: 192
Мені здається, у другій задачі взагалі не варто враховувати шашки, що з’їла Василина.
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. Написати програму, що визначає кількість слів, що містять хоча б одну букву «ю»

Згадаймо рядкові величини.
Ну, хто буде першим? biggrin
Увага! Публікуємо повний розв’язок!

Varkan Дата: Пт, 21.03.2008, 18:04 | Повідомлення № 21
Викладач ВУЗу
Повідомлень: 425
Нагороди: 0
Рейтинг: 6
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 Дата: Сб, 22.03.2008, 09:55 | Повідомлення № 22
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
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);

Ковальчук_Олександр Дата: Нд, 23.03.2008, 22:18 | Повідомлення № 23
Ветеран спілкування
Повідомлень: 3620
Нагороди: 17
Рейтинг: 192
Quote (KulAlex)
Я рекомендую не використтовувати українські чи російські букви в задачах, але даю свій розвязок.

Чому? Як це впливає на програму? Питаю це тому, що брав дані дадачі із збірника задач по програмуванню.
filnick Дата: Пн, 24.03.2008, 01:05 | Повідомлення № 24
Мудрий вчитель
Повідомлень: 2238
Нагороди: 7
Рейтинг: 124
Quote (Ковальчук_Олександр)
Цитата (KulAlex )
Я рекомендую не використтовувати українські чи російські букви в задачах, але даю свій розвязок.

Чому? Як це впливає на програму? Питаю це тому, що брав дані дадачі із збірника задач по програмуванню.

Можливо хоча б тому

Quote (роман)
writeln ('Ââåä³òü ê³ëüê³ñòü ç¿äåíèõ øàøîê ï³ñëÿ N-ãî õîäó');


Відредаговано: filnick - Пн, 24.03.2008, 01:08
Varkan Дата: Пн, 24.03.2008, 12:41 | Повідомлення № 25
Викладач ВУЗу
Повідомлень: 425
Нагороди: 0
Рейтинг: 6
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)
---------------------------------------------

Quote (KulAlex)
s:=s+' ';

а якщо введений рядок уже буде мати 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 Дата: Пн, 24.03.2008, 18:48 | Повідомлення № 26
Мудрий вчитель
Повідомлень: 2238
Нагороди: 7
Рейтинг: 124
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 Дата: Пн, 24.03.2008, 20:43 | Повідомлення № 27
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
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 - Пн, 24.03.2008, 21:08
Varkan Дата: Вт, 25.03.2008, 11:01 | Повідомлення № 28
Викладач ВУЗу
Повідомлень: 425
Нагороди: 0
Рейтинг: 6
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 - Вт, 25.03.2008, 11:07
oleg_teacher Дата: Вт, 25.03.2008, 11:31 | Повідомлення № 29
Любитель дискутувати
Повідомлень: 177
Нагороди: 0
Рейтинг: 2
Quote (Varkan)
до речі інк це не команда асемблера вбудована в паскаль а оператор.

ЦЕ ПРОЦЕДУРА!!! Яка вбудована в модуль System Паскаля. Мовчав але скажу... По перше навіщо запам'ятовувати процедуру inc(i) якшо можна обійтися операцією додавання і:=і+1? причому вона працює лише з цілим типом даних!!!
Quote (filnick)
я навів приклад програми давав, і ви могли б переконатися.

Де переконатися? Коли у вас і мене стоїть вінХР як мінімум, а там є антивірусні програми, програми які працюють в оперативній пам'яті і т.д., причому це багатозадачна ОС. Яка ймовірність того що на результат (вашої найпростішої програм перевірки швидкості) виконання не вплинуть інші фактори (антивірус захотів нонвитися ....). Ви на даному часі не перевірете!!!
Quote (Varkan)
на інтелі 486 в циклі

Оце вже інша справа. Тут я погоджуюсь.
Мені цікаво як це процедура яка виконує операцію додавання повинна бути швидша за саму операцію додавання? (каламбур але ...)
dpi Дата: Вт, 25.03.2008, 14:15 | Повідомлення № 30
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Quote (Varkan)
1. Написати програму, що знаходить саме довге слово в заданому рядку

А такой вариант:
прочитать предложение как массив слов и используя функцию длины слова найти больший элемент массива.
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Задачі шкільного рівня. (Методично правильні розв’язки цікавих задач шкільної прогр.)
Сторінка 2 з 10«1234910»
Пошук:


© Форум інформатиків України, 2007-2017.