forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Tips & tricks (Трюки кодинга) (http://forum.boolean.name/showthread.php?t=4828)

odd 22.10.2007 08:59

Tips & tricks (Трюки кодинга)
 
Давайте будем делиться в этом разделе различными хитростями и трюками программирования на MP.

Нестандартное использование оператора repeat
Когда я только начинал кодить на MP меня очень тяготило отсутствие оператора switch, который есть в C. Поэтому, когда нужно было делать множество проверок, то выглядело это так:

if ... then ...
if ... then ...
if ... then ...

Некрасиво, правда? А если таких проверок не один десяток, а то и сотня? Основной недостаток такой конструкции - невозможность отменить дальнейшие проверки если результат уже найден. Тут бы мог спасти оператор goto, но его в MP тоже нет. Но решение этой проблемы есть. Посмотрите нижеприведенный код и вам всё станет ясно:

repeat
if ... then begin ....; break; end;
if ... then begin ....; break; end;
if ... then begin ....; break; end;
until true;

C помощью сочетания repeat until true и break можно добиться и некоего подобия оператора goto т.е. условного/безусловного перехода на метку.

.....
..... // Какой-то код
.....
repeat
.....
..... // Код
.....
if ... then break; // Переход на метку
.....
..... // Код
.....
until true;
..... // Тут типа метка
.....

ViNT 22.10.2007 15:16

Re: Tips & tricks (Трюки кодинга)
 
А если ни одно условие не выполнится?
Программа зависнет.

XenuS 22.10.2007 16:54

Re: Tips & tricks (Трюки кодинга)
 
нет, из-за until true; цикл тока один раз пройдет...

alcoSHoLiK 22.10.2007 19:04

Re: Tips & tricks (Трюки кодинга)
 
А elseif в MP нет?

ViNT 23.10.2007 08:35

Re: Tips & tricks (Трюки кодинга)
 
А что это за оператор? Такого помоему даже в TP нет.

odd 23.10.2007 09:03

Re: Tips & tricks (Трюки кодинга)
 
Цитата:

Сообщение от alcoSHoLiK
А elseif в MP нет?

Нет, нету. Приходится писать так:
if .... then ....
else if .... then ....
else if .... then ....;

Операторы div и mod
Кстати, кто не знал, MP поддерживает операторы div и mod, хоть про них в хелпе ничего не сказано:
mod - остаток от деления, пример:

n := 19 mod 10; // Результат - число 9

div - целочисленное деление, пример:

n := 19 div 10; // Результат - число 1

alcoSHoLiK 23.10.2007 13:14

Re: Tips & tricks (Трюки кодинга)
 
odd
Так если есть esle if, можно с его помощью организовать переключатель. Хотя, конечно, в цикле удобней, так как break можно поставить именно там, где нужно.

MotoMustanger 25.10.2007 22:35

Re: Tips & tricks (Трюки кодинга)
 
Еще для тех кто не знал после if можно ставить два(или больше) условия(но тогда их нужно брать в скобки):
if (i=1) or (j=1) then [код]
(программа выполняет [код] если выполняется либо одно из этих условий, или оба)
if (i=1) xor (j=1) then [код]
(программа выполняет [код] если выполняется ТОЛЬКО ОДНО из этих условий)
if (i=1) and (j=1) then [код]
(программа выполняет [код] если выполняется ОБА условия вместе)
i,j - переменные числового типа
Если хотим написать чтоб данное условие не выполнялось, используем логический оператор not:
if not b then [код]
это то же самое что:
if b=false then [код]
Где b - переменная типа boolean.

Может вам это извесно, но новичкам полезно)

odd 31.10.2007 08:55

Re: Tips & tricks (Трюки кодинга)
 
Ещё один пример использования оператора mod

Допустим, у вас в программе есть меню из 5 пунктов. В переменной cursor хранится текущее положение курсора.
Тогда вы пишите:

key:=GetKeyClicked;
if (key=-60) or (key=-2) then cursor:=cursor+1; // Вниз
if (key=-59) or (key=-1) then cursor:=cursor-1; // Вверх
if cursor<0 then cursor:=5+cursor;
if cursor>4 then cursor:=cursor-5;

можно проще:

key:=GetKeyClicked;
if (key=-60) or (key=-2) then cursor:=(cursor+1) mod 5; // Вниз
if (key=-59) or (key=-1) then cursor:=(cursor+4) mod 5; // Вверх

и всё.

impersonalis 01.11.2007 16:58

Re: Tips & tricks (Трюки кодинга)
 
http://www.boolean.name/showpost.php?p=2893&postcount=2

odd 03.11.2007 09:07

Re: Tips & tricks (Трюки кодинга)
 
Сорри за флуд, не читал того поста.

dimanche13 04.11.2007 00:08

Re: Tips & tricks (Трюки кодинга)
 
http://homepage.ntlworld.com/config/...blecontrol.htm
думаю это тоже подойдет для данной темы

oposum_2000 07.11.2007 01:12

Re: Tips & tricks (Трюки кодинга)
 
Цитата:

Сообщение от odd
можно проще:

key:=GetKeyClicked;
if (key=-60) or (key=-2) then cursor:=(cursor+1) mod 5; // Вниз
if (key=-59) or (key=-1) then cursor:=(cursor+4) mod 5; // Вверх

и всё.

u menea vopros : kakoi kod vypolneaetsea dystree (1 ili 2 ) ?

1. cursor:=(cursor+1) mod 5;

2. cursor:=cursor+1;
if cursor>5 then cursor:=1;

odd 07.11.2007 08:22

Re: Tips & tricks (Трюки кодинга)
 
На самом деле это легко проверить:

Код:

Program TestBool;
Var timer, i, cursor: integer;
Begin
 cursor:=0;
 timer:=GetRelativeTimeMs;
 for i:=0 to 1000000 do
 begin
  cursor:=(cursor+1) mod 5;// Вставляй строчки сюда
 end;
 timer:=GetRelativeTimeMs-timer;
 DrawText(IntegerToString(timer),5,5);
 Repaint; Delay(5000);
End.

У меня результаты такие:
1 ПРИМЕР
Эмулятор Siemens CX65 - 285мс
Эмулятор WTK - 1204мс
Эмулятор NHAL midp2exe - 219мс
2 ПРИМЕР
Эмулятор Siemens CX65 - 310мс
Эмулятор WTK - 1484мс
Эмулятор NHAL midp2exe - 250мс

Так что я был прав. Первый пример и короче и выполняется быстрее.

Eddy 07.11.2007 12:13

Re: Tips & tricks (Трюки кодинга)
 
odd, не факт, надо на мобиле проверять,
раньше сравнивал, что быстрее abs или if на компе поедил один, на мобиле другой.


Часовой пояс GMT +4, время: 14:44.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot