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




 

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

 

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

 

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

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

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

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

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

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

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

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

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

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

Функция void back_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("%f\n",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 memory\n");

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("|\n\b");

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 calculator\n");

textcolor(15);

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

textcolor(15);

gotoxy(37,12);

cprintf("Help\n");

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

textcolor(15);

gotoxy(34,14);

cprintf("Calculator\n");

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

textcolor(15);

gotoxy(33,16);

cprintf("About author\n");

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

textcolor(15);

gotoxy(37,18);

cprintf("Exit\n");

_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("---- ----");

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: