Подготовка к ЕГЭ по информатике. Модуль “Программирование Часть C ”
Требовалось написать программу, которая решает уравнение «ax+b=0» относительно x для любых чисел a и b, введенных с клавиатуры. Все числа считаются действительными. Программист торопился и написал программу неправильно.
ПРОГРАММА НА ПАСКАЛЕ |
ПРОГРАММА НА БЕЙСИКЕ |
ПРОГРАММА НА СИ |
var a,
b, x: real; begin readln(a,b,x); if
b = 0 then write('x =
0') else if
a = 0 then write('нет решений') else write('x
=',-b/a); end. |
INPUT a,
b, x IF
b = 0 THEN PRINT
"x = 0" ELSE IF
a = 0 THEN PRINT
"нет решений" ELSE PRINT
"x=",-b/a ENDIF ENDIF END |
void
main(void) { float a,b,x; scanf("%f%f%f", if (b==0) printf("x=0"); else if (a==0) printf("нет решений"); else printf("x=%f",-b/a); } |
Последовательно выполните три задания:
1) Приведите пример таких чисел a, b, x, при которых программа неверно решает поставленную задачу.
2) Укажите, какая часть программы является лишней.
3) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).
C2 |
Опишите на русском языке или одном из языков
программирования алгоритм поиска номера первого из двух последовательных
элементов в целочисленном массиве из 30 элементов, сумма которых максимальна
(если таких пар несколько, то можно выбрать любую из них).
C3 |
Два игрока
играют в следующую игру. Перед ними лежат две кучки камней, в первой из которых
3, а во второй – 2 камня. У каждого игрока неограниченно много камней. Игроки
ходят по очереди. Ход состоит в том, что игрок или увеличивает в 3 раза число
камней в какой-то куче, или добавляет 1 камень в какую-то кучу. Выигрывает
игрок, после хода которого общее число камней в двух
кучах становится не менее 16 камней. Кто выигрывает при безошибочной игре –
игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть
первый ход выигрывающего игрока? Ответ обоснуйте.
C4 |
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: <Фамилия> <Имя> <оценки>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 4
Требуется написать программу, которая будет выводить на
экран фамилии и имена трех лучших по среднему баллу учеников. Если среди
остальных есть ученики, набравшие тот же средний балл, что и один из трех
лучших, то следует вывести и их фамилии и имена. Требуемые имена и фамилии
можно выводить в произвольном порядке.
=========Var2006======
C1 |
Требовалось написать программу, в которой нужно было
проверить, лежит ли число x на числовой оси
между числами a и b
("между" понимается в строгом смысле, т.е. случай x=a
или x=b недопустим). Числа x, a, b являются натуральными, и известно, что a отлично от b (но
неизвестно: a>b
или b>a).
Входная информация вводится с клавиатуры, а на выходе должно быть сообщение
вида "x между a
и b" (если это действительно так), в
противном случае никакой выходной информации не выдается.
Программист торопился и написал программу
некорректно.
ПРОГРАММА НА ПАСКАЛЕ |
ПРОГРАММА НА БЕЙСИКЕ |
VAR
a,b,x: integer; p: integer; BEGIN readln(a,b,x); if (a>x) AND (x>b) then writeln('x между a,b'); END. |
CLS INPUT
a, b, x IF (a>x) AND (x>b) THEN PRINT “x между a, b” END |
Последовательно выполните три задания:
1) Приведите пример таких чисел a,
b, x, при
которых программа работает неправильно.
2) Укажите, как нужно доработать программу, чтобы не
было случаев ее неправильной работы. (Это можно сделать несколькими способами,
поэтому можно указать любой способ доработки исходной программы).
3) Укажите, как можно доработать программу, соблюдая
дополнительное условие: доработанная программа не должна использовать
логических операций AND или OR.
C2 |
Опишите на русском языке или на одном из языков
программирования алгоритм поиска второго по величине (т.е. следующего по
величине за максимальным) элемента в числовом массиве
из 30 различных элементов.
C3 |
Два игрока играют в
следующую игру. Перед ними лежат две кучки камней, в первой из которых 5, а во
второй – 3 камня. У каждого игрока неограниченно много камней.
Игроки ходят по очереди. Ход состоит в том, что игрок или удваивает число
камней в какой-то куче, или добавляет 4 камня в какую-то кучу. Выигрывает
игрок, после хода которого в одной из куч становится
не менее 22 камней. Кто выигрывает при безошибочной игре обоих игроков – игрок,
делающий первый ход, или игрок, делающий второй ход? Как должен ходить
выигрывающий игрок? Ответ обоснуйте.
C4 |
Вступительные испытания в некоторый вуз состоят из
трех экзаменов: математика (максимальный балл – 9), информатика (максимальный
балл – 9), литература (максимальный балл – 5). На вход программе подаются
сведения о сдаче этих экзаменов абитуриентами. В первой строке вводится
количество абитуриентов N, во второй – количество мест K (K < N) на
которые эти абитуриенты претендуют. Каждая из следующих N строк
имеет следующий формат: <Фамилия> <оценка1>
<оценка2> <оценка3>, где <Фамилия> – строка, состоящая не
более, чем из 20 символов, оценки – числа от 0 до максимальной оценки по
предмету соответственно. (Ноль ставится в случае, если
экзамен не сдавался, например, после полученной на предыдущем экзамене двойки.
Все баллы, большие 2, считаются удовлетворительными).
Пример входных строк:
Иванов 8 9 3
Петров 2 0 0
Требуется написать программу
на языке Паскаль или Бейсик, которая определяла бы по
имеющимся данным количество абитуриентов, набравших полупроходной балл в данный
вуз или сообщала, что такой балл отсутствует. (Полупроходным называется такой
балл, что лишь часть абитуриентов, набравших такой балл и не получивших ни
одной неудовлетворительной оценки, попадает в K лучших, которые должны быть
зачислены на 1 курс) Считается, что абитуриенты, получившие только
удовлетворительные оценки, обязательно присутствуют.
=========Var2005======
C1 |
Рассматривается стандартная
шахматная доска размером 8х8. Примем, что i
– номер вертикали (может принимать значения от 1 до 8), j –
номер горизонтали (также может принимать значения от 1 до 8). В левом нижнем
углу, т.е. на поле i =1, j=1 (это
поле черного цвета) стоит черный король. Напомним, что король может ходить на 1
клетку в любом направлении (по горизонтали, вертикали или диагонали). В правом
нижнем углу, т.е. на поле i =8, j=1 (это
поле белого цвета) стоит белый король. Введены обозначения: P(i,j) ‑ минимальное число
ходов, за которое черный король может попасть на поле (i,j); V(i,j) ‑ минимальное число ходов, за которое
белый король может попасть на поле (i,j).
Программист написал
программу, в которой требовалось определить все такие поля (i,j), для которых P(i,j) = V(i,j), и
выдать на экран соответствующие значения i,j (текст программы приведен ниже).
1) Выдаст ли программа,
написанная программистом, поле, для которого
i=4, j=5 ?
2) Указать все из
перечисленных ниже полей, которые удовлетворяют постановке задачи, т.е. для
таких полей должно быть выполнено P(i,j) = V(i,j)
(i=1, j=8), (i=2,
j=8), (i=1, j=7), (i=5,
j=5), (i=8, j=6)
3) Видно, что программист
допустил ошибку в программе. Укажите, какую доработку программы нужно провести,
чтобы она соответствовала постановке задачи (такая доработка может быть
проведена неединственным образом – годится любой правильный вариант доработки)
Программа на языке Паскаль |
Программа на языке Бейсик |
VAR I,j: integer; BEGIN writeln('искомые поля'); for j:=5 to 8 do for i:=1 to 8 do begin if (i=9-j)
OR (i=j) then writeln('i=',i, 'j=',j); end; END. |
PRINT "Искомые поля" FOR J=5 TO 8 FOR I=1 TO 8 IF (I=9-J) OR (I=J) THEN PRINT "I="; I PRINT "J="; J ENDIF NEXT I NEXT J END |
C2 |
Квадратный массив А размера NxN (где N=5) в
программе сначала обнуляется, а затем производится некоторая дальнейшая
обработка в соответствии с программой. Текст программы
приведен ниже.
Требуется выяснить состояние
массива А по окончании работы программы, а именно:
1) Какое число будет стоять
в элементе массива А[1,2] ?
2) Сколько всего ненулевых
чисел будет в массиве А ?
а также ответить на
следующий вопрос:
3) В программе после
начального обнуления массив А заполняется с помощью
следующих операторов
i:=1; j:=1; A[1,1]:=1; k:=1; while (i<N) OR
(j<N) do
begin if (i+j) mod 2 =
0 then j:=j+1 else i:=i+1;
k:= -k; A[i,j]:=k;
end;
На какой более короткий фрагмент
программы можно заменить приведенную часть программы, обеспечивая такое же
заполнение массива А?
Программа на языке Паскаль |
Программа на языке Бейсик |
CONST N=5; VAR i, j: integer;{i
- строка j - столбец} k: integer; A: array[1..N,1..N] of integer; BEGIN for i:=1
to N do for j:=1 to N do A[i,j]:=0; i:=1;
j:=1; A[1,1]:=1; k:=1; while (i<N) OR (j<N) do begin if (i+j)
mod 2 = 0 then j:=j+1 else i:=i+1; k:= -k; A[i,j]:=k; end; END. |
N=5 DIM A(N, N) AS INTEGER FOR I=1 TO N FOR J=1 TO N A (I, J) = 0 NEXT J NEXT I I=1 J=1 A(1, 1)=1 K=1 WHILE (I<N) OR (J<N) IF (I+J) MOD 2 = 0 THEN J=J+1 ELSE I=I+1 ENDIF K=-K A(I,J)=K WEND END |
C3 |
Опишите на русском языке или
одном из языков программирования алгоритм подсчета числа элементов равных максимальному в числовом массиве из 30 элементов.
C4 |
Два игрока играют в
следующую игру. Перед ними лежат две кучки камней, в первой из которых 4, а во
второй – 3 камня. У каждого игрока неограниченно много камней.
Игроки ходят по очереди. Ход состоит в том, что игрок или увеличивает в 3 раза
число камней в какой-то куче или добавляет 2 камня в какую-то кучу. Выигрывает
игрок, после хода которого общее число камней в двух
кучах становится не менее 24 камней. Кто выигрывает при безошибочной игре обоих
игроков – игрок, делающий первый ход или игрок, делающий второй ход? Каким
должен быть первый ход выигрывающего игрока? Ответ обоснуйте.
C5 |
На вход программе подаются
366 строк, которые содержат информацию о среднесуточной температуре всех дней
2004 года. Формат каждой из строк следующий: сначала записана
дата в виде dd.mm (на запись номера дня и
номера месяца в числовом формате отводится строго два символа, день от месяца
отделен точкой), затем через пробел записано значение температуры — число со
знаком плюс или минус, с точностью до 1 цифры после десятичной точки.
Данная информация отсортирована по значению температуры, то есть
хронологический порядок нарушен. Требуется написать программу
на языке Паскаль или Бейсик, которая будет выводить на экран информацию о
месяце (месяцах), среднемесячная температура у которого (которых) наименее
отклоняется от среднегодовой. В первой строке вывести среднегодовую
температуру. Найденные значения для каждого из месяцев следует выводить в
отдельной строке в виде: номер месяца, значение среднемесячной температуры,
отклонение от среднегодовой температуры.
=========Var2005======
C1 |
Следующая программа, содержащая, по
крайней мере, одну ошибку, после устранения ошибок должна определять день
недели для произвольного дня месяца. В ней считается, что первое число данного
месяца — понедельник. Укажите в листе ответа все ошибки. Взяв эту программу за
основу, напишите программу, которая будет решать ту же задачу при условии, что w1 — день
недели для первого числа месяца. Значение w1 (целое
число от 1 до 7) должно запрашиваться программой. Интересующее нас число месяца
d (от 1 до 31) также должно запрашиваться.
Предполагается, что ввод данных будет корректным.
Программа на языке Паскаль |
Программа на языке Бейсик |
Var d,w:integer; begin readln(d); w:=d div 7; case w of 1:writeln(’понедельник’); 2:writeln(’вторник’); 3:writeln(’среда’); 4:writeln(’четверг’); 5:writeln(’пятница’); 6:writeln(’суббота’); 7:writeln(’воскресенье’); end end. |
DIM w, d AS INTEGER INPUT d w = d \ 7 IF w = 1 THEN PRINT "понедельник" IF w = 2 THEN PRINT "вторник" IF w = 3 THEN PRINT "среда" IF w = 4 THEN PRINT "четверг" IF w = 5 THEN PRINT "пятница" IF w = 6 THEN PRINT "суббота" IF w = 7 THEN PRINT "воскресенье" END |
C2 |
Определите, что
делает следующая программа. Опишите в бланке ответа, что служит входными
данными для программы. Что выводит программа в зависимости от входных данных?
Программа на языке Паскаль |
Программа на языке Бейсик |
Var a:array[1..1000] of integer; K,L,R,m,i,n:integer; b:boolean; begin readln(K); readln(n); for i:=1
to n do read(a[i]); b:=true; for i:=2
to n do if a[i-1]>=a[i] then b:=false; if not b then writeln(’данные некорректны’) else begin L:=1; R:=n;
b:=false; while (L<=R)and not b do begin m:=(L+R)div 2; b:=(a[m]=K); if a[m]<K then L:=m+1 else R:=m-1 end; if b then writeln(m) else writeln(0) end end. |
DIM K,n,i,b,L,R, a(1000) AS INTEGER INPUT K INPUT n FOR i = 1 TO n INPUT a(i) NEXT i b = 1 FOR i = 2 TO n IF a(i – 1) >= a(i)
THEN b = 0 NEXT i IF b = 0 THEN PRINT "данные некорректны" GOTO 10 END IF L = 1: R = n b = 0 WHILE (L <= R) AND (b = 0) m = (L + R) \ 2 IF a(m) = K THEN b = 1 ELSE b = 0 IF a(m) < K THEN L = m + 1 ELSE R = m – 1 END IF WEND IF b = 1 THEN PRINT m ELSE PRINT 0 10 END |
C3 |
Опишите алгоритм
поиска трех последовательных элементов, сумма которых максимальна, в числовом
массиве из 30 элементов. Решение запишите в словесной форме или на
алгоритмических языках Бейсик или Паскаль.
C4 |
Два игрока играют в следующую игру. Перед
ними лежат три кучки камней, в первой из которых 2, во второй – 3, в третьей –
4 камня. У каждого игрока неограниченно
много камней. Игроки ходят по очереди. Ход состоит в том, что игрок или
удваивает число камней в какой-то куче или добавляет по два камня в каждую из
куч. Выигрывает игрок, после хода которого либо в
одной из куч становится не менее 15 камней, либо общее число камней во всех
трех кучах становится не менее 25. Кто выигрывает при безошибочной игре обоих
игроков – игрок, делающий первый ход или игрок, делающий второй ход? Каким
должен быть первый ход выигрывающего игрока? Ответ обоснуйте.
C5 |
Во входном файле text.dat
содержится текст на английском языке, заканчивающийся точкой (другие символы “.” в этом файле отсутствуют). Требуется написать программу
на языке Паскаль или Бейсик, которая будет определять
и выводить на экран английскую букву, встречающуюся в этом тексте чаще всего, и
количество там таких букв. Строчные и прописные буквы при этом считаются не
различимыми. Если искомых букв несколько, то программа должна выводить на экран
первую из них по алфавиту. Например, пусть файл содержит следующую запись: It
is not a simple
task. Yes! Чаще всего
здесь встречаются буквы I, S и T (слово Yes
в подсчете не учитывается, так как
расположено после точки). Следовательно, в данном случае программа должна
вывести два символа, разделенных пробелом:
I 3