24. Поиск и исправление ошибок в программе

Демонстрационный вариант ЕГЭ 2018 г. – задание №24  На обработку поступает натуральное число, не превышающее 109. Нужно написать программу, которая выводит на экран максимальную цифру числа, кратную 5. Если в числе нет цифр, кратных 5, требуется на экран вывести «NO». Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Напоминание: 0 делится на любое натуральное число.

Бейсик Python
DIM N, DIGIT, MAXDIGIT AS LONG
INPUT N
MAXDIGIT = N MOD 10
WHILE N > 0
	DIGIT = N MOD 10
	IF DIGIT MOD 5 = 0 THEN
		IF DIGIT > MAXDIGIT THEN
			MAXDIGIT = DIGIT
		END IF
	END IF
	N = N \ 10
WEND
IF MAXDIGIT = 0 THEN
	PRINT "NO"
ELSE
	PRINT MAXDIGIT
END IF

 

N = int(input())
maxDigit = N % 10
while N > 0:
	digit = N % 10
	if digit % 5 == 0:
		if digit > maxDigit:
			maxDigit = digit
	N = N // 10
if maxDigit == 0:
	print("NO")
else:
	print(maxDigit)

 

Алгоритмический язык Паскаль
алг
нач
цел N, digit, maxDigit
ввод N
maxDigit := mod(N,10)
нц пока N > 0
	digit := mod(N ,10)
		если mod(digit, 5) = 0 то
			если digit > maxDigit то
				maxDigit := digit
			все
		все
	N := div(N,10)
кц
если maxDigit = 0 то
	вывод "NO"
иначе
	вывод maxDigit
все
кон

 

var N,digit,maxDigit: longint;
begin
readln(N);
maxDigit := N mod 10;
while N > 0 do
begin
	digit := N mod 10;
	if digit mod 5 = 0 then
		if digit > maxDigit then
			maxDigit := digit;
	N := N div 10
end;
if maxDigit = 0 then
	writeln('NO')
else
	writeln(maxDigit)
end.

 

C++
#include <iostream>
using namespace std;
int main() {
long N, digit, maxDigit;
cin >> N;
maxDigit = N % 10;
while (N > 0) {
	digit = N % 10;
	if (digit % 5 == 0)
		if (digit > maxDigit)
			maxDigit = digit;
	N = N / 10;
}
if (maxDigit == 0)
	cout << "NO" << endl;
else
	cout << maxDigit << endl;
return 0;
}

 

Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 132.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения.
Исправление ошибки должно затрагивать только строку, в которой находится ошибка.


Демонстрационный вариант ЕГЭ 2017 г. – задание №24 Дано целое положительное число N, не превосходящее 1000. Необходимо определить, является ли это число степенью числа 3. То есть требуется определить, существует ли такое целое число K, что 3K = N, и вывести это число либо сообщение, что такого числа не существует.
Для решения этой задачи ученик написал программу, но, к сожалению, его программа оказалась неверной. Ниже эта написанная им программа для Вашего удобства приведена на пяти языках программирования.

Бейсик

DIM N, K AS INTEGER
INPUT N
K = 0
WHILE K MOD 3 = 0
	K = K + 1
	N = N \ 3
WEND
IF N > 0 THEN
	PRINT K
ELSE
	PRINT "Не существует"
END IF
END

Python

n = int(input())
k = 0
while k%3 == 0:
	k = k + 1
	n = n // 3
if n > 0:
	print(k)
else:
	print("Не существует")

Алгоритмический язык

алг
нач
	цел n, k
	ввод n
	k := 0
	нц пока mod(k, 3)=0
		k := k + 1
		n := div(n,3)
	кц
	если n > 0
		то вывод k
		иначе вывод "Не существует"
	все
кон

Паскаль

var n, k: integer;
begin
	read(n);
	k := 0;
	while k mod 3 = 0 do begin
		k := k + 1;
		n := n div 3;
	end;
	if n > 0 then
		writeln(k)
	else
		writeln('Не существует')
end.

Си

#include <stdio.h>
int main(){
	int n, k;
	scanf("%d",&n);
	k = 0;
	while (k%3 == 0) {
		k = k + 1;
		n = n / 3;
	}
	if (n > 0)
		printf("%d", k);
	else
		printf("Не существует");
	return 0;
}

Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 9.
2. Приведите пример числа, при вводе которого приведённая программа напечатает то, что требуется.
3. Найдите в программе все ошибки (их может быть одна или несколько).
Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Достаточно указать ошибки и способ их исправления для одного языка программирования.
Обратите внимание: Вам нужно исправить приведённую программу, а не написать свою. Вы можете только заменять ошибочные строки, но не можете удалять строки или добавлять новые. Заменять следует только ошибочные строки: за исправления, внесённые в строки, не содержащие ошибок, баллы будут снижаться.


Демонстрационный вариант ЕГЭ 2016 г. – задание №24

На об­ра­бот­ку по­сту­па­ет по­ло­жи­тель­ное целое число, не пре­вы­ша­ю­щее 109. Нужно на­пи­сать про­грам­му, ко­то­рая вы­во­дит на экран сумму цифр этого числа, мень­ших 7. Если в числе нет цифр, мень­ших 7, тре­бу­ет­ся на экран вы­ве­сти 0. Про­грам­мист на­пи­сал про­грам­му не­пра­виль­но. Ниже эта про­грам­ма для Ва­ше­го удоб­ства при­ве­де­на на пяти язы­ках про­грам­ми­ро­ва­ния.

Бейсик

DIM N, DIGIT, SUM AS LONG
 INPUT N
 SUM = 0
 WHILE N > 0
    DIGIT = N MOD 10
    IF DIGIT < 7 THEN
        SUM = SUM + 1
    END IF
    N = N \ 10
 WEND
 PRINT DIGIT

Python

N = int(input())
sum = 0
while N > 0:
    digit = N % 10
    if digit < 7:
        sum = sum + 1
    N = N // 10
print(digit)

Алгоритмический язык

алг
 нач
    цел N, digit, sum
    ввод N
    sum := 0
    нц пока N > 0
        digit := mod(N,10)
        если digit < 7 то
            sum := sum + 1
        все
        N := div(N,10)
    кц
    вывод digit
 кон

Паскаль

var N, digit, sum: longint;
 begin
    readln(N);
    sum := 0;
    while N > 0 do
    begin
        digit := N mod 10;
        if digit < 7 then
            sum := sum + 1;
        N := N div 10;
    end;
    writeln(digit)
 end.

Си

#include <stdio.h>
 int main()
 {
    int N, digit, sum;
    scanf("%d", &N);
    sum = 0;
    while (N > 0)
    {
        digit = N % 10;
        if (digit < 7)
            sum = sum + 1;
        N = N / 10;
    }
    printf("%d",digit);
    return0;
 }

По­сле­до­ва­тель­но вы­пол­ни­те сле­ду­ю­щее.

1. На­пи­ши­те, что вы­ве­дет эта про­грам­ма при вводе числа 456.
2. При­ве­ди­те при­мер та­ко­го трёхзнач­но­го числа, при вводе ко­то­ро­го про­грам­ма выдаёт вер­ный ответ.
3. Най­ди­те все ошиб­ки в этой про­грам­ме (их может быть одна или не­сколь­ко). Из­вест­но, что каж­дая ошиб­ка за­тра­ги­ва­ет толь­ко одну стро­ку и может быть ис­прав­ле­на без из­ме­не­ния дру­гих строк. Для каж­дой ошиб­ки:
1) вы­пи­ши­те стро­ку, в ко­то­рой сде­ла­на ошиб­ка;
2) ука­жи­те, как ис­пра­вить ошиб­ку, т.е. при­ве­ди­те пра­виль­ный ва­ри­ант стро­ки.

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

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


ЕГЭ 16.06.2016 по информатике. Основная волна. Вариант 41 (Часть С)

Уче­ник на­пи­сал про­грам­му, опре­де­ля­ю­щую, какой сте­пе­нью числа 4 яв­ля­ет­ся вве­ден­ное. На­при­мер, для 16 это 2, так как 42 = 16. Если же такой сте­пе­ни нет, то не­об­хо­ди­мо вы­ве­сти со­об­ще­ние «Не су­ще­ству­ет». К со­жа­ле­нию, уче­ник на­пи­сал про­грам­му не­вер­но.

Пас­каль

var n,k: longint;
begin
readln(n);
k := 0;
while k mod 4 = 0 do
begin
	n := n div 4;
	k := k + 1;
end;
if n <= 4 then
	writeln(k)
else
writeln('Не существует');
end.

По­сле­до­ва­тель­но вы­пол­ни­те сле­ду­ю­щее.

1. Что вы­даст про­грам­ма при вводе числа 64?

2. При вводе ка­ко­го числа про­грам­ма вы­даст вер­ный ответ? Ука­жи­те этот ответ.

3. Найдите в программе все ошибки (их может быть одна или несколько).
Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде. Пом­ни­те, что нужно ис­пра­вить име­ю­щу­ю­ся про­грам­му, а не пи­сать свою, хоть и с луч­шим ал­го­рит­мом.


Требовалось написать программу, которая определяет, лежит ли точка А(х00) внутри треугольной области, ограниченной осями координат и прямой y=2-x («внутри» понимается в строгом смысле, т.е. случай, когда точка А лежит на границе области, недопустим). В результате программа должна выводить соответствующее текстовое сообщение. Программист сделал в программе ошибки.

Пас­каль

var x0, у0, у: real;
begin
readln (x0, y0);
if (x0 < 2)then begin
	if (x0 > 0)then begin
		у := 2 – х0;
		if (y0 < у) then
			writeln ('точка лежит внутри области')
		else writein ('точка не лежит внутри области');
	end
	else writeln ('точка не лежит внутри области');
end
else writeln ('точка не лежит внутри области');
end.

Си

#include <stdio.h>
int main(void)
{ float x0, y0, y;
scanf (″%f %f″,x0, y0);
if (x0 < 2) {
	if (x0 > 0) {
		y = 2 – x0;
		if (y0 < y)
			printf (″точка лежит внyтри области″);
		else printf (″точка не лежит внyтри области″);
	}
	else printf (″точка не лежит внyтри области″);
}
else printf (″точка не лежит внyтри области″);
}

Последовательно выполните задания:

  1. Приведите пример таких чисел х0 и у0, при которых программа неверно решает поставленную задачу.
  2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы (можно указать любой способ доработки исходной программы).
  3. Укажите, как можно доработать программу, чтобы вместо вложенных операторов IF она содержала логическую операцию AND.

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

 

var х, у, z: real; 
begin
readln (x, у, z); 
if (x + y > z) then 
begin
if (x + z > y) then 
if (y + z > x) then
writeln('треугольник построить можно'); 
end
else writeln('треугольник построить нельзя'); 
end
#include <stdio.h>
 int main(void)  
{ float x, y, z; 
scanf (″%f %f %f″, &x, &y, &z); 
if (x + y > z)   
{
if (x + z > y)   
if (y + z > x)  
printf(″треyгольник построить можно″); 
}
else printf(″треyгольник построить нельзя″); 
}

Последовательно выполните задания:

  1. Приведите пример таких чисел х, у, z, при которых программа неверно решает поставленную задачу.
  2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы (можно указать один из способов доработки исходной программы).
  3. Укажите, как можно доработать программу, чтобы она вместо вложенных операторов IF содержала логическую операцию AND.

Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы.

ege-informatika-24-2

Программист торопился и написал программу неправильно. Вот она:

var x, y: real; 
begin 
readln(x, y); 
if x*x + y*y >= 4 then 
	if x >= –2 then 
		if y <= –x then 
			write('принадлежит') 
else 
	write('не принадлежит') 
end.
#include <stdio.h> 
int main(void)  
{ float x, y; 
scanf(″%f %f″, &x, &y); 
if (x*x + y*y >= 4)  
	if (x >= –2)
		if (y <= –x) 
			printf(″принадлежит″); 
else 
	printf(″не принадлежит″); 
}

Последовательно выполните следующее:

1) Приведите пример таких чисел x, y, при которых программа неверно решает поставленную задачу.

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


Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы.

ege-informatika-24-3

Программист торопился и написал программу неправильно. Вот она:

var x, y: real; 
begin 
readln(x, y); 
if y >= x then 
	if y >= 0 then 
		if y <= 2-x*x then 
			write('принадлежит') 
		else 
		write('не принадлежит'); 
end.
#include <stdio.h> 
int main(void)  
{ 
float x, y; 
scanf(″%f %f″, &x, &y); 
if (y >= x)
	if (y >= 0) 
		if (y <= 2-x*x)  
			printf(″принадлежит″); 
		else 
			printf(″не принадлежит″); 
}

Последовательно выполните следующее:
1) Приведите пример таких чисел x, y, при которых программа неверно решает поставленную задачу.
2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).


Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы.

ege-informatika-24-9

Программист торопился и написал программу неправильно. Вот она:

var x, y: real; 
begin 
readln(x, y); 
if y <= 3-x*x then 
if y >= 0 then 
if y >= x+1 then 
write('принадлежит') 
else 
write('не принадлежит'); 
end.
#include <stdio.h> 
int main(void)  
{ float x, y; 
scanf(″%f %f″, &x, &y); 
if (y <= 3-x*x) 
if (y >= 0)
if (y >= x+1)
printf(″принадлежит″); 
else 
printf(″не принадлежит″); 
}

1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F, G, H). Точки, лежащие на границах областей, отдельно не рассматривать.

Область y <= 3-x*x y >= 0 y >= x+1 вывод верно?
A
B
C
D
E
F
G
H
J
K

В столбцах условий укажите «да», если условие выполнится, «нет» если условие не выполнится, «—» (прочерк), если условие не будет проверяться, «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце «Программа выведет» укажите, что программа выведет на экран. Если программа ничего не выводит, напишите «—» (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв». В последнем столбце укажите «да» или «нет».

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


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

ege-informatika-24-8

var x: real;
begin
  readln(x) ;
  if x<=l5 then
    if x<9 then
      if x<=3 then
        write('принадлежит')
      else
        write('не принадлежит')
end.
#include <stdio.h>
 int main(void)  
{ float x; 
  scanf(″%f″, &x); 
  if (x<=l5)
    if (x<9)
      if (x<=3)
        printf(″принадлежит″); 
      else
        printf(″не принадлежит″); 
}

Последовательно выполните следующее.

1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (А, В, С, D и Е). Границы (точки -3, 3, 9 и 15) принадлежат заштрихованным областям.

Область (x<=15) (х<9) (х<=3) Программа выведет Область обрабатывается верно
A
B
C
D
E

В столбцах условий укажите «да», если условие выполнится, «нет», если условие не выполнится, «—» (прочерк), если условие не будет проверяться, «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце «Программа выведет» укажите, что программа выведет на экран. Если программа ничего не выводит, напишите «—» (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв.». В последнем столбце укажите «Да» или «Нет».

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