中南大学测绘程序课程设计代码

中南大学测绘程序课程设计代码
中南大学测绘程序课程设计代码

(1)ClzControlPoint头文件

class ClzControlPoint

{

public:

ClzControlPoint();

~ClzControlPoint();

double X;

double Y;

CString strPointID;

int state;

int flg;

double dE;

double dF;

double dQ;

double dMx;

double dMy;

double dMk;

};

ClzControlPoint源文件

#pragma once

#include"stdafx.h"

#include"ClzControlPoint.h"

ClzControlPoint::ClzControlPoint() {

X = 0;

Y = 0;

strPointID = _T("");

flg = 0;

state = 0;

dE = 0;

dF = 0;

dQ = 0;

dMx=0;

dMy=0;

dMk=0;

}

ClzControlPoint::~ClzControlPoint() {

}

(2)ClzDistObs头文件

class ClzDistObs

{

public:

ClzDistObs();

~ClzDistObs();

public:

ClzControlPoint *cpStart, *cpEnd;

double dDist;

};

ClzDistObs源文件

#include"stdafx.h"

#include"ClzDistObs.h"

ClzDistObs::ClzDistObs()

{

dDist = 0;

cpStart = NULL;

cpEnd = NULL;

}

ClzDistObs::~ClzDistObs()

{

cpStart = NULL;

cpEnd = NULL;

}

(3)ClzAngleObs头文件

class ClzAngleObs

{

public:

ClzAngleObs();

~ClzAngleObs();

public:

ClzControlPoint *cpStation;

ClzControlPoint *cpEnd;

Angle ObsAngle;

};

ClzAngleObs源文件

#include"stdafx.h"

#include"ClzAngleObs.h"

ClzAngleObs::ClzAngleObs()

{

cpStation = NULL;

cpEnd = NULL;

ObsAngle = 0;

}

}

ClzAngleObs::~ClzAngleObs()

{

cpStation=NULL;

cpEnd=NULL;

}

(4)ClzControlNetAdjust头文件

#pragma once

#include"ClzControlPoint.h"

#include"ClzAngleObs.h"

#include"ClzDistObs.h"

#include"Matrix.h"

#include"Angle.h"

class ClzControlNetAdjust

{

public:

ClzControlNetAdjust();

~ClzControlNetAdjust();

private:

ClzControlPoint * m_pUnknowPoint;

int m_iUnknowPointCount;

ClzControlPoint * m_pKnowPoint;

int m_iKnowPointCount;

ClzAngleObs * m_pAngleObs;

int m_iAngleObsCount;

ClzDistObs * m_pDistObs;

int m_iDistObsCount;

public:

double Anglesigma;

double Distsigma;

int m_iStationCount;

bool LoadObsData(const CString& strFileName);

void CoordinateEstimates();

void SetAnglesigmaD(double Asigma,double Dsigma,double count);

void ErrorEllipseDraw(CDC * pDC, CRect& rect);

void CalculateErrorEquations(const CString& strFileName); private:

ClzControlPoint* SearchKnownPointUsingID(CString strID);

ClzControlPoint* SearchUnknownPointUsingID(CString strID);

void SetKnowPointSize(int size);

void SetUnknowPointSize(int size);

void SetAngleObsSize(int size);

void SetDistObsSize(int size);

CString* SplitString(CString str, char split, int iSubStrs);

ClzControlPoint* SearchPointUsingID(CString strPointID);

Angle Azimuth(double dX1, double My1, double dX2, double My2);

double HDist(ClzControlPoint* cpStation1, ClzControlPoint* cpEnd1);

Angle ZeroAngle(ClzAngleObs AngleObs);

void FormErrorEquations(CMatrix &B, CMatrix &f);

void ComAngleObsEff(ClzAngleObs AngleObs ,double& Fi, double& Ci, double& Di, double& Ck, double& Dk);

void ComDistObsEff(ClzDistObs DistObs, double& Fi, double& Ci, double& Di, double& Ck, double& Dk);

void FixedWeight(CMatrix &p);

void GetMaxXY(double& dx, double& dy,double& minx,double& maxy);

void OutMatrixToFile(const CMatrix& mat, CStdioFile& SF);

}

ClzControlNetAdjust源文件

#include"stdafx.h"

#include"ClzControlNetAdujst.h"

#include

#include"math.h"

const double PI =atan(1.0)*4.0;

const double EPSILON = 1.0E-12;

const double R0 = 206265;

ClzControlNetAdjust::ClzControlNetAdjust()

{

m_pUnknowPoint=NULL;

m_iUnknowPointCount=0;

m_pKnowPoint=NULL;

m_iKnowPointCount=0;

m_pAngleObs=NULL;

m_iAngleObsCount=0;

m_pDistObs=NULL;

m_iDistObsCount = 0;

Anglesigma=0;

Distsigma=0;

m_iStationCount=0;

}

ClzControlNetAdjust::~ClzControlNetAdjust()

{

delete[] m_pUnknowPoint;

m_pUnknowPoint = NULL;

delete[] m_pKnowPoint;

m_pKnowPoint = NULL;

delete[] m_pAngleObs;

m_pAngleObs = NULL;

delete[] m_pDistObs;

m_pDistObs = NULL;

}

void ClzControlNetAdjust::SetKnowPointSize(int size) {

if (m_pKnowPoint != NULL)

{ delete[] m_pKnowPoint;

m_pKnowPoint = NULL;

m_iKnowPointCount=0; }

m_iKnowPointCount = size;

m_pKnowPoint = new ClzControlPoint[size];

}

void ClzControlNetAdjust::SetUnknowPointSize(int size) {

if (m_pUnknowPoint != NULL)

{

delete[] m_pUnknowPoint;

m_pUnknowPoint = NULL;

m_iUnknowPointCount = 0;

}

m_iUnknowPointCount = size;

m_pUnknowPoint = new ClzControlPoint[size];

}

void ClzControlNetAdjust::SetAngleObsSize(int size)

{

if (m_pAngleObs!=NULL)

{

delete[] m_pAngleObs;

m_pAngleObs = NULL;

m_iAngleObsCount = 0;

}

m_iAngleObsCount = size;

m_pAngleObs = new ClzAngleObs[size];

}

void ClzControlNetAdjust::SetDistObsSize(int size)

{

if (m_pDistObs!=NULL)

{

delete[] m_pDistObs;

m_pDistObs = NULL;

m_iDistObsCount = 0;

}

m_iDistObsCount = size;

m_pDistObs = new ClzDistObs[size];

}

CString* ClzControlNetAdjust::SplitString(CString str, char split, int iSubStrs)

{

int iPos = 0; //分割符位置

int iNums = 0; //分割符的总数

CString strTemp = str;

CString strRight;

//先计算子字符串的数量

while (iPos != -1)

{

iPos = strTemp.Find(split);

if (iPos == -1)

{

break;

}

strRight = strTemp.Mid(iPos + 1, str.GetLength());

strTemp = strRight;

iNums++;

}

if (iNums == 0) //没有找到分割符

{

//子字符串数就是字符串本身

iSubStrs = 1;

return NULL;

}

//子字符串数组

iSubStrs = iNums + 1; //子串的数量 = 分割符数量 + 1

CString* pStrSplit;

pStrSplit = new CString[iSubStrs];

strTemp = str;

CString strLeft;

for (int i = 0; i < iNums; i++)

{

iPos = strTemp.Find(split);

//左子串

strLeft = strTemp.Left(iPos);

//右子串

strRight = strTemp.Mid(iPos + 1, strTemp.GetLength());

strTemp = strRight;

pStrSplit[i] = strLeft;

}

pStrSplit[iNums] = strTemp;

return pStrSplit;

}

ClzControlPoint* ClzControlNetAdjust::SearchKnownPointUsingID(CString strID)

{

for (int i = 0; i

{

if (strID == m_pKnowPoint[i].strPointID)

{

return &m_pKnowPoint[i];

}

}

return NULL;

}

ClzControlPoint*

ClzControlNetAdjust::SearchUnknownPointUsingID(CString strID)

{

for (int i = 0; i

{

if (strID == m_pUnknowPoint[i].strPointID)

{

return &m_pUnknowPoint[i];

}

}

return NULL;

}

ClzControlPoint* ClzControlNetAdjust::SearchPointUsingID(CString strPointID)

{

ClzControlPoint* pCP = NULL;

pCP = SearchKnownPointUsingID(strPointID);

if (pCP == NULL)

{

pCP = SearchUnknownPointUsingID(strPointID);

}

return pCP;

}

Angle ClzControlNetAdjust::Azimuth(double dX1, double dY1, double dX2, double dY2)

{

Angle A;

int sgn;

if (dY2 - dY1+EPSILON >= 0)

{

sgn = 1;

}

else sgn = -1;

A(RAD)= PI - sgn*PI / 2 - atan((dX2 - dX1) / (dY2 - dY1 + EPSILON));

return A;

}

double ClzControlNetAdjust::HDist(ClzControlPoint* cpStation1, ClzControlPoint* cpEnd1)

{

double dDist;

dDist = sqrt((cpStation1->X - cpEnd1->X)*(cpStation1->X - cpEnd1->X) + (cpStation1->Y - cpEnd1->Y)*(cpStation1->Y- cpEnd1->Y));

return dDist;

}

Angle ClzControlNetAdjust::ZeroAngle(ClzAngleObs AngleObs)

{

Angle ZeroAlf;

for (int i = 0; i < m_iAngleObsCount; i++)

{

if((m_pAngleObs[i].cpStation->strPointID == AngleObs.cpStation->strPointID) && m_pAngleObs[i].ObsAngle(DMS)-0.000000 < EPSILON)

{

ZeroAlf = Azimuth(m_pAngleObs[i].cpStation->X, m_pAngleObs[i].cpStation->Y, m_pAngleObs[i].cpEnd->X, m_pAngleObs[i].cpEnd->Y);

}

}

return ZeroAlf;

}

void ClzControlNetAdjust::FormErrorEquations(CMatrix &B, CMatrix &f) {

int iObsCount, iUnknownCount;

iObsCount = m_iAngleObsCount + m_iDistObsCount;

iUnknownCount = m_iStationCount + m_iUnknowPointCount * 2;

B.SetSize(iObsCount, iUnknownCount);

f.SetSize(iObsCount, 1);

for (int i = 0; i < iObsCount;i++)

for (int j = 0; j < iUnknownCount; j++)

{

B(i, j) = 0;

}

for (int i = 0; i < iObsCount; i++)

{

f(i, 0) = 0;

}

//方向值误差方程

int StationNum = 1;

int tmpi = 1;

for (int i = 0; i < m_iAngleObsCount;i++)

{

double fi, ci, di, ck, dk;

ComAngleObsEff(m_pAngleObs[i],fi,ci,di,ck,dk);

if(m_pAngleObs[i].cpStation->strPointID != m_pAngleObs[tmpi].cpStation->strPointID

)

StationNum++;

B(i, m_iUnknowPointCount * 2 - 1 + StationNum) = -1;

tmpi = i;

for (int j = 0; j < m_iUnknowPointCount; j++)

{

if(m_pAngleObs[i].cpStation->strPointID == m_pUnknowPoint[j].strPointID)

{

B(i, 2 * j) = ci;

B(i, 2 * j + 1) = di;

}

if(m_pAngleObs[i].cpEnd->strPointID == m_pUnknowPoint[j].strPointID)

{

B(i, 2 * j) = ck;

B(i, 2 * j + 1) = dk;

}

}

f(i, 0) = fi;

}

//距离观测误差方程

for (int i = 0; i < m_iDistObsCount; i++)

{

double fi, ci, di, ck, dk;

ComDistObsEff(m_pDistObs[i],fi,ci,di,ck,dk);

for (int j = 0; j < m_iUnknowPointCount; j++)

{

if(m_pDistObs[i].cpStart->strPointID == m_pUnknowPoint[j].strPointID)

{

B(i+m_iAngleObsCount, 2 * j) = ci;

B(i+m_iAngleObsCount, 2 * j + 1) = di;

}

if(m_pDistObs[i].cpEnd->strPointID == m_pUnknowPoint[j].strPointID)

{

B(i + m_iAngleObsCount, 2 * j) = ck;

B(i + m_iAngleObsCount, 2 * j + 1) = dk;

}

}

f(i+m_iAngleObsCount, 0) = fi;

}

}

void ClzControlNetAdjust::ComAngleObsEff(ClzAngleObs AngleObs, double& Fi, double& Ci, double& Di, double& Ck, double& Dk)

{

double dXik, dYik,dSik;

dXik = AngleObs.cpEnd->X - AngleObs.cpStation->X;

dYik = AngleObs.cpEnd->Y - AngleObs.cpStation->Y;

dSik = HDist(AngleObs.cpStation, AngleObs.cpEnd);

Angle Aziik;

Aziik = Azimuth(AngleObs.cpStation->X, AngleObs.cpStation->Y, AngleObs.cpEnd->X, AngleObs.cpEnd->Y );

double a, b;

a = R0*dYik / (dSik*dSik * 1000.0);

b =- R0*dXik / (dSik*dSik * 1000.0);

Ci = a;

Di = b;

Ck = -a;

Dk = -b;

Angle Zero;

Zero = ZeroAngle(AngleObs);

double L0;

L0 = Aziik(RAD) - Zero(RAD);

if (L0 < 0)

L0 =L0+2*PI;

Fi = AngleObs.ObsAngle(RAD) - L0;

Fi = Fi*R0 ;;//常数项单位改为秒

}

void ClzControlNetAdjust::ComDistObsEff(ClzDistObs DistObs, double& Fi, double& Ci, double& Di, double& Ck, double& Dk)

{

double dSik;

dSik = HDist(DistObs.cpStart, DistObs.cpEnd);

double c, d;

c = (DistObs.cpEnd->X - DistObs.cpStart->X) / dSik;

d = (DistObs.cpEnd->Y - DistObs.cpStart->Y) / dSik;

Ci = -c;

Di = -d;

Ck = c;

Dk = d;

Fi = (DistObs.dDist - dSik)*1000;

}

void ClzControlNetAdjust::OutMatrixToFile(const CMatrix& mat, CStdioFile& SF)

{

CString strLine, strTmp;

for (int i = 0; i

{

strLine.Empty();

for (int j = 0; j

{

strTmp.Format(_T("%.4f "), mat(i, j));

strLine = strLine + strTmp;

}

SF.WriteString(strLine + _T("\r\n"));

}

}

void ClzControlNetAdjust::FixedWeight(CMatrix &p)

{

int iCount = m_iAngleObsCount + m_iDistObsCount;

p.SetSize(iCount, iCount);

p.Unit();

for (int i = m_iAngleObsCount ; i < iCount; i++)

{

p(i, i) = Anglesigma*Anglesigma / (Distsigma*Distsigma*m_pDistObs[i-m_iAngleObsCount].dDist/1000);

}

}

//控制网主函数

void ClzControlNetAdjust::CalculateErrorEquations(const CString& strFileName)

{

CStdioFile sf;

CString strLine;

setlocale(LC_ALL, "");

if(!sf.Open(strFileName, CFile::modeCreate| CFile::modeWrite))return;

strLine.Format(_T("概算后坐标\n"));

sf.WriteString(strLine);

strLine.Format(_T("未知点个数:%d\n"), m_iUnknowPointCount);

sf.WriteString(strLine);

for (int i = 0; i < m_iUnknowPointCount; i++)

{

strLine.Format(_T("%s,%.4f,%.4f\n"), m_pUnknowPoint[i].strPointID, m_pUnknowPoint[i].X,

m_pUnknowPoint[i].Y);

sf.WriteString(strLine);

}

CMatrix B, v, x, f, p;

CMatrix Nbb, fe;

double max = 0;

do{

FormErrorEquations(B, f);

FixedWeight(p);

Nbb = ~B*p*B;

fe = ~B*p*f;

x = Nbb.Inv()*fe;

v = B*x - f;

for (int i = 0; i < m_iUnknowPointCount; i++)

{

m_pUnknowPoint[i].X = m_pUnknowPoint[i].X + x(2 * i, 0) / 1000;

m_pUnknowPoint[i].Y = m_pUnknowPoint[i].Y + x(2 * i + 1, 0) / 1000;

i;

}

max++;

} while (max<5);

CMatrix Qxx;

Qxx = Nbb.Inv();

sf.WriteString(_T("矩阵B\n"));

OutMatrixToFile(B, sf);

sf.WriteString(_T("矩阵f\n"));

OutMatrixToFile(f, sf);

sf.WriteString(_T("矩阵权阵p\n"));

OutMatrixToFile(p, sf);

sf.WriteString(_T("矩阵Qxx\n"));

OutMatrixToFile(Qxx, sf);

double dVzero = 0;

for (int i = 0; i < m_iAngleObsCount; i++)

{

if (m_pAngleObs[i].ObsAngle(DMS) - 0.000000 < EPSILON)

{

dVzero = v(i, 0);

}

v(i, 0) -= dVzero;

}

CMatrix r(1,1);

r = ~v*p*v;

double r0;//单位权中误差

r0 = sqrt(r(0, 0) / (m_iAngleObsCount + m_iDistObsCount - 2 * m_iUnknowPointCount-m_iStationCount ));

strLine.Format(_T("单位权中误差:%.4f\n"),r0);

sf.WriteString(strLine);

for (int i = 0; i < m_iUnknowPointCount; i++)

{

m_pUnknowPoint[i].dMx = r0*sqrt(Qxx(2 * i, 2 * i));

m_pUnknowPoint[i].dMy = r0*sqrt(Qxx(2 * i+1, 2 * i+1));

m_pUnknowPoint[i].dMk = sqrt((m_pUnknowPoint[i].dMx*m_pUnknowPoint[i].dMx + m_pUnknowPoint[i].dMy*m_pUnknowPoint[i].dMy));

m_pUnknowPoint[i].dQ = atan(2*Qxx(2*i,2*i+1)/(Qxx(2*i,2*i)-Qxx(2*i+1,2*i+1))) / 2.0;

m_pUnknowPoint[i].dE = r0*sqrt((Qxx(2 * i, 2 * i) + Qxx(2 * i, 2 * i + 1)*tan(m_pUnknowPoint[i].dQ)));

m_pUnknowPoint[i].dF = r0*sqrt((Qxx(2 * i, 2 * i) + Qxx(2 * i, 2 * i + 1)*tan(m_pUnknowPoint[i].dQ+PI/2)));

/*double K = sqrt((Qxx(2 * i, 2 * i) - Qxx(2 * i + 1, 2 * i + 1))*(Qxx(2 * i, 2 * i) - Qxx(2 * i + 1, 2 * i + 1))

+ 4 * Qxx(2 * i, 2 * i + 1)*Qxx(2 * i, 2 * i + 1));

double Qe = (Qxx(2 * i, 2 * i) + Qxx(2 * i, 2 * i + 1) + K)/2;

double Qf = (Qxx(2 * i, 2 * i) + Qxx(2 * i, 2 * i + 1) -K) / 2;

m_pUnknowPoint[i].dE = r0*sqrt(Qe);

m_pUnknowPoint[i].dF = r0*sqrt(Qf);

m_pUnknowPoint[i].dQ = atan((Qe - Qxx(2 * i, 2 * i)) / Qxx(2 * i, 2 * i + 1));*/

if (m_pUnknowPoint[i].dQ < 0)

m_pUnknowPoint[i].dQ += PI;

}

//写各矩阵

strLine.Format(_T(" 方向观测成果表\n"));

sf.WriteString(strLine);

strLine.Format(_T("测站------站准------方向值(DMS)------改正数(S)-------平差后值\n"));

sf.WriteString(strLine);

for (int i = 0; i < m_iAngleObsCount; i++)

{

strLine.Format(_T("%s, %s, %.6f, %.2f, %.6f\n "), m_pAngleObs[i].cpStation->strPointID, m_pAngleObs[i].cpEnd->strPointID,

m_pAngleObs[i].ObsAngle(DMS), v(i, 0), m_pAngleObs[i].ObsAngle(DMS) + v(i, 0) / 10000);

sf.WriteString(strLine);

}

strLine.Format(_T(" 距离观测成果表\n"));

sf.WriteString(strLine);

strLine.Format(_T("测站------站准------距离(m)------改正数(m)-------平差后值(m)-------方位角(DMS)\n"));

sf.WriteString(strLine);

Angle *Azi;

Azi = new Angle[m_iDistObsCount];

for (int i = 0; i < m_iDistObsCount; i++)

{

Azi[i] = Azimuth(m_pDistObs[i].cpStart->X, m_pDistObs[i].cpStart->Y

, m_pDistObs[i].cpEnd->X, m_pDistObs[i].cpEnd->Y);

strLine.Format(_T("%s, %s, %.4f, %.4f, %.4f, %.6f \n"), m_pDistObs[i].cpStart->strPointID,

m_pDistObs[i].cpEnd->strPointID,

m_pDistObs[i].dDist, v(m_iAngleObsCount + i, 0)/1000,

m_pDistObs[i].dDist + v(m_iAngleObsCount + i, 0)/1000,

Azi[i](DMS));

sf.WriteString(strLine);

}

strLine.Format(_T("平面点位误差表\n"));

sf.WriteString(strLine);

strLine.Format(_T("点号------长轴E------短轴F------方位角(DMS)

-------点位精度Mk\n"));

sf.WriteString(strLine);

for (int i = 0; i < m_iUnknowPointCount; i++)

{

double dQ = 0, Azi = m_pUnknowPoint[i].dQ * 180 / PI;

int d, s, m;

d = int(Azi);

s = int((Azi - d )*60);

m = ((Azi- d)*60 - s)*60;

dQ = d + double(s) / 100 + m /10000;

strLine.Format(_T("%s, %.4f, %.4f, %.6f, %.4f, \n"),

m_pUnknowPoint[i].strPointID, m_pUnknowPoint[i].dE/1000,

m_pUnknowPoint[i].dF/1000, dQ, m_pUnknowPoint[i].dMk/1000);

sf.WriteString(strLine);

}

strLine.Format(_T(" 控制点成果表\n"));

sf.WriteString(strLine);

strLine.Format(_T("点号------X--------------Y-------\n"));

sf.WriteString(strLine);

for (int i = 0; i < m_iKnowPointCount; i++)

{

strLine.Format(_T("%s, %.4f, %.4f\n"),

m_pKnowPoint[i].strPointID, m_pKnowPoint[i].X

, m_pKnowPoint[i].Y);

sf.WriteString(strLine);

}

for (int i = 0; i

{

strLine.Format(_T("%s, %.4f, %.4f\n"),

m_pUnknowPoint[i].strPointID, m_pUnknowPoint[i].X

, m_pUnknowPoint[i].Y);

sf.WriteString(strLine);

}

sf.Close();

}

void ClzControlNetAdjust::GetMaxXY(double& dx, double& dy,double&

minx,double& maxy)

{

double Maxx = m_pKnowPoint[0].X;

double Maxy = m_pKnowPoint[0].Y;

double Minx = m_pKnowPoint[0].X;

double Miny = m_pKnowPoint[0].Y;

for (int i = 0; i < m_iKnowPointCount; i++)

{

if (Maxx < m_pKnowPoint[i].X)

{

Maxx = m_pKnowPoint[i].X;

}

if (Maxy < m_pKnowPoint[i].Y)

{

Maxy = m_pKnowPoint[i].Y;

}

if (Minx>m_pKnowPoint[i].X)

{

Minx = m_pKnowPoint[i].X;

}

if (Miny>m_pKnowPoint[i].Y)

{

Miny = m_pKnowPoint[i].Y;

}

}

for (int i = 0; i < m_iUnknowPointCount; i++) {

if (Maxx < m_pUnknowPoint[i].X)

{

Maxx = m_pUnknowPoint[i].X;

}

if (Maxy < m_pUnknowPoint[i].Y)

{

Maxy = m_pUnknowPoint[i].Y;

}

if (Minx>m_pUnknowPoint[i].X)

{

Minx = m_pUnknowPoint[i].X;

}

if (Miny>m_pUnknowPoint[i].Y)

{

Miny = m_pUnknowPoint[i].Y;

}

}

dx = Maxx-Minx;

dy = Maxy-Miny;

minx = Minx;

maxy = Maxy;

}

bool ClzControlNetAdjust::LoadObsData(const CString& strFileName) {

CStdioFile lz;

if (!lz.Open(strFileName, CFile::modeRead))return false;

CString strLine;

//读取已知数据

lz.ReadString(strLine);

SetKnowPointSize(_ttoi(strLine));

int n = 0;

for (int i = 0; i < m_iKnowPointCount; i++)

{

lz.ReadString(strLine);

CString* pstrData = SplitString(strLine, ',', n);

m_pKnowPoint[i].strPointID = pstrData[0];

m_pKnowPoint[i].X = _tstof(pstrData[1]);

m_pKnowPoint[i].Y = _tstof(pstrData[2]);

m_pKnowPoint[i].state = 1;

m_pKnowPoint[i].flg = 1;

delete[] pstrData;

pstrData = NULL;

}

//读取未知数据

lz.ReadString(strLine);

SetUnknowPointSize(_ttoi(strLine));

for (int i = 0; i < m_iUnknowPointCount; i++)

{

lz.ReadString(strLine);

CString* pstrData = SplitString(strLine, ',', n);

m_pUnknowPoint[i].strPointID = pstrData[0];

m_pUnknowPoint[i].state = 2;

m_pUnknowPoint[i].flg = 2;

delete[] pstrData;

pstrData = NULL;

}

//读取距离观测数据

lz.ReadString(strLine);

SetDistObsSize(_ttoi(strLine));

for (int i = 0; i < m_iDistObsCount; i++)

{

lz.ReadString(strLine);

CString* pstrData = SplitString(strLine, ',', n);

m_pDistObs[i].cpStart = SearchPointUsingID(pstrData[0]);

m_pDistObs[i].cpEnd = SearchPointUsingID(pstrData[1]);

m_pDistObs[i].dDist = _tstof(pstrData[2]);

delete[] pstrData;

pstrData = NULL;

}

//读取方向观测数据

lz.ReadString(strLine);

SetAngleObsSize(_ttoi(strLine));

for (int i = 0; i < m_iAngleObsCount; i++)

{

lz.ReadString(strLine);

CString* pstrData = SplitString(strLine, ',', n);

m_pAngleObs[i].cpStation = SearchPointUsingID(pstrData[0]);

m_pAngleObs[i].cpEnd = SearchPointUsingID(pstrData[1]);

m_pAngleObs[i].ObsAngle = Angle(_tstof(pstrData[2]), DMS);

delete[] pstrData;

pstrData = NULL;

}

lz.Close();

return true;

}

void ClzControlNetAdjust::CoordinateEstimates()

{

if(m_iKnowPointCount == 0 || m_iAngleObsCount == 0 || m_iDistObsCount == 0 || m_iUnknowPointCount == 0)return;

int iCount = 0;

int IsCoordinateEstimate = 0;

if (IsCoordinateEstimate == 0)

{

do

{

for (int i = 0; i

{

if(m_pAngleObs[i].cpStation->state == 1 && m_pAngleObs[i].cpEnd->state == 1)

{

for (int j = 0; j

{

if(m_pAngleObs[j].cpStation->strPointID == m_pAngleObs[i].cpStation->strPointID&&

m_pAngleObs[j].cpEnd->state == 2)

{

Angle ARF = m_pAngleObs[j].ObsAngle - m_pAngleObs[i].ObsAngle;

Angle ARF0 = Azimuth(m_pAngleObs[i].cpStation->X, m_pAngleObs[i].cpStation->Y,

m_pAngleObs[i].cpEnd->X,

m_pAngleObs[i].cpEnd->Y);

double ARF1 = ARF0(RAD) + ARF(RAD);

double dDist;

for (int k = 0; k

{

if ((m_pDistObs[k].cpStart->strPointID == m_pAngleObs[j].cpStation->strPointID

&&m_pDistObs[k].cpEnd->strPointID == m_pAngleObs[j].cpEnd->strPointID) ||

(m_pDistObs[k].cpStart->strPointID == m_pAngleObs[j].cpEnd->strPointID

&&m_pDistObs[k].cpEnd->strPointID == m_pAngleObs[j].cpStation->strPointID))

{

dDist = m_pDistObs[k].dDist;

}

}

m_pAngleObs[j].cpEnd->X = m_pAngleObs[j].cpStation->X + dDist*cos(ARF1);

m_pAngleObs[j].cpEnd->Y = m_pAngleObs[j].cpStation->Y + dDist*sin(ARF1);

m_pAngleObs[j].cpEnd->state = 1;

C语言程序设计 入门源代码代码集合

#include <> void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c));

} int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include <> int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5

中南大学微机课程设计报告交通灯课案

微机课程设计报告

目录 一、需求分析 1、系统设计的意义 (3) 2、设计内容 (3) 3、设计目的 (3) 4、设计要求 (3) 5、系统功能 (4) 二、总体设计 1、交通灯工作过程 (4) 三、设计仿真图、设计流程图 1、系统仿真图 (5) 2、流程图 (6) 3、8253、8255A结构及功能 (8) 四、系统程序分析 (10) 五、总结与体会 (13) 六、参考文献 (13)

一、需求分析 1系统设计的意义: 随着社会经济的发展,城市问题越来越引起人们的关注。人、车、路三者关系的协调,已成为交通管理部门需要解决的重要问题之一。城市交通控制系统是用于城市交通数据检测、交通信号灯控制与交通疏通的计算机综合管理系统,它是现代城市交通监控指挥系统中最重要的组成部分。 随着城市机动车量的不断增加,组多大城市如北京、上海、南京等出现了交通超负荷运行的情况,因此,自80年代后期,这些城市纷纷修建城市高速通道,在高速道路建设完成的初期,它们也曾有效地改善了交通状况。然而,随着交通量的快速增长和缺乏对高速道路的系统研究和控制,高速道路没有充分发挥出预期的作用。而城市高速道路在构造上的特点,也决定了城市高速道路的交通状况必然受高速道路与普通道路耦合处交通状况的制约。所以,如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速通道,缓解主干道与匝道、城市同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。 十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通灯的控制方式很多,本系统采用可编程并行I/O接口芯片8255A为中心器件来设计交通灯控制器,实现本系统的各种功能。同时,本系统实用性强,操作简单。 2、设计内容 采用8255A设计交通灯控制的接口方案,根据设计的方案搭建电路,画出程序流程图,并编写程序进行调试 3、设计目的 综合运用《微机原理与应用》课程知识,利用集成电路设计实现一些中小规模电子电路或者完成一定功能的程序,以复习巩固课堂所学的理论知识,提高程序设计能力及实现系统、绘制系统电路图的能力,为实际应用奠定一定的基础。针对此次课程设计主要是运用本课程的理论知识进行交通灯控制分析及设计,掌握8255A方式0的使用与编程方法,通从而复习巩固了课堂所学的理论知识,提高了对所学知识的综合应用能力。 4、设计要求: (1)、分别用C语言和汇编语言编程完成硬件接口功能设计; (2)、硬件电路基于80x86微机接口;

程序设计基础课程设计报告 内容样例

第一章目的与要求 书上有。 第二章需求分析 软件设计的一个重要的环节就是需求分析。本章在对ATM取款机管理系统的应用情况作了全面调查的基础上,确定系统目标,并对系统所需要的基础功能进行分析,从而确定用户的需求。以下是ATM取款机管理系统所需要的需求分析。 ATM管理系统包括六个模块:登录,挂失功能,修改密码,取款功能,转账功能,查询功能。 ①登录: 输入银行卡的账号,密码,验证银行卡的卡号,密码是否正确,之后进入主界面 ②挂失功能: 确认是否对银行卡进行挂失,挂失后账户无法操作 ③修改密码: 用户可自由对其银行卡密码进行修改,修改之后的新密码将会覆盖其原密码 ④取款功能: 用户可自由取得所持银行卡内的存款,所取款数必须在其原有账户余额之内 ⑤转账功能: 用户可将本账户中的存款转入其他账户,转账过程中,需要转入账户的账

号 ⑥查询功能: 用户可查询用户信息,其中包括用户姓名、用户身份证号码、银行卡号以及存款余额 模拟ATM取款机的操作: 首先录入账户信息,格式如下 ㈠、登录功能:输入帐号和密码进行登录,如密码错误提示重新输入密码,如帐号错误提示无此帐户。 ㈡、查询功能:查询账户余额。 ㈢、取款功能:取款,更新余额。 ㈣、挂失功能:挂失后,该账户不能进行任何操作。 ㈤、修改密码:输入原密码和新设置密码。 ㈥、转账功能:输入转账的转出账户以及转账金额,进行转账。

第三章设计分析 3.1、ATM系统管理 3.1.1系统基本功能 首先,确定系统中存在两种用户,一种是ATM,可以进行信息录入和后台管理。另外一种是取款人,取款人主要是进行信息的查询,不能进行信息录入。所以在创建类的时候,先创建一个ATM类,然后创建取款人类,并与ATM 类形成有元,进而继承ATM的所有功能,并添加录入信息的功能。 基本功能: 登录功能---------输入帐号和密码进行登录,如密码错误提示重新输入密码,如帐号错误提示无此帐户。 查询功能---------查询账户余额。 取款功能---------取款,更新余额。 挂失功能---------挂失后,该账户不能进行任何操作。 修改密码---------输入原密码和新设置密码。 转账功能---------输入转账的转出账户以及转账金额,进行转账。、

C++程序设计源代码大全

S2_1 #include using namespace std; void main() { float a,b,c; cout<<"input a b c\n"; cin>>a>>b>>c; if((a+b using namespace std; void main() { int year; cout<<"Input year: "; cin>>year; if((year%4==0&&year%100!=0)||(year% 400==0)) cout< using namespace std; void main() { float a1, a2; char oper; float result; int flag=0; cout<<"请输入简单的运算式:\n"; cin>>a1>>oper>>a2; switch(oper) { case'+': result=a1+a2; break; case'-': result=a1-a2; break; case'*': result=a1*a2; break; default: cout<<"输入错误的运算符!\n"; flag=1; } if(flag==0) cout< #include using namespace std; void main() { float a,b,c,x1,x2; cout<<"请输入方程的3个系数a b c \n"; cin>>a>>b>>c; x1=(-b+sqrt(b*b-4*a*c))/2*a; x2=(-b-sqrt(b*b-4*a*c))/2*a; if(b*b-4*a*c<0) cout<<"无实根!\n"; else cout<<"x1="<

中南大学JAVA实验报告

中南大学 《JAVA语言与系统设计》 实验报告 题目运用运用JavaFx画时钟运用JavaFx实现时钟动画学生姓名 指导教师 学院信息科学与工程学院 专业班级 完成时间

目录 第一章绪论............................................................................................... 1.1实验背景............................................................................................... 1.2实验意义.............................................................................................. 1.3JavaFX介绍......................................................................................... 第二章需求分析..................................................................................... 2.1题目描述............................................................................................. 2.1.1 实验一.................................................................................... 2.1.2 实验二.................................................................................... 2.2 概要设计........................................................................................... 2.2.1 实验一.................................................................................... 2.2.2 实验二.................................................................................... 2.3 程序清单........................................................................................... 2.3.1 实验一代码............................................................................ 2.3.2 实验二代码............................................................................ 第三章调试分析.................................................................................... 3.1 结果分析......................................................................................... 3.1.1 实验一结果............................................................................ 3.1.2 实验二结果............................................................................ 3.2 调试报告........................................................................................ 心得体会.................................................................................................

c语言程序设计》课程设计报告

《C语言程序设计》课程设计报告 (2013—2014学年第3学期) 题目:C语言课程设计 专业:软件工程 班级:软件工程技术2班 姓名学号:1 林燕萍 指导教师:吴芸 成绩: 计算机科学与技术系 2014年6月23日

目录 一、课程设计的目的与要求 (1) 二、方案实现与调试 (3) 掷骰子游戏 (5) 射击游戏 (7) 计算存款本息之和 (8) 肇事逃逸 (10) 礼炮 (12) 汽车加油 (14) 大优惠 (16) 金币 (19) 三、课程设计分析与总结 (23) 附录程序清单 (25) 一、课程设计的目的与要求(含设计指标) C语言是一种编程灵活,特色鲜明的程序设计语言。C语言除了基知识,如概念,方法和语法规则之外更重要的是进行实训,以提高学习者的动手和编程能力,从应试课程转变为实践工具。这是学习语言的最终目的。结合多年来的教学经验,根据学生的学习情况,为配合教学过程,使“项目教学法”能在本质上促使学生有更大进步,特编写了该《C语言程序设计任务书》,以在实训过程中给学生提供帮助。达到如下目的: 1.在课程结束之前,让学生进一步了解C程序设计语言的编程功能;

2.让学生扎实掌握C程序设计语言的相关知识; 3.通过一些有实际意义的程序设计,使学生体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。 编写程序要求遵循如下基本要求: ①模块化程序设计 ②锯齿型书写格式 ③必须上机调试通过 二、方案实现与调试 掷骰子游戏 2.1.1题目内容的描述 1) 两人轮流掷骰子,每次掷两个,每人最多掷10次。 2) 将每人每次的分值累加计分 3) 当两个骰子点数都为6时,计8分;当两个点数相等且不为两个6时,计7分;当两个点数不一样时,计其中点数较小的骰子的点数。 4) 结束条件:当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上。最后显示双方分数并判定优胜者。 2.1.2输入数据类型、格式和内容限制和输出数据的说明 数据类型:整型;内容限制:随机数的产生;输入数据结果:胜利的一方 2.1.3主要模块的算法描述 本算法的思路过程:首先要随机产生随机数,然后进行算法输出数值,执行条件判断输入结果,最后比较结果,判断胜利的一方。

中南大学轨道工程课程设计

轨道工程课程设计 直线尖轨直线辙叉 60kg钢轨12号单开道岔平面布置设计 班级: 姓名:

学号: 指导老师: 完成时间: 第一部分 设计任务与要求 1. 确定转辙器主要尺寸 2. 确定辙叉和护轨几何尺寸 3. 选择导曲线半径 4. 计算道岔主要几何尺寸 5. 导曲线支距计算 6. 配轨计算 7. 配置岔枕 8. 绘制道岔总平面布置图 第二部分 设计资料 一、轨道条件 钢轨60kg/m ,标准长度12.5m ,区间线路轨枕根数:1760根/公里,道岔类型:钢筋混凝土Ⅱ。 二、道岔型式 (1)转辙器 直线尖轨,跟端支距mm y 1440 ,跟端结构为间隔铁夹板连接, 夹板l =820mm

(2)辙叉及护轨 直线辙叉,N =12,辙叉角'''49454o =α,辙叉趾距mm n 2127=,辙叉跟距 mm m 3800=。 (3)导曲线 圆曲线形,不设超高。 三、物理参数: 动能损失允许值:220/65.0h km =ω 未被平衡的离心加速度容许值20/65.0s m =α 未被平衡的离心加速度时变率容许值30/5.0s m =ψ 四、过岔速度 侧向过岔速度要求:h km V s /45= 五、道岔中的轨缝值 尖轨跟端及辙叉趾端轨缝为6mm ,其余为8mm 。 第三部分 提交资料 1.计算说明书; 2.图纸; 3.如果计算说明书和图纸有电子版,需提交一份电子版。 第四部分 设计计算 一、确定转辙器的几何尺寸 1、计算尖轨长度

尖轨转折角''66.35'114565.0arcsin arcsin 0?==???? ??=s V ωβ 根据设计资料:跟端支距:mm y 1440= 则尖轨长度为:()mm y l 46.8037' '66.35'11sin 144 sin 00=?== β 根据尖轨长度的取值原则,采用接近于计算长度的整数长度,所以取 mm l 80500= 则对应的尖轨转折角''9.29'118050144 arcsin ?=?? ? ??=β 2、计算基本轨尖端前部长度 由设计资料可知mm q 2646= 3、计算基本轨后端长度'q 整个基本轨取为一个标准轨长即L=12.5m ,则: ()mm l q L q 29.1805''9.29'11cos 8050264612500cos 0'=??--=--=β 二、确定辙叉及护轨的几何尺寸 1、确定趾距n P 和跟距m P 根据设计资料知辙叉角''49'454?=α 前端长度n =2127mm 所以:趾距mm n P n 79.1762''49'454sin 212722sin 2=???=?? ? ??=α 后端长度m =3800mm 跟距mm m P m 84.3152sin 2=?? ? ??=α 2、计算护轨工作边延展长度 护轨工作边延展长度示意图如图1所示。

进程调度程序设计报告(源代码)资料

课程设计报告 题 目 进程调度程序设计 课 程 名 称 操作系统课程设计 院 部 名 称 计算机工程学院 专 业 计算机科学与技术 班 级 13计算机科学与技术(单)(1) 学 生 姓 名 周敏健 学 号 1305201013 课程设计地点 A104 课程设计学时 20学时 指 导 教 师 何 健 金陵科技学院教务处制 成绩

目录 摘要 (3) 一、课程设计的目的和要求 (4) 二、系统需求分析 (4) 三、总体设计 (5) 四、详细设计 (6) 五、测试、调试过程 (9) 六、结论与体会 (11) 七、参考文献 (12) 附录:源程序 (12)

课程设计课题 进程调度程序设计 摘要 在多道系统中,对批处理作业需要进行作业调度。作业调度是在资源满足的条件下,将处于就绪状态的作业调入内存,同时生成与作业相对应的进程,并未这些进程提供所需要的资源。进程调度需要根据进程控制块(PCB)中的信息,检查系统是否满足进程的资源需求。只有在满足进程的资源需求的情况下,系统才能进行进程调度。下面是几种常见的作业调度算法:先来先服务(FCFS)、优先算法、轮换算法、短作业优先算法以及最高响应比优先法等,本文将对前两种算法进行详细的介绍。 关键词:进程调度,优先级,FCFS,PCB,作业,资源

一、课程设计的目的和要求 1、目的 进程调度是处理机管理的核心内容。本设计要求用C语言编写和调试一个简单的进程调度程序。通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。 2、要求 1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 2)每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。 4)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 5)就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。 7)重复以上过程,直到所要进程都完成为止。 二、系统需求分析 编写一个模拟进程调度的程序,将每个进程抽象成一个进程控制块PCB,PCB 用一个结构体描述。 采用两种不同的调度算法来实现功能,主要有如下几大功能模块组成。 (1)创建优先数PCB模块

中南大学程序设计语言C++(课程设计2015级) - 副本

智能15级《程序设计语言(C++)》 课程设计任务书 一、课程设计目的 本课程设计是智能科学与技术专业的重要实践性课程。是学习完《计算机与程序设计语言基础》课程后进行的一次全面的综合练习。通过课程设计,一方面可以结合课程的教学内容循序渐进地进行设计方面的实践训练,另一方面,在参与一系列综合项目的实践过程中,还能提高如何综合运用所学知识解决实际问题的能力,以及获得相关项目管理和团队合作等众多方面的具体经验。为后续课程面向对象程序设计等课程奠定必要的实践基础。 设计目的如下: 1.进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解。 2.针对C++语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。 3.掌握C++语言的编程技巧和上机调试程序的方法。 4.掌握程序设计中的常用算法。 为了使学生从课程设计中尽可能取得比较大的收获,对课程设计题目分成二类,一类为基础训练题目,从中学习到程序设计的常用算法,另一类为综合题目。学生可根据自己的能力和兴趣从两类中各选择一个设计题完成。 二、课程设计内容 分组形式:可2-4人组队 题目要求:A类题目必须全部完成,B类题目3题内选择2题完成 A组题型:基本知识单项训练() 设计题1、数据连接 编写函数实现两个字符单向链表的连接。函数以对两个链表头的引用作为参数,把第二个链表连接到第一个链表后面。 设计题2、字符处理 设计函数,实现英文字符的大小写转换并去除其他字符。要求:字符串中的小写字

符自动变换成对应的大写字符,而大写字符则变换成对应的小写字符。另,如果字符串中存在除英文大小写之外的字符请去除掉。 设计题3、数据统计 求数组中离平均数最近的那个数。假定函数int mid(int a[], int len); 计算数组a中所有数的平均值,并返回数组中离该平均值最近的那个数。 设计题4、抓交通肇事犯 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号中后4位数字的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。满足上述要求的车牌号只有一个。请根据以上线索求出该车号后4位数字。 B组题型:综合训练类 设计题5、投票管理系统 设计一个如图1所示的投票管理系统界面 图1投票管理系统界面 要求输入候选人名单后,点击确认按钮实现使用选择框代表候选人,计选择框的名字就是候选人的名字。点击取消按钮候选人输入框为空,重新输入候选人名单。选中候选人的选择框时,表示给该候选人投一票。点击确定按钮时表示产生一张选票。点击刷新

Web程序设计课程设计报告模板

Web程序设计课程设计报告课程设计题目:某电子杂志网站 姓名:肖琴霞 专业:软件工程(国际教育) 班级:10211133 学号:1021113321 指导教师:吴光明 2013 年 3 月 10 日

一、设计目的 《Web应用开发课程设计》是实践性教学环节之一,是《Web程序设计》课程的辅助教学课程。通过课程设计,使学生掌握Web网站的基本概念,结合实际的操作和设计,巩固课堂教学内容,使学生掌握软件开发的基本概念、原理和技术,将理论与实际相结合,应用现有的开发工具,规范、科学地完成一个完整地应用软件的设计与实现,把理论课与实验课所学内容做一综合,并在此基础上强化学生的实践意识、提高其实际动手能力和创新能力。 当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正使得计算机被广泛的应用于信息管理系统。计算机的最大好处在于利用它能够进行信息管理和查询。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。制作电子杂志网站可以方便读者阅读,且可以扩大读者的视野以及提高阅历。 二、设计解决方案 问题解决方案: 经过分析,我们决定利用ASP编程,使用Dreamweaver MX作前端开发工具,利用SQLServer2000作后台数据库管理,数据库驱动使用ADO。 前台功能模块:系统主界面与登录程序设计,杂志查询及订阅,读者服务模块,杂志分类设计等。 后台功能模块:管理主界面与登录程序设计,最新杂志信息管理模块,杂志订阅管理模块,在留言管理模块设计等。后台管理的建立,使管理员可以通过后台很容易的对杂志城进行管理,比如:对最畅销杂志,公告和杂志城注册用户进行添加,删除等管理工作,还可以对读者在线留言的处理。 三、电子杂志网需求分析 3.1 需求分析 需求分析是整个设计过程的基础,最困难、最消耗时间的一步。它的最终结果是提供

中南大学操作系统课程设计

操作系统课程设计题目名称:银行家算法 姓名 学号 专业 班级 指导教师 编写日期

目录 第一章问题描述 (3) 1.1 课设题目重述 (3) 1.2 问题分析 (3) 1.3 实验环境 (3) 第二章系统设计 (4) 3.1 主要数据结构 (4) 3.2 银行家算法 (4) 3.3 安全性检查算法 (6) 3.4 银行家算法安全性序列分析之例 (7) 第三章源代码清单 (10) 3.1 函数清单 (10) 3.2 各函数的调用关系图 (12) 第四章运行结果测试与分析 (13) 4.1 程序的正常输出结果 (13) 4.2 程序的差错控制 (15) 第五章结论与心得 (18) [参考文献] (18)

第一章问题描述 1.1课设题目重述 设计目的:了解多道程序系统中,多个进程并发执行的资源分配。 设计要求:管理员可以把一定数量的作业供多个用户周转使用,为保证作业的安全,管理员规定:当一个用户对作业的最大需求量不超过管理员现有的资金就要接纳该用户;用户可以分期贷款,但贷款的总数不能超过最大需求量;当管理员现有的作业不能满足用户的所需数时,对用户的请求可以推迟支付,但总能使用户在有限的时间里得到请求。当用户得到所需的全部作业后,一定能在有限的时间里归还所有的作业。 1.2问题分析 银行家算法是最具有代表性的避免死锁的算法。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。在死锁的避免中,银行家算法把系统状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,便可以避免发生死锁。所谓安全状态,是指系统能按某种顺序为每个进程分配所需资源,直到最大需求,使每一个进程都可以顺利完成,即可找到一个安全资源分配序列。 所以我们需要解决问题有: 1)熟悉银行家算法的工作原理,明白如何判断系统处于安全状态,避 免死锁。 2)在Windows操作系统上,如何利用Win32 API编写多线程应用程序 实现银行家算法。 3)创建n个线程来申请或释放资源,如何保证系统安全,批准资源申 请。 4)通过Win32 API提供的信号量机制,实现共享数据的并发访问。1.3实验环境 操作系统:windows 8.1 实验语言:c++

C语言程序设计报告(菜单+源码+测试)

一:系统功能 基本功能: 图书的录入,删除,查找,和导入导出等。 图书属性: 书号,书名,第一作者,版次,出版年等。 菜单功能: 1.Input Records(输入若干条记录) 从键盘一次输入一本书的信息,存放到结构体数组中,然后显示。 提示信息,确认是否输入下一条记录。 2.Display All Records(显示所有记录) 按顺序显示所有记录,每屏显示10条记录,按键继续显示下一屏。 3.Delete a Record(按书名查找,删除一本书) 输入待删除书的书名,显示该书名的所有书目,提示输入待删除书目的书号,提示是否删除,确认后,删除该书。 4.Sort(排序) 以书名为升序排列数组5.Insert a record(插入一条记录) 以书名为序排列的数组中插入一条记录,插入后,数组仍然有序。 输出插入成功后的信息。 6.Query(查找并显示一个记录) 输入书名,查找并显示包含该书名的所有图书信息 7.Add Records from a Text File(从文件读入图书信息到结构体数 组中) 用户可事先建立一个文本文件Dictory.txt。存放所有图书信息,文件格式如下: 2 1182 高等数学刘浩荣 5 同济大学出版社 2013 7300 物理化学王德明 2 化学工业出版社 2015 8.Write to a Text File 将数组中的全部记录写入文件Records.txt中,要求格式与Dictory.txt相同。 0.Quit(退出图书管理系统) 新增加菜单功能: 9.Change a record

修改某一条记录的值 a. Menu 显示菜单 b. Clear Screen 清屏 c. Pause 按暂停,按任意键继续 二:数据结构 Typedef struct { char ISBN[10];//书号 char book[30];//书名 char author[20];//作者 Int edition;//版本号 char press[50];//出版社名 int year;//出版年 }Bookinfo; 三:函数调用关系

中南大学C语言课程设计-学生成绩管理系统

中南大学 二○一三~二○一四学年第一学期 信息科学与工程学院 程序设计基础实践 设计报告 课程名称:程序设计基础实践 班级:2013级物联网工程1302班学号:0919130205 姓名:X晨 指导教师:杨希

二○一三年十二月 目录/Contet 课程设计题目 (1) 题目初步分析 (1) 程序总体设计 (2) 程序具体设计……………………………………………………… 10 程序调试测试……………………………………………………… 12 心得与体会………………………………………………………… 33 源代码……………………………………………………………… 33

课程设计题目 学生成绩管理系统 学生信息为:学号、XX、年龄、性别、出生年月、地址、、各科成绩等,试设计一个学生信息管理系统,使之能提供以下功能。 1.学生信息录入; 2.学生信息浏览; 3.按学号、XX查询; 4.学生成绩排序; 5.学生信息修改与删除。 6.综合信息输出。 题目初步分析 对对象的处理 1.由于每一个对象都包括多个成属性,所以要考虑数据的存储形式要用结构体类型来实现。 2.假如以数组的方式来存储,当然可以,但是定义一个数组,首先必须知道学生人数大概是多少,以便我们确定数组的大小,但是题目中没有给出,而且题目要求中有大量的删除、插入操作,所以用链表的方式比较方便。 3.由于题目中的数据需要长期保存,用普通的函数来写已经不可以满足要求了,所以需要用到文件来存储。 对过程的处理 1.输入学生信息(设计一个生成链表程序,并将链表中的数据保存到一个数据文件中); 2.插入(修改)学生信息(设计一个从数据文件中读数据的程序并将数据存放在链表中进行操作,最后将处理后链表中的数据再次保存到一个数据文件中); 3.删除学生信息(设计一个从数据文件中读数据的程序并将数据存放在链表中进行操作,最后按照要求将链表中的某个数据删除后再次保存到一个数据文件中);

程序设计基础课程设计报告

课程设计(大作业)报告 课程名称:程序设计基础 设计题目:学生成绩记录薄设计 院系:信息技术学院 班级: 设计者: 学号: 指导教师: 设计时间:2013.7 8.-2013.7.13 信息技术学院

昆明学院课程设计(大作业)任务书

学生成绩记录薄设计 一、课程设计目的与要求 1.课程设计目的 (1)综合运用之前所学知识(选择控制,循环控制,数组,函数,指针,结构体和文件等)来完成一个简单的信息管理程序的设计。 (2)充分体现和体会函数在程序设计中的必要性和实用性,并反映主函数main()在程序设计中的实现思路和方法。 2. 课程设计要求 设计一个简易学生成绩记录簿设计,其中包括:姓名,学号,C语言成绩; 具体功能: 1.系统以菜单方式工作 2. 创建学生成绩信息并以磁盘文件保存; 3. 读取磁盘文件并显示输出所有学生的成绩; 4. 查询学生成绩 (1)按学号查询成绩 (2)学号姓名查询成绩 5.添加成绩记录; 6.修改指定姓名或学号的学生的成绩并可存盘; 7.显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息。 二、总体设计 图1 系统总体结构

三、详细设计 1、数据结构设计 #include #include #include #include int n=4; struct student { int num; /*学号*/ char name[10]; /*姓名*/ float score[3]; /*成绩*/ } 2.函数说明 1.主函数 main()允许用户通过菜单进行功能选择,使用相应的功能代码来调用对应的函数功能。 2.其他部分功能函数包括 (1) 将学生成绩信息保存为文件void save(); 算法思想: ①定义指向文件的指针变量; ②输入保存路径及文件名,打开文件,若不能打开文件给出提示信息; ③将存有学生成绩信息的结构体数组信息依次保存到文件中。 (2)学生成绩信息录入函数void input() 算法思想: ①依次录入结构体数组中所包含的各个成员; ②直到输入的结构体成员中信息为4,数据输入结束; ③返回实际录入的学生成绩信息数。 (3)从文件中读出学生成绩信息void output(); 算法思想: ①定义指向结构体变量的指针和指向文件的指针; ②输入文件的路径,打开文件,若不能打开文件给出提示信息; ③将文件中的信息依次读出,最后结构体的指针为NULL。

中南大学电子课程设计

目录 1设计任务及指标 (1) 2交通灯控制电路分析 (2) 2.1交通灯运行状态分析 (2) 2.2电路工作总体框图 (3) 2.3方案比较 (3) 3交通灯控制电路设计 (4) 3.1 电源电路 (4) 3.2 脉冲电路 (4) 3.3 分频电路 (6) 3.4 倒计时电路 (6) 3.5 状态控制电路 (8) 3.6 灯显示电路 (9) 3.7 总体电路图 (11) 4实验数据和误差分析 (12) 5课程设计的收获、体会和建议 (13) 6致谢 (16) 7参考文献 (17) 8附录 (18)

1 设计任务及指标 设计一个东西方向和南北方向十字路口的交通灯控制电路。 要求如下: (1)南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30s、支干道每次通行间为20s; (2)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用倒计时的方法); (3)在绿灯转为红灯时,要求黄灯先亮5s钟,才能变换运行车道; (4)黄灯亮时,要求每秒闪亮一次; (5)同步设置人行横道红、绿灯指示。 (6)设计相关提示:所设计的交通路口为一十字路口,不涉及左右转弯问题。

2 交通灯控制电路分析 2.1 交通灯运行状态分析 交通灯控制电路,要求每个方向有三盏灯,分别为红、黄、绿,配以红、黄、绿三组时间到计时显示。一个方向绿灯、黄灯亮时,另一个方向红灯亮。每盏灯顺序点亮,循环往复,每个方向顺序为绿灯、黄灯、红灯。交通灯的运行状态共有四种,分别为:状态0:东西方向车道的绿灯亮,车道,人行道通行;南北方向车道的红灯亮,车道,人行道禁止通行。 状态1:东西方向车道的黄灯亮,车道,人行道缓行;南北方向车道的红灯亮,车道,人行道禁止通行; 状态2:东西方向车道的红灯亮,车道,人行道禁止通行;南北方向车道的绿灯亮,车道,人行道通行; 状态3:东西方向车道的红灯亮,车道,人行道禁止通行;南北方向车道的黄灯亮,车道,人行道缓行; 4种状态循环往复,并且红灯的倒计初始值为绿灯的倒计初始值和黄灯的倒计初始值之和。交通灯电路的具体运行状态框图如图2.1(人行道交通灯未标明)所示: 北 图2.1交通灯运行状态分析图

单片机编程源代码

前言 本文是本人上课的一个补充,完全自写,难免有错,请读者给予指正,可发邮件到ZYZ@https://www.360docs.net/doc/879841965.html,,或郑郁正@中国;以便相互学习。结合课堂的内容,课堂上的部分口述内容,没有写下来;有些具体内容与课堂不相同,但方法是相通的。 针对当前的学生情况,尽可能考虑到学生水平的两端,希望通过本文都学会单片机应用。如果有不懂的内容,不管是不是本课的内容,都可以提出来,这些知识往往代表一大部分同学的情况,但本人通常认为大家对这些知识已精通,而在本文中没有给予描述,由此影响大家的学习。对于这些提出问题的读者,本人在此深表谢意。 想深入详细学习单片机的同学,可以参考其它有关单片机的书籍和资料,尤其是外文资料。如果有什么问题,我们可以相互探讨和研究,共同学习。 本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。 基础知识:单片机编程基础 单片机的外部结构: 1、DIP40双列直插; 2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3、电源VCC(PIN40)和地线GND(PIN20); 4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) 5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍) 6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序) 7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务) 1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3; 2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3、一个串行通信接口;(SCON,SBUF) 4、一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。 C语言编程基础: 1、十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2、如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。 3、++var表示对变量var先增一;var—表示对变量后减一。 4、x |= 0x0f;表示为 x = x | 0x0f; 5、TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。 6、While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;} 在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)

中南大学C++课程设计实践报告!

中南大学 本科生课程设计(实践)任务书、设计报告 (C++程序设计) 题目学生成绩管理系统 学生姓名 指导教师 学院 专业班级 学生学号 计算机基础教学实验中心 年月日

学生成绩管理系统 关键字:学生成绩 MFC 编写系统 内容:定义一个结构体,存放下列信息: 学号、姓名、性别、系名、班级名、成绩等 1.学生成绩管理系统开发设计思想 要求: 一:数据输入:输入学生的相关信息,若用户输入数据或信息不正确,给出“错误”信息显示,重复刚才的操作;至少要输入10个学生的数据;可以随时插入学生信息记录; 二:每个学生数据能够进行修改并进行保存; 三:可以根据学号或者姓名删除某学生数据; 四:查询模块要求能按学号,按姓名,按班级等条件进行查询; 五:界面要求美观,提示信息准确,所有功能可以反复使用。 学生成绩管理程序从总体设计方面来看,基本的功能包括主控模块,数据输入模块,数据修改模块,数据查询模块等。 设计模块图:

2.系统功能及系统设计介绍 详细设计: 对于总体设计说明的软件模块,进一步细化,要说明各个模块的逻辑实现方法。下面逐个说明。 主控模块:主要完成初始化工作,包括屏幕的初始化,显示初始操作界面。初始界面中主要包括功能的菜单选择项。 输入处理:利用链表技术输入多名学生的数据,直到输入学生的学号以“@”开头,则结束数据的输入。程序运行流程图如下:删除处理:利用链表技术删除某学号的学生成绩信息,如果找到该学号则进行删除,否则输出“未找到”的信息。程序运行流程图略。 查找处理:利用链表技术根据学生学号或姓名等方式查找某学号

的学生成绩信息,其程序流程图略。 排序处理:利用链表技术根据学生学号对学生数据进行排序,其 部分源代码如下:/***********xuesheng.c***********/ /******头文件(.h)***********/ #include "stdio.h" /*I/O函数*/ #include "stdlib.h" /*其它说明*/ #include "string.h" /*字符串函数*/ #include "conio.h" /*屏幕操作函数*/ #include "mem.h" /*内存操作函数*/ #include "ctype.h" /*字符操作函数*/ #include "alloc.h" /*动态地址分配函数*/ #define N 3 /*定义常数*/ typedef struct z1 /*定义数据结构*/ { char no[11]; char name[15]; char sex[5]; char major[15]; char class[15];

相关文档
最新文档