А что делать, если пассажиров несколько? Лепить все данные на одну страницу? А если кто-то покупает билеты на компанию из шести человек? Мне кажется, должно быть по одной странице с формой на каждого пассажира, а в конце сводка о всех введенных данных с возможностью вернуться на предыдущие страницы для их редактирования. На этой же странице должны быть кнопки «Купить билет сейчас» и «Забронировать билет». Еще неплохо было бы иметь возможность вернуться к странице выбора рейса без потери введенных данных о пассажирах. (Вдруг вы заполнили все данные, но вдруг поняли, что выбрали неправильный день).
Ага, зато надо «бегать» до кнопки Escape. По моему опыту, чаще оказывается проще стрелками перемещаться, не выходя из режима вставки, чем исполнять Esc, h/j/k/l, a/i.
Можно долго рассуждать про несовершенство школьной программы, фантазировать на тему индивидуального выбора предметов и так далее. По-моему, первоочередная проблема состоит в качестве учителей. Нужно поднять зарплаты учителям до достойного уровня и омолодить преподавательский состав. Нужно, чтобы учитель был мотивирован и не занимался экстремальным выживанием, иначе никакие революционные нововведения не помогут.
Можно сделать примерно такой алгоритм. Задержку генерировать случайно, но при этом хранить в специальной переменной суммарную величину отставания/опережения. Как только эта величина выходит за допустимые рамки (30 секунд, например), каждый раз вычитать/прибавлять к случайной задержке один-два «тика», чтобы сместить случайные длительности в нужную сторону. Думаю, должно влезть в память без проблем.
Судя по отсутствию комментариев, никто не понял, о чем этот топик. Я тоже не понял. Стиль изложения скорее не академический, а «наукобразный». Или Вы под текстом в академическом стиле подразумеваете тот, который никто никогда не дочитает до конца? Лучше бы привели конкретный пример. Без него все это выглядит игрой слов и притянутой за уши математикой.
И вообще какая-то каша:
Возможность повторного использования достигается за счет соблюдения основных принципов объектно-ориентированного программирования: инкапсуляции, наследования и полиморфизма.
…
Для повторного использования разработанных модулей необходимо не только соблюдение принципов объектно-ориентированного программирования,
Как будто без объектно-ориентированного программирования невозможно повторное использование кода.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the «Software»), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
[тут еще про No warranty и прочее]
Как видно, по сути единственное требование — включать исходный копирайт везде, где программа используется в том или ином виде.
Что вы выиграете, написав следующий код? typedef string Name;
typedef string Surname;
Вы сможете использовать Name вместо string, когда будете использовать строку для хранения имени. Что же это даст? Если вы вдруг захотите использовать другой класс для хранения имени, то нужно будет лишь поменять typedef. Только это будет работать лишь в том случае, если новый класс будет на 100% совместим со string. Зачем такое вообще может понадобиться? Если вдруг и понадобится, всегда можно заменить тип на другой вручную — это не такая уж и большая работа.
Какой же ценой дается такое сомнительное удовольствие?
— Вы усложнили программу, добавив в пространство имен еще два новых имени для типа string. Как известно, не стоит плодить сущности без необходимости.
— Другому человеку (или вам через пару месяцев), читающему ваш код, придется лезть и смотреть, что же такое Name и Surname. Если бы он сразу видел string, ему сразу стало бы все понятно.
— Вы все равно будете работать с этим типом как со string. Так или иначе, когда вы будете работать с переменной, объявленной как Name, вам придется держать в голове то, что Name это string и работать соответствующим образом.
— Предположим, нужно вывести имя большими буквами. Пусть есть функция string capitalize(string s), которая меняет все маленькие буквы на заглавные и есть Name name;. У вас два варианта: Name capitalized_name = capitalize(name);
или string capitalized_name = capitalize(name);
Какой же из них выбрать? Если первый, то получится, что string должен приводится к Name и обратно. Если второй, то зачем же мы тогда объявляли Name, если используем string?
Таким образом, используя такой typedef, вы должны будете работать с Name так же, как со string. Для этого вам придется держать в голове дополнительную информацию.
Если же вы будете просто использовать string, вы сделаете программу гораздо более простой для понимания. Если вы видите string, то вам сразу все ясно. Используйте имена переменных для описания их предназначения, а не имена их типов.
Получился отличный пример злоупотребления typedef'ом. Никогда не стоит так делать, потому что это лишь усложняет программу и не приносит вообще никакой пользы. Вам теперь придется знать не только что такое Person, но и что такое Name и Surname.
Такой код может, кстати, и иметь смысл. Если функция NormalizeTrackType описана в этом же модуле и возвращает строковый литерал, то указатели будут совпадать.
На всякий случай пример: chmod -x+X+r-w,u+w -R dir
-x убирает право на исполнение у файлов,
+X при этом добавляет исполняемый бит на директории,
+r разрешает всем чтение,
-w запрещает всем запись,
u+w при этом разрешает запись владельцу
uint32 hash_c(const char* str) {
uint32 h = 0;
while (*str)
h = 31*h + *str++;
return h;
}
И вообще какая-то каша:
Как будто без объектно-ориентированного программирования невозможно повторное использование кода.
Copyright © [year] by [copyright holders]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the «Software»), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
[тут еще про No warranty и прочее]
Как видно, по сути единственное требование — включать исходный копирайт везде, где программа используется в том или ином виде.
Да, само собой. Про «приводиться к Name и обратно» — это на случай, если typedef будет в будущем изменен на что-нибудь типа typedef MyString Name;.
Вот довольно неплохая аргументация Торвальдса на эту тему: lkml.indiana.edu/hypermail/linux/kernel/0206.1/0402.html, хотя немного превязанная именно к ядру Linux.
Что вы выиграете, написав следующий код?
typedef string Name;
typedef string Surname;
Вы сможете использовать Name вместо string, когда будете использовать строку для хранения имени. Что же это даст? Если вы вдруг захотите использовать другой класс для хранения имени, то нужно будет лишь поменять typedef. Только это будет работать лишь в том случае, если новый класс будет на 100% совместим со string. Зачем такое вообще может понадобиться? Если вдруг и понадобится, всегда можно заменить тип на другой вручную — это не такая уж и большая работа.
Какой же ценой дается такое сомнительное удовольствие?
— Вы усложнили программу, добавив в пространство имен еще два новых имени для типа string. Как известно, не стоит плодить сущности без необходимости.
— Другому человеку (или вам через пару месяцев), читающему ваш код, придется лезть и смотреть, что же такое Name и Surname. Если бы он сразу видел string, ему сразу стало бы все понятно.
— Вы все равно будете работать с этим типом как со string. Так или иначе, когда вы будете работать с переменной, объявленной как Name, вам придется держать в голове то, что Name это string и работать соответствующим образом.
— Предположим, нужно вывести имя большими буквами. Пусть есть функция
string capitalize(string s)
, которая меняет все маленькие буквы на заглавные и естьName name;
. У вас два варианта:Name capitalized_name = capitalize(name);
или
string capitalized_name = capitalize(name);
Какой же из них выбрать? Если первый, то получится, что string должен приводится к Name и обратно. Если второй, то зачем же мы тогда объявляли Name, если используем string?
Таким образом, используя такой typedef, вы должны будете работать с Name так же, как со string. Для этого вам придется держать в голове дополнительную информацию.
Если же вы будете просто использовать string, вы сделаете программу гораздо более простой для понимания. Если вы видите string, то вам сразу все ясно. Используйте имена переменных для описания их предназначения, а не имена их типов.
chmod -x+X+r-w,u+w -R dir
-x убирает право на исполнение у файлов,
+X при этом добавляет исполняемый бит на директории,
+r разрешает всем чтение,
-w запрещает всем запись,
u+w при этом разрешает запись владельцу
Ключ -R включает рекурсивный обход