- •1 Введение
- •2 Сравнительный анализ языков высокого уровня Си и Паскаль
- •2.1 Алфавит и лексическая структура языков
- •2.2 Служебные слова
- •2.3 Идентификаторы
- •2.4 Комментарии
- •2.5 Структура программ
- •2.6 Типы данных
- •2.7 Массивы
- •2.8 Строки
- •2.9 Множества
- •2.10 Записи
- •2.11 Операции
- •2.12 Операторы ветвления
- •2.13 Операторы цикла
- •2.14 Заключение
- •3 Постановка задачи
- •3.1. Алгоритм решения поставленной задачи
- •4 Реализация проекта
- •4.1 Кнопка «Новая игра»
- •4.2 Кнопка «Демонстрация игры»
- •4.3 Кнопка «Рекорды»
- •4.4 Кнопка «о программе»
- •4.5 Кнопка «Выход»
- •4.6 Пользовательская библиотека «drawing.H»
- •5 Заключение
- •Список использованных источников
- •Приложение а (справочное)
5 Заключение
По результатам проделанной работы можем сделать следующие выводы:
проведен сравнительный анализ языков программирования высокого уровня Си и Паскаль и сделан вывод, что для реализации курсового проекта эффективнее использовать язык программирования Си;
была поставлена задача провести сравнительный анализ языков программирования Си и Паскаль, а также разработать игру «Ханойская башня» с возможностью демонстрации для трех дисков;
разработан и реализован алгоритм игры «Ханойская башня», для демонстрации игры реализован рекурсивный алгоритм «Ханойская башня»;
создана компьютерная программа «Ханойская башня»;
проведены отладка и тестирование программы.
Список использованных источников
Введение – История компьютера [Электронный ресурс] – URL: http://chernykh.net/content/view/12/36 (дата обращения: 19.05.2012).
Паскаль (язык программирования) – Википедия [Электронный ресурс]: энциклопедия. – URL: http://ru.wikipedia.org/wiki/Паскаль_(язык_программирования) (дата обращения: 19.05.2012).
Си (язык программирования) – Википедия [Электронный ресурс]: энциклопедия. – URL: http://ru.wikipedia.org/wiki/Си_(язык_программирования) (дата обращения: 19.05.2012).
Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка / Пер. с англ., предисл. И послесл. Д. Б. Подшивалова. – М: Финансы и статистика, 1982. – 151 с., ил.
Брайан Керниган, Деннис Ритчи. Язык программирования C. – Москва: Вильямс, 2006. — 304 с.
Строки в С и С++ [Электронный ресурс] – URL: http://www.rsdn.ru/article/cpp/cstr.xml (дата обращения: 19.05.2012).
Разветвляющиеся алгоритмы. Оператор If [Электронный ресурс] - URL: http://informatics.mccme.ru/moodle/mod/book/view.php?id=533&chapterid=251 (дата обращения: 20.05.2012).
Оператор выбора CASE [Электронный ресурс] – URL: http://informatics.mccme.ru/moodle/mod/book/view.php?id=533&chapterid=254 (дата обращения: 20.05.2012).
Оператор ветвления – Википедия [Электронный ресурс]: энциклопедия. – URL: http://ru.wikipedia.org/wiki/Оператор_ветвления (дата обращения: 20.05.2012).
Цикл (программирование) – Википедия [Электронный ресурс]: энциклопедия. – URL: http://ru.wikipedia.org/wiki/Цикл_(программирование) (дата обращения: 20.05.2012).
Визуальный словарь [Электронный ресурс]: словарь. – URL: http://vslovar.org.ru
Приложение а (справочное)
Исходный код программы
Файл kurs.h
#include<graphics.h>
#include<stdlib.h>
#include<math.h>
#include<dos.h>
#include<mem.h>
#include <time.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<ctype.h>
#define st_w getmaxx()/6
#define ry (rx)/3
#define hm 75//высота пунктов меню
#define y1m 100
extern int mas[3][10],disk_kol[3],count,h,m;
extern double tog;
void menu();
void info();
void demo();
void newgame();
void hanoy(int,int,int,int);
void perenos(int,int);
void game();
int win();
void getrecords();
void setrecords();
void records();
void show_records();
void input_str(char *);
void timer(int);
void pm(int,int);
void back();
void resst();
void cylinder(int,int,int,int,int,int);
void disk_add(int,int);
void disk_del();
void out_disk(int);
void out_from(int);
void out_to(int);
void out_count(int);
void strelka(int,int);
Файл hanoy.cpp
#include "kurs.h"
#include"drawing.h"
#include"records.h"
int mas[3][10],disk_kol[3],count,h,m;
void main(){int gd=9,gm=2;
initgraph(&gd,&gm,"");
setbkcolor(8);
setrgbpalette(2,19,65,108);
setrgbpalette(5,20,200,100);
getrecords();
menu();
}
void menu(){int key,sel=0;
settextjustify(CENTER_TEXT,CENTER_TEXT);
cleardevice();
setcolor(14);
settextstyle(0,0,4);
outtextxy(getmaxx()/2,60,"Ханойcкая башня");
settextstyle(0,0,2);
for(int i=0;i<5;i++)pm(i,0);
pm(0,1);
for(;;){
key=getch();
pm(sel,0);
switch(key){
case 80:{
if(sel<4)sel++;else sel=0;
break;}
case 72:{
if(sel>0)sel--;else sel=4;
break;}
case 13:{
switch(sel){
case 0:{game();break;}
case 1:{demo();break;}
case 2:{show_records();break;}
case 3:{info();break;}
case 4:{setrecords();closegraph();getch();exit(1);}
}
break;
}
}
pm(sel,1);
}
}
void info(){
char str[80];int x=75,y=120;
cleardevice();
setcolor(14);
settextstyle(0,0,4);
outtextxy(getmaxx()/2,50,"О программе");
settextstyle(0,0,1);
settextjustify(LEFT_TEXT,CENTER_TEXT);
FILE *f1=fopen("info.txt","rt");
for(;!feof(f1);x+=strlen(str)*8+16){
fscanf(f1,"%s",str);
if(x>getmaxx()-strlen(str)*8-50){x=50;y+=16;}
outtextxy(x,y,str);}
fclose(f1);
settextstyle(0,0,4);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(getmaxx()/2,y+50,"Управление:");
settextstyle(0,0,1);
settextjustify(LEFT_TEXT,CENTER_TEXT);
outtextxy(getmaxx()/2,y+88,"Взять диск:стрелка вверх");
outtextxy(getmaxx()/2,y+104,"Положить диск:стрелка вниз");
outtextxy(getmaxx()/2,y+120,"Сменить колышек:стрелки влево и вправо");
outtextxy(50,getmaxy()-30,"Выполнил: Одинецкий Анатолий, 841");
getch();
menu();
}
void game(){char str[20]="";
int st,key,up=0,from;
cleardevice();
setcolor(14);
outtextxy(getmaxx()/2,40,"Введите количество дисков от 3 до 10");
outtextxy(getmaxx()/2,80,"и нажмите Enter");
do {input_str(str);
m=atoi(str);}
while(m<3||m>10);
newgame();
st=0;
strelka(st,2);
key=getch();
for(timer(0);!win()&&(key=getch())!=27;)
switch(key){
case 80://вниз
{
if(up&&st!=from&&(disk_kol[st]==0||
mas[st][disk_kol[st]-1]>mas[from][disk_kol[from]-1]))
{
out_to(st);
perenos(from,st);
up=0;
}
break;}
case 72://вверх
{
if(disk_kol[st]){
from=st;
up=1;
out_from(from);
out_disk(mas[from][disk_kol[from]-1]);}
break;}
case 75://влево
{
strelka(st,0);
st--;
if(st<0)st=2;
strelka(st,2);
break;}
case 77://вправо
{
strelka(st,0);
st++;
if(st>2)st=0;
strelka(st,2);
break;}
}
menu();
}
void newgame(){
h=(getmaxy()-210)/m;
setmem(mas,30*sizeof(int),0);
setmem(disk_kol,3*sizeof(int),0);
count=0;
cleardevice();
back();
for(int i=0;i<m;i++){
mas[0][i]=m-i;
disk_add(0,mas[0][i]);
disk_kol[0]++;}
}
void perenos(int from,int to){
disk_kol[from]--;
mas[to][disk_kol[to]]=mas[from][disk_kol[from]];
mas[from][disk_kol[from]]=0;
count++;
disk_add(to,mas[to][disk_kol[to]]);
disk_kol[to]++;
disk_del(from,mas[to][disk_kol[to]-1]);
out_count(count);
}
int win(){
if(disk_kol[1]==m||disk_kol[2]==m){
timer(1);
cleardevice();
setcolor(14);
settextstyle(0,0,4);
outtextxy(getmaxx()/2,50,"Победа");
records();
return 1;}
else return 0;
}
void demo(){
m=3;
newgame();
setcolor(7);
outtextxy(getmaxx()/2,70,"Для продолжения нажмите любую кнопку");
hanoy(m,0,1,2);
getch();
menu();
}
void hanoy(int num,int from,int temp,int to){
if(num>0){
hanoy(num-1,from,to,temp);
getch();
out_from(from);
out_to(to);
out_disk(num);
perenos(from,to);
hanoy(num-1,temp,from,to);}
}
Файл drawing.h
#include "kurs.h"
void pm(int nomer,int nach){
const char *mas_menu[5]={"Новая игра","Демонстрация игры","Рекорды","О программе","Выход"};
if(nach){
setcolor(4);
setfillstyle(1,14);}
else{
setcolor(1);
setfillstyle(1,15);}
bar3d(getmaxx()/2-200,y1m+hm*nomer,getmaxx()/2+200,y1m+hm*(1+nomer)-hm/2,0,1);
outtextxy(getmaxx()/2,y1m+hm*nomer+hm/4,mas_menu[nomer]);
}
void back(){
setcolor(8);
setfillstyle(1,3);
settextstyle(0,0,1);
bar(0,10,getmaxx(),30);
outtextxy(110,20,"Перенести диск:");
outtextxy(270,20,"с ");
outtextxy(340,20,"колышка на");
outtextxy(500,20,"Перекладываний:");
setcolor(5);
setfillstyle(3,5);
bar3d(0,getmaxy()-85,getmaxx(),getmaxy(),0,1);
for(int i=0,y=getmaxy()-50;i<=5;i+=2,setcolor(5)){
int x=(i+1)*st_w;
setfillstyle(1,5);
fillellipse(x,y,st_w-5,(st_w-5)/3);
cylinder(x,y,10,1,3,20+m*h);}
}
void resst(int x, int y){
setcolor(1);
ellipse(x,y,180,360,10,3);
line(x-10,y,x-10,getmaxy()-70-m*h);
line(x+10,y,x+10,getmaxy()-70-m*h);
setfillstyle(1,3);
floodfill(x,y,1);
}
void cylinder(int x,int y,int rx,int color1,int color2,int height=0){
if(!height)height=h;
setcolor(color1);
setfillstyle(1,color2);
ellipse(x,y,180,360,rx,ry);
ellipse(x,y-height,0,180,rx,ry);
line(x-rx,y,x-rx,y-height);
line(x+rx,y,x+rx,y-height);
floodfill(x,y-height,color1);
ellipse(x,y-height,180,360,rx,ry);
}
void disk_add(int st,int num){
char nomer[3];
int x=(2*st+1)*st_w,
rx=10+num*(st_w-25)/m,
y=getmaxy()-50-h*disk_kol[st];
setcolor(0);
setfillstyle(1,0);
bar(x-rx,y-h-ry,x+rx,y);
cylinder(x,y,rx,14,2);
resst(x,y-h);
setcolor(15);
itoa(num,nomer,10);
outtextxy((2*st+1)*st_w,y+ry-h/2,nomer);
}
void disk_del(int st,int num){
int rx=10+num*(st_w-25)/m,
x=(2*st+1)*st_w,
y=getmaxy()-50-h*disk_kol[st];
cylinder(x,y,rx,0,0);
if(!disk_kol[st]){
setcolor(5);
line(x-st_w,getmaxy()-85,x+st_w,getmaxy()-85);
setfillstyle(3,5);
floodfill(x,y,5);
setfillstyle(1,5);
fillellipse(x,y,st_w-5,(st_w-5)/3);}
else{
rx=10+mas[st][disk_kol[st]-1]*(st_w-25)/m;
setcolor(14);
setfillstyle(1,2);
fillellipse(x,y,rx,ry);}
resst(x,y);
}
void out_disk(int disk){
char str[3];
setfillstyle(1,3);
bar(170,10,192,30);
setcolor(5);
itoa(disk,str,10);
outtextxy(181,20,str);
}
void out_from(int from){
char str[2];
setfillstyle(1,3);
bar(278,10,290,30);
bar(385,10,395,30);
setcolor(5);
itoa(from+1,str,10);
outtextxy(284,20,str);
}
void out_to(int to){
char str[2];
setfillstyle(1,3);
bar(385,10,395,30);
setcolor(5);
itoa(to+1,str,10);
outtextxy(390,20,str);
}
void out_count(int i){
char str[5];
setfillstyle(1,3);
bar(560,10,600,30);
setcolor(5);
itoa(i,str,10);
outtextxy(580,20,str);
}
void strelka(int st,int color){
int x=(2*st+1)*st_w,
y=110;
setcolor(color);
if(color){
int poly[24]={
x,y+15,
x-30,y-30,
x-25,y-35,
x-10,y-35,
x-10,y-50,
x-5,y-55,
x+5,y-55,
x+10,y-50,
x+10,y-35,
x+25,y-35,
x+30,y-30,
x,y+15};
drawpoly(12,poly);
setfillstyle(9,9);
floodfill(x,y,color);}
else{
setfillstyle(1,0);
bar(x-30,y-55,x+30,y+15);}
}
Файл records.h
#include "kurs.h"
double tog;
struct inf{
int count;
double time;
char name[20];
}rec[8];
void getrecords(){
FILE *f1=fopen("records.dat","rb");
fread(rec,sizeof(rec),1,f1);
fclose(f1);
}
void setrecords(){
FILE *f1=fopen("records.dat","wb");
fwrite(rec,sizeof(rec),1,f1);
fclose(f1);
}
void records(){
int koldisk;
char str[20]="",str2[10];
settextjustify(LEFT_TEXT,CENTER_TEXT);
settextstyle(0,0,1);
outtextxy(10,85,"Перекладываний:");
outtextxy(10,101,"Оптимально:");
outtextxy(10,117,"время:");
itoa(count,str2,10);
outtextxy(300,85,str2);
itoa(pow(2,m)-1,str2,10);
outtextxy(300,101,str2);
gcvt(tog,6,str2);
outtextxy(300,117,str2);
if(count<rec[m-3].count||count==rec[m-3].count&&tog<rec[m-3].time||!rec[m-3].count){
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(getmaxx()/2,174,"Поздравляем! Рекорд побит! Введите имя и нажмите Enter");
input_str(str);
rec[m-3].count=count;
rec[m-3].time=tog;
strcpy(rec[m-3].name,str);}
getch();
menu();
}
void show_records(){
int p,y=120;
char str[10];
cleardevice();
setcolor(14);
settextstyle(0,0,4);
outtextxy(getmaxx()/2,50,"Рекорды");
settextstyle(0,0,1);
outtextxy(getmaxx()/2,y-40,"Bakspace - удалить");
outtextxy(30,y-20,"Дисков");
outtextxy(150,y-20,"Перекладываний");
outtextxy(250,y-20,"Время");
outtextxy(430,y-20,"Имя");
for(int i=0;i<8;i++,y+=24){
line(0,y-10,getmaxx(),y-10);
itoa(i+3,str,10);
outtextxy(30,y,str);
itoa(rec[i].count,str,10);
outtextxy(150,y,str);
gcvt(rec[i].time,6,str);
outtextxy(250,y,str);
outtextxy(430,y,rec[i].name);}
if(getch()==8){
setmem(rec,sizeof(rec),0);
show_records();}
menu();
}
void input_str(char *str){
char ch;
setfillstyle(1,0);
bar(0,getmaxy()/2-10,getmaxx(),getmaxy()/2+10);
settextstyle(0,0,2);
for(int i=0;(ch=getch())!=13&&i<19;){
if(ch==8){
if(i>0)str[--i]=0;}
if(isprint(ch)){
str[i]=ch;
str[++i]=0;}
bar(0,getmaxy()/2-10,getmaxx(),getmaxy()/2+10);
setcolor(14);
outtextxy(getmaxx()/2,getmaxy()/2,str);
}
}
void timer(int i){
static struct time t0,t1;
static double v0;
if(!i){
gettime(&t0);
v0=t0.ti_hour*3600+t0.ti_min*60+t0.ti_sec+(double)t0.ti_hund/100;}
else{
gettime(&t1);
double v1=t1.ti_hour*3600+t1.ti_min*60+t1.ti_sec+(double)t1.ti_hund/100;
tog=v1-v0;}
}