ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ
Исходным файлом для проверки является текст программы на языке C++. Проверить правильность написания в программе инструкций безусловного перехода. Программа должна быть разработана на языке Borland Object Pascal (Ide Borland Delphi).
СОДЕРЖАНИЕ
1.ВВЕДЕНИЕ
2.ВЫПОЛНЕНИЕ ЗАДАНИЯ
2.1.Подготовка исходного файла
2.2.Разработка программы
2.3.Листинг программы
2.4.Запуск приложения
ПЕРЕЧЕНЬ ССЫЛОК
ПРИЛОЖЕНИЯ
Система программирования Турбо Паскаль, разработанная американской корпорацией Воrland, остается одной из самых популярных систем программирования в мире. Придуманный швейцарским ученым Никласом Виртом как средство для обучения студентов программированию, язык Паскаль стараниями А. Хейлсберга превратился в мощную современную профессиональную систему программирования, которой по плечу любые задачи – от создания простых программ, предназначенных для решения несложных вычислительных задач, до разработки сложнейших реляционных систем управления базами данных. Появление Windows и инструментальных средств Borland Pascal with Objects и Delphi для разработки программ в среде Windows лишний раз показало, какие поистине неисчерпаемые возможности таит он в себе: и Borland Pascal, и используемый в Delphi язык Object Pascal основываются на Турбо Паскале и развивают его идеи.
Основная цель курсовой работы – закрепление и обобщение знаний полученных при изучении дисциплины «Программирование».
В результате выполнения курсовой работы должны быть получены навыки анализа поставленной задачи, выбора наиболее оптимального алгоритма решения задачи, разработки интерфейса, отладки и тестирования программ большого объема.
ВЫПОЛНЕНИЕ ЗАДАНИЯ
Подготовка исходного файла
Сформируем текстовый документ с именем goto.cpp. Содержимое документа возьмем из русифицируемой справки MSDN по оператору безусловного перехода.
int i, j;
for(i = 0; i < 10; i++)
{
// ...
if(condition1)
{
j = 4;
goto label1;
}
// ...
for(j = 0; j < 10; j++)
{
// ...
label1:
// ...
if(condition2)
{
i = 6;
goto label2;
}
}
// ...
label2:
// ...
}
Разработка программы
В среде программирования Borland Delphi создадим новое приложение (пункт меню File \ New \ Application). Свойству формы Caption присвоим значение «Проверка Goto». Разместим на форме визуальные и невизуальные компоненты.
Невизуальный компонент – это диалоговое окно выбора файла для открытия. Компонент класса TOpenDialog становится видимым только в режиме запущенного приложения после вызова метода Execute. Присвоим компоненту имя odFile.
Размещаем на форме три компонента класса TButton с именами buOpen, buProverka buClose. Обработчик нажатия на кнопку buOpen открывает исходный файл (строки 33 - 41) и отображает его содержимое на компоненте Memo1 класса TMemo. Свойство Lines этого компонента содержит набор строк исходного файла.
Кнопка buProverka выполняет непосредственную проверку правильности использования безусловного оператора (строки 43 - 94). На первом шаге происходит запись содержимого файла в строковую переменную sFile (строка 48). Затем, при условии что файл не пустой (строка 49), происходит циклический поиск подстроки “goto” в переменной sFile (строки 52-54). Удаляется содержимое проверяемого файла до слова “goto” и выделяется имя метки перехода (строка 55). Имя метки должно удовлетворять требованию задания имени идентификатора. Для этой проверки используются строки 56-77. Затем ищется имя метки и символ «:» - это непосредственный переход на метку. В случае отсутствия такой подстроки выдается сообщение об ошибке (строки 78 - 84). В случаи успешной проверки использования одного безусловного перехода происходит инкрементирование счетчика и новый поиск конструкции goto (строки 85-86). По окончании проверки (в случае отсутствия ошибок) выдается число найденный инструкций безусловного перехода (строки 88-92).
Рис.1 - Форма в режиме Design
Кнопка buClose (строки 96 - 99) выполняет закрытие программы.
Листинг программы
1 | unit Unit1; |
2 | |
3 | interface |
4 | |
5 | uses |
6 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
7 | Dialogs, StdCtrls; |
8 | |
9 | type |
10 | TForm1 = class(TForm) |
11 | Memo1: TMemo; |
12 | buOpen: TButton; |
13 | buProverka: TButton; |
14 | lbRezultat: TLabel; |
15 | odFile: TOpenDialog; |
16 | buClose: TButton; |
17 | procedure buOpenClick(Sender: TObject); |
18 | procedure buProverkaClick(Sender: TObject); |
19 | procedure buCloseClick(Sender: TObject); |
20 | private |
21 | { Private declarations } |
22 | public |
23 | { Public declarations } |
24 | end; |
25 | |
26 | var |
27 | Form1: TForm1; |
28 | |
29 | implementation |
30 | |
31 | {$R *.dfm} |
32 | |
33 | procedure TForm1.buOpenClick(Sender: TObject); |
34 | begin |
35 | if odFile.Execute then |
36 | begin |
37 | Memo1.Lines.Clear; |
38 | Memo1.Lines.LoadFromFile(odFile.FileName); |
39 | lbRezultat.Caption:= ''; |
40 | end; |
41 | end; |
42 | |
43 | procedure TForm1.buProverkaClick(Sender: TObject); |
44 | var |
45 | sFile, sLabelName: string; |
46 | i, iKol, j: integer; |
47 | begin |
48 | sFile:= Memo1.Lines.Text; |
49 | if sFile<>'' then |
50 | begin |
51 | iKol:= 0; |
52 | i:= pos('goto ', sFile); |
53 | while i<>0 do |
54 | begin |
55 | delete(sFile, 1, i+4); |
56 | i:= pos(';', sFile); |
57 | j:= pos(#13, sFile); |
58 | if ((j<>0)and(j<i))or(i=0) then |
59 | begin |
60 | lbRezultat.Caption:= 'Ошибка: Отсутствует ;'; |
61 | lbRezultat.Font.Color:= clRed; |
62 | Exit; |
63 | end; |
64 | sLabelName:= copy(sFile, 1, i-1); |
65 | if not (sLabelName[1] in ['A'..'Z', 'a'..'z'])then |
66 | Begin |
67 | lbRezultat.Caption:= 'Ошибка: Неверное имя метки '+ sLabelName; |
68 | lbRezultat.Font.Color:= clRed; |
69 | Exit; |
70 | end; |
71 | for i:= 2 to length(sLabelName) do |
72 | if not(sLabelName[i] in ['0'..'9', 'A'..'Z', 'a'..'z']) then |
73 | begin |
74 | lbRezultat.Caption:= 'Ошибка: Неверное имя метки '+ sLabelName; |
75 | lbRezultat.Font.Color:= clRed; |
76 | Exit; |
77 | end; |
78 | i:= pos(sLabelName+':' ,sFile); |
79 | if i=0 then |
80 | begin |
81 | lbRezultat.Caption:= 'Ошибка: Отсутсвует переход на метку '+ sLabelName; |
82 | lbRezultat.Font.Color:= clRed; |
83 | Exit; |
84 | end; |
85 | inc(iKol); |
86 | i:= pos('goto ', sFile); |
87 | end; |
88 | if lbRezultat.Caption='' then |
89 | begin |
90 | lbRezultat.Caption:= 'Правильное задание '+ IntToStr(iKol)+ ' инструкций безусловного перехода'; |
91 | lbRezultat.Font.Color:= clNavy; |
92 | end; |
93 | end; |
94 | end; |
95 | |
96 | procedure TForm1.buCloseClick(Sender: TObject); |
97 | begin |
98 | Close; |
99 | end; |
100 | |
101 | end. |
Запуск приложения
Выполняется нажатием клавиши F9. После компиляции запускается программа на выполнение. Окно программы с результатами работы представлены на рис.2-5.
Рис.2 – Окно открытия файла
Рис.3 – Проверка файла
Рис.4 – Проверка файла
Рис.5 – Проверка файла
ПЕРЕЧЕНЬ ССЫЛОК
Абрамов В.Г., Трифонов Н.П., Трифонова Г.Н. Введение в язык Паскаль. - М.: Наука, 1988.
Довгаль С.И., Литвинов Б.Ю., Сбитнев А..И. Персональные ЭВМ : Турбо Паскаль V7.0, объектное программирование, локальные сети. – Киев: Информсиситема сервис, 1993.
Епанешников А.М., Епанешникова В.А. Программирование в среде Turbo Pascal 7.0.-М.: Диалог –МИФИ,1999.
Зуев Е.А. Программирование на языке Turbo Pascal 6.0,7.0. – М.: Радио и связь, Веста,1993.
Кандзюба С.П., Громов В.Н. Delphi 7.Базы данных и приложения. Лекции и упражнения. – К.: Издательство "ДиаСофт", 2001.
Климова Л.М. Pascal 7.0. Практическое программирование. Решение типовых задач. –М.:КУДИУ ОБРАЗ, 2000.
Марченко А. И., Марченко Л.А.. Программирование в среде Turbo Pascal 7.0.-К.: Век+,1999.
Фаронов В.В. Turbo Pascal 7.0. Начальный курс. - М.: Нолидж, 2000.
ПРИЛОЖЕНИЯ
Приложение А
int i, j;
for(i = 0; i < 10; i++)
{
// ...
if(condition1)
{
j = 4;
goto label1;
}
// ...
for(j = 0; j < 10; j++)
{
// ...
label1:
// ...
if(condition2)
{
i = 6;
goto label2;
}
}
Приложение Б
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"c:\program files\borland\delphi7\Projects\Bpl"
-LN"c:\program files\borland\delphi7\Projects\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
Приложение В
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1049
CodePage=1251
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
Приложение Г
program proverka;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Приложение Д
[Closed Files]
File_0=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\UData.pas',0,1,545,15,558,1,0
File_1=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\UTablNU.pas',0,1,681,50,698,1,0
File_2=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\UMain.pas',0,1,148,31,155,1,0
File_3=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\UPerson.pas',0,1,99,34,116,1,0
File_4=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\UFunction.pas',0,1,479,1,492,0,0
File_5=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\UEtalon.pas',0,1,800,40,825,0,0
File_6=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\UCreateAllReport.pas',0,1,406,51,407,0,0
File_7=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\USprNa.pas',0,1,1,17,9,1,0
File_8=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\USprUd.pas',0,1,305,1,308,1,0
File_9=SourceModule,'D:\Projects\Delphi Studio\SKSMiK\ZarPlata\units\USprOtdel.pas',0,1,1,1,1,1,0
[Modules]
Module0=D:\Projects\Delphi\sti\check_goto\Unit1.pas
Count=1
EditWindowCount=1
[D:\Projects\Delphi\sti\check_goto\Unit1.pas]
ModuleType=SourceModule
FormState=1
FormOnTop=0
[C:\Program Files\Borland\Delphi7\Projects\ProjectGroup1.bpg]
FormState=0
FormOnTop=0
[D:\Projects\Delphi\sti\check_goto\proverka.dpr]
FormState=0
FormOnTop=0
[EditWindow0]
ViewCount=1
CurrentView=0
View0=0
CodeExplorer=CodeExplorer@EditWindow0
MessageView=MessageView@EditWindow0
Create=1
Visible=1
State=2
Left=294
Top=140
Width=868
Height=505
MaxLeft=-4
MaxTop=108
MaxWidth=1288
MaxHeight=666
ClientWidth=1280
ClientHeight=632
LeftPanelSize=0
LeftPanelClients=CodeExplorer@EditWindow0
LeftPanelData=00000400010000000C000000436F64654578706C6F72657200000000000000000000000000000000000100000000000000000C000000436F64654578706C6F726572FFFFFFFF
RightPanelSize=0
BottomPanelSize=0
BottomPanelClients=MessageView@EditWindow0
BottomPanelData=00000400010000000B0000004D657373616765566965770000000000000000000000000000000000FFFFFFFF
[View0]
Module=D:\Projects\Delphi\sti\check_goto\Unit1.pas
CursorX=13
CursorY=57
TopLine=64
LeftCol=1
[Watches]
Count=0
[WatchWindow]
WatchColumnWidth=100
WatchShowColumnHeaders=1
Create=1
Visible=0
State=0
Left=0
Top=138
Width=265
Height=638
MaxLeft=-1
MaxTop=-1
ClientWidth=257
ClientHeight=612
TBDockHeight=612
LRDockWidth=257
Dockable=1
[Breakpoints]
Count=0
[AddressBreakpoints]
Count=0
[Main Window]
Create=1
Visible=1
State=0
Left=0
Top=0
Width=1280
Height=112
MaxLeft=-1
MaxTop=-1
ClientWidth=1272
ClientHeight=78
[ProjectManager]
Create=1
Visible=0
State=0
Left=369
Top=372
Width=438
Height=303
MaxLeft=-1
MaxTop=-1
ClientWidth=430
ClientHeight=277
TBDockHeight=303
LRDockWidth=438
Dockable=1
[CPUWindow]
Create=1
Visible=0
State=0
Left=96
Top=114
Width=959
Height=635
MaxLeft=-1
MaxTop=-1
ClientWidth=951
ClientHeight=601
DumpPane=79
DisassemblyPane=187
RegisterPane=231
FlagPane=64
[AlignmentPalette]
Create=1
Visible=0
State=0
Left=200
Top=107
Width=156
Height=84
MaxLeft=-1
MaxTop=-1
ClientWidth=150
ClientHeight=60
[PropertyInspector]
Create=1
Visible=1
State=0
Left=9
Top=203
Width=274
Height=559
MaxLeft=-1
MaxTop=-1
ClientWidth=266
ClientHeight=533
TBDockHeight=429
LRDockWidth=190
Dockable=1
SplitPos=144
ArrangeBy=Name
SelectedItem=Name
ExpandedItems=
HiddenCategories=
[ObjectTree]
Create=1
Visible=0
State=0
Left=958
Top=125
Width=190
Height=669
MaxLeft=-1
MaxTop=-1
ClientWidth=182
ClientHeight=643
TBDockHeight=290
LRDockWidth=190
Dockable=1
[CodeExplorer@EditWindow0]
Create=1
Visible=0
State=0
Left=0
Top=12
Width=140
Height=459
MaxLeft=-1
MaxTop=-1
ClientWidth=140
ClientHeight=459
TBDockHeight=305
LRDockWidth=140
Dockable=1
[MessageView@EditWindow0]
Create=1
Visible=0
State=0
Left=-100
Top=-534
Width=443
Height=85
MaxLeft=-1
MaxTop=-1
ClientWidth=443
ClientHeight=85
TBDockHeight=85
LRDockWidth=443
Dockable=1
[DockHosts]
DockHostCount=0
Приложение К
object Form1: TForm1
Left = 320
Top = 139
Width = 520
Height = 500
Caption = #1055#1088#1086#1074#1077#1088#1082#1072' Goto'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object lbRezultat: TLabel
Left = 210
Top = 424
Width = 52
Height = 13
Caption = #1056#1077#1079#1091#1083#1100#1090#1072#1090
end
object Memo1: TMemo
Left = 8
Top = 48
Width = 497
Height = 353
ScrollBars = ssBoth
TabOrder = 0
end
object buOpen: TButton
Left = 16
Top = 8
Width = 169
Height = 33
Caption = #1054#1090#1082#1088#1099#1090#1100' '#1092#1072#1081#1083
TabOrder = 1
OnClick = buOpenClick
end
object buProverka: TButton
Left = 16
Top = 416
Width = 185
Height = 33
Caption = #1055#1088#1086#1074#1077#1088#1082#1072' Goto'
TabOrder = 2
OnClick = buProverkaClick
end
object buClose: TButton
Left = 365
Top = 8
Width = 137
Height = 33
Caption = #1042#1099#1093#1086#1076
TabOrder = 3
OnClick = buCloseClick
end
object odFile: TOpenDialog
Filter = 'C++ '#1092#1072#1081#1083'|*.cpp'
Left = 208
Top = 16
end
end
Приложение Л
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
buOpen: TButton;
buProverka: TButton;
lbRezultat: TLabel;
odFile: TOpenDialog;
buClose: TButton;
procedure buOpenClick(Sender: TObject);
procedure buProverkaClick(Sender: TObject);
procedure buCloseClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.buOpenClick(Sender: TObject);
begin
if odFile.Execute then
begin
Memo1.Lines.Clear;
Memo1.Lines.LoadFromFile(odFile.FileName);
lbRezultat.Caption:= '';
end;
end;
procedure TForm1.buProverkaClick(Sender: TObject);
var
sFile, sLabelName: string;
i, iKol, j: integer;
begin
sFile:= Memo1.Lines.Text;
if sFile<>'' then
begin
iKol:= 0;
i:= pos('goto ', sFile);
while i<>0 do
begin
delete(sFile, 1, i+4);
i:= pos(';', sFile);
j:= pos(#13, sFile);
if ((j<>0)and(j<i))or(i=0) then
begin
lbRezultat.Caption:= 'Ошибка: Отсутсвует ;';
lbRezultat.Font.Color:= clRed;
Exit;
end;
sLabelName:= copy(sFile, 1, i-1);
if not (sLabelName[1] in ['A'..'Z', 'a'..'z'])then
begin
lbRezultat.Caption:= 'Ошибка: Неверное имя метки '+ sLabelName;
lbRezultat.Font.Color:= clRed;
Exit;
end;
for i:= 2 to length(sLabelName) do
if not(sLabelName[i] in ['0'..'9', 'A'..'Z', 'a'..'z']) then
begin
lbRezultat.Caption:= 'Ошибка: Неверное имя метки '+ sLabelName;
lbRezultat.Font.Color:= clRed;
Exit;
end;
i:= pos(sLabelName+':' ,sFile);
if i=0 then
begin
lbRezultat.Caption:= 'Ошибка: Отсутствует переход на метку '+ sLabelName;
lbRezultat.Font.Color:= clRed;
Exit;
end;
inc(iKol);
i:= pos('goto ', sFile);
end;
if lbRezultat.Caption='' then
begin
lbRezultat.Caption:= 'Правильное задание '+ IntToStr(iKol)+ ' инструкций безусловного перехода';
lbRezultat.Font.Color:= clNavy;
end;
end;
end;
procedure TForm1.buCloseClick(Sender: TObject);
begin
Close;
end;
end.