Сайт підготовки до олімпіади з інформатики

програмування в С++

Школа олімпійського резерву з інформатики
31.10.2012 Робота з масивами PDF Печать E-mail
Добавил(а) Гісь Ігор Володимирович   
31.10.12 08:16

1. Масиви

1. Дано масив A[1..15]. Скласти програму заміни всіх його  елементів, що більші 10 на нулі.

2. Дано лінійну таблицю  із  n  дійсних  чисел.  Знайти  суму  S  всіх додатних елементів.

3. В таблиці а[1..100)]всі елементи рівні 2,3,4 або 5. Написати  програму, яка заміняє 2 на 5, 3 на 4, 4 на 3, 5 на 2.

4. Скласти програму підрахунку суми елементів з непарними номерами  масиву A[1..25].

5. Дано  масив  A[1..2N].  Скласти  програму   знаходження   різниці   сум елементів першої та другої половини масиву.

6.  Дано  лінійну  таблицю  із  n  дійсних  чисел.  Замінити  від`ємні елементи їх квадратами.

7. Задано таблиця A[1..N]. Побудувати таблицю  B[1..N],  в  якій  першими розміщені всі від`ємні елементи таблиці A, а потім всі додатні.

8. Із елементів масиву (a1,a2,...,a20) складіть масив B, елементи якого по модулю більші деякого значення С(|a|>c).

9. Дано натуральна таблиця A[1..10]. В таблицю М записати тільки ті числа, остача від ділення яких на 3 рівна 1, а на 5 рівна 2.

10. Провірити, чи є в одномірному числовому масиві  хоча  б  одна  пара сусідніх чисел, які ї протилежними.

11. Заданий одномірний числовий масив. Визначити суму добутків  всіх  пар  сусідніх чисел.

12. Визначити в одномірному числовому масиві число сусідства із двох чисел різного знаку.

13. Для заданого масиву A(N) знайти  суму  всіх  елементів,  не  більших заданого числа N.

14. Дано масив A[1..M]. Скласти програму перестановки місцями елементів з  парними та непарними номерами.

15. Визначити в одномірному числовому масиві суми додатних і  від`ємних елементів.

16. Провірити, чи ї в даному одномірному числовому масиві хоча  б  одна пара чисел, які співпадають по величині.

17. Скласти програму запису в таблицю квадратів чисел від 1 до 100.

18. Даний одномірний  числовий  масив.  Визначити  суму  добутків  всіх трійок сусідніх чисел.

19. Скласти  програму  підрахунку  кількості  мінімальних  елементів  в масиві A[1..N].

20.В одномірному числовому масиві всі від`ємні елементи замініть  нуля ми.

21. Провірити, чи є одномірний числовий масив упорядкованим по зростанню.

22.  Дано  натуральний  масив  A[1..N].Скласти  програму  підрахунку  парних елементів цього масиву.

23. Дано лінійний масив A[1..M].Скласти програму заміни елементів з  непарними номерами на їх квадрати.

24. Скласти програму заміни в прямокутному масиві A[1..k] всіх елементів, що більші від 10 на нулі.

25. Дано нат таб A[1..20]. В таблицю М записати тільки ті числа, остача від ділення яких на 3 рівна 1.

26.  Визначити  в  одномірному  числовому  масиві  число   сусідств   з взаємо-обернених чисел.

27. Заданий одномірний числовий масив. Визначити суму добутків  всіх  пар сусідніх чисел.

29. Даний одномірний  числовий  масив.  Визначити  суму  всіх чисел.

2.Масиви (Серйозні розважалки)

1. Барон Мюнхаузен, вийшовши на екологічно чисте по­лювання, зарядив свою рушницю кісточками вишень. Після того як він вдало влучив поміж роги оленям, в яких влучило відповідно k1,k2,…,kN кісточок, у них на головах виросли чудові молоді вишеньки. Скільки нових саджанців зміг подарувати барон Мюнхаузен садівникам-дослідникам?

2. Мама розвела оранжерею кактусів, деякі з яких були колючі, а інші — ні. Маленька донечка Яринка вирішила, що голки на кактусах — це надто зухвало, і тому старанно поголила їх бритвою. Добре, що у мами залишився записник, в якому всі кактуси були позначені кількістю голочок α12,…, αN (голі кактуси були позначені 0). Скількох кактусів не торкнулася рука юної перукарки?

3. Середню групу дитячого садочка вивели на прогулянку. Скільки дівчаток і скільки хлопчиків видно з-за паркану, якщо зріст хлопчиків задається у сантиметрах від'ємними числами, а дівчаток — додатними у вигляді цілих значень α12,…, αN ? Окрім того, у всіх дівчаток на голівках зав'язані бантики заввишки 10 см, а висота паркану H см.

4. Маленький онучок вирішив допомогти бабусі підстригти квіти у її дорогоцінному квітнику, зрізавши лише бутони та квіточки на них. На щастя, кмітливий хлопчик зрізав лише ті квіти, які були заввишки від h1 см до h2, см від землі. Скільком квіточкам пощастило бути підстриженими, якщо висота їх у сантиметрах становить α12,…, αN ?

5. Коли барон Мюнхаузен вирішив пообідати, він прив'язав до довгої мотузки шматок сала і закинув його у повітря. Зграя диких гусей, що пролітала тим часом над помешканням барона, заціка­вилася незвичним предметом і найстарший гусак, що очолював зграю, проковтнув його. Не встиг він насолодитися відчуттям ситості, як шматок сала проскочив через нього і зник у дзьобі другого гусака і т.д. Тепер доля обіду барона Мюнхаузена залежала лише від довжини мотузки! Скільки кілограмів підсмаженої гусятини було подано на обід барона Мюнхаузена, якщо довжина мотузки становила L см, N гусей летіли на відстані h см один від одного, довжина кожного з них дорівнює k см, а вага цих гусей у кілограмах становила m1,m2,…,mN ?

6. Маленький Дмитрик щомісяця виростає на 2 cм, а у бабусі в комірчині облаштовано полички з різними ласощами — варенням, джемом, повидлом. Акуратистка бабуся записувала висоту і наступний порядковий номер у свій записник кожної нової полички в тій послідовності, як вона з'являлася у комірчині завдяки дідусеві. Висота цих поличок була а1, а2, ... аN, см. Нові полички дідусь прибивав, де йому заманеться — вище, нижче і між тими, що вже були. З'ясувати, через скільки місяців до яких поличок, враховуючи їх порядок запису в бабусиній книжці, добереться Дмитрик (наприклад, спочатку до п'ятої, занотованої у записнику, потім до другої і т.д.), якщо він відкрив для себе бабусину комірчину, коли його зріст був Н1 см, а доросте Дмитрик до H2 см.

7. Велосипедист-початківець Павлуша виїхав на широку дорогу. Але їхати інакше, ніж за законом синусоїди, йому ніяк не вдавалося. Юний спортсмен стартував у точці Х0 на осі ОХ, а центри основ стовпів знаходяться у точках х1,х2,...,хn на цій же осі, яку перетинає синусоїда руху велосипедиста. Скільки стовпів трапляться на шляху Павлуші, якщо шириною стовпа можна знехтувати?

8. Завзятий водій Василь Іванович вирішив поставити рекорд пе­регонів між містом Мляшем та містом Пляшем. Спочатку він придбав карти розташування заправок пальним на шляху між Мляшем та Пляшем, де відстань між заправками була позначена числами а1,а2,...,аN а потім побився об заклад зі своїми друзями, що вста­новить рекорд за Т год. Одна проблема турбувала Василя Івановича: об'єм бака для пального складав К л, а запасної каністри у нього не було. Витрати пального в дорозі становили 1л на 10 км шляху. Для еко­номії часу Василь Іванович на кожній заправці визначав, чи варто вит­рачати 10 хв. на дозаправку, чи можна доїхати до наступної заправки на залишках пального у баці. Чи зможе Василь Іванович встановити рекорд, якщо перша заправка знаходиться у місті Мляші, остання — у місті Пляші, а сам Василь Іванович їде зі сталою швидкістю ν км/год? Чи може таке статися, що Василь Іванович взагалі не доїде до міста Пляша?

9. Лікар-психіатр призначив Сергійкові лікування від лайливих слів. Виконуючи поради психіатра, хворий повинен був записувати у таблицю по днях упродовж місяця кількість використаних ввічливих слів «Дякую», «Пробачте», «Прошу». У який день місяця друзям Сергійка повезло на ввічливі слова найбільше? Якого дня місяця у хлопчика був найгірший настрій? Які ввічливі слова Сергійкові найбільше до вподоби?


3. Масиви. Вправи та задачі

1. Обчисліть значення b[l,l]+b[l,2]+b[l,3]+b[l,4] у масиві оцінок b.

2. Обчисліть b[l,l]+b[2,l]+b[3,l]+b[4,l]+b[5,l] у масиві оцінок b.

3. Обчисліть s:=0; for i:=l to 4 do s:=s+b[2,i] у масиві оцінок b.

4. Обчисліть s:=0; for i:=l to 5 do s:=s+b[i,l] у масиві оцінок b.

5. Запишіть команди для виведення значень двовимірного масиву оцінок b у вигляді таблиці.

6. Запишіть команду опису типу масиву цілих чисел з чотирма рядками і трьома стовпцями і оголосіть два такі масиви.

7. Запишіть команду присвоєння, якою елементові масиву, що є на перетині третього рядка і четвертого стовпця, можна надати значення 7.

8. Запишіть команди для збільшення значень усіх елементів двовимірного масиву b на одиницю.

9. Обчисліть суму всіх елементів двовимірного масиву b.

10. Побудуйте двовимірний масив з п'ятьма рядками і п'ятьма стовпцями за формулою d.. ·= sin(/+/); i=l,2,...,5; j = 1,2, ...,5. Виведіть масив на екран у вигляді таблиці. Задайте формати виведення чисел з двома цифрами після крапки; намагайтеся, щоб таблиця виглядала якнайкраще.

11. Див. умову задачі 10. У масиві d обчисліть суму додатних елементів.

12. Див. умову задачі 10. У масиві d обчисліть добуток елементів більших, ніж 0,5.

13. Див. 10. У масиві d визначіть максимальний елемент та його індекси.

14. Див. умову задачі 10. У масиві d від'ємні елементи замініть нулями. Скільки є додатних елементів?

15. Див. 10. У масиві d поміняйте місцями перший і останній стовпці.

16. Див. 10. У масиві d обчисліть суму елементів під головною діагоналлю (i<j).

17. Див. умову задачі 10. У масиві d обчисліть середньоарифметичні значення елементів кожного рядка.

18. Див. 10. У масиві d максимальний елемент поміняйте місцями з мінімальним.

19. Проект «Моя сім'я». Дані для розв'язування цієї задачі потрібно підготувати у вигляді таблиць заздалегідь. Нехай kце кількість членів вашої сім'ї. В одновимірний сталий масив В уведіть імена чи статус членів сім'ї (я, батько, мати, брат тощо). Заповніть сталий двовимірний числовий масив А, що має k рядків і чотири стовпці, такою інформацією у стовпцях: 1 - номер за порядком члена сім'ї, 2 - рік народження, 3 - зріст у см, 4 -розмір одягу. Виведіть таблиці для огляду на екран. Складіть програму, щоб відповісти на запитання:

а) чи носите ви одяг 46-го розміру;

б) хто носить плащ 50-го розміру;

в) у кого зріст понад 170 см;

г) скільки років члену сім'ї, що є другим у списку;

д) кому можна переглядати фільми для дорослих; е) хто в сім'ї найвищий?

20. Проект «Наші оцінки». Задано текстову лінійну таблицю T, n елементів якої - це прізвища учнів вашого класу, а також числову прямокутну

таблицю В, n*m елементів якої - це оцінки учнів з певного предмета за деякий час навчання (m - максимальна кількість оцінок одного учня). Перший стовпець у таблиці В - оцінки за контрольну роботу. Щоб таблиця В була заповненою, вважатимемо, що, крім оцінок, вона містить такі числові дані: -1 (учень відсутній), 0 (учень присутній, але не опитаний). Виконайте завдання:

а) дані з таблиць занесіть у сталі масиви і виведіть три списки учнів, які отримали за контрольну роботу 10, 11, 12 балів;

б) який середній бал за контрольну роботу в класі;

в) виставте оцінки всім учням за чверть. Для цього визначте середні оцінки й заокругліть їх до найближчого цілого числа. Якщо немає оцінок, виведіть повідомлення «не атестовано»;

г) розгляньте пункт в) і випадок, коли середня оцінка має дробову час­тину 0,5. Тоді заокруглення виконайте у бік більшого значення за умови, що остання оцінка виІца від середньої;

д) проаналізуйте відвідування учнями уроків з конкретного предмета. Скільки пропусків має кожен учень? Скільки це у відсотках? Який середній відсоток відвідування учнями уроків з цього предмета?

е) об'єднайте всі завдання в одну програму (використайте підпрограми). Дайте свої пропозиції щодо вдосконалення (розширення можливостей) отриманого алгоритму.

Завдання додому

1. Встановити на комп’ютер середовище програмування

Visual C++ 2008 Express Edition,  www.microsoft.com/express/vc/ ;

2. Розв’язати по одну задачу з кожної групи задач.

3. Відправити розв’язки на поштову скриньку igis1971@gmail.com або приєднати в щоденнику.


Робота з масивами

Операція з масивом

Лінійний масив

Прямокутна таблиця

Опис

int a[100];

int i, n;//індекс, кількість елементів

int a[100][100];

int i,j, n,m;//індекс, кількість елементів

Введення

cin>>n;

for(i=1;i<=n;i++)cin>>a[i];

cin>>n>>m;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

cin>>a[i][j];

Виведення

for(i=1;i<=n;i++)cout<<a[i]<<” “;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

cout<<a[i][j]<<” “;

Сумування

s=0;

for(i=1;i<=n;i++)s=s+a[i];

s=0;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

s=s+a[i][j];

Пошук

cin>>k;

for(i=1;i<=n;i++) if (a[i]==k) cin<<i;

cin>>k;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

if (a[i][j]==k)

cin<<i<<” “<<j;

Пошук максимального

max=a[1];nmax=1;

for(i=2;i<=n;i++)if  (a[i]>max) {max=a[i];nmax=i;}

max=a[1];imax=1;jmax=1;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

if  (a[i][j]>max) {max=a[i][j];

imax=i;jmax=j;}

Сортування

for(i=1;i<n;i++)

for(j=1;j<n;j++)

if  (a[j]>a[j+1])

{temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;}

Стирання

n=n-1;

for(i=k;i<=n;i++)

a[i]=a[i+1];

Вставка

n=n+1;

for(i=n;i>=1;i--)

a[i]=a[i-1];

 
24.09.2014 Сортування - Перебір PDF Печать E-mail
Добавил(а) Administrator   
06.10.14 11:23

повний архів

Сортування елементів масиву

(методи сортування, сортування перестановкою, вибором, швидке сортування, задача кількість різних чисел в масиві)

Розглянемо способи сортування. Сама тема сортування є однією з найбільш досліджених задач.

Є три способи сортування масивів:

$1-          сортування вибором;

$1-          сортування обміном;

$1-          сортування вставкою.

Для кожного способу є багато алгоритмів, які відрізняються часом сортування, який злежить від числа операцій порівняння і операцій обміну.

Традиційно розрізняють внутрішнє сортування, яке обробляє дані оперативної пам’яті, і зовнішнє сортування, яке оперує з даними розміщеними на дисках.

Розглянемо сортування числового одномірного масиву.

Відсортувати числовий масив:               7, 3, 8, 4,8, 5, 9, 1.   

Звичайне  сортування :                            1, 3, 4, 5, 7, 8, 8, 9,.

Адресне сортування:                               7, 3, 8, 4, 8, 5, 9, 1.

                                                      5, 2, 6, 3, 7, 4, 8, 1  (адреса).

Є багато різноманітних алгоритмів сортування (сортування бульбашкою, сортування за допомогою дерева, пірамідальне сортування, швидке сортування (половинного поділу).

Розглянемо деякі з них в дещо видозміненому вигляді.

Сортування вектором

#include "fstream"
#include<algorithm>
#include<vector>

using namespace std;
int main()
{ifstream cin("E.dat");
ofstream cout("E.sol");
long long n,k,l,i,j,c;
cin>>n>>k;
vector<long long int> a(n);
for(i=0;i<n;i++) cin>>a[i];
sort(a.begin(),a.end());

 

l=0;
for(i=k;i<n;i++)
{l=l+a[i];

}
cout<<l;
return 0;
}

Перебір вектором

 #include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
#include <algorithm>

using namespace std;
vector <int> a;

 ifstream f;
 ofstream g;

void printper(int n);
int main()
{
    f.open("input.dat");
    g.open("output.ans");
    int n;
    f >> n;


    for (int i=1;i<=n;i++){
        a.push_back(i);
    }
    printper(n);

    while (next_permutation(a.begin(),a.end())){
        printper(n);
    };
    //printper(n);

    f.close();
    g.close();
    return 0;
}

void printper(int n)
{
    for (int i=0;i<n-1;i++){
        g << a[i] << " ";
    }
    g << a[n-1] << endl;
}

Последнее обновление 06.10.14 11:38
 
Синтаксичний розбір і лексичний аналіз виразів PDF Печать E-mail
Добавил(а) Гісь   
22.04.11 14:12

Синтаксичний розбір і лексичний аналіз виразів

Однієї з головних причин, що лежать в основі появи мов програмування високого рівня, з'явилися обчислювальні задачі, що вимагають великих об'ємів рутинних обчислень. Тому до мов програмування пред'являлися вимоги максимального наближення форми запису обчислень до природної мови математики. В зв'язка з цей одній з перших областей системного програмування сформувалося дослідження способів виразів. Тут отримані численні результати, проте найбільше розповсюдження отримав метод трансляції за допомогою зворотного польського запису, який запропонував польський математик Я. Лукашевіч.

Зворотна польська нотація

Нехай заданий простий арифметичний вираз вигляду:

(A+B)*(C+D)-E                (1)

Представимо цей вираз у вигляді дерева, в якому вузлам відповідають операції, а гілкам - операнди. Побудову почнемо з кореня, як який вибирається операція, що виконується останньої. Лівій гілці відповідає лівий операнд операції, а правої гілки - правий. Дерево виразу (1) показано на рис. 1.

                           -
                          / \
                         /   \
                        *     E
                       / \
                      /   \
                     /     \
                    /       \
                   +         +
                  / \       / \
                 /   \     /   \
                А     B   С     D
                       рис. 1

Зробимо обхід дерева, під яким розумітимемо формування рядка символів з символів вузлів і гілок дерева. Обхід скоюватимемо від найлівішої гілки управо і вузол переписувати у вихідний рядок тільки після розгляду всіх його гілок. Результат обходу дерева має вигляд:

AB+CD+*E-                (2)

Характерні особливості виразу (2) полягають в проходженні символів операцій за символами операндів і у відсутності дужок. Такий запис називається зворотним польським записом.

Зворотний польський запис володіє поряд чудових властивостей, які перетворюють її на ідеальну проміжну мову при трансляції. По-перше, обчислення виразу, записаного в зворотному польському записі, може проводитися шляхом однократного перегляду, що є вельми зручним при генерації об'єктного коду програм.  наприклад, обчислення виразу (2) може бути проведено таким чином:

|-----|----------------------|-----------------------|
|  #  |    Аналізований      |    Дія                |
| п/п |       рядок          |                       |
|-----|----------------------|-----------------------|
|  0  |  А B + С D + * E -   |       r1=A+B          |
|  1  |  r1 З D + * E -      |       r2=C+D          |
|  2  |  r1 r2 * E -         |       r1=r1*r2        |
|  3  |  r1 E -              |       r1=r1-E         |
|  4  |  r1                  |  Обчислення закінчено |
|-----|----------------------|-----------------------|
Тут r1, r2 - допоміжні змінні. 

По-друге, отримання зворотного польського запису з початкового виразу може здійснюватися вельми просто на основі простого алгоритму, запропонованого Дейкстpой. Для цього вводиться поняття стекового пріоритету операцій(табл. 1):

        Таблиця 1
|----------|-----------|
| Операція | Пріоритет |
|----------|-----------|
|    (     |     0     |
|    )     |     1     |
|   +|-    |     2     |
|   *|/    |     3     |
|   **     |     4     |
|----------|-----------|

Є видимим початковий рядок символів зліва направо, операнди переписуються у вихідний рядок, а знаки операцій заносяться в стек на основі наступних міркувань:

а) якщо стек порожній, то операція з вхідного рядка переписується в стек;

б) операція виштовхує із стека всі операції з великим або рівним пріоритетом у вихідний рядок;

в) якщо черговий символ з початкового рядка є відкриваюча дужка, то він проштовхується в стек;

г) закриваюча кругла дужка виштовхує всі операції із стека до найближчої відкриваючої дужки, самі дужки у вихідний рядок не переписуються, а знищують один одного.

Процес отримання зворотного польського запису виразу (1) схемно представлений :

Cимвол

1

2

3

4

5

6

7

8

9

10

11

12

13

 

Вхідний рядок

(

A

+

B

)

*

(

C

+

D

)

-

E

 

Стан стека

(

(

+
(

+
(

 

*

(
*

(
*

+
(
*

+
(
*

*

-

-

 

Вихідний
рядок

 

A

 

B

+

 

 

C

 

D

+

*

E

-

 

 

Розбір арифметичного(і не тільки) виразу. Класичні алгоритми.

Алгоритм Рутісхаузера

Даний алгоритм є одним з найстаріших. Його особливістю є припущення про повну дужкову структуру виразу. Під повним дужковим записом виразу розуміється запис, в якому порядок дій задається розстановкою дужок. Неявне старшинство операцій при цьому не враховується. Наприклад:

D:=((C-(B*L))+K)

Обробляючи вираз з повною дужковою структурою, алгоритм привласнює кожному символу з рядка номер рівня за наступним правилом:

1. якщо це дужка або змінна, що відкривається, то значення збільшується на 1;

2. якщо знак операції або дужка, що закривається, то зменшується на 1.

Для виразу (А+(В+С)) привласнення значень рівня відбуватиметься таким чином :

      |-------|---------------------------------------|
      |N симв.| 1   2   3    4   5    6   7    8   9  |
      |-------|---------------------------------------|
      |Символи|                                       |
      |рядка  | (   А   +    (   B    *   З    )   )  |
      |-------|---------------------------------------|
      |Номера |                                       |
      |рівнів | 1   2   1    2   3    2   3    2   1  |
      |-------|---------------------------------------|

Алгоритм складається з наступних кроків:

1. виконати розстановку рівнів;

2. виконати пошук елементів рядка з максимальним значенням рівня;

3. виділити трійку - два операнди з максимальним значенням рівня і операцію, яка укладена між ними;

4. результат обчислення трійки позначити допоміжній змінній;

5. з початкового рядка видалити виділену трійку разом з її дужками, а на її місце помістити допоміжну змінну, що позначає результат, із значенням рівня на одиницю менше ніж у виділеної трійки;

6. виконувати п.п.2 - 5 до тих пір, поки у вхідному рядку не залишиться одна змінна, що позначає загальний результат виразу.

Приклад розбору :

          
     |------------|--------------------------------------|
     |Генерируючі |            Вираз                     |
     |   трійки   |                                      |
     |------------|--------------------------------------|
     |            |   ( ( ( ( А + В ) * З ) / D ) - E )  |
     |            | 0 1 2 3 4 5 4 5 4 3 4 3 2 3 2 1 2 1 0|
     |            |                                      |
     |+ А В - > R |      ( ( ( R * З ) / D ) - E )       |
     |            |    0 1 2 3 4 3 4 3 2 3 2 1 2 1 0     |
     |            |                                      |
     |* R З -> S  |          ( ( S / D ) - E )           |
     |            |        0 1 2 3 2 3 2 1 2 1 0         |
     |            |                                      |
     |------------|--------------------------------------|
 
     |------------|-----------------------------------|
     |Генерируючі |            Вираз                  |
     |   трійки   |                                   |
     |------------|-----------------------------------|
     |/ S D -> Q  |         ( Q - E )                 |
     |            |       0 1 2 1 2 1 0               |
     |            |                                   |
     |- Q E -> T  |             T                     |
     |------------|-----------------------------------|

Алгоритм Бауера і Замельзона

З ранніх стекових методів розглядається алгоритм Бауера і Замельзона. Алгоритм використовує два стеки і таблицю функцій переходу. Один стек використовується при трансляції виразу, а другий - під час інтерпретації виразу. Позначення: Т - стек транслятора, Е - стек інтерпретатора.

В таблиці переходів задаються функції, які повинен виконати транслятор при розборі виразу. Можливі шість функцій при прочитанні операції з вхідного рядка:

- f1 - заслати операцію з вхідного рядка в стек Т; читати наступний символ рядка;

- f2 - виділити трійку - узяти операцію з вершини стека Т і два операнди з вершини стека Е; допоміжну змінну, що позначає результат, занести в стек Е; заслати операцію з вхідного рядка в стек Т; читати наступний символ рядка;

- f3 - виключити символ із стека Т; читати наступний символ рядка;

- f4 - виділити трійку - узяти операцію з вершини стека Т і два операнди з вершини стека Е; допоміжну змінну, що позначає результат, занести в стек Е; по таблиці визначити функцію для даного символу вхідного рядка;

- f5 - видача повідомлення про помилку;

- f6 - завершення роботи.

Таблиця переходів для виразів алгебри матиме вигляд(символ $ є ознакою порожнього стека або порожнього рядка):

 |----------|---------------------------------|
 |          |     Операція з вхідного рядка  |
 |          |---------------------------------|
 |          |     $   (   +   -   *   /   )   |
 |----------|---|-----------------------------|
 |Операція  |$  | 6   1   1   1   1   1   5   |
 |на вершині|(  | 5   1   1   1   1   1   3   |
 |стека Т   |+  | 4   1   2   2   1   1   4   |
 |          |-  | 4   1   2   2   1   1   4   |
 |          |*  | 4   1   4   4   2   2   4   |
 |          |/  | 4   1   4   4   2   2   4   |
 |----------|---|-----------------------------|

Алгоритм проглядає зліва направо вираз і циклічно виконує наступні дії: якщо черговий символ вхідного рядка є операндом, то він безумовно переноситься в стек Е; якщо ж операція, то по таблиці функцій переходу визначається номер функції для виконання. Для виразу А+(В-С)*D нижче приводиться послідовність дій алгоритму.

    |-------|--------|-------|-------|----------|
    |стек Е | стік Т |Вхідний|Номер  |   Трійка |
    |       |        |символ |функції|          |
    |-------|--------|-------|-------|----------|
    |$      | $      |  А    |       |          |
    |$A     | $      |  +    |    1  |          |
    |$A     | $+     |  (    |    1  |          |
    |$A     | $+(    |  B    |       |          |
    |$AB    | $+(    |  -    |    1  |          |
    |$AB    | $+(-   |  З    |       |          |
    |$ABC   | $+(-   |  )    |    4  |- B З ->R |
    |$AR    | $+(    |  )    |    3  |          |
    |$AR    | $+     |  *    |    1  |          |
    |$AR    | $+*    |  D    |       |          |
    |$ARD   | $+*    |  $    |    4  |* R D ->Q |
    |$AQ    | $+     |  $    |    4  |+ А Q ->S |
    |$S     | $      |  $    |Кінец  |          |
    |-------|--------|-------|-------|----------|   

 

Задачі

Задача GoTo.

Учні, недавно що почали програмувати, вживають дуже багато операторів GOTO, що є майже неприпустимим для структурованої програми. Допоможіть викладачу інформатики написати програму, яка оцінюватиме ступінь структурованості відладженої програми школяра на мові Pascal, спершу просто підраховувавши кількість операторів GOTO в ній.

В синтаксично вірній програмі ключове слово оператора переходу GOTO може стояти або на початку рядка або після пропуску або після одного з символів — ‘;’, ‘:’, ‘}’, а після нього може стояти або пропуск або переклад рядка або символ ‘{‘ (табуляцію як роздільник розглядати не будемо).

Нагадаємо, що окрім позначення дійсно оператора переходу, слово GOTO може зустрічатися в тексті програми в рядкових константах, укладених в апострофи, або в коментарях, причому для простоти вважатимемо, що коментар завжди починається з символу ‘{‘, а закінчується першим що зустрівся після цього символом ‘}’, при цьому символ ‘{‘ повинен знаходитися не усередині рядкової константи. В цих випадках слово GOTO підраховувати не потрібно. Рядкові і прописні букви в Pascal не помітні.

У вхідному файлі goto.in знаходиться текст програми без синтаксичних помилок на мові Pascal. Розмір програми не перевершує 64К. У вихідному файлі goto.out повинне виявитися одне число – кількість операторів GOTO в цій програмі.

Приклад вхідного файлу:

label 1,2;

var I:byte;

begin

 1: I:=I+1;

    if I>10 then goto 2 else

      writeln(¢ goto ¢); GoTo 1;

 2: if I<10 then goto 1 {else { goto 2;}

end.

Вихідний файл для наведеного приклад

3

Додаткові задачі

1.      Правильність розстановки дужок.

арифметичних виразів за допомогою постфіксної нотації

Література

1.      Ахо А., Сети Р., Ульман Д. Компиляторы. Принципы, технологии, инструменты. М.: Вильямс, 2001.

2.      Бауэр Ф.Л., Гооз Г. Информатика. Вводный курс. Часть 2, М.: Мир, 1990.

3.      Кук Д., Бейз Г. Компьютерная математика. М.: Наука, 1990.

4.      Шень А. Программирование: теоремы и задачи. М.: МЦНМО, 1995.

5.      Грузман М.З. Евристика в інформатиці. Вінниця: Арбат, 1998.

 
Заняття 6 (12.10.2016) PDF Печать E-mail
Добавил(а) Administrator   
29.11.16 09:20

Завдання 1. Таймер (20 балів)

Таймер - це годинник, який вміє подавати звуковий сигнал через деякий період часу. Напишіть програму, яка визначає, коли повинен буде поданий звуковий сигнал.

Вхідні дані

У першому рядку вхідного файлу записано поточний час в форматі Г Х С (без початкових нулів). При цьому він задовольняє обмеженням: Г - від 0 до 23, Х і С - від 0 до 60.

У другому рядку записаний інтервал часу, який повинен бути визначений. Інтервал записується в форматі Г Х  С (де Г, Х і С - від 0 до 109, без початкових нулів).

100 100 100 - 100 годин, 100 хвилин, 100 секунд, що те ж саме, що 101  41 40.

Вихідні дані

У вихідний файл виведіть в форматі Д Г Х  С час, у скільки прозвучить звуковий сигнал (де Д –кількість днів).

Приклади

input.txt

output.txt

1 1 1

48 0 0 

2 1 1 1

1 1 1

0 58 119

0 2 1 0

23 59 59

0 0 1               

1 0 0 0

#include <fstream>

using namespace std;

ifstream cin("input.txt");

ofstream cout("output.txt");

int main()

{

    long long  g1,h1,s1, g2,h2,s2, d,g,h,s;

    cin>> g1>>h1>>s1>>g2>>h2>>s2;

    long long t =g1*3600+h1*60+s1+g2*3600+h2*60+s2;

    d=t/(24*3600);

    g=(t-d*24*3600)/3600;

    h=(t-d*24*3600-g*3600)/60;

    s=(t-d*24*3600-g*3600-h*60);

    cout <<d<<" "<<g<<" "<<h<<" "<<s<< endl;

        return 0;

}

Задача 2. Зернини (20 балів)

У банці знаходяться білі та чорні зернини. Щоразу з банки виймають навмання дві зернини. Якщо вони однакового кольору, їх викидають, а до банки кладуть чорну зернину (чорних зернин достатньо). Якщо ж зернини різного кольору, то чорну викидають, а білу повертають до банки. Ці дії повторюють, доки не залишиться одна зернина. Написати програму, яка за відомою кількістю чорних та білих зернин визначає колір останньої зернини.

Вхідні дані

У єдиному рядку записані два числа - кількість білих та чорних зернин.

Вихідні дані

Єдиний рядок вихідного текстового файла має містити колір зернини, що залишилася: white - якщо зернина біла, black - якщо зернина чорна.

input.txt

output.txt

4 3

black

#include <iostream>

//ifstream cin("input.txt");

//ofstream cout("output.txt");

using namespace std;

int main()

{

    long long int gg,hh,ss,kk,k,g,h,s,G,H,S,sum;

    cin>>g>>h>>s;

    cin>>G>>H>>S;

    sum=(G*3600+H*60+SS)-(g*3600+h*60+s);

    ss=sum%60;

    hh=sum/60;

    gg=sum/3600;

    kk=sum/(3600*24);

    cout<<kk<<" "<<gg<<" "<<hh<<" "<<ss<<endl;

        return 0;

}

Задача 3. Паліндром (30 балів)

Перевірити чи введене N-цифрове натуральне число є паліндромом.

Вхідні дані

У єдиному рядку записано натуральне число кількість цифр до 100.

Вихідні дані

Єдиний рядок вихідного текстового файлу має містити “yes”, якщо число паліндром і “no” – якщо ні.

input.txt

output.txt

121

yes

231132

yes

123

no

#include <iostream>

#include <string.h>

using namespace std;

//ifstream cin("input.txt");

//ofstream cout("output.txt");

int main()

{

    char a[100];

cin>>a;

int f=1;

int n=strlen(a);

for (int i=0;i<n/2;i++)

    if(a[i]!=a[n-i-1])f=0;

if (f)

cout<<"yes"<<endl;

else cout<<"no"<<endl;

        return 0;

}

Задача 4.  "Прямокутники" (30 балів)

На квадратному аркуші паперу в клітинку розміром NхN клітин намальовано кілька прямокутників. Кожен прямокутник складається з цілих клітинок, різні прямокутники не накладаються один на одного і не дотикаються.

Необхідно написати програму, яка рахує число цих прямокутників.

Вхідні дані

В першому рядку N, розмір масиву, в наступних n рядків  масиву, в кожному з яких написані через пробіл n елементів масиву: A [елемент I, J] = 1, якщо клітина [I, J] належить будь-якому прямокутника, і A [I, J ] = 0, в іншому випадку.

Вихідні дані

Необхідно вивести єдине число - кількість прямокутників.

input.txt

output.txt

3

0 1 0

0 1 0

0 0 0

1

3

1 1 0

0 0 0

$11         0 1

3

#include <iostream>

#include <string.h>

using namespace std;

//ifstream cin("input.txt");

//ofstream cout("output.txt");

    int a[100][100];

int main()

{

int n;

cin>>n;

for (int i=0;i<n;i++)

    for (int j=0;j<n;j++)

    cin>>a[i][j];

int k=0;

for (int i=0;i<n;i++)

    for (int j=0;j<n;j++)

    if (a[i][j]==1 && a[i+1][j]==0 &&a[i][j+1]==0 && a[i+1][j+1]==0)k++;

     cout<<k<<endl;

        return 0;

}

Додаткова

  1. (http://codeforces.com/)

http://codeforces.com/problemset/problem/550/A

 
Заняття 4 (24.10.2012) PDF Печать E-mail
Добавил(а) Гісь Ігор Володимирович   
24.10.12 11:03

(ДИВИСЬ ВКЛАДЕНИЙ ФАЙЛ)

Визначення площі довільного многокутника

За заданими координатами вершин многокутника визначити його площу.

Для обчислення площі можна використати формулу:

S=1/2*abs((x1*y2-x2*y1)+ (x2*y3-x3*y2)+..+ (xn*yn+1-xn+1*yn)), xn+1=x1; yn+1=y1.

Побудова опуклої оболонки для множини з N точок площини

Опуклою оболонкою деякої заданої множини точок називається перетин всіх опуклих множин, що містять задану множину. Для скінченої множини точок опуклою оболонкою буде завжди опуклий багатокутник, всі вершини якого є точками заданої множини.

Задача полягає в тому, щоб для заданої скінченої множини точок знайти вершини опуклої оболонки цієї множини. Будемо перераховувати вершини в порядку перегляду проти годинникової стрілки. Для ефективного розв’язування цієї задачі існує декілька різних алгоритмів. Наведемо найбільш просту реалізацію одного з них – алгоритму Джарвіса. Цей алгоритм інколи називають «загортання подарунка».

(ДИВИСЬ ВКЛАДЕНИЙ ФАЙЛ)

 

Задача 10. Task10 . Багатокутник на площині задано цілочисельними координатами своїх N вершин у декартовій системі координат. Потрібно знайти площу многокутника. Сторони багатокутника не стикаються (за винятком сусідніх - у вершинах) і не перетинаються.

введення

У першому рядку знаходиться число N. У наступних N рядках знаходяться пари чисел - координати точок. Якщо з'єднати точки в даному порядку, а також першу і останню точки, вийде заданий многокутник.

виведення

Вивести одне число - площа багатокутника. Його слід округлити до найближчого числа з однією цифрою після десяткової крапки.

обмеження

3 ≤ N ≤ 50 000, координати вершин цілі і по модулю не перевищують 20000.

task10.in

task10.in

4
5 0
0 5
-5 0
0 -5

4
0 4
0 0
3 0
1 1

task10.out

task10.out

50.0

3.5

Задача11.task11. Нова держава.

Іваном Річкоплавцем і його командою був відкритий новий багатий континент, який назвали Іванія, де вони вирішили оселитися. Кожним членом команди було засноване нове поселення і назване його іменем. Їхні нащадки вирішили утворити нову державу і побудувати кордон, таким чином щоб границя була мінімальної довжини у вигляді прямих відрізків, які з’єднають поселення, біля яких пройде кордон при умові, що в середині будуть всі інші поселення і площа країни буде найбільшою. Яка довжина границі утвореної держави і її площа?

Вхідні дані

В першому рядку знаходиться натуральне N (3<=N<=50) – число поселень. В наступних рядках координати кожного поселення X,Y, які записуються через пропуск. X,Y – цілі числа (-1000<=X<=1000; -1000<=Y<=1000).

Вихідні дані

В першому рядку Р, а в другому S. P i S – дійсні числа із виведеними двома розрядами після коми.

Максимальний час роботи 15 секунд

Приклад вхідного файлу task11.in

Приклад вихідного файлу task11.out

5

0 0

0 2

1 1

2 2

2 0

8.00

4.00


 

 

 


Страница 38 из 43

Статистика

Пользователей : 269
Статей : 225
Просмотрено статей : 127314

Вход/Регистрация

Нет