Мегаобучалка Главная | О нас | Обратная связь  


Детальное описание используемых методов




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

В программе вводится строка символов

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

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

Пример:

 

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

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

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

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

Пример:

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

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

 


Описание программы

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

 

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



 

Интерфейс пользователя

 

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

 

Do you want to look the debugging information? ( y / Any key )

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

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

 

<<<-------------[ Расчёт N :1 ]------------->>>

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

 

1+1+(555/111)/5+(3/3+6/6+9/9)=

 

Или

 


1+1+(555/111)/5+(3/3+6/6+9/9)

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

 

----------------------------

OTBET = 10

----------------------------

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

 

3 AHOBO ? ( Any key / n )

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

 

<<<-------------[ Расчёт N :2 ]------------->>>

И так далее.

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

Детальное описание основной функции

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

В программе вводится строка символов, например : (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]) {

case '+' :b[k]=1; k++; break;

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

case '*' :b[k]=3; k++; break;

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

case '\0' : break; //Завершение сканирования если '\0'

case '(' :b[k]=5; u1++; k++; break;

case ')' :b[k]=6; u2++; k++; break;

default : break;}

 

Если встречаем "=" то завершаем сканирование

 

if(S[i]=='=') { break;} // Завершение сканирования

 

Если количество открытых скобок не равно количеству закрытых скобок то выход

 

if(u1!=u2){goto m1;} // Проверка на кол-во скобок

 

Если всё нормально, то используем функцию Scobka

Scobka(a1,b1,iKol,k);

 

После расчётов выражений в скобках продолжаем расчёт в функции Sumin

 

c=Sumin(a1,b1,iKol,k);

 

Получаем результат и переводим его в целое значение s=(int)c;

 

И выводим результат

 

printf("\r OTBET=[ %i ]\n",s);

 

Рассмотрим работу функций: ChartoInt , Scobka , Sumit .

Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Читайте также:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (118)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.01 сек.)
Поможем в написании
> Курсовые, контрольные, дипломные и другие работы со скидкой до 25%
3 569 лучших специалисов, готовы оказать помощь 24/7