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

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

МІНІСТЕРСТВО ОСВІТИ

РОСІЙСЬКОЇ ФЕДЕРАЦІЇ

Брянський Державний Технічний

Університет

Кафедра "Інформатика та програмне

забезпечення "

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

з програмування

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

Всього аркушів

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

Гольдін Є.Г.

Викладач

Ізраїлів В.Я.

Брянськ

Зміст

Зміст

Введення

Постановка завдання

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

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

Технічні дані для використання

Опис основних функцій

Список використаної літератури

Мова формує наш спосіб мислення

і визначає, про що ми можемо мислити.

Б.Л. Ворф

Введення

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

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

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

Це рішення дозволяє ізолювати мовні особливості від специфіки процесора, на якому виконується результуюча програма. Суворе визначення мови робить його незалежним від будь-яких деталей операційної системи або машини. У той же час програмісти можуть додати до бібліотеки специфічні системні програми, щоб більш ефективно використовувати конкретної особливості машини.

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

Постановка завдання

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

Необхідно розробити зручний користувальницький інтерфейс для роботи з програмою, а так само пункт "Допомога" для ознайомлення з програмою.

Програму розробити на мові C у середовищі Borland C + + 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 () - функція перевірка на термінальний символ.

Функція 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 ("---- ----");



Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
88.2кб. | скачати


Схожі роботи:
Програма Калькулятор
Програма калькулятор 2
Калькулятор на основі мікропроцесора
Калькулятор для матриць
Програма Txtprintcom - резидентна програма для швидкого і зручного друкування виборчого тексту
ОС Windows XP програма Провідник програма Total Commander
Ігрова програма 15
Програма дослідження
Програма Витоки
© Усі права захищені
написати до нас