Как сделать песочные часы в паскале из

Обновлено: 04.07.2024

Подружке в институте на первом курсе задали задачку:
В C/C++ изобразить песочные часы. Работа с графикой.
Привести часики в действие

Попросила помочь, сам по Visual Basic и PHP, прийдется С почитать, признаюсь мне интересно.
Первые шаги с матрицами, массивами и сортировками осилил.

А вот с графикой даже не знаю, в Паскале как то баловался.

Есть может у кого то похожий готовый скрипт? Что бы посмотреть как вооще графика в C++ организована?

Artem-Samsung а что хоть подружка учит? Под Вин32 или может Дос?
Если для Доса и среды Борланд вот такой нехитрый исходник. Может послужить шаблоном для дальнейшей работы.

Из всего кода песочные часы рисуют четыре строчки с оператором line, всё остальное обслуживающий код.

06. Часы на PascalABC

Для работы программы необходим файл с рисунком циферблата ( скачать ).

Рассмотрим код программы:

Program Timer;
uses crt, GraphABC;
var pic, x0,y0, x,y, R, min, sec : integer;
begin
SetWindowSize(360,480);
HideCursor;
x0:=173; y0:=300; min:=0; sec:=0;
pic:=LoadPicture('timer.jpg');

DrawPicture(pic,0,0,360,480); // Рисование циферблата
sec:=sec+1;

min:= sec div 60; // секунды и минуты
x:=x0+Round(120*sin(Pi*sec/30));
y:=y0-Round(120*cos(Pi*sec/30));
SetPenWidth(3);

Line(x0, y0, x, y); // секундная стрелка
x:=x0+Round(100*sin(Pi*min/30));
y:=y0-Round(100*cos(Pi*min/30));
SetPenWidth(7);

Line(x0, y0, x, y); // минутная стрелка
sleep(1000);
until (min>=60) or keyPressed;
end.


Теперь разберемся как она работает.

Во-первых программа использует два модуля: модуль CRT - для запуска программы в отдельном окне. Во-вторых модуль GraphABC - для того, чтобы можно было вырисовывать минутную и секундную стрелки.

Загрузка изображения часов осуществляется в два этапа: сначала с файлом изображения связывается идентификатор изображения (в нашем случае это pic ). Это делается следующим оператором: pic:=LoadPicture('timer.jpg');

Далее уже в цикле происходит прорисовка изображения : DrawPicture(pic,0,0,360,480);

Оператор HideCursor; "прячет" курсор, который всегда "моргает" в левом верхнем углу окна.

Оператор x0:=173; y0:=300; min:=0; sec:=0; устанавливает центр циферблата - точку, откуда будут рисоваться стрелки, а ткже устанавливает начальное значение минут и секунд в ноль.

Работа цикла с постусловием.

Цикл repeat. until (min>=60) or keyPressed; работает пока количество минут не превысит 60 или не будет нажата какая-либо из клавиш клавиатуры.

Что происходит в теле цикла.

1. Прорисовка часов: DrawPicture(pic,0,0,360,480);

2. Увеличение количества секунд на 1: sec:=sec+1;

3. Расчет количества минут: min:= sec div 60;

4. Расчет конечных координат x и у для секундрой стрелки :

5. Прорисовка линии секундной стрелки: SetPenWidth(3); Line(x0, y0, x, y);

6. Расчет конечных координат х и у для минутной стрелки:

7. Прорисовка линии минутной стрелки: SetPenWidth(7); Line(x0, y0, x, y);

8. Задержка работы программы на 1 секунду: sleep(1000);

Небольшой видеофрагмент поможет еще досканельнее разобраться в работе программы:

Видеоурок:

Как добавить часовую стрелку в часы?

1. В области описания переменных добавить еще одну, отвечающую за количество часов, например hour .

2. После расчета количества минут добавить строку для расчета количества часов на основе количества минут:

hour:= min div 12; (здесь делим нацело уже не на 60, а на 12, т.к. часовая стрелка за один полный оборот минутной стрелки должна сместиться не на одно, а на 5 делений);

3. Далее необходимо по аналогии с секундной и минутной стрелками сделать перерасчет количества часов в координаты конца стрелки x и y. В этом же блоке необходимо учесть, что часовая стрелка должна быть еще короче минутной:

4. Выставить толщину и цвет часовой стрелки и провести линию, изображающую часовую стрелку.

5. Для того, чтобы пронаблюдать ход часов в ускоренном виде, необходимо сократить задержку с 1000 ms до 10m: sleep(10);

Как новичок, это мой девственный блог.Я также прошу больших парней критиковать и давать советы.

Я лично считаю, что независимо от того, какая это сложная программа, ее можно разделить на простые шаги, шаг за шагом. На самом деле, это легко понять независимо от следующих шагов. Возвращаясь к сути, это очень простой алгоритм песочных часов, возможно, мои шаги Это сложнее. Мой принцип - стараться не определять сторонние переменные в процессе, за исключением переменных цикла в теле цикла. Конечно, это моя точка зрения новичка.

(1) Прежде всего, мы должны продумать весь этап завершения песочных часов. Не говоря уже о демонтаже и демонтаже всего этапа завершения песочных часов на верхнюю и нижнюю части (обратите внимание, почему верхняя, средняя и нижняя части здесь не разделены из-за звездочки посередине) Он соответствует как правилам в верхней части, так и правилам в нижней части), а затем разделяет выходную часть на две части, выходные звездочки и пробелы, так что общая идея была передана.

(2) Поскольку в соответствии с законом выводится несколько строк данных, внешний цикл - это количество строк, которые необходимо зациклить (ширина песочных часов - это высота, поэтому вес здесь высокий. Обратите внимание, что переменная цикла i здесь начинается с 0 из).

(3) Условия разделения на верхнюю и нижнюю части определяются исходя из половины высоты песочных часов, так что распределяется задача разделения песочных часов на верхнюю и нижнюю части.

(4) Затем выведите * и пробелы в соответствии с условиями в соответствии с разницей между верхней и нижней частями (условия здесь требуют небольшого математического мышления от старших братьев)

(5) Сначала верхняя часть:

1. Характеристики каждой строки пробелов: начальная строка не выводится, а каждая последующая строка выводит еще один пробел (до половины от общего количества строк). Примечание (для новичков): цикл for здесь означает: вывести указанное пространство. Поскольку внешний цикл начинается с 0 и увеличивается на 1 каждый раз, он согласуется с нашим начальным значением и изменением количества пробелов. Строка 0 (здесь 0 - действительная строка 1) i равно 0, тогда j

Интеллектуальная рекомендация


Mongodb Foundation, Документация, Пользователь

Сравнение SQL и MongoDB, разные точки Запрос базы данных Показать запрос DBS Все данные ДБ отображает текущую базу данных 2. Создайте базу данных use Database_Name Без этой библиотеки автоматич.


TP5 использует SDK Express 100

Рендеринг запросов По коду Код контроллера Экспресс 100 код 2 способа получения экспресс-информации (с расширением curl и без curl), Если у вас есть расширение curl, вы можете просто скопировать класс.


Серия руководств по Webpack4 (3): многостраничное решение - извлечение открытого кода

Объясните в этом урокеwebpack4В процессе упаковки многостраничных приложенийИзвлечь открытый кодРаздел. По сравнению сwebpack3,4.0Для версииoptimization.splitChunksКонфигурация заменена3.0ВерсияCommon.

LeetCode-448. Найти все пропущенные числа в массиве

титульный Для целочисленного массива с диапазоном 1 ≤ a [i] ≤ n (n = размер массива) некоторые элементы в массиве появляются дважды, а другие - только один раз. Найти все числа, которые не появл.

Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=] _____ [Поиск] _____ [Литература по С++] ____ [Литература. Паскаль]

просто мы в основном Паскаль изучаем.особой разницы ведь между паскалем и Делфи нет.просто сказали на Паскале

ЯН_КА, ну, вообще говоря, если речь идет о кнопке, то разница есть. И существенная.
Быть может, все-таки имелась в виду не реальная кнопка, а возможность запуска по нажатию на клавишу..

Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=] _____ [Поиск] _____ [Литература по С++] ____ [Литература. Паскаль]

да!например,нажимаешь цифру 1 на клавиатуре,и часы пошли.а вот как редактировать время я вообще не могу понять

Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=] _____ [Поиск] _____ [Литература по С++] ____ [Литература. Паскаль]

Для работы с графикой в pascal abc используется модуль GraphABC. Для его подключения используется следующий код:

uses GraphABC; begin . end.

Система координат в Паскале соответствует экранной системе координат и выглядит следующим образом:

Система координат в паскале

Управление цветом

Для того, чтобы использовать цвет, необходимо применить этот цвет к инструменту перо:

  • SetPenColor(color) — устанавливает цвет пера, задаваемый параметром color;
  • setBrushColor(color) — устанавливает цвет кисти, задаваемый параметром color;
  • либо для палитры RGB: SetPenColor(rgb(0-255, 0-255, 0-255));

или использовать для заливки:

После чего можно использовать процедуры для рисования геометрических фигур.

clBlack – черный
clPurple – фиолетовый
clWhite – белый
clMaroon – темно-красный
clRed – красный
clNavy – темно-синий
clGreen – зеленый
clBrown – коричневый
clBlue – синий
clSkyBlue – голубой
clYellow – желтый
clCream – кремовый
clAqua – бирюзовый
clOlive – оливковый
clFuchsia – сиреневый
clTeal – сине-зеленый
clGray – темно-серый
clLime – ярко-зеленый
clMoneyGreen – цвет зеленых денег
clLtGray – светло-серый
clDkGray – темно-серый
clMedGray – серый
clSilver – серебряный

Точки, отрезки и ломаные

Для отображения точки в паскале используется процедура:

точки в паскале

uses GraphABC; begin SetPixel(300,200,clred); end.

Для рисования линии используется:

паскаль линия

uses GraphABC; begin SetPenColor(clgreen); line(100,50,500,250); end.

ломаные в паскале

Ломаные можно рисовать с помощью процедур MoveTo (x1, y1) и LineTo (x2, y2) .
Процедуры работают в паре: MoveTo передвигает курсор в определенную точку, а процедура LineTo рисует линию с этой точки до точки, определенной параметром данной процедуры.

uses GraphABC; begin . SetPenColor(clblue); MoveTo (x1, y1); LineTo (x2, y2); LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5); end.

Задание 0: При помощи операторов SetPenColor(), LineTo (x2, y2) и MoveTo (x1, y1) нарисовать квадрат и равносторонний треугольник.

[Название файла: L4_2task0.pas ]

Для установки размеров графического окна используется процедура

Рисование фигур

прямоугольник в паскале

uses GraphABC; begin Rectangle(50,50,200,200); end.

Фигуры с заливкой

uses GraphABC; begin Rectangle(50,50,200,200); FloodFill(100,100,clBlue); end.

Line(x1,y1,x2,y2);
LineTo(x,y);

треугольник в паскале

uses GraphABC; begin setpenwidth(20); setpencolor(clred); moveTo(300,100); lineTo(500,300); lineto(100,300); lineto(300,100); floodfill(300,200,clgreen); end.

круг в паскале

uses GraphABC; begin Circle(500,200,100); FloodFill(500,200,clred); end.

Дуга окружности

uses GraphABC; Begin SetPenWidth(10); Arc(300,250,150,45,135); end.

[Название файла: L4_2task1.pas ]

[Название файла: L4_2task2.pas ]

Функция random для использования окраски

Задание 3: Нарисовать горизонтальный ряд окружностей радиусом 10 на расстоянии 100 от верхнего края экрана и с такими горизонтальными координатами 50, 80, 110, 140, … , 290.

* раскрасить круги случайным цветом

[Название файла: L4_2task3.pas ]

[Название файла: L4_2task4.pas ]

графика паскаль abc.net

Задание 5:
Воспроизвести изображение при помощи программы:

[Название файла: L4_2task5.pas ]

алгоритм штриховки на паскале

Нарисовать штриховку на Паскале можно, используя процедуры рисования прямоугольника и линии:

Программа будет выглядеть следующим образом:

1_1

uses graphABC; var i, x1, x2, y1, y2, N: integer; h, x: real; begin x1 := 100; y1 := 100; x2 := 300; y2 := 200; N := 10; Rectangle (x1, y1, x2, y2); h := (x2 - x1) / (N + 1); x := x1 + h; for i:=1 to N do begin Line(round(x), y1, round(x), y2); x := x + h; end; end.

[Название файла: L4_2task6.pas ]

Анимация в Паскале

Анимация в программировании заключается в том, что сначала рисуется фигура цветным инструментом, затем с тем же координатами рисуется та же фигура белым цветом. После чего происходит сдвиг фигуры и действия повторяются.

uses GraphABC; var x:integer; begin x:=40; repeat SetPenColor(clWhite); Circle(x,100,10); SetPenColor(clBlack); Circle(x,100,10); x:=x+1 until x>600; end.


Задание 7: Выполнить анимацию движения квадрата по следующей траектории:

Читайте также: