середа, 5 листопада 2014 р.

Задачі-зразки. Підготовка до олімпіади з інформатики

Сторінка  для юних програмістів

Програми  на мові  Pascal переходу чисел  в різні системи числення.
Двійкова система числення. Десяткова система числення.

Задача N2_N10. Переведіть  натуральне число із двійкової системи числення в десяткову систему числення, використовуючи мову Pascal.
Технічні умови.  З клавіатури вводяться  числа із двійкової системи числення, використовуючи цілий тип даних longint. На виході  отримуємо це ж число, що записане у десятковій системі числення.
Приклад.  А)Введення:112, виведення:310;Б) Введення:10102, виведення:1010;  В)Введення:11112, виведення:1510; Г) Введення:100002 , виведення:1610. 
Розв’язання.
program n2_n10;
var  n10, n2,  ost, k : longint;
begin
write( Введіть натуральне число в двійковій системі  із цифр  1 та  0,   n2=: ');
 read(n2); k:=1;  n10:=0;  while n2 > 0 do
begin
ost:= n2 mod 10;   if  ost=1 then  n10:= ost*k+n10;
n2:= n2 div 10;   k:= k*2; end;
writeln('  Число в десятковій  системі  має запис  n10 = ', n10);
end.
Задача N10_N2. Переведіть  натуральне число із десяткової  системи числення в двійкову систему числення , використовуючи мову Pascal.
Технічні умови.  З клавіатури вводяться  числа в десятковій системи числення, використовуючи цілий тип даних longint. На виході  отримуємо це ж число, що записане у двійковій системі числення.
Приклад.  А)Введення:310, виведення:112; Б)Введення:1010, виведення:10102
В)Введення:1510, виведення:11112; Г) Введення:1610,  виведення:100002. 
Розв’язання.
program n10_n2;
var a, b, n10, n2,  ost, k : longint;
begin
write( Введіть натуральне число в десятковій  системі  числення  із цифр:  1,2,3,4,5,6,7,8,9,0,  n10=  ');
 read (n10);   k:=1; n2:=0;    while n10 > 0 do
begin
        ost:= n10 mod 2;   n10:= n10 div 2;  n2:= ost*k+n2;
        k:= k*10; 
end;
         writeln('   Число в двійковій  системі числення  має запис  n2 = ',n2);
         end.
Контрольні запитання.
1.    Наведіть синтаксис запису циклів з лічильником мовою Pascal?
2.    Наведіть синтаксис запису циклів з передумовою мовою Pascal?
3.    Наведіть синтаксис запису циклів з післяумовою мовою Pascal?
4.    Як записуються  розгалуження мовою Pascal?
5.    Як записуються  складені логічні  умови у форматі  if then else..;, що об'єднують декілька простих логічних умов?
6.    Наведіть синтаксис оператора одноальтернативного  розгалуження.
7.    До яких типів даних не може належати значення виразу-селектора в операторі вибору?
8.    У чому полягає відмінність між циклами з передумовою та циклами з післяумовою?
9.    Якому типу даних може належати лічильник у циклі  for?
10.   Яке значення має лічильник після завершення циклу  for?
11.   Що може спричинити «зациклення» програми?
12.   За яких умов цикли while та for не виконаються жодного разу?
13.   Коли цикл виконується лише один раз?
14.   У чому полягає відмінність між такими операторами циклів, як  for...to...do  та for...downto...do?
15.   Яка структура працює ефективніше: вкладені оператори іf ...then...else чи серія операторів іf...then? Відповідь обґрунтуйте.
16.   Як можна пропустити деякі оператори програми, що належать тілу циклу, не видаляючи ці оператори?
17.   Як підвищити ефективність роботи вкладених структур if...then...else?
























Класичні алгоритми мовою Pascal
Задача NSK. Знайти НСК 2-х натуральних чисел a, b.
Розв’язання: Нам відомо,  НСД(a,b)×НСК(a,b)=a×b, як знаходити НСД (nsd) за алгоритмом Евкліда ( це усім відома задача). Скористаємось ним для знаходження НСК(a,b)= nsk на підставі такого твердження: якщо НСК(a,b)=a×b:НСД(a,b), тобто nsk=(a div nsd)·b. Спробуйте самостійно вивести дану формулу. А ми приведемо програмну реалізацію розв’язку задачі на мові Pascal, не використовуючи ніяких коментарів, ми вже й так все роз’яснили.
program n_s_k2;
var a, b, a1, b1, nsk : longint;
begin
         write(’ Введіть перше число: ’); readln(a);
         write(’ Введіть друге число: ’); readln(b);
         a1:=a; b1:=b;
         while a1 <> b1 do
                         if a1 > b1 then a1 := a1–b1
                         else b1 := b1–a1;
         nsk := (a div a1)*b;
         writeln(’НСК чисел ’,a,’ та ’,b,’ = ’,nsk);
         readln
end.
Задача NSK-5. Знайти найменше спільне кратне (НСК) 5-ти натуральних чисел.
Тепер ми можемо повернутись до попередньої задачі. Спосіб знаходження НСК для п’яти чисел полягатиме у тому, що ми знайдемо НСК для першого і другого числа, потім знайдемо НСК для знайденого перед цим НСК і третього числа, потім для НСК і четвертого і, нарешті, знайдемо НСК для знайденого на попередньому кроці НСК і п’ятого (останнього!) числа. Спробуйте самостійно реалізувати запропонований спосіб і перевірити, наскільки ваша програма відрізнятиметься від приведеної нижче нами.
program n_s_k5;
var a, b, b1, b2, b3, b4, b5, nsk : longint;
begin
            write('Введiть перше число: '); readln(b1);
            write('Введiть друге число: '); readln(b2);
            write('Введiть трете число: '); readln(b3);
              write('Введiть четверте число: '); readln(b4);
            write('Введiть п''яте число: '); readln(b5);
            a:=b1; b:=b2;
            while a <> b do  if a > b then a := a – b  else b := b - a;  nsk := (b1 div a)*b2;  a:=nsk; b:=b3;
            while a <> b do  if a > b then a := a – b  else b := b - a;  nsk := (nsk div a)*b3;   a:=nsk; b:=b4;
            while a <> b do   if a > b then a := a – b  else b := b - a;  nsk := (nsk div a)*b4; :=b1; b:=b2;   a:=nsk;  b:=b5;
            while a <> b do  if a > b then a := a – b  else b := b - a;  nsk := (nsk div a)*b5;
             writeln('НСК п''яти чисел = ',nsk);
            readln;   end.
Погодьтесь, що навіть читати текст програми, у якій чотири рази використовується один і той самий алгоритм, справа не для зовсім нормальних людей. Мабуть саме так мислили ті, хто стояв у витоків програмування, і мабуть, саме тому і було створено механізм процедур і функцій, який дозволяє написати досить великий одноманітний фрагмент програми у вигляді процедури або функції, а потім при необхідності викликати його, або як ще іноді кажуть – звертатись до нього при допомозі одного єдиного слова, яке і є назвою процедури або функції. Втім, перейдемо до справи. Перейдемо спочатку до процедур, адже нам потрібно вияснити різницю між процедурами і функціями, а також потрібно вияснити у якому випадку краще використовувати процедури, а у якому – функції.


program nsk_n_v2;            { Програма знаходження НСК для n чисел }
var a, nsk : longint;             { нам будуть потрібні всього дві змінні: число і НСК}
procedure nsk_2;             { процедура для знаходження НСК двох чисел }
var x, y : longint;                { додаткові змінні, значення яких програма не бачить }
begin                             { початок процедури }
   x := nsk;   y := a;        { зберігаємо вхідні дані }
   while x <> y do                { і працюємо з внутрішніми змінними }
     if x > y then x := x - y    { процедури, використовуючи вже відомий  }
     else y := y - x;                { нам алгоритм Евкліда для НСД }
   nsk := (nsk div x) * a;    { і знаходимо НСК  }
end;                    { кінець процедури }
begin                     { головна програма }
  nsk := 1;              { для першого входження в процедуру nsk_2 }
  a :=  1;                    { для входження в цикл }
  while a <> 0 do  { цикл завершується коли з клавіатури ввели 0 }
  begin                 write('Введіть число: ');
 readln(a);                   {  зчитали число }
    if a<>0 then          { і якщо воно не нуль }
    begin                                     
nsk_2;                      { то знаходимо НСК двох чисел }
       writeln('НСК = ',nsk);     { і виводимо значення на екран }
    end;
  end;        { кінець циклу, коли ввели 0 }
  writeln('Для закінчення нажміть <Enter>');                { повідомлення }
  readln; { чекаємо натиснення <Enter> }
end.    { кінець програми }

Задача Сортування. Запропонований спосіб сортування називають способом обміну.  Програмна реалізація даного способу сортування матиме вигляд:
            Program sort1;
                   const  b : array[1..10] of byte =  (172,165,180,174,182,179,183,185,176,181);
                var  a: array[1..10] of byte;
                       i, j, n : integer;
                   k : byte;
                begin
                    for i:=1 to 10 do a[i]:=b[i];   { Нижче реалізовано алгоритм сортування методом обміну }
                      n:=10;
                   for i:=1 to n-1 do
           begin
                     for j := i+1 to n  do
                            if a[i]<a[j] then
                          begin
                            k := a[j];
                              a[j] := a[i];
                           a[i] := k;
                       end;
                   end;       { Кінець сортування }




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

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