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 (демо ЕГЭ 2008)

Требовалось написать программу, которая решает уравнение «a|x|=b» относительно x для любых чисел a и b, введенных с клавиатуры. Все числа считаются действительными. Программист торопился и написал программу неправильно.
Программа на языке ПаскальПрограмма на языке Бейсик
var a,b,x: real;
begin
  readln(a,b,x);
  if a = 0 then
    if b = 0 then
      write ('любое число')
    else
      write ('нет решений')
  else
    if b = 0 then
      write('x = 0')
    else
      write('x =',b/a,' или x =',-b/a);
end.
INPUT a, b, x
IF a = 0 THEN
  IF b = 0 THEN
    PRINT "любое число"
  ELSE
    PRINT "нет решений"
  ENDIF
ELSE
  IF b = 0 THEN
    PRINT "x = 0"
  ELSE
    PRINT "x =",b/a, " или x =",-b/a
  END IF
END IF
END
Программа на АлгоритмическомПрограмма на языке СИ
алг
нач
  вещ a,b,x
  ввод a,b,x
  если a=0
    то
      если b=0
        то вывод 'любое число'
        иначе вывод 'нет решений'
      все
    иначе
      если b=0
        то вывод 'x=0'
        иначе вывод 'x=',b/a,' или x=',-b/a
      все
  все
кон
void main(void)
{
   float a,b,x;
  scanf("%f%f%f", &a,&b,&x);
  if (a==0)
    if (b==0)
      printf("любое число");
    else
      printf ("нет решений");
  else
    if (b==0)
      printf("x = 0");
    else
      printf("x=%f или x=%f", b/a,-b/a);
}

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

Решение:

часть 1)

при b/a<0, a≠0 и b≠0 программа работает некорректно. Она выдает ответ: x=±b/a, а должна выводить "нет решений". В данному случае нарушается условие x≥0 (значение по модулю не может быть отрицательным).

Определим, какими могут быть a и b исходя из приведенных выше условий. Получаем, что a и b могут быть любыми ненулевыми числами с разными знаками. Например, a=10, b=-10.


часть 2)

Лишняя часть в программе - ввод x с клавиатуры.

Правильно:

  • для Паскаля - readln(a,b);
  • для Бейсика - INPUT a, b
  • для Алгоритмического - ввод a,b
  • для Си - scanf("%f%f",&a,&b);
Также другие ошибки:
  • для Бейсик не объявлены переменные a,b,x. Необходимо добавить в начале программы строку:
    DIM a,b,x AS SINGLE
  • для Си не подключена библиотека stdio.h. Необходимо добавить в начале программы строку: #include <stdio.h>.
    Без данной библиотеки не будут работать функции printf и scanf.

часть 3)
Доработанная программа:
ПаскальБейсик
var a,b,x: real;
begin
  readln(a,b);
  if a = 0 then
    if b = 0 then
      write ('любое число')
    else
      write ('нет решений')
  else
    if b/a>0 then
      write('x =',b/a,' или x =',-b/a)
    else
      if b=0 then
        write('x =0');
      else
        write ('нет решений');
end.
DIM a,b,x AS SINGLE
INPUT a, b
IF a = 0 THEN
  IF b = 0 THEN
    PRINT "любое число"
  ELSE
    PRINT "нет решений"
  ENDIF
ELSE
  IF b/a>0 THEN
    PRINT "x =",b/a, " или x =",-b/a
  ELSE
    IF b=0 THEN
      PRINT "x = 0"
    ELSE
      PRINT "нет решений"
    END IF
  END IF
END IF
END
АлгоритмическомСи
алг
нач
  вещ a,b,x
  ввод a,b
  если a=0
    то
      если b=0
        то вывод 'любое число'
        иначе вывод 'нет решений'
      все
    иначе
      если b=0
        то вывод 'x=0'
        иначе вывод 'x=',b/a,' или x=',-b/a
      все
  все
кон
#include <stdio.h>
void main(void)
{
   float a,b,x;
   scanf("%f%f",&a,&b);
   if (a==0)
     if (b==0)
       printf("любое число");
     else
       printf ("нет решений");
   else
     if(b/a>0)
       printf("x=%f или x=%f", b/a,-b/a);
     else
       if (b==0)
         printf("x = 0");
       else
         printf ("нет решений");
}

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

 

Rambler's Top100

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