Разбор задачи C1 (демо ЕГЭ 2006)
Программист торопился и написал программу некорректно.
Программа на языке Паскаль | Программа на языке Бейсик |
---|---|
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 |
Программа на Алгоритмическом | Программа на языке СИ |
алг нач цел a,b,x,p ввод a,b,x если a>x и x>b то вывод 'x между a,b' все кон |
#include <stdio.h> void main(void) { int a,b,x,p; scanf("%d%d%d",&a,&b,&x); if ( (a>x)&&(x>b) ) printf("x между a, b"); } |
Последовательно выполните три задания:
- Приведите пример таких чисел a, b, x, при которых программа работает неправильно.
- Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).
- Укажите, как можно доработать программу, соблюдая дополнительное условие: доработанная программа не должна использовать логических операций AND или OR.
часть 1
Программа работает корректно при a>b.
При a<b программа будет работать неправильно. Пример: a=1, b=3, x=2. Программа ничего не выведет, хотя должна была вывести: "x между a,b".
часть 2
В программе нужно обработать случай, когда a<b. Один из вариантов обработки такой: если a<b, то меняем местами a и b, т.е. переменная a принимает значение b, а переменная b - значение а. Для обмена значениями используем переменную p. Это часть выделена в программе розовым.
Доработанная программа:
Паскаль | Бейсик |
---|---|
var a,b,x: integer; p: integer; begin readln(a,b,x); if(a<b) then begin p:=a; a:=b; b:=a; end; if (a>x) AND (x>b) then writeln('x между a,b'); end. |
DIM a,b,x,p AS INTEGER CLS INPUT a, b, x IF (a<b) THEN p=a a=b b=p END IF IF (a>x) AND (x>b) THEN PRINT "x между a, b" END |
Алгоритмический | Си |
алг нач цел a,b,x,p ввод a,b,x если a<b то p:=a a:=b b:=p все если a>x и x>b то вывод 'x между a,b' все кон |
#include <stdio.h> void main(void) { int a,b,x,p; scanf("%d%d%d",&a,&b,&x); if(a<b){ p=a; a=b; b=p; } if( (a>x)&&(x>b) ) printf("x между a, b"); } |
часть 3
Для проверки нахождения x между a и b можно использовать следующее выражение: (x-a)*(x-b).
Если х находится между двумя переменными a и b, то x будет меньше одной переменной и больше другой. Соответственно, (x-a)*(x-b)<0.
Примеры:
- a<b. a=1, b=3, x=2. (x−a)*(x−b)=(2−1)*(2−3)=1*−1=−1. −1<0.
- a>b. a=3, b=1, x=2. (x−a)*(x−b)=(2−3)*(2−1)=−1*1=−1. −1<0.
Примеры:
- x≥a, x≥b. a=1, b=3, x=5. (x−a)*(x−b)=(5−1)*(5−3)=4*2=8. 8>0.
- x≤a, x≤b. a=1, b=3, x=0. (x−a)*(x−b)=(0−1)*(0−3)=−1*−3=3. 3>0.
Программа, не содержащая логических операций and или or:
Паскаль | Бейсик |
---|---|
var a,b,x: integer; p: integer; begin readln(a,b,x); p:=(x-a)*(x-b); if (p<0) then writeln('x между a,b'); end. |
DIM a,b,x,p AS INTEGER CLS INPUT a, b, x p=(x-a)*(x-b) IF (p<0) THEN PRINT "x между a, b" END |
Алгоритмический | Си |
алг нач цел a,b,x,p ввод a,b,x p:=(x-a)*(x-b) если p<0 то вывод 'x между a,b' все кон |
#include <stdio.h> void main(void) { int a,b,x,p; scanf("%d%d%d",&a,&b,&x); p=(x-a)*(x-b); if(p<0) printf("x между a, b"); } |