Формирование графовой модели заданного фрагмента принципиальной электрической схемы
Аннотация
В данной пояснительной записке приведено
описание алгоритма и исходного кода программы формирования графовой модели
заданного фрагмента принципиальной электрической схемы. Разработаны схемы
алгоритмов решения задачи. В среде Microsoft Visual Studio 2005 (C++)
разработана и отлажена программа, реализующая представленные алгоритмы. Также
представлены результаты решения контрольных примеров, выполненные с помощью
разработанной программы.
В приложении приведён текст программы.
графовая модель программа
Содержание
1.Описание
программы
.1Общие
сведения
.2Функциональное
назначение
.3Описание
логической структуры
.4Cтруктурная
схема основной программы
.5Алгоритм
функции vvod()
.6
Алгоритм функции int **matr()
.Описание
контрольного примера
Приложение
1. Описание программы
.1 Общие сведения
Программа формирования графовой модели заданного
фрагмента принципиальной электрической схемы написана в среде Microsoft Visual
Studio 2005.
Программа имеет имя «PraktikaDasha».
Программа запускается на выполнение при помощи
Visual Studio 2005 C++, в случае же присутствия исполняемого файла можно
произвести запуск из операционной системы Windows.
.2 Функциональное назначение
Программа предназначена для формирования
графовой модели заданного фрагмента принципиальной электрической схемы.
Программа выполняет следующие функции:
. Чтение списка по цепям из представленного
текстового файла.
. Формирование списка по цепям данного графа (с
использованием динамической структуры - линейного списка)
. Формирование и вывод матрицы свяхности.
. Рисование графовой модели (цепь-дерево)
заданного фрагмента.
.3 Описание логической структуры
Программа разбита на отдельные функциональные
части - подпрограммы, которые распределяются по отдельным уровням иерархии.
Каждая из подпрограмм решает только свою небольшую задачу по преобразованию
данных, что позволяет упростить процесс написания и отладки программы в целом.
Далее приводится описания назначения всех функций.
Функция CepCont *vvod_file (char file_name [ ]) позволяет
выбрать файл и исходными данными и сформировать линейный динамический список.
Функция void vivod_spis(CepCont *st, HWND
hwndEdit) выводит полученный список по цепям на экран.
Функция int kol_elem(CepCont *st) подсчитывает
количество элементов.
Функция void del_matr(int **matr, int k) удаляет
динамическую матрицу.
Функция int **memory (int k) выделяет память под
динамическую матрицу.
Функция int **form_matr(CepCont *st, int k)
преобразовывает список в матрицу.
Функция void vivod_matr (int **matr, int k, HWND
hwndEdit) выводит полученную матрицу связности на экран.
Функция void
save_matr(char file_name [ ], int **matr, int k) сохраняет
матрицу
в
файл.
Функция void
del_spis(CepConrt *BegSpis) удаляет
динамический
список.
Функция MyDlgProc
(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) обработка
сообщений
диалога.
1.4 Cтруктурная схема основной программы
1.5 Алгоритм функции vvod():
1.6 Алгоритм функции int **matr()
2. Описание контрольного примера
Дана схема варианта №12:
Составим входное описание заданной схемы в виде
списка по цепям:
3
1
1
3
2
1
2
2
2
1
4
3
2
2
1
2
3
1
3
2
1
5
2
3
2
2
3
4
По входному описанию схемы сформируем матрицу
связности
1 1 0 0 0 1
0 1 0 0 0 1
1 0 1 1 0 0
0 1 0 0 2 0
0 1 0 0 1 0
0 0 2 1 0 2
1 0 0 0 2 0
Построим граф:
Мы получили верные результаты, что позволяет нам
сделать вывод о правильной реализации алгоритма в программе.
Приложение
#include <stdio.h>
#include <windows.h>
#include "resource.h"
#include <direct.h>
#include
<cmath>file_name[MAX_PATH+1], customfilter[100];**matr, k, flag;of,
sf;CepCont
{ce, kk;
CepCont *adres;
};*BegSpis=NULL;*vvod_file(char
file_name[])
{ ce, kk;*f_in;_in=fopen(file_name,"r");(f_in!=NULL)
{*st=NULL;
CepCont *sp=NULL;
while(fscanf(f_in,"%d%d",&ce,&kk)==2)
{=new CepCont;(BegSpis==NULL)
BegSpis=st;sp->adres=st;=st;
st->ce=ce;>kk=kk;
}
if(sp!=NULL)
sp->adres=NULL;(f_in);
return BegSpis;
}
{
return NULL;
}
}vivod_spis(CepCont *st,HWND
hwndEdit)
{n, i;buf[25];(st!=NULL)
{(buf, "Цепь%d\tКонтактов%d",
st->ce,
st->kk);(hwndEdit,EM_REPLACESEL,0,(LPARAM)buf);(hwndEdit,EM_REPLACESEL,0,(LPARAM)"\r\n");=st->kk;=st->adres;(i=0;
i<n; i++)
{(buf, "Элемент%d
Контакт%d",
st->ce, st->kk);(hwndEdit, EM_REPLACESEL, 0,(LPARAM)buf);(hwndEdit,
EM_REPLACESEL, 0,(LPARAM)"\r\n");=st->adres;
}(hwndEdit, EM_REPLACESEL,
0,(LPARAM)"\r\n");
}
}kol_elem(CepCont *st)
{max=0, i, n;(st!=NULL)
{=st->kk;=st->adres;(i=0;
i<n; i++)
{(st->ce>max)
max=st->ce;=st->adres;
}
}max;
}del_matr(int **matr, int k)
{(int i=0; i<k;
i++)[]matr[i];[]matr;
}**memory(int k)
{**matr=new int *[k];(matr==NULL)
return NULL;(int i=0; i<k; i++)
{[i]=new int [k];(matr[i]==NULL)
{_matr(matr, i);NULL;
}
}matr;
}**form_matr (CepCont *st, int k)
{i, j,
n;**matr=memory(k);*sp;(matr==NULL) return NULL;(i=0; i<k; i++)(j=0; j<k;
j++)[i][j]=0;(st!=NULL)
{=st->kk;=st->adres;(n!=0)
{(i=0; i<n-1; i++)
{=st;=st->adres;(sp->ce!=st->ce)
{[sp->ce-1][st->ce-1]++;[st->ce-1][sp->ce-1]++;
}
}=st->adres;
}
}matr;
}vivod_matr(int **matr, int k,HWND
hwndEdit)
{buf[256];(int i=0;i<k;i++)
{(int j=0;j<k;j++)
{(buf,"%d
",matr[i][j]);(hwndEdit,EM_REPLACESEL,0,(LPARAM)buf);
}
}save_matr(char file_name[], int
**matr, int k)
{*f_out;_out=fopen(file_name,"w");(f_out!=NULL)
{(f_out,"Матрица
связности\n");
for(int i=0;i<k;i++)
{(int j=0;j<k;j++)(f_out,"%d
", matr[i][j]);(f_out, "\n");
}(f_out);
}
}del_spis(CepCont *BegSpis)
{*sp=NULL;(BegSpis!=NULL)
{=BegSpis->adres;BegSpis;=sp;
}
}CALLBACK MyDlgProc(HWND hwnd,UINT
msg,WPARAM wp,LPARAM lp)
{double pi=3.14159;(msg)
{WM_INITDIALOG:break;WM_COMMAND:(LOWORD(wp))
{IDCANCEL:
{_spis;_matr;EndDialog(hwnd,IDCANCEL);
}IDOPEN:
{initialdir[MAX_PATH+1];(initialdir,
MAX_PATH+1);(&of, 0,
sizeof(of));.lStructSize=sizeof(of);.lpstrFilter="Текстовые
файлы
(*.txt)\0*.txt\0" "Все
файлы
(*.*)\0*.*\0";
.nFilterIndex=1;.lpstrCustomFilter=customfilter;.nMaxCustFilter=100;_name[0]='\0';.lpstrFile=file_name;.nMaxFile=MAX_PATH+1;.lpstrInitialDir=initialdir;.lpstrTitle="Диалог
открытия
файла";(GetOpenFileName(&of)!=0)
{(GetDlgItem(hwnd,IDC_EDIT1),0);(GetDlgItem(hwnd,IDC_EDIT2),0);(hwnd,
0, 0);(BegSpis!=NULL)
{_spis(BegSpis);=NULL;
}(matr!=NULL)
{_matr(matr, k);=NULL;
}((BegSpis=vvod_file(file_name))==NULL)
{(hwnd, "Файл не существует, или содержит
не верные данные", "Ошибка!", 0);
break;
}
};
}IDSPIS:
{(BegSpis!=NULL)
{(GetDlgItem(hwnd,IDC_EDIT1),0);_spis(BegSpis,
GetDlgItem(hwnd,IDC_EDIT1));
}
else MessageBox(hwnd, "Не загружены
исходные данные", "Ошибка!", 0);
break;
}IDMATRIX:
{(BegSpis!=NULL)
{(matr==NULL)
{=kol_elem(BegSpis);=form_matr(BegSpis,
k);_matr(matr , k, GetDlgItem(hwnd,IDC_EDIT2));
}
}MessageBox(hwnd, "Не загружены исходные
данные", "Ошибка!", 0);
break;
}IDGRAF:
{ (matr!=NULL)
{=1;rect;.left=150;.top=50;.right=550;.bottom=400;(hwnd,&rect,1);
}MessageBox(hwnd, "Не
сформирована
матрица",
"Ошибка!",
0);;
}IDSAVE:
{initialdir[MAX_PATH+1];(initialdir,
MAX_PATH+1);(&of, 0, sizeof(of));.lStructSize=sizeof(of);.lpstrFilter="Текстовые
файлы
(*.txt)\0*.txt\0" "Все
файлы
(*.*)\0*.*\0";
.nFilterIndex=1;.lpstrCustomFilter=customfilter;.nMaxCustFilter=100;_name[0]='\0';.lpstrFile=file_name;.nMaxFile=MAX_PATH+1;.lpstrInitialDir=initialdir;.lpstrTitle="Диалог
сохранения
файла";(GetSaveFileName(&sf)!=0)
save_matr(file_name, matr, k);
else MessageBox(hwnd, "Не сформирована
матрица", "Ошибка!", 0);
}: return 0;
}WM_PAINT:*xe, *ye, xc, yc, i, j;
str[10];f;hdc;hpen,old_pen;hbrush,old_brush;ps;=BeginPaint(hwnd,&ps);((matr!=NULL)&&(flag==1))
{=new int [k];=new int [k];
SetBkMode(hdc,TRANSPARENT);=CreatePen(PS_SOLID,1,RGB(0,0,255));=CreateSolidBrush(RGB(255,0,0));=2*pi/k;(i=0;i<k;i++)
{[i]=150*cos(f*i)+360;[i]=150*sin(f*i)+230;
}_pen=(HPEN)SelectObject(hdc,hpen);_brush=(HBRUSH)SelectObject(hdc,hbrush);(i=0;
i<k; i++)(j=0; j<k; j++)
{(matr[i][j]>0)
{(hdc, xe[i], ye[i], 0);(hdc, xe[j],
ye[j]);(str, "%d",
matr[i][j]);=(xe[i]+xe[j]-10)/2;=(ye[i]+ye[j]-10)/2;(hdc,xc,yc,str,1);
}
}(i=0;i<k;i++)
{(str,"%d",i+1);(hdc,xe[i]-20,ye[i]-20,xe[i]+20,ye[i]+20);(hdc,xe[i]-5,ye[i]-5,str,1);
}(hwnd,&ps);(hpen);(hbrush);[]
xe, ye;
}EndPaint(hwnd,&ps);: return 0;
}1;
}WINAPI WinMain
(hInstance,hPrevInstance,lpCmdLine,
nCmdShow)
{
DialogBox(0,MAKEINTRESOURCE(IDD_DIALOG),0,MyDlgProc);
}
1.