Представление логических выражений в виде карт Карно

Автор работы: Пользователь скрыл имя, 20 Декабря 2011 в 20:10, курсовая работа

Описание

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

Содержание

Аннотация.......................................................................................................................................3
Задание............................................................................................................................................4
Введение.........................................................................................................................................5
Анализ.............................................................................................................................................6
Проектирование.............................................................................................................................7
Кодирование и отладка.................................................................................................................9
Тестирование................................................................................................................................11
Руководство пользователя………………………………….….….……......….….…….….….17
Акт независимого тестирования….……………………………….…………………………..18
Заключение...................................................................................................................................19
Список используемой литературы.............................................................................................20
Приложение А..............................................................................................................................21
Приложение Б..............................................................................................................................30
Приложение В..............................................................................................................................32

Работа состоит из  1 файл

КП-ТРПО Захарова 1261.doc

— 768.50 Кб (Скачать документ)

    Строка  № 155. int AnsiStrToInt(AnsiString) - Функция преобразования двоичного кода в целое число. Данная функция выполняет преобразование числа, представленного в виде строки, в целое число.

    Строка 186. void VariableToTable(AnsiString) - Функция отображения КНФ или ДНФ на карте Карно. В зависимости от длины переменной ((x)=1 или (!x)=2) функция определяет истинное или ложное значение имеет переменная. Затем определяется местоположение рассматриваемой переменной на карте Карно. Если принимает истинное значение, то в соответствующую ячейку ставится знак «1».

    char *itoa(int value, char *string, int radix) - Функция преобразования десятичного числа в двоичное число. Результат функции будет являться массив, содержащий двоичный код входного числа. Данная функция взята из стандартной библиотеки.

 

 

     ТЕСТИРОВАНИЕ

          Для настройки и  тестирования программы выполним задание и рассмотрим результат программы.

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

    

    Рис.4  Запущенное приложение

    Задание для тестирования программы:

      Выберем количество функций 3, первая функция двух переменных тип функции КНФ, вторая функция от трех переменных, третья функция от 4 переменных тип функций ДНФ.

    Первая функция: F=a+b&!a+b&!a+!b тип: КНФ

    

    Рис.5  Отображение первой функции

Первая функция  отображается на карте Карно верно.

    Выберем вторую функцию: F=a&b&c+!a&!b&!c тип функции: ДНФ

    Рис.6  Отображение второй функции

Вторая функция  отображается на карте Карно верно.

Выберем третью функцию: F=a&!b&!c&d+!a&b&c&d+a&!b&!c&d тип функции: ДНФ

    Рис.7 Отображение третьей функции

Третья функция  отображается на карте Карно верно.

Сохраним функции  в файл:

Нажмем кнопку «Сохранить», появится диалоговое окно, зададим имя и расширение файла.

    Рис.8 Сохранение в файл

    Откроем сохраненный файл:

    

    Изменим функции:

    

    Загрузим  новые функции в приложение:

    Нажмем  кнопку «Загрузить»

 

    Выберем в диалоговом окне нужный файл и  откроем его.

    

    Рис.9 Диалоговое окно

    

    Рис.10 Загрузка из файла

    Для того чтобы отобразить загруженные  функции на карте Карно, необходимо настроить все параметры и нажать кнопку «Ок».

    

    Рис.11 Отображение первой функции

    

    Рис.12 Отображение второй функции

Отображение функций  загруженных из файла на карте  Карно происходит верно.

Протестируем  функцию с большим количеством  переменных равным 8:

F=a&b&c&d&e&f&g&h+a&!b&!c&!d&!e&!f&!g&!h+!a&!b&!c&d&e&f&g&h

    Рис.13 Отображение функции с 8 переменными.

Ошибки, возникающие  при работе с приложением:

1. При неверном  вводе количества функций выводится  сообщение:

    Рис.14 Отображение первого сообщения об ошибке

2. При неверном вводе количества переменных выводится сообщение:

    Рис.15 Отображение второго сообщения об ошибке

3. Если  размерность текущей функции  не соответствует с количеством  переменных введенных в поле, выводится сообщение:

    Рис.16 Отображение третьего сообщения об ошибке

 

4. При нажатие  кнопки «Закрыть» или «крестик» выводится сообщение:

    Рис.17 Отображение предупреждающего сообщения

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

6. Для  правильного представления функции  на карте Карно, необходимо  чтобы порядок следования переменных  был в алфавитном порядке. Количество переменных ограниченно, и равно 26 переменных. 

 

РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Рис. 18 Основное окно

    Для того чтобы отобразить функцию на карте Карно, необходимо:

- правильно ввести функцию:

   для ДНФ функция вводится без скобок;

   для КНФ каждая импликанта должна быть помещена в скобки.

- Правильно указать вид функции (КНФ или ДНФ), которую будем строить.

- Поставить  галочку напротив функции, которую  будем строить.

- Нажать  на кнопку «Построение».

В новом  окне появится карта Карно.

Рис. 19 Карта  Карно

     Для изменения порядка следования переменных на карте Карно необходимо нажать на главной форме кнопку «Порядок переменных». Откроется окно со списком переменных. Переменные перетаскиваются мышкой после установки нужной последовательности нажать кнопку «Ок». Выведется карта Карно с изменой последовательностью переменных.

     Приложение  может 

Рис. 19 Окно настройки последовательности переменых

 
 
    
  1. Нажимаем  кнопку «Ок», на карте Карно отображается первая функция;
  2. Для того чтобы представить на карте другие функции, необходимо изменить номер текущей функции, подготовить карту нужного размера, задав необходимое количество переменны и нажать кнопку «Ок»;
  3. При необходимости можно сохранить рабочие функции нажав кнопку «Сохранить».
 
 
 

АКТ

 
независимого тестирования программного продукта

 

    Объектом  тестирования является Приложение «Представление логических выражений в виде карты Карно»

    Для тестирования предоставлены:

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

    Тестирование  проводилось в операционной системе Windows, без специальных средств отладки, тестирования и тестового приложения.

    Вид проведенного тестирования: тестирование «черного ящика».

    Программный продукт полностью соответствует  заданию. Все пункты задания реализованы.

    При тестировании обнаружены недостатки:

  • Использование большого количества переменных приводит к долгой прорисовке карты Карно, возможно зависание программы;
  • При задании переменных больше 8, наблюдается неправильная прорисовка карты для нечетного количества переменных;
  • При вводе функции, используя кнопки, возникает ошибки при переходе на другую строку.
 
 
 
 
 
 
 
 
 

    Тестирование  проведено    « 24 » июня 2010 г.

 

    Эксперт:  студент гр. 12-61 _____________ _______________

                                           (подпись)   (Ф.И.О.)

 

    ЗАКЛЮЧЕНИЕ

 

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

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

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

      Было  проведено тестирование программного продукта, которое определило работоспособность приложения и правильность построения карты Карно. После доработки приложение почти все недостатки, обнаруженные при тестировании, были устранены. Для этого был упрощен алгоритм функции прорисовки влияния переменных относительно кода Грея, что позволило уменьшить время представления карты Карно, откорректирован алгоритм прорисовки карты в зависимости от количества переменных, исправлены ошибки при вводе функции. У приложения удобный интерфейс. Он позволят наилучшим образом воспринимать информацию и обрабатывать её.

       

 

      ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

 
  1. Разработка  приложений в среде Borland C++ Builder. Методические указания к выполнению лабораторных работ по дисциплине «Технологии разработки программного обеспечения» / Сост.: П.В. Гришмановский. – Сургут: Издательство СурГУ, 2003. – 59 с.
  2. [Электронный ресурс]: Радиоэлектронная техника. Режим доступа: http://www.reltehnika.ru/index.html
  3. [Электронный ресурс]: Карта Карно: http://tablica-istinnosti.ru/karty-karno.html
  4. [Электронный ресурс]: Код Грея:  http://fat-crocodile.narod.ru/gray/gray.html
  5. [Электронный ресурс]: Карта Карно — Википедия: http://ru.wikipedia.org
 
 

 

    Приложение  А.

    Файл  carno.cpp

  1. #include <vcl.h>
  2. #include <math.h>
  3. #pragma hdrstop
  4. #include "Carno.h"
  5. #pragma package(smart_init)
  6. #pragma link "CSPIN"
  7. #pragma resource "*.dfm"
  8. TForm1 *Form1;
  9. int GrayEncode(int);
  10. AnsiString AddZero(AnsiString,int);
  11. __fastcall TForm1::TForm1(TComponent* Owner)
  12. : TForm(Owner)
  13. {
  14. }
  15. void __fastcall TForm1::Button6Click(TObject *Sender)
  16. {
  17. int f=StrToInt(Edit2->Text);
  18. if (f<1)
  19. ShowMessage("неверное количество функций");
  20. if (f!=1)
  21. {
  22. Label2->Visible=true;
  23. CSpinEdit1->Visible=true;
  24. CSpinEdit1->MaxValue=f;
  25. }
  26. }
  27. void __fastcall TForm1::Button7Click(TObject *Sender)
  28. {
  29. char s[26]={'a','b','c','d','e','f','g','h','i',
  30. 'j','k','l','m','n','o','p','q','r',
  31. 's','t','u','v','w','x','y','z'};
  32. int n = StrToInt(Edit1->Text);
  33. if (n>1)
  34. {
  35. if ((n%2) == 0)
  36. {
  37. StringGrid1->ColCount = pow(2,n/2)+n/2;
  38. StringGrid1->RowCount = pow(2,n/2)+n/2;
  39. }
  40. else
  41. {
  42. StringGrid1->ColCount = pow(2,(n+1)/2)+n/2+1;
  43. StringGrid1->RowCount = pow(2,n/2)+n/2+1;
  44. }
  45. }
  46. else
  47. {
  48. ShowMessage("неверное количество переменных");
  49. return;
  50. }
  51. ListBox1->Items->Clear();
  52. int i=0;
  53. for (i=0;i<n;i++)
  54. ListBox1->Items->Add(s[i]);
  55. }
  56. void __fastcall TForm1::CloseBtnClick(TObject *Sender)
  57. {
  58. Close();
  59. }
  60. void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
  61. {
  62. if (Memo1->Lines->Count <= CSpinEdit1->Value-1)
  63. for(int i=Memo1->Lines->Count; i<=CSpinEdit1->Value-1; i++)
  64. Memo1->Lines->Add("");
  65. Memo1->Lines->Strings[CSpinEdit1->Value-1]=Memo1->Lines->Strings[CSpinEdit1->Value-1]+ListBox1->Items->Strings[ListBox1->ItemIndex];
  66. }
  67. void __fastcall TForm1::Button1Click(TObject *Sender)
  68. {
  69. TButton *Btn=(TButton*)Sender;
  70. int pos = CSpinEdit1->Value-1;
  71. switch(Btn->Tag)
  72. {
  73. case 1:
  74. Memo1->Lines->Strings[pos]=Memo1->Lines->Strings[pos] + Button1->Caption;
  75. break;
  76. case 2:
  77. Memo1->Lines->Strings[pos]=Memo1->Lines->Strings[pos] + "&";
  78. break;
  79. case 3:
  80. Memo1->Lines->Strings[pos]=Memo1->Lines->Strings[pos] + Button3->Caption;
  81. break;
  82. case 4:
  83. Memo1->Lines->Strings[pos]=Memo1->Lines->Strings[pos].Delete(Memo1->Lines->Strings[pos].Length(),1);
  84. break;
  85. case 5:
  86. Memo1->Lines->Clear();
  87. for (int i=0; i<StringGrid1->RowCount; i++)
  88. StringGrid1->Rows[i]->Clear();
  89. StringGrid1->Repaint();
  90. break;
  91. }
  92. }
  93. void __fastcall TForm1::BitBtn2Click(TObject *Sender)
  94. {
  95. Memo1->Lines->Clear();
  96. ListBox1->Items->Clear();
  97. char sn[3]={'a','b'};
  98. for (int i=0;i<2;i++)
  99. ListBox1->Items->Add(sn[i]);
  100. Label2->Visible=false;
  101. CSpinEdit1->Visible=false;
  102. Edit2->Text='1';
  103. Edit1->Text='2';
  104. CheckBox1->Checked = true;
  105. CheckBox2->Checked = false;
  106. }
  107. void __fastcall TForm1::CheckBox1Click(TObject *Sender)
  108. {
  109. if (CheckBox1->Checked==true)
  110. CheckBox2->Checked=false;
  111. }
  112. void __fastcall TForm1::CheckBox2Click(TObject *Sender)
  113. {
  114. if (CheckBox2->Checked==true)
  115. CheckBox1->Checked=false;
  116. }
  117. AnsiString ImplicantToCode(AnsiString str, AnsiString symbol, int n)
  118. {
  119. if (symbol == "+")
  120. symbol = "&";
  121. else
  122. if (symbol == "&")
  123. symbol = "+";
  124. AnsiString temp;
  125. AnsiString f = "";
  126. int count_var = 0;
  127. do
  128. {
  129. int number_del = 0;
  130. int correct = 0;
  131. if (str.Pos(symbol) > 0)
  132. {
  133. number_del = str.Pos(symbol);
  134. correct = 1;
  135. }
  136. else
  137. {
  138. number_del = str.Length();
  139. correct = 0;
  140. }
  141. temp = str.SubString(1,number_del-correct);
  142. count_var++;
  143. if (count_var >n)
  144. {
  145. return "-1";
  146. }
  147. if (temp.Length() > 1)
  148. f += "0";
  149. else    f += "1";
  150. str.Delete(1,number_del);
  151. }
  152. while (str.Length() > 0);
  153. return f;
  154. }
  155. int AnsiStrToInt(AnsiString s)
  156. {
  157. char x[16];
  158. ZeroMemory(x,sizeof(char[16]));
  159. bool enable = false;
  160. int count = 0;
  161. for(int i= 0; i<s.Length(); i++)
  162. if (s.c_str()[i] == '1')
  163. {
  164. x[count] = '1';
  165. enable = true;
  166. count++;
  167. }
  168. else
  169. {
  170. if (enable)
  171. {
  172. x[count] = '0';
  173. count++;
  174. }
  175. }
  176. char temp[16];
  177. ZeroMemory(temp,sizeof(char[16]));
  178. for(int i=0; i<pow(2,s.Length());i++)
  179. {
  180. itoa(GrayEncode(i),temp,2);
  181. if (strcmp(temp, x) == 0)
  182. return i;
  183. }
  184. return 0;
  185. }
  186. void TForm1::VariableToTable(AnsiString s)
  187. {
  188. char g[8];
  189. TRect Rect;
  190. AnsiString temp;
  191. int n = StrToInt(Edit1->Text);
  192. int row = AnsiStrToInt(s.SubString(1,n/2));
  193. int col = AnsiStrToInt(s.SubString(n/2+1,s.Length()));
  194. Rect = StringGrid1->CellRect(col+n/2,row+n/2+n%2);
  195. StringGrid1->Canvas->Brush->Color = clWhite;
  196. StringGrid1->Canvas->FillRect(Rect);
  197. StringGrid1->Canvas->TextRect(Rect, Rect.Left + 4, Rect.Top + 2, "1");
  198. }
  199. void __fastcall TForm1::BitBtn1Click(TObject *Sender)
  200. {
  201. StringGrid1->Repaint();
  202. AnsiString symbol;
  203. if (Memo1->Modified == true)
  204. {
  205. if (CheckBox1->Checked)
  206. symbol = "+";
  207. if (CheckBox2->Checked)
  208. symbol = "&";
  209. }
  210. else return;
  211. AnsiString str = Memo1->Lines->Strings[CSpinEdit1->Value-1];
  212. AnsiString substr;
  213. do
  214. {
  215. int number_del = 0;
  216. int correct = 0;
  217. if (str.Pos(symbol) > 0)
  218. {
  219. number_del = str.Pos(symbol);
  220. correct = 1;
  221. }
  222. else
  223. {
  224. number_del = str.Length();
  225. correct = 0;
  226. }
  227. substr = str.SubString(1,number_del-correct);
  228. AnsiString test = ImplicantToCode(substr,symbol,StrToInt(Edit1->Text));
  229. if (test.AnsiCompare("-1") != 0)
  230. VariableToTable(test);
  231. else
  232. {
  233. ShowMessage("Количество переменных превышает размерность карты Карно!");
  234. return;
  235. }
  236. str.Delete(1,number_del);
  237. }
  238. while (str.Length() > 0);
  239. }
  240. int GrayEncode(int g)
  241. {
  242. return g ^ (g >> 1);
  243. }
  244. AnsiString AddZero (AnsiString str, int len)
  245. {
  246. int count = str.Length();
  247. for (int i = 0; i < len - count; i++)
  248. str = "0" + str;
  249. return str;
  250. }
  251. void TForm1::DrawGray(void)
  252. {
  253. TRect Rect;
  254. AnsiString str;
  255. char * s;
  256. int Y = StrToInt(Edit1->Text)/2;
  257. int X;
  258. if (StrToInt(Edit1->Text)%2 == 0)
  259. X = StrToInt(Edit1->Text)/2;
  260. else
  261. X = StrToInt(Edit1->Text)/2 + 1;
  262. s = new char[8];
  263. StringGrid1->FixedCols = Y;
  264. StringGrid1->FixedRows = X;
  265. for (int i=0; i<StringGrid1->ColCount-Y; i++)
  266. {
  267. itoa(GrayEncode(i), s, 2);
  268. str = s;
  269. str = AddZero(str,8);
  270. //Memo1->Lines->Add(str + " " + str.Length());
  271. if (i<StringGrid1->RowCount-X)
  272. for (int j=0; j<8; j++)
  273. if (str.c_str()[j] == '1')
  274. {
  275. Rect = StringGrid1->CellRect(j-8+Y,i+X);
  276. StringGrid1->Canvas->Brush->Color = clLime;
  277. StringGrid1->Canvas->FillRect(Rect);
  278. StringGrid1->Canvas->TextRect(Rect, Rect.Left + 4, Rect.Top + 2, "1");
  279. }
  280. if (i<StringGrid1->ColCount-Y)
  281. for (int j=0; j<8; j++)
  282. if (str.c_str()[j] == '1')
  283. {
  284. Rect = StringGrid1->CellRect(i+Y,j-8+X);
  285. StringGrid1->Canvas->Brush->Color = clSkyBlue;
  286. StringGrid1->Canvas->FillRect(Rect);
  287. StringGrid1->Canvas->TextRect(Rect, Rect.Left + 4, Rect.Top + 2, "1");
  288. }
  289. }
  290. }
  291. void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
  292. int ARow, TRect &Rect, TGridDrawState State)
  293. {
  294. DrawGray();
  295. }
  296. void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
  297. {
  298. if (Memo1->Modified)
  299. {
  300. switch (MessageDlg("Вы действительно хотите закрыть приложение?\nВсе несохранненые данные будут утеряны.",
  301. mtInformation, TMsgDlgButtons() << mbYes << mbNo, 0))
  302. {
  303. case mrYes: Action = caFree;
  304. break;
  305. //case mrNo:  break;
  306. default:    Action = caNone;
  307. }
  308. }
  309. }
  310. void __fastcall TForm1::Button9Click(TObject *Sender)
  311. {
  312. if (SaveDialog1->Execute())
  313. {
  314. Memo1->Lines->SaveToFile(SaveDialog1->FileName);
  315. label_info->Caption = "Функция была сохранена в файл: "+SaveDialog1->FileName;
  316. Memo1->Modified=false;
  317. Button9->Enabled = false;
  318. }
  319. }
  320. void __fastcall TForm1::Memo1Change(TObject *Sender)
  321. {
  322. Button9->Enabled = true;
  323. }
  324. void __fastcall TForm1::Button8Click(TObject *Sender)
  325. {
  326. if (OpenDialog1->Execute())
  327. {
  328. Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
  329. label_info->Caption = "Функция была загружена из файла "+OpenDialog1->FileName;
  330. Memo1->Modified = true;
  331. }
  332. }

Информация о работе Представление логических выражений в виде карт Карно