Удаление комментариев из текста программ

Удаление комментариев из текста программ

Удаление комментариев из текста программ

Удаление комментариев из текста программ

Содержание
Введение
1. Постановка задачи
2. Основные особенности среды Visual C++
2.1 Описание алгоритма
2.2 Описание программы
3. Инструкции пользователя
Заключение
Литература
Приложение

Введение
Эволюция языков программирования с момента появления первых электронных компьютеров, построенных для выполнения расчётов траектории движения артиллерийских снарядов во время второй мировой войны, была довольно драматической. Раньше программисты работали с самыми примитивными компьютерными командами, представлявшими собой часть машинного языка. Эти команды состояли из длинных строк единиц и нулей. Вскоре были изобретены ассемблеры, которые могли отображать машинные команды в мнемоническом представлении, более понятном для человека (например, команды ADD или MOV).
Со временем появились такие языки высокого уровня, как BASIC и COBOL. Благодаря этим языкам появилась возможность программировать, используя логические конструкции из слов и предложений, например integer I = 100. Эти команды переводились в машинный язык то есть компилировались. Одно из основных преимуществ компилируемых языков программирования, состоит в том, что полученные программы могут выполняться на компьютерах без компиляции. При работе же с интерпретируемыми языками для выполнения готовой программы нужно обязательно иметь соответствующую программу-интерпретатор.
Следующей шагом в программировании стало появление визуальных сред программирования таких, как Visual C++ , позволяющих использовать визуальные компоненты, не описывая их самому , а брать их из библиотеки стандартных элементов . Это позволяет ускорить написание программ, облегчая тем самым работу программиста . А также позволяет использовать все возможности программирования под Windows, используя при этом относительно не сложные алгоритмы и функции. В связи с выше изложенным нами было выбрана для разработки проекта среда Visual C++ 6.0

1. Постановка задачи
В данном курсовом проекте необходимо разработать программу с использованием функций библиотеки MFC
– Удаление комментариев из текстов программ;
– Автоматический выбор языка, на котором написана программа;
– Сохранение результата в файл.

2. Основные особенности среды Visual C++
Среда Visual C++ – это сложный механизм, обеспечивающий высокоэффективную работу программиста. Создание прикладных программ, или приложений выполняется в интегрированной среде разработки IDE (Integrated Development Environment). IDE служит для организации взаимодействия с программистом и включает ряд окон, содержащих различные управляющие элементы. С помощью средств интегрированной среды разработчик может проектировать интерфейсную часть приложения, а также писать программный код и связывать его с управляющими элементами. При этом вся работа по созданию приложения, включая отладку, происходит в IDE.
Интегрированная среда разработки Visual C++ представляет собой многооконную систему. Вид интегрированной среды разработки (интерфейс) может различаться в зависимости от настроек. Кроме стандартных окон, на экране могут присутствовать и другие окна, отображаемые при вызове соответствующих средств, например, Image Editor (Редактор изображений). Окна Visual C++ (но не главное) можно перемещать, убирать с экрана, а также изменять их размеры. Одной из последних версий стал Microsoft Visual C++ 6.0. Visual C++ 6.0, вобрав в себя всё самое лучшее от предыдущих версий, предоставляет ряд новых возможностей. Так, например, стал более удобным и современным интерфейс среды программирования, создаваемые Visual C++ программы учитывают архитектуру современных процессоров, существенно расширены возможности отладчика.
Visual C++ 6.0 может работать в среде операционных систем от Windows 95 до Windows 2000 и Windows XP. Особенных требований к компьютеру система не предъявляет, за исключением того, что процессор должен быть типа Pentium, оперативной памяти – не менее 32 Мбайт и достаточное количество свободной дисковой памяти (порядка 200 Мбайт).

2.1 Описание алгоритма
Согласно условию курсового проекта был разработан алгоритм удаления комментариев из текстов программ. Суть алгоритма заключается в том, что при нажатии кнопки Удалить комментарии» происходит открытие файла, указанного в верхнем текстовом окне, определение языка, на котором написана программа, удаление из него комментариев и запись в файл, указанный в нижнем текстовом окне.
Удаление комментариев возможно из текстов программ, написанных на следующих языках C и С++, Pascal, Basic и Assembler.
2.2 Описание программы
Данное приложение состоит из трех классов CKursApp, CKursDlg и CSelectLangDlg. Все основные функции содержатся во втором классе, т.к. именно он отвечает за поведение диалогового окна. Работа программы основана на двух функциях RemoveOneLineComments и RemoveMultiLineComments. Реализация второй является довольно простой. В нее передаются три параметра исходный текст, символ открывающего комментария и символ закрывающего комментария. В тексте осуществляется поиск открывающих комментариев и парных им закрывающих, содержимое между ними удаляется.
Удаление однострочных комментариев более сложное из-за того, что в отдельных языках, например в Бейсике, строки могут переноситься и однострочный комментарий становится подобным многострочному. В функцию передаются четыре параметра исходный текст, символ комментария, параметр, определяющий наличие переносов и сам символ переноса. Работа функции заключается в следующем. Исходный текст разбивается на строки, которые заносятся в массив. Затем производится поиск символа комментария. Если он найден, проверяется, есть ли в данной строке перенос. Строка или ее часть после комментария удаляется. При наличии переноса удаляется также и следующая строка.
Определение языка производится по расширению. Если расширение неизвестно, у пользователя запрашивается тип файла. Затем производится удаление комментариев и в случае успешного завершения выдается сообщение.
Результаты сохраняются в указанном файле.

3. Инструкция пользователя
Запуск программы осуществляется при открытии файла kurs.exe, который находится на дискете. При этом на экране появиться окно, в левой верхней части которого будет видна надпись «Удаление комментариев из текста программы » – это имя программы. Для работы необходимо указать исходный и конечный файлы, введя их пути в текстовые окна или выбрав их в диалоге выбора. Если файл имеет неизвестное программе расширение, необходимо дополнительно выбрать язык в диалоге, который автоматически появляется после выбора файла. Затем необходимо нажать кнопку «Удалить комментарии». Если текст программы не содержит некорректно расставленных комментариев, выдается сообщение об успешном выполнении операции.
Системные требования Pentium 100 , 16 MB RAM, Windows 95/98/2000 NT/XP.

Заключение
В ходе выполнения данного курсового проекта были разработана программа на языке высокого программирования Visual C++. Также изучены графические возможности данного языка.
Систематизированы и закреплены практические навыки использования ЭВМ, программного обеспечения, существующих средств обслуживания системных программистов, а также теоретические знания по основным разделам курса «Программирование». Основное внимание уделено изучению современных операционных систем, способов проектирования приложений, объектно-ориентированному и системному программированию.
При выполнении курсового проекта произведено знакомство с реферативными журналами и другими информационными источниками по объектно-ориентированному и системному программированию с целью анализа состояния решаемой задачи.
Получены практические навыки работы в среде Visual C++ и в графической среде разработки.

Литература
1. Петзольд Ч. Программирование под Windows 95. В двух книгах BHV – Санкт — Петербург, 2007, silt.
2. Ричард С.Линкер, Том Арчер. Программирование для Windows 7. Библия разработчика. «Диалектика » – Москва, 2009.-864 с. ил.- Парал. тит. англ. Уч.пос.
3. Джесс Либерти. С++ за 21 день. «Вильямс» — Москва, 2000.-816 с. ил. .- Парал.тит. англ.

Приложение
Файл kursDlg.cpp
// kursDlg.cpp implementation file
//
#include «stdafx.h»
#include «kurs.h»
#include «kursDlg.h»
#include «SelectLangDlg.h»
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
#define LANG_CPP 1
#define LANG_PASCAL 2
#define LANG_BASIC 3
#define LANG_ASM 4
/////////////////////////////////////////////////////////////////////////////
// CKursDlg dialog
CKursDlg CKursDlg(CWnd* pParent /*=NULL*/)
CDialog(CKursDlg IDD, pParent)
{
//{{AFX_DATA_INIT(CKursDlg)
// NOTE the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CKursDlg DoDataExchange(CDataExchange* pDX)
{
CDialog DoDataExchange(pDX);
//{{AFX_DATA_MAP(CKursDlg)
// NOTE the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CKursDlg, CDialog)
//{{AFX_MSG_MAP(CKursDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTNSOURCE, OnBtnsource)
ON_BN_CLICKED(IDC_BTNMAKE, OnBtnmake)
ON_BN_CLICKED(IDC_BTNDEST, OnBtndest)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CKursDlg message handlers
BOOL CKursDlg OnInitDialog()
{
CDialog OnInitDialog();
/ Set the icon for this dialog. The framework does this automatically
// when the application’s main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
m_lang = LANG_CPP;
m_name = «»;
// TODO Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CKursDlg OnSysCommand(UINT nID, LPARAM lParam)
{
CDialog OnSysCommand(nID, lParam);
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CKursDlg OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() — cxIcon + 1) / 2;
int y = (rect.Height() — cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CKursDlg OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CKursDlg OnBtnsource()
{
CFileDialog dlg(TRUE, NULL, NULL, 0,
«C++ and C files (*.cpp; *.c; *.h; *.hpp)|*.cpp;*.c;*.h;*.hpp|Pascal files (*.pas)|*.pas|Basic files (*.bas)|*.bas|Assembler files (*.asm)|*.asm|All files|*.*||», this);
CString lang;
CSelectLangDlg select;
if(dlg.DoModal() == IDOK)
{
m_name = dlg.GetPathName();
SetDlgItemText(IDC_SOURCE, m_name);
int point_pos = m_name.ReverseFind(‘.’);
if(point_pos == -1)
{
if(select.DoModal())
m_lang = select.m_language + 1;
else
m_lang = LANG_CPP;
}
else
{
lang = m_name.Right(m_name.GetLength() — point_pos — 1);
if((lang == «c») || (lang == «cpp») || (lang == «h») || (lang == «hpp»))
m_lang = LANG_CPP;
else if(lang == «pas»)
m_lang = LANG_PASCAL;
else if(lang == «bas»)
m_lang = LANG_BASIC;
else if(lang == «asm»)
m_lang = LANG_ASM;
else
{
if(select.DoModal())
m_lang = select.m_language + 1;
else
m_lang = LANG_CPP;
}
}
point_pos = m_name.ReverseFind(»);
m_dest = m_name.Left(point_pos);
m_dest += «output.»;
m_dest += lang;
SetDlgItemText(IDC_DEST, m_dest);
}
}
void CKursDlg OnBtnmake()
{
GetDlgItemText(IDC_SOURCE, m_name);
GetDlgItemText(IDC_DEST, m_dest);
CFile source(m_name, CFile modeRead | CFile shareDenyRead | CFile shareDenyWrite | CFile normal);
CString text;
char buffer;
UINT i;
for(i = 0; i < source.GetLength(); i++)
{
source.Read(&buffer, 1);
text += buffer;
}
text.GetBuffer(0)[source.GetLength()] = 0;
switch(m_lang)
{
case LANG_CPP
{
RemoveOneLineComments(text, «//», FALSE, «»);
if(RemoveMultiLineComments(text, «/*», «*/») == -1)
{
AfxMessageBox(«Неправильные многострочные коментарии», MB_ICONERROR);
return;
}
break;
}
case LANG_PASCAL
{
RemoveOneLineComments(text, «//», FALSE, «»);
if(RemoveMultiLineComments(text, «{«, «}») == -1)
{
AfxMessageBox(«Неправильные многострочные коментарии», MB_ICONERROR);
return;
}
break;
}
case LANG_BASIC
{
RemoveOneLineComments(text, «‘», TRUE, «_»);
RemoveOneLineComments(text, «REM «, TRUE, «_»);
RemoveOneLineComments(text, «rem «, TRUE, «_»);
RemoveOneLineComments(text, «Rem «, TRUE, «_»);
break;
}
case LANG_ASM
{
RemoveOneLineComments(text, «;», FALSE, «»);
break;
}
}
source.Close();
CFile dest(m_dest, CFile modeCreate | CFile modeReadWrite | CFile normal);
dest.Write(text.GetBuffer(0), text.GetLength());
AfxMessageBox(«Комментарии удалены», MB_ICONINFORMATION);
}
int CKursDlg RemoveOneLineComments(CString& text, CString comment, BOOL bHasLineWraps, CString wrap)
{
CArray<CString, CString&> linelist;
CString line, full = text;
char *buffer = full.LockBuffer();
char *token = strtok(buffer, «rn»);
while(token)
{
linelist.Add(CString(token));
token = strtok(NULL, «rn»);
}
full.UnlockBuffer();
int i, find, count;
BOOL bWrap = FALSE;
for(i = 0; i < linelist.GetSize(); i++)
{
if(linelist[i].Find(comment, 0) == 0)
{
if(bHasLineWraps)
{
if(linelist[i].Find(wrap, 0) == linelist[i].GetLength() — wrap.GetLength())
bWrap = TRUE;
}
linelist.RemoveAt(i);
i—;
continue;
}
else if((find = linelist[i].Find(comment, 0)) > 0)
{
if(bHasLineWraps)
{
if(linelist[i].Find(wrap, 0) == linelist[i].GetLength() — wrap.GetLength())
bWrap = TRUE;
}
count = linelist[i].GetLength() — find;
linelist[i].Delete(find, count);
continue;
}
if(bHasLineWraps && bWrap)
{
if(linelist[i].Find(wrap, 0) == linelist[i].GetLength() — wrap.GetLength())
bWrap = TRUE;
else
bWrap = FALSE;
linelist.RemoveAt(i);
i—;
}
}
text = «»;
for(i = 0; i < linelist.GetSize(); i++)
{
text += linelist[i];
text += «rn»;
}
linelist.RemoveAll();
return 0;
}
int CKursDlg RemoveMultiLineComments(CString &text, CString opencomment, CString closecomment)
{
int open, close;
while((open = text.Find(opencomment, 0)) != -1)
{
if((close = text.Find(closecomment, open)) != -1)
{
text.Delete(open, close — open + closecomment.GetLength());
}
else
return -1;
}
return 0;
}
void CKursDlg OnBtndest()
{
CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
«C++ and C files (*.cpp; *.c; *.h; *.hpp)|*.cpp;*.c;*.h;*.hpp|Pascal files (*.pas)|*.pas|Basic files (*.bas)|*.bas|Assembler files (*.asm)|*.asm|All files|*.*||», this);
if(dlg.DoModal() == IDOK)
{
m_dest = dlg.GetPathName();
SetDlgItemText(IDC_DEST, m_dest);
}
}
Файл SelectLangDlg;
// SelectLangDlg.cpp implementation file
//
#include «stdafx.h»
#include «kurs.h»
#include «SelectLangDlg.h»
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSelectLangDlg dialog
CSelectLangDlg CSelectLangDlg(CWnd* pParent /*=NULL*/)
CDialog(CSelectLangDlg IDD, pParent)
{
//{{AFX_DATA_INIT(CSelectLangDlg)
m_language = 0;
//}}AFX_DATA_INIT
}
void CSelectLangDlg DoDataExchange(CDataExchange* pDX)
{
CDialog DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSelectLangDlg)
DDX_Radio(pDX, IDC_CPP, m_language);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSelectLangDlg, CDialog)
//{{AFX_MSG_MAP(CSelectLangDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSelectLangDlg message handlers
void CSelectLangDlg OnOK()
{
UpdateData();
CDialog OnOK();
}
BOOL CSelectLangDlg OnInitDialog()
{
CDialog OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION OCX Property Pages should return FALSE
}

«