§ 3.1. Линейные алгоритмы

3.1.4. Примеры простых линейных программ

 

1. Написать программу, которая описывает как вещественные переменные и вводит с клавиатуры скорость (v) и время (t) равномерного движения тела, рассчитывает и выводит на экран значение расстояния (s), пройденного телом за это время, с 4 знаками после запятой.

Program Pr11;

   var v,t,s:real;

begin

   read(v,t);

   s:=v*t;

   writeln('S=',s:7:4);

end.

 

2. Написать программу, которая описывает целую переменную tC (температура по Цельсию) и вещественные переменные tR, tF (температуры по Реомюру и Фаренгейту). Программа вводит tC с клавиатуры, рассчитывает и выводит tR, tF с одним знаком после запятой по формулам tR=0.8∙tC ; tF=9∙tC/5+32.

Program Pr12;

   var tR,tF:real;

         tC:integer;

begin

   read(tC);

   tR:=0.8*tC;

   tF:=9*tC/5+32;

   writeln('tR=',tR:5:1,

   'tF=',tF:5:1);

end.

 

3. Написать программу, которая описывает как целые переменные и вводит с клавиатуры длины сторон прямоугольника (a и b), рассчитывает и выводит на экран значение периметра (переменная p вещественного типа) с двумя знаками после запятой.

Program Pr13;

   var p:real;

        a,b:integer;

begin

   read(a,b);

   p:=2*(a+b);

   writeln('p',p:5:2);

end.

 

4. Написать программу, в которой описываются вещественные переменные x,y,d, вводит с клавиатуры координаты точки x,y, рассчитывает расстояние d от нее до точки (1,3) и выводит на экран значение d с двумя знаками после запятой.

Program Pr14;

   var x,y,d:real;

begin

   read(x,y);

   d:=sqrt(sqr(x-1)+sqr(y-3));

   writeln('d=',d:5:2);

end.

 

5. Вычислите значение выражения \frac{a+b}{a-b}+\sqrt{\frac{c}{2}} по заданным a, b, c.

Program Pr15;

   var a,b,c:real;

begin

  read(a,b,c);

  writeln(((a+b)/(a-b) +sqrt(c/2)):5:2);

end.

 

6. Вычислить гипотенузу прямоугольного треугольника c и величины двух прилежащих к ней углов a и b по известным катетам a и b.

Воспользуемся известными формулами:

Угол выразим в градусах.

Program Pr15;

   var a,b,c, alf, bet:real;

begin

   read(a,b);

   c:=sqrt(a*a+b*b);

   alf:=arctan(a/b);

   bet:=arctan(b/a);

   writeln(‘гипотенуза = ’, c:5:2);

   writeln(‘угол а = ’, alf*180/pi:2:1);

   writeln(‘угол b= ’, bet*180/pi:2:1);

end.

 

7. Вычисление arcos(x). Т.е. нужно найти такой угол α, что cos(α)=x, т.к.  =  = , то α=  и, в программе alfa - угол в радианах [-π/2;π/2]; grad - угол в градусах [-90˚; 90˚].

Program Prim2;

var

   x,alfa,grad: real;

begin

   write(‘Введите значение косинуса ’);

   read(x);

   alfa:=arctan(sqrt(1-sqr(x))/x);

   grad:=alfa*180/pi;

   writeln(‘угол в радианах ’,alfa);

   writeln(‘угол в градусах ’,grad);

end.

8. Возведение x в степень a. Воспользуемся свойством: если ln(xa) = a*ln(x), то (xa) = exp(ln(xa)) = exp(a*ln(x)) при x>0 и

 -exp(a*ln(|x|) при x<0.

При возведении числа в отрицательную степень следует помнить, что x = 1/xa.

Program Prim3;

var

   Pwr,x,a: real;

begin

   writeln(‘Введите аргумент и степень ’);

   read(x,a);

   Pwr:=exp(a*ln(x));

   write(x,’ в степени ‘,a,’ равно ’,Pwr);

end.

 

А теперь покажем возможные типичные ошибки начинающих программистов в программах с линейными алгоритмами.

Тип ошибки

Неверное написание

Сообщение компилятора ИСР

Неописанная переменная

 

Все используемые переменные должны быть предварительно описаны в разделе описаний var

begin

   S:=1; {неизвестное имя S}

   write('S= ', S);

end.

Identifier not found “S”

Отсутствующая точка с запятой (;)

 

Очень частая ошибка у начинающих

var S : integer;

begin

   S:=1    { здесь ожидается ; }

   S:=S+1;

end.

Syntax error. “;” expected

Несовместимость типов при присваивании

 

Можно присваивать только данные одного типа. В редких случаях можно преобразовать данные одного типа в данные другого родственного типа. Например, целое можно преобразовать в вещественное, а символ - в строку.

var S : integer;

begin

   S:=1.31; {нельзя преобразовать вещественное в целое}

end.

Incompatible types: got “Extended” expected “SmallInt”

Отсутствие одного из апострофов строковой константы

 

Закрыть апостроф надо на этой строке, где расположен открывающий апостроф

var x, y : integer;

begin

  x:=3; y:=3;

  writeln(‘Сумма равна =, x+y); {не хватает апострофа}

end.

Fatal: String exceeds line

Ошибки расстановки запятых и апострофов при выводе строк и выражений

 

запятые разделяют разные элементы вывода

все, что находится в апострофах, будет выведено на экран без изменений

var x, y : integer;

begin

  x:=3; y:=3;

  writeln(x,'+',y=',x+y); {не верная расстановка}

end.

Fatal: String exceeds line

Ошибка ввода

 

Это - ошибка времени выполнения. Программа пытается преобразовать введенную строку в целое число и завершается с ошибкой

Var x : integer;

begin

read (x); {введите в программе текст и будет ошибка}

end.

Runtime error 106 at $#######

Ошибка неинициализированной переменной

 

Перед использованием любую переменную надо ввести или присвоить ей начальное значение.

var x, r: integer;

begin

{Забыли инициализировать или ввести x}

  r := x*x;

  writeln('Квадрат числа ',x,' = ',r);

end.

Ошибки как таковой не будет, но переменная r получит значение равно 0

Деление на ноль

 

Во время исполнения программа выполнит деление на ноль (в частности из-за неинициализированной переменной х) и завершится с ошибкой.

var x,y: real;

begin

  x :=0;

  y:=1/x; {деление на ноль!}

end.

Runtime error 200 at $#######

Корень из отрицательного числа

 

В Паскале возникает ошибка времени выполнения

var a, b: real;

begin

  a:=4; b:=1;

  writeln(sqrt (b-a)); {при b<a под корнем число меньше 0!}

end.

Runtime error 207 at $#######