неділя, 5 травня 2019 р.

Складені алгоритми з практичним змістом



https://inf8klas.blogspot.com/2018/03/a-pascal.html



Задача 1. Козак Вус подарував вам набiр з n цифр (тобто чисел вiд 0 до 9 включно). I хоче дiзнатися у вас: яку максимальну кiлькiсть чисел з них можна скласти так, щоб кожне з них дiлилося на 3 та кожна цифра з набору була використана не бiльше 1 разу. Щоб скласти число, вам потрiбно вибрати будь-які цифри з набору, вибрати їхнiй порядок та скласти число з цих цифр. Звернiть увагу, що ви не зобов’язанi використати всi цифри. Ви ж не можете вiдмовити Вусу? :)
Маленька пiдказка вiд Математичної Сови:
Остача (залишок) вiд дiлення x на число 3 дорiвнює остачi вiд дiлення суми цифр числа x на число 3.
Число a є кратним числу b (тобто a дiлиться на b) лише, якщо остача вiд дiлення числа a на число b дорiвнює 0.
Технічні умови Програма Newnumbers читає з пристрою стандартного введення у першому рядку мiстить одне цiле число n (1  n5 · 105) — кiлькiсть цифр. У другому рядку записано n цiлих чисел, кожне з яких має значення вiд 0 до 9 включно. Програма виводить на пристрій стандартного виведення одне ціле число — максимальну кількість чисел кратних 3, що можна скласти з цього набору.
Приклади
Введення
Виведення
1
0
1
14
8 8 4 8 1 1 0 0 2 1 9 3 4 1
8
Зауваження до прикладів
У першому прикладі ми можемо скласти лише одне число 0.
У другому прикладі з цього набору ми можемо скласти максимум 8 чисел. Один iз можливих способів — це скласти такі числа: 0, 0, 48, 9, 3, 21, 81, 84. Невикористаними у нас залишаться цифри 1, 1.


Задача 2. Дано набiр з цифр вiд 0 до 9 включно. Потрібно дiзнатися, яку максимальну кiлькiсть чисел з них можна скласти так, щоб кожне з них дiлилося на 3 та кожна цифра з набору була використана не бiльше 1 разу. Щоб скласти число, вам потрiбно вибрати будь-які цифри з набору, вибрати їх порядок та скласти число з цих цифр. Звернiть увагу, що ви не зобов’язані використати всi цифри.

Математична підказка:
·         Остача (залишок) вiд дiлення x на число 3 дорiвнює остачi вiд дiлення суми цифр числа x на число 3.
·         Число a є кратним числу b (тобто a дiлиться на b) лише, якщо остача вiд дiлення числа a на число b дорiвнює 0.
Технічні умови. Програма  читає з пристрою стандартного введення у першому рядку одне цiле число (1  n5 · 105) — кiлькiсть цифр. У другому рядку записано цiлих чисел, кожне з яких має значення вiд 0 до 9 включно. Програма виводить на пристрій стандартного виведення одне цiле число — максимальну кiлькiсть чисел кратних 3, що можна скласти з цього набору.
Приклади
Введення
Виведення
1
0
1
14
8 8 4 8 1 1 0 0 2 1 9 3 4 1
8
Зауваження до прикладів
У першому прикладi ми можемо скласти лише одне число 0.
У другому прикладi з цього набору ми можемо скласти максимум 8 чисел. Один iз можливих способiв — це скласти наступнi числа: 0, 0, 48, 9, 3, 21, 81, 84. Невикористаними у нас залишаться цифри 1, 1.



Математична модель до завдання:
Максимальна кількість чисел обчислюється за формулою
n =p(0=mod3)+min(k(1=mod3); m(2=mod3))+(1/3)*(max(k(1=mod3); m(2=mod3) -min(k(1=mod3); m(2=mod3))
де p(0=mod3) - це кількість цифр, що кратні 3.;
k(1=mod3) -це кількість цифр, що мають вигляд 3х+1;
m(2=mod3)) - це кількість цифр, що мають вигляд 3х+2;
Кодування алгоритму на СІ++
#include <iostream>
#include <cmath>
using namespace std;

int main(){
long long kol, tsifra, ost;
cin >> kol;
long long n = 0, L = 0, m = 0;
for (long long i = 0; i < kol; i++){
cin >> tsifra;
ost = tsifra % 3;
if (ost == 0)
n = n + 1;
else if (ost == 1)
L = L + 1;
else
m = m + 1;
}

long long rez = n + min(L, m) + (max(L, m) - min(L,m))/3;
cout << rez;
}

                Кодування алгоритму на мові Рython
var k,l,o,m,n,i,min,max,rez:longint;
begin
  readln(n);
  k:=0; l:=0; m:=0;
  for i:=to do
    begin
       read(o);
       o:=(o mod 3);
       case of
         0:k:=k+1;
         1:l:=l+1;
         2:m:=m+1;
       end;  
    end;
  if l>m then begin max:=l; min:=m; end
         else begin max:=m; min:=l; end;
  rez:=k+min+((max-min) div 3);
  write(rez);      
endA.




 Кодування алгоритму на мові Pascal
var k,l,o,m,n,i,min,max,rez:longint;
begin
  readln(n);
  k:=0; l:=0; m:=0;
  for i:=to do
    begin
       read(o);
       o:=(o mod 3);
       case of
         0:k:=k+1;
         1:l:=l+1;
         2:m:=m+1;
       end;  
    end;
  if l>m then begin max:=l; min:=m; end
         else begin max:=m; min:=l; end;
  rez:=k+min+((max-min) div 3);
  write(rez);      
end.

Кодування на мові Pascal генератора  перевірочних тестів(текстових файлів з даними) до алгоритму:
var f:text;
    n,p,i,k,l,m,min,max,a,o,rez,c:longint;
    pp:boolean;
begin
  read(n);
  read(p);
  assign(f,'figures.test.20');
  rewrite(f);
  writeln(f,n);
  for i:=to do
  begin
   pp:=true;
   case of
    1:begin while pp do begin a:=random(10); c:=(a mod 3); if c=then pp:=falseendend;
    2:begin while pp do begin a:=random(10); c:=(a mod 3); if c=then pp:=falseendend;
    3:begin while pp do begin a:=random(10); c:=(a mod 3); if c=then pp:=falseendend;
    4:begin while pp do begin a:=random(10); c:=(a mod 3); if ((c=0or (c=1)) then pp:=falseendend;
    5:begin while pp do begin a:=random(10); c:=(a mod 3); if ((c=0or (c=2)) then pp:=falseendend;
    6:begin while pp do begin a:=random(10); c:=(a mod 3); if ((c=2or (c=1)) then pp:=falseendend;
    7:a:=random(10);
   end;
   write(f,a,' ');
   o:=(a mod 3);
    case of
      0:k:=k+1;
      1:l:=l+1;
      2:m:=m+1;
     end;
   if l>m then begin max:=l; min:=m; end else begin max:=m; min:=l; end;
  end;
  rez:=k+min+((max-min) div 3);
  writeln(f,'');
  write(f,rez);
  close(f);
  write(rez);
end

Тести для перевірки алгоритму:
Тест 1.
Ввід    4
            5 5 8 8
Вивід  1

Тест 2.
Ввід     8
             5 5 7 8 8 5 8 4
Вивід   3

Тест 3.
Ввід     16
              5 5 7 8 6 8 5 8 4 6 6 3 4 2 8 0
Вивід   9

Тест 4.
Ввід      32
               5 5 7 8 8 5 8 4 4 2 8 2 4 7 8 5 4 5 8 8 7 1 8 8 4 7 8 4 5 7 1 7



Вивід    15

Практична робота 1
Складені алгоритми 
з практичним змістом
Завдання 1. На вокзалі з потягу зійшли два пасажира і направились одночасно в один і той же пункт А. Перший пасажир половину часу йшов зі швидкістю v1 м/год, а другу половину часу йшов зі швидкістю v2 м/год. Другий пасажир йшов першу половину шляху зі швидкістю v2 м/год, а другу половину шляху зі швидкістю v1 м/год. Допоможіть слідчому, дізнатися, яку відстань долали пасажири від виходу із потяга до пункту призначення і хто першим прибуває в пункт А.  Скласти і реалізувати алгоритм  для вияснення, хто першим прибуває у пункт призначення і на скільки раніше, ніж інший, якщо відомо, що перший пасажир витрачає на весь свій шлях t хвилин?
program  TOURIST_1;                                                                                                {назва    алгоритму}
var  v1,v2,t1,t2, s1 : real;                       {оголошення  змінних величин: v1,v2,t1,t2, s1,s2 – це дійсні числа}
begin                                                                                                              { початок  виконання  алгоритму}
  writeln( 'v1='); readln(v1); writeln( 'v2='); readln(v2);  writeln( 't1='); readln(t1);      
   s1:=(v1+v2)*t1*0.5;                                                 {обчислення за фор-лою відстані від потяга до пункту}
writeln('Довжина шляху пасажирів', s1, '  метрів ');                                             { виведення результату}
t2:=(v1+v2)* (v1+v2)*t1*0.25/( v1*v2);                          {обчислення за фор-лою  часу другого пасажира}
writeln('Час руху другого пасажира: ',t2, '  хвилин ');                                              { виведення результату}
  if  t2 –t1=0 then writeln('У пункт  А  пасажири прибувають одночасно');   
if  t2 –t1>0 then writeln('У пункт  А раніше прибуває перший пасажир на: ', t2 –t1, '  хвилин. ');    end.                                                                                    
Протестуйте алгоритм для  таких значень  {v1; v2; t1}: а)(90; 80; 30)=0,1 хв; б) (85; 85; 40)=0 хв; в)(60; 80; 20)=0,42 хвилини.
Завдання 2. Якщо через рівні проміжки часу на депозитну картку вноситься деяка постійна сума К грн(періодичні внески) під складні відсотки Р% , то заощадження обчислюється за формулою
S=K*(1+p/100)*(exp(ln(1+p/100)*n)-1)/( (1+p/100)-1).
Скласти і реалізувати алгоритм  для вияснення cум грошей на депозитній картці через декілька років.
program BABLO_2;                     {назва    алгоритму}
var  k,p,r, s : real;      n, i: integer;  {оголошення  змінних величин: k,p,r,n, s – це дійсні числа}
begin                                                                                      { початок  виконання  алгоритму}
k:=1000+random(100);  writeln( ' Якщо сума, що вноситься на депозит k=', k); writeln;
p:=7+random(10);  writeln( ' Якщо відсоткова ставка для цього депозиту р=', p); writeln;
n:=1+random(10);  writeln( ' Якщо кількість років існування депозиту n=', n); writeln;
s:=1+p/100;   u:=1;                                 {обчислення початкового відсотку для виконання  алгоритму}
for i:=1 to n do begin                   {виконання циклу з лічильником по рокам для обчислення грошей}
u:=u*(1+p/100);    s:=1+p/100;    s:= K*s*(u-1)/(s-1); 
writeln( 'Кількість грошей на депозиті через', i, ' років S=', s); writeln; end; writeln('********'); end.
Протестуйте алгоритм декілька разів і порівняйте результати. Самостійно змініть діапазон вибору випадкових чисел в алгоритмі.
Завдання 3. Якщо протягом n років  на  депозитну картку  з сумою К грн нараховується m разів щорічно деякий постійний складний відсоток Р% , то заощадження обчислюється за формулою
S=K* exp(ln (1+p/(100*m))*n*m)
Скласти і реалізувати алгоритм  для вияснення cум грошей на депозитній картці через декілька років.
program BABLO_3;                                                                              {назва    алгоритму}
var  k,s : real;      u,m,n, i: integer;                          {оголошення  змінних величин  дійсні числа та цілі числа}
begin                                                              { початок  виконання  алгоритму і введення випадкових значень}
k:=1000+random(1000);  writeln( ' Якщо початкова сума на депозиті k=', k); writeln;
p:=7+random(10);  writeln( ' Якщо відсоткова ставка для цього депозиту р=', p); writeln;
n:=1+random(5);  writeln( ' Якщо кількість років існування депозиту n=', n); writeln;
m:=1+random(12);  writeln( ' Якщо кількість  нарахувань на депозит за рік m=', m); writeln;
s:=k; u:=n*m;                                                    {обчислення чисел для виконання  циклу в алгоритмі}
for i:=1  to  u  do  begin        {виконання циклу з лічильником по  нарахуванням для обчислення грошей}
s:= K*exp(ln(1+p/(100*i)))*i*i;
writeln( 'Кількість грошей на депозиті  після', i, ' –го нарахування S=', s); writeln; end; writeln('*****');   end.
Протестуйте алгоритм декілька разів і порівняйте результати. Самостійно змініть діапазон вибору випадкових чисел в алгоритмі.

Практична робота 2.   
«Алгоритми властивостей цілих чисел
 мовою Pascal»

Завдання 1. Скласти і реалізувати алгоритм  для знаходження   кількості цифр, суми цифр натурального числа, подільності на цифри, якщо ціле число задане випадковим чином.
program SummaNumer;                     {назва    алгоритму підрахунку суми цифр цілого числа}
var  m, n, i, m1, k, s: integer;                {оголошення  змінних величин: цілі числа}
begin                            {початок   виконання алгоритму і введення випадкових натуральних чисел}
m:=(10+random(5))*(20+random(7)) *(random(20)) + 1+random(3) ;   
writeln( ' Якщо натуральне число  m=', m); writeln;  m1:=m; k:=0; s:=0; n:=0;
repeat    n:=m mod 10; k:=k+1; s:=s+n;  m:=m div 10;   until m=0; 
     {виконання циклу з  післяумовою  для обчислення}
writeln('Сума цифр числа ', m1,   ' дорівнює числу: ', s); writeln;
writeln('Кількість цифр числа ', m1,   ' дорівнює числу: ', n); writeln;
if (m1 mod 2) =0 then writeln(m1,   ' - це парне число ');  writeln;
if (m1 mod 2) =1 then  writeln(m1,   ' - це непарне число ');  writeln;
if (s mod 3) =0 then writeln(m1,   ' - це число має вигляд 3k, ділиться на 3 націло');  writeln;
if (s mod 3) =1 then writeln(m1,   ' - це число  має вигляд 3k+1');  writeln;
if (s mod 3) =2 then writeln(m1,   ' - це число  має вигляд 3k+2');  writeln; m:= m1 mod 100;
if (m mod 4) =0 then writeln(m1,   ' - це число  має вигляд 4k, ділиться на 4 націло');  writeln;
if (m mod 4) =1 then writeln(m1,   ' - це число  має вигляд 4k+1');  writeln;
if (m mod 4) =2 then writeln(m1,   ' - це число  має вигляд 4k+2');  writeln;
if (m mod 4) =3 then writeln(m1,   ' - це число  має вигляд 4k+3');  writeln; m:= m1 mod 10;
if (m mod 5) =0 then writeln(m1,   ' - це число  має вигляд 5k, ділиться на 5 націло');  writeln;
if ( (s mod 3) =0)  and ((m mod 2)=0) then writeln(m1,   ' - це число  має вигляд 6k, ділиться на 6 націло');  writeln;
if (m mod 7) =0 then writeln(m1,   ' - це число  має вигляд 7k, ділиться на 7 націло');  writeln;
m:=m1; m:= m mod 1000;
if (m mod 8) =0 then writeln(m1,   ' - це число  має вигляд 8k, ділиться на 8 націло');  writeln;
if (s mod 9) =0 then writeln(m1,   ' - це число має вигляд 9k, ділиться на 9 націло');  writeln;
if (m mod 10) =0 then writeln(m1,   ' - це число має вигляд 10k, ділиться на 10 націло');  writeln;
end.   {закінчення алгоритму}
Протестуйте алгоритм  чотири рази та перевірте правильність результатів.
Завдання 2. Скласти і реалізувати алгоритм  знаходження   кількості першої цифри  від початку у цілому числа, що задане випадковим чином.
Program Cifr1;                                                     {оголошення  назви алгоритму}
var n, x,c,c1,k: integer;                                          {оголошення  змінних величин: цілі числа}
begin
    n:=(10+random(5)) *(20+random(7)) *(random(20)) + 1+random(3);     {випадкове число}
writeln( ' Якщо натуральне число  n=', n); writeln;            {виведення на екран випадкового числа}
x:=n;     while n>9 do      n:=n div 10;    c1:=n;    k:=0;                   {цикл з передумовою}
repeat
       c:= x mod 10;       if c=c1 then k:=k+1;      x:=x div 10;   until x=0;  {цикл з післяумовю}
writeln(' Кількість першої цифри дорівнює:   '
, k);  end.
Протестуйте алгоритм  чотири рази та перевірте правильність результатів.
Завдання 3. Скласти і реалізувати алгоритм  знаходження   кількості другої від початку цифри у цілому числа, що задане випадковим чином.
Program Cifr2;                                                                                            {оголошення  назви алгоритму}
var n, x,c,c1,k: integer;                                                           {оголошення  змінних величин: цілі числа}
begin
    n:=(10+random(5)) *(20+random(7)) *(random(20)) + 1+random(3);          {випадкове число}
writeln( ' Якщо натуральне число  n=', n); writeln;            {виведення на екран випадкового числа}
x:=n;     while n>100  do  n:=n div 10; c1:=n div 10;                                              {цикл з передумовою}
writeln('n=', n); end;  c1:=n mod 10; writeln('c1=',c1); writeln('n=',n);     k:=0;                 
repeat       c:= x mod 10;   if c=c1 then k:=k+1;   x:=x div 10;   until x=0;            {цикл з післяумовoю}
writeln('Кількість другої цифри дорівнює:'
, k);  end.
Протестуйте алгоритм  чотири рази та перевірте правильність результатів.

Практична робота 3 
 «Алгоритми табуляції  перестановок на мові Pascal»

Завдання 1. Скласти і реалізувати алгоритм  для    табулювання значень  перестановок натуральних чисел. Наприклад:  Перестановки для трьох чисел:  123   132   213   231   321  312(усього шість).

Program Perestanovka1;                               { оголошення назви алгоритму }
const n=5;                                                  { оголошення  константи, кількість чисел в  перестановці }
var a: array [1..n] of integer;                       { оголошення масиву цілих чисел  для запису  перестановок }
      index: integer;                                                { оголошення  цілої змінної для кодування чисел в перестановках}

procedure generate (l, r: integer);                 { оголошення підпрограми генератора перестановок }
var i, v: integer;                                           { оголошення змінних цілих чисел  для  алгоритму }
begin
      if (l = r) then begin                                                { оголошення перевірки рівності двох індексів }
        for i:=1 to n do write (a [i], '');        { оголошення циклу з лічильником  для виведення  перестановок }
        writeln;
      end    else    begin                                  
        for i:=l to r do begin                          { оголошення циклу з лічильником  для генерації  перестановок }
           v:=a[l]; a[l]:=a[i]; a[i]:=v;                      {Обмін a[i], a[j]}
           generate (l + 1, r);                         {Виклик нової генерації перестановок - це рекурсія в алгоритмі}
           v:=a[l]; a[l]:=a[i]; a[i]:=v;                    {Обмін a [i], a [j]}
        end;        end;    end; 
begin
      for  index:=1  to  N  do  a[index]:=index;    { цикл  з лічильником  для генерації  перестановок }
      generate(1, n);     end.                                          {оголошення процедури  для генерації  перестановок }
Протестуйте алгоритм  чотири рази  тобто треба  змінити число табуляції: 1)соnst=3; 2) соnst=4;  3) соnst=6.


Практична робота 4
 «Алгоритми інтерполяції квадратними поліномами
 трьох точкової статистики на мові Pascal»

Завдання 1. Створити алгоритм який за трьома відомими точками в прямокутній  системі координат генерує формулу квадратичної функції використовуючи розв’язання  системи 3-х рівнянь з трьома невідомими методом Крамера. Ця задача називається «інтерполяція квадратичними поліномами» або знаходження «квадратичного тренду».
Розв’язання.  Випадковим чином задаються три точки деякої статистики:  (х1; у1), (х2; у2), (х3; у3). Вважається, що ці три точки належать деякій параболі,  що записується  формулою вигляду: у=ах2+bx+c.  Підставляємо кожну точку у формулу і отримуємо систему трьох рівнянь з трьома невідомими а, b, c. 
{| aх1*х1 + bх1 + c * 1 = y1 | }
{| aх2*х2 + bх2 + c * 1 = y2 }
{| aх3*х3 + bх3 + c * 1 = y1 }
Розв’язуємо систему відносно  а, b, c  за допомогою метода визначників (метод Крамера).
Program  Interpoljacia;
var a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3, x, y, z, e, ex, ey, ez, x1, x2, x3, y1, y2, y3: real;
begin
x1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 2+random(3) ;   
writeln( ' Якщо перша точка, що належить квадратичній функції х1=', x1, 'y1=', y1); writeln;
x2:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y2:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 3+random(3) ;   
writeln( ' Якщо друга точка, що належить квадратичній функції х2=', x2, 'y2=', y2); writeln;
x3:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y3:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 4+random(3) ;   
writeln( ' Якщо третя точка, що належить квадратичній функції х3=', x3, 'y3=', y3); writeln;
a1:= x1*x1;    a2:= x2*x2;  a3:= x3*x3;   b1:= x1;    b2:= x2;  b3:= x3;  c1:=1;    c2:=1;  c3:=1;
d1:=y1;   d2:=y2;  d3:=y3;
 e:= (a1 * b2 * c3 + b1 * c2 * a3 + c1 * a2 * b3-a3 * b2 * c1-b3 * c2 * a1-c3 * a2 * b1);
 ex:=(d1 * b2 * c3 + b1 * c2 * d3 + c1 * d2 * b3-d3 * b2 * c1-b3 * c2 * d1-c3 * d2 * b1);
 ey:=(a1 * d2 * c3 + d1 * c2 * a3 + c1 * a2 * d3-a3 * d2 * c1-d3 * c2 * a1-c3 * a2 * d1);
 ez:=(a1 * b2 * d3 + b1 * d2 * a3 + d1 * a2 * b3-a3 * b2 * d1-b3 * d2 * a1-d3 * a2 * b1);
 if (e=0) and ((ex=0) or (ey=0) or (ez=0)) then
    writeln ( 'безліч рішень')
 else if (e <> 0) and ((ex = 0) or (ey = 0) or (ez = 0)) then
    writeln ( 'немає рішень')
 else begin
    x:=ex/e;     y:=ey/e;     z:=ez/e;
writeln ( 'Головний визначник е =', e);writeln ( 'a =', x); writeln ( 'b =', y); writeln ( 'c =', z);
writeln( ' Шукана квадратична функція  у=', x,  '*x*x+( ' ,  y,  ' )x+( ',  z,  ' ) ');  end; end.



Практична робота 5
Алгоритми з масивами

Задача 1. Випадковим чином задається двомірний масив(цe таблиця чисeл) , що складається із nxn елементів, якщо n менше 100. Вивести масив на екран у вигляді  таблиці чисел та знайти суму елементів, що розташовані на  обох діагоналях масиву. Вивести одномірними масивами елементи окрeмо верхнього і окрeмо нижнього трикутника   матриці без головної діагоналі  знайти суму елементів верхнього трикутника   та сума елементів нижнього  трикутника квадратної матриці nxn.
Розвязання.
Program Summa_trukutnuk_matriza;
const m=100;  n=100;
var  sum,f,s,  d, c:real;    b:array[1..m*n] of real;
 xn:array[1..m*n] of real;     xv:array[1..m*n] of real;      a:array[1..m,1..n] of real;
i,j,p, g, k:integer;
begin
writeln('  Ввeдіть кількість рядків квадратного масиву,  яка мeншe 100 ');
readln(k);    s:=0;
for i:=1 to k do
for j:=1 to k do  begin
a[i,j]:=int(random*20-10);
b[(i-1)*k+j]:=a[i,j];   end;  writeln('   ');
writeln(' Масив випадкових чисeл: ');  writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do  begin      write('  a[',i,';',j,']:= ',a[i,j]  {'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end; writeln('   '); end;
s:=0;   for i:=1 to k do  begin   s:=s+a[i,i];  end;
f:=0;  for i:=1 to k do  begin  f:=f+a[i,k+1-i]; end;
     if   k mod 2 =1 then   sum:=s+f- a[k div 2 +1, k div 2 +1]   else   sum:=s+f;
p:=1;  g:=1;    for i:=1  to k do   begin
for j:=k  downto 1 do  begin
  if   i<j  then  begin
  xv[g]:= a[i,j];  g:=g+1; end;  end; end;
  for i:=1  to k do   begin
  for j:=1  to i-1 do  begin
  if   i>j  then  begin
  xn[p]:= a[i,j];   p:= p+1; end; end;  end;
writeln(' Масив   чисeл нижнього трикутника матриці : ');
          d:=0;  for i:=1  to   ((k-1)*k) div 2     do     begin    d:=d+ xn[i];
write('  xn[',i,']= ', xn[i]); end; writeln('   ');
writeln(' Масив   чисeл вeрхнього трикутника матриці :  ');
           c:=0;  for i:=1  to ((k-1)*k) div 2    do   begin
c:=c+ xv[i];  write('  xv[', i, ']= ', xv[i]);   end;    writeln('   ');
writeln('  Сума чисел головної діагоналі матриці:', s); writeln('    ');
writeln('  Сума  чисел  бічної  діагоналі матриці :', f); writeln('    ');
writeln('  Сума чисел на обох діагоналях: ', sum);   writeln('    ');
writeln('  Сума чисел верхнього трикутника матриці ' , c);  writeln('    ');
writeln('  Сума чисел нижнього трикутника матриці  ' ,  d);    writeln('    ');       end.

Практична робота 6
Алгоритми розв′язування 
систем лінійних рівнянь

Б. Метод Крамера.
Розв′язування систем лінійних рівнянь з двома невідомими (х; у).
|a1*x + b1*y = c1         
|a2*x+b2*y=c1 
Метод визначників:                                                           
     |c1 b1|           |a1 c1| 
     |c2 b2|           |a2 c2| 
 x = ---------     y = ---------                                               
      |a1 b1|           |a1 b1|                                            
      |a2 b2|           |a2 b2|                                           
Обчислюємо визначники квадратних матриць 2х2:                                   
x = (c1*b2-c2*b1)/(a1*b2-a2*b1)                                          
y = (a1*c2-a2*c1)/(a1*b2-a2*b1)  

Алгоритм  Крамера мовою Pascal:

Program KRAMER;
var a1,a2,b1,b2,c1,c2,x,y,d,dx,dy:real;
begin
   writeln('введіть коефіциєнти двох рівнянь: a1,b1,c1,a2,b2,c2');
   readln(a1,b1,c1,a2,b2,c2);
   d  := (a1*b2-a2*b1);
   dx := (c1*b2-c2*b1);
   dy := (a1*c2-a2*c1);
   if ( d=0 ) and ( (dx=0) or (dy=0) ) then
      writeln('Безліч розв′язків у системи')
   else if ( d<>0 ) and ( (dx=0) or (dy=0) ) then
      writeln(' Немає розв′язків у системи')
   else begin writeln('Єдиний розв′язок у системи');
      x:=dx/d; y:=dy/d;
      writeln('x = ', x);  writeln('y = ', y);
   end;
end.




Практична робота 7
  Вкладені цикли мовою Paѕcal

Приклад № 1. Обчислити значення змінної  y=3k+ n при всіх значеннях змінних N=1, 2, 3, 4  і K=3, 8, 13, 18, 23.
Розв′язання.
Якщо перебирати всі значення N і K, ми повинні отримати 4*5=20 значень змінної y =f(n, k)= 3k + n.
Скласти програму можна в такий спосіб: для кожного значення N перебрати всі значення К від 3 до 23 з кроком  5, тобто N використати як параметр зовнішнього циклу, К - як параметр внутрішнього циклу.
Текст програми:
Program priklad_1;
var n, k, y:integer;
begin
for n:=1 to 3 do   begin k:=2;
while k<=23 do   begin y:=3*k+n;
writeln('  n=  ', n:3, '  k=  ',  k:3, ' 3k + n =  ' , y:3);
k:=k+5; end;  end; end.
Параметр N змінюється з кроком 1, тому зовнішній цикл організований з використанням оператора For; параметр К змінюється з кроком 5, тому внутрішній цикл є циклом While.

Приклад № 2. Старовинна задача. Скільки можна купити биків, корів та телят, якщо вартість одного бика - 10 тис. грн, однієї корови - 5  тис. грн, а за одного теля платять 0,5 тис. грн. І якщо на 100 тис. рублів потрібно купити 100 голів скоту.
Розв'язування:
Позначимо через b - кількість биків; k - кількість корів; t - кількість телят. Після цього можна записати два рівняння:
10b + 5k + 0.5t = 100       і          b + k + t = 100
На 100 рублів можна купити:  1) не більше 10 биків, тобто 0<=b<=10;  2)  не більше 20 корів, тобто 0<=k<=20;
2) не більше 200 телят, тобто 0<=t<=200. Отже отримуємо текст програми:
Program Priklad_2;
var b, k, t:integer;
begin
for b:=0 to 10 do
for k:=0 to 20 do
for t:=0 to 200 do
if (10*b + 5*k + 0.5*t = 100) and (b + k + t = 100)  then
writeln('Биків - ', b, ';  корів - ', k,';   телят - ',t);
end.

Завдання для самостійної роботи.
1.1.  Обчислити значення змінної  y=5k-4n при всіх значеннях змінних N=1, 2, 3, 4  і K=2, 8, 14, 20, 26.
1.2. Скільки може бабуся купити на пенсію 1280 грн  індюків , курей та  гусей, якщо вартість одного індюка - 75 грн, однієї курки - 55 грн, а за одного гуся платять 65 гривень. І якщо  їй  потрібно купити лишe 20 голів.
1.3.   Обчислити значення змінної  y=7k-3n при всіх значеннях змінних N=1, 2, 3, 4  і K=1, 8, 15, 22, 29.
1.4. Скільки може дідусь купити на пенсію 1580 грн  індюків , курей та  гусей, якщо вартість одного індюка - 75 грн, однієї курки - 55 грн, а за одного гуся платять 65 гривень. І якщо  їй  потрібно купити лишe 20 голів.
1.5.    Розв′язати рівняння:  а)58=5k-4n;   б) 76=5(k+3)2-4(n-5)3 ;  в) 1=  5/(k+3) -  4/(n-5)3            при значеннях змінних 1 <N<20  і 1<K<20.



Завдання 
для самостійного опрацювання
Програмування лінійних алгоритмів на Pascal
Записати програму мовою Pascal та протестувати її на правильність.
Завдання 1.0 Дано відстань L в сантиметрах. Використовуючи операцію ділення без остачі, знайти кількість повних метрів в нім (1 метр = 100 см).
Завдання 1.1. Дано тризначне число. Вивести спочатку його останню цифру (одиниці), а потім - його середню цифру (десятки).
Завдання 1.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість повних годин, що пройшло з початку доби.
Завдання 2.0 Дано маса M в кілограмах. Використовуючи операцію ділення без остачі знайти кількість повних тонн в ній (1 тонна = 1000 кг).
Завдання 2.1. Дано тризначне число. Знайти суму і добуток його цифр.
Завдання 2.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість секунд, що пройшли з початку останньої хвилини.
Завдання 3.0 Даний розмір файлу в байтах. Використовуючи операцію ділення без остачі знайти кількість повних кілобайт, які займає даний файл (1 кілобайт = 1024 байти).
Завдання 3.1. Дано тризначне число. У нім закреслили першу зліва цифру  приписали її справа. Вивести отримане число.
Завдання 3.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість секунд, що пройшли з початку останньої години.
 Завдання 4.0 Дані цілі позитивні числа A і B (A > B). На відрізку довжини A розміщена максимально можлива кількість відрізків довжини В (без накладень). Використовуючи операцію ділення без остачі, знайти кількість відрізків B, розміщених на відрізку A.
Завдання 4.1. Дано тризначне число. Вивести число, отримане при прочитанні початкового числа справа наліво.
Завдання 4.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість повних хвилин, що пройшли з початку останньої години.
Завдання 5.0 Дані цілі позитивні числа A і B (A > B). На відрізку довжини  розміщена максимально можлива кількість відрізків довжини B (без накладень). Використовуючи операцію узяття залишку від ділення без остачі, найти довжину незайнятої частини відрізку A.
Завдання 5.1. Дано тризначне число. У нім закреслили першу справа цифру і приписали її зліва. Вивести отримане число.
Завдання 5.2. Дні тижня пронумеровані таким чином: 0 – нeділя, 1 - понеділок, 2 - вівторок . . ., 6 - субота. Дано ціле число K, що в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було понеділком.
Integer6. Дано двозначне число. Вивести спочатку його ліву цифру (десятки), а потім - його праву цифру (одиниці). Для знаходження десятко використовувати операцію ділення без остачі, для знаходження одиниць - операцію узяття залишку від ділення.
Integer15. Дано тризначне число. Вивести число, отримане при перестановці цифр сотень і десятків початкового числа (наприклад, 123 перейде  213).
Integer25. Дні тижня пронумеровані таким чином: 0 - воскресіння 1 - понеділок, 2 - вівторок . . ., 6 - субота. Дано ціле число K лежаче в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було четвергом.
Integer7. Дано двозначне число. Знайти суму і добуток його цифр.
Integer16. Дано тризначне число. Вивести число, отримане при перестановці цифр десятків і одиниць початкового числа (наприклад, 123 перейде в 132).
Integer26. Дні тижня пронумеровані таким чином: 1 - понеділок, 2 - вівторок . . ., 6 - субота, 7 - воскресіння. Дано ціле число K лежаче в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було вівторком.
Integer8. Дано двозначне число. Вивести число, отримане при перестановці цифр початкового числа.
Integer18. Дано ціле число, більше 999. Використовуючи одну операцію ділення без остачі і одну операцію узяття залишку від ділення, знайти цифру відповідну розряду тисяч в записі цього числа.
Integer27. Дні тижня пронумеровані таким чином: 1 - понеділок, 2 - вівторок . . ., 6 - субота, 7 - воскресіння. Дано ціле число K лежаче в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було суботою.
Integer9. Дано тризначне число. Використовуючи одну операцію ділення без остачі вивести першу цифру даного числа (сотні).
Integer19. З початку доби пройшло N секунд (N - ціле). Знайти кількість повних хвилин, що пройшли з початку доби.
Integer28. Дні тижня пронумеровані таким чином: 1 - понеділок, 2 - вівторок . . ., 6 - субота, 7 - воскресіння. Дано ціле число K лежаче в діапазоні 1-365, і ціле число N, лежаче в діапазоні 1-7. Визначити номер дня тижня для K -го дня року, якщо відомо, що в цьому році 1 січня було в день тижня з номером N.

Завдання  Б  
для самостійного 
створення алгоритмів 
мовою  програмування

Задача Quadrat.
Створіть і реалізуйте алгоритм, який знаходить можливість повного перекриття квадратом зі стороною a см кругу, радіусом r см.
Вхідні дані
Ви вводите з клавіатури два цілих числа 
a і r.
Вихідні дані
Ви виводите на екран:
 «1», якщо можна, «0», якщо не можна.
Приклад вхідних і вихідних даних
Вхід: 4    8
Вихід: 0

Задача Speed.
Пішоход пройшов першу половину шляху зі швидкістю v  км/год. Створіть і реалізуйте алгоритм, який знаходить, з якою швидкістю він повинен рухатись другу половину шляху, щоб його середня швидкість на всьому шляху дорівнювала c км/год.
Вхідні дані
Ви вводите з клавіатури два дійсних числа 
v і c.
Вихідні дані
Ви виводите на екран
величину швидкості на другій половині відрізку.
Приклад вхідних і вихідних даних
Вхід: 5    5
Вихід: 5


Задача Сountmod.
Створіть і реалізуйте алгоритм, який знаходить кількість k-цифрових чисел, які діляться на ціле число m без остачі.
Вхідні дані
Ви вводите з клавіатури два цілих числа 
k і m.
Вихідні дані
Ви виводите на екран
  кількість k-цифрових чисел, що задовольняють умові.
Приклад вхідних і вихідних даних
Вхід:
1    20
Вихід:
0.


Задача Basin.
Кожна з трьох труб незалежно наповнює басейн водою. Якщо працюватимуть перша і друга труби, басейн наповниться за  k години, якщо перша і третя, то за m годин, а якщо друга і третя, то за n годин. Створіть і реалізуйте алгоритм, який знаходить, за який час басейн буде заповнений, якщо працюватиме тільки  одна труба.  
Вхідні дані
Ви вводите з клавіатури три
дійсних числа: k, m, n.
Вихідні дані
Ви виводите на екран
три числа через пропуск: час заповнення 1-ою трубою, час заповнення 2-ою трубою, час заповнення 3-ою трубою.
Приклад вхідних і вихідних даних
Вхід: 2    
2  2
Вихід: 4  4  4
.

Задача  Metro
Пасажир метро спускається вниз по рухомому ескалатору за k секунди, а по
нерухомому – на  m секунд більше. Створіть і реалізуйте алгоритм, який знаходить, за скільки секунд пасажир спуститься вниз, стоячи на  рухомому ескалаторі?
Вхідні дані
Ви вводите з клавіатури два
дійсних числа k, m.
Вихідні дані
Ви виводите на екран
 кількість секунд, за які пасажир спуститься вниз, стоячи на  рухомому ескалаторі?
Приклад вхідних і вихідних даних
Вхід: 2    
2 
Вихід: 4
.

Задача  MinNumer
Створіть і реалізуйте алгоритм, який знаходить cеред k-цифрових натуральних чисел, які діляться на натуральне число m без остачі і мають суму цифр n, знайти  найменше число.
Вхідні дані
Ви вводите з клавіатури три цілих числа
k, m, n.
Вихідні дані
Ви виводите на екран
найменше число.
Приклад вхідних і вихідних даних
Вхід:
1   3  3 
Вихід:
3.

Задача  CountNumer
Створіть і реалізуйте алгоритм, який знаходить кількість усіх k-цифрових чисел, у яких є як цифра m, так і цифра n?
Вхідні дані
Ви вводите з клавіатури три цілих числа
k, m, n.
Вихідні дані
Ви виводите на екран
кількість усіх чисел, що задовольняють умову завдання.
Приклад вхідних і вихідних даних
Вхід:
1   
Вихід: 0
.

Задача  Countfive
Створіть і реалізуйте алгоритм, який знаходить найбільшу кількість  нулів, якими закінчується натуральне число 1*2*3*…* k = k!
Вхідні дані
Ви вводите з клавіатури ціле числа
k.
Вихідні дані
Ви виводите на екран
кількість усіх нулів, що задовольняють умову завдання.
Приклад вхідних і вихідних даних
Вхід: 99 
Вихід: 21
.

Задача  Minimax
Створіть і реалізуйте алгоритм, який знаходить  найменше і найбільше цілочисельні значення величини L=kx-my, якщо 2<=x<=4; 2<=y<=5.
Вхідні дані
Ви вводите з клавіатури два цілих числа
k, m.
Вихідні дані
Ви виводите на екран
кількість усіх нулів, що задовольняють умову завдання.
Приклад вхідних і вихідних даних
Вхід: 5 10 
Вихід: 70
.

Задача  Parabola
Створіть і реалізуйте алгоритм, який знаходить  рівняння параболи: y=ax2+bx+c, яка проходить через  три точки  (k; k), (m; m), (n; n+2), k, m, n – цілі числа. Створіть і реалізуйте алгоритм, який знаходить кількість усіх k-цифрових чисел, у яких є як цифра m, так і цифра n?
Вхідні дані
Ви вводите з клавіатури три цілих числа
k, m, n.
Вихідні дані
Ви виводите на екран
три  коефіцієнти: a, b, c, що задовольняють умову завдання.
Приклад вхідних і вихідних даних
Вхід:
0   1  -1 
Вихід:
1 0 0.



Немає коментарів:

Дописати коментар