Автор: Пользователь скрыл имя, 12 Июля 2013 в 00:49, курсовая работа
Теорія алгоритмів - дисципліна що вивчає як саме поняття алгоритму, так і поняття алгоритмічної розв'язності задач.
Перші, та найчисленніші застосування теорія алгоритмів мала в математичній логіці, адже вона виникла саме як розділ математичної логіки. Теорія алгоритмів є фундаментом програмування та інформатики.
Поштовхом до виникнення теорії алгоритмів, як окремого розділу математики, стала невдача в знаходженні алгоритмів розв'язку деяких масових проблем. Найвідомішими з них були проблема істинності для арифметичних формул, проблема істинності для формул числення предикатів першого порядку та десята проблема Гільберта про розв'язність діофантових рівнянь.
Умова задачі…………………………………………………………………………………..…2
Вступ…………………...……………………………………………………………………………3
Опис алгоритму………………………………………….………………………………….…4
Приклад………………….……………………………………………………………………..…7
Лістинг програми..………………………………………………………………………......8
Результат роботи програми…………………………………………….……………16
Висновок.……………………………………………………………………………………….17
Література………………………………………………………………..……………………18
Мiнiстерство освiти і науки, молоді та спорту України
Полтавський національний технічний університет
імені Юрія Кондратюка
Факультет інформаційних та телекомунікаційних технологій і систем
Кафедра комп’ютерних та інформаційних технологій та систем
Курсова робота
з дисципліни «Теорія алгоритмів»
Виконав: студент групи 201-ТН
Травкін П.А.
Керівник роботи: Гвоздик Д.М.
Полтава 2011
Зміст
Умова задачі
Скласти Машину Тьюрінга для перетворення числа в десятковій системі числення в систему з основою 16
(наприклад Вхідні дані: 255 Вихідні дані: FF).
Вимоги до програми:
Можливість перегляду коду МТ.
Покрокова візуалізація роботи програми.
Інтерфейс під Windows! Не консольний.
Вступ
Теорія алгоритмів - дисципліна що вивчає як саме поняття алгоритму, так і поняття алгоритмічної розв'язності задач.
Перші, та найчисленніші застосування теорія алгоритмів мала в математичній логіці, адже вона виникла саме як розділ математичної логіки. Теорія алгоритмів є фундаментом програмування та інформатики.
Поштовхом до виникнення теорії
алгоритмів, як окремого розділу математики,
стала невдача в знаходженні ал
Виникла гіпотеза про те, що для деяких масових проблем алгоритми їх розв'язку взагалі не існують. Однак для доведення неіснування алгоритму треба мати його точне математичне визначення. Тому після сформування алгоритму, як нової та окремої сутності, першочерговою стала проблема знаходження адекватних формальних моделей алгоритму.
Зауважимо, що відкриття алгоритму як самостійного, окремого поняття не можна змішувати з відкриттям конкретних формальних моделей алгоритму чи алгоритмічно обчислюваної функції. Такі моделі запропоновані якраз для адекватного формального уточнення інтуїтивного поняття алгоритму, яке є для них первісним.
Пошук формальних моделей алгоритму проводився в двох напрямах:
Опис точного математичного поняття алгоритмічної машини та обчислюваності на ній. Першою формальною моделлю алгоритмічної машини, була машина Тьюрінга, яка моделювала елементарні дії при реалізації алгоритму людиною (А. Тьюрінг, Е. Пост 1936). Зараз відомо багато різновидностей машин Тьюрінга. З пізніших формальних моделей алгоритмів відзначимо також нормальні алгоритми (А. Марков 1952) та регістрові машини (Д. Шепердсон, Г. Стерджіс 1963). Модифікація регістрових машин - машини з натуральночисельними регістрами.
Опис певних класів функцій, для яких існує алгоритм знаходження функції за значеннями її аргументів, тобто уточнюється не первісне поняття алгоритму, а похідне поняттяалгоритмічно обчислюваної функції. Спочатку такі описи були запропоновані для функцій, заданих на множині натуральних чисел, пізніше - для функцій, заданих на множинах інших об'єктів.
Першими формальними моделями
алгоритмічно обчислюваних функцій
були лямбда-означувані
функції (А.Чорч 1932) та загальнорекурсивні
функції (К. Гьодель 1934). Вказані класи
визначались як функції, графіки яких
породжуються численнями λ-
У 1936 р. А. Чорч і С. Кліні довели, що класи загальнорекурсивних та λ-означуваних функцій збігаються. На основі цього факту та аналізу ідей, які привели до вказаних понять, А. Чорч висунув знамениту тезу, про збіг класу АОФ із класом загальнорекурсивних функцій. С. Кліні узагальнив цю тезу для випадку часткових функцій. Доведений А. Тьюрінгом у 1937 р. збіг класів ЧРФ і функцій обчислюваних на машині Тьюрінга, став ще одним підтвердженням тези Чорча. Пізніше такі збіги були встановлені для всіх відомих формальних моделей АОФ. Тому є всі підстави вважати, що кожна з названих вище формальних моделей адекватно уточнює інтуїтивне поняття АОФ.
1.1 Опис алгоритму
Десяткова система числення – це позиційна система числення із основою 10. Кожне число в якій записується за допомогою 10-ти символів, цифр - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Запис числа формується за загальним принципом: на n-й позиції (справа наліво від 0) стоїть цифра, що відповідає кількості n-х степенів десятки у цьому числі.
Шістнадцяткова система
Звичайно в якості шістнадцяткових
чисел використовуються десяткові
Для того щоб перевести число з десяткової системи в шістнадцяткову, потрібно послідовно ділити його на 16, записуючи кожний новий результат у вигляді цілого числа і залишку. Ділення потрібно проводити до тих пір, доки результат ділення не стане менше або рівний 15. Шістнадцяткове число отримується шляхом запису останнього результату ділення і залишків від попередніх ділень в зворотному порядку.
Розглянемо алгоритм переводу чисел з десяткової системи в шістнадцяткову:
На початковому етапі ми маємо десяткове число. На стрічці машини потрібно це число подати у вигляді «палок». «Палки» будемо записувати в комірки після символу «#». Так як на стрічці ми маємо лише число, запишемо алгоритм для установлення символу «#» після усих символів. Для цього ми маємо перескочити всі символи і дійшовши до пустого символа (лямди «λ») замінити його на «#».
q00→q00R (зустріли «0» - перескочили і рухаємося вправо)
q01→q01R
q02→q02R
q03→q03R
q04→q04R
q05→q05R
q06→q06R
q07→q07R
q08→q08R
q09→q09R
q0 λ →q1#L (дійшли до символу «λ», замінили її на символ «#», змінили стан, повернулися вліво)
Тепер, щоб здійснити заміну числа на «палки», потрібно віднімати від даного числа одиницю і відповідно ставити «палку» після символу «#». Після того як ми розвернулися вліво, ми натрапляємо на якесь число. Віднімемо від нього 1.
q18→q27R (при відніманні змінюємо стан і рухаємось вправо, щоб поставити потім «І» після «#»)
q17→q26R
q16→q25R
q15→q24R
q14→q23R
q13→q22R
q12→q21R
q11→q20R
Якщо зустріли «0», потрібно змінити це число на 9, і від попереднього відняти 1.
q10→q19L (стан не змінюємо для того щоб потім число перед «0» зменшити на одиницю (зациклюємо), за вище описаним алгоритмом, вліво рухаємося щоб знайти число перед «0»).
Тепер нам потрібно перескочити всі «9» для того щоб знайти символ «#»:
q29→q29R
Тепер, коли ми зменшили число на «1» і вибрали рух вправо, ми потрапляємо на символ «#»:
q2#→q3#R (при перескакуванні через «#» міняємо стан і рухаємося вправо)
Тепер ми зустрічаємо пустий символ «λ», який маємо замінити на «I»:
q3 λ →q4ІL
q3І→ q3ІR (якщо ми після символу «#» знаходимо «палку», нам потрібно її перескочити і знайти пустий символ)
Поставивши «палку», ми розвертаємося щоб знову відняти від числа 1 і поставити наступну «палку». Розвернувшись ми зустрічаємо «#», перескакуємо, змінивши стан на 1, таким чином зациклюємо всі попередні дії:
q4І→ q4ІL
q4#→q1#L
При відніманні числа ми дійдемо до ситуації, коли перед діезом ми зустрінемо 0, замінемо його на 9, а символ перед нулем не знайдемо. Тоді ми, зустрічаючи пустий символ «λ», розвертаємось в право і замінюємо всі змінені «9» на пусті символи. Таким чином, перед символом «#» ми будемо отримувати результат переведення числа.
q1 λ →q5 λR
q59→q5 λR
Замінивши «9» і перейшовши вправо, ми потрапляємо на символ «#», перескакуємо через нього, змінивши стан:
q5#→q6#R
Тепер потрібно пройти всі «палки», дійшовши до пустого символу «λ» розвернутися і замінити «палку» на пустий символ «λ» (видалити її):
q6І→ q6ІR
q6 λ →q7 λL
q7І→ q8 λL (змінюємо стан, щоб не видалити всі «палки»)
Замінивши одну «палку», перескакуємо решту «палок», доходимо до «#» перескакуємо його, не змінюючи стану.
q8І→ q8 ІL
q8#→q8#L
Замінимо пустий символ «λ» перед символом «#» на 1:
q8 λ → q71R (змінюємо стан, розвертаємось вправо)
Знову потрапляємо на символ «#», перескакуємо, змінивши стан на 7, таким чином зацикливши попередні дії заміни палок на числа.
q9#→q7#R
Тепер після символу «#» з кожним кроком буде видалятися «палка», а число до символу «#», збільшуватимемо на 1:
q80→q91R
q81→q92R
q82→q93R
q83→q94R
q84→q95R
q85→q96R
q86→q97R
q87→q98R
q88→q99R
q89→q9AR
q8A→q9BR
q8B→q9CR
q8C→q9DR
q8D→q9ER
q8E→q9FR
F замінимо на нуль, а число перед F збільшимо на 1 (якщо перед ним стоїть пустий символ «λ» – замінимо його на одиницю):
q8F→q8OL
q8 λ →q91R
q90→q90R (перескочимо число перед знаком «#»)
q91→q91R
q92→q92R
q93→q93R
q94→q94R
q95→q95R
q96→q96R
q97→q97R
q98→q98R
q99→q99R
Завершимо програму коли після команди q6 λ →q7 λL, перейшовши вліво зустрінемо пустий символ «λ» і потрапимо на решітку «#» :
q7#→q*
Отже алгоритм матиме вигляд:
q00→q00R
q01→q01R
q02→q02R
q03→q03R
q04→q04R
q05→q05R
q06→q06R
q07→q07R
q08→q08R
q09→q09R
q0 λ →q1#L
q18→q27R
q17→q26R
q16→q25R
q15→q24R
q14→q23R
q13→q22R
q12→q21R
q11→q20R
q10→q19L
q29→q29R
q2#→q3#R
q3 λ →q4ІL
q3І→ q3ІR
q4І→ q4ІL
q4#→q1#L
q1 λ →q5 λR
q59→q5 λR
q5#→q6#R
q6І→ q6ІR
q6 λ →q7 λL
q7І→ q8 λL
q8І→ q8 ІL
q8#→q8#L
q8 λ → q71R
q9#→q7#R
q80→q91R
q81→q92R
q82→q93R
q83→q94R
q84→q95R
q85→q96R
q86→q97R
q87→q98R
q88→q99R
q89→q9AR
q8A→q9BR
q8B→q9CR
q8C→q9DR
q8D→q9ER
q8E→q9FR
q8F→q8OL
q8 λ →q91R
q90→q90R
q91→q91R
q92→q92R
q93→q93R
q94→q94R
q95→q95R
q96→q96R
q97→q97R
q98→q98R
q99→q99R
q6 λ →q7 λL
q7#→q*
Приклад
Переведемо число 10 з десяткової системи в шістнадцяткову:
.
Лістинг програми
Наведемо код форми:
Form1.h
#pragma once
#include "TuringMachine.h"
namespace MachineTuring {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Form1
///
/// WARNING: If you change the name of this class, you will need to change the
/// 'Resource File Name' property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,