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

На вход про­грам­ме по­да­ют­ся све­де­ния о сдаче эк­за­ме­нов уче­ни­ка­ми 9-х клас­сов не­ко­то­рой сред­ней школы. В пер­вой стро­ке со­об­ща­ет­ся ко­ли­че­ство уче­ни­ков N, ко­то­рое не мень­ше 10, но не пре­вос­хо­дит 100, каж­дая из сле­ду­ю­щих N строк имеет сле­ду­ю­щий фор­мат: 

 

<Фа­ми­лия> <Имя> <оцен­ки>, 

 

где <Фа­ми­лия> – стро­ка, со­сто­я­щая не более чем из 20 сим­во­лов, <Имя> – стро­ка, со­сто­я­щая не более чем из 15 сим­во­лов, <оцен­ки> – через про­бел три целых числа, со­от­вет­ству­ю­щие оцен­кам по пя­ти­балль­ной си­сте­ме. <Фа­ми­лия> и <Имя>, а также <Имя> и <оцен­ки> раз­де­ле­ны одним про­бе­лом. При­мер вход­ной стро­ки: 

 

Ива­нов Петр 4 5 3 

 

Тре­бу­ет­ся на­пи­сать как можно более эф­фек­тив­ную про­грам­му (ука­жи­те ис­поль­зу­е­мую вер­сию языка про­грам­ми­ро­ва­ния, на­при­мер, Borland Pascal 7.0), ко­то­рая будет вы­во­дить на экран фа­ми­лии и имена трех худ­ших по сред­не­му баллу уче­ни­ков. Если среди осталь­ных есть уче­ни­ки, на­брав­шие тот же сред­ний балл, что и один из трех худ­ших, то сле­ду­ет вы­ве­сти и их фа­ми­лии и имена.

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

Ре­ше­ние.

За­ме­тим, что вме­сто срав­не­ния сред­них бал­лов можно срав­ни­вать суммы бал­лов. Будем счи­ты­вать имена, фа­ми­лии и суммы оце­нок в мас­сив из 100 за­пи­сей. Найдём три наи­мень­ших суммы бал­лов, затем, срав­ни­вая все по­лу­чен­ные ыллы с наи­боль­шим из трёх по­лу­чен­ных ми­ни­му­мов найдём нуж­ных уче­ни­ков.

 

var a:array[1..100]of record

                      name:string;

                      point:integer;

                      end;

n,i,m,e,min,j,min1,min2:integer;

c:char;

begin

min:=20;

min1:=20;

min2:=20;

read(n);

for i:=1 to n do

begin

    repeat{счи­ты­ва­ем имена фа­ми­лии}

    read(c);

    a[i].name:=a[i].name+c;

    until c=' ';

    a[i].name:=a[i].name+' ';

    repeat

    read(c);

    a[i].name:=a[i].name+c;

    until c=' ';

    for j:=1 to 3 do   {счи­та­ем баллы}

        begin

             read(e);

             m:=m+e;

        end;

    if m < min then   {сразу на­хо­дим троих ми­ни­маль­ных}

       begin

            min2:=min1;

            min1:=min;

            min:=m;

       end

    else

    if m < min1 then

       begin

            min2:=min1;

            min1:=m;

       end

    else

    if m < min2 then

    min2:=m;

    a[i].point:=m;

    m:=0;

end;

for i:=1 to n do

if a[i].point<=min2       {все те кто мень­ше min2 будут равны или мин1 или min}

then write(2,a[i].name);

end.

 

За­ме­ча­ние.

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

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

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

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

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

В коде при­сут­ству­ют 3 участ­ка та­ко­го плана:

"    if m div 3     begin"

Может быть, после 3 что-то долж­но быть?

Такая про­грам­ма не про­хо­дит ком­пи­ля­цию

Сергей Никифоров

Да, это html шалит. Когда пи­шешь что-то вида <"буква" такая за­пись счи­ты­ва­ет­ся, как на­ча­ло html тега и про­из­воль­ная часть тек­ста про­па­да­ет. По­пра­ви­ли.

Михаил Кадук 10.06.2016 12:02

Здрав­ствуй­те! В за­да­нии про­сят вы­ве­сти имена тех 3-х уче­ни­ков, у ко­то­рых худ­ший сред­ний балл, а не тех, кто на­брал "<=min2". До­пу­стим, будет 10 уче­ни­ков со след. сред­ни­ми бал­ла­ми:

Уче­ник1 2;

Уче­ник2 2;

Уче­ник3 3;

Уче­ник4 3;

Уче­ник5 4;

Уче­ник6 4;

Уче­ник7 5;

Уче­ник8 5;

Уче­ник9 5;

Уче­ник10 5.

Тогда нужно будет вы­ве­сти толь­ко пер­вые 4 имени.

Я бы пред­ло­жил вве­сти новую пе­ре­мен­ную k (или ис­поль­зо­вать ста­рую, более не­нуж­ную) и сде­лать так:

k := 0;

for i := 1 to N do

    if a[i].point=min then begin

     a[i].point := 21;

     writeln(a[i].name);

     k := k + 1;

    end;

if k<3 then

    for i := 1 to N do

     if a[i].point=min1 then begin

        a[i].point := 21;

        writeln(a[i].name);

        k := k + 1;

     end;

if k<3 then

    for i := 1 to N do

     if a[i].point=min2 then

        writeln(a[i].name);

 

Сна­ча­ла я на­пи­сал про­грам­му по тому же прин­ци­пу, как и по­ка­за­но в по­яс­не­нии, но потом пе­ре­чи­тал за­да­ние: стро­ка "вы­во­дить на экран фа­ми­лии и имена трех худ­ших по сред­не­му баллу уче­ни­ков" как бы дает по­нять, что у этих трёх уче­ни­ков может быть и оди­на­ко­во худ­ший сред­ний балл.

 

По­жа­луй­ста, если я оши­ба­юсь, по­правь­те - буду учить­ся на своих ошиб­ках.

Всего доб­ро­го!

Сергей Никифоров

Здрав­ствуй­те! Хо­ро­ший во­прос. Тут нужно за­ме­тить, что в ходе ра­бо­ты про­грам­мы зна­че­ния min, min1 и min2 могут стать рав­ны­ми друг другу. Для ва­ше­го при­ме­ра это будут зна­че­ния 2, 2 и 3 со­от­вет­ствен­но, по­это­му буду вы­ве­де­ны имен­но че­ты­ре нуж­ные за­пи­си.

Дмитрий Иванов 14.06.2016 12:57

Воз­мо­жен ли такой ва­ри­ант про­грам­мы:

 

var

A: array[1..100]of record

    name: string;

    m: integer;

end;

N, i, O, O1, O2, sum, Min, j, Min1, Min2: integer;

C: char;

S: string;

 

begin

j := 1;

min := 16;

min1 := 16;

min2 := 16;

read(N);

for i := 1 to N do

begin

    read(c);

    while c <> ' ' do{счи­ты­ва­ем фа­ми­лию}

    begin

     S := S + c;

     read(c);

    end;

    read(c);

    S := S + ' ';

    while c <> ' ' do {счи­ты­ва­ем имя}

    begin

     S := S + c;

     read(c);

    end;

    read(O, O1, O2);{счит­ва­а­ем баллы}

    sum := O + O1 + O2;

    if sum <= Min then

    begin

     Min := sum;A[j].name := S;A[j].m := sum;j := j + 1;

    end

    else if sum <= Min1 then

    begin

     Min1 := sum;A[j].name := S;A[j].m := sum;j := j + 1;

    end

    else if sum <= Min2 then

    begin

     Min2 := sum;A[j].name := S;A[j].m := sum;j := j + 1;

    end;

end;

N := j - 1;

for i := 1 to N do if A[i].m = Min then writeln(A[i].name);

for i := 1 to N do if A[i].m = Min1 then writeln(A[i].name);

for i := 1 to N do if A[i].m = Min2 then writeln(A[i].name);

end.

Сергей Никифоров

Здрав­ствуй­те! Да, такой ва­ри­ант воз­мо­жен.