Шрифт:
;
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;}
;
Ответ:
$_ = 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: Объем информации, содержащейся на стриммерной кассете (4 Гбайт), составляет 32 х 10^9 бит, так что передача эквивалентного объема по каналу со скоростью 1 Мбайт/с заняла бы около 32000 сек. (примерно 9 ч). Если человек движется с постоянной скоростью 3,5 мили в час, то, для того чтобы канал связи превзошел курьера, два компьютера должны располагаться друг от друга на расстоянии не менее 31 мили. Если это расстояние меньше, то победа остается за человеком.
Ответ: Ответ к данному упражнению составлен на языке 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
Ответ: Вот ответ, написанный на языке 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.