Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснительная.docx
Скачиваний:
3
Добавлен:
22.03.2016
Размер:
474.65 Кб
Скачать

Федеральное агентство по образованию

Пермский государственный технический университет

Кафедра информационных технологий

и автоматизированных систем

Пояснительная записка

к курсовой работе по программированию

на языках высокого уровня

Выполнил студент группы ПОВТ-10

Никитин Алексей Васильевич

Проверил доцент

Гладков Владимир Павлович

Дата_________Оценка____________

Пермь 2010 г.

Содержание

Постановка задачи………………………………………………………………………..3

Польская инверсная запись и решение выражений……………………………………4

Структура объектов………………………………………………………………………5

Проектирование интерфейса…………………………………………………………….5

Блок-схемы алгоритмов…………………………….……………………………………7

Текст программы с комментариями…………………………………………………….9

Набор тестов…………………………………………………………………………….15

Программная документация…………………………………………………………...18

Список литературы……………………………………………………………………..18

Постановка задачи

Требуется написать программу вычисления сложных выражений при помощи Польской инверсной записи. Все числа должны быть представлены в виде рациональных дробей.

Для рациональных дробей требуется переопределить операции сложения, вычитания, умножения и деления.

Польская инверсная записьи решение выражений

Обратная польская нотация была разработана австралийскимфилософоми специалистом в областитеории вычислительных машинЧарльзом Хэмблиномв середине1950-хна основепольской нотации, которая была предложена в1920 годупольским математикомЯном Лукасевичем. Работа Хэмблина была представлена на конференции в июне1957, и издана в 1957 и1962. Первыми компьютерами, поддерживающими обратную польскую нотацию былиKDF9отEnglish Electric Company.

Процесс решения начинается с ввода уравнения в общем виде.

Например необходимо вычислить выражение «a*(b+c/(2*a))».

После чего алгоритм перевода в полиз выводит отредактированную запись вида «a b c 2 a * / + * » . Далее алгоритм предлагает заменить все переменные на числа в виде рациональных дробей. После чего ищет знак операции и применяет его к 2м предыдущим операндам.

Решение к данному примеру на рис. 1

Рис.1

Структура объектов

Для решения данной задачи необходимо создать объект класса Рациональных дробей, состоящий из 2х полей «Числитель» и «Знаменатель» (intChislit,intZnamenat), а так же объект классаForm, для создания пользовательского интерфейса на основеWindowsForms.

Проектирование интерфейса

Для удобства пользования данная программа реализована как приложение WindowsForms. Интерфейс главной формы можно увидеть на Рис.2.

Рис.2

Так же необходимо для ввода рациональных дробей диалоговое окно с полями. (См. Рис.3)

Рис.3

Для предохранения от ошибок выводятся дополнительные диалоговые окна. (Рис.4,5)

Рис.4 (при знаменателе = 0) Рис.5 (при пустом выражении)

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

  1. Составление Полиза

Начало

int j = 0;

Stack a = new Stack(s.Length);

object[] Vihod = new object[s.Length];

for (int i = 0; i < s.Length; i++)

if (Char.IsLetter(s[i])) (Char.IsLetter(s[i])) if (Char.IsLetter(s[i]))

if (Char.IsLetter(s[i])) (Char.IsLetter(s[i])) if (Char.IsLetter(s[i]))

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

Vihod[j]=int.Parse(s1); j++;

i--;

Vihod[j] = a.Pop(); j++; a.Push(s[i]);

while (a.Count > 0)

Vihod[j] = a.Pop(); j++;

return Vihod;

Конец

2. Решение по полизу

Начало

object[] s = vihod(textBox1.Text);

int l = s.Length;

for (int i = 0, j = 0; i < l; i++, j++)

if(Char.IsLetter (s[i].ToString(), 0)) (Char.IsLetter(s[i])) if (Char.IsLetter(s[i]))

if (s[i].GetType().Name == "Int32") (Char.IsLetter(s[i])) if (Char.IsLetter(s[i]))

z.Chislit=int.Parse(h.textBox1.Text); z.Znamenat=int.Parse(h.textBox2.Text);

ratcion z = new ratcion((int)s[i]); a[j] = z;

a[j] = z;

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

switch (temp[i])

a[i - 2] = (ratcion)a[i - 2] + (ratcion)a[i - 1];

a[i - 2] = (ratcion)a[i - 2] - (ratcion)a[i - 1];

a[i - 2] = (ratcion)a[i - 2] * (ratcion)a[i - 1];

(ratcion)a[i - 1];

a[i - 2] = (ratcion)a[i - 2] / (ratcion)a[i - 1];

(ratcion)a[i - 1];

textBox3.AppendText(a[0].ToString());

Конец