Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Кафедра "Інформаційні системи та мережі"
КУРСОВА РОБОТА
з дисципліни "Проблемно-орієнтовані мови програмування"
на тему:
Навчально - виховна програма
«Операцiї та вирази мови Сi»
студенту групи КН-17
Тема: Навчально - виховна програма «Операцiї та вирази мови Сi»
Завдання: Навчально - виховна програма «Операцiї та вирази мови Сi»
ЗМIСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОНАННЯ
1.
Провести аналiтичний огляд лiтератури по заданій темi.
2.
Розробити алгоритм та графiчну схему програми розв'язування задачi
3.
Написати програму на мовах C /C++.
Вимоги до програми:
1) програма повинна мати меню для вибору режимів її роботи; у меню передбачити вибір типу та розміру даних, введення значень даних з клавіатури або файлу, виведення даних на екран, систему допомоги.
2) програма повинна мати інтерфейс у вигляді вікон та меню для вибору
режимів її роботи;
3) передбачити введення даних з клавіатури та з файлу та виведення
результатів на екран;
4) керування режимами роботи програми виконати за допомогою
клавіатури та миші.
4.
Пiдготувати вхiднi данi для контрольного прикладу.
5.
Реалiзувати та вiдлагодити програми на вказаних мовах програмування.
6.
Оформити записку до курсової роботи згiдно вимог Мiжнародних
стандартiв, дотримуючись такого змiсту:
28.05
-вступ;
-формулювання задачі;
-алгоритми розв'язування задачі;
-методи та засоби розв’язування задачі;
-опис програми на мові C/C++ ;
-технологія програмування, виконання та відлагодження програми;
-інструкція користувачу;
-контрольний приклад та аналіз результатів комп'ютерної реалізації
програми;
-висновки;
-література;
-додатки
ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________
пiдпис студента
Керівник роботи: _______________ Кравець П.О.
ЗМІСТ
Формулювання задачі……………………………….………………1
Методи та засоби розв’язування задачі……………….……….….2
Алгоритм розв'язування задачі………………..…………...………9
Програма та її опис……………………………………..……………19
Технологія програмування, виконання та від лагодження
програми…………………………………………………………....…21
Інструкція користувачеві..……………………………….…………22
Контрольний приклад та аналіз результатів комп’ютерної
реалізації програми……………………………………………...…...24
Вступ
Метою виконання курсової роботи є закріплення теоретичних знань та практичних навичок програмування, набутих при вивченні дисциплін "Основи програмування" та “Проблемно орієнтовані мови програмування”. В ході виконання курсової роботи студенти повинні навчитися самостійно працювати з літературою, розробляти алгоритми, здійснювати їх програмну реалізацію та відлагодження на сучасних обчислювальних системах.
Висновки.
При виконанні курсової роботи я закріпив теоретичніх знання та практичні навички програмування, набуті при вивченні дисциплін "Основи програмування" та “Проблемно орієнтовані мови програмування”. В ході виконання курсової роботи навчився самостійно працювати з літературою, розробляти алгоритми, здійснювати їх програмну реалізацію та відлагодження на сучасних обчислювальних системах.
Список літератури.
Б. Керниган, Д. Ритчи - Язык Си.
Уэйт Митчел и др. Язык Си: руководство для начинающих.
Сергей Сабуров - Языки программирования C и C++.
Стефан Р. Дэвис - C++ Для чайников.
Учебник по программированию на языке Си - http://www.languagec.info/.
Ресурси інтернету: http://www.wikipedia.org/, http://www.realcoding.net/, http://sources.codenet.ru/, http://razy-coding.blogspot.com/ та інші.
Ю. Громов - Программирование на языке C.
Методичні вказівки до курсової роботи з дисциплiни "Проблемно- орієнтовані мови програмування" для студентів спеціальності “Інтелектуальні системи прийняття рішень” / Укл. П.О.Кравець. - Львів: Видавництво Національного університету “Львівська політехніка”, 2005. – 18 с.
ДОДАТОК
Текст програми.
//------------------------------------------------------------------------------
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<conio.h>
#include<dos.h>
#define min 1
#define max 2
#define filenam "help.txt" // iм"я файлу довiдки
//------------------------------------------------------------------------------
union REGS reg;
enum types
{
DELIMITER = 1, VARIABLE, NUMBER, TRIG
};
char *menu_strs[]={"Input>",
"Test",
"Settings>",
"Help",
"About",
"Exit"};
char *s_menu_strs[]={"Set min random value",
"Set max random value",
"Text background color",
"Text color",
"<Back"};
char *i_menu_strs[]={"From keyboard",
"From file",
"<Back"};
char *hint_strs[]={"Ввести вираз",
"Перевiрити вираз",
"Налагодження",
"Допомога",
"Про програму",
"Вийти з програми"};
char *s_hint_strs[]={"Ввести мiнiмальне число для генератора",
"Ввести максимальне число для генератора",
"Вибрати колiр фону",
"Вибрати колiр тексту",
"Повернутись в головне меню програми"};
char *i_hint_strs[]={"Ввести вираз iз клавiатури",
"Зчитати вираз iз файлу",
"Повернутись в головне меню програми"};
char *about_strs[]={"╔═[■]══════════ About ═══════════════╗",
"║ ║",
"║ Курсова робота ║",
"║ з дисциплiни ║",
"║ проблемно - орiєнтованi ║",
"║ мови програмування ║",
"║ ║",
"║ варiант 8 ║",
"║ ║",
"║ тема: ║",
"║ ║",
"║ Навчально - виховна програма ║",
"║ 'Операцiї та вирази мови Сi' ║",
"║ ║",
"║ Автор: Гудима Тарас ║",
"║ ║",
"╚════════════════════════════════════╝"};
int c_val=1,md=0;
int min_rnd=10;
int max_rnd=100;
char vr[300]="(123+<r>)*3+<r>^2";
const int NUMVARS = 26;
class parser
{
char *exp_ptr;
char element[80];
char tok_type;
double vars[NUMVARS];
void process_stage_1( double & result );
void process_stage_2( double & result );
void process_stage_3( double & result );
void process_stage_4( double & result );
void process_stage_5( double & result );
void process_stage_6( double & result );
void get_value( double & result );
void get_element(); //Функция получения элемента
void putback();
void print_error( int error ); //Функция проверки правильности выражения
// double search_vars( char * s );
int isdelim( char c );
public:
parser();
double process_stage_main(char * exp);
};
void about();
void button(char capt[80], int x1, int y1, int x2, int y2, int dbl);
void inputs();
void cursoroff();
void cursoron();
int make_menu(char capt[80],int u_m,int u_n,char *u_capt_strs[],char *u_hint_strs[]);
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// функцiя показу мишi
void show_mouse()
{
reg.x.ax=0x01;
int86(0x33,®,®);
}
// функцiя ховання мишi
void hide_mouse()
{
reg.x.ax=0x02;
int86(0x33,®,®);
}
// функцiя повертає поточну X-координату мишi
int CX()
{
int A;
reg.x.ax=0x03;
int86(0x33,®,®);
A=reg.x.cx/8;
return A;
}
// функцiя повертає поточну Y-координату мишi
int CY()
{
int A;
reg.x.ax=0x03;
int86(0x33,®,®);
A=reg.x.dx/8;
return A;
}
// функцiя повертає поточний стан кнопок мишi
int BP()
{
int A;
reg.x.ax=0x03;
int86(0x33,®,®);
A=reg.x.bx;
return A;
}
// функцiя визначає, чи знаходиться миша в прямокутнику (int x1, int y1, int x2, int y2)
int mousein(int x1, int y1, int x2, int y2)
{
if(CY()>=y1 && CY()<=y2 &&
CX()>=x1 && CX()<=x2) return 1;
return 0;
}
// функцiя паузи, вихiд з якої може здiйснюватись також правим клiком мишi
void wait()
{
while((BP()!=2)&&(!kbhit())) {}
}
// функцiя виводу iнформацiї про програму
void about()
{ int i;
hide_mouse();
clrscr();
for (i=1;i<=17;i++)
{
gotoxy(23,3+i);
printf("%s",about_strs[i-1]);
}
show_mouse();
wait();
}
// функцiя малювання кнопки
// capt[80] - заголовок кнопки
// int x1, int y1, int x2, int y - кординати кнопки
// int dbl - стиль кнопки
void button(char capt[80], int x1, int y1, int x2, int y2, int dbl)
{ int i;
gotoxy(x1,y1);
if (dbl==0) printf("┌");
if (dbl==1) printf("╔");
if (dbl==2) printf("█");
gotoxy(x2,y1);
if (dbl==0) printf("┐");
if (dbl==1) printf("╗");
if (dbl==2) printf("█");
gotoxy(x1,y2);
if (dbl==0) printf("└");
if (dbl==1) printf("╚");
if (dbl==2) printf("█");
gotoxy(x2,y2);
if (dbl==0) printf("┘");
if (dbl==1) printf("╝");
if (dbl==2) printf("█");
for (i=x1+1;i<x2;i++)
{
gotoxy(i,y1);
if (dbl==0) printf("─");
if (dbl==1) printf("═");
if (dbl==2) printf("▀");
gotoxy(i,y2);
if (dbl==0) printf("─");
if (dbl==1) printf("═");
if (dbl==2) printf("▄");
}
for (i=y1+1;i<y2;i++)
{
gotoxy(x1,i);
if (dbl==0) printf("│");
if (dbl==1) printf("║");
if (dbl==2) printf("█");
gotoxy(x2,i);
if (dbl==0) printf("│");
if (dbl==1) printf("║");
if (dbl==2) printf("█");
}
gotoxy(x1+3,y1+1);
printf("%s",capt);
}
// функцiя малювання псевдографiчного вiкна
// capt[80] - заголовок вiкна
// int x1, int y1, int x2, int y - кординати вiкна
// int dbl - стиль вiкна
void window(char capt[80], int x1, int y1, int x2, int y2, int dbl)
{ int i;
gotoxy(x1,y1);
if (dbl==0) printf("┌"); else printf("╔");
gotoxy(x2,y1);
if (dbl==0) printf("┐"); else printf("╗");
gotoxy(x1,y2);
if (dbl==0) printf("└"); else printf("╚");
gotoxy(x2,y2);
if (dbl==0) printf("┘"); else printf("╝");
for (i=x1+1;i<x2;i++)
{
gotoxy(i,y1);
if (dbl==0) printf("─"); else printf("═");
gotoxy(i,y1+2);
if (dbl==0) printf("─"); else printf("═");
gotoxy(i,y2);
if (dbl==0) printf("─"); else printf("═");
}
for (i=y1+1;i<y2;i++)
{
gotoxy(x1,i);
if (dbl==0) printf("│"); else printf("║");
gotoxy(x2,i);
if (dbl==0) printf("│"); else printf("║");
}
gotoxy(x2-6,y1+1);
if (dbl==0) printf("│_│■│X"); else printf("║_║■║X");
gotoxy(x2-6,y1);
if (dbl==0) printf("┬─┬─┬"); else printf("╦═╦═╦");
gotoxy(x2-6,y1+2);
if (dbl==0) printf("┴─┴─┴─┤"); else printf("╩═╩═╩═╣");
gotoxy(x1,y1+2);
if (dbl==0) printf("├"); else printf("╠");
gotoxy(x1+2,y1+1);
printf("%s",capt);
}
void inputs()
{ FILE *f;
int doexit=1;
char filename[80];//,fnm[80];
clrscr();
c_val=1;
while(doexit)
{
c_val=make_menu("Виберiть спосiб введення даних",c_val,3,i_menu_strs,i_hint_strs);
switch(c_val)
{
case 1: hide_mouse();
clrscr();
button("",15,12,65,14,0);
gotoxy(16,10);
printf("Введiть вираз (<r>=random int)");
window("Введення виразу",10,5,70,20,1);
gotoxy(16,13);
cursoron();
scanf("%s",vr);
break;
case 2: hide_mouse();
clrscr();
button("",15,12,65,14,0);
gotoxy(16,10);
printf("Введiть iм'я файлу для завантаження виразу");
window("Завантаження виразу",10,5,70,20,1);
gotoxy(16,13);
cursoron();
scanf("%s",filename);
f=fopen(filename,"rt");
fgets(vr,80,f);
fclose(f);
break;
case 3: doexit=0;
break;
break;
}
cursoroff();
}
}
void cursoroff()
{
_AH=0x1;
_CH=0x20;
geninterrupt(0x10);
}
void cursoron()
{
_AH=0x1;
_CH=0x6;
_CL=0x7;
geninterrupt(0x10);
}
// st1 - рядок
// st2 - рядок для замiни його на випадкове число
void replacestr(char *st1, char *st2)
{
char *j,*u,*k,*st3;
int i=0;
u=strstr(st1,st2);
if (*st2!=*st3)
while(u)
{
itoa(random(max_rnd-min_rnd)+min_rnd+1,st3,10);
k=strchr(st1,'\0');
if (strlen(st2)>strlen(st3))
for(j=u;j!=k;*j=*(j+((strlen(st2)-strlen(st3)))),j++);
if (strlen(st2)<strlen(st3))
for(j=k;j!=u;*(k+((strlen(st3)-strlen(st2))-i))=*j,j--,i++);
strncpy(u,st3,strlen(st3));
k=NULL;i=0;
u=strstr(st1,st2);
}
};
void calc()
{ char tvr[80];
int inp;
float cvr;
parser ob; //ob - змiнна типу parser
strcpy(tvr,vr);
replacestr(tvr,"<r>");
clrscr();
gotoxy(16,10);
printf("Вираз: %s",tvr);
window("Тестування виразу",10,5,70,20,1);
button("",15,12,65,14,0);
gotoxy(16,13);
cursoron();
scanf("%f",&cvr);
cursoroff();
clrscr();
window("Результат",20,8,60,16,1);
if (cvr==ob.process_stage_main(tvr))
{
gotoxy(35,13);
printf("Правильно!");
}
else
{
gotoxy(33,12);
printf("Неправильно...");
gotoxy(25,14);
printf("Правильна вiдповiдь: %f",ob.process_stage_main(tvr));
}
wait();
}
void rand_inp(int what)
{ clrscr();
gotoxy(16,10);
if (what==min) printf("Введiть мiнiмальне значення генератора (%d):",min_rnd);
else printf("Введiть максимальне значення генератора (%d):",max_rnd);
window("Введення",10,5,70,20,1);
button("",15,12,65,14,0);
gotoxy(16,13);
cursoron();
if (what==min) scanf("%d",&min_rnd);
else scanf("%d",&max_rnd);
cursoroff();
}
void settings()
{ int doexit=1,bcol=0,tcol=15;
c_val=1;
while(doexit)
{
c_val=make_menu("Налагодження програми",c_val,5,s_menu_strs,s_hint_strs);
switch(c_val)
{
case 1: rand_inp(min);
break;
case 2: rand_inp(max);
break;
case 3: bcol+=1;
//if (bcol==tcol) bcol+=1;
if (bcol>15) bcol=0;
textbackground(bcol);
clrscr();
break;
case 4: tcol+=1;
//if (bcol==tcol) tcol+=1;
if (tcol>15) tcol=0;
textcolor(tcol);
clrscr();
break;
case 5: doexit=0;
break;
break;
}
}
}
// унiверсальна функцiя для створення меню користувача
int make_menu(char capt[80],int u_m,int u_n,char *u_capt_strs[],char *u_hint_strs[])
{
int i;
int x,mx,my,mb;
hide_mouse();
clrscr();
window(capt,2,1,79,25,1);
for (i=0;i<u_n;i++)
{
gotoxy(36,i*3+5);
printf("%s",u_hint_strs[i]);
}
md=BP();
show_mouse();
show_mouse();
while(1)
{
//clrscr();
if(u_m<1) u_m=u_n;
if(u_m>u_n) u_m=1;
for (i=1;i<=u_n;i++)
if (u_m!=i)
{
button(u_capt_strs[i-1],7,i*3+1,32,i*3+3,0);
gotoxy(5,i*3+2);
printf(" ");
}
else
{
button(u_capt_strs[i-1],7,i*3+1,32,i*3+3,1);
gotoxy(5,i*3+2);
printf(">");
}
gotoxy(20,23);
printf("Вираз: %s",vr);
if (BP()==0)
md=0;
for (i=1;i<=u_n;i++)
{
if (mousein(6,i*3,31,i*3+2)==1)
{
u_m=i;
//md=1;
//button("",7,i*3+1,32,i*3+3,2);
//delay(20);
//button("",7,i*3+1,32,i*3+3,1);
//delay(20);
if ((BP()==1)&&(md!=1)) return u_m;
}
}
if (kbhit())
{
switch(getch())
{
case 33: u_m=1;
break;
case 34: u_m=u_n;
break;
case 72: u_m--;
break;
case 80: u_m++;
break;
case 77: u_m++;
break;
case 75: u_m--;
break;
case 13: hide_mouse();
return u_m;
break;
}
}
}
hide_mouse();
}
// показ довiдки з конкретної позицiї
// pos - позицiя, на яку перейти
// *f - файлова змiнна
// t[80] - темп-змiнна
// i - для циклiв
int help_showfrom(int pos)
{ FILE *f;
char t[80];
int i;
f=fopen(filenam,"rt");
i=1;
while (i!=pos)
{
fgets(t,79,f);
i+=1;
}
clrscr();
for (i=1;i<=24;i++)
{
fgets(t,79,f);
printf("%s",t);
if (feof(f))
{
fclose(f);
return 1;
}
}
fclose(f);
return 0;
}
// функцiя показу довiдки
// d - умова для виходу
// ps - позицiя в текстi довiдки
// psl - попередня позицiя в текстi довiдки
// (необхiдна для вiдновлення попередньої позицiї в файлi при виходi за його межi)
void help()
{ int b,ps,psl;
b=0;
ps=1;
psl=1;
hide_mouse();
help_showfrom(ps);
gotoxy(1,25);
printf("████████████████ ''/'' - перемiщення вверх/вниз Esc - вийти ████████████████");
while (b==0)
{
switch(getch())
{
case 72: ps--;
break;
case 80: ps++;
break;
case 77: ps++;
break;
case 75: ps--;
break;
case 27: b=1;
break;
}
if (ps!=psl)
{
if (ps<=0) ps=1;
if (help_showfrom(ps)!=0) ps=psl;
gotoxy(1,25);
printf("████████████████ ''/'' - перемiщення вверх/вниз Esc - вийти ████████████████");
psl=ps;
}
}
}
// головна функцiя
void main()
{
randomize();
textmode(C80); // текстовий режим 80x25x16 кольорiв
cursoroff();
// show_mouse();
clrscr();
// c_val=1;
while(1)
{
c_val=make_menu("Головне меню",c_val,6,menu_strs,hint_strs);
switch(c_val)
{
case 6: exit('0');
break;
case 5: about();
break;
case 1: inputs();
break;
case 2: calc();
break;
case 3: settings();
break;
case 4: help();
break;
}
c_val=1;
}
hide_mouse();
}
////////////////////////////////////////////////////////////////
////////////////////// PARSING FUNCTIONS ///////////////////////
////////////////////////////////////////////////////////////////
// опис конструктора
parser::parser()
{
int i;
exp_ptr = NULL; //те саме, що й exp_ptr=0
for ( i = 0; i < NUMVARS; i++ ) vars[i] = 0.0; //обнулення масива vars[]
}
//функцiя обчислення результату
double parser::process_stage_main( char * exp )
{
double result; //змiнна, в яку буде записаний результат
exp_ptr = exp;
get_element(); //функцiя отримання елементу
if ( ! * element )
{
print_error( 2 );
return 0.0;
}
process_stage_1( result );
if ( * element )
{
print_error( 0 );
}
return result;
}
void parser::process_stage_1( double & result )
{
int slot;
char ttok_type;
char temp_element[80];
if ( tok_type == VARIABLE )
{
strcpy( temp_element, element );
ttok_type = tok_type;
slot = toupper( * element ) - 'A';
get_element(); //отримуємо елемент
if ( * element != '=' )
{
putback();
strcpy( element, temp_element );
tok_type = ttok_type;
}
else
{
get_element(); //отримуємо елемент
process_stage_2( result );
vars[slot] = result;
return;
}
}
process_stage_2( result );
}
void parser::process_stage_2( double & result )
{
register char op; //темп - змiнна
double temp;
process_stage_3( result );
while ( ( op = * element ) == '+' || op == '-' )
{
get_element(); //отримуємо елемент
process_stage_3( temp );
switch ( op ) //switch - оператор вибору
{
case '-': //якщо op == '-'
result = result - temp;
break;
case '+': //якщо op == '+'
result = result + temp;
break;
}
}
}
void parser::process_stage_3( double & result )
{
register char op; //темп - змiнна
double temp;
process_stage_4( result );
while ( ( op = * element ) == '*' || op == '/' || op == '%' )
{
get_element(); //отримуємо елемент
process_stage_4( temp );
switch ( op ) //switch - оператор вибору
{
case '*': //якщо op == '*'
result = result * temp;
break;
case '/': //якщо op == '/'
result = result / temp;
break;
case '%': //якщо op == '%'
result = ( int )result % ( int )temp;
break;
}
}
}
void parser::process_stage_4( double & result )
{
double temp, ex;
process_stage_5( result );
if ( * element == '^' )
{
get_element(); //отримуємо елемент
process_stage_4( temp );
ex = result;
result = pow( ex, temp );
}
}
void parser::process_stage_5( double & result )
{
register char op;
op = 0;
if ( ( tok_type == DELIMITER ) && ( * element == '+' || * element == '-' ) )
{
op = * element;
get_element(); ///отримуємо елемент
}
process_stage_6( result );