Вход/Регистрация
Программист-прагматик. Путь от подмастерья к мастеру
вернуться

Хант Эндрю

Шрифт:

;

hour: hour_num

{if ($1>23) yyerror("Hour out of range");

$$ = $1 * 60;

};

minute: DIGIT DIGIT

{$$ = $1*10 + $2;

if ($$> 59) yyerrorf "minute out of range") ,

};

ampm: AM {$$ = AM_MINS;}

| PM {$$ = PM_MINS;)

;

hour num: DIGIT {$$ = $1;)

| DIGIT DIGIT {$$ = $1*10 + $2;}

;

Упражнение 8 из раздела "Языки, отражающие специфику предметной области"

Ответ:

$_ = shift;

/"(\d\d?)(am|pm)$/ && doTime($1, 0, $2, 12);

/"(\d\d?):(\d\d)(am|pm)$/ && doTime($1, $2, $3, 12);

/"(\d\d?):(\d\d)$/ && doTime($1, $2, 0, 24);

die "Invalid time $_\n";

#

# doTime(hour, min, ampm, maxHour)

#

sub doTime($$$$) {

my ($hour, $min, $offset, $maxHour) = @_;

die "Invalid hour: $hour" if ($hour>= $maxHour);

$hour += 12 if ($offset eq "pm")

print $hour*60 + $min, " minutes past midnight\n";

exit(0);

}

Упражнение 9: из раздела "Оценка"

Ответ: Ответ должен быть изложен, исходя из нескольких допущений:

• Лента содержит информацию, которую необходимо передать.

• Известна скорость ходьбы человека.

• Известно расстояние между компьютерами.

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

• Потери данных при хранении на ленте примерно равны их потерям при передаче по каналу связи.

Упражнение 10 из раздела "Оценка"

Ответ: Учитывая допущения ответа 9: Объем информации, содержащейся на стриммерной кассете (4 Гбайт), составляет 32 х 10^9 бит, так что передача эквивалентного объема по каналу со скоростью 1 Мбайт/с заняла бы около 32000 сек. (примерно 9 ч). Если человек движется с постоянной скоростью 3,5 мили в час, то, для того чтобы канал связи превзошел курьера, два компьютера должны располагаться друг от друга на расстоянии не менее 31 мили. Если это расстояние меньше, то победа остается за человеком.

Упражнение 11 из раздела "Обработка текста"

Ответ: Ответ к данному упражнению составлен на языке Perl.

my @consts;

my $name = <>;

die "Invalid format – missing name" unless defined($name);

chomp $name;

# Read in the rest of the file

while (<>) {

chomp;

s/"\s*//; s/\s*$//;

die "Invalid line: $_" unless /"(\w+)$/;

push @consts, $_;

}

# Now generate the file

open(HDR, ">$name.h") or die "Can't open $name.h: $!";

open(SRC, ">$name.c") or die "Can't open $name.c: $!";

my $uc_name = uc($name);

print HDR "/* File generated automatically – do not edit */\n";

print HDR "extern const char *$ {ucjiame)_name[];";

print HDR "typedef enum {\n"; print HDR join",\n", @consts;

print HDR "\n) $uc_name;\n\n";

print SRC "* File generated automatically – do not edit */\n";

print SRC "const char *$ {uc name}_name[] = {\n \"";

print SRC join "\",\n \"", @consts;

print SRC "\"\n};\n";

close(SRC);

close(HDR);

Используя принцип DRY, мы не будет вырезать и вклеивать этот вновь написанный файл в нашу программу. Вместо этого мы «включим» его – данный плоский файл является главным источником этих констант. Поэтому нам понадобится файл сборки для восстановления заголовка при изменении файла. Следующий фрагмент содержится в системе отладки в исходном дереве (имеется на web-сайте).

etest.c etest.h: etest.inc enumerated.pl

perl enumerated.pl etest.inc

Упражнение 12 из раздела "Обработка текста"

Ответ: Вот ответ, написанный на языке Perl.

my $dir = shift or die "Missing directory" ,

for my Sfile (glob(u$dir/*.pr)) {

open(IP, "$file") or die "Opening $file: $!";

undef $/; # Turn off input record separator -

my Scontent = <IP>; # read whole file as one string.

  • Читать дальше
  • 1
  • ...
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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