|
Основной форум Сюда все проблемы связанные с программированием. |
22.10.2007, 08:59
|
#1
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
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;
..... // Тут типа метка
.....
|
(Offline)
|
|
22.10.2007, 15:16
|
#2
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
А если ни одно условие не выполнится?
Программа зависнет.
|
(Offline)
|
|
22.10.2007, 16:54
|
#3
|
Нуждающийся
Регистрация: 31.07.2007
Сообщений: 89
Написано одно полезное сообщение
|
Re: Tips & tricks (Трюки кодинга)
нет, из-за until true; цикл тока один раз пройдет...
|
(Offline)
|
|
22.10.2007, 19:04
|
#4
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
А elseif в MP нет?
|
(Offline)
|
|
23.10.2007, 08:35
|
#5
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
А что это за оператор? Такого помоему даже в TP нет.
|
(Offline)
|
|
23.10.2007, 09:03
|
#6
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.10.2007, 13:14
|
#7
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
odd
Так если есть esle if, можно с его помощью организовать переключатель. Хотя, конечно, в цикле удобней, так как break можно поставить именно там, где нужно.
|
(Offline)
|
|
25.10.2007, 22:35
|
#8
|
Нуждающийся
Регистрация: 13.11.2006
Сообщений: 60
Написано одно полезное сообщение
|
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.
Может вам это извесно, но новичкам полезно)
|
(Offline)
|
|
31.10.2007, 08:55
|
#9
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
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; // Вверх
и всё.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
|
|
01.11.2007, 16:58
|
#10
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
03.11.2007, 09:07
|
#11
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
Сорри за флуд, не читал того поста.
|
(Offline)
|
|
04.11.2007, 00:08
|
#12
|
Мастер
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений (для 252 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
|
(Offline)
|
|
07.11.2007, 01:12
|
#13
|
Оператор ЭВМ
Регистрация: 27.11.2006
Сообщений: 28
Написано одно полезное сообщение
|
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;
|
(Offline)
|
|
07.11.2007, 08:22
|
#14
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
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мс
Так что я был прав. Первый пример и короче и выполняется быстрее.
|
(Offline)
|
|
07.11.2007, 12:13
|
#15
|
Нуждающийся
Регистрация: 24.05.2006
Сообщений: 64
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Tips & tricks (Трюки кодинга)
odd, не факт, надо на мобиле проверять,
раньше сравнивал, что быстрее abs или if на компе поедил один, на мобиле другой.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:18.
|