Контрольная работа по «Программирование на языках высокого уровня»

Контрольная работа

по  курсу

«Программирование на языках высокого уровня»

Задача 1

Определить, лежиттли заданная точка на одной из сторон треугольника, заданого координатами своих вершин.

Блок-схема  алгоритма

 

Текст программы

Program N_1;

var x,y,x1,x2,x3,y1,y2,y3,k1,k2,k3,b1,b2,b3,d1,d2,d3:Real;

    b:boolean;

begin

  Write('x1, y1 '); Readln(x1,y1);

  Write('x2, y2 '); Readln(x2,y2);

  Write('x3, y3 '); Readln(x3,y3);

  Write('x, y '); Readln(x,y);

  d1:=Sqrt(Sqr(x2-x1)+Sqr(y2-y1));

  d2:=Sqrt(Sqr(x3-x2)+Sqr(y3-y2));

  d3:=Sqrt(Sqr(x3-x1)+Sqr(y3-y1));

  {Проверка существования треугольника}

  b:=(d1<d2+d3) and (d2<d1+d3) and (d3<d1+d2);

  if b then

  begin

    {Построение  уравнений прямых}

    if x1<>x2 then

    begin

      k1:=(y1-y2)/(x1-x2);

      b1:=y1-k1*x1;

    end;

    if x2<>x3 then

    begin

      k2:=(y2-y3)/(x2-x3);

      b2:=y2-k2*x2;

    end;

    if x1<>x3 then

    begin

      k3:=(y3-y1)/(x3-x1);

      b2:=y3-k3*x3;

    end;

    {Проверка принадлежности точки стороне треугольника}

    if x1<>x2 then b:=(y=k1*x+b1) else b:=(x=x1) and (d1=abs(y-y1)+abs(y-y2));

    if x2<>x3 then b:=b or (y=k2*x+b2) else b:=b or ((x=x2) and (d2=abs(y-y2)+abs(y-y3)));

    if x1<>x3 then b:=b or (y=k3*x+b3) else b:=b or ((x=x3) and (d3=abs(y-y1)+abs(y-y3)));

    if b then Writeln('Да') else Writeln('Нет');

  end

  else Writeln('Треугольник не существует');

  Readln;

end.

Задача 2

Дана строка S,состоящая из n символов. Проверить, содержит ли данная строка подстроку "аа". Определить позицию первого вхождения подстроки и общее количество вхождений.

Блок-схема  алгоритма

Текст программы

Program N_2;

var S:String;

    n,i,P,c:Integer;

    {S - исходная строка

     n - ее  длина (определяется после ввода  строки)

     P - позиция  вхождения подстроки "аа" ("аа" - латинские символы) в исходную  строку

     с  - количество таких вхожднеий}

begin

  Write('S = '); Readln(S);

  n:=Length(S);

  P:=Pos('aa',S);

  c:=0;

  {Проверка наличия  вхождения}

  if P<>0 then

  begin

    Writeln('Yes - ',P);

    For i:=1 to n-1 do

      if S[i]+S[i+1]='aa' then c:=c+1;

  end

  else Writeln('No');

  Writeln(C);

  Readln;

end. 
 

Задача 3

Пересортировать все элементы одномерного массива  и разделить его на две такие  части, чтобы разность между суммами  элементов в каждой из этих частей оказалась бы наименьшей. Результаты выдать на экран.

Блок-схема  алгоритма

Текст программы

Program N_3;

{Идея алгоритма:

1. Массив сортируется  в порядке возрастания;

2. Если сумма  всех элементов отрицательная,  то просматриваем массив

    от начала  и

      если сумма во втором массиве вместе с текущим (отрицательным) элементом

      из исходного массива больше  половины суммы исходного массива,

      то записываем его во второй  массив,

      иначе записываем в третий  массив;

3. Если сумма  всех элементов исходного массива положительная,

    то просматриваем  его от конца к началу и

      если сумма во втором массиве  вместе с текущим (положительным)  элементом

      из исходного массива меньше  половины суммы исходного массива,

      то записываем его во второй  массив,

      иначе записываем в третий  массив;}

const MaxN=100;                   {Максимальный размер массива}

var a:array[1..MaxN] of real;     {Исходный массив}

    b,c:Array[1..MaxN] of real;   {Массивы после решения}

    {i,j - переменные  для организации циклов

     n - вводимый  размер массива

     Num - Индекс минимального элемента  массива (при сортировке)

     ind1, ind2 - индексы элементов второго  и третьего массивов

     S,S1,S2 - суммы элементов в каждом  массиве

     Min - Минимальный элемент в исходном массиве (для сортировки)

     v - логическая  переменная для проверки чисел  массива}

    i,j,n,Num,ind1,ind2:Integer;

    S,S1,S2,Min:Real;

    v:boolean;

begin

  {Маасив формируется  генератором случайных чисел  из интервала (-100; 100)}

  Randomize;

  Write('n = ');Readln(n);

  S:=0;

  Writeln('Исходный массив');

  For i:=1 to n do

  begin

    A[i]:=100-random*200;

    {Вывод  элементов массива с точностью  до 3-х десятичных знаков}

    Write(A[i]:0:3,' ');

    S:=S+A[i];

  end;

  Writeln;

  Writeln('S = ',S*2:0:3);

  {Сортировка плученного массива}

  For i:=1 to n-1 do

  begin

    {Поиск  минимального элемента в оставшейся

     не  отсортированной части массива}

    min:=A[i]; Num:=i;

    For j:=i+1 to n do

      if A[j]<min then

      begin

        min:=A[j];

        Num:=j;

      end;

      A[Num]:=A[i];

      A[i]:=Min

  end;

  {Вывод массива  после сортировки}

  Writeln('Массив после сортировки');

  For i:=1 to n do Write(A[i]:0:3,' '); Writeln;

  {Распределение элементов исходного массива на 2}

  S1:=0;S2:=0;

  ind1:=1; ind2:=1;

  {Проверим, есть  ли в массиве числа, модуль  которых меньше модуля полусуммы

   всех элементов  массива}

  v:=False;

  For i:=1 to n do

  begin

    v:=v or (Abs(A[i])<Abs(S/2));

    if v then break;

  end;

  {}

  if v then

  begin

  {Если сумма элементов исходного массива не положительна}

  if S<=0 then

    For i:=1 to N do

    begin

      {Если S1 вместе с текущим не  положительным элементом не меньше S/2}

      if (S1+A[i]>=S/2) and (A[i]<=0) then

      begin

        {то записываем его во второй массив

         добавляем к сумме его элементов

         переводим индекс на следующую  ячеку массива}

        b[ind1]:=A[i];

        S1:=S1+A[i];

        ind1:=ind1+1;

      end

      else

      begin

        {иначе записываем его в третий массив

         добавляем к сумме его элементов

         переводим индекс на следующую  ячеку массива}

        c[ind2]:=A[i];

        S2:=S2+A[i];

        ind2:=ind2+1;

      end;

    end

  else

  begin

    For i:=N downto 1 do

    begin

      if (S1+A[i]<=S/2) and (A[i]>=0) then

      begin

        {то записываем его во второй  массив

         добавляем к сумме его элементов

         переводим индекс на следующую  ячеку массива}

        b[ind1]:=A[i];

        S1:=S1+A[i];

        ind1:=ind1+1;

      end

      else

      begin

        {то записываем его в третий массив

         добавляем к сумме его элементов

         переводим индекс на следующую  ячеку массива}

        c[ind2]:=A[i];

        S2:=S2+A[i];

        ind2:=ind2+1;

      end;

    end

  end;

  End

  else

  begin

    For i:=1 to n do

    begin

      if (i mod 4=1) or (i mod 4=0)

      then

      begin

        B[ind1]:=A[i];

        Ind1:=Ind1+1;

        S1:=S1+A[i];

      end

      else

      begin

        C[ind2]:=A[i];

        Ind2:=Ind2+1;

        S2:=S2+A[i];

      end;

    end;

  end;

  {Вывод элементов второго массива и суммы его элементов}

  Writeln('Второй  массив: ','Количство элементов ',Ind1-1);

  For i:=1 to ind1-1 do Write(B[i]:0:3,' '); Writeln;

  Writeln('S1 = ',S1:0:3,' ');

  {Вывод элементов второго массива и суммы его элементов}

  Writeln('Третий  массив; ','Количство элементов ',Ind2-1);

  For i:=1 to ind2-1 do Write(C[i]:0:3,' '); Writeln;

  Writeln('S2 = ',S2:0:3,' ');

  Writeln('Разность между суммами: ', ABS(S1-S2):0:3);

  Readln;

end. 
 

Задача 4

Дана квадратная матрица целых чисел порядка n. Получить последовательность b1, b2, …, bn, где bi – это минимальный элемент, находящийся в начале i-й строки матрицы до элемента, находящегося на главной диагонали включительно.

Блок-схема  алгоритма

 

Текст программы

Program N_4;

const Nmax=100; {Максимальн  допустимый размер исходного  массива}

    {n - размер  исходного массива

     i,j - параметры цикла

     NumI, NumJ - координаты строки и столбца  минимального элемента массива

     A - исходная  матрица

     B - массив из минимальных элементов строк матрицы A

     min - минимальный элемент в каждой  строке матрицы А}

Var n,i,j,NumI,NumJ:Integer;

    A:array[1..Nmax,1..Nmax] of Integer;

    B:array[1..Nmax] of Integer;

    min:Integer;

begin

  {Задание размера исходной матрицы}

  Write('n = '); Readln(n);

  {Матрица заполняется случайными целыми числами из промежутка (-100; 102)}

  Randomize;

  For i:=1 to n do

  begin

    For j:=1 to n do

    begin

      A[i,j]:=100-random(200);

      {Вывод элемента матрицы на экран}

      Write(A[i,j],' ')

    end;

    Writeln;

  end;

  Writeln;

  {Решение основной  задачи}

  For i:=1 to n do

  begin

    {Минимальным значением назначается первый элемент каждой строки}

    Min:=A[i,1]; NumI:=i; NumJ:=1;

    For j:=1 to i do

      {Если текущий элемент окажется меньше, то он становится меньшим}

      if A[i,j]<Min then

      begin

        min:=A[i,j];

        NumI:=I;

        NumJ:=J;

      end;

    {Найденный элемент из матрицы записывается в массив B и выводится на экран}

    B[i]:=A[NumI,NumJ];

    Write(B[I] ' ');

  end;

  Writeln;

  Readln

end. 
 

Задача  5

Дан текстовый  файл с именем NameT, содержащий таблицу из трех столбцов вещественных чисел. Ширина столбцов таблицы и способ их выравнивания являются произвольными. Специальных символов-разделителей таблица не содержит. Создать файлы вещественных чисел с именами Name1, Name2 и Name3, каждый из которых содержит числа из соответствующего столбца таблицы. Вычислить количество чисел, их сумму, среднее значение для каждого столбца.

Блок-схема  алгоритма

Текст программы

Program N_5;

Const Nt='Namet.txt';

      N1='Name1.rl';

      N2='Name2.rl';

      N3='Name3.rl';

Var n,Count1,Count2,Count3,i,j:Integer;

    A,S1,S2,S3,Sr1,Sr2,Sr3:Real;

    NameT:text;

    Name1,Name2,Name3: file of real;

begin

  {Все исходные данные формируются случайным образом}

  Randomize;

  n:=random(1000)+1;

  Assign(NameT,Nt);

  Rewrite(NameT);

  {Формирование файла из трех столбцов}

  For i:=1 to (n div 3) do

  begin

    For j:=1 to 3 do

    begin

      A:=200-random*100;

      Write(NameT,A,' ');

    end;

    Writeln(NameT);

  end;

  {Запись в файл остальных из n чисел, не вошедших в предыдущем сеансе}

  if (n div 3*3)<n then

    For i:=n div 3*3 to n do

    begin

      A:=200-random*100;

      Write(NameT,A,' ');

    end;

  Close(NameT);

  assign(Name1,N1);

  Rewrite(Name1);

  assign(Name2,N2);

  Rewrite(Name2);

  assign(Name3,N3);

  Rewrite(Name3);

  i:=1;

  Count1:=0; Count2:=0; Count3:=0;

  S1:=0; S2:=0; S3:=0;

  Reset(NameT);

  While Not Eof(NameT) do

  begin

    Read(NameT,A);

    case (i mod 3) of

      1: begin

           Write(Name1,A);

           Inc(Count1);

           S1:=S1+A;

           Inc(i);

         end;

      2: begin

           Write(Name2,A);

           Inc(Count2);

           S2:=S2+A;

           Inc(i);

         end;

      0: begin

           Write(Name3,A);

           Inc(Count3);

           S3:=S3+A;

           Inc(i);

         end;

    end;

  end;

  Close(NameT);

  Close(Name1);

  Close(Name2);

  Close(Name3);

  Sr1:=S1/Count1;

  Sr2:=S2/Count2;

  Sr3:=S3/Count3;

  Writeln('1. Count = ',Count1,' ','S = ',S1:0:4,' ','Sr = ',Sr1:0:4);

  Writeln('2. Count = ',Count2,' ','S = ',S2:0:4,' ','Sr = ',Sr2:0:4);

  Writeln('3. Count = ',Count3,' ','S = ',S3:0:4,' ','Sr = ',Sr3:0:4);

  Readln;

end. 
 

Задача  6

Дано четное число  n>2, проверить для этого числа гипотезу Гольдбаха. Эта гипотеза заключается в том, что каждое четное n, большее двух, представляется в виде суммы двух простых чисел. (Определить процедуру, позволяющую распознавать простые числа).

Блок-схема  алгоритма

Текст программы

Program N_6;

var n,a,b:Word; 

{Проверка числа,  простое ли оно. Если простое,  то false, иначе - true}

Function Verify(m:Word):Boolean;

var i:word;

    Rez:Boolean;

begin

{Пропускаем из  проверки все четные, кроме 2}

 if (m=1) or ((m<>2) and not odd(m)) then Rez:=True else

   {Пропускаем 2 и 3 - они простые}

   if (m=2) or (m=3) then Rez:=False else

   begin

     {Проверяем делимость остальных чисел на все натуральные от 2 до половины m}

     For i:=2 to (m div 2) do

     begin

      {Если число m делится на текущее натуральное прекращаем проверку}

      Rez:=m mod i=0;

      if rez then break;

     end;

   end;

Verify:=Rez;

end; 

{Процедура, подбирающая  простые а и b, сумма которых  равна n}

Procedure Goldbah(n:Word);

var i,j:Word;

begin

  For i:=2 to n-1 do

  begin

    a:=i;

    if Not Verify(a) then

    begin

      if Not Verify(n-a) then

      begin

        b:=n-a;

        Writeln(a, ' + ',b,' = ',n);

      end;

    end;

  end;

end; 

begin

  Write('n = '); Readln(n);

  Unil n mod 2=0;

  Goldbah(n);

  Readln

end. 

Задача 7

Вычислить бесконечную  сумму с заданной точностью e (e>0 и может быть 0,1; 0,01; 0,001 и т. д.). Считать, что требуемая точность достигнута, если вычислена сумма нескольких первых слагаемых и очередное слагаемое оказалось по модулю меньше, чем e, - это и все оследующие слагаемые можно не учитывать.

Даны действительные числа x, e (x¹0, e>0) и целые числа k и n. Вычислить сточностью e

.

Некоторые размышления  к задаче:

Очевидно, что если |x|<1, то модуль каждого следующего слагаемого будет ворастать, и задача решена быть не может, т. к. некоторое (возможно, первое) слагаемое будет больше 1, что не соответствует условию задачи. Поэтому значение x по модулю должно быть больше 1.

Блок-схема  алгоритма

Текст программы

Program N_7;

Var Eps, x,S,a,d:Real;

    k,n:Word; 

begin

  Write('Epsilon = '); Readln(Eps);

  Repeat

    Write('x = '); Readln(x);

    if x<=1 then Writeln('Error: x>1');

  until x>1;

  Write('n = '); Readln(n);

  S:=0;

  if n mod 2<>0

  then a:=-5/Exp(4*ln(x))

  else a:=5/Exp(4*ln(x));

  k:=2;

  d:=(4*k+5)*(2*k-1)/Exp(4*ln(x))/(2*k+1)/(4*k+1);

  while Abs(a*d)>=Eps do

  begin

    S:=S+a;

    a:=a*d;

    k:=k+1;

    d:=(4*k+5)*(2*k-1)/Exp(4*ln(x))/(2*k+1)/(4*k+1);

  end;

  Writeln('S = ',S:0:7);

  Readln;

end. 
 
 

 

Контрольная работа по «Программирование на языках высокого уровня»