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

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

скачати

МІНІСТЕРСТВО ОСВІТИ
РОСІЙСЬКОЇ ФЕДЕРАЦІЇ
Брянський Державний Технічний
Університет
Кафедра "Інформатика та програмне
забезпечення "
Курсова робота
з програмування
"Програма - Калькулятор"
Всього аркушів
Студент групи 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 у середовищі 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: \ niver \ \ 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: \ niver \ \ 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 exdivssion");
/*================================= Вікно виводу ============= ================*/
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 exdivssion, 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 ("---- ----");
Додати в блог або на сайт

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

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


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