Учебная работа. Курсовая работа: Обратная пользовательская запись в языке Си

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Контрольные рефераты

Учебная работа. Курсовая работа: Обратная пользовательская запись в языке Си

ОГЛАВЛЕНИЕ

Введение

1. анализ имеющихся способов решения задачки

2. Детализированное описание применяемых способов

3. Описание программки

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

3.2 интерфейс юзера

3.3 Детализированное описание главный функции

3.4 Детализированное описание функции ChartoInt

3.5 Детализированное описание функции Scobka

3.6 Детализированное описание функции Sumin

3.7 Общая структура программного средства

4. Блок схема программки

4.1 Основная блок схема

4.2 Блок схема функции ChartoInt

4.3 Блок схема функции Sumin

4.4 Блок схема функции Scobka

5. Заключение

6. Программная поддержка

7. Перечень литературы

8. приложение 1

9. Приложение 2

Введение

Язык «C» является всепригодным языком программирования. язык «C» — это язык относительно «низкого уровня». Это значит, что «C» имеет дело с объектами такого же вида, что и большая часть ЭВМ , а конкретно, с знаками, числами и адресами. Они могут объединяться и пересылаться средством обыденных арифметических и логических операций, осуществляемых настоящими ЭВМ .

В языке «C» отсутствуют операции, имеющие дело конкретно с составными объектами, таковыми как строчки знаков, огромного количества, списки либо с массивами, рассматриваемыми как целое. язык не предоставляет никаких остальных способностей распределения памяти, не считая статического определения и механизма стеков, обеспечиваемого локальными переменных функций; тут нет ни «куч»(heap), ни «сборки мусора». В конце концов, сам по для себя «C» не обеспечивает никаких способностей ввода-вывода: тут нет операторов read либо write и никаких интегрированных способов доступа к файлам. Все эти механизмы высочайшего уровня должны обеспечиваться очевидно вызываемыми функциями.

Аналогично, язык «C» дает лишь обыкновенные, поочередные конструкции потоков управления: проверки, циклы, группирование и подпрограммы, но не мультипрограммирование, параллельные операции, синхронизацию либо сопрограммы. язык «C» не является языком со серьезными типами в смысле паскаля.

В конце концов, язык «C», подобно хоть какому другому языку, имеет свои недочеты. Некие операции имеют неудачное старшинство; некие разделы синтаксиса могли бы быть лучше; существует несколько версий языка, различающихся маленькими деталями. Тем не наименее, язык «C» зарекомендовал себя как только действенный и выразительный язык для широкого контраста применений программирования. [1]

одной из основных обстоятельств, лежащих в базе возникновения языков программирования «высочайшего уровня», явились вычислительные задачки, требующие огромных объёмов рутинных вычислений. Потому к языкам программирования предъявлялись требования наибольшего приближения формы записи вычислений к естественному языку арифметики. В данной нам связи одной из первых областей системного программирования сформировалось исследование методов трансляции выражений. Наибольшее распространение получил способ трансляции при помощи оборотной пользовательской записи. [4] способы решения задачки использования оборотной пользовательской записи детально рассмотрены в данной курсовой работе.

1. анализ имеющихся способов решения задачки

Существует огромное количество решений данной задачки. Сейчас нам понятно 3 способа решения задачки. 1 – с внедрением стека, 2 — это, так называемое двойное внедрение стека, 3 — способ внедрение массивов.

Для сопоставления приведу один из примеров использования стека для решения данной задачки:


Разумеется, что одним из недочетов данного способа является сложность использования способов, которые без преувеличения можно именовать устаревшими.

Потому что сейчас стек употребляется с помощью классов. Разглядим пример использования стека с помощью классов:

class Stek

{ int something;

public:

Stek(); // конструктор

~Stek(); // деструктор

void pop (int); // поместить

int push(void); // вынуть

void print(); // распечатать

}

Внедрение стека отлично вследствии того, что в ассемблере не отлично использовались массивы и имеются регистры стека:

ss

сегментный регистр стека,

sp
/
esp

регистр указателя стека,

bd
/
ebd

регистр указателя базы кадра стека,

Как следует, реализация массивов через стек была весьма эффективна. сейчас же эта неувязка не критична для разработки программ, потому что производительность ЭВМ велика. В С++ «свободно» употребляются массивы. В языках «среднего» и «высочайшего» уровня внедрение стека не принесёт важного убыстрения, а даже может замедлить выполнение программки. Вследствии того, что поддежка реализация стека на аппаратном уровне в языке Си ++ отсутствует, команды pop и push реализуются через функции либо классы(см. пример использования стека с помощью классов).[6] К тому же внедрение массивов наиболее комфортно, чем использования стека, а так же просто переносимо на остальные языки программирования и достаточно просто для осознания.


2. Детализированное описание применяемых способов

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

В программке вводится строчка знаков

Пример:
(1+1)/2+12/(8/2)=

Программке нужно оценить состав строчки. Это реализуется через разные циклы, которые определяют, является ли i-символ цифрой либо знаком, потом скомпоновывают числа в числа и конечным результатом этих действий, являются 2 массива.

Пример:

Дальше программка обязана распознать все выражения в скобках и конвертировать их в числовое

Пример:
…+(1+2/2)/… -…+2/…

Для решения данной задачки, нужно употреблять сдвиги (детально описано в разделе 3.5)

Когда же все скобки будут преобразованы в числовые значения, программка начинает преобразовывать все выражения «*» — умножение, потом «/» — деление, потом «+» — сложение и, в конце концов «-» – вычитание в числовые значения.

Пример:

И в конце программка выдаёт ответ.

Детально работа функций описана в последующем разделе.


3. Описание программки

3.1

Постановка

задачки

С клавиатуры вводится математическое выражение в виде строчки знаков а) числовых – 1234567890 и б) особых */+-()= . В конце выражения ставится ‘=’ либо ничего(/0 – терминатор ноль). Программка оценивает выражение и если ошибок нет — выдаёт целочисленный итог.

3.2 интерфейс юзера

Сначала программки выводится диалог выбора режима работы: отладочный либо обычный:







Если же будет нажата неважно какая кнопка не считая ‘y’, то включится обычный режим работы. Отладочный режим рассматриваться не будет.

Дальше показывается логотип и информация о создателе. Опосля всего этого выводится строчка нумерации расчёта:



И на последующей строке юзер пишет некое выражение:

Либо

Программка оценит выражение и в случае отсутствия ошибок, выдаст целочисленный итог:


и выведет диалог повторения:








Если юзер нажмёт ‘n’ либо ‘N’, то работа программки закончится. Если же будет нажата неважно какая иная кнопка, то цикл повторится:



И так дальше.

Вывод результатов проиллюстрирован в приложении 2.

3.3 Детализированное описание главный функции

Перейдём конкретно к рассмотрению способов решения данной задачки.

В программке вводится строчка знаков, к примеру : (1+1)/2+12/(8/2)=

программка сканирует данную строку при помощи scanf(«%s»,&S);

Дальше нужно найти состав строчки:


for (i=0; i<(m+1); i++){

if (S[i]==’1′){ buf[i]=1;l++;}

else if (S[i]==’2′){ buf[i]=2;l++;}

else if (S[i]==’3′){ buf[i]=3;l++;}

else if (S[i]==’4′){ buf[i]=4;l++;}

else if (S[i]==’5′){ buf[i]=5;l++;}

else if (S[i]==’6′){ buf[i]=6;l++;}

else if (S[i]==’7′){ buf[i]=7;l++;}

else if (S[i]==’8′){ buf[i]=8;l++;}

else if (S[i]==’9′){ buf[i]=9;l++;}

else if (S[i]==’0′){ buf[i]=0;l++;}

else if (l!=0)

При помощи функции ChartoInt
преобразуем набор цифр в число, пример: 1,2,4 в 124.

a[iKol]=ChartoInt
(p,i,l);

iKol++; //счетчик кол-ва чисел

l=0;//обнуление счетчика длинны числа

}}

Дальше проводится вылавливание знака

switch (S[i]) {

caseactiveXb[k]=1; k++; break;

case ‘-‘ :b[k]=2; k++; break;

caseactiveXb[k]=3; k++; break;

case ‘/’ :b[k]=4; k++; break;

case ‘