Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


Программа - калькулятор

Тип Реферат
Предмет Информатика и программирование
Просмотров
521
Размер файла
29 б
Поделиться

Ознакомительный фрагмент работы:

Программа - калькулятор

МИНИСТЕРСТВО ОБРАЗОВАНИЯ

РОССИЙСКОЙ ФЕДЕРАЦИИ

Брянский Государственный Технический

Университет

Кафедра “Информатика и программное

обеспечение”

Курсовая работа

по программированию

“Программа - Калькулятор”

Всего листов

Студент группы 00-ПО2

Гольдин Е.Г.

Преподаватель

Израилев В.Я.

Брянск

Содержание

Содержание............................................................................................... 2

Введение........................................................................................................ 3

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

Метод решения задачи............................................................. 4

Алгоритм работы программы......................................... 5

Технические данные для использования... 6

Описание основных функций...................................... 6

Список используемой литературы....................... 7

Язык формирует наш способ мышления

и определяет, о чем мы можем мыслить.

Б.Л. Ворф

Введение

Сегодня компьютеры все больше и больше внедряются в нашу жизнь. Для их эффективного использования необходимы удобные и практичные программы, которые создаются на языках программирования. Один из самых распространенных языков является Си.

Си - это язык программирования общего назначения, хорошо известный своей эффективностью, экономичностью, и переносимостью. Указанные преимущества Си обеспечивают хорошее качество разработки почти любого вида программного продукта. Использование Си в качестве инструментального языка позволяет получать быстрые и компактные программы. Во многих случаях программы, написанные на Си, сравнимы по скорости с программами, написанными на языке ассемблера. При этом они имеют лучшую наглядность и их более просто сопровождать.

Си сочетает эффективность и мощность в относительно малом по размеру языке. Хотя Си не содержит встроенных компонент языка, выполняющих ввод-вывод, распределение памяти, манипуляций с экраном или управление процессами, тем не менее, системное окружение Си располагает библиотекой объектных модулей, в которой реализованы подобные функции. Библиотека поддерживает многие из функций, которые требуются.

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

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

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

Задача курсовой работы состоит в разработке программы - калькулятора, которая позволяет считать выражения, состоящие из чисел, содержащих до 29 цифр от 0 до 9, постоянные числа pi=3,14159265359 и e=2.718281828459, функции синус (sin), косинус (cos), арксинус (asin), арккосинус (acos) и натуральный логарифм (ln).

Необходимо разработать удобный пользовательский интерфейс для работы с программой, а так же пункт “Помощь” для ознакомления с программой.

Программу разработать на языке C в среде BorlandC++ V. 3.1

Метод решения задачи

Проанализировав поставленную задачу, я пришел к выводу, что необходимо разработать синтаксический анализатор выражений, для реализации которого я использовал алгоритм множественного выбора. При разборе выражение разбивается на составные части – термы, который в свою очередь состоит из факторов. Факторами могут являться числа или подвыражения, состоящего из других факторов. Терм является произведением или отношением факторов. Поочередно, анализируя каждый введенный символ, программа объединяет их в факторы, а готовые факторы в термы, после подсчета которых выдается окончательный ответ. Это правило очень важно, так как должен соблюдаться строгий приоритет выполнения операций, то есть вложенные элементы должны иметь операторы с более высоким приоритетом. Сначала, если есть функции, вычисляется их значение. У арифметических операций приоритет следующий: сначала выполняется возведение в степень, затем умножение, деление, сложение и вычитание. Если выражение содержит скобки, то в первую очередь вычисляется подвыражение во вложенных скобках самого нижнего уровня, а затем по возрастанию уровня.

Алгоритм работы программы

Данная программа позволяет вычислять выражения, содержащие численные значения и некоторые функции. Следовательно, в алгоритме нужно осуществлять проверку на неверно введенные символы и ошибочно нажатые клавиши. Так же необходимо учесть количество открытых и закрытых скобок. Алгоритм программы следующий: включается функция get_token(), в которой каждый вводимый символ проверяется является ли он выходом, выводом ответа, оператором “+”, “-”, “*”, “/”, “^”, цифрой или буквой, в каждом из этих случаев происходит дальнейший рекурсивный разбор введенного выражения.

token_value get_token()

{

char ch;

do

{

if ((ch = getch()) = = ESC) return curr_tok = END;

} while (ch = = ' ');

switch(ch)

{

case ';':

putch(ch);

ps = 'x0';

return curr_tok = PRINT;

case 'r':

ps = 'x0';

gotoxy(1,wherey()+1);

return curr_tok = NEXT;

case '*': case '/': case '+': case '-':

case '(': case ')': case '=': case '^':

dupl_oper_verify(ps, ch);

return curr_tok = ch;

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9': case '.':

ps = 'x0';

ungetch(ch);

get_number();

return curr_tok = NUMBER;

default:

ps = 'x0';

if (isalpha(ch))

{

ungetch(ch);

get_name();

return curr_tok = NAME;

}

error("Invalid symbol");

return curr_tok = PRINT;

}

}

Эта функция является определяющей при распознавании введенного выражения, то есть основополагающей при вычислении ответа.

Технические данные для использования

Для запуска данной программы необходимо наличие персонального компьютера IBM PC/XT с операционной системой MS-DOS. Русификатор для ознакомления с Помощью. Объем оперативной памяти 640 Кбайт. Для запуска программы необходимо сделать текущим каталог с программой Cal_kur.exe и вызвать её на выполнение.

Описание основных функций

Функция get_token() – функция синтаксического разбора введенного выражения.

Функция get_number() – функция ввода числа.

Функция get_name() – функция ввода имени постоянной или функции.

Функция expr() – функция вычисление полного выражения.

Функция term() – функция вычисление слагаемого.

Функция prim() – функция вычисление первичной части выражения.

Функция function_value() – функция вычисление значения функции.

Вывод сообщения об ошибке

Функция error() – функция вывод сообщения об ошибке.

Функция term_sym() – функция проверка на терминальный символ.

Функция voidback_space() – функция исправление ошибки ввода клавишей BACKSPACE.

Функция dupl_oper_verify() – функция проверка дублирования знака операции.

Функция menu() – функция организует меню.

Список используемой литературы

1. Л.И. Шолмов. Язык Си. 1988г.

2. Г. Шилдт. C для профессиональных программистов. 1989г.

3. Б.В. Керниган, Д.М. Ричи. Язык Си. 1995г.


Приложение

#include <dos.h>

#include <math.h>

#include <conio.h>

#include <ctype.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define PI 3.14159265359

#define E 2.718281828459

#define ENTER 13

#define ESC 27

#define BACKSPACE 'b'

// Массив, соответствующий терминальным символам

enum token_value

NAME, NUMBER, END,

PRINT=';', NEXT='r',

PLUS='+', MINUS='-', MUL='*', DIV='/', POWER='^',

ASSIGN='=', LP='(', RP=')';

token_value curr_tok;

// Численная величина

double number_value;

// Строка для хранения введенного имени функции

char *func_name;

// Номер функции в словаре функций

int function_number;

// Словарьфункций

char funcs[43] = "sin cos ln asin acos e pi ";

//

int sch_ch = 0;

// Предыдущая операция

char ps = 'x0';

// Проверка нехватки памяти

void *Malloc(size_t size);

// Функция синтаксического разбора выражения

token_value get_token(void);

// Вводчисла

void get_number(void);

// Вводименифункции

void get_name(void);

// Вычисление полного выражения

double expr(void);

// Вычисление слагаемого

double term(void);

// Вычисление первичной части выражения

double prim(void);

// Вычисление значения функции

double function_value(void);

// Вывод сообщения об ошибке

double error(char *);

// Проверка на терминальный символ

int term_sym(char);

// Исправление ошибки клавишей BACKSPACE

void back_space(int *);

// Проверка дублирования знака операции

void dupl_oper_verify(char, char);

// Окно вывода сообщения

void message();

// Рамка окна

void ramka();

// Окно ввода выражения

void screen_input();

// Окновводаответа

void screen_output();

// Информация

void info();

// Организация меню

void menu(int n);

// Музыка при выходе

void sound_exit();

//Два на два

void dva_x_dva();

/*===============================Основнаячасть============================*/ void main()

FILE *help, *about; int m=1,loop=1,i,pr;

double x;

char s[255],key = -1,*put,*empty_str;

clrscr();

textbackground(0);

textcolor(15);

while(loop)

clrscr();

menu(m);

do

key = getch();

if (key==72 && m>1)

m--;

menu(m);

sound(220);

delay(50);

nosound();

;

if (key==80 && m<4)

m++;

menu(m);

sound(220);

delay(50);

nosound();

;

while (key!=13);

switch(m)

case 1:

clrscr(); if((help=fopen(put="d:\univer\langs\bc\work\Help.txt","r"))==NULL)

printf("Imposible open file %s!n",put);

getch();

break;

return;

i=0;

while(!feof(help))

putchar(getc(help));

i++;

_setcursortype(_NOCURSOR);

getch();

break;

case 2:

clrscr();

ramka();

screen_input();

screen_output();

message();

info();

dva_x_dva();

_setcursortype(_NORMALCURSOR);

textcolor(15);

gotoxy(6,4);

func_name = (char*) Malloc(5);

while (1)

get_token();

if (curr_tok == END) break;

if (curr_tok != PRINT && curr_tok != NEXT)

pr=printf("%fn",expr());

if(pr!=0)

gotoxy(6,4);

printf(" "

" ");

gotoxy(6,4);

free(func_name);

break;

case 3:

clrscr(); if((about=fopen(put="d:\univer\langs\bc\work\Credits.txt","r"))==NULL)

printf("Imposible open file %s!n",put);

getch();

break;

return;

i=0;

while(!feof(about))

putchar(getc(about));

i++;

_setcursortype(_NOCURSOR);

getch();

break;

case 4:

sound_exit();

loop = 0;break;

default:

continue;

/*=========================Проверканехваткипамяти========================*/

void *Malloc(size_t size)

void *p;

if((p=malloc(size))==NULL)

printf(" No memoryn");

exit(1);

return p;

/*==================Функция синтаксического разбора выражения==============*/

token_value get_token()

char ch;

do

if ((ch = getch()) == ESC) return curr_tok = END;

while (ch == ' ');

switch(ch)

case ';':

putch(ch);

ps = 'x0';

return curr_tok = PRINT;

case 'r':

ps = 'x0';

gotoxy(1,wherey()+1);

return curr_tok = NEXT;

case '*': case '/': case '+': case '-':

case '(': case ')': case '=': case '^':

dupl_oper_verify(ps, ch);

return curr_tok = ch;

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9': case '.':

ps = 'x0';

ungetch(ch);

get_number();

return curr_tok = NUMBER;

default:

ps = 'x0';

if (isalpha(ch))

ungetch(ch);

get_name();

return curr_tok = NAME;

error("Invalid symbol");

return curr_tok = PRINT;

/*=====================Проверкадублированиязнакаоперации================*/

void dupl_oper_verify(char ps, char ch)

if (ps=='*' || ps=='/' || ps=='+' || ps=='-' || ps=='^')

error("Operation is duplicated");

ch = ps;

else

putch(ch);

if (ps=='*' || ps=='/' || ps=='+' || ps=='-' || ps=='^') ps = ch;

/*====================================Вводчисла===========================*/

void get_number()

char ch, dec_flag=0;

char *anum;

int i=0;

anum = (char*) Malloc(32);

do

ch=getch();

if (isdigit(ch))

putch(ch);

*(anum+i) = ch;

i++;

else

if (ch == '.')

if (dec_flag) error("Second decimal point is forbidden");

else

dec_flag = 1;

putch(ch);

*(anum+i) = ch;

i++;

else

if (ch == BACKSPACE) back_space(&i);

else

if (!term_sym(ch))

error("Invalid symbol");

ch = BACKSPACE;

while (i < 31 && (isdigit(ch) || ch == '.' || ch == BACKSPACE));

anum[i] = 'x0';

number_value = _atold(anum);

ungetch(ch);

free(anum);

/*=====================Проверка на терминальный символ=====================*/

int term_sym(char ch)

if (ch == '*' || ch == '/' || ch == '+' || ch == '-' ||

ch == '(' || ch == ')' || ch == '=' || ch == '^' ||

ch == ESC || ch == ';' || ch == 'r') return 1;

else return 0;

/*================Исправлениеошибкиклавишей BACKSPACE====================*/

void back_space(int *i)

if (i)

gotoxy(wherex()-1,wherey());

putch(' ');

gotoxy(wherex()-1,wherey());

i--;

/*========================Вводименифункции==============================*/

void get_name()

char ch;

int i=0, j;

do

ch = getch();

if (isalnum(ch))

putch(ch);

*(func_name+i) = ch;

i++;

for (j = 0; j < 42 && strncmp(funcs+j,func_name,i); j += 6);

if (j >= 42)

error("Invalid function");

i--;

else

if (ch == BACKSPACE) back_space(&i);

else

if (!term_sym(ch))

error("Invalid symbol");

ch = BACKSPACE;

while (i < 5 && (isalnum(ch) || ch == BACKSPACE));

*(func_name+i) = 'x0';

function_number = j/6;

ungetch(ch);

/*=====================Вычисление полного выражения========================*/

double expr()

double left = term();

while(1)

switch(curr_tok)

case PLUS:

get_token();

left += term();

break;

case MINUS:

get_token();

left -= term();

break;

default:

if (curr_tok != RP)

// gotoxy(31,8);

gotoxy(23,8);

printf(" ");

gotoxy(23,8);

return left;

/*===========================Вычислениеслагаемого=========================*/

double term()

double left = prim();

while(1)

switch(curr_tok)

case MUL:

get_token();

left *= term();

break;

case DIV:

get_token();

float d = prim();

if (!d) return error("Division by zero");

left /= d;

break;

case POWER:

get_token();

left = pow(left,term());

default:

return left;

/*==================Вычисление первичной части выражения===================*/

double prim()

switch(curr_tok)

case NUMBER:

get_token();

return number_value;

case NAME:

get_token();

return function_value();

case MINUS:

get_token();

return -prim();

case LP:

get_token();

double e = expr();

if (curr_tok != RP) return error("Rigth parentsis expected");

get_token();

return e;

case END:

return 1;

default:

return number_value;

/*=====================Вычисление значения функции========================*/

double function_value()

switch(function_number)

case 0:

return sin(expr());

case 1:

return cos(expr());

case 2:

return log(expr());

case 3:

return asin(expr());

case 4:

return acos(expr());

case 5:

return E;

case 6:

return PI;

/*========================Вывод сообщения об ошибке========================*/

double error(char *s)

int sx, sy;

char *empty_str, *err_message;

err_message = (char*) Malloc(strlen(s)+29);

strcpy(err_message,s);

strcat(err_message,". Press any key to continue!");

empty_str = (char*) Malloc(strlen(s)+29);

memset(empty_str,' ',strlen(s)+28);

empty_str[strlen(s)+28] = 'x0';

sx = wherex();

sy = wherey();

gotoxy(16,22);

textcolor(10);

cprintf("%s",err_message);

sound(440);

delay(550);

nosound();

getch();

gotoxy(16,22);

cprintf("%s",empty_str);

gotoxy(sx,sy);

textcolor(15);

free(err_message);

free(empty_str);

/*==============================Окносообщения============================*/

void message()

textcolor(RED);

gotoxy(15,21);

cprintf("-");

for(int x=16;x<70;x++)

cprintf("-");

cprintf("-");

gotoxy(15,22);

cprintf("|");

gotoxy(70,22);

cprintf("|");

gotoxy(15,23);

cprintf("-");

for(int x1=16;x1<70;x1++)

cprintf("-");

cprintf("-");

gotoxy(3,22);

cprintf("Message:");

/*==================================Рамка=================================*/

void ramka()

textcolor(10);

cprintf("=");

for(int x=2;x<80;x++)

cprintf("=");

cprintf("=");

for(int y=2;y<24;y++)

cprintf("|nb");

cprintf("=");

for(int x1=2;x1<80;x1++)

cprintf("=");

cprintf("=");

gotoxy(80,2);

for(int y1=2;y1<24;y1++)

gotoxy(80,y1);

cprintf("|");

/*=================================Окноввода=============================*/

void screen_input()

textcolor(10);

gotoxy(5,3);

cprintf("-");

for(int x=6;x<76;x++)

cprintf("-");

cprintf("-");

gotoxy(5,4);

cprintf("|");

gotoxy(76,4);

cprintf("|");

gotoxy(5,5);

cprintf("-");

for(int x1=6;x1<76;x1++)

cprintf("-");

cprintf("-");

textcolor(15);

gotoxy(35,2);

cprintf("Input expression");

/*=================================Окновывода=============================*/

void screen_output()

textcolor(10);

gotoxy(22,7);

cprintf("-");

for(int x=22;x<58;x++)

cprintf("-");

cprintf("-");

gotoxy(22,8);

cprintf("|");

gotoxy(59,8);

cprintf("|");

gotoxy(22,9);

cprintf("-");

for(int x1=22;x1<58;x1++)

cprintf("-");

cprintf("-");

textcolor(15);

gotoxy(39,6);

cprintf("Answer");

/*================================Информация===============================*/

void info()

textcolor(10);

gotoxy(13,11);

cprintf("Input expression, used +-*/()^ sin,cos,asin,acos,ln,pi,e");

gotoxy(22,12);

cprintf("Enter ; = output answer Esc exit");

/*====================================Меню================================*/

void menu(int n)

clrscr();

textcolor(3); gotoxy(31,9);

cprintf("Program calculatorn");

textcolor(15);

if (n == 1) textcolor(12); else

textcolor(15);

gotoxy(37,12);

cprintf("Helpn");

if (n == 2) textcolor(12); else

textcolor(15);

gotoxy(34,14);

cprintf("Calculatorn");

if (n == 3) textcolor(12); else

textcolor(15);

gotoxy(33,16);

cprintf("About authorn");

if (n == 4) textcolor(12); else

textcolor(15);

gotoxy(37,18);

cprintf("Exitn");

_setcursortype(_NOCURSOR);

/*===========================Музыка при выходе===========================*/

void sound_exit()

sound(659.3);

delay(310);

sound(784);

delay(310);

sound(721.65);

delay(310);

sound(659.3);

delay(310);

sound(495.9);

delay(310);

sound(587.3);

delay(310);

sound(513.65);

delay(310);

sound(440);

delay(310);

nosound();

/*=================================Два на два=============================*/

void dva_x_dva()

textcolor(1);

gotoxy(32,15);

cprintf("---- ----");

gotoxy(34,16);

cprintf("-- --- -- ----");

gotoxy(32,17);

cprintf("-- - - -- ----");

gotoxy(32,18);

cprintf("---- ----");


Нет нужной работы в каталоге?

Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

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

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
159599
рейтинг
icon
3275
работ сдано
icon
1404
отзывов
avatar
Математика
Физика
История
icon
156450
рейтинг
icon
6068
работ сдано
icon
2737
отзывов
avatar
Химия
Экономика
Биология
icon
105734
рейтинг
icon
2110
работ сдано
icon
1318
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
63 457 оценок star star star star star
среднее 4.9 из 5
Филиал государственного бюджетного образовательного учреждения высшего образования Московской област
Спасибо Елизавете за оперативность. Так как это было важно для нас! Замечаний особых не бы...
star star star star star
РУТ
Огромное спасибо за уважительное отношение к заказчикам, быстроту и качество работы
star star star star star
ТГПУ
спасибо за помощь, работа сделана в срок и без замечаний, в полном объеме!
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

решить 6 практических

Решение задач, Спортивные сооружения

Срок сдачи к 17 дек.

только что

Задание в microsoft project

Лабораторная, Программирование

Срок сдачи к 14 дек.

только что

Решить две задачи №13 и №23

Решение задач, Теоретические основы электротехники

Срок сдачи к 15 дек.

только что

Решить 4задачи

Решение задач, Прикладная механика

Срок сдачи к 31 дек.

только что

Выполнить 2 задачи

Контрольная, Конституционное право

Срок сдачи к 12 дек.

2 минуты назад

6 заданий

Контрольная, Ветеринарная вирусология и иммунология

Срок сдачи к 6 дек.

4 минуты назад

Требуется разобрать ст. 135 Налогового кодекса по составу напогового...

Решение задач, Налоговое право

Срок сдачи к 5 дек.

4 минуты назад

ТЭД, теории кислот и оснований

Решение задач, Химия

Срок сдачи к 5 дек.

5 минут назад

Решить задание в эксель

Решение задач, Эконометрика

Срок сдачи к 6 дек.

5 минут назад

Нужно проходить тесты на сайте

Тест дистанционно, Детская психология

Срок сдачи к 31 янв.

6 минут назад

Решить 7 лабораторных

Решение задач, визуализация данных в экономике

Срок сдачи к 6 дек.

7 минут назад

Вариационные ряды

Другое, Статистика

Срок сдачи к 9 дек.

8 минут назад

Школьный кабинет химии и его роль в химико-образовательном процессе

Курсовая, Методика преподавания химии

Срок сдачи к 26 дек.

8 минут назад

Вариант 9

Решение задач, Теоретическая механика

Срок сдачи к 7 дек.

8 минут назад

9 задач по тех меху ,к 16:20

Решение задач, Техническая механика

Срок сдачи к 5 дек.

9 минут назад
9 минут назад
10 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно