Анализ результатов егэ за 2013 год
Скачать 372.53 Kb.
|
Задание С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 '. Процедуры и функции для работы со строками Над строками в Паскале определены следующие процедуры и функции: Length (s); Функция возвращает текущую длину строки s. Например: n:=length('Pascal'); {n будет равно 6} 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'} Delete (s,p,n); Процедура удаляет из строки s (string) n (integer) символов начиная с позиции р (integer). Например: s:= 'Система Turbo Pascal'; delete(s,8,6); {s будет равно 'Система Pascal'} Insert(s,subs,n); Процедура вставляет в строку s (string) подстроку subs (string) начиная с позиции n (integer). Например: s:= 'Система Pascal'; insert('Turbo ',s,9); {s будет равно 'Система Turbo Pascal'} Pos(st,s); Функция поиска. Она определяет, с какой позиции строка s входит в строку st. Если вхождение имеет место, то результатом работы функции будет номер символа в строке st, с которого начинается строка s. Если вхождения нет, то результат – ноль. Например: s:= 'Система Turbo Pascal'; x1:= pos('Pascal', s); {x1 будет равно 15} x2:= pos('Basic', s); {x2 будет равно 0} Str(x,s); Процедура преобразует числовое значение х (real) в строку s. Val(s,x,err); Процедура превращает строковое значение s (string) в числовую переменную х (real), err (integer) возвращает номер позиции, в которой произошла ошибка преобразования, или 0, если ошибки не было [6]. Некоторые функции, связанные с типом char, но тем не менее часто использующиеся при работе со строками: Chr(n: byte): char; Функция возвращает символ по коду, равному значению выражения n. Если n можно представить как числовую константу, то можно также пользоваться записью #n. Ord(ch: char): byte; В данном случае функция возвращает код символа ch. 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 числа: Наибольшее из чисел, делящихся на 2; Наибольшее из чисел, делящихся на 7; Наибольшее из чисел, делящихся на 14; Наибольшее число из входной последовательности, отличное от 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]. |