Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx55 / Курсовая работа(5).docx
Скачиваний:
51
Добавлен:
01.08.2013
Размер:
127.96 Кб
Скачать

3.3 Алгоритмы, реализованные в процессе решения задачи

Рассмотрим алгоритм поиска длиннейшей подпоследовательности одинаковых чисел, встречающейся некоторый раз внутри основной последовательности. Этот алгоритм был реализован в файле ALG.CPP в функции search index_search(posled*,int).

Для определения длиннейшей подпоследовательности одинаковых символов достаточно одного цикла, проходящего через всю основную последовательность. Сравнение происходит после того, как определены размеры группы одинаковых чисел, и новый результат либо записывается вместо нового с указанием координаты его нахождения, либо обнуляется. Для того, чтобы найти следующее вхождение этой последовательности, достаточно ввести дополнительный параметр, определяющий, на какой раз после череды совпадений допускается записать координату начала подпоследовательности. В случае обнаружения более длинной группы этот счетчик обнуляется.

Алгоритм выбора подпунктов меню (файл MENU.CPP, функции menu(); start(); options();).

Событие нажатия кнопки на клавиатуре отлавливается функцией getch(), код клавиши записывается в переменную. Для определения значимости кода используется переключатель switch, отлавливающий требуемые значения. Для сохранения позиции выбора меню используются переменные класса static. В зависимости от нажатой клавиши они либо изменяют свое значение, либо остаются неизменными. После нажатия клавиши enter (код 13) в зависимости от значения переменной выбора через switch запускается та или иная функция, как правило с выходом из текущей при помощи оператора return.

Заключение

По результатам проделанной работы можно сделать следующие выводы:

Проведен сравнительный анализ языков высокого уровня Паскаль и Си и сделан вывод, что для реализации курсового проекта в соответствии с заданием выгоднее использовать язык Си.

Поставлена задача создания программы работы с множествами со следующими ограничениями: многофайловость проекта, удобный графический интерфейс, работа с файлами.

Разработаны алгоритмы поиска подпоследовательностей одинаковых элементов в множественном виде, алгоритмы создания графических элементов меню.

Создана программа поиска подпоследовательностей, имеющая следующие функции:

  • возможность сохранять последовательность в файлы;

  • возможность раздельного либо смежного сохранения и загрузки последовательностей в файлы.

Список использованных источников

1 Этапы решения задачи на ЭВМ [Электронный ресурс] http://imcs.dvgu.ru/lib/eastprog/task_stages.html

2 Академик: Словарь бизнес-терминов. Язык высокого уровня [Электронный ресурс]: электронный словарь. – URL: http://dic.academic.ru/dic.nsf/business/16814 (дата обращения: 19.09.2012).

3 Язык программирования Турбо Паскаль [Электронный ресурс]: справочник. – URL: http://www.toehelp.ru/theory/informat/lecture04.html (дата обращения: 19.07.2012).

4 Идентификатор. Ключевые слова в языке СИ [Электронный ресурс]: справочник. – URL: http://life-prog.ru/view_shpargalki.php?id=11 (дата обращения: 19.09.2012).

5 Паскаль – Википедия [Электронный ресурс]: энциклопедия. – URL: http://ru.wikipedia.org/wiki/Паскаль_(язык_программирования) (дата обращения: 19.09.2012).

6 Типы данных в С++ [Электронный ресурс]: база данных. – URL: http://itandlife.ru/programming/cpp/tipy-dannyx-c/ (дата обращения: 19.09.2012).

7 Справочник Turbo Pascal [Электронный ресурс]: справочник. – URL: http://tpdn.ru/guide/types/user/ (дата обращения: 19.09.2012).

8 Уроки программирования на Си [Электронный ресурс]: база данных. - URL: http://ipg.h1.ru/lessons/ci/les84.html (дата обращения: 19.09.2012).

9 Алгоритмический язык Pascal. Операции и стандартные функции [Электронный ресурс]: электронный учебник. – URL: http://valera.asf.ru/delphi/book/tp06.shtml (дата обращения: 19.09.2012).

10 Харбинсон С.П., Стил Г.Л. Язык программирования C. - М.: Бином, 2003. - 528 стр.

11 Изучаем Паскаль. Массивы [Электронный ресурс]: образовательный портал. – URL: http://pascal.guti.ru/array.html (дата обращения: 19.09.2012).

12 Оператор ветвления – Википедия [Электронный ресурс]: энциклопедия. – URL: http://ru.wikipedia.org/wiki/Оператор_ветвления (дата обращения: 19.09.2012).

13 Язык Pascal – программирование для начинающих [Электронный ресурс]: информационный портал. URL: http://pas1.ru/goto (дата обращения: 19.09.2012).

Приложение А (справочное)

Исходный код программы

INCLUDE.H

#include <graphics.h>

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <string.h>

#include <stdlib.h>

void menu();

char*gpath="C:\\BORLANDC\\Progs\\kurs\\open.txt";

char*gpath_1="C:\\BORLANDC\\Progs\\kurs\\about.txt";

char*gpath_2="C:\\BORLANDC\\Progs\\kurs\\save.txt";

int randmax=10;

int bool_so=0;

struct posled {

int size;

int*element;

};

struct search {

int index;

int size;

};

#include "C:\BORLANDC\Progs\kurs\alg.cpp"

#include "C:\BORLANDC\Progs\kurs\menu.cpp"

ALG.CPP

void posled_new(int n,posled*p) {

p->size=n;

p->element=new int[n];

}

void posled_delete(posled*p) {

delete p->element;

}

void posled_rand(posled*p) {

for(int i=0;i<p->size;i++) {

p->element[i]=random(randmax);

}

}

search index_search(posled*p,int num) {

int lenmax=1,len=1,indmax=-1;

int nummax=1;

for(int i=1;i<=p->size;i++) {

if(p->element[i]==p->element[i-1]&&i<p->size) len++;

else {

if(len>lenmax) {

lenmax=len;

if(num==1) indmax=i-len;

else indmax=-1;

nummax=1;

}

else if(len==lenmax) {

nummax++;

if(nummax==num) indmax=i-len;

}

len=1;

}

}

search src={0};

src.index=indmax;

src.size=lenmax;

return src;

}

void posl_save(char*path,posled*p) {

FILE*f;

f=fopen(path,"w+");

if(!f) return;

fprintf(f,"%d ",p->size);

for(int i=0;i<p->size;i++) fprintf(f,"%d ",p->element[i]);

fclose(f);

}

void posl_open(char*path,posled*p) {

FILE*f;

int buf=0,i=0;

f=fopen(path,"r");

if(!f) {

posled_new(0,p);

return;

}

fscanf(f,"%d ",&buf);

posled_new(buf,p);

while(!feof(f)) {

buf=0;

fscanf(f,"%d ",&buf);

p->element[i++]=buf;

}

fclose(f);

}

MENU.CPP

void draw_note() {

setfillstyle(1,15);

bar(180,50,460,430);

setfillstyle(1,0);

for(int i=0;i<3;i++) fillellipse(i*80+240,75,10,10);

setfillstyle(1,2);

for(i=0;i<3;i++) {

bar(i*80+236,73,i*80+238,40);

bar(i*80+242,73,i*80+244,40);

}

}

void start() {

static int start_set=0;

int work=0;

if(start_set<0) start_set=1;

else if(start_set>1) start_set=0;

cleardevice();

draw_note();

settextstyle(0,0,2); setcolor(4);

outtextxy(320,120,"Create with:");

setcolor(1);

outtextxy(320,200,"File");

outtextxy(320,280,"Generator");

setcolor(9);

line(210,140,430,140);

line(240,215+start_set*80,400,215+start_set*80);

posled p={0};

posled*posl=&p;

int key=getch();

switch(key) {

case 27: menu(); return;

case 80: start_set++; break;

case 72: start_set--; break;

case 13:

work=1;

switch(start_set) {

case 0: posl_open(gpath,posl); break;

case 1: posled_new(48,posl); posled_rand(posl); break;

}

break;

}

if(work) {

draw_note();

char buf[15]={0};

int j=1;

search m={0};

if(!posl->size) {

outtextxy(320,220,"Cannot open file");

getch(); menu(); return; }

for(int i=0;i<posl->size;i++) {

char b1[5]={0};

sprintf(b1,"%d",posl->element[i]);

strcat(buf,b1);

outtextxy(220+(i%6)*40,130+(i/6)*30,buf);

buf[0]=0;

}

while(m.index>=0) {

m=index_search(posl,j++);

if(m.index==-1) break;

for(int k=0;k<m.size;k++) {

int l=m.index+k;

rectangle(201+(l%6)*40,116+(l/6)*30,

239+(l%6)*40,144+(l/6)*30);

}

}

sprintf(buf,"Size: %d",m.size);

outtextxy(320,125+(i+1)*5,buf);

if(bool_so) posl_save(gpath_2,posl);

else posl_save(gpath,posl);

getch(); menu();

}

start();

}

void options() {

draw_note();

static int opt_sel=0;

if(opt_sel<0) opt_sel=1; else if(opt_sel>1) opt_sel=0;

settextstyle(0,0,3); setcolor(4);

outtextxy(320,120,"OPTIONS");

char buf[20]={0};

settextstyle(0,0,1); setcolor(1);

sprintf(buf,"Max rand num: %d",randmax); outtextxy(320,200,buf);

sprintf(buf,"Similar i/o files:%s",(bool_so?" yes":" no"));

outtextxy(320,280,buf);

line(280,215+opt_sel*80,360,215+opt_sel*80);

int key=getch();

int dir=0;

switch(key) {

case 27: menu(); return;

case 75: dir--; break;

case 77: dir++; break;

case 72: opt_sel--; break;

case 80: opt_sel++; break; }

switch(opt_sel) {

case 0: if(randmax>20) dir*=10; randmax+=dir; break;

case 1: if(dir) bool_so=1-bool_so; break;

}

if(randmax<1) randmax=1; else if(randmax>100) randmax=99;

options();

}

void about() {

draw_note();

settextstyle(0,0,2); setcolor(4);

outtextxy(320,100,"ABOUT");

FILE*f=fopen(gpath_1,"r+");

settextstyle(0,0,1);

line(230,130,410,130);

if(f) {

char buf[30]={0};

int i=0;

while(!feof(f)) {

buf[0]=0;

fgets(buf,30,f);

buf[strlen(buf)-1]=0;

outtextxy(320,160+i*30,buf);

if(strlen(buf)) i++;

}

line(230,160+i*30,410,160+i*30);

}

else {

char error[50]={0};

sprintf(error,"Cannot open \"%s\"",gpath_1);

outtextxy(320,160,error);

}

getch();

fclose(f);

menu();

}

void menu() {

static int menu_set=0;

if(menu_set<0) menu_set=3;

else if(menu_set>3) menu_set=0;

cleardevice();

draw_note();

settextjustify(CENTER_TEXT,CENTER_TEXT);

settextstyle(0,0,3);

setcolor(4);

outtextxy(320,120,"MENU");

settextstyle(0,0,2);

setcolor(1);

outtextxy(320,200,"START");

outtextxy(320,250,"OPTIONS");

outtextxy(320,300,"ABOUT");

outtextxy(320,350,"EXIT");

setcolor(9);

line(210,140,430,140);

line(240,215+menu_set*50,400,215+menu_set*50);

int key=getch();

switch(key) {

case 27: exit(0); break;

case 13: switch(menu_set) {

case 0: start(); return;

case 1: options(); return;

case 2: about(); return;

case 3: exit(0);

} break;

case 72: menu_set--; break;

case 80: menu_set++; break; }

menu();

}

MAIN.CPP

#include "C:\Borlandc\Progs\kurs\INCLUDE.H"

void main() {

randomize();

int k=DETECT,m;

initgraph(&k,&m,"");

menu();

}

Соседние файлы в папке docx55