1. Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y – действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы). Программист торопился и написал программу неправильно.
Паскаль | Бейсик |
---|---|
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. |
INPUT x, yIF y>=x THEN
IF y>=0 THEN IF y<=2-x*x THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF ENDIF ENDIF END |
Си | Алгоритмический язык |
void main(void){float x,y;
scanf("% f % f",&x,&y); if (y>=x) if (y>=0) if (y<=2-x*x) printf("принадлежит"); else printf("не принадлежит"); } |
алгнач
вещ x,y ввод x,y если y>=x то если y>=0 то если y<=2-x*x то вывод 'принадлежит' иначе вывод 'не принадлежит' все все все кон |
Последовательно выполните следующее.
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F, G и H).
Точки, лежащие на границах областей, отдельно не рассматривать. В столбцах условий укажите "да", если условие выполнится, "нет", если условие не выполнится, "—" (прочерк), если условие не будет проверяться, "не изв.", если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце "Программа выведет" укажите, что программа выведет на экран. Если программа ничего не выводит, напишите "—" (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите "не изв". В последнем столбце укажите "да" или "нет".
2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)
Область | Условие 1 (y>=x) | Условие 2 (y>=0) | Условие 3 (y<=2–x*x) | Программа выведет | Область обрабатываетсяверно |
A | |||||
В | |||||
С | |||||
D | |||||
Е | |||||
F | |||||
G | |||||
Н |
2. Требовалось написать программу, которая решает неравенство «(x - а) / (bx) > 0» относительно x для любых ненулевых чисел а и b , введенных с клавиатуры. Все числа считаются действительными. Программист торопился и написал программу неправильно.
Паскаль | Бейсик | Си |
---|---|---|
var a,b,x: real;begin readln(a,b,x); if b>0 then write ('x > ',a,' или x < 0') else if a > 0 then write ('0 < x <', a) else write (a, '< x < 0 '); end. | INPUT a, b, x
IF b > 0 THEN
PRINT "x > ",a," или x<0"
ELSE
IF a > 0 THEN
PRINT "0 < x < ",a
ELSE
PRINT a," < x < 0"
ENDIF
ENDIF
END
| void main(void){ float a,b,x; scanf("%f%f%f", &a,&b,&x); if (b > 0) printf("x > %f или x < 0 ", a); else if (a>0) printf("0 < x < %f",a); else printf("%f < x < 0",a); } |
Последовательно выполните три задания:
1) Приведите пример таких чисел а, b, х, при которых программа неверно решает поставленную задачу.
2) Укажите, какая часть программы является лишней.
3) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).
3. Дано целое неотрицательное число N. Необходимо вывести два неотрицательных целых числа, которые при возведении к квадрат дадут результаты, наиболее близкие к N. Например, для N = 2016 нужно вывести числа 44 и 45 (442 = 1936, 452 = 2025), а для N = 9 нужно вывести числа 2 и 3. Для решения этой задачи ученик написал программу, но, к сожалению, его программа — неправильная.
Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Бейсик | Python |
---|---|
DIM N, K AS INTEGER
INPUT N K = 1 WHILE K*K <= N K = K + 1 WEND PRINT (K-1)*(K-1), K*K END |
n = int(input())
k = 1 while k*k <= n: k = k + 1 print((k-1)*(k-1),k*k) |
Алгоритмический язык | Паскаль |
алг
нач цел n, k ввод n k := 1 нц пока k*k <= n k := k + 1 кц вывод (k-1)*(k-1), " ", k*k кон |
var n, k: integer;
begin read(n); k := 1; while k*k <= n do k := k + 1; writeln((k-1)*(k-1)," ",k*k) end. |
Си | |
#include <stdio.h>>
int main(){ int n, k; scanf("%d", &n); k = 1; while (k*k <= n) k = k + 1; printf("%d %d", (k-1)*(k-1), k*k); return 0; } |
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе N = 2016.
2. Назовите значение N, при вводе которого программа выведет верный ответ. Укажите этот ответ.
3. Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде. Достаточно указать ошибки и способ их исправления для одного языка программирования.
Обратите внимание: Вам нужно исправить приведённую программу, а не написать свою. Вы можете только заменять ошибочные строки, но не можете удалять строки или добавлять новые. Заменять следует только ошибочные строки: за исправления, внесённые в строки, не содержащие ошибок, баллы будут снижаться.
4. Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y – действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы). Программист торопился и написал программу неправильно.
Паскаль | Бейсик |
---|---|
var x,y: real;begin
if y<=2+x then if y>=0 then if y>=x*x then write('принадлежит') else write('не принадлежит') end. |
INPUT x, yIF y<=2+x THEN
IF y>=0 THEN IF y>=x*x THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF ENDIF ENDIF END |
Си | Алгоритмический язык |
void main(void){float x, y;
scanf("%f%f", &x, &y); if (y<=2+x) if (y>=0) if (y>=x*x) printf("принадлежит"); else printf("не принадлежит"); } |
нач
вещ x,y ввод x,y если y<=2+x то если y>=0 то если y>=x*x то вывод 'принадлежит' иначе вывод 'не принадлежит' все все все кон |
Последовательно выполните следующее.
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F, G и H).
Точки, лежащие на границах областей, отдельно не рассматривать. В столбцах условий укажите "да", если условие выполнится, "нет", если условие не выполнится, "—" (прочерк), если условие не будет проверяться, "не изв.", если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце "Программа выведет" укажите, что программа выведет на экран. Если программа ничего не выводит, напишите "—" (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите "не изв". В последнем столбце укажите "да" или "нет".
2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)
Область | Условие 1 (y<=2+x) | Условие 2 (y>=0) | Условие 3 (y>=x*x) | Программа выведет | Область обрабатываетсяверно |
A | |||||
В | |||||
С | |||||
D | |||||
Е | |||||
F | |||||
G | |||||
Н |
5. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (х, у — действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
Паскаль | Бейсик |
---|---|
var х, у: real;
begin readln(x, у); if у <= sin(x) then if у >= 1 − x then if у >= 0 then write('принадлежит') else write('не принадлежит') end. |
INPUT x, уIF у <= SIN(x) THEN
IF у >= 1 − x THEN IF у >= 0 THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF ENDIF ENDIF END |
Си | Алгоритмический язык |
void main(void){
float x, у; scanf("%f%f", &x, &y); if (y <= sin(x)) if (у >= 1 − x) if (y >= 0) printf("принадлежит"); else printf("не принадлежит"); } |
алгнач
вещ х, у ввод X, у если у <= sin (х) то если у >= 1 − х то если у >= 0 то вывод ' принадлежит ' иначе вывод 'не принадлежит' все все все кон |
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F, G и H).
Точки, лежащие на границах областей, отдельно не рассматривать. В столбцах условий укажите "да", если условие выполнится, "нет", если условие не выполнится, "—" (прочерк), если условие не будет проверяться, "не изв.", если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце "Программа выведет" укажите, что программа выведет на экран. Если программа ничего не выводит, напишите "—" (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите "не изв". В последнем столбце укажите "да" или "нет".
2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)
Область | Условие 1
(у <= sin(x))
| Условие 2
(у >= 1 − x)
| Условие 3
(у >= 0)
| Программа выведет | Область обрабатываетсяверно |
A | |||||
В | |||||
С | |||||
D | |||||
Е | |||||
F | |||||
G | |||||
Н |
6.
Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (х, у — действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы).
Паскаль | Бейсик |
---|---|
var x, у: real;
begin readln(x,y); if x*x + y*y <= 25 then if y <= 4 - x*x then if y <= x+1 then write('принадлежит') else write('не принадлежит') end. |
INPUT х, у
IF x*x + у*у <= 25 THEN IF y <= 4 - x*x THEN IF y <= x + 1 THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF END IF END IF END |
Си | Алгоритмический язык |
#include <stdio.h>
void main (void) { float x,y; scanf <"% f % f", &x, &y) ; if (x*x + y*y <= 25) if (y <= 4 - x * x) if (y <= x + 1) printf ("принадлежит"); else printf("не принадлежит"); } |
алг
нач вещ х,у ввод х,у если х * х + у * у <= 25 то если y <= 4 - x * x то если y <= x + 1 то вывод 'принадлежит' иначе вывод 'не принадлежит' все все все кон |
При проверке работы программа выполнялась по шагам для некоторых контрольных значений x и y. при этом был заполнен протокол тестирования, содержащий следующую информацию.
Область — часть плоскости, которой принадлежит проверяемая точка (все возможные области отмечены на рисунке буквами A, B, C, ... W).
Условие 1, Условие 2, Условие 3 — результат проверки соответствующего условия (да или нет). Если условие не проверялось, в протокол записывался прочерк.
Вывод — сообщение, которое вывела программа. Если программа ничего не вывела, в протокол записывался прочерк.
Верно — итоговое заключение (да или нет) о правильности результата работы программы при данных значениях x и y.
В результате неаккуратного обращения протокол был испорчен, частично сохранилось только три строки:
Область | Условие 1
(х*х+у*у <= 25)
| Условие 2 (y <= 4 - x * x) | Условие 3 (y <= x + 1) | Вывод | Верно |
да | — | ||||
принадлежит | нет | ||||
нет | нет |
Последовательно выполните следующее.
1. Восстановите уцелевшие строки протокола, заполнив все клетки таблицы. Там, где содержание восстанавливается неоднозначно, запишите любое возможное значение. Например, если для нескольких областей получается одинаковая строка таблицы, укажите в графе «Область» любую из этих областей.
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы (это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы).
7.
Область | Условие 1 (y >= x*x-2) | Условие 2 (y <= 4-x*x) | Условие 3 (x >= 0) | Программа выведет | Область обрабатывается верно |
A | |||||
B | |||||
C | |||||
D | |||||
E | |||||
F | |||||
G | |||||
H | |||||
8. Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (х, у — действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы). Программист торопился и написал программу неправильно.
Бейсик | Паскаль |
---|---|
INPUT х, у
IF x*x + у*у <= 49 THEN IF x*x + у*у >= 16 THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF END IF END |
var x, у: real;
begin readln(x,y); if x*x + y*y <= 49 then if x*x + y*y >= 16 then write{'принадлежит') else write{'не принадлежит') end. |
Си | Алгоритмический |
#include <stdio.h>
void main (void) { float x,y; scanf <"% f % f", &x, &y) ; if (x*x + y*y <= 49) if (x*x + y*y >= 16) printf ("принадлежит"); else printf("не принадлежит"); } |
алг
нач вещ х,у ввод х,у если х*х + у*у <= 49 то если х*х + у* у >= 16 то вывод 'принадлежит' иначе вывод 'не принадлежит' все все кон |
Последовательно выполните следующее.
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D). Точки, лежащие на границах областей, отдельно не рассматривать. В столбцах условий укажите "да", если условие выполнится, "нет", если условие не выполнится, "—" (прочерк), если условие не будет проверяться, "не изв.", если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце "Программа выведет" укажите, что программа выведет на экран. Если программа ничего не выводит, напишите "—" (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите "не изв". В последнем столбце укажите "да" или "нет".
2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)
Область | Условие 1
(х*х+у*у <= 49)
| Условие 2
(х*х+у*у >= 16)
| Программа выведет | Областьобрабатывается верно |
---|---|---|---|---|
A | ||||
В | ||||
С | ||||
D |
9. Требовалось написать программу, при выполнении которой с клавиатуры считывается координата точки на прямой (х - действительное число) и определяется принадлежность этой точки одному из выделенных отрезков (включая границы). Программист торопился и написал программу неправильно.
Бэйсик | Паскаль |
---|---|
INPUT х
IF х>=-5 OR х<=1 THEN IF х>=-3 AND x<=3 THEN IF x>=-l AND x<=5 THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" END IF END IF END IF END |
var х: real;
begin readln(х); if (x>=-5) or (x<=1) then if (x>=-3) and (x<=3) then if (x>=-l) and (x<=5) then write('принадлежит') else write('не принадлежит') end. |
Си | Алгоритмический язык |
#include <stdio.h>
void main(){ float x; scanf("% f",&x); if (x>=-5 || x<=l) if (x>=-3 && x<=3) if (x>=-l && x<=5) printf("принадлежит"); else printf("не принадлежит"); } |
алг
нач вещ х ввод X если х>=-5 или х<=1 то если х>=-3 и х<=3 то если х>=-1 и х<=5 то вывод 'принадлежит' иначе вывод 'не принадлежит' все все все кон |
Область | Условие 1 (x >= -5 или x <= 1) | Условие 2 (x >= -3 и x <= 3) | Условие 3 (x >= -1 и x <= 5) | Программа выведет | Область обрабатывается верно |
A | |||||
B | |||||
C | |||||
D | |||||
E | |||||
F | |||||
G |
10. Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится минимальная цифра этого числа. Программист торопился и написал программу неправильно. (Ниже для Вашего удобства программа представлена на четырёх языках программирования.)
Бейсик | Паскаль |
---|---|
DIM N AS LONG
INPUT N
min_digit = 9
WHILE N >= 10
digit = N MOD 10
IF digit < min_digit THEN
min_digit = digit
END IF
N = N \ 10
WEND
PRINT digit
END
|
var N: longint;
digit, min_digit: integer; begin readln(N); min_digit := 9; while N >= 10 do begin digit := N mod 10; if digit < min_digit then min_digit := digit;
N := N div 10;
end;writeln(digit); end. |
Си | Алгоритмический |
#include<stdio.h>
int main() { long int N; int digit, min_digit; scanf("%ld", &N); min_digit = 9; while (N >= 10) { digit = N % 10; if (digit < min_digit) min_digit = digit;
N = N / 10;
}printf("%d", digit); } |
алг
нач цел N, digit, min_digit ввод N min_digit := 9 нц пока N >= 10 digit := mod(N, 10) если digit < min_digit то min_digit := digit все
N := div(N, 10)
кцвывод digit кон |
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 547.
2. Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, — приведите правильный вариант строки.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Комментариев нет:
Отправить комментарий