infoegehelp.ru

Успешно сдать ЕГЭ по информатике
  • Главная
  • Контакты
  • Карта сайта
  • Помощь сайту
Важно
  • Демо варианты ЕГЭ
  • Учим числа: 2 в степени
  • Биты, байты, килобайты
Решение задач
  • Задачи вне основных разделов информатики
Разделы информатики
  • 2011-12-18-14-33-54Системы счисления
  • 2011-12-18-16-45-20Алгебра логики
  • 2011-12-18-16-55-26Программирование
  • 2011-12-18-16-53-40Кодирование информации
  • 2011-12-18-16-56-19Компьютерные сети и Интернет
  • -excelЭлектронные таблицы (Excel)
  • 2011-12-18-16-57-50Базы данных
  • 2011-12-18-16-58-50Графы
  • 2011-12-18-17-00-15Файловая система
  • Устройство компьютера
  • ПО компьютера

Разбор задачи C1 (демо ЕГЭ 2006)

Требовалось написать программу, в которой нужно было проверить, лежит ли число 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
Программа на АлгоритмическомПрограмма на языке СИ
алг
нач
цел 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");
}

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

  1. Приведите пример таких чисел a, b, x, при которых программа работает неправильно.
  2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).
  3. Укажите, как можно доработать программу, соблюдая дополнительное условие: доработанная программа не должна использовать логических операций 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.
Если х не находится между a и b, то x будет или меньше этих переменных, или больше. Соответственно, (x-a)*(x-b)≥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.
Значение выражения (x-a)*(x-b) будем сохранять в переменной p. Для вывода "x между a, b" должно выполняться условие: p<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");

}

Перейти к другим задачам.

 

Rambler's Top100

© Латыпова В.А., 2012-2020. Все права защищены.
Копирование материалов сайта только с разрешения администрации сайта