Задания
Версия для печати и копирования в MS Word
Тип Д19 C4 № 3632
i

Вам не­об­хо­ди­мо на­пи­сать про­грам­му рас­по­зна­ва­ния чисел, за­пи­сан­ных про­пи­сью. Сна­ча­ла на вход про­грам­ме подаётся обу­ча­ю­щий блок, со­сто­я­щий из 27 строк. Пер­вые 9 строк со­дер­жат слова "один", "два", ...., "де­вять", сле­ду­ю­щие 9 строк  — слова "один­на­дцать", "две­на­дцать", ... "де­вят­на­дцать", сле­ду­ю­щие 9 строк  — слова "де­сять", "два­дцать", ..., "де­вя­но­сто". Все слова за­пи­са­ны ме­лень­ки­ми рус­ски­ми бук­ва­ми без лиш­них про­бе­лов в на­ча­ле и в конце стро­ки.

Затем на вход про­грам­ме подаётся зна­че­ние N  — ко­ли­че­ство за­пи­сей, ко­то­рые не­об­хо­ди­мо об­ра­бо­тать. Сле­ду­ю­щие N строк со­дер­жат за­пи­сан­ные сло­ва­ми числа. Каж­дое число за­пи­са­но по-рус­ски, ма­лень­ки­ми бук­ва­ми, без оши­бок. Если число со­сто­ит из не­сколь­ких слов, между сло­ва­ми на­хо­дит­ся ровно один про­бел, лиш­них про­бе­лов в на­ча­ле и в конце строк нет.

На­пи­ши­те эф­фек­тив­ную про­грам­му, ко­то­рая опре­де­лит сумму тех вход­ных чисел, ко­то­рые на­хо­дят­ся в ин­тер­ва­ле то 1 до 99.

Раз­мер па­мя­ти, ко­то­рую ис­поль­зу­ет Ваша про­грам­ма, не дол­жен за­ви­сеть от длины ис­ход­но­го спис­ка.

Перед тек­стом про­грам­мы крат­ко опи­ши­те ис­поль­зу­е­мый Вами ал­го­ритм ре­ше­ния за­да­чи.

 

При­мер вход­ных дан­ных (обу­ча­ю­щий блок по­ка­зан в при­ме­ре с со­кра­ще­ни­я­ми):

один

два

...

де­вя­но­ста

5

два­дцать во­семь

два мил­ли­о­на

че­тыр­на­дцать

сто два­дцать три

ты­ся­ча де­вять­сот во­семь­де­сят че­ты­ре

При­мер вы­ход­ных дан­ных для при­ведённого выше при­ме­ра вход­ных дан­ных:

42

Спрятать решение

Ре­ше­ние.

Ва­ри­ант 1.

 

Про­грам­ма чи­та­ет обу­ча­ю­щий блок и за­по­ми­на­ет на­пи­са­ние чисел и их зна­че­ния. До­пус­ка­ет­ся по­стро­е­ние пол­но­го "сло­ва­ря" всех чисел от 1 до 99 или хра­не­ние толь­ко ис­ход­но­го обу­ча­ю­ще­го блока. В при­ведённом при­ме­ре на Пас­ка­ле ре­а­ли­зо­ва­но по­стро­е­ние пол­но­го "сло­ва­ря".

Затем про­грам­ма чи­та­ет вход­ные стро­ки, не за­по­ми­ная их в мас­си­ве. Если по­стро­ен пол­ный "сло­варь", про­чи­тан­ная стро­ка ищет­ся в этом сло­ва­ре как еди­ное целое. Чис­ло­вое зна­че­ние введённой стро­ки равно сумме зна­че­ний со­став­ля­ю­щих слов. Если вся стро­ка при по­ис­ке в пол­ном "сло­ва­ре" от­сут­ству­ет в обу­ча­ю­щих дан­ных, введённое число не по­па­да­ет в ин­тер­вал от 1 до 99 и не долж­но учи­ты­вать­ся. До­пол­ни­тель­ная про­вер­ка вхож­де­ния числа в за­дан­ный ин­тер­вал не тре­бу­ет­ся, т. к. все числа, ко­то­рые удаётся рас­по­знать с по­мо­щью при­ведённого обу­ча­ю­ще­го блока, ав­то­ма­ти­че­ски в него по­па­да­ют, но за на­ли­чие такой до­пол­ни­тель­ной про­вер­ки в про­грам­ме оцен­ка сни­жа­ет­ся.

 

Пас­каль
program c4;

program c4;

var

w: array[1..99] of string;

N: integer;

s: integer;

line: string;

i, j: integer;

begin

{чи­та­ем обу­ча­ю­щий блок}

for i := 1 to 9 do readln(w[i]);

for i := 11 to 19 do readln(w[i]);

for i := 1 to 9 do readln(w[10*i]);

{стро­им пол­ный сло­варь}

for i := 2 to 9 do begin

for j := 1 to 9 do begin

w[10*i + j] := w[10*i]+ ' ' + w[j];

end;

end;

{чи­та­ем и об­ра­ба­ты­ва­ем ос­нов­ной набор дан­ных}

readln(N);

s:= 0 ;

for i:=1 to N do begin

readln(line);

j:=1;

while (j<100) and (w[j]<>line) do j:=j+1;

if j<100 then s:=s+j; end;

writeln(s);

end.

 

Ва­ри­ант 2.

Про­грам­ма чи­та­ет обу­ча­ю­щий блок и за­по­ми­на­ет на­пи­са­ние чисел и их зна­че­ния. До­пус­ка­ет­ся по­стро­е­ние пол­но­го "сло­ва­ря" всех чисел от 1 до 99 или хра­не­ние толь­ко ис­ход­но­го обу­ча­ю­ще­го блока. В при­ведённом при­ме­ре на Пас­ка­ле  — хра­не­ние ис­ход­но­го обу­ча­ю­ще­го блока. Если пол­ный "сло­варь" от­сут­ству­ет, стро­ка раз­би­ва­ет­ся на слова (в под­хо­дя­щей стро­ке их может быть не более двух). Чис­ло­вое зна­че­ние введённой стро­ки равно сумме зна­че­ний со­став­ля­ю­щих слов. Если какое-то слово от­сут­ству­ет в обу­ча­ю­щих дан­ных, введённое число не по­па­да­ет в ин­тер­вал от 1 до 99 и не долж­но учи­ты­вать­ся. До­пол­ни­тель­ная про­вер­ка вхож­де­ния числа в за­дан­ный ин­тер­вал не тре­бу­ет­ся, т. к. все числа, ко­то­рые удаётся рас­по­знать с по­мо­щью при­ведённого обу­ча­ю­ще­го блока, ав­то­ма­ти­че­ски в него по­па­да­ют, но за на­ли­чие такой до­пол­ни­тель­ной про­вер­ки в про­грам­ме оцен­ка сни­жа­ет­ся.

 

Пас­каль
program c4;

const nw=27;

var

words: array[1..nw] of string;

values: array[1..nw] of integer;

{поиск слова в сло­ва­ре, воз­врат чис­ло­во­го зна­че­ния}

function word2value (w: string) : integer;

var

i: integer;

begin

i:=1;

while (i<=nw) and (words[i]<>w) do i:=i+1;

if i<=nw then word2value:=values[i]

else word2value:=0;

end;

var

N: integer;

s: integer;

v1, v2: integer;

line: string;

i, j: integer;

begin

{чи­та­ем обу­ча­ю­щий блок}

for i := 1 to 9 do begin

readln(words[i] ) ;

values[i] :=i ;

end;

for i := 10 to 18 do begin

readln(words[i]);

values[i]:=i+1;

end;

for i := 19 to 27 do begin

readln(words[i]);

values[i] :=10*(i-18) ;

end;

{чи­та­ем и об­ра­ба­ты­ва­ем ос­нов­ной набор дан­ных}

readln(N);

s:= 0 ;

for i:=1 to N do begin

readln(line);

j:=pos(line, ' ') ;

if j>0 then begin

v1:= word2value(copy(line,1,j-1));

v2:= word2value(copy(line,j+1,length(line)-j));

if (v1>0) and (v2>0) then s:=s+v1+v2;

end

else begin

v1:= word2value(line);

if v1>0 then s:=s+v1;

end;

end;

writeln(s);

end.

 

Бей­сик
DIM w$(99)

FOR i = 1 TO 9

LINE INPUT w$(i)

NEXT i

FOR i = 11 TO 19

LINE INPUT w$(i)

NEXT i

FOR i = 10 TO 90 STEP 10

LINE INPUT w$(i)

NEXT i

FOR i = 20 TO 9 0

FOR j = 1 TO 9

w$(i + j) = w$(i) + " " + w$(j)

NEXT j

NEXT i

INPUT N s = 0 FOR i = 1 TO N

LINE INPUT line$

j = 1

WHILE j < 100 AND w$(j) <> line$

j = j + 1

WEND

IF j < 10 0 THEN s = s + j

NEXT i

PRINT s

END

 

Ал­го­рит­ми­че­ский язык
алг c4 нач

лит­таб слова[1:99]

лит трока

цел N

цел сумма

цел i, j

нц для i от 1 до 9

ввод слова[i]

кц

нц для i от 11 до 19

ввод слова[i]

кц

нц для i от 10 до 90 шаг 10

ввод слова[i]

кц

нц для i от 20 до 90 шаг 10

нц для j от 1 до 9

кц

кц

ввод N

сумма:= 0

нц для i от 1 до N

ввод стро­ка

j : =1

нц пока j < 10 0 и слова [j] <>стро­ка

j:=j +1

кц

если j <10 0 то сумма:=сумма+j все

кц вывод

кон

 

Перл
for $v (1..9, 11..19, 20, 30, 40, 50, 60, 70, 80, 90) {

chomp ($w = <>) ;

$value{$w} = $v; }

$n = <>;

$s = 0;

while ($ n--) {

chomp ($line = <>);

$num = 0;

$value{$w}}

for $w (split / /,$line) {

if ($value{$w}) {$num += $value{$w}}

else {$num=0; last}

}

$s += $num;

}

print $s;

Спрятать критерии
Критерии проверки:

Кри­те­рии оце­ни­ва­ния вы­пол­не­ния за­да­нияБаллы
Про­грам­ма ра­бо­та­ет для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра и на­хо­дит ответ, не со­хра­няя вход­ные дан­ные в мас­си­ве, раз­мер ко­то­ро­го со­от­вет­ству­ет числу N (ко­ли­че­ству за­про­сов). Про­грам­ма про­смат­ри­ва­ет вход­ные дан­ные один раз. До­пус­ка­ет­ся на­ли­чие в тек­сте про­грам­мы одной син­так­си­че­ской ошиб­ки: про­пу­щен или не­вер­но ука­зан знак пунк­ту­а­ции, не­вер­но на­пи­са­но или про­пу­ще­но за­ре­зер­ви­ро­ван­ное слово языка про­грам­ми­ро­ва­ния, не опи­са­на или не­вер­но опи­са­на пе­ре­мен­ная, при­ме­ня­ет­ся опе­ра­ция, не­до­пу­сти­мая для со­от­вет­ству­ю­ще­го типа дан­ных (если одна и та же ошиб­ка встре­ча­ет­ся не­сколь­ко раз, то это счи­та­ет­ся за одну ошиб­ку).4
Про­грам­ма ра­бо­та­ет верно, но вход­ные дан­ные за­по­ми­на­ют­ся в мас­си­ве, раз­мер ко­то­ро­го со­от­вет­ству­ет числу N. Этот мас­сив, воз­мож­но, потом сор­ти­ру­ет­ся. До­пус­ка­ет­ся на­ли­чие от одной до трех син­так­си­че­ских оши­бок. Воз­мож­но, в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ном вводе дан­ных есть одна ошиб­ка (на­при­мер, ис­поль­зо­ва­ние read вме­сто readln в Пас­ка­ле или не­вер­ное счи­ты­ва­ние стро­ки в C++). Три балла также вы­став­ля­ет­ся, если в эф­фек­тив­ной про­грам­ме, удо­вле­тво­ря­ю­щей кри­те­ри­ям вы­став­ле­ния 4 бал­лов, есть одна ошиб­ка, в ре­зуль­та­те ко­то­рой про­грам­ма ра­бо­та­ет не­вер­но на не­ко­то­рых на­бо­рах не­ти­пич­ных вход­ных дан­ных.3
Про­грам­ма ра­бо­та­ет в целом верно, эф­фек­тив­но или нет, но в ре­а­ли­за­ции ал­го­рит­ма со­дер­жит­ся до двух оши­бок (не­вер­ная ини­ци­а­ли­за­ция счётчи­ков, до­пу­ще­на ошиб­ка в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ной сор­ти­ров­ке или ал­го­рит­ме по­ис­ка ми­ни­маль­ных эле­мен­тов, ис­поль­зу­ет­ся знак “<” вме­сто “<=”, “or” вме­сто “and” и тому по­доб­ное).

Воз­мож­но, не­кор­рект­но ор­га­ни­зо­ва­но счи­ты­ва­ние вход­ных дан­ных. До­пус­ка­ет­ся на­ли­чие от одной до пяти син­так­си­че­ских оши­бок, опи­сан­ных выше

2
Про­грам­ма, воз­мож­но, не­вер­но ра­бо­та­ет при не­ко­то­рых вход­ных дан­ных, но по при­ведённому тек­сту ре­ше­ния ясно, что эк­за­ме­ну­е­мый по­ни­ма­ет, из каких эта­пов долж­но со­сто­ять ре­ше­ние за­да­чи. При ис­поль­зо­ва­нии сор­ти­ров­ки она может быть ре­а­ли­зо­ва­на прин­ци­пи­аль­но не­вер­но (на­при­мер, вме­сто двух цик­лов ис­поль­зу­ет­ся один), или до­пу­ще­на прин­ци­пи­аль­ная ошиб­ка в по­ис­ке нуж­ных эле­мен­тов. Всего до­пус­ка­ет­ся до 4 раз­лич­ных оши­бок в ре­а­ли­за­ции ал­го­рит­ма, в том числе опи­сан­ных в кри­те­ри­ях при­сво­е­ния двух бал­лов. До­пус­ка­ет­ся на­ли­чие от одной до семи син­так­си­че­ских оши­бок, опи­сан­ных выше.1
За­да­ние не вы­пол­не­но или вы­пол­не­но не­вер­но.0
Мак­си­маль­ный балл4