FahrenheitToCelsius — Функция Delphi

Клуб программистов

Delphi programming

Подписаться на рассылку:

FahrenheitToCelsius

конвертирует значение температуры из Фаренгейта в Цельсия

|| function FahrenheitToCelsius ( const FahrenheitValue : Double ) : Double;

Описание:

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

Пример кода:

var
celsius, fahrenheit : Double;

begin
// Define the fahrenheit value
fahrenheit := 98.4; // Human body temperature

// Convert to celsius
celsius := FahrenheitToCelsius(fahrenheit);

// Show both values
ShowMessageFmt(‘%f F = %f C’,[fahrenheit, celsius]);
end;

Функции Delphi

Предлагаем список функций смешанных модулей, используемых в среде разработки Delphi.

Модуль Classes

Bounds Передаёт координаты вершин объекта типа TRect (прямоугольник)
Point Генерирует значение TPoint из значений X и Y
PointsEqual Сравнивает два значения TPoint на предмет равенства
Rect Создаёт величину TRect с указанием 2 точек или 4 координат

Модуль StdConvs

CelsiusToFahrenheit Конвертирует значение температуры из Цельсия в Фаренгейта
FahrenheitToCelsius Конвертирует температуру из Фаренгейта в Цельсий

Модуль FileCtrl

SelectDirectory Выводит диалоговое окно, с помощью которого пользователь может выбрать директорию
ProcessPath Разделяет строку диск/путь/имя файла на ее составляющие части

Модуль ConvUtils

Convert Преобразует одну величину измерения в другую

Модуль Types

PtInRect Проверяет, находится ли точка в пределах прямоугольника

Модуль Variants

VarType Возвращает текущий тип Variant переменной

Printer Возвращает ссылку к глобальному объекту Printer

AssignPrn Обрабатывает принтер как текстовый файл — простой способ печати текста

Преобразование Цельсия в Фаренгейт и наоборот в Delphi

Я изучаю Delphi, по какой-то причине они используют этот старый язык, но в любом случае. Мне нужно создать приложение Погода, которое преобразует градусы Цельсия и Фаренгейта.

Пользователь должен ввести погоду 7 дней, но в этом примере я просто хочу выяснить, день 1

Итак, я в первую очередь создал радио-кнопки для выбора Цельсия и Фаренгейта, затем, если они выбирают Цельсия, я должен конвертировать Цельсий в Фаренгейт, а если они выбирают Фаренгейт, я должен конвертировать его в Цельсий.

Итак, это мой код:

Выдает ошибку в fedDay1. Это плавающий спин.

4 ответа

Вы не можете назначить SpinEdit переменной напрямую. Вы должны использовать значение.

Ваш код должен только выполнить необходимое преобразование, поскольку Day1 уже будет иметь один из них. Так что, если пользователь ввел значение в градусах Цельсия, вам нужно всего лишь конвертировать из градусов Цельсия в градусы Фаренгейта. Если они ввели значение по Фаренгейту, вам нужно всего лишь конвертировать из Фаренгейта в Цельсий.

Если вы используете последнюю версию Delphi (в Delphi 2007 они есть, и они могут вернуться к Delphi 5), модуль StdConvs имеет предопределенные функции, которые вы можете использовать для преобразований:

Правильный способ решить эту проблему — создать функцию для преобразования из градуса Цельсия в градусы Фаренгейта, а другую — для преобразования в обратном направлении.

Основная ошибка в вашем коде заключается в том, что fedDay1 — это не значение с плавающей запятой, а элемент управления GUI. Таким образом, вам нужно прочитать значение из элемента управления с помощью fedDay1.Value .

Тогда вы можете написать свой код обновления GUI гораздо более аккуратно:

Вы не можете назначить счетчик на двойной. Вы должны получить ценность от этого.

У вас есть функция CelsiusToFahrenheit . Ваш код нуждается в некоторых модификациях, чтобы иметь функциональное приложение.

FahrenheitToCelsius Routine

Description

(Please provide a description in your own words. It is illegal to use the wording from the Delphi Help.)

Technical Comments

(Known issues / Documentation clarifications / Things to be aware of)

Examples

(Please provide links to articles/source code that show how to use this item.)

See Also

(Please provide links to items specifically related to this item.)

User Comments/Tips

(Please leave your name with your comment.)

Таблица перевода градусов Фаренгейта в Цельсия (°F в °C)

Формула для перевода:

°C = (°F -32) / 1,8 или наоборот °F = (°C * 1,8) + 32

Пример: Скольким градусам Цельсия равен 451 градус по Фаренгейту?

°C = (°F -32) / 1,8= (451-32)/1,8 = 419/1,8 =232,77

Таблица перевода температуры по шкале Фаренгейта в градусы Цельсия (от -459 до 2000 с шагом в 1)

Фаренгейты (°F) Цельсия (°C)
-459,67 -273,15
-459 -272,7777778
-458 -272,2222222
-457 -271,6666667
-456 -271,1111111
-455 -270,5555556
-454 -270
-453 -269,4444444
-452 -268,8888889
-451 -268,3333333
-450 -267,7777778
-449 -267,2222222
-448 -266,6666667
-447 -266,1111111
-446 -265,5555556
-445 -265
-444 -264,4444444
-443 -263,8888889
-442 -263,3333333
-441 -262,7777778
-440 -262,2222222
-439 -261,6666667
-438 -261,1111111
-437 -260,5555556
-436 -260
-435 -259,4444444
-434 -258,8888889
-433 -258,3333333
-432 -257,7777778
-431 -257,2222222
-430 -256,6666667
-429 -256,1111111
-428 -255,5555556
-427 -255
-426 -254,4444444
-425 -253,8888889
-424 -253,3333333
-423 -252,7777778
-422 -252,2222222
-421 -251,6666667
-420 -251,1111111
-419 -250,5555556
-418 -250
-417 -249,4444444
-416 -248,8888889
-415 -248,3333333
-414 -247,7777778
-413 -247,2222222
-412 -246,6666667
-411 -246,1111111
-410 -245,5555556
-409 -245
-408 -244,4444444
-407 -243,8888889
-406 -243,3333333
-405 -242,7777778
-404 -242,2222222
-403 -241,6666667
-402 -241,1111111
-401 -240,5555556
-400 -240
-399 -239,4444444
-398 -238,8888889
-397 -238,3333333
-396 -237,7777778
-395 -237,2222222
-394 -236,6666667
-393 -236,1111111
-392 -235,5555556
-391 -235
-390 -234,4444444
-389 -233,8888889
-388 -233,3333333
-387 -232,7777778
-386 -232,2222222
-385 -231,6666667
-384 -231,1111111
-383 -230,5555556
-382 -230
-381 -229,4444444
-380 -228,8888889
-379 -228,3333333
-378 -227,7777778
-377 -227,2222222
-376 -226,6666667
-375 -226,1111111
-374 -225,5555556
-373 -225
-372 -224,4444444
-371 -223,8888889
-370 -223,3333333
-369 -222,7777778
-368 -222,2222222
-367 -221,6666667
-366 -221,1111111
-365 -220,5555556
-364 -220
-363 -219,4444444
-362 -218,8888889
-361 -218,3333333
-360 -217,7777778
-359 -217,2222222
-358 -216,6666667
-357 -216,1111111
-356 -215,5555556
-355 -215
-354 -214,4444444
-353 -213,8888889
-352 -213,3333333
-351 -212,7777778
-350 -212,2222222
-349 -211,6666667
-348 -211,1111111
-347 -210,5555556
-346 -210
-345 -209,4444444
-344 -208,8888889
-343 -208,3333333
-342 -207,7777778
-341 -207,2222222
-340 -206,6666667
-339 -206,1111111
-338 -205,5555556
-337 -205
-336 -204,4444444
-335 -203,8888889
-334 -203,3333333
-333 -202,7777778
-332 -202,2222222
-331 -201,6666667
-330 -201,1111111
-329 -200,5555556
-328 -200
-327 -199,4444444
-326 -198,8888889
-325 -198,3333333
-324 -197,7777778
-323 -197,2222222
-322 -196,6666667
-321 -196,1111111
-320 -195,5555556
-319 -195
-318 -194,4444444
-317 -193,8888889
-316 -193,3333333
-315 -192,7777778
-314 -192,2222222
-313 -191,6666667
-312 -191,1111111
-311 -190,5555556
-310 -190
-309 -189,4444444
-308 -188,8888889
-307 -188,3333333
-306 -187,7777778
-305 -187,2222222
-304 -186,6666667
-303 -186,1111111
-302 -185,5555556
-301 -185
-300 -184,4444444
-299 -183,8888889
-298 -183,3333333
-297 -182,7777778
-296 -182,2222222
-295 -181,6666667
-294 -181,1111111
-293 -180,5555556
-292 -180
-291 -179,4444444
-290 -178,8888889
-289 -178,3333333
-288 -177,7777778
-287 -177,2222222
-286 -176,6666667
-285 -176,1111111
-284 -175,5555556
-283 -175
-282 -174,4444444
-281 -173,8888889
-280 -173,3333333
-279 -172,7777778
-278 -172,2222222
-277 -171,6666667
-276 -171,1111111
-275 -170,5555556
-274 -170
-273 -169,4444444
-272 -168,8888889
-271 -168,3333333
-270 -167,7777778
-269 -167,2222222
-268 -166,6666667
-267 -166,1111111
-266 -165,5555556
-265 -165
-264 -164,4444444
-263 -163,8888889
-262 -163,3333333
-261 -162,7777778
-260 -162,2222222
-259 -161,6666667
-258 -161,1111111
-257 -160,5555556
-256 -160
-255 -159,4444444
-254 -158,8888889
-253 -158,3333333
-252 -157,7777778
-251 -157,2222222
-250 -156,6666667
-249 -156,1111111
-248 -155,5555556
-247 -155
-246 -154,4444444
-245 -153,8888889
-244 -153,3333333
-243 -152,7777778
-242 -152,2222222
-241 -151,6666667
-240 -151,1111111
-239 -150,5555556
-238 -150
-237 -149,4444444
-236 -148,8888889
-235 -148,3333333
-234 -147,7777778
-233 -147,2222222
-232 -146,6666667
-231 -146,1111111
-230 -145,5555556
-229 -145
-228 -144,4444444
-227 -143,8888889
-226 -143,3333333
-225 -142,7777778
-224 -142,2222222
-223 -141,6666667
-222 -141,1111111
-221 -140,5555556
-220 -140
-219 -139,4444444
-218 -138,8888889
-217 -138,3333333
-216 -137,7777778
-215 -137,2222222
-214 -136,6666667
-213 -136,1111111
-212 -135,5555556
-211 -135
-210 -134,4444444
-209 -133,8888889
-208 -133,3333333
-207 -132,7777778
-206 -132,2222222
-205 -131,6666667
-204 -131,1111111
-203 -130,5555556
-202 -130
-201 -129,4444444
-200 -128,8888889
-199 -128,3333333
-198 -127,7777778
-197 -127,2222222
-196 -126,6666667
-195 -126,1111111
-194 -125,5555556
-193 -125
-192 -124,4444444
-191 -123,8888889
-190 -123,3333333
-189 -122,7777778
-188 -122,2222222
-187 -121,6666667
-186 -121,1111111
-185 -120,5555556
-184 -120
-183 -119,4444444
-182 -118,8888889
-181 -118,3333333
-180 -117,7777778
-179 -117,2222222
-178 -116,6666667
-177 -116,1111111
-176 -115,5555556
-175 -115
-174 -114,4444444
-173 -113,8888889
-172 -113,3333333
-171 -112,7777778
-170 -112,2222222
-169 -111,6666667
-168 -111,1111111
-167 -110,5555556
-166 -110
-165 -109,4444444
-164 -108,8888889
-163 -108,3333333
-162 -107,7777778
-161 -107,2222222
-160 -106,6666667
-159 -106,1111111
-158 -105,5555556
-157 -105
-156 -104,4444444
-155 -103,8888889
-154 -103,3333333
-153 -102,7777778
-152 -102,2222222
-151 -101,6666667
-150 -101,1111111
-149 -100,5555556
-148 -100
-147 -99,44444444
-146 -98,88888889
-145 -98,33333333
-144 -97,77777778
-143 -97,22222222
-142 -96,66666667
-141 -96,11111111
-140 -95,55555556
-139 -95
-138 -94,44444444
-137 -93,88888889
-136 -93,33333333
-135 -92,77777778
-134 -92,22222222
-133 -91,66666667
-132 -91,11111111
-131 -90,55555556
-130 -90
-129 -89,44444444
-128 -88,88888889
-127 -88,33333333
-126 -87,77777778
-125 -87,22222222
-124 -86,66666667
-123 -86,11111111
-122 -85,55555556
-121 -85
-120 -84,44444444
-119 -83,88888889
-118 -83,33333333
-117 -82,77777778
-116 -82,22222222
-115 -81,66666667
-114 -81,11111111
-113 -80,55555556
-112 -80
-111 -79,44444444
-110 -78,88888889
-109 -78,33333333
-108 -77,77777778
-107 -77,22222222
-106 -76,66666667
-105 -76,11111111
-104 -75,55555556
-103 -75
-102 -74,44444444
-101 -73,88888889
-100 -73,33333333
-99 -72,77777778
-98 -72,22222222
-97 -71,66666667
-96 -71,11111111
-95 -70,55555556
-94 -70
-93 -69,44444444
-92 -68,88888889
-91 -68,33333333
-90 -67,77777778
-89 -67,22222222
-88 -66,66666667
-87 -66,11111111
-86 -65,55555556
-85 -65
-84 -64,44444444
-83 -63,88888889
-82 -63,33333333
-81 -62,77777778
-80 -62,22222222
-79 -61,66666667
-78 -61,11111111
-77 -60,55555556
-76 -60
-75 -59,44444444
-74 -58,88888889
-73 -58,33333333
-72 -57,77777778
-71 -57,22222222
-70 -56,66666667
-69 -56,11111111
-68 -55,55555556
-67 -55
-66 -54,44444444
-65 -53,88888889
-64 -53,33333333
-63 -52,77777778
-62 -52,22222222
-61 -51,66666667
-60 -51,11111111
-59 -50,55555556
-58 -50
-57 -49,44444444
-56 -48,88888889
-55 -48,33333333
-54 -47,77777778
-53 -47,22222222
-52 -46,66666667
-51 -46,11111111
-50 -45,55555556
-49 -45
-48 -44,44444444
-47 -43,88888889
-46 -43,33333333
-45 -42,77777778
-44 -42,22222222
-43 -41,66666667
-42 -41,11111111
-41 -40,55555556
-40 -40
-39 -39,44444444
-38 -38,88888889
-37 -38,33333333
-36 -37,77777778
-35 -37,22222222
-34 -36,66666667
-33 -36,11111111
-32 -35,55555556
-31 -35
-30 -34,44444444
-29 -33,88888889
-28 -33,33333333
-27 -32,77777778
-26 -32,22222222
-25 -31,66666667
-24 -31,11111111
-23 -30,55555556
-22 -30
-21 -29,44444444
-20 -28,88888889
-19 -28,33333333
-18 -27,77777778
-17 -27,22222222
-16 -26,66666667
-15 -26,11111111
-14 -25,55555556
-13 -25
-12 -24,44444444
-11 -23,88888889
-10 -23,33333333
-9 -22,77777778
-8 -22,22222222
-7 -21,66666667
-6 -21,11111111
-5 -20,55555556
-4 -20
-3 -19,44444444
-2 -18,88888889
-1 -18,33333333
-17,77777778
1 -17,22222222
2 -16,66666667
3 -16,11111111
4 -15,55555556
5 -15
6 -14,44444444
7 -13,88888889
8 -13,33333333
9 -12,77777778
10 -12,22222222
11 -11,66666667
12 -11,11111111
13 -10,55555556
14 -10
15 -9,444444444
16 -8,888888889
17 -8,333333333
18 -7,777777778
19 -7,222222222
20 -6,666666667
21 -6,111111111
22 -5,555555556
23 -5
24 -4,444444444
25 -3,888888889
26 -3,333333333
27 -2,777777778
28 -2,222222222
29 -1,666666667
30 -1,111111111
31 -0,555555556
32
33 0,555555556
34 1,111111111
35 1,666666667
36 2,222222222
37 2,777777778
38 3,333333333
39 3,888888889
40 4,444444444
41 5
42 5,555555556
43 6,111111111
44 6,666666667
45 7,222222222
46 7,777777778
47 8,333333333
48 8,888888889
49 9,444444444
50 10
51 10,55555556
52 11,11111111
53 11,66666667
54 12,22222222
55 12,77777778
56 13,33333333
57 13,88888889
58 14,44444444
59 15
60 15,55555556
61 16,11111111
62 16,66666667
63 17,22222222
64 17,77777778
65 18,33333333
66 18,88888889
67 19,44444444
68 20
69 20,55555556
70 21,11111111
71 21,66666667
72 22,22222222
73 22,77777778
74 23,33333333
75 23,88888889
76 24,44444444
77 25
78 25,55555556
79 26,11111111
80 26,66666667
81 27,22222222
82 27,77777778
83 28,33333333
84 28,88888889
85 29,44444444
86 30
87 30,55555556
88 31,11111111
89 31,66666667
90 32,22222222
91 32,77777778
92 33,33333333
93 33,88888889
94 34,44444444
95 35
96 35,55555556
97 36,11111111
98 36,66666667
99 37,22222222
100 37,77777778
101 38,33333333
102 38,88888889
103 39,44444444
104 40
105 40,55555556
106 41,11111111
107 41,66666667
108 42,22222222
109 42,77777778
110 43,33333333
111 43,88888889
112 44,44444444
113 45
114 45,55555556
115 46,11111111
116 46,66666667
117 47,22222222
118 47,77777778
119 48,33333333
120 48,88888889
121 49,44444444
122 50
123 50,55555556
124 51,11111111
125 51,66666667
126 52,22222222
127 52,77777778
128 53,33333333
129 53,88888889
130 54,44444444
131 55
132 55,55555556
133 56,11111111
134 56,66666667
135 57,22222222
136 57,77777778
137 58,33333333
138 58,88888889
139 59,44444444
140 60
141 60,55555556
142 61,11111111
143 61,66666667
144 62,22222222
145 62,77777778
146 63,33333333
147 63,88888889
148 64,44444444
149 65
150 65,55555556
151 66,11111111
152 66,66666667
153 67,22222222
154 67,77777778
155 68,33333333
156 68,88888889
157 69,44444444
158 70
159 70,55555556
160 71,11111111
161 71,66666667
162 72,22222222
163 72,77777778
164 73,33333333
165 73,88888889
166 74,44444444
167 75
168 75,55555556
169 76,11111111
170 76,66666667
171 77,22222222
172 77,77777778
173 78,33333333
174 78,88888889
175 79,44444444
176 80
177 80,55555556
178 81,11111111
179 81,66666667
180 82,22222222
181 82,77777778
182 83,33333333
183 83,88888889
184 84,44444444
185 85
186 85,55555556
187 86,11111111
188 86,66666667
189 87,22222222
190 87,77777778
191 88,33333333
192 88,88888889
193 89,44444444
194 90
195 90,55555556
196 91,11111111
197 91,66666667
198 92,22222222
199 92,77777778
200 93,33333333
201 93,88888889
202 94,44444444
203 95
204 95,55555556
205 96,11111111
206 96,66666667
207 97,22222222
208 97,77777778
209 98,33333333
210 98,88888889
211 99,44444444
212 100
213 100,5555556
214 101,1111111
215 101,6666667
216 102,2222222
217 102,7777778
218 103,3333333
219 103,8888889
220 104,4444444
221 105
222 105,5555556
223 106,1111111
224 106,6666667
225 107,2222222
226 107,7777778
227 108,3333333
228 108,8888889
229 109,4444444
230 110
231 110,5555556
232 111,1111111
233 111,6666667
234 112,2222222
235 112,7777778
236 113,3333333
237 113,8888889
238 114,4444444
239 115
240 115,5555556
241 116,1111111
242 116,6666667
243 117,2222222
244 117,7777778
245 118,3333333
246 118,8888889
247 119,4444444
248 120
249 120,5555556
250 121,1111111
251 121,6666667
252 122,2222222
253 122,7777778
254 123,3333333
255 123,8888889
256 124,4444444
257 125
258 125,5555556
259 126,1111111
260 126,6666667
261 127,2222222
262 127,7777778
263 128,3333333
264 128,8888889
265 129,4444444
266 130
267 130,5555556
268 131,1111111
269 131,6666667
270 132,2222222
271 132,7777778
272 133,3333333
273 133,8888889
274 134,4444444
275 135
276 135,5555556
277 136,1111111
278 136,6666667
279 137,2222222
280 137,7777778
281 138,3333333
282 138,8888889
283 139,4444444
284 140
285 140,5555556
286 141,1111111
287 141,6666667
288 142,2222222
289 142,7777778
290 143,3333333
291 143,8888889
292 144,4444444
293 145
294 145,5555556
295 146,1111111
296 146,6666667
297 147,2222222
298 147,7777778
299 148,3333333
300 148,8888889
301 149,4444444
302 150
303 150,5555556
304 151,1111111
305 151,6666667
306 152,2222222
307 152,7777778
308 153,3333333
309 153,8888889
310 154,4444444
311 155
312 155,5555556
313 156,1111111
314 156,6666667
315 157,2222222
316 157,7777778
317 158,3333333
318 158,8888889
319 159,4444444
320 160
321 160,5555556
322 161,1111111
323 161,6666667
324 162,2222222
325 162,7777778
326 163,3333333
327 163,8888889
328 164,4444444
329 165
330 165,5555556
331 166,1111111
332 166,6666667
333 167,2222222
334 167,7777778
335 168,3333333
336 168,8888889
337 169,4444444
338 170
339 170,5555556
340 171,1111111
341 171,6666667
342 172,2222222
343 172,7777778
344 173,3333333
345 173,8888889
346 174,4444444
347 175
348 175,5555556
349 176,1111111
350 176,6666667
351 177,2222222
352 177,7777778
353 178,3333333
354 178,8888889
355 179,4444444
356 180
357 180,5555556
358 181,1111111
359 181,6666667
360 182,2222222
361 182,7777778
362 183,3333333
363 183,8888889
364 184,4444444
365 185
366 185,5555556
367 186,1111111
368 186,6666667
369 187,2222222
370 187,7777778
371 188,3333333
372 188,8888889
373 189,4444444
374 190
375 190,5555556
376 191,1111111
377 191,6666667
378 192,2222222
379 192,7777778
380 193,3333333
381 193,8888889
382 194,4444444
383 195
384 195,5555556
385 196,1111111
386 196,6666667
387 197,2222222
388 197,7777778
389 198,3333333
390 198,8888889
391 199,4444444
392 200
393 200,5555556
394 201,1111111
395 201,6666667
396 202,2222222
397 202,7777778
398 203,3333333
399 203,8888889
400 204,4444444
401 205
402 205,5555556
403 206,1111111
404 206,6666667
405 207,2222222
406 207,7777778
407 208,3333333
408 208,8888889
409 209,4444444
410 210
411 210,5555556
412 211,1111111
413 211,6666667
414 212,2222222
415 212,7777778
416 213,3333333
417 213,8888889
418 214,4444444
419 215
420 215,5555556
421 216,1111111
422 216,6666667
423 217,2222222
424 217,7777778
425 218,3333333
426 218,8888889
427 219,4444444
428 220
429 220,5555556
430 221,1111111
431 221,6666667
432 222,2222222
433 222,7777778
434 223,3333333
435 223,8888889
436 224,4444444
437 225
438 225,5555556
439 226,1111111
440 226,6666667
441 227,2222222
442 227,7777778
443 228,3333333
444 228,8888889
445 229,4444444
446 230
447 230,5555556
448 231,1111111
449 231,6666667
450 232,2222222
451 232,7777778
452 233,3333333
453 233,8888889
454 234,4444444
455 235
456 235,5555556
457 236,1111111
458 236,6666667
459 237,2222222
460 237,7777778
461 238,3333333
462 238,8888889
463 239,4444444
464 240
465 240,5555556
466 241,1111111
467 241,6666667
468 242,2222222
469 242,7777778
470 243,3333333
471 243,8888889
472 244,4444444
473 245
474 245,5555556
475 246,1111111
476 246,6666667
477 247,2222222
478 247,7777778
479 248,3333333
480 248,8888889
481 249,4444444
482 250
483 250,5555556
484 251,1111111
485 251,6666667
486 252,2222222
487 252,7777778
488 253,3333333
489 253,8888889
490 254,4444444
491 255
492 255,5555556
493 256,1111111
494 256,6666667
495 257,2222222
496 257,7777778
497 258,3333333
498 258,8888889
499 259,4444444
500 260
501 260,5555556
502 261,1111111
503 261,6666667
504 262,2222222
505 262,7777778
506 263,3333333
507 263,8888889
508 264,4444444
509 265
510 265,5555556
511 266,1111111
512 266,6666667
513 267,2222222
514 267,7777778
515 268,3333333
516 268,8888889
517 269,4444444
518 270
519 270,5555556
520 271,1111111
521 271,6666667
522 272,2222222
523 272,7777778
524 273,3333333
525 273,8888889
526 274,4444444
527 275
528 275,5555556
529 276,1111111
530 276,6666667
531 277,2222222
532 277,7777778
533 278,3333333
534 278,8888889
535 279,4444444
536 280
537 280,5555556
538 281,1111111
539 281,6666667
540 282,2222222
541 282,7777778
542 283,3333333
543 283,8888889
544 284,4444444
545 285
546 285,5555556
547 286,1111111
548 286,6666667
549 287,2222222
550 287,7777778
551 288,3333333
552 288,8888889
553 289,4444444
554 290
555 290,5555556
556 291,1111111
557 291,6666667
558 292,2222222
559 292,7777778
560 293,3333333
561 293,8888889
562 294,4444444
563 295
564 295,5555556
565 296,1111111
566 296,6666667
567 297,2222222
568 297,7777778
569 298,3333333
570 298,8888889
571 299,4444444
572 300
573 300,5555556
574 301,1111111
575 301,6666667
576 302,2222222
577 302,7777778
578 303,3333333
579 303,8888889
580 304,4444444
581 305
582 305,5555556
583 306,1111111
584 306,6666667
585 307,2222222
586 307,7777778
587 308,3333333
588 308,8888889
589 309,4444444
590 310
591 310,5555556
592 311,1111111
593 311,6666667
594 312,2222222
595 312,7777778
596 313,3333333
597 313,8888889
598 314,4444444
599 315
600 315,5555556
601 316,1111111
602 316,6666667
603 317,2222222
604 317,7777778
605 318,3333333
606 318,8888889
607 319,4444444
608 320
609 320,5555556
610 321,1111111
611 321,6666667
612 322,2222222
613 322,7777778
614 323,3333333
615 323,8888889
616 324,4444444
617 325
618 325,5555556
619 326,1111111
620 326,6666667
621 327,2222222
622 327,7777778
623 328,3333333
624 328,8888889
625 329,4444444
626 330
627 330,5555556
628 331,1111111
629 331,6666667
630 332,2222222
631 332,7777778
632 333,3333333
633 333,8888889
634 334,4444444
635 335
636 335,5555556
637 336,1111111
638 336,6666667
639 337,2222222
640 337,7777778
641 338,3333333
642 338,8888889
643 339,4444444
644 340
645 340,5555556
646 341,1111111
647 341,6666667
648 342,2222222
649 342,7777778
650 343,3333333
651 343,8888889
652 344,4444444
653 345
654 345,5555556
655 346,1111111
656 346,6666667
657 347,2222222
658 347,7777778
659 348,3333333
660 348,8888889
661 349,4444444
662 350
663 350,5555556
664 351,1111111
665 351,6666667
666 352,2222222
667 352,7777778
668 353,3333333
669 353,8888889
670 354,4444444
671 355
672 355,5555556
673 356,1111111
674 356,6666667
675 357,2222222
676 357,7777778
677 358,3333333
678 358,8888889
679 359,4444444
680 360
681 360,5555556
682 361,1111111
683 361,6666667
684 362,2222222
685 362,7777778
686 363,3333333
687 363,8888889
688 364,4444444
689 365
690 365,5555556
691 366,1111111
692 366,6666667
693 367,2222222
694 367,7777778
695 368,3333333
696 368,8888889
697 369,4444444
698 370
699 370,5555556
700 371,1111111
701 371,6666667
702 372,2222222
703 372,7777778
704 373,3333333
705 373,8888889
706 374,4444444
707 375
708 375,5555556
709 376,1111111
710 376,6666667
711 377,2222222
712 377,7777778
713 378,3333333
714 378,8888889
715 379,4444444
716 380
717 380,5555556
718 381,1111111
719 381,6666667
720 382,2222222
721 382,7777778
722 383,3333333
723 383,8888889
724 384,4444444
725 385
726 385,5555556
727 386,1111111
728 386,6666667
729 387,2222222
730 387,7777778
731 388,3333333
732 388,8888889
733 389,4444444
734 390
735 390,5555556
736 391,1111111
737 391,6666667
738 392,2222222
739 392,7777778
740 393,3333333
741 393,8888889
742 394,4444444
743 395
744 395,5555556
745 396,1111111
746 396,6666667
747 397,2222222
748 397,7777778
749 398,3333333
750 398,8888889
751 399,4444444
752 400
753 400,5555556
754 401,1111111
755 401,6666667
756 402,2222222
757 402,7777778
758 403,3333333
759 403,8888889
760 404,4444444
761 405
762 405,5555556
763 406,1111111
764 406,6666667
765 407,2222222
766 407,7777778
767 408,3333333
768 408,8888889
769 409,4444444
770 410
771 410,5555556
772 411,1111111
773 411,6666667
774 412,2222222
775 412,7777778
776 413,3333333
777 413,8888889
778 414,4444444
779 415
780 415,5555556
781 416,1111111
782 416,6666667
783 417,2222222
784 417,7777778
785 418,3333333
786 418,8888889
787 419,4444444
788 420
789 420,5555556
790 421,1111111
791 421,6666667
792 422,2222222
793 422,7777778
794 423,3333333
795 423,8888889
796 424,4444444
797 425
798 425,5555556
799 426,1111111
800 426,6666667
801 427,2222222
802 427,7777778
803 428,3333333
804 428,8888889
805 429,4444444
806 430
807 430,5555556
808 431,1111111
809 431,6666667
810 432,2222222
811 432,7777778
812 433,3333333
813 433,8888889
814 434,4444444
815 435
816 435,5555556
817 436,1111111
818 436,6666667
819 437,2222222
820 437,7777778
821 438,3333333
822 438,8888889
823 439,4444444
824 440
825 440,5555556
826 441,1111111
827 441,6666667
828 442,2222222
829 442,7777778
830 443,3333333
831 443,8888889
832 444,4444444
833 445
834 445,5555556
835 446,1111111
836 446,6666667
837 447,2222222
838 447,7777778
839 448,3333333
840 448,8888889
841 449,4444444
842 450
843 450,5555556
844 451,1111111
845 451,6666667
846 452,2222222
847 452,7777778
848 453,3333333
849 453,8888889
850 454,4444444
851 455
852 455,5555556
853 456,1111111
854 456,6666667
855 457,2222222
856 457,7777778
857 458,3333333
858 458,8888889
859 459,4444444
860 460
861 460,5555556
862 461,1111111
863 461,6666667
864 462,2222222
865 462,7777778
866 463,3333333
867 463,8888889
868 464,4444444
869 465
870 465,5555556
871 466,1111111
872 466,6666667
873 467,2222222
874 467,7777778
875 468,3333333
876 468,8888889
877 469,4444444
878 470
879 470,5555556
880 471,1111111
881 471,6666667
882 472,2222222
883 472,7777778
884 473,3333333
885 473,8888889
886 474,4444444
887 475
888 475,5555556
889 476,1111111
890 476,6666667
891 477,2222222
892 477,7777778
893 478,3333333
894 478,8888889
895 479,4444444
896 480
897 480,5555556
898 481,1111111
899 481,6666667
900 482,2222222
901 482,7777778
902 483,3333333
903 483,8888889
904 484,4444444
905 485
906 485,5555556
907 486,1111111
908 486,6666667
909 487,2222222
910 487,7777778
911 488,3333333
912 488,8888889
913 489,4444444
914 490
915 490,5555556
916 491,1111111
917 491,6666667
918 492,2222222
919 492,7777778
920 493,3333333
921 493,8888889
922 494,4444444
923 495
924 495,5555556
925 496,1111111
926 496,6666667
927 497,2222222
928 497,7777778
929 498,3333333
930 498,8888889
931 499,4444444
932 500
933 500,5555556
934 501,1111111
935 501,6666667
936 502,2222222
937 502,7777778
938 503,3333333
939 503,8888889
940 504,4444444
941 505
942 505,5555556
943 506,1111111
944 506,6666667
945 507,2222222
946 507,7777778
947 508,3333333
948 508,8888889
949 509,4444444
950 510
951 510,5555556
952 511,1111111
953 511,6666667
954 512,2222222
955 512,7777778
956 513,3333333
957 513,8888889
958 514,4444444
959 515
960 515,5555556
961 516,1111111
962 516,6666667
963 517,2222222
964 517,7777778
965 518,3333333
966 518,8888889
967 519,4444444
968 520
969 520,5555556
970 521,1111111
971 521,6666667
972 522,2222222
973 522,7777778
974 523,3333333
975 523,8888889
976 524,4444444
977 525
978 525,5555556
979 526,1111111
980 526,6666667
981 527,2222222
982 527,7777778
983 528,3333333
984 528,8888889
985 529,4444444
986 530
987 530,5555556
988 531,1111111
989 531,6666667
990 532,2222222
991 532,7777778
992 533,3333333
993 533,8888889
994 534,4444444
995 535
996 535,5555556
997 536,1111111
998 536,6666667
999 537,2222222
1000 537,7777778
1001 538,3333333
1002 538,8888889
1003 539,4444444
1004 540
1005 540,5555556
1006 541,1111111
1007 541,6666667
1008 542,2222222
1009 542,7777778
1010 543,3333333
1011 543,8888889
1012 544,4444444
1013 545
1014 545,5555556
1015 546,1111111
1016 546,6666667
1017 547,2222222
1018 547,7777778
1019 548,3333333
1020 548,8888889
1021 549,4444444
1022 550
1023 550,5555556
1024 551,1111111
1025 551,6666667
1026 552,2222222
1027 552,7777778
1028 553,3333333
1029 553,8888889
1030 554,4444444
1031 555
1032 555,5555556
1033 556,1111111
1034 556,6666667
1035 557,2222222
1036 557,7777778
1037 558,3333333
1038 558,8888889
1039 559,4444444
1040 560
1041 560,5555556
1042 561,1111111
1043 561,6666667
1044 562,2222222
1045 562,7777778
1046 563,3333333
1047 563,8888889
1048 564,4444444
1049 565
1050 565,5555556
1051 566,1111111
1052 566,6666667
1053 567,2222222
1054 567,7777778
1055 568,3333333
1056 568,8888889
1057 569,4444444
1058 570
1059 570,5555556
1060 571,1111111
1061 571,6666667
1062 572,2222222
1063 572,7777778
1064 573,3333333
1065 573,8888889
1066 574,4444444
1067 575
1068 575,5555556
1069 576,1111111
1070 576,6666667
1071 577,2222222
1072 577,7777778
1073 578,3333333
1074 578,8888889
1075 579,4444444
1076 580
1077 580,5555556
1078 581,1111111
1079 581,6666667
1080 582,2222222
1081 582,7777778
1082 583,3333333
1083 583,8888889
1084 584,4444444
1085 585
1086 585,5555556
1087 586,1111111
1088 586,6666667
1089 587,2222222
1090 587,7777778
1091 588,3333333
1092 588,8888889
1093 589,4444444
1094 590
1095 590,5555556
1096 591,1111111
1097 591,6666667
1098 592,2222222
1099 592,7777778
1100 593,3333333
1101 593,8888889
1102 594,4444444
1103 595
1104 595,5555556
1105 596,1111111
1106 596,6666667
1107 597,2222222
1108 597,7777778
1109 598,3333333
1110 598,8888889
1111 599,4444444
1112 600
1113 600,5555556
1114 601,1111111
1115 601,6666667
1116 602,2222222
1117 602,7777778
1118 603,3333333
1119 603,8888889
1120 604,4444444
1121 605
1122 605,5555556
1123 606,1111111
1124 606,6666667
1125 607,2222222
1126 607,7777778
1127 608,3333333
1128 608,8888889
1129 609,4444444
1130 610
1131 610,5555556
1132 611,1111111
1133 611,6666667
1134 612,2222222
1135 612,7777778
1136 613,3333333
1137 613,8888889
1138 614,4444444
1139 615
1140 615,5555556
1141 616,1111111
1142 616,6666667
1143 617,2222222
1144 617,7777778
1145 618,3333333
1146 618,8888889
1147 619,4444444
1148 620
1149 620,5555556
1150 621,1111111
1151 621,6666667
1152 622,2222222
1153 622,7777778
1154 623,3333333
1155 623,8888889
1156 624,4444444
1157 625
1158 625,5555556
1159 626,1111111
1160 626,6666667
1161 627,2222222
1162 627,7777778
1163 628,3333333
1164 628,8888889
1165 629,4444444
1166 630
1167 630,5555556
1168 631,1111111
1169 631,6666667
1170 632,2222222
1171 632,7777778
1172 633,3333333
1173 633,8888889
1174 634,4444444
1175 635
1176 635,5555556
1177 636,1111111
1178 636,6666667
1179 637,2222222
1180 637,7777778
1181 638,3333333
1182 638,8888889
1183 639,4444444
1184 640
1185 640,5555556
1186 641,1111111
1187 641,6666667
1188 642,2222222
1189 642,7777778
1190 643,3333333
1191 643,8888889
1192 644,4444444
1193 645
1194 645,5555556
1195 646,1111111
1196 646,6666667
1197 647,2222222
1198 647,7777778
1199 648,3333333
1200 648,8888889
1201 649,4444444
1202 650
1203 650,5555556
1204 651,1111111
1205 651,6666667
1206 652,2222222
1207 652,7777778
1208 653,3333333
1209 653,8888889
1210 654,4444444
1211 655
1212 655,5555556
1213 656,1111111
1214 656,6666667
1215 657,2222222
1216 657,7777778
1217 658,3333333
1218 658,8888889
1219 659,4444444
1220 660
1221 660,5555556
1222 661,1111111
1223 661,6666667
1224 662,2222222
1225 662,7777778
1226 663,3333333
1227 663,8888889
1228 664,4444444
1229 665
1230 665,5555556
1231 666,1111111
1232 666,6666667
1233 667,2222222
1234 667,7777778
1235 668,3333333
1236 668,8888889
1237 669,4444444
1238 670
1239 670,5555556
1240 671,1111111
1241 671,6666667
1242 672,2222222
1243 672,7777778
1244 673,3333333
1245 673,8888889
1246 674,4444444
1247 675
1248 675,5555556
1249 676,1111111
1250 676,6666667
1251 677,2222222
1252 677,7777778
1253 678,3333333
1254 678,8888889
1255 679,4444444
1256 680
1257 680,5555556
1258 681,1111111
1259 681,6666667
1260 682,2222222
1261 682,7777778
1262 683,3333333
1263 683,8888889
1264 684,4444444
1265 685
1266 685,5555556
1267 686,1111111
1268 686,6666667
1269 687,2222222
1270 687,7777778
1271 688,3333333
1272 688,8888889
1273 689,4444444
1274 690
1275 690,5555556
1276 691,1111111
1277 691,6666667
1278 692,2222222
1279 692,7777778
1280 693,3333333
1281 693,8888889
1282 694,4444444
1283 695
1284 695,5555556
1285 696,1111111
1286 696,6666667
1287 697,2222222
1288 697,7777778
1289 698,3333333
1290 698,8888889
1291 699,4444444
1292 700
1293 700,5555556
1294 701,1111111
1295 701,6666667
1296 702,2222222
1297 702,7777778
1298 703,3333333
1299 703,8888889
1300 704,4444444
1301 705
1302 705,5555556
1303 706,1111111
1304 706,6666667
1305 707,2222222
1306 707,7777778
1307 708,3333333
1308 708,8888889
1309 709,4444444
1310 710
1311 710,5555556
1312 711,1111111
1313 711,6666667
1314 712,2222222
1315 712,7777778
1316 713,3333333
1317 713,8888889
1318 714,4444444
1319 715
1320 715,5555556
1321 716,1111111
1322 716,6666667
1323 717,2222222
1324 717,7777778
1325 718,3333333
1326 718,8888889
1327 719,4444444
1328 720
1329 720,5555556
1330 721,1111111
1331 721,6666667
1332 722,2222222
1333 722,7777778
1334 723,3333333
1335 723,8888889
1336 724,4444444
1337 725
1338 725,5555556
1339 726,1111111
1340 726,6666667
1341 727,2222222
1342 727,7777778
1343 728,3333333
1344 728,8888889
1345 729,4444444
1346 730
1347 730,5555556
1348 731,1111111
1349 731,6666667
1350 732,2222222
1351 732,7777778
1352 733,3333333
1353 733,8888889
1354 734,4444444
1355 735
1356 735,5555556
1357 736,1111111
1358 736,6666667
1359 737,2222222
1360 737,7777778
1361 738,3333333
1362 738,8888889
1363 739,4444444
1364 740
1365 740,5555556
1366 741,1111111
1367 741,6666667
1368 742,2222222
1369 742,7777778
1370 743,3333333
1371 743,8888889
1372 744,4444444
1373 745
1374 745,5555556
1375 746,1111111
1376 746,6666667
1377 747,2222222
1378 747,7777778
1379 748,3333333
1380 748,8888889
1381 749,4444444
1382 750
1383 750,5555556
1384 751,1111111
1385 751,6666667
1386 752,2222222
1387 752,7777778
1388 753,3333333
1389 753,8888889
1390 754,4444444
1391 755
1392 755,5555556
1393 756,1111111
1394 756,6666667
1395 757,2222222
1396 757,7777778
1397 758,3333333
1398 758,8888889
1399 759,4444444
1400 760
1401 760,5555556
1402 761,1111111
1403 761,6666667
1404 762,2222222
1405 762,7777778
1406 763,3333333
1407 763,8888889
1408 764,4444444
1409 765
1410 765,5555556
1411 766,1111111
1412 766,6666667
1413 767,2222222
1414 767,7777778
1415 768,3333333
1416 768,8888889
1417 769,4444444
1418 770
1419 770,5555556
1420 771,1111111
1421 771,6666667
1422 772,2222222
1423 772,7777778
1424 773,3333333
1425 773,8888889
1426 774,4444444
1427 775
1428 775,5555556
1429 776,1111111
1430 776,6666667
1431 777,2222222
1432 777,7777778
1433 778,3333333
1434 778,8888889
1435 779,4444444
1436 780
1437 780,5555556
1438 781,1111111
1439 781,6666667
1440 782,2222222
1441 782,7777778
1442 783,3333333
1443 783,8888889
1444 784,4444444
1445 785
1446 785,5555556
1447 786,1111111
1448 786,6666667
1449 787,2222222
1450 787,7777778
1451 788,3333333
1452 788,8888889
1453 789,4444444
1454 790
1455 790,5555556
1456 791,1111111
1457 791,6666667
1458 792,2222222
1459 792,7777778
1460 793,3333333
1461 793,8888889
1462 794,4444444
1463 795
1464 795,5555556
1465 796,1111111
1466 796,6666667
1467 797,2222222
1468 797,7777778
1469 798,3333333
1470 798,8888889
1471 799,4444444
1472 800
1473 800,5555556
1474 801,1111111
1475 801,6666667
1476 802,2222222
1477 802,7777778
1478 803,3333333
1479 803,8888889
1480 804,4444444
1481 805
1482 805,5555556
1483 806,1111111
1484 806,6666667
1485 807,2222222
1486 807,7777778
1487 808,3333333
1488 808,8888889
1489 809,4444444
1490 810
1491 810,5555556
1492 811,1111111
1493 811,6666667
1494 812,2222222
1495 812,7777778
1496 813,3333333
1497 813,8888889
1498 814,4444444
1499 815
1500 815,5555556
1501 816,1111111
1502 816,6666667
1503 817,2222222
1504 817,7777778
1505 818,3333333
1506 818,8888889
1507 819,4444444
1508 820
1509 820,5555556
1510 821,1111111
1511 821,6666667
1512 822,2222222
1513 822,7777778
1514 823,3333333
1515 823,8888889
1516 824,4444444
1517 825
1518 825,5555556
1519 826,1111111
1520 826,6666667
1521 827,2222222
1522 827,7777778
1523 828,3333333
1524 828,8888889
1525 829,4444444
1526 830
1527 830,5555556
1528 831,1111111
1529 831,6666667
1530 832,2222222
1531 832,7777778
1532 833,3333333
1533 833,8888889
1534 834,4444444
1535 835
1536 835,5555556
1537 836,1111111
1538 836,6666667
1539 837,2222222
1540 837,7777778
1541 838,3333333
1542 838,8888889
1543 839,4444444
1544 840
1545 840,5555556
1546 841,1111111
1547 841,6666667
1548 842,2222222
1549 842,7777778
1550 843,3333333
1551 843,8888889
1552 844,4444444
1553 845
1554 845,5555556
1555 846,1111111
1556 846,6666667
1557 847,2222222
1558 847,7777778
1559 848,3333333
1560 848,8888889
1561 849,4444444
1562 850
1563 850,5555556
1564 851,1111111
1565 851,6666667
1566 852,2222222
1567 852,7777778
1568 853,3333333
1569 853,8888889
1570 854,4444444
1571 855
1572 855,5555556
1573 856,1111111
1574 856,6666667
1575 857,2222222
1576 857,7777778
1577 858,3333333
1578 858,8888889
1579 859,4444444
1580 860
1581 860,5555556
1582 861,1111111
1583 861,6666667
1584 862,2222222
1585 862,7777778
1586 863,3333333
1587 863,8888889
1588 864,4444444
1589 865
1590 865,5555556
1591 866,1111111
1592 866,6666667
1593 867,2222222
1594 867,7777778
1595 868,3333333
1596 868,8888889
1597 869,4444444
1598 870
1599 870,5555556
1600 871,1111111
1601 871,6666667
1602 872,2222222
1603 872,7777778
1604 873,3333333
1605 873,8888889
1606 874,4444444
1607 875
1608 875,5555556
1609 876,1111111
1610 876,6666667
1611 877,2222222
1612 877,7777778
1613 878,3333333
1614 878,8888889
1615 879,4444444
1616 880
1617 880,5555556
1618 881,1111111
1619 881,6666667
1620 882,2222222
1621 882,7777778
1622 883,3333333
1623 883,8888889
1624 884,4444444
1625 885
1626 885,5555556
1627 886,1111111
1628 886,6666667
1629 887,2222222
1630 887,7777778
1631 888,3333333
1632 888,8888889
1633 889,4444444
1634 890
1635 890,5555556
1636 891,1111111
1637 891,6666667
1638 892,2222222
1639 892,7777778
1640 893,3333333
1641 893,8888889
1642 894,4444444
1643 895
1644 895,5555556
1645 896,1111111
1646 896,6666667
1647 897,2222222
1648 897,7777778
1649 898,3333333
1650 898,8888889
1651 899,4444444
1652 900
1653 900,5555556
1654 901,1111111
1655 901,6666667
1656 902,2222222
1657 902,7777778
1658 903,3333333
1659 903,8888889
1660 904,4444444
1661 905
1662 905,5555556
1663 906,1111111
1664 906,6666667
1665 907,2222222
1666 907,7777778
1667 908,3333333
1668 908,8888889
1669 909,4444444
1670 910
1671 910,5555556
1672 911,1111111
1673 911,6666667
1674 912,2222222
1675 912,7777778
1676 913,3333333
1677 913,8888889
1678 914,4444444
1679 915
1680 915,5555556
1681 916,1111111
1682 916,6666667
1683 917,2222222
1684 917,7777778
1685 918,3333333
1686 918,8888889
1687 919,4444444
1688 920
1689 920,5555556
1690 921,1111111
1691 921,6666667
1692 922,2222222
1693 922,7777778
1694 923,3333333
1695 923,8888889
1696 924,4444444
1697 925
1698 925,5555556
1699 926,1111111
1700 926,6666667
1701 927,2222222
1702 927,7777778
1703 928,3333333
1704 928,8888889
1705 929,4444444
1706 930
1707 930,5555556
1708 931,1111111
1709 931,6666667
1710 932,2222222
1711 932,7777778
1712 933,3333333
1713 933,8888889
1714 934,4444444
1715 935
1716 935,5555556
1717 936,1111111
1718 936,6666667
1719 937,2222222
1720 937,7777778
1721 938,3333333
1722 938,8888889
1723 939,4444444
1724 940
1725 940,5555556
1726 941,1111111
1727 941,6666667
1728 942,2222222
1729 942,7777778
1730 943,3333333
1731 943,8888889
1732 944,4444444
1733 945
1734 945,5555556
1735 946,1111111
1736 946,6666667
1737 947,2222222
1738 947,7777778
1739 948,3333333
1740 948,8888889
1741 949,4444444
1742 950
1743 950,5555556
1744 951,1111111
1745 951,6666667
1746 952,2222222
1747 952,7777778
1748 953,3333333
1749 953,8888889
1750 954,4444444
1751 955
1752 955,5555556
1753 956,1111111
1754 956,6666667
1755 957,2222222
1756 957,7777778
1757 958,3333333
1758 958,8888889
1759 959,4444444
1760 960
1761 960,5555556
1762 961,1111111
1763 961,6666667
1764 962,2222222
1765 962,7777778
1766 963,3333333
1767 963,8888889
1768 964,4444444
1769 965
1770 965,5555556
1771 966,1111111
1772 966,6666667
1773 967,2222222
1774 967,7777778
1775 968,3333333
1776 968,8888889
1777 969,4444444
1778 970
1779 970,5555556
1780 971,1111111
1781 971,6666667
1782 972,2222222
1783 972,7777778
1784 973,3333333
1785 973,8888889
1786 974,4444444
1787 975
1788 975,5555556
1789 976,1111111
1790 976,6666667
1791 977,2222222
1792 977,7777778
1793 978,3333333
1794 978,8888889
1795 979,4444444
1796 980
1797 980,5555556
1798 981,1111111
1799 981,6666667
1800 982,2222222
1801 982,7777778
1802 983,3333333
1803 983,8888889
1804 984,4444444
1805 985
1806 985,5555556
1807 986,1111111
1808 986,6666667
1809 987,2222222
1810 987,7777778
1811 988,3333333
1812 988,8888889
1813 989,4444444
1814 990
1815 990,5555556
1816 991,1111111
1817 991,6666667
1818 992,2222222
1819 992,7777778
1820 993,3333333
1821 993,8888889
1822 994,4444444
1823 995
1824 995,5555556
1825 996,1111111
1826 996,6666667
1827 997,2222222
1828 997,7777778
1829 998,3333333
1830 998,8888889
1831 999,4444444
1832 1000
1833 1000,555556
1834 1001,111111
1835 1001,666667
1836 1002,222222
1837 1002,777778
1838 1003,333333
1839 1003,888889
1840 1004,444444
1841 1005
1842 1005,555556
1843 1006,111111
1844 1006,666667
1845 1007,222222
1846 1007,777778
1847 1008,333333
1848 1008,888889
1849 1009,444444
1850 1010
1851 1010,555556
1852 1011,111111
1853 1011,666667
1854 1012,222222
1855 1012,777778
1856 1013,333333
1857 1013,888889
1858 1014,444444
1859 1015
1860 1015,555556
1861 1016,111111
1862 1016,666667
1863 1017,222222
1864 1017,777778
1865 1018,333333
1866 1018,888889
1867 1019,444444
1868 1020
1869 1020,555556
1870 1021,111111
1871 1021,666667
1872 1022,222222
1873 1022,777778
1874 1023,333333
1875 1023,888889
1876 1024,444444
1877 1025
1878 1025,555556
1879 1026,111111
1880 1026,666667
1881 1027,222222
1882 1027,777778
1883 1028,333333
1884 1028,888889
1885 1029,444444
1886 1030
1887 1030,555556
1888 1031,111111
1889 1031,666667
1890 1032,222222
1891 1032,777778
1892 1033,333333
1893 1033,888889
1894 1034,444444
1895 1035
1896 1035,555556
1897 1036,111111
1898 1036,666667
1899 1037,222222
1900 1037,777778
1901 1038,333333
1902 1038,888889
1903 1039,444444
1904 1040
1905 1040,555556
1906 1041,111111
1907 1041,666667
1908 1042,222222
1909 1042,777778
1910 1043,333333
1911 1043,888889
1912 1044,444444
1913 1045
1914 1045,555556
1915 1046,111111
1916 1046,666667
1917 1047,222222
1918 1047,777778
1919 1048,333333
1920 1048,888889
1921 1049,444444
1922 1050
1923 1050,555556
1924 1051,111111
1925 1051,666667
1926 1052,222222
1927 1052,777778
1928 1053,333333
1929 1053,888889
1930 1054,444444
1931 1055
1932 1055,555556
1933 1056,111111
1934 1056,666667
1935 1057,222222
1936 1057,777778
1937 1058,333333
1938 1058,888889
1939 1059,444444
1940 1060
1941 1060,555556
1942 1061,111111
1943 1061,666667
1944 1062,222222
1945 1062,777778
1946 1063,333333
1947 1063,888889
1948 1064,444444
1949 1065
1950 1065,555556
1951 1066,111111
1952 1066,666667
1953 1067,222222
1954 1067,777778
1955 1068,333333
1956 1068,888889
1957 1069,444444
1958 1070
1959 1070,555556
1960 1071,111111
1961 1071,666667
1962 1072,222222
1963 1072,777778
1964 1073,333333
1965 1073,888889
1966 1074,444444
1967 1075
1968 1075,555556
1969 1076,111111
1970 1076,666667
1971 1077,222222
1972 1077,777778
1973 1078,333333
1974 1078,888889
1975 1079,444444
1976 1080
1977 1080,555556
1978 1081,111111
1979 1081,666667
1980 1082,222222
1981 1082,777778
1982 1083,333333
1983 1083,888889
1984 1084,444444
1985 1085
1986 1085,555556
1987 1086,111111
1988 1086,666667
1989 1087,222222
1990 1087,777778
1991 1088,333333
1992 1088,888889
1993 1089,444444
1994 1090
1995 1090,555556
1996 1091,111111
1997 1091,666667
1998 1092,222222
1999 1092,777778
2000 1093,333333
Илон Маск рекомендует:  Что такое код shm_remove

Щас читаю книгу Рэя Брэдбери «451 градус по Фаренгейту», рекомендую всем думающим людям, сейчас в эпоху интернета и мобильных телефонов она как никогда актуальна.

По мотивам романа в 2002 был снят знаменитый фильм «Эквилибриум» с великолепными Кристианом Бэйлом и Шоном Бином в главных ролях.

Кино супер, но там больше от Оруэльского Большого Брата

FahrenheitToCelsius — Функция Delphi

В настоящей статье мы вновь возвращаемся к уже неоднократно обсуждавшейся нами теме Web-сервисов, представляющих собой технологию интеграции Web-приложений. Сегодня мы рассмотрим, как можно использовать Web-сервисы в Windows-приложениях, созданных с помощью Borland Delphi 6, а также как с помощью этого же средства разработки создавать собственные Web-сервисы. Отметим, что на момент написания данной статьи, когда выход окончательной версии Visual Studio .Net еще только ожидается в обозримом будущем, Delphi 6 является единственным средством разработки, поддерживающим создание Web-сервисов.

В течение последних нескольких лет мы наблюдаем качественные изменения, которые претерпевает World Wide Web. Если еще пять-семь лет назад WWW представляла собой главным образом совокупность серверов, содержащих статические документы со ссылками друг на друга, то современный Web практически невозможно представить без интерактивных Web-приложений, обрабатывающих и помещающих в базы данных пользовательский ввод, динамически генерирующих страницы на скриптовых языках по запросу пользователя и обслуживающих таким образом тот или иной бизнес, равно как и без широкого спектра технологий, реализующих подобную функциональность (CGI, ISAPI, ASP, JSP и т.д.).

Отметим, однако, что эволюция WWW не остановилась на Web-приложениях. Взаимная интеграция бизнесов различных компаний, происходящая сейчас во всем мире, неизбежно влечет за собой появление технологий и стандартов интеграции обслуживающих их приложений и корпоративных информационных систем. Наиболее популярной технологией такой интеграции в настоящее время следует назвать обмен данными в формате XML (eXtensible Markup Language) по протоколу SOAP (Simple Object Access Protocol) и создание Web-сервисов, применяющих подобный обмен данными.

Web-сервис — это, по существу, объект, реализующий один или несколько методов, к которым можно обращаться через Internet из какого-либо другого приложения. Для описания методов, предоставляемых конкретным Web-сервисом (то есть его программного интерфейса), создается и делается доступным специальный документ на языке WSDL (Web Service Definition Language), являющемся подмножеством языка XML. Отметим, что для поиска Web-сервисов в Сети планируется использовать реестры UDDI (Universal Description, Diiscovery and Integration), в которых Web-сервисы регистрируются их провайдерами для того, чтобы их могли найти разработчики. Web-сервисы, по существу, позволяют создавать распределенные приложения, части которых могут функционировать на любых платформах и располагаться в произвольных местах, что делает эту технологию весьма привлекательным средством интеграции корпоративных приложений. Более подробно о стандартах и средствах разработки Web-сервисов можно прочесть в статье Алексея Федорова «Web нового поколения — Web-сервисы» (см. КомпьютерПресс № 6’2001).

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

Использование Web-сервиса в приложении

Для создания клиентского приложения, использующего готовый Web-сервис, следует в общем случае иметь подключение к Internet на время разработки, поскольку в процессе создания такого приложения требуется обращение к WSDL-файлу. В данном примере мы воспользуемся одним из бесплатных или shareware-сервисов, ссылки на которые можно найти в Web, например на сайте http://www.xmethods.org/ (список некоторых общедоступных Web-сервисов различных производителей на этом сайте представлен и в виде обычной HTML-страницы, и как UDDI-интерфейс и насчитывает на сегодня несколько десятков более или менее полезных Web-сервисов).

Выберем для создания примера Web-сервис Temperature Converter, разработанный британской компанией Lucin (http://www.lucin.com/). WSDL-описание этого сервиса находится по адресу http://sal006.salnetwork.com:83/a1vbcode/temperature/ctemperature.xml.

Для начала запустим Delphi 6 и создадим проект обычного Windows-приложения. Затем, выбрав из среды разработки пункт меню File | New | Other, откроем репозитарий объектов и выберем в нем на странице Web Services пиктограмму Web Sertvice Importer.

Далее в строке WSDL or XML Schema Location (Filename or URL) диалогового окна Web Services Import следует ввести URL WSDL-файла, содержащего описание выбранного нами Web-сервиса — http://sal006.salnetwork.com:83/a1vbcode/temperature/ctemperature.xml.

После этого среда разработки обратится по указанному адресу к этому файлу и на его основе сгенерирует модуль, содержащий интерфейс для активизации Web-сервиса и доступа к его методам (наследник интерфейса IInvokable). В данном случае сгенерированный код имеет следующий вид:

Как мы видим, используемый Web-сервис реализует шесть методов, конвертирующих друг в друга разные температурные шкалы. Воспользуемся одним из них — FahrenheitToCelsius, переводящим значение температуры в градусах Фаренгейта в соответствующее значение в градусах Цельсия (это любимая задача российских граждан, изучающих прогнозы погоды с помощью американских сайтов). Сошлемся на сгенерированный модуль из модуля, связанного с главной формой приложения с помощью пункта меню File | Use Unit.

Далее следует позаботиться о наличии в приложении объекта, отвечающего за удаленную активизацию Web-сервиса и, следовательно, хранящего сведения о его местоположении. Для этой цели в палитре компонентов на странице Web Services имеется компонент THTTPRIO (RIO означает Remote Invokable Object). Поместим этот компонент на форму и присвоим его свойству WSDLLocation URL WSDL-описания Web-сервиса. После этого попытаемся установить значения свойства Service (это свойство содержит список интерфейсов, предоставляемых Web-сервисом, — их имена уже имеются в сгенерированном интерфейсном модуле) или свойства Port (содержит имя порта, определенного в WSDL-файле и устанавливающего местоположение Web-сервиса, и протокол, применяемый для обращения к нему). Среда разработки снова обратится к WSDL-описанию Web-сервиса, получив на его основе сведения о местоположении сервиса и его интерфейсах. Вот так выглядит фрагмент WSDL-файла, содержащий эти сведения:

[an error occurred while processing this directive]

После этого свойства Service и Port можно будет выбрать из выпадающих списков.

Заметим, что в ряде случаев можно не использовать WSDL-описание, а просто указать URL Web-сервиса в свойстве URL и ввести свойства Service и Port вручную.

Следующим шагом будет создание пользовательского интерфейса нашего клиентского приложения. Он несложен: поле для ввода исходного значения, метка для вывода результатов и кнопка, нажатие на которую инициирует обращение к Web-сервису.

Обработчик события, связанного с нажатием на кнопку, содержит код для обращения к Web-сервису. Он имеет вид:

Теперь можно сохранить проект, скомпилировать приложение и протестировать его.

Итак, мы научились создавать приложения, использующие Web-сервисы. В следующем разделе данной статьи мы рассмотрим, как создавать сами Web-сервисы.

Создать простейший Web-сервис (наподобие того, что мы использовали) с помощью Delphi 6 ненамного труднее, чем создать клиентское приложение. Дабы излишне не усложнять задачу, в качестве примера создадим очень примитивный Web-сервис, который просто умножает два числа. Для тестирования Web-сервиса следует иметь Web-сервер с доступным каталогом для размещения исполняемых фалов (и, естественно, работающий под управлением Windows). Для этого нужно выбрать со страницы Web Services репозитария объектов пиктограмму Soap Server Application и выбрать тип Web-приложения, которое мы планируем создать. Тип Web-приложения зависит от того, каким Web-сервером мы планируем пользоваться и желаем ли выполнять наш Web-сервис в адресном пространстве Web-сервера. Если это так, то нужно создать его в виде библиотеки, а если нет, то в виде исполняемого файла (в нашем примере мы выберем эту опцию).

Илон Маск рекомендует:  Как изменить цвет кнопки

Выбрав тип приложения, мы получим объект TWebModule, содержащий три компонента:

  • THTTPSoapDispatcher, отвечающий за получение запросов с помощью протокола SOAP;
  • THTTPSoapPascalInvoker, отвечающий за превращение этих запросов в вызовы методов объектов нашего приложения;
  • TWSDLHTMLPublish, отвечающий за генерацию WSDL-файлов, содержащих описание реализованных в Web-сервисе интерфейсов, предназначенное для разработчиков клиентских приложений для данного Web-сервиса.

Теперь можно приступить к созданию описания интерфейса Web-сервиса. Для этого просто создадим новый модуль и в нем опишем интерфейс IMult, содержащий единственный метод Multiply:

Значение GUID для данного сервера можно сгенерировать в редакторе кода с помощью комбинации клавиш Ctrl-Shift-G.

И наконец, нам следует создать модуль с реализацией метода Multiply:

Сохранив и скомпилировав проект, скопируем полученное приложение в каталог Web-сервера, предназначенный для хранения исполняемых файлов (в случае если используются Internet Information Services в Windows 2000, соответствующим каталогом по умолчанию будет C:\Inetpub\Scripts).

Если теперь обратиться из Web-браузера к Web-сервису с параметром /wsdl — http://MAINDESK/scripts/ws.exe/wsdl, получим список реализуемых им интерфейсов. Один из них, IMult, создан нами, другой, IWSDLPublish, реализован в компоненте TWSDLHTMLPublish.

Щелкнув по ссылке, указывающей на интерфейс IMult, можно получить WSDL-описание нашего интерфейса IMult, которое используется клиентским приложением и потому помещается в доступное место в Internet. В нашем же случае мы просто сохраним его в файле.

Осталось протестировать наш Web-сервис. Сделать это можно разными способами, например обратиться к нему с Web-страницы, содержащей код на одном из скриптовых языков. Однако мы напишем клиентское приложение на Delphi, коль скоро мы уже умеем это делать. Как и в первой части данной статьи, создадим новый проект, выберем со страницы Web Services репозитария объектов пиктограмму Web Services Importer и укажем в качестве параметра WSDL or XML Schema Location (Filename or URL) диалогового окна Web Services Import путь к WSDL-файлу, который мы только что сохранили. Затем сошлемся на сгенерированный интерфейсный модуль из модуля, связанного с главной формой клиентского приложения. Поместим на форму компонент THTTPRIO, укажем в качестве значения его свойства WSDLLocation имя того же WSDL-файла, выберем из выпадающих списков значения свойств Service и Port и создадим простейший пользовательский интерфейс приложения.

Обработчик события, связанного с нажатием на кнопку, имеет вид:

Запустив клиентское приложение, можем убедиться, что наш Web-сервис вполне работоспособен.

Итак, мы научились создавать свои Web-сервисы с помощью Delphi 6 и тестировать их.

Функции delphi

Здравствуй, дорогой читатель. Сегодня я планирую рассказать о таком значимом элементе программирования как функции. А если быть точным, будем разбирать функции Delphi.

Начнем с общего определения:

Функция – фрагмент программного кода, который имеет свое имя. По этому имени данный фрагмент можно вызвать из любого места программы. Результатом выполнения функции Delphi является значение.

Объясню доступным языком, зачем нужны функции. Представьте себе ситуацию, что Вам в программе нужно несколько раз вычислять площадь квадрата. Вместо того, чтобы каждый раз писать один и тот же код, Вы можете объявить функцию и просто вызывать её в нужном месте. Если ещё не совсем понятно зачем все это нужно, советую прочесть статью до конца и на примерах станет все ясно.

Давайте разберем как определить функцию.

Итак, в начале идет ключевое слово function, затем имя функции. Далее в круглых скобках список параметров. Также необходимо указать тип возвращаемого результата. При необходимости можно определить локальные переменные. Между операторных скобок (begin..end;) необходимо записать требуемые инструкции.

В каждой функции Delphi автоматически создает переменную с именем result, переменная имеет тот же тип, что и возвращаемое значение функции. С помощью этой переменной мы и будем возвращать значения. (Есть еще одна возможность вернуть значение, её я продемонстрирую на примере).

В функцию можно передавать параметры разных типов: значения, константы, переменные, выходные параметры. Но это тема отдельной статьи, которую я напишу чуть позже.

Разберем применение функций Делфи на простом примере.

Создайте новое приложение и на форме разместите три кнопки (Button).

Далее откройте код и будем писать функцию, цель которой будет возвращать квадрат числа. Описание у нас будет вне класса после строк:

Сама же функция будет иметь следующий вид:

Название – square, параметр всего один – x типа Double, результат тоже будет Double.

Делфи позволяет возвращать значения через переменную, название которой совпадает с названием функции Delphi. В нашем случае это выглядит так: square:=x*x;(закомментированный код).

Теперь посмотрим как можно использовать написанный код. Напишем обработчик события Onclickдля каждой из кнопок.

  • Для первой кнопки — ShowMessage(FloatToStr(square(1)));
  • Для второй — ShowMessage(FloatToStr(square(2)));
  • Для третей — ShowMessage(FloatToStr(square(3)));

У меня получился следующий Unit

Как можно заметить мы однажды определили функцию, а использовали её трижды. Если функция была бы побольше, мы бы сэкономили уйму времени и сил, сократили количество вводимого текста. Модифицировать программу также легче, если Вы используете функции – поправив тело функции вы изменяете логику на всех участках, где она используется.

Подведем итог. Функции делают разработку на Делфи проще и быстрее, код читабельнее, правку проще. Используйте фунуции Delphi.

Fahrenheit to celsius conversion

Type in either field to convert from Fahrenheit to Celsius or from Celsius to Fahrenheit:

Fahrenheit is a temperature scale used for describing temperatures in Fahrenheit degrees (°F).

It is most commonly used in the United States in weather forecasts and to describe temperatures inside houses, offices, etc.

I asked a few people and the conversion formula is the first thing that comes to mind — and how hard it is to remember. So here’s one easire way to do it: use 2 instead of 9/5 and 0.5 instead of 5/9 and 30 instead of 32 in the conversion formula. The result won’t be accurate but it does provide an approximate number that’s «good enough» in everyday situations.

So the formula becomes: F = (C x 2) + 30

For example: (25C x 2) + 30 = 80F. The accurate answer is 77F but if you don’t have a calculator handy and can’t multiply and divide using fractions then this formula will give you a good idea that you can use in everyday situations.

The Fahrenheit and Celsius scales coincide at -40°.

Another simple conversion method from C to F is to double the celsius, subtract 10%, add 32. For example: 100C = 2×100=200,200-20=180,add 32=212F

Because of the complex convesion formula people often use fahrenheit to celsius calculators to convert temperatures. Remembering a few °C and °F pairs can be useful in everyday life.

  • 0°C is the freezing point of water (or more accurately the melting point of ice) and it is 32°F
  • A 1 Celsius change is a change of 1.8 Fahrenheits while a 1 Fahrenheit change translates to a change of 0.55 Celsius. This is one of the easiest way to convert them if you know that 0°C = 32°F
  • 100°F is really really hot in the summer and it is 38°C so when people talk about a 100°F heatwave, it means hot.
  • Your thermostat in the winter is ideally set to about 69°F or 20°C. This saves on your heating bill and also helps saving the environment.
  • 37 degrees Celsius is the equivalent of 98.6 degrees Fahrenheit, or normal body temperature. A fever in Celsius is a temperature greater than 38 degrees, or the equivalent of 100.4 degrees Fahrenheit. Also, a temperature of 39 degrees Celsius/102 degrees Fahrenheit is not dangerous in and of itself, although it should prompt the individual to seek medical attention if it persists.
  • Air conditioners should be set to 77-78°F or 25-26°C. Most people set theirs lower because they like to wear a sweater inside the house in the summer and a tank top in the winter.

Visit the Canadian holidays 2020 website for dates and info about holidays in Canada to help plan your vacations.

Celsius, or centigrade, is also a temperature scale that describes temperatures in Celsius degrees (°C) and it is used in (almost) everywhere else outside the US.

212 °F = 100 °C = boiling point of water
32 °F = 0 °C = freezing point of water

The conversion formulas between °F and °C are:

[°C] = ([°F] — 32) x 5/9
[°F] = [°C] x 9/5 + 32

Conversion Chart

Quickly convert common temperatures using the fahrenheit to celsius conversion chart below:

FahrenheitToCelsius — Функция Delphi

Изучив основные «кирпичики», из которых составляются программные инструкции, а именно — переменные и операторы, мы можем приступить к исследованию вопросов их эффективного расположения в теле программы. Для этих целей рассмотрим вопрос использования подпрограмм.

О подпрограммах в Object Pascal

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

Структура подпрограммы похожа на программу в миниатюре: она содержит заголовок, блок объявления переменных и блок инструкций. Из отличий можно выделить лишь невозможность подключать модули (блок uses), а так же ограничения на объявления типов данных: если локальные простые и даже составные типы в подпрограммах вполне допустимы, то более сложные типы — объекты, классы и интерфейсы, локальными быть не могут, а потому в подпрограммах их объявлять нельзя.

Использование подпрограммы состоит из 2 этапов: сначала подпрограмму описывают, а затем, уже в блоке инструкций программы, вызывают. Отметим, что в библиотеке Delphi имеется описание тысяч готовых подпрограмм, описывать которые, разумеется, уже не надо. А их вызовом мы уже неоднократно занимались — достаточно взглянуть на любой пример, где мы встречали инструкции, подобные таким:

write(‘Hello, world!’); readln;

Здесь и write, и readln — стандартные подпрограммы Object Pascal. Таким образом, с вызовом подпрограмм мы уже знакомы. Осталось узнать, как создавать собственные, или пользовательские, подпрограммы. Но прежде отметим, что все подпрограммы делятся на 2 лагеря: процедуры и функции. Мы уже использовали эти термины, и даже давали им описание, однако повторимся: процедуры — это такие подпрограммы, которые выполняют предназначенное действие и возвращают выполнение в точку вызова. Функции в целом аналогичны процедурам, за тем исключением, что они еще и возвращают результат своего выполнения. Результатом работы функции могут быть данные любого типа, включая объекты.

Вместе с тем, значение, возвращаемое функцией, можно проигнорировать, в таком случае она ничем не будет отличаться от процедуры. Разумеется, при этом функция все-таки должна выполнить какое-либо действие, сказывающееся на выполнении программы, иначе она потеряет всякий смысл. С другой стороны, процедуры могут возвращать значения через свои параметры — например, как это делает DecodeDate. Таким образом, различия между процедурами и функциями в современном программировании весьма призрачны.

Как процедурам, так и функциям могут передаваться данные для обработки. Делается это при помощи списка параметров. Список параметров в описании подпрограммы и список аргументов, указываемых при ее вызове должен совпадать. Иначе говоря, если в описании определено 2 параметра типа Integer, то, вызывая такую подпрограмму, в качестве аргументов так же следует указать именно 2 аргумента и именно типа Integer или совместимого (скажем, Word или Int64).

ПРИМЕЧАНИЕ
На самом деле, Object Pascal позволяет довольно гибко обращаться с аргументами, для чего имеются различные методы, включая «перегружаемые» функции, значения параметров по умолчанию и т.д. Тем не менее, в типичном случае, количество, тип, и порядок перечисления аргументов при объявлении и при вызове процедуры или функции, должны совпадать.

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

Процедуры

Итак, начнем исследование подпрограммы с процедур. Как уже было отмечено, процедуру надо описать. Описание процедуры состоит из заголовка и тела процедуры.

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

Вслед за заголовком может следовать блок объявления локальных меток, типов и переменных. Локальными они называются потому, что предназначены исключительно для этой процедуры.

ПРИМЕЧАНИЕ
Вопросы локальных и глобальных переменных, и вообще видимости в программах, будет рассмотрен позже в этой главе.

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

procedure TriplePrint(str: string); var i: integer; begin for i := 1 to 3 do begin writeln(‘»‘+str+'»‘); end; // конец цикла for end; // конец процедуры TriplePrint

Здесь мы определили процедуру TriplePrint, которая будет трижды выводить переданную ей в качестве аргумента строку, заключенную в двойные кавычки. Как видно, данная процедура имеет все составные части: ключевое слово procedure, имя, список параметров (в данном случае он всего один — строковая переменная str), блок объявления собственных переменных (целочисленная переменная i), и собственное тело, состоящее из оператора цикла for.

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

Отметим так же, что рассмотренная нами процедура сама содержит вызов другой процедуры — writeln. Процедуры могут быть встроенными. Иначе говоря, объявление одной процедуры можно помещать в заголовочную часть другой. Например, наша процедура TriplePrint может иметь вспомогательную процедуру, которая будет «подготавливать» строку к выводу. Для этого перед объявлением переменной i, разместим объявление еще одной процедуры. Назовем ее PrepareStr:

procedure PrepareStr; begin str := ‘»‘+str+'»‘; end;

Отметим, что переменная str, хотя и не передается этой процедуре в качестве параметра, тем не менее может в ней использоваться, поскольку данная процедура является составной частью процедуры TriplePrint, внутри которой данная переменная доступна для использования.

Таким образом, мы получаем две процедуры, одна из которых (TriplePrint) может использоваться во всей программе, а другая (PrepareStr) — только внутри процедуры TriplePrint. Чтобы преимущество использования процедур было очевидно, рассмотрим их на примере программы, которая будет использовать ее неоднократно, для чего обратимся к листингу 6.1 (см. так же пример в Demo\Part1\Procs).

Листинг 6.1. Использование процедур

program procs; <$APPTYPE CONSOLE>procedure TriplePrint(str: string); procedure PrepareStr; begin str := ‘»‘+str+'»‘; end; var i: integer; begin PrepareStr; for i := 1 to 3 do begin writeln(str); end; end; // конец процедуры TriplePrint begin // начало тела основной программы TriplePrint(‘Hello. ‘); // первый вызов TriplePrint TriplePrint(‘How are you. ‘); // 2-й вызов TriplePrint(‘Bye. ‘); // 3-й readln; end.

Очевидно, что если бы не процедура, то нам трижды пришлось бы писать цикл, свой для каждого слова. Таким образом, процедуры позволяют использовать единожды написанный код многократно, что существенно облегчает написание программ.

Функции

Подобно процедурам, описание функции состоит из заголовка и тела. Однако описание заголовка имеет 2 отличия: прежде всего, для функций используется ключевое слово function. Кроме того, поскольку функции всегда возвращают результат, завершается строка заголовка типом возвращаемого значения. Таким образом, для объявления функции мы получаем следующий синтаксис:

Возвращаемое значение может быть любого типа, кроме файлового. Что касается дальнейшего описания функции, то оно полностью аналогично таковому для процедур. Единственным дополнением является то, что в теле функции обязательно должна присутствовать хотя бы одна операция присваивания, в левой части которой должно быть либо имя функции, либо ключевое слово result. Именно это выражение и определяет возвращаемое функцией значение.

Рассмотрим пример функции, которая будет возвращать куб числа, переданного ей в качестве аргумента:

function cube(value: integer) : integer; result := value * value * value; >

Здесь определена функция, имеющая параметр value типа целого числа, которое она возводит в третью степень путем троекратного умножения, и результат присваивается специальной переменной result. Таким образом, чтобы в любом месте программы вычислить значение числа в 3-й степени, достаточно написать такое выражение:

В результате выполнения этого выражения переменной x будет присвоено значение 27. Данный пример иллюстрирует использование функций в классическом случае — для явного вычисления значения переменной. Однако функции могут использоваться в выражениях и напрямую. Например, можно поставить вызов функции cube в каком-либо месте арифметического выражения подобно обычной переменной:

Подобно процедурам, функции так же могут быть встроенными. Кроме того, функции могут включать в себя не только локальные функции, но и процедуры. Впрочем, верно и обратное — в процедурах могут использоваться локальные функции. Например, в той же процедуре TriplePrint можно было бы использовать не процедуру, а функцию PrepareStr, которая принимала бы строку и возвращала ее же в кавычках:

procedure TriplePrint(str: string); function PrepareStr(s: string) : string; begin result := ‘»‘+s+'»‘; end; var i: integer; begin for i := 1 to 3 do begin writeln(PrepareStr(str)); // функция использована как переменная end; end;

Как уже отмечалось, помимо специальной переменной result, в функциях можно использовать другую автоматически объявляемую переменную, имя которой соответствует имени функции. Так, для функции cube имя переменной также будет cube:

function cube(value: integer) : integer; cube := value * value * value; >

В данном случае оба варианта будут вести себя полностью аналогично. Различия проявляются лишь в том случае, если использовать такую переменную в выражениях в теле функции. В подобных случаях следует использовать именно переменную result, а не имя функции, поскольку использ0овании имени функции в выражении внутри самой функции приведет к ее рекурсивному вызову.

Рекурсия

Таким образом мы подошли к теме рекурсии — вызову подпрограммы из самой себя. Это не является ошибкой, более того, целый ряд алгоритмов решить без рекурсии вообще было бы затруднительно.

Рассмотрим вопрос рекурсии на следующем примере:

function recfunc(x: integer) : integer begin dec(x); // функция декремента, уменьшает целое на 1 if x > 5 then x := recfunc(x); result := 0; // возвращаемое значение тут не используется end;

Здесь мы объявили функцию recfunc, принимающую один аргумент, и вызывающую саму себя до тех пор, пока значение этого аргумента больше 5. Хотя на первый взгляд может показаться, что такое поведение функции похоже на обычный цикл, на самом деле все работает несколько по-иному: если вы вызовите ее со значением 8, то она выдаст вам 3 сообщения в следующей последовательности: 5, 6, 7. Иначе говоря, функция вызывала саму себя до тех пор, пока значение x было больше 5, и собственно вывод сообщений начала 3-я по уровню получившейся вложенности функция, которая и вывела первое сообщение (в данном случае им стало 5, т.е. уменьшенное на единицу 6).

Чтобы представить себе более наглядно, как работает рекурсивный вызов, дополним эту функцию выводом комментариев, а так же счетчиком глубины рекурсии. Для этого мы, во-первых, задействуем возвращаемое функцией значение, а во-вторых, добавим еще один параметр, который и будет счетчиком. Результат проделанной работы приведен в листинге 6.2.

Листинг 6.2. Рекурсия с комментариями

program recurse; <$APPTYPE CONSOLE>function recfunc(x, depth: integer) : integer; begin dec(x); if x > 5 then begin write(‘Current recursion depth is: ‘); write(depth); write(‘, current x value is: ‘); writeln(x); inc(depth); depth:=recfunc(x, depth); end else writeln(‘End of recursive calls. ‘); write(‘Current recursion depth is: ‘); write(depth); write(‘, current x value is: ‘); writeln(x); dec(depth); result := depth; end; begin recfunc(8,0); readln; end.

Исходный код находится в Demo\Part1\Recurse, там же находится и исполняемый файл recurse.exe, результат работы которого вы можете увидеть на своем экране.

Использование параметров

Параметры в процедурах и функциях могут применяться не только по своему прямому предназначению — для передачи данных подпрограмме, но так же могут быть использованы для возвращения значений. Подобное их использование может быть вызвано, например, необходимостью получить более одного значения на выходе функции. Синтаксис объявления параметров в таком случае несколько отличается от стандартного — перед именем параметра следует использовать ключевое слово var:

procedure Circle (square: real; var radius, length: real);

Данная процедура принимает «на обработку» одно значение — площадь (square), а возвращает через свои параметры два — радиус (radius) и длину окружности (length). Практическая ее реализация может выглядеть таким образом:

procedure Circle (square: real; var radius, length: real); begin radius := sqrt(square / pi); // функция pi возвращает значение числа ? length := pi * radius * 2; end;

Теперь, чтобы воспользоваться этой функцией, следует объявить в программе 2 переменные, которые будут переданы в качестве аргументов этой процедуре и получат результаты. Их имена не важны, важно лишь, чтобы они были такого же, или совместимого типа, т.е. вещественные, например:

var r,l: real; . Circle(100,r,l);

После вызова функции Circle, переменные r и l получат значения радиуса и длины окружности. Остается их вывести при помощи writeln. Исходный код программы приведен в листинге 6.3.

Листинг 6.3. Процедура с параметрами

program params; <$APPTYPE CONSOLE>procedure Circle (square: real; var radius, length: real); begin //функция sqrt извлекает корень, а функция pi возвращает значение числа ? radius := sqrt(square / pi); length := pi * radius * 2; end; var r,l: real; begin Circle(100,r,l); writeln(r); writeln(l); readln; end.

Запустив такую программу, можно убедиться, что она работает и выводит верные результаты, однако вид у них получается довольно-таки неудобочитаемый, например, длина окружности будет представлена как «3,54490770181103E+0001». Чтобы сделать вывод более удобным для восприятия, нам понадобится функция FloatToStrF. С ее помощью мы можем определить вывод числа на свое усмотрение, например:

Кроме того, не помешало бы указать, где радиус, а где — длина окружности. Для этого модернизируем строки вывода результатов следующим образом:

writeln(‘Radius is: ‘+FloatToStrF(r,ffFixed,12,8)); writeln(‘Length is: ‘+FloatToStrF(l,ffFixed,12,8));

Наконец, не помешало бы сделать программу более полезной, для чего предусмотрим возможность ввода значения площади круга пользователем. В этих целях нам понадобится еще одна переменная (назовем ее s) и выражение для считывания ввода. Не помешает так же приглашение, объясняющее пользователю, что надо делать. В итоге основной блок программы получит следующий вид:

. var s,r,l: real; begin write(‘Input square: ‘); readln(s); Circle(s,r,l); writeln(‘Radius is: ‘+FloatToStrF(r,ffFixed,12,8)); writeln(‘Length is: ‘+FloatToStrF(l,ffFixed,12,8)); readln; end.

В принципе, это уже лучше, однако не помешало бы добавить обработку возможных ошибок ввода. Скажем, площадь должна быть больше 0. Проверку на то, является ли значение s больше нуля, можно производить непосредственно в основном коде программы, но в целях создания более универсального кода, вынесем ее в подпрограмму. Для этого первой инструкцией процедуры Circle должна быть проверка значения площади:

Таким образом, в случае, если введенное пользователем значение окажется нулевым или отрицательным, выполнение процедуры будет прекращено. Но возникает другой вопрос: как сообщить программе о том, что вычисления не были выполнены? Пожалуй, в данном случае следовало бы заменить процедуру функцией, которая возвращала бы истину, если вычисления произведены, и ложь в противном случае. Вот что у нас получится:

function Circle(square: real; var radius, length: real) : boolean; begin result := false; if (square

В начале функции мы определили возвращаемое значение как ложь. В результате, если параметр square не проходит проверку, то функция будет завершена и возвратит именно это значение. Если же проверка будет пройдена, то функция выполнится до конца, т.е. как раз до того момента, когда ее результатом станет истина.

Поскольку программа теперь может получить сведения о том, выполнились ли преобразования на основании возвращаемого функцией Circle булевского значения, остается добавить такую проверку в тело программы. В качестве условия для условного оператора в таком случае подойдет сама функция Circle (на самом деле, условием будет выступать не функция, а как раз возвращаемое ей значение):

if Circle(s,r,l) then begin // вывод end else // сообщить об ошибке

Результатом проделанной работы будет программа, приведенная в листинге 6.4. Она же находится в Demo\Part1\Params.

Листинг 6.4. Функция с параметрами

program params; <$APPTYPE CONSOLE>uses sysutils; //этот модуль соджержит функцию FloatToStrF function Circle(square: real; var radius, length: real) : boolean; begin result := false; if (square

Итак, при помощи ключевого слова var в списке параметров подпрограммы мы можем добиться использования передаваемых аргументов в том блоке, где был произведен вызов данной подпрограммы. В несколько другом аспекте используется ключевое слово const. Фактически, оно объявляет локальную константу, т.е. значение, которое нельзя изменять внутри данной процедуры или функции. Это бывает полезным в том случае, когда такое изменение недопустимо по логике программы и служит гарантией того, что такое значение не будет изменено.

При этом открывается еще одна возможность, связанная с константами, а именно — использование предопределенных значений. Например, можно определить функцию следующим образом:

function MyBetterFunc(val1: integer; const val2: integer = 2); begin result := val1*val2; end;

Обращение же к такой функции может иметь 2 варианта: с указанием только одного аргумента (для параметра val1), или же с указанием обоих:

x := MyBetterFunc(5); // получим 10 x := MyBetterFunc(5,4); // получим 20

Оба вызова будут верными, просто в первом случае для второго параметра будет использовано значение, заданное по умолчанию.

Области видимости

Еще одной важной деталью, касающейся использования подпрограмм, является видимость переменных. Само понятие видимости подразумевает под собой тот факт, что переменная, объявленная в одном месте программы может быть доступна, или наоборот, недоступна, в другом. Прежде всего, это касается подпрограмм: как мы уже успели отметить, переменные, объявленные в заголовке процедур или функций, только в данной процедуре (функции) и будут доступны — на то они и называются локальными:

program Project1; procedure Proc1; var a: integer; begin a := 5; //верно. Локальная переменная a здесь видна end; begin a := 10; //Ошибка! Объявленная в процедуре Proc1 переменнаая здесь не видна end.

В то же время переменные, объявленные в основном заголовке программы, доступны во всех входящих в нее подпрограммах. Потому они и называются глобальными. Единственное замечание по этому поводу состоит в том, что глобальная переменная должна быть объявлена до функции, т.е. выше ее по коду программы:

program Project2; var a: integer; // глобальная переменная a procedure Proc1; begin a := 5; // верно b := 10; // Ошибка! Переменая b на этот момент еще не объявлена end; var b: integer; // глобальная переменная b begin a := 10; // верно b := 5; // тоже верно. Здесь видны все г var a: integer; // глобальная переменная end.

Теперь рассмотрим такой вариант, когда у нас имеются 2 переменных с одним и тем же именем. Разумеется, компилятор еще на стадии проверки синтаксиса не допустит, чтобы в программе были объявлены одноименные переменные в рамках одного диапазона видимости (скажем, 2 глобальных переменных X, или 2 локальных переменных X в одной и той же подпрограмме). Речь в данном случае идет о том, что произойдет, если в одной и той же программе будет 2 переменных X, одна — глобальная, а другая — локальная (в какой-либо подпрограмме). Если с основным блоком программы все ясно — в нем будет присутствовать только глобальная X, то как быть с подпрограммой? В таком случае в действие вступает правило близости, т.е. какая переменная ближе (по структуре) к данному модулю, та и есть верная. Применительно к подпрограмме ближней оказывается локальная переменная X, и именно она будет задействована внутри подпрограммы.

program Project3; var X: integer; procedure Proc1; var X: integer; begin X := 5; // Здесь значение будет присвоено локальной переменной X end; begin X := 10; // Здесь же значение будет присвоено голобальной переменной X end.

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

program Project1; procedure Proc1; procedure SubProc; begin end; begin SubProc; // Верно. Вложенная процедура здесь видна. end; begin Proc1; // Верно. Процедура Proc1 объявлена в зоне глобальной видимости SubProc; // Ошибка! Процедура SubProc недоступна за пределами Proc1. end.

Наконец в том случае, когда имена встроенной и некой глобальной процедуры совпадают, то, по аналогии с переменными, в области видимости встроенной процедуры, именно она и будет выполнена.

Видимость в модулях

Все то, что мы уже рассмотрели, касалось программ, умещающихся в одном единственном файле. На практике же, особенно к тому моменту, когда мы перейдем к визуальному программированию, программы будут включать в себя множество файлов. В любом случае, программа на Object Pascal будет иметь уже изученный нами файл проекта — dpr, или основной модуль программы. Все прочие файлы будут располагаться в других файлах, или модулях (units), с типичным для Pascal расширением pas. При объединении модулей в единую программу возникает вопрос видимости переменных, а так же процедур и функций в различных модулях.

Для начала вернемся к рассмотрению структуры модуля, которая имеет ряд отличий от структуры программы. Итак, в простейшем случае, модуль состоит из названия, определяемого при помощи ключевого слова unit, и 2 секций — interface и implementation. Так вот как раз первая секция, interface, и служит для определения (декларации) типов данных, переменных, функций и процедур данного модуля, которые должны быть доступны за пределами данного модуля.

Чтобы лучше в этом разобраться, создадим программу, состоящую из 2 модулей — основного (dpr) и дополнительного (pas). Для этого сначала создайте новый проект типа Console Application, а затем добавьте к нему модуль, для чего из подменю File ‘ New выберите пункт Unit. После этого сохраните проект, щелкнув по кнопке Save All (или File ‘ Save All). Обратите внимание, что первым будет предложено сохранить не файл проекта, а как раз файл дополнительного модуля. Назовем его extunit.pas, а сам проект — miltiunits (см. Demo\Part1\Visibility). При этом вы увидите, что в части uses файла проекта произошло изменение: кроме постоянно добавляемого модуля SysUtils, появился еще один модуль — extunit, т.е. код стал таким:

uses SysUtils, extunit in ‘extunit.pas’;

Мы видим, что Delphi автоматически добавила пояснение, в каком файле находится подключаемый модуль. Это вызвано тем, что если о расположении собственных модулей Delphi все известно, то пользовательские модули могут находиться где угодно на жестком диске ПК. Но в данном случае мы сохранили и файл программы, и подключаемый модуль в одном каталоге, следовательно, их пути совпадают, и данное указание можно было бы опустить:

uses SysUtils, extunit;

Тем не менее, оставим код как есть, и приступим к разработке модуля extunit. В нем, в части implementation, напишем 2 процедуры — ExtProc1 и ExtProc2. Обе они будут делать одно и то же — выводить строку со своим названием. Например, для первой:

Теперь вернемся к главному модулю программы и попробуем обратиться к процедуре ExtProc1:

. begin ExtProc1; end.

Попытка компиляции или запуска такой программы приведет к ошибке компилятора «Undeclared identifier», что означает «неизвестный идентификатор». И действительно, одного лишь описания процедуры недостаточно, чтобы она была доступна вне своего модуля. Так что перейдем к редактированию extunit и в секции interface напишем строку:

Такая строка, помещенная в секцию interface, является объявлением процедуры ExtProc1, и делает ее видимой вне данного модуля. Отметим, что в секции interface допускается лишь объявлять процедуры, но не определять их (т.е. тело процедуры здесь будет неуместно). Еще одним полезным эффектом от объявления процедур является то, что таким образом можно обойти такое ограничение, как необходимость определения подпрограммы до ее вызова. Иначе говоря, поскольку в нашем файле уже есть 2 процедуры, ExtProc1и ExtProc2, причем они описаны именно в таком порядке — сначала ExtProc, а потом ExtProc2, то выведя объявление ExtProc2 в interface, мы сможем обращаться к ExtProc2 из ExtProc1, как это показано в листинге 6.5:

Листинг 6.5. Объявление процедур в модуле

unit extunit; interface procedure ExtProc1; procedure ExtProc2; implementation procedure ExtProc1; begin writeln(‘ExtProc1’); ExtProc2; // Если объявления не будет, то компилятор выдаст ошибку end; procedure ExtProc2; begin writeln(‘ExtProc2’); end; end.

Отметим, что теперь процедуры ExtProc2, так же, как и ExtProc1, будет видна не только по всему модулю extunit, но и во всех использующей этот модуль программе multiunits.

Разумеется, все, что было сказано о процедурах, верно и для функций. Кроме того, константы и переменные, объявленные в секции interface, так же будут видны как во всем теле модуля, так и вне него. Остается лишь рассмотреть вопрос пересечения имен, т.е. когда имя переменной (константы, процедуры, функции) в текущем модуле совпадает с таковым в подключенном модуле. В этом случае вновь вступает в силу правило «кто ближе, тот и прав», т.е. будет использоваться переменная из данного модуля. Например, если в extunit мы объявим типизированную константу Z, равную 100, а в multiunits — одноименную константу, равную 200, то обратившись к Z из модуля extunit, мы получим значение 100, а из multiunits — 200.

Если же нам в multiunits непременно понадобится именно та Z, которая находится в модуле extunit, то мы все-таки можем к ней обратиться, для чего нам пригодится точечная нотация. При этом в качестве имени объекта указывают название модуля:

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

Некоторые стандартные функции

В Object Pascal, как уже отмечалось, имеются огромное количество стандартных процедур и функций, являющихся составной частью языка, и с некоторыми мы уже знакомы (например, приведенные в табл. 5.1 и 5.2 функции преобразования). Детальное описание всех имеющихся в Object Pascal процедур и функций можно получить в справочной системе Delphi, однако мы все-таки рассмотрим здесь некоторые из них, чтобы составить общее представление — см. таблицу 6.1.

Таблица 6.1. Некоторые стандартные процедуры и функции Delphi

Синтаксис Группа Модуль Описание
function Abs(X); арифметические System Возвращает абсолютное значение числа
procedure ChDir(const S: string); управления файлами System Изменяет текущий каталог
function Concat(s1 [, s2. sn]: string): string; строковые System Объединяет 2 и более строк в 1
function Copy(S; Index, Count: Integer): string; строковые System Возвращает часть строки
function Cos(X: Extended): Extended; тригонометрические System Вычисляет косинус угла
procedure Delete(var S: string; Index, Count: Integer); строковые System Удаляет часть строки
function Eof(var F): Boolean; ввод-вывод System Проверяет, достигнут ли конец файла
procedure Halt [ ( Exitcode: Integer) ]; управления System Инициирует досрочное прекращение программы
function High(X); диапазона System Возвращает максимальное значение из диапазона
procedure Insert(Source: string; var S: string; Index: Integer); строковые System Вставляет одну строку в другую
function Length(S): Integer; строковые System Возвращает длину строки или количество элементов массива
function Ln(X: Real): Real; арифметические System Возвращает натуральный логарифм числа (Ln(e) = 1)
function Low(X); диапазона System Возвращает минимальное значение из диапазона
procedure New(var P: Pointer); размещения памяти System Создает новую динамическую переменную и назначает указатель для нее
function ParamCount: Integer; командной строки System Возвращает количество параметров командной строки
function ParamStr(Index: Integer): string; командной строки System Возвращает указанный параметр из командной строки
function Pos(Substr: string; S: string): Integer; строковые System Ищет вхождение указанной подстроки в строку и возвращает порядковый номер первого совпавшего символа
procedure RmDir(const S: string); ввод-вывод System Удаляет указанный подкаталог (должен быть пустым)
function Slice(var A: array; Count: Integer): array; разные System Возвращает часть массива
function UpCase(Ch: Char): Char; символьные System Преобразует символ в верхний регистр
function LowerCase(const S: string): string; строковые SysUtils Преобразует ASCII-строку в нижний регистр
procedure Beep; разные SysUtils Инициирует системный сигнал
function CreateDir(const Dir: string): Boolean; управления файлами SysUtils Создает новый подкаталог
function CurrentYear: Word; даты и времени SysUtils Возвращает текущий год
function DeleteFile(const FileName: string): Boolean; управления файлами SysUtils Удаляет файл с диска
function ExtractFileExt(const FileName: string): string; имен файлов SysUtils Возвращает расширение файла
function FileExists(const FileName: string): Boolean; управления файлами SysUtils Проверяет файл на наличие
function IntToHex(Value: Integer; Digits: Integer): string; форматирования чисел SysUtils Возвращает целое в шестнадцатеричном представлении
function StrPCopy(Dest: PChar; const Source: string): PChar; строковые SysUtils Копирует Pascal-строку в C-строку (PChar)
function Trim(const S: string): string; строковые SysUtils Удаляет начальные и конечные пробелы в строке
function TryStrToInt(const S: string; out Value: Integer): Boolean; преобразования типов SysUtils Преобразует строку в целое
function ArcCos(const X: Extended): Extended; тригонометрические Math Вычисляет арккосинус угла
function Log2(const X: Extended): Extended; арифметические Math Возвращает логарифм по основанию 2
function Max(A,B: Integer): Integer; арифметические Math Возвращает большее из 2 чисел
function Min(A,B: Integer): Integer; арифметические Math Возвращает меньшее из 2 чисел

Те функции, которые имеются в модуле System, являются основными функциями языка, и для их использования не требуется подключать к программе какие-либо модули. Все остальные функции и процедуры можно назвать вспомогательными, и для их использования следует подключить тот или иной модуль, указав его в uses, например, как это делает Delphi уже при создании новой программы с SysUtils:

Что касается практического применения той или иной функции, то оно определяется, прежде всего, той группой, к которой данная функция относится. Например, арифметические функции используются для различных математических расчетов, строковые используются для манипуляций со строками и т.д. Разумеется, в каждой категории имеется множество других функций, помимо тех, что приведены в таблице 6.1, однако по ней можно получить общее представление о том, что есть в распоряжении Delphi-программиста.

Функции в действии

В целом мы уже ознакомились с несколькими десятками предопределенных процедур и функций, а так же умеем создавать собственные. Пора применить полученные знания на практике, для чего вновь вернемся к программе, рассмотренной в главе, посвященной операторам — игре «Угадай-ка». В ней, по сути, был реализован только один из рассмотренных в самом начале книги алгоритмов — угадывания числа. Что касается алгоритма управления, то на тот момент мы оставили его без внимания.

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

  1. Реализовать-таки возможность повторного прохождения игры без перезапуска программы;
  2. Добавить немного «геймплея». Иначе говоря, введем уровни сложности и подсчет очков. Новые уровни можно реализовать как повторное прохождение игры с увеличением сложности (скажем, за счет расширения диапазона загадываемых значений);
  3. В продолжение п. 2 добавить еще и таблицу рекордов, которая будет сохраняться на диске.

Поскольку часть работы уже выполнена, то для того, чтобы приступить к разработке новой версии игры (назовем ее «Угадай-ка 2.0»), мы не будем как обычно создавать новый консольный проект в Delphi, а откроем уже существующий (Ugadaika) и сохраним его под новым именем, скажем, Ugadaika2, и в новом каталоге. Таким образом, мы уже имеем часть исходного кода, отвечающую за угадывание, в частности, цикл while (см. листинг 4.5). Этот фрагмент логичнее всего выделить в отдельную процедуру, вернее даже функцию, которая будет возвращать число попыток, сделанное пользователем. Для этого создадим функцию, которая будет принимать в качестве аргумента число, которое следует угадать, а возвращаемым значением будет целое, соответствующее числу попыток. Ее объявление будет таким:

function GetAttempts(a: integer):integer;

Данная функция так же должна иметь в своем распоряжении переменную, необходимую для ввода пользователем своего варианта ответа. Еще одна переменная нужна для подсчета результата, т.е. количества попыток. В качестве первой можно было бы использовать глобальную переменную (b), однако во избежание накладок, для локального использования в функции следует использовать локальную же переменную. Что касается переменной-счетчика, то для нее как нельзя лучше подходит автоматическая переменная result. Еще одним изменением будет использование цикла repeat вместо while. Это вызвано тем, что с одной стороны, тем, что хотя бы 1 раз пользователь должен ввести число, т.е. условие можно проверять в конце цикла, а с другой мы можем избавиться от присвоения лишнего действия, а именно — присвоения заведомо ложного значения переменной b. Ну и еще одно дополнение — это второе условие выхода, а именно — ограничение на число попыток, которое мы установим при помощи константы MAXATTEMPTS:

const MAXATTEMPTS = 10;

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

Листинг 6.6. Функция GetAttempts

function GetAttempts(a: integer):integer; var b: integer; begin Result:=0; repeat inc(Result); // увеличиваем счетчик числа попыток write(#13+#10+’?:’); read(b); if (b>a) then begin write(‘Too much!’); continue; end; if (b

Теперь, когда подготовительная работа сделана, можно браться за реализацию намеченных изменений. Прежде всего, в теле программы нам потребуется цикл, который как раз и будет обеспечивать логику исполнения программы. Для него нам так же понадобятся переменные. В частности, нужны счетчик цикла, устанавливающий текущий уровень сложности, так же нужны переменные для хранения набранных очков и числа попыток, и, кроме того, не помешает заранее определить файловую переменную для таблицы рекордов и строковую — для ввода имени «рекордсмена». Итого мы получаем следующий список переменных перед основным блоком программы:

var level, score, attempt: integer; f: TextFile; s: string;

Теперь инициализируем счетчик псевдослучайных чисел (т.е. оставим randomize на месте) и инициализируем нулем значения счета и уровня:

Наконец, напишем цикл для основного блока программы. Этот цикл должен быть выполнен хотя бы один раз и будет продолжать выполняться до тех пор, пока число попыток в последнем уровне было меньше максимально допустимого. В результате получаем цикл repeat со следующим условием:

В самом цикле нам потребуется, прежде всего, выводить информацию о текущем уровне, а так же о диапазоне отгадываемых чисел. После этого надо будет получить число попыток при помощи функции GetAttempts, вычислить набранные очки и сообщить о них пользователю, после чего увеличить счетчик цикла на 1 и перейти к следующей его итерации. В результате мы получим следующий фрагмент кода:

repeat writeln(‘Level ‘+IntToStr(level)+’:’); writeln(‘From 0 to ‘+IntToStr(level*100)); attempt:=GetAttempts(random(level*100+1)); score:=score+(MAXATTEMPTS-attempt)*level; writeln(#10+’You current score is: ‘+IntToStr(score)); inc(level); until attempt>MAXATTEMPTS;

После завершения работы цикла, т.е. когда пользователь хоть раз истратит на отгадывание все 10 попыток, следует сообщить итоговый результат и сравнит его с предыдущим значением, которое следует считать из файла. Файл мы назовем records.txt, и сопоставим с переменной f:

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

if not FileExists(‘record.txt’) then begin Rewrite(f); writeln(f,’0′); // первая строка содержит число-рекорд writeln(f,’None’); // а вторая — имя последнего победителя CloseFile(f); end;

Теперь можно считать этот файл. Правда, мы упустили из виду, что нам здесь тоже нужна переменная — для считывания предыдущего рекорда. В то же время, на данный момент мы уже имеем 2 ненужных для дальнейшей работы программы переменных — attempt и level, так что вполне можно воспользоваться любой из них для этих целей. Таким образом, мы получим следующий код:

Reset(f); readln(f, attempt); readln(f,s); writeln(#10+’BEST SCORE: ‘+IntToStr(attempt)+’ by ‘+s); CloseFile(f);

Ну и последнее, чего нам остается — это проверить, является ли новое значение выше рекорда, и если да — то записать новый рекорд в файл, не забыв спросить имя игрока:

Вот, собственно, и все. Полный код получившейся программы можно увидеть на листинге 6.7, или же в файле проекта в каталоге Demo\Part1\Ugadaika2.

Листинг 6.7. Программа угадай-ка, окончательный вариант

В завершение отметим, что эта программа использует использование не только функций, но и констант, глобальных и локальных переменных, а так же циклов и операций файлового ввода-вывода. Таким образом, на текущий момент мы познакомились со всеми основами обычного, процедурного программирования. Пора двигаться дальше — к объектно-ориентированному программированию в Object Pascal!

Математические функции в Дельфи

Математические функции описаны в модуле Math. Этот модуль должен быть подключен к приложению оператором uses.

Таблица математических функций в Delphi:

Функция

Описание

Аргумент

Abs (X)

абсолютное значение

целое и действительное

выражение

Ceil (X)

округление донаименьшего целого

Compare

Value (A, B) сравнение двух значений

целые и действительные

выражения

DivMod (Divided,

Divisor, Result,

Remainer) целочисленное деление:Result – результат,

Remainder – остаток

EnsureRange

(AValue,

Amin,Amax) возвращает ближайшеек Avalue в диапазоне

Amin — Amax

целые и действительные

выражения

Exp(X)

экспонента

выражение

Floor (X)

округление до наиб целого,меньшего или равного

аргумента

Frac (X)

дробная часть X-Unt(X)

Frexp(X, Mantissa,

Exponent) выделяет мантиссуи показатель степени 2

Int(X)

целая часть аргумента

выражение

IntPower(X,E)

возведение Xв целую степень E: X в степени Е

Integer

IsInfinite(X)

определяет, не равенли аргумент бесконеч

выражение

IsNan (X)

определяет, не равен лиаргумент Nan – нечисловой

величине

выражение

IsZero(X, Epsilon)

определяет, не явлли аргумент от нуля

менее чем на Epsilon

целые или действ

числа

Ldepx(X,P)

умножение X на 2 в степени Р

Integer

Ln(X)

натуральный логарифм (X)

выражение

LnXP1(X)

натуральный логарифм(X+1)

Log10(X)

десятичный логарифм от X

Log2(X)

логарифм от Xпо основанию 2

LogN (N,X)

логарифм от Xпо основанию N

Max(A,B)

максимум двух чисел

int64, Single, Double

Extended

Min(A,B)

минимум двух чисел

Pi

Poly(X,C)

вычисляет полином Xс массивом коэфф С

массив Double

Power (X, E)

Илон Маск рекомендует:  Эмуляторы j2me
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL