
- •2 Сравнительный анализ языков программирования высокого уровня Си и Паскаль
- •2.1 Структура программы
- •2.2.2 Пользовательские типы
- •2.3 Арифметические операции
- •Окончание таблицы 2.3.1
- •Окончание таблицы 2.3.2
- •2.4 Указатели и векторные типы данных
- •2.5.2 Операторы-переключатели
- •2.6.2 Безусловный переход
- •2.7 Пользовательские подпрограммы
- •2.8 Итоги анализа сравнения языков программирования Паскаль и Си
- •3.2 Реализация задания
- •3.3 Алгоритмы, реализованные в процессе решения задачи
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();
}