РефератыИнформатика, программированиеУдУдаление комментариев из текста программ

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

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


Содержание


Введение


1. Постановка задачи


2. Основные особенности среды VisualC++


2.1 Описание алгоритма


2.2 Описание программы


3. Инструкции пользователя


Заключение


Литература


Приложение


Введение


Эволюция языков программирования с момента появления первых электронных компьютеров, построенных для выполнения расчётов траектории движения артиллерийских снарядов во время второй мировой войны, была довольно драматической. Раньше программисты работали с самыми примитивными компьютерными командами, представлявшими собой часть машинного языка. Эти команды состояли из длинных строк единиц и нулей. Вскоре были изобретены ассемблеры, которые могли отображать машинные команды в мнемоническом представлении, более понятном для человека (например, команды ADD или MOV).


Со временем появились такие языки высокого уровня, как BASIC и COBOL. Благодаря этим языкам появилась возможность программировать, используя логические конструкции из слов и предложений, например integerI = 100. Эти команды переводились в машинный язык то есть компилировались.Одно из основных преимуществ компилируемых языков программирования, состоит в том, что полученные программы могут выполняться на компьютерах без компиляции. При работе же с интерпретируемыми языками для выполнения готовой программы нужно обязательно иметь соответствующую программу-интерпретатор.


Следующей шагом в программировании стало появление визуальных сред программирования таких, как Visual C++ , позволяющих использовать визуальные компоненты, не описывая их самому , а брать их из библиотеки стандартных элементов . Это позволяет ускорить написание программ, облегчая тем самым работу программиста . А также позволяет использовать все возможности программирования под Windows, используя при этом относительно не сложные алгоритмы и функции. В связи с выше изложенным нами было выбрана для разработки проекта среда Visual C++ 6.0


1. Постановка задачи


В данном курсовом проекте необходимо разработать программу с использованием функций библиотеки MFC:


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


– Автоматический выбор языка, на котором написана программа;


– Сохранение результата в файл.


2. Основные особенности среды VisualC++


Среда VisualC++ – это сложный механизм, обеспечивающий высокоэффективную работу программиста. Создание прикладных программ, или приложений выполняется в интегрированной среде разработки IDE (IntegratedDevelopmentEnvironment). IDE служит для организации взаимодействия с программистом и включает ряд окон, содержащих различные управляющие элементы. С помощью средств интегрированной среды разработчик может проектировать интерфейсную часть приложения, а также писать программный код и связывать его с управляющими элементами. При этом вся работа по созданию приложения, включая отладку, происходит в IDE.


Интегрированная среда разработки VisualC++ представляет собой многооконную систему. Вид интегрированной среды разработки (интерфейс) может различаться в зависимости от настроек. Кроме стандартных окон, на экране могут присутствовать и другие окна, отображаемые при вызове соответствующих средств, например, ImageEditor (Редактор изображений). Окна VisualC++ (но не главное) можно перемещать, убирать с экрана, а также изменять их размеры.Одной из последних версий стал MicrosoftVisualC++ 6.0. VisualC++ 6.0, вобрав в себя всё самое лучшее от предыдущих версий, предоставляет ряд новых возможностей. Так, например, стал более удобным и современным интерфейс среды программирования, создаваемые VisualC++ программы учитывают архитектуру современных процессоров, существенно расширены возможности отладчика.


VisualC++ 6.0 может работать в среде операционных систем от Windows 95 до Windows 2000 и WindowsXP. Особенных требований к компьютеру система не предъявляет, за исключением того, что процессор должен быть типа Pentium, оперативной памяти – не менее 32 Мбайт и достаточное количество свободной дисковой памяти (порядка 200 Мбайт).


2.1 Описание алгоритма


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


Удаление комментариев возможно из текстов программ, написанных на следующих языках: C и С++, Pascal, Basic и Assembler.


2.2 Описание программы


Данное приложение состоит из трех классов: CKursApp, CKursDlg и CSelectLangDlg. Все основные функции содержатся во втором классе, т.к. именно он отвечает за поведение диалогового окна. Работа программы основана на двух функциях: RemoveOneLineComments и RemoveMultiLineComments. Реализация второй является довольно простой. В нее передаются три параметра: исходный текст, символ открывающего комментария и символ закрывающего комментария. В тексте осуществляется поиск открывающих комментариев и парных им закрывающих, содержимое между ними удаляется.


Удаление однострочных комментариев более сложное из-за того, что в отдельных языках, например в Бейсике, строки могут переноситься и однострочный комментарий становится подобным многострочному. В функцию передаются четыре параметра: исходный текст, символ комментария, параметр, определяющий наличие переносов и сам символ переноса. Работа функции заключается в следующем. Исходный текст разбивается на строки, которые заносятся в массив. Затем производится поиск символа комментария. Если он найден, проверяется, есть ли в данной строке перенос. Строка или ее часть после комментария удаляется. При наличии переноса удаляется также и следующая строка.


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


Результаты сохраняются в указанном файле.


3. Инструкция пользователя


Запуск программы осуществляется при открытии файла kurs.exe, который находится на дискете. При этом на экране появиться окно, в левой верхней части которого будет видна надпись "Удаление комментариев из текста программы " – это имя программы. Для работы необходимо указать исходный и конечный файлы, введя их пути в текстовые окна или выбрав их в диалоге выбора. Если файл имеет неизвестное программе расширение, необходимо дополнительно выбрать язык в диалоге, который автоматически появляется после выбора файла. Затем необходимо нажать кнопку "Удалить комментарии". Если текст программы не содержит некорректно расставленных комментариев, выдается сообщение об успешном выполнении операции.


Системные требования: Pentium 100 , 16 MBRAM, Windows 95/98/2000 NT/XP.


Заключение


В ходе выполнения данного курсового проекта были разработана программа на языке высокого программирования VisualC++. Также изучены графические возможности данного языка.


Систематизированы и закреплены практические навыки использования ЭВМ, программного обеспечения, существующих средств обслуживания системных программистов, а также теоретические знания по основным разделам курса "Программирование". Основное внимание уделено изучению современных операционных систем, способов проектирования приложений, объектно-ориентированному и системному программированию.


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


Получены практические навыки работы в среде VisualC++ и в графической среде разработки.


Литература


1. Петзольд Ч. Программирование под Windows 95. В двух книгах: BHV – Санкт - Петербург, 2007, silt.


2. Ричард С.Линкер, Том Арчер. Программирование для Windows7. Библияразработчика. "Диалектика " – Москва, 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


}

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:1903
Символов:21275
Размер:41.55 Кб.