Вы находитесь на странице: 1из 4

Исправление ошибок во фрагменте программы (C1)

Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоско-


сти (𝑥, 𝑦 — действительные числа) и определяет принадлежность точки заштрихованной области,
включая её границы. Программист торопился и написал программу неправильно. Последователь-
но выполните следующее:

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

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

1. 𝑌 𝑦 = sin 𝑥

𝑋
0 1.57

Программа на Паскале: Программа на Бейсике: Программа на Си:


INPUT x, y
var x,y: real; IF y>=0 THEN void main(void)
begin IF x<=1.57 THEN { float x,y;
readln(x,y); IF y<=SIN(x) THEN scanf("%f%f",&x,&y);
if y>=0 then PRINT "принадлежит" if (y>=0)
if x<=1.57 then ELSE if (x<=1.57)
if y<=sin(x) then PRINT "не принадлежит" if (y<=sin(x))
write(’принадлежит’) ENDIF printf("принадлежит");
else ENDIF else
write(’не принадлежит’) ENDIF printf("не принадлежит");
end. END }

2. 𝑌
𝑦=
cos
𝑥
0
𝑋
−1
𝑦 = −1
Программа на Паскале: Программа на Бейсике: Программа на Си:

var x,y: real; INPUT x, y void main(void)


begin IF y<=0 THEN { float x,y;
readln(x,y); IF y>=-1 THEN scanf("%f%f",&x,&y);
if y<=0 then IF y<=cos(x) THEN if (y<=0)
if y>=-1 then PRINT "принадлежит" if (y>=-1)
if y<=cos(x) then ELSE if (y<=cos(x))
write(’принадлежит’) PRINT "не принадлежит" printf("принадлежит");
else ENDIF else
write(’не принадлежит’) ENDIF printf("не принадлежит");
end. ENDIF }
END
1
3. 𝑌

𝑦=

𝑥 = 1.5
𝑥
2

𝑋
0 1.5
Программа на Паскале: Программа на Бейсике: Программа на Си:
INPUT x, y
var x,y: real; IF y<=x*x THEN void main(void)
begin IF x<=1.5 THEN { float x,y;
readln(x,y); IF y>=0 THEN scanf("%f%f",&x,&y);
if y<=x*x then PRINT "принадлежит" if (y<=x*x)
if x<=1.5 then ELSE if (x<=1.5)
if y>=0 then PRINT "не принадлежит" if (y>=0)
write(’принадлежит’) ENDIF printf("принадлежит");
else ENDIF else
write(’не принадлежит’) ENDIF printf("не принадлежит");
end. END }
𝑥 = −1

𝑦 = 2𝑥 2

4. 𝑌

1
𝑦=1

𝑋
−1 0

Программа на Паскале: Программа на Бейсике: Программа на Си:


INPUT x, y
var x,y: real; IF y<=2*x*x THEN void main(void)
begin IF x>=-1 THEN { float x,y;
readln(x,y); IF y>=1 THEN scanf("%f%f",&x,&y);
if y<=2*x*x then PRINT "принадлежит" if (y<=2*x*x)
if x>=-1 then ELSE if (x>=-1)
if y>=1 then PRINT "не принадлежит" if (y>=1)
write(’принадлежит’) ENDIF printf("принадлежит");
else ENDIF else
write(’не принадлежит’) ENDIF printf("не принадлежит");
end. END }

2
5. 𝑌

𝑥
=
22

𝑦
=
𝑦2
+
𝑥2

𝑋
0

𝑦 = −2
−2

Программа на Паскале: Программа на Бейсике: Программа на Си:


INPUT x, y
var x,y: real; IF x*x+y*y>=4 THEN void main(void)
begin IF y>=-2 THEN { float x,y;
readln(x,y); IF y<=x THEN scanf("%f%f",&x,&y);
if x*x+y*y>=4 then PRINT "принадлежит" if (x*x+y*y>=4)
if y>=-2 then ELSE if (y>=-2)
if y<=x then PRINT "не принадлежит" if (y<=x)
write(’принадлежит’) ENDIF printf("принадлежит");
else ENDIF else
write(’не принадлежит’) ENDIF printf("не принадлежит");
end. END }

6. 𝑌
𝑥=2
22
=
𝑦2
+
𝑥2

2
𝑋
0

𝑦 = −2
−2

Программа на Паскале: Программа на Бейсике: Программа на Си:


INPUT x, y
var x,y: real; IF x*x+y*y>=4 THEN void main(void)
begin IF y>=-2 THEN { float x,y;
readln(x,y); IF y<=2 THEN scanf("%f%f",&x,&y);
if x*x+y*y>=4 then PRINT "принадлежит" if (x*x+y*y>=4)
if y>=-2 then ELSE if (y>=-2)
if y<=2 then PRINT "не принадлежит" if (y<=2)
write(’принадлежит’) ENDIF printf("принадлежит");
else ENDIF else
write(’не принадлежит’) ENDIF printf("не принадлежит");
end. END }

3
𝑎𝑥
7. Требовалось написать программу, которая решает неравенство 𝑥+𝑏 > 0 относительно 𝑥 для
любого ненулевого числа 𝑎 и любого неотрицательного числа 𝑏 и (𝑎 ̸= 0, 𝑏 > 0), введённых
с клавиатуры. Все числа считаются действительными. Программист торопился и написал
программу неправильно.
Последовательно выполните следующее:

а) Приведите пример таких чисел 𝑎, 𝑏, 𝑥, при которых программа неверно решает постав-
ленную задачу.
б) Укажите, какая часть программы является лишней.
в) Укажите, как нужно доработать программу, чтобы не было случаев её неправильной
работы. (Это можно сделать несколькими способами, поэтому можно указать любой
способ доработки исходной программы).

Программа на Паскале: Программа на Бейсике: Программа на Си:

var a,b,x: real; INPUT a, b, x void main(void)


begin IF b=0 THEN { float a,b,x;
readln(a,b,x); PRINT "x > 0 или x < 0" scanf("%f%f%f",&a,&b,&x);
if b=0 then ELSE if (b==0)
write(’x > 0 или x < 0’) IF a>0 THEN printf("x>0 или x<0");
else PRINT "x > 0 или x < ",-b else
if a > 0 then ELSE if (a>0)
write(’x > 0 или x < ’,-b) PRINT -b," < x < 0" printf("x>0 или x<%f",-b);
else ENDIF else
write(-b,’ < x < 0’); ENDIF printf("%f<x<0",-b);
end. END }

8. Неравенство: 𝑎|𝑥| = 𝑏 относительно 𝑥 для любых чисел 𝑎 и 𝑏. Все числа — действительные.

Программа на Паскале: Программа на Бейсике: Программа на Си:


INPUT a, b, x
var a,b,x: real; IF a=0 THEN void main(void)
begin IF b=0 THEN { float a,b,x;
readln(a,b,x); PRINT "любое число" scanf("%f%f%f",&a,&b,&x);
if a=0 then ELSE if (a==0)
if b=0 then PRINT "нет решений" if (b==0)
write(’любое число’) ENDIF printf("любое число");
else ELSE else
write(’нет решений’) IF b=0 THEN printf("нет решений");
else PRINT "x = 0" else
if b = 0 then ELSE if (b==0)
write(’x = 0’) PRINT "x = ",b/a, printf("x=0");
else PRINT "или x = ",-b/a else
write(’x = ’,b/a, ENDIF printf("x=%f или x=%f",
’ или x = ’,-b/a); ENDIF b/a,-b/a);
end. END }