Разбор задачи C1 (демо ЕГЭ 2008)
Программа на языке Паскаль | Программа на языке Бейсик |
---|---|
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 ("нет решений"); } |