 |
Вітаю Вас, Гість · RSS |
 |
Розв'язування задач методами процедурного програмування
| |
kom_adm |
Дата: Su, 21.10.2007, 16:37 | Повідомлення № 1 |
Ветеран спілкування
Повідомлень: 3767
| Пропоную в даній темі таке спілкування: хтось пише умову цікавої задачі з програмування, інші - намагаються розв'язати цю задачу і надіслати текст програми в цю тему з повним роз'ясненням розв'язку. Задачі можуть бути як шкільного, так і олімпіадного рівнів. Дана тема допоможе реально підвищити знання з програмування вчителям, які погано розуміються на задачах олімпіадного рівня. Нажаль, я також відносюся до цієї групи вчителів. Соромно, але факт. Шановні форумчани!!!!! Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!
|
|
| |
KulAlex |
Дата: Th, 24.10.2013, 12:15 | Повідомлення № 76 |
Знаток програмування
Повідомлень: 326
| а краще С++ #include<iostream> using namespace std; int main() { double a=50, d=8.18; cout<<a*d<<endl; cout<<(int)a*d<<endl; cout<<50*8.18<<endl; cout<<(int)50*8.18<<endl; }
на Python 3.3.2 a=50 d=8.18 print(a*d) print(int(a*d)) print(50*8.18) print(int(50*8.18))
на C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { double a = 50; double d = 8.18; Console.WriteLine(a * d); Console.WriteLine((int)a * d); Console.WriteLine(50 * 8.18); Console.WriteLine((int)50 * 8.18); } } }
на Visual Basic Module Module1 Sub Main() Dim a, d As Double a = 50 d = 8.18 Console.WriteLine(a * d) Console.WriteLine(Int(a * d)) Console.WriteLine(50 * 8.18) Console.WriteLine(Int(50 * 8.18)) End Sub End Module
Відредаговано: KulAlex - Th, 24.10.2013, 12:49 |
|
| |
Newbie |
Дата: Th, 24.10.2013, 12:54 | Повідомлення № 77 |
Хелпер
Повідомлень: 1414
| тобто в Паскаль ця проблема вирішення не має?
|
|
| |
KulAlex |
Дата: Th, 24.10.2013, 13:15 | Повідомлення № 78 |
Знаток програмування
Повідомлень: 326
| А так працює var a,d:real; begin a:= 50; d:=8.18; writeln(a*d); writeln(a*d:0:0); writeln(50*8.18); writeln(50*8.18:0:0) end.
|
|
| |
Newbie |
Дата: Th, 24.10.2013, 13:39 | Повідомлення № 79 |
Хелпер
Повідомлень: 1414
| Цитата KulAlex (  ) А так працює так працює на виведення, але не на розрахунки. тобто якщо мені потрібно з тою цілою частиною щось далі робити - я не можу використати її
наразі вирішили таким чином: Код program p1; var d,a:real;k:integer; begin a:= 50; d:=8.18; if frac(a*d)>0.9999 then k:=trunc(a*d)+1 else k:=trunc(a*d); writeln(k); end. Додано (24.10.2013, 13:39) --------------------------------------------- а загалом, щиро вдячна за наочне порівняння середовищ програмування. підтверджує мої деякі думки щодо застосовності їх у школі. чому на олімпіадах не використовують Python?
|
|
| |
Bandalak |
Дата: Th, 24.10.2013, 15:30 | Повідомлення № 80 |
Лідер форуму
Повідомлень: 6386
| В ТурбоПаскаль7 рахує правильно!
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)); readln end.
|
|
| |
Newbie |
Дата: Th, 24.10.2013, 18:47 | Повідомлення № 81 |
Хелпер
Повідомлень: 1414
| в школі в ТурбоПаскаль точно була помилка (і не знаю точно яка версія), а вдома вже не запущу, щоб подивитись.
полистала тему, знайшла черепашку да, у мене вона вже мандрує, як має бути. "дійшло" після відео звідси http://www.intuit.ru/studies/courses/997/313/info (3 лекція)
той код, що тут в повідомленні 25 (сторінка 2) таки не працює коректно. і, раз не було тут повного коду рішення, хочу поділитись своїм варіантом.
в архіві - проект на Делфі, в коді є коментарі. трохи неефективне прикінцеве виведення даних (через 2 текстові поля), але вже як є
|
|
| |
swetikccc |
Дата: We, 10.06.2015, 15:52 | Повідомлення № 82 |
Ветеран спілкування
Повідомлень: 4208
| Сьогодні з дітками на практиці придумали цікаву задачу. Не використовуючи циклів вивести на екран послідовність чисел від введеного числа до нуля і знову до введеного числа. Задача досить наглядна.
|
|
| |
Пилипчук_О_П |
Дата: We, 10.06.2015, 23:49 | Повідомлення № 83 |
Ветеран спілкування
Повідомлень: 4330
| Цитата swetikccc (  ) Не використовуючи циклів вивести на екран послідовність чисел від введеного числа до нуля і знову до введеного числа. За хвилину не зорієнтувався, як це зробити... Сподіваюсь, goto і рекурсія теж не використовуються?
|
|
| |
nolk-v |
Дата: Th, 11.06.2015, 05:37 | Повідомлення № 84 |
Прописаний назавжди
Повідомлень: 312
| Цитата swetikccc (  ) Не використовуючи циклів З циклами задача проста, а от не використовувати цикли - то вже головний біль. Є обмеження на введене число? Яким чином організувати виведення, якщо число досить велике? Все одно повинен повторюватися оператор виведення, не писати ж його тисячу(умовно кажучи) разів у тексті програми? Гратися з динамічними масивами? Поки, що на думку не приходить нічого...
|
|
| |
swetikccc |
Дата: Th, 11.06.2015, 08:21 | Повідомлення № 85 |
Ветеран спілкування
Повідомлень: 4208
| Цитата Пилипчук_О_П (  ) Сподіваюсь, goto і рекурсія теж не використовуються? 100% попадання. Якраз з дітками вчили рекурсію, чудовий приклад на "занурення" функції в себе, також згадали були і "нехороший" goto. Для демонстрації рекурсії просто навожу вебку на монітор.
|
|
| |
Bandalak |
Дата: Fr, 16.11.2018, 16:04 | Повідомлення № 86 |
Лідер форуму
Повідомлень: 6386
| Цікава задача:

Код Скільки точок з цілочисельними координатами знаходиться у крузі радіусом r? Точка, що знаходиться на колі, вважається належною кругу. Центр кола має цілочисельні координати. Вхідні дані Цілочисельний радіус кола r (1 <= r <= 20000). Вихідні дані Вивести шукану кількість точок. Приклад: Вхідні дані Вихідні дані 2 13
Я зробив методом прямого перебору.
Код var x,y,r,k:longint; begin readln(r); k:=0; for x:=-r to r do for y:=-r to r do if x*x+y*y <= r*r then k:=k+1; writeln(k) end.
Але для великих радіусів програма виконується протягом неадекватно великого проміжку часу.
Підкажіть, будь-ласка, оптимізований алгоритм.
|
|
| |
vasmaz |
Дата: Fr, 16.11.2018, 18:49 | Повідомлення № 87 |
Часто заходить...
Повідомлень: 79
| На осях буде 4r+1 точка. В циклі порахувати точки тільки в І чверті координатної площини, які не лежать на осях (для 0<x<r, 0<y<r), помножити на 4 і додати точки на осях. Час виконання програми скоротиться.
Відредаговано: vasmaz - Fr, 16.11.2018, 18:49 |
|
| |
Bandalak |
Дата: Fr, 16.11.2018, 19:29 | Повідомлення № 88 |
Лідер форуму
Повідомлень: 6386
| Цитата vasmaz (  ) В циклі порахувати точки тільки в І чверті координатної площини Думаю циклу достатньо одного. Наприклад х ганяти від 1 до R, а у рахувати по формулі половини рівняння кола і взяти цілу частину?
|
|
| |
Bandalak |
Дата: Fr, 16.11.2018, 19:41 | Повідомлення № 89 |
Лідер форуму
Повідомлень: 6386
| Вийшло просто і красиво!
Код [b]var x,y,r,k:longint; begin readln(r); k:=0; for x:=1 to r-1 do begin y:=trunc(sqrt(r*r-x*x)); k:=k+y end; writeln(4*k+4*r+1) end.[/b]
vasmaz, дякую за ідею!
|
|
| |
Пилипчук_О_П |
Дата: Sa, 17.11.2018, 12:18 | Повідомлення № 90 |
Ветеран спілкування
Повідомлень: 4330
| Цитата Bandalak (  ) Підкажіть, будь-ласка, оптимізований алгоритм.
Цитата Bandalak (  ) Наприклад х ганяти від 1 до R, Від R зменшувати, доки знайдеться перша точка, що в колі. Її координата +1 - число точок у відповідному рядку.
|
|
| |
© Форум інформатиків України, 2007-2022.  |