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

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

Сторінка 6 з 10«1245678910»
Модератор форуму: 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 не враховує захист від введення не чотиризначного числа, та це легко можна виправити розгалуженням.


Шановні форумчани!!!!!
Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!

KulAlex Дата: Вт, 04.11.2008, 11:20 | Повідомлення № 76
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Quote (filnick)
За цією функцією нуль в нульовому степені дорівнює нулю!
а (-4)^0.5=-2 !?


Відредаговано: KulAlex - Вт, 04.11.2008, 11:23
vitert Дата: Вт, 04.11.2008, 16:18 | Повідомлення № 77
Тут живе...
Повідомлень: 174
Нагороди: 1
Рейтинг: 22
Quote (filnick)
З точки зору математики степенева функція х в степені у при додатніх значеннях у визначена тільки для множини додатніх чисел. Тому при х<0 та y>0 в загальному випадку не визначена.

Тут скоріше мова йде про функцію від двох змінних z=f(x,y), як з точки зору математики так і інформатики. Дана функція при х>=0 визначена завжди а от при х<0 - 3 випадки: 1) невизначена 2) =x^y 3)=-x^y. З цілим показником зрозуміло, а от як бути із дробовим показником?

Quote (KulAlex)

Function Pow(x,y:real):real;
begin
if x>0 then Pow:=exp(y*ln(x)) else
if x<0 then Pow:=-exp(y*ln(-x)) else
Pow:=0
end;

Зрозуміло, що тут працює лише та вітка де x>0, причому для будь-якого у.
Тому краще написати так:

program st;
uses crt;
var x,y,step:real;

Function Pow(x,y:real):real;
begin
if y=0 then pow:=1 else
if x>0 then Pow:=exp(y*ln(x)) else
if x=0 then pow:=0 else
if y-trunc(y)=0 then begin
if trunc(y) mod 2 =1 then pow:=-exp(y*ln(-x)) else
pow:=exp(y*ln(-x)) end;
end;

begin
write('x=');readln(x);
write('y=');readln(y);
if (x<0)and(y-trunc(y)<>0) then writeln('Над цим випадком я ще подумаю') else
begin step:=pow(x,y); writeln ('x^y=',step) end;
end.

Зараз поки писав з'явилася ідея для випадку (x<0)and(y-trunc(y)<>0), потрібно записати у у вигляді звичайного нескоротного дробу, якощо знаменник кратний 2 то вираз не матиме змісту інакше матиме, а знак визначається по чисельнику якщо кратний 2 то + інакше -. Щоправда ще лише для раціональних показників.
Зараз немає часу спробую ввечері написати код.

Відредаговано: vitert - Вт, 04.11.2008, 16:21
filnick Дата: Вт, 04.11.2008, 22:06 | Повідомлення № 78
Мудрий вчитель
Повідомлень: 2238
Нагороди: 7
Рейтинг: 124
Quote (vitert)
if y=0 then pow:=1 else

Слід добавити в умову and x<>0, бо нуль у нульовому степені - невизначенність
KulAlex Дата: Ср, 05.11.2008, 09:57 | Повідомлення № 79
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Бачу вийшла досить непогана задача (Піднесення будь-якого числа до будь-якго степення), можна виставляти на районі і міські олімпіади. Пропоную свій варіант і прошу протестувати.

Але перед тим скажу декілька слів. Оскільки задати кубічний корінь (степень 1/3, паскаль 0.33333333, що між собою не є рівними) не просто, тому у своїй програмі я використовую введення в рядкові змінні. Можна вводити наприклад 2, -2, 1/2, -1/2, 3/2 і т.д. Тобто цілі числа і звичайні дроби з використанням "/" без виділення цілої частини.

Чому саме звичайні дроби, тому що, будь який десятковий дріб можна швидко перетворити у звичайний. Наприклад: 0.5=5/10, 0.125=125/1000 і т.д.

var x,y:string;

Procedure Drib(s:string; var ch,zn:longint);
var i,code:byte;
l:byte absolute s;
begin
i:=pos('/',s);
if i<>0 then
begin
val(copy(s,1,i-1),ch,code);
val(copy(s,i+1,l-i),zn,code)
end
else
begin
val(s,ch,code);
zn:=1
end
end;

Function Pow(x,y:string):string;
var ch1,zn1:string;
ch,zn,c1,z1,c2,z2:longint;
code:integer;
begin
Drib(x,c1,z1);
Drib(y,c2,z2);
if c2<0 then begin ch:=c1; c1:=z1; z1:=ch; c2:=-c2 end;
if (c1=0) and (c2=0) or ((c1<0) or (z1<0)) and (z2 mod 2=0) then Halt(1);
ch:=trunc(exp(ln(abs(exp(c2*ln(abs(c1)))))/z2));
zn:=trunc(exp(ln(abs(exp(c2*ln(abs(z1)))))/z2));
if (x[1]='-') and (c2 mod 2=1) then ch:=-ch;
str(ch,ch1);
str(zn,zn1);
if zn=1 then Pow:=ch1 else Pow:=ch1+'/'+zn1
end;

begin
readln(x);
readln(y);
writeln(Pow(x,y))
end.

Якщо потрібно детальний опис програми, можу написати.

Відредаговано: KulAlex - Ср, 05.11.2008, 10:14
dpi Дата: Ср, 05.11.2008, 14:48 | Повідомлення № 80
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Вот поэтому сишники и побеждают на олимпиадах.
А еще добавте библиотеки "вектор" и "алгоритм" и половину ваших заданий выполнят функции.
Например сортировку масивов (векторов).
Не теряйте время, переходите на С++ (надеюсь такая реклама не запрещена?).
filnick Дата: Ср, 05.11.2008, 19:36 | Повідомлення № 81
Мудрий вчитель
Повідомлень: 2238
Нагороди: 7
Рейтинг: 124
Quote (KulAlex)
будь який десятковий дріб можна швидко перетворити у звичайний. Наприклад: 0.5=5/10, 0.125=125/1000 і т.д.

Так, тоді в математиці це називають степенем з раціональним показником.
Але, ще ж може бути степінь з ірраціональним показником (наприклад sqrt(2) чи ln(3) і т.д.)
KulAlex Дата: Ср, 05.11.2008, 20:08 | Повідомлення № 82
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Quote (dpi)
Не теряйте время, переходите на С++

Давно перейшов. Але багато вчителів не знають С++, тому пишу на даному форумі на пвскаль.

А взагалі потрібно перходити на C#.

vitert Дата: Ср, 05.11.2008, 21:56 | Повідомлення № 83
Тут живе...
Повідомлень: 174
Нагороди: 1
Рейтинг: 22
Quote (filnick)
Слід добавити в умову and x<>0, бо нуль у нульовому степені - невизначенність

Це точно що 0^0 невизначеність в c++ pow(0,0)=1 (хоча не показник). Я, якщо чесно не пригадую такого виключення, я думав що будь-яке число в тому числі і 0 в 0 степені 1, де це написано?

Quote (dpi)
Вот поэтому сишники и побеждают на олимпиадах. А еще добавте библиотеки "вектор" и "алгоритм" и половину ваших заданий выполнят функции. Например сортировку масивов (векторов). Не теряйте время, переходите на С++ (надеюсь такая реклама не запрещена?).

Якщо говорити в загально випадку то так, прогмування на С++ має ряд переваг, не просто переваг С++ - це повноцінна потужна мова, на відміну від паскаля у якого функція одна здобути початкові навички програмування, та і не так так легко перейти, це і звичка, та і взагалі мені здається як навчальна мова паскаль кращий, більш зрозумілий для пояснення,більш гуманніший чи що, чи може це знову ж звичка?
В конретному ж випадку С++ не вирішує задачу піднесення до степеня будь-якого числа. Наприклад напишіть pow(-32,0.2) що ви отримаєте.

Quote (filnick)
тому у своїй програмі я використовую введення в рядкові змінні.

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

Quote (filnick)
Пропоную свій варіант і прошу протестувати.

Тестував: те що побачив 2^1/2=1; -32^1/5=-2; -32^2/10= - невизначенність, тому ще потрібно допрацювати
Коментарі:
1) Для чисельника і знаменника потрібно знайти НСД і поділити їх на нього
2) Ви нав'язуєте як потрібно вводити показник, хоча можна ж зробити це в стандартному вигляді з десятковою крапкою, а потім чисельник це та частина рядка що після десяткової крапки, знаменник 10^довжина чисельника, потім скоротити на НСД. А варіант із дробом можна написати запропонувати як окремий наприклад в такому варіанті ціла частина пробіл чисельник/знаменник. Основу ж взагалі не потрібно робити рядковою. Так буде коректно працювати при будь якому введенні даних.

Спрбобую написати так, якщо вийде.

Додано (05.11.2008, 20:56)
---------------------------------------------

Quote (filnick)
Так, тоді в математиці це називають степенем з раціональним показником. Але, ще ж може бути степінь з ірраціональним показником (наприклад sqrt(2) чи ln(3) і т.д.)

Ви дуже поспішаєте, спочатку давайте вирішимо проблему з раціаональним показником, потім перейдемо до ірраціонального, а потім можна і до комплекного переходити :)

Хоча взагалі коли я ставив цепитання я мав на увазі цілий показник для від'ємної основи, але забув про це вказати, і ось у що це вилилось :)

filnick Дата: Чт, 06.11.2008, 00:09 | Повідомлення № 84
Мудрий вчитель
Повідомлень: 2238
Нагороди: 7
Рейтинг: 124
Quote (vitert)
я думав що будь-яке число в тому числі і 0 в 0 степені 1, де це написано?

Підручник алгебри для 10-11 класу (Визначення степеневої функції)
Quote (vitert)
Ви дуже поспішаєте, спочатку давайте вирішимо проблему з раціаональним показником, потім перейдемо до ірраціонального, а потім можна і до комплекного переходити

Ірраціональні числа разом з раціональними утворюють множину дійсних чисел, яку вивчають у середній школі. Тому задача обчислити значення х в степені у при допустимих значеннях х та у є цілком природньою для учня середньої школи. А для програмування вона цікава тим, що необхідно побудувати чітку математичну модель, врахувавши всі можливі варіанти.
KulAlex Дата: Чт, 06.11.2008, 08:18 | Повідомлення № 85
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Quote (vitert)
2^1/2=1; -32^2/10= - невизначенність

Так пропустив, виправлю
Quote (vitert)
-32^1/5=-2;

На скільки знаю математику то тут все нормально

Quote (vitert)
потім перейдемо до ірраціонального, а потім можна і до комплекного переходити

А це вже буде наукова робота.
dpi Дата: Чт, 06.11.2008, 11:01 | Повідомлення № 86
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Quote (KulAlex)
А взагалі потрібно перходити на C#.

Читал пару книг. Все понравилось.
Но пока его не используют на олимпиадах, переходить не буду.
Да и оболочки подходящей еще не видел.
KulAlex Дата: Чт, 06.11.2008, 12:02 | Повідомлення № 87
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Quote (dpi)
не используют на олимпиадах

Цього року на Хмельницькій заочній олімпіаді дозволили користуватися C#. Оскільки Всеукраїнська олімпіада буде проходити в Хмельницьку, тому швидше всього дозволять користуватися C#.

А відносно середовище, то найкракраще Microsoft Visual C# 200* Express Edition

dpi Дата: Чт, 06.11.2008, 15:41 | Повідомлення № 88
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Сколько он весит и свободно ли распространяется и в какой оболочке будут писать в Хмельницке
vitert Дата: Чт, 06.11.2008, 21:10 | Повідомлення № 89
Тут живе...
Повідомлень: 174
Нагороди: 1
Рейтинг: 22
Quote (KulAlex)
На скільки знаю математику то тут все нормально

Я вам просто привів два однакових вирази: -32^1/5 і -32^2/10 в першому ваша прога дає правильний результат -2 в другому невизначеність, і вказав вам причину чисельник і знаменник потрібно обов'язково скорочувати на їх НСД.

Quote (filnick)
Підручник алгебри для 10-11 класу (Визначення степеневої функції)

У визначенні степеневої функції я нічого про це не найшов, а от у розділі показникова функція дійсно написано, що 0^0=невизначеність, також там сказано що 0^y, якщо у>0 також невизначеність, що більш очевидно, тому кількість умов збільшується.Такаж це означає, що у C++ функція pow(0,0), так само як і у PascalABC power(0,0) дають неправильний результат.
KulAlex Дата: Чт, 06.11.2008, 21:48 | Повідомлення № 90
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Quote (dpi)
свободно ли распространяется

Microsoft Visual C# 200* Express Edition

Quote (dpi)
оболочке будут писать в Хмельницке

Незнаю, я писав швидше всього буде C#.

Quote (dpi)
Сколько он весит

Microsoft Visual C# 2005 Express Edition - 430 МБт
Microsoft Visual C# 2008 Express Edition - 666 МБт (цікавий розмір)
SharpDevelop_2.1.0.2429 - 6,63МБт
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Задачі шкільного рівня. (Методично правильні розв’язки цікавих задач шкільної прогр.)
Сторінка 6 з 10«1245678910»
Пошук:


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