Подготовка к ЕГЭ по информатике. Модуль “Программирование Часть C

 

 

 

 

 

 

C1

 

 

Требовалось написать программу, которая решает уравнение «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",
 &a,&b,&x);

 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

 


Перейти на Главную


<<НАЗАД