Главная страница
Навигация по странице:

  • Процедуры и функции для работы со строками

  • Объединение разнородных элементов (Запись)

  • Анализ результатов егэ за 2013 год


    Скачать 372.53 Kb.
    НазваниеАнализ результатов егэ за 2013 год
    Дата18.03.2023
    Размер372.53 Kb.
    Формат файлаdocx
    Имя файла2glava_1.docx
    ТипАнализ
    #998479
    страница4 из 5
    1   2   3   4   5

    Задание С4


    Задание С4 относится к высокому уровню сложности. В данном проверяется умение создавать собственные программы (30–50 строк) для решения задач средней сложности. Задание ориентированно на работу со строками и записями [15].

    Теоретический материал для решения задания С4


    Строки в Паскале – это данные типа string. Они используются для хранения последовательностей символов. В Паскале длина стандартной строки ограничена 255 символами.

    Если заранее известно, что длина строки будет меньше 255 символов, то программист может сам задать максимальную длину строки.

    Примеры описания строк:

    type

    str_type = string [12];

    const

    n = 50;

    var

    s1: string;

    s2, s3: str_type;

    s4: string[n];

    s5,s6,s7: string [7];

    Над строковыми данными определена операция слияния (конкатенации), обозначаемая знаком +. Например:

    a:='Turbo';

    b:='Pascal';

    c:=a+b;

    В этом примере переменная c приобретет значение 'TurboPascal'.

    Кроме слияния над строками определены операции сравнения <,>,=,<>,<=,>=. Сравнение строк производится слева направо до первого несовпадающего символа: длиннее считается та строка, в которой первый несовпадающий символ имеет больший номер в таблице кодов (буквы в таблице кодов расположены по возрастанию):

    'abd' > 'abc '.

    Процедуры и функции для работы со строками

    Над строками в Паскале определены следующие процедуры и функции:

    1. Length (s);

    Функция возвращает текущую длину строки s.

    Например:

    n:=length('Pascal'); {n будет равно 6}

    1. Copy (s,n,l);

    Функция возвращает подстроку длиной l (integer) начиная с позиции n (integer) строки s (string).

    Например:

    s:= 'Система Turbo Pascal';

    s2:= copy(s, 1, 7); {s2 будет равно 'Система'}

    s3:= copy(s, 9, 5); {s3 будет равно 'Turbo'}

    s4:= copy(s, 15, 6); {s4 будет равно 'Pascal'}

    1. Delete (s,p,n);

    Процедура удаляет из строки s (string) n (integer) символов начиная с позиции р (integer).

    Например:

    s:= 'Система Turbo Pascal';

    delete(s,8,6); {s будет равно 'Система Pascal'}

    1. Insert(s,subs,n);

    Процедура вставляет в строку s (string) подстроку subs (string) начиная с позиции n (integer).

    Например:

    s:= 'Система Pascal';

    insert('Turbo ',s,9); {s будет равно 'Система Turbo Pascal'}

    1. Pos(st,s);

    Функция поиска. Она определяет, с какой позиции строка s входит в строку st. Если вхождение имеет место, то результатом работы функции будет номер символа в строке st, с которого начинается строка s. Если вхождения нет, то результат – ноль.

    Например:

    s:= 'Система Turbo Pascal';

    x1:= pos('Pascal', s); {x1 будет равно 15}

    x2:= pos('Basic', s); {x2 будет равно 0}

    1. Str(x,s);

    Процедура преобразует числовое значение х (real) в строку s.

    1. Val(s,x,err);

    Процедура превращает строковое значение s (string) в числовую переменную х (real), err (integer) возвращает номер позиции, в которой произошла ошибка преобразования, или 0, если ошибки не было [6].

    Некоторые функции, связанные с типом char, но тем не менее часто использующиеся при работе со строками: 

    1. Chr(n: byte): char;

    Функция возвращает символ по коду, равному значению выражения n. Если n можно представить как числовую константу, то можно также пользоваться записью #n.  

    1. Ord(ch: char): byte;

    В данном случае функция возвращает код символа ch. 

    1. UpCase(c: char): char;

    Если c - строчная латинская буква, то функция возвращает соответствующую прописную латинскую букву, в противном случае символ c возвращается без изменения.

    Объединение разнородных элементов (Запись)

    Как известно, массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, можно воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, нужно указать его имя, рост, цвет глаз и волос, то есть в одном описании объединим разнородную информацию. Точно так же, описывая автомобиль, указывается не только его марка, но и год выпуска, модификация, да и цвет кузова может заинтересовать. Составляя автоматизированный каталог книгохранилища, для каждой книги нужно указать ее название, имя автора, область знания, количество страниц, год издания, а также, возможно, признак нахождения на руках или в хранилище.

    Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record). В языке Паскаль запись определяется путем указания служебного слова record и перечисления входящих в запись элементов с указанием типов этих элементов.

    Запись Паскаля – структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа.

    Например, анкетные данные о студенте вуза могут быть представлены в виде информационной структуры:



    Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа record (запись). Задать тип можно следующим образом:

    type <имя_типа>=record

    <имя_поля1>: тип;

    <имя_поля2>: тип;



    <имя_поля K>: тип

    end;

    где record – служебное слово, а <имя_типа> и <имя_поля> - идентификаторы языка Паскаль.

    Описание анкеты студента в Паскале будет выглядеть так:

    Type anketa=record

    fio: string[45];

    pol: char;

    dat_r: string[8];

    adres: string[50];

    curs: 1..5;

    grupp: string[3];

    end;

    Такая запись Паскаля, так же как и соответствующее ей дерево, называется двухуровневой.

    Поля записи Паскаля могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, когда требуется представить многоуровневое дерево (более 2 уровней). Например, те же сведения о студентах можно отобразить трехуровневым деревом.



    Такая организация данных позволит, например, делать выборки по году рождения или по городу, где живут студенты. В этом случае описание соответствующей записи в Паскале будет выглядеть так:

    Пример фрагмента программы описания записи Паскаля

    Type anketa1=record

    fio: string[45];

    pol: char;

    dat_r: record;

    god: integer;

    mes: string[10];

    den: 1..31;

    end;

    adres: record

    gorod: string[25];

    ulica: string [20];

    dom, kv: integer;

    end;

    curs: 1..5;

    grupp: string[3];

    end;

    После того, как определен тип записи Паскаля, можно определять переменную этого типа. Переменная определяется путем задания ее идентификатора и указания типа.

    Var

    student: anketa;

    student1: anketa1;

    Теперь нужно узнать, как правильно получать доступ к элементам записи Паскаля. Элементы записи называются полями, а обращение к ним производится через использование их имен – идентификаторов полей. Практически, поля записи обрабатываются точно так же, как и любые другие переменные. Но в отличие от обычной переменной имена полей должны предваряться ссылкой на идентификатор записи Паскаля и отделяться от него точкой. Такая запись называется уточняющий идентификатор:

    <имя_записи>.<имя_поля>

    Например, чтобы обратиться к полю curs переменной student, необходимо указать следующее составное имя:

    student.curs:=3;

    Для того чтобы обратиться к полю god в записи student1, необходимо записать уточняющий идентификатор, состоящий из трех имен:

    student1.dat_r.god:=1982;

    Использование полей записи Паскаля в выражениях и условиях идентично использованию обычных переменных.

    Единственная операция, которую можно произвести над однотипными записями Паскаля – это присваивание. Все другие операции производятся над отдельными полями записи.

    Разбор задания С4


    По ка­на­лу связи пе­ре­даётся по­сле­до­ва­тель­ность по­ло­жи­тель­ных целых чисел, все числа не пре­вы­ша­ют 1000. Ко­ли­че­ство чисел из­вест­но, но может быть очень ве­ли­ко. Затем пе­ре­даётся кон­троль­ное зна­че­ние по­сле­до­ва­тель­но­сти — наи­боль­шее число R, удо­вле­тво­ря­ю­щее сле­ду­ю­щим усло­ви­ям:

     1) R — про­из­ве­де­ние двух раз­лич­ных пе­ре­дан­ных эле­мен­тов по­сле­до­ва­тель­но­сти («раз­лич­ные» озна­ча­ет, что не рас­смат­ри­ва­ют­ся квад­ра­ты пе­ре­дан­ных чисел, про­из­ве­де­ния раз­лич­ных эле­мен­тов по­сле­до­ва­тель­но­сти, рав­ных по ве­ли­чи­не, до­пус­ка­ют­ся);

     2) R де­лит­ся на 14.

     Если та­ко­го числа R нет, то кон­троль­ное зна­че­ние по­ла­га­ет­ся рав­ным 0. В ре­зуль­та­те помех при пе­ре­да­че как сами числа, так и кон­троль­ное зна­че­ние могут быть ис­ка­же­ны.

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

     Вы­чис­лен­ное кон­троль­ное зна­че­ние: ...

     Кон­троль прой­ден (или — Кон­троль не прой­ден)

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

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

     Пример вход­ных дан­ных:

    6

    77

    14

    7

    9

    499

    100

    7700

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

    Вы­чис­лен­ное кон­троль­ное зна­че­ние: 7700

    Кон­троль прой­ден

    Первое, что нужно сделать – это составить словесный алгоритм, а после переводить программу на язык программирования и оптимизировать.

    Известно, что контрольное значение, правильность которого нужно проверить, делится на 14 и является произведением двух чисел последовательности, не включая квадраты чисел, но включая произведения чисел равных по величине. Произведение двух чисел делится на 14, если хотя бы один из множителей делится на 14, либо ни один из множителей не делится на 14, но один из них делится на 2, а второй на 7. Например:

    • Произведение 5 и 42 будет делиться на 14, потому как 42 делится на 14;

    • Произведение 4 и 21 будет делиться на 14, потому как один из них делится на 2, а второй на 7.

    Из последовательности входных данных нужно выбрать 4 числа:

    1. Наибольшее из чисел, делящихся на 2;

    2. Наибольшее из чисел, делящихся на 7;

    3. Наибольшее из чисел, делящихся на 14;

    4. Наибольшее число из входной последовательности, отличное от 14;

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

    Для написания программы будут использоваться следующие переменные:

    • количество элементов в последовательности (включая контрольное значение);

    • наибольшее из чисел, делящихся на 2;

    • наибольшее из чисел, делящихся на 7;

    • наибольшее из чисел, делящихся на 14;

    • – наибольшее число из входной последовательности, отличное от 14.

    • – контрольное значение;

    • – максимальное из произведений;

    • – переменная для организации цикла;

    • – переменная для записи очередного элемента последовательности.

    Так как количество чисел во входной последовательности может быть велико, то целесообразно использовать тип данных Для экономии памяти входная последовательность не будет записываться в массив, а проверка будет производиться сразу. Перед началом работы цикла переменные для записи максимальных чисел необходимо обнулить. Количество элементов вводится без учета контрольного значения. Контрольное значение будет введено тогда, когда будут отобраны 4 числа.

    var

    N, i, m, max2, max7, max14, max, R, max_p: longint;

    begin

    writeln (‘Введите количество элементов последовательности’);

    readln (N);

    max2:=0;

    max7:=0;

    max14:=0;

    max:=0;

    В цикле проверяется каждый элемент на делимость. Первый условный оператор ищет максимальное число, делящееся на 2 и не делящееся на 7. Второй условный оператор ищет максимальное число, делящееся на 7 и не делящееся на 2. Третий условный оператор ищет максимальное число, делящееся на 14. Необходим еще один условный оператор, который будет искать максимальное число в последовательности, отличное от числа, хранящегося в переменной После того как было получено очередное число из последовательности, делящееся на 14 и оно оказалось наибольшим, четвертый условный оператор начинает поиск наибольшего значения последовательности: сравнивает значение переменной со значением переменной и, если значение переменной больше значения переменной то в переменную записывается значение переменной а в переменную записывается значение переменной то есть максимальное число, делящееся на 14.

    Если в последовательности имеется число, не делящееся ни на 2 ни на 7 ни на 14, то есть не удовлетворяющее ни одному из условий, то пятый условный оператор сравнит это число с максимальным, если оно больше уже имеющего числа, то запишет его значение в переменную

    for i:=1 to N do

    begin

    writeln (‘Введите элемент последовательности’);

    readln (m);

    (1) if (m mod 2=0) and (m mod 7 <> 0) and (m > max2) then

    max2:=m;

    (2) if (m mod 7=0) and (m mod 2 <> 0) and (m > max7) then

    max7:=m;

    (3) if (m mod 14=0) and (m > max14) then

    begin

    (4) if max14 > max then

    max:=max14;

    max14:=m;

    end

    else

    (5) if m > max then

    max:=m;

    end;

    Далее вводится контрольное значение R. Шестой условный оператор сравнивает два найденный максимальных произведения и наибольшее записывает в переменную Седьмой условный оператор сравнивает содержимое переменной с переменной содержащей контрольное значение и выводит ответ на экран.

    writeln (‘Введите контрольное значение R’);

    readln(R);

    (6) if (max2*max7 < max14*max) then

    max_p:=max14*max

    else

    max_p:=max2*max7;

    writeln('Вычисленное контрольное значение: ',max_p);

    (7) if R=max_p then

    writeln('Контроль пройден')

    else

    writeln('Контроль не пройден');

    end.

    Еще один вариант задания


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

    Ива­нов Петр 4 2 4

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

    Для решение этого задания целесообразно воспользоваться типом который объединит в себе имя, фамилию и оценки учащихся. Имя и фамилия будут храниться одной строке а оценки в переменной Для считывания имени и фамилии понадобится символьная переменная Для считывания оценок – переменная Переменные и будут использованы для организации цикла

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

    name: string;

    sum: integer;

    end;

    c: char;

    i, j, N, m: integer;

    После объявления переменных нужно ввести количество учеников которое по условию должно быть не меньше 10 и не больше 100 и фамилии и имена учеников. Предварительно переменной нужно присвоить пустую строку. Фамилия записывается в переменную посимвольно с использованием цикла repeat. То есть, считывается символ фамилии и записывается в переменную до тех пор пока не встретится пробел.

    begin

    writeln ('Введите количество учеников');

    readln (N);

    for i:=1 to N do

    begin

    writeln ('Введите ', i, '-го ученика');

    p[i].name:=' ';

    repeat

    read (c);

    p[i].name:=p[i].name+c

    until c=' ';

    Такой же цикл строится и для считывания имени:

    repeat

    read (c);

    p[i].name:=p[i].name+c

    until c=' ';

    После этого необходимо считать оценки и выбрать учащихся, которые получили двойки. Предварительно нужно обнулить переменную Она будет содержать количество двоек полученных учеником. В цикле нельзя использовать переменную потому как она была использована в предыдущем цикле. Счетчик в цикле работает от 1 до 3, так как оценок у каждого ученика три. В цикле считываются оценки и сравниваются с двойкой с помощью условного оператора Если оценка равна двойке, то значение переменной увеличивается на 1.

    p[i].sum:=0;

    for j:=1 to 3 do

    begin

    read (m);

    if m=2 then

    p[i].sum:=p[i].sum+1

    end;

    readln;

    end;

    Осталось только вывести на экран учащихся в порядке убывания количества двоек. Двоек может быть три две или одна. В цикле можно снова использовать переменную

    for i:=1 to N do

    if p[i].sum=3 then

    writeln(p[i].name);

    for i:=1 to N do

    if p[i].sum=2 then

    writeln(p[i].name);

    for i:=1 to N do

    if p[i].sum=1 then

    writeln(p[i].name);

    end.

    Рекомендации к решению заданий С4


    Прежде чем писать алгоритм на языке программирования, для удобства, можно сформулировать его на естественном языке, а потом перевести на язык программирования.

    При объявлении переменных нужно правильно подбирать типы данных, знать диапазоны значений вещественных и целых типов. Если в задании сказано, например, что количество чисел велико, то целесообразно использовать тип Если же, например, количество чисел ограничено 1000, то подойдет и Внимательно подбирать тип данных переменным, которые являются результатом деления.

    При написании программы нужно проверить заданы ли начальные значения у переменных. Например, если первое действие, которое выполняется над переменной это сравнение (=, >, <, <>), то у переменной должно быть задано начально значение, иначе программа выдаст ошибку. Если в задание требуется посчитать количество элементов, то есть в задании используется счетчик, его необходимо обнулить перед началом использования.

    При необходимости правильно использовать логические операции и (для заданий первого типа). Операция используется для одновременного выполнения условий, а операция для выполнения хотя бы одного условия. Операция имеет более высокий приоритет, чем операция и правильно расставлять скобки. Правильно использовать операции и (для заданий второго типа). Операция возвращает остаток от деления, отбрасывая целую часть, а операция возвращает целую часть числа, отбрасывая остаток.

    Программа должна быть эффективной. Главные критерии эффективности – время работы программы и занимаемая память. Для того, чтобы программы была эффективной достаточно не использовать массивы и необходимые данные обрабатывать сразу при вводе с клавиатуры. Например, в первом разобранном задании для запоминания последовательности чисел можно было использовать массив, но тогда программа считалась бы неэффективной, потому как занимала бы больше памяти. Что касается времени работы программы, то при использовании массива оно заметно увеличится потому что сначала массив нужно заполнить, а потом совершить необходимые действия для его обработки. Если же в программе без массива обойтись нельзя, то нужно постараться сделать так, чтобы все необходимые данные считывались за один проход по массиву.

    Допускается до трех синтаксических ошибок [14].
    1   2   3   4   5


    написать администратору сайта