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

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

Модератор форуму: Bandalak, Ktara, НІКОЛЯ, volevikt  
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Розв'язування задач методами процедурного програмування (Розв'язки цікавих задач олімпіадного та шкільного рівнів.)
Розв'язування задач методами процедурного програмування
Ковальчук_Олександр Дата: Нд, 21.10.2007, 16:37 | Повідомлення № 1
Ветеран спілкування
Повідомлень: 3705
Нагороди: 18
Рейтинг: 209
Пропоную в даній темі таке спілкування: хтось пише умову цікавої задачі з програмування, інші - намагаються розв'язати цю задачу і надіслати текст програми в цю тему з повним роз'ясненням розв'язку. Задачі можуть бути як шкільного, так і олімпіадного рівнів. Дана тема допоможе реально підвищити знання з програмування вчителям, які погано розуміються на задачах олімпіадного рівня. Нажаль, я також відносюся до цієї групи вчителів. Соромно, але факт.

Шановні форумчани!!!!!
Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!
KulAlex Дата: Ср, 12.11.2008, 07:59 | Повідомлення № 61
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
la:byte absolute a; <=> la:=length(a). Але коли під час виконання задачі довжина рядка буде змінювати і потрібно обчислювати його довжину, то постійно використовується length(a). А так описується змінна яка автоматично рівна довжині рядка. B ABCPascal не проходить.
dpi Дата: Нд, 16.11.2008, 12:21 | Повідомлення № 62
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Для заданного множества точек на плоскости найдите расстояние между двумя ближайшими при условии, что это расстояние должно быть меньше некого порогового значения.
Входые данные:
Входной файл содержит несколько наборов. Каждый начинается с целого числа N (0<=N<=10000), которое задает число точек в этом наборе. Следующие N строк задают координаты очек. Входные данные завершаются набором с N=0, который обрабатывать не нухно. Все координаты неотрицательна и не привышают 40000.
Выходные данные:
Для каждого набора входных данных выведите одну строку, содержащую число с плавающей запятой (с четырьмя цифрами после десятичной точки), равное расстоянию между двумя ближайшими точками. Если расстояние между всеми точками больше или равно 10000 вывести строку "INFINITY".
Пример входных данных:
3
0 0
10000 10000
20000 20000
5
0 2
6 67
43 71
39 107
189 140
0
Сщоответствующие выходные данные:
INFINITY
36.2215
Подсказка: время выполнения.
Желаю удачи.

Додано (16.11.2008, 12:21)
---------------------------------------------
Можно не код, а идею.

KulAlex Дата: Сб, 22.11.2008, 15:41 | Повідомлення № 63
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
var a:array[1..10000,1..2] of longint;
i,j,n,x,y:longint;
t1,t2:text;
d:real;
begin
Assign(t1,'input.txt');
Reset(t1);
Assign(t2,'output.txt');
Rewrite(t2);
readln(t1,n);
while n<>0 do
begin
for i:=1 to n do
begin
readln(t1,x,y);
a[i,1]:=x;
a[i,2]:=y
end;
d:=10000;
for i:=1 to n-1 do
for j:=i+1 to n do
if sqrt(sqr(a[i,1]-a[j,1])+sqr(a[i,2]-a[j,2]))<d then
d:=sqrt(sqr(a[i,1]-a[j,1])+sqr(a[i,2]-a[j,2]));
if d=10000 then writeln(t2,'INFINITY') else writeln(t2,d:0:4);
readln(t1,n)
end;
Close(t1);
Close(t2)
end.
dpi Дата: Сб, 22.11.2008, 16:17 | Повідомлення № 64
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Дело в том, что при почти таком алгоритме выходим за лимит времени.
Quote (dpi)
между двумя ближайшими

Мне кажется ключ надо искать здесь. Полный перебор не подходит.

Додано (22.11.2008, 16:17)
---------------------------------------------

Quote (dpi)
Можно не код, а идею.
marija Дата: Пт, 18.11.2011, 14:27 | Повідомлення № 65
Новий користувач
Повідомлень: 13
Нагороди: 0
Рейтинг: 0
Поможіть розвязати ,або підкажіть ,де можна знайти розвязки до задачі . Скасти програму знаходження матриці , де вихідними є матриці 3*3 . S=BD+DV-5V
Ковальчук_Олександр Дата: Пт, 18.11.2011, 18:31 | Повідомлення № 66
Ветеран спілкування
Повідомлень: 3705
Нагороди: 18
Рейтинг: 209
Уточніть умову задачі. Дано матриці B,D,V з розмірами 3*3, знайти S=B*D+D*V-5*V?
dpi Дата: Пт, 18.11.2011, 20:04 | Повідомлення № 67
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Quote (Ковальчук_Олександр)
Дано матриці B,D,V з розмірами 3*3, знайти S=B*D+D*V-5*V

В этом случае это чистая математика - умножение, сложение и вычитание матриц. Первый курс института.
marija Дата: Нд, 20.11.2011, 16:33 | Повідомлення № 68
Новий користувач
Повідомлень: 13
Нагороди: 0
Рейтинг: 0
Скласти підпрограми-процедури виконання дій над матрицями(додавання, віднімання, множення матриці на вектор та число,транспонування матриць). Використовуючи дані процедурискласти програму ,де вихідними є матриці розмірності 3 на 3, S=BD+DV-5V
Ковальчук_Олександр Дата: Нд, 20.11.2011, 22:27 | Повідомлення № 69
Ветеран спілкування
Повідомлень: 3705
Нагороди: 18
Рейтинг: 209
Досить багато коду...

Як варіант процедура для добутку
procedure dobut (var x,y,r: array[1..3,1..3] of integer);
var k,l: integer;
begin
for k:=1 to 3 do
for l:=1 to 3 do
r[k,l]:=x[k,l]*y[k,l];
end;
marija Дата: Пн, 21.11.2011, 15:05 | Повідомлення № 70
Новий користувач
Повідомлень: 13
Нагороди: 0
Рейтинг: 0
Quote (Ковальчук_Олександр)
Аналогічним чином потрібно зробити процедури для введення, додавання, віднімання матриць.

Дякую , сьогодні попробую доопрацювати цю програму і подивлюсь ,що з цього вийде .
Roman255 Дата: Вт, 22.11.2011, 10:57 | Повідомлення № 71
Тут живе...
Повідомлень: 122
Нагороди: 1
Рейтинг: 19
Я отримав щось таке:
Program EX7_15;
type
Matrix=array[1..3,1..3]of real;
var
i,j:integer;
S1,S2,S3,S4,B,D,V,S:matrix;
procedure input (var mas:matrix) ;
begin
for i:=1 to 3 do
for j:=1 to 3 do
read(mas[i,j]);
end;
procedure mult (a,b:matrix; var c:matrix);
var
k:integer;
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
c[i,j]:=0;
for k:=1 to 3 do
c[i,j]:=c[i,j]+a[i,k]*b[k,j];
end;
end;
procedure sum (a,b:matrix; var x:matrix);
begin
for i:=1 to 3 do
for j:=1 to 3 do
x[i,j]:=a[i,j]+b[i,j];
end;
procedure DobChyslo (a:matrix;m:real; var b:matrix);
begin
for i:=1 to 3 do
for j:=1 to 3 do
b[i,j]:=m*a[i,j];
end;
begin
writeln('input matrix B:');
input (B);
writeln('input matrix D:');
input (D);
writeln('input matrix V:');
input (V);
mult (B,D,S1);
mult (D,V,S2);
sum (S1,S2,S3);
DobChyslo(V,-5,S4);
sum (S3,S4,S);
writeln('matrycya S:');
for i:=1 to 3 do
begin
writeln;
for j:=1 to 3 do
write (S[i,j]:10:5);
end;
end.
Ковальчук_Олександр Дата: Вт, 22.11.2011, 13:26 | Повідомлення № 72
Ветеран спілкування
Повідомлень: 3705
Нагороди: 18
Рейтинг: 209
Як на мене гарна реалізація
Newbie Дата: Чт, 24.10.2013, 11:10 | Повідомлення № 73
Хелпер
Повідомлень: 1414
Нагороди: 9
Рейтинг: 91
виникла проблема: якщо арифметичний вираз з дійсними числами задавати безпосередньо числами і через змінні, отримуються різні результати.
приклад:
Код
program p1;
var a,d:real;
begin
a:= 50;
d:=8.18;
writeln(a*d);
writeln(trunc(a*d ));
writeln(50*8.18);
writeln(trunc(50*8.18));
end.

а так розумію, що проблема в представленні дійсних чисел у пам'яті, напевно десь накопичується похибка. але як це обійти?
volodschool2 Дата: Чт, 24.10.2013, 12:07 | Повідомлення № 74
Досвідчений учасник
Повідомлень: 1527
Нагороди: 15
Рейтинг: 364


Користуйтесь PascalABC
Newbie Дата: Чт, 24.10.2013, 12:11 | Повідомлення № 75
Хелпер
Повідомлень: 1414
Нагороди: 9
Рейтинг: 91
Цитата volodschool2 ()
Користуйтесь PascalABC

олімпіада на компіляторі FreePascal.
І в Delphi така ж ситуація:
Код
a:= 50;
d:=8.18;
edit1.text:=floattostr(trunc(a*d ));
edit2.Text:=floattostr(trunc(50*8.18));
в першому полі маємо 408, в другому 409
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Розв'язування задач методами процедурного програмування (Розв'язки цікавих задач олімпіадного та шкільного рівнів.)
Пошук:


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