第一篇:数据结构课设(完整代码可直接运行)附注释
#include
ERROR
0//定义字符常量error #define
OK
1//定义字符常量OK #define INFINITY
INT_MAX//INT_MAX是系统库中定义的无穷大常量,即2个字节所能表示的最大数
#define MAX_VERTEX_NUM
21//定义图、网的最大定点数为21 #define STACK_INIT_SIZE
100//定义栈的容量
#define STACKINCREAMENT
10//定义栈的每次增长量 #define MAX_INT 10000 //无穷大 typedef int AdjType;typedef struct{ int pi[MAX_VERTEX_NUM];//存放v到vi的一条最短路径 int end;}PathType;typedef char VType;//设顶点为字符类型
typedef enum{DG,UDG,DN,UDN}GraphKind;//定义图、网的枚举常量
/*················· 邻接矩阵····················*/ typedef struct ArcCell {
int
adj;
//弧的权值
//infotype
*info;}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{
char vexs[MAX_VERTEX_NUM];//存储顶点的数组
AdjMatrix arcs;//存储邻接矩阵的二维数组
int
vexnum,arcnum;//顶点数和弧数
GraphKind kind;//链接矩阵的类型
}MGraph;
/*················· 邻接表····················*/ typedef struct ArcNode{
int
adjvex;//与首节点关联的顶点
int
quan;//该顶点的权值
struct ArcNode
*nextarc;//指向下一个节点的指针
}ArcNode,*AList;typedef struct VNode {
char
data;//链表的各顶点
AList
firstarc;//链表的首节点 }VNode,AdjList[MAX_VERTEX_NUM];typedef struct{
AdjList
vertices;//存储链接表的各顶点
int
vexnum,arcnum;//顶点书和弧数
GraphKind
kind;//链接表的类型 }ALGraph;
/*················· 队列····················*/ typedef struct QNode{ char
data;//队列中元素数据
struct QNode
*next;//指向下一元素的指针 }QNode,*QueuePre;typedef struct{ QueuePre
front;//队首指针
QueuePre
rear;//队尾指针 }LinkQueue;
/*················· 栈····················*/ typedef struct { int
*base;//栈底指针
int
*top;//栈首指针
int
stacksize;//栈的大小 }SqStack;
/*················· 求最小生成树中的辅助数组··········*/ typedef struct { char
adjvex;//最小生成树的节点
int
lowcost;//到该节点的最小权值开销 }closedges[MAX_VERTEX_NUM];
int option;
//图的类型标识符 int visited[MAX_VERTEX_NUM];
//顶点访问标记数组 int indegree[MAX_VERTEX_NUM];//顶点入度记录数组 int ve[MAX_VERTEX_NUM];
//顶点权值记录数组
/*················· 链接矩阵类型设置··········*/ int SetGraphKind(MGraph &G,int option){
switch(option){
case 1: G.kind=DG;break;
case 2: G.kind=UDG;break;
case 3: G.kind=DN;break;
case 4: G.kind=UDN;break;
default: return ERROR;
}
return OK;}
/*················· 邻接表类型设置··········*/ int SetGraphKind(ALGraph &G,int option){
switch(option){
case 1: G.kind=DG;break;
case 2: G.kind=UDG;break;
case 3: G.kind=DN;break;
case 4: G.kind=UDN;break;
default: return ERROR;
}
return OK;}
/*················· 邻接矩阵顶点定位 ·················将顶点V代入,查询顶点存储数组,返回其数组下标 ··········*/ int LocateVex(MGraph G,char v){
int m;
for(m=1;m<=G.vexnum;m++){
if(G.vexs[m]==v)return m;
}
printf(“您输入的顶点不存在”);
return ERROR;}
/*················· 邻接表顶点定位 ·················将顶点V代入,查询顶点存储数组,返回其数组下标 ··········*/ int LocateVex(ALGraph G,char v){
int m;
for(m=1;m<=G.vexnum;m++){
if(G.vertices[m].data==v)return m;
}
printf(“您输入的顶点不存在”);
return ERROR;
}
/*················· 队列创建··········*/ int InitQueue(LinkQueue &Q){ Q.front=Q.rear=(QueuePre)malloc(sizeof(QNode));//申请存储空间,队首队尾指向同一位置
if(!Q.front)return ERROR;Q.front->next=NULL;return OK;}
/*················· 元素入队··········*/ int EnQueue(LinkQueue &Q,int e){ QueuePre p;p=(QueuePre)malloc(sizeof(QNode));if(!p)return OK;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}
/*················· 元素出队··········*/ int DeQueue(LinkQueue &Q,int &e){ QueuePre p;if(Q.front==Q.rear)return ERROR;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return OK;}
/*················· 判断队列是否为空··········*/ int QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear)
return OK;return ERROR;}
/*················· 栈的创建··········*/ int InitStack(SqStack &S){ S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}
/*················· //元素入栈··········*/ int Push(SqStack &S,int e){ if(S.top-S.base>=S.stacksize){
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
if(!S.base)return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;} *S.top++=e;return OK;}
/*················· 元素出栈··········*/ int Pop(SqStack &S,int &e){ if(S.top==S.base)return ERROR;
e=*--S.top;return OK;}
/*················· 判断栈是否为空··········*/ int StackEmpty(SqStack S){ if(S.top==S.base)return OK;return ERROR;}
/*················· 创建邻接矩阵··········*/ int CreatGraph(MGraph &G){
int i,j,k,w;char x,y;
if(!SetGraphKind(G,option)){printf(“对图类型的设置失败”);return ERROR;}//设置链接矩阵类型
printf(“邻接矩阵:请输入定点的个数、弧的个数:”);
scanf(“%d %d”,&G.vexnum,&G.arcnum);
if(G.vexnum>20){
printf(“您输入的顶点个数超过最大值”);
return ERROR;
}//if
printf(“请输入%d个顶点n”,G.vexnum);
for(i=1;i<=G.vexnum;++i){//输入矩阵的各顶点
fflush(stdin);//清除缓存,略过
scanf(“%c”,&G.vexs[i]);
}//for
if(G.kind==DG||G.kind==UDG){//1.有向图和无向图的矩阵创建
for(i=1;i<=G.vexnum;i++)//矩阵初始化
for(j=1;j<=G.vexnum;j++)
G.arcs[i][j].adj=0;
if(G.kind==DG){//2.有向图
printf(“请输入有向图的两个相邻的顶点
for(k=1;k<=G.arcnum;k++){//循环输入
fflush(stdin);
scanf(“%c%c”,&x,&y);//输入矩阵中弧关联的两顶点
i=LocateVex(G,x);j=LocateVex(G,y);//将两顶点转换成顶点存储数组的下标
G.arcs[i][j].adj=1;
}//for
}//2.if
else{//2.无向图
printf(“请输入无向图的两个相邻的顶点(x,y):n”);
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c”,&x,&y);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=1;G.arcs[j][i].adj=G.arcs[i][j].adj;//反向关联两顶点
}//for
}//2.else
}//1.if
else{//1.有向网和无向网
for(i=1;i<=G.vexnum;i++)
for(j=1;j<=G.vexnum;j++)
G.arcs[i][j].adj=INT_MAX;//矩阵初始化
if(G.kind==DN){ //3.有向网
printf(“请输入有向网的两个相邻的顶点
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=w;
}//for
}//3.if
else{//3
printf(“请输入无向网的两个相邻的顶点(x,y)以及相应的权值w:n”);
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=w;G.arcs[j][i].adj=G.arcs[i][j].adj;//逆向关联
}//for
}//3.else
}
return OK;}
/*··············在邻接表中插入节点··· ··········*/ int setList(int x,int y,ALGraph &G,int key[]){
int i,j,m,n;AList p,q;
m=LocateVex(G,x);//获取节点x对应的数组下标
n=LocateVex(G,y);
p=G.vertices[m].firstarc;//获取第m个链表的首节点
q=(AList)malloc(sizeof(ArcNode));//申请节点空间
if(!q)return ERROR;
q->nextarc=NULL;
q->adjvex=n;
while(key[m]&&p->nextarc){//key存储着该链表的长度,当其不为零时在首节点后插入新节点
p=p->nextarc;
key[m]++;//链表长度加1
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}//当链表长度为零时,新节点为首节点
else p->nextarc=q;
return 1;}
/*················· 创建邻接表··········*/ int CreatAList(ALGraph &G){ int i,j,m,n,key[MAX_VERTEX_NUM];char x,y,w;AList p,q;SetGraphKind(G,option);printf(“邻接表:请输入顶点的个数和弧的个数:”);scanf(“%d %d”,&G.vexnum ,&G.arcnum);if(G.vexnum>20){
printf(“您输入的顶点个数超过最大值”);
return ERROR;
} printf(“请输入个顶点:n”);for(i=1;i<=G.vexnum;i++){
fflush(stdin);
scanf(“%c”,&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
key[i]=0;} if(G.kind==DG){//有向图
printf(“请输入弧(如AB,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c”,&x,&y);//输入弧的两顶点
m=LocateVex(G,x);//将两顶点转换成数组下标
n=LocateVex(G,y);
p=G.vertices[m].firstarc;//获取第m个链表的首节点,及以第m个顶点为首节点的链表
q=(AList)malloc(sizeof(ArcNode));//申请节点存储空间
if(!q)return ERROR;
q->nextarc=NULL;
q->adjvex=n;
while(key[m]&&p->nextarc){//链表长度不为零,且下一个节点存在时,在首节点后插入新节点
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}//链表长度为零时,新节点为首节点
else p->nextarc=q;
} } if(G.kind==UDG){
printf(“请输入弧(如AB,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c”,&x,&y);
setList(x,y,G,key);
setList(y,x,G,key);
} }
if(G.kind==DN){
printf(“请输入依次输入弧以及这条弧的权值(如AB 8,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
m=LocateVex(G,x);
n=LocateVex(G,y);
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
} } if(G.kind==UDN){
printf(“无向网请输入依次输入弧以及这条弧的权值(如AB 8,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
m=LocateVex(G,x);
n=LocateVex(G,y);
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
int temp;
temp=m;
m=n;
n=temp;
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
} } return OK;}
/*················· 判断以第v个顶点为首节点的链表是否存在··········*/ int FirstAdjVex(ALGraph G,int v){ if(G.vertices[v].firstarc)
} return G.vertices[v].firstarc->adjvex;//存在则返回首节点 return 0;/*················· 获取以第v个顶点为首节点的链表中的节点w的子节点··········*/ int NextAdjVex(ALGraph G,int v,int w){ AList s;s=G.vertices[v].firstarc;//获取链表的首节点v while(s->adjvex!=w)//当节点不是w时,指针后移直到找到节点w或到达最后一个节点
s=s->nextarc;if(s->nextarc)//跳出循环后,节点不为空,则表明找到了节点w,否则表示已至链表最后一个节点
return s->nextarc->adjvex;return 0;}
/*················· 遍历节点v的叶子节点··········*/ void DFS(ALGraph G,int v){ int w;visited[v]=1;printf(“%c ”,G.vertices[v]);//输出第v个顶点,并标记为已访问
for(w=FirstAdjVex(G,v);w>=1;w=NextAdjVex(G,v,w)){//遍历第v个顶点的子节点,并递归遍历子节点的子节点
if(!visited[w])DFS(G,w);
} }
/*················· 图的深度优先遍历··········*/ void DFSTraverse(ALGraph G){ int v;visited[0]=1;//数组的存储是从1开始的,数组【0】不使用
for(v=1;v<=G.vexnum;v++)visited[v]=0;//初始化各顶点的访问状态为未访问
for(v=1;v<=G.vexnum;v++)
if(!visited[v])DFS(G,v);//从第一个顶点开始遍历 }
/*················· 图的广度优先遍历··········*/ void BFSTraverse(ALGraph G){ int v,w,u;LinkQueue Q;for(v=1;v<=G.vexnum;v++)visited[v]=0;//初始化各顶点为未访问
visited[0]=1;//数组的存储是从1开始的,数组【0】不使用
InitQueue(Q);//创建队列
for(v=1;v<=G.vexnum;v++)//从第一个顶点开始遍历
if(!visited[v]){
visited[v]=1;
printf(“%c ”,G.vertices[v]);
EnQueue(Q,v);//将该顶点标记为已访问,输出,并加入到队列中
while(!QueueEmpty(Q)){//遍历队列中顶点的所有子节点
DeQueue(Q,u);//获取队首的顶点,赋值给U
for(w=FirstAdjVex(G,u);w>=1;w=NextAdjVex(G,u,w)){//遍历顶点U所有未访问的子节点
if(!visited[w]){
visited[w]=1;
printf(“%c ”,G.vertices[w]);
EnQueue(Q,w);//将子节点加入队列,以便遍历子节点的子节点
}//if
else break;
}//for
}//while }//if }
/*················· 计算各顶点入度··········*/ void FindInDegree(ALGraph G,int in[]){ int i,j,k;AList p;for(k=1;k<=G.vexnum;k++)in[k]=0;//初始化各顶点入度为0 for(i=1;i<=G.vexnum;i++){
p=G.vertices[i].firstarc;//获取个链表的首节点
while(p){//遍历链表的子节点
j=p->adjvex;//获取子节点
in[j]++;//子节点的入度加1
in[i]++;
p=p->nextarc;//指向下一子节点
} } }
/*················· 拓扑排序(打印输出)··········*/ int TopologicalSort(ALGraph G){ int i,k,count;AList p;SqStack S;
FindInDegree(G,indegree);//计算各顶点入度 InitStack(S);//创建栈 for(i=1;i<=G.vexnum;i++)
if(!indegree[i])Push(S,i);//寻找入度为0的点,并加入到栈中 count=0;//输出的顶点个数
if(StackEmpty(S))printf(“此有向图不符合条件!”);while(!StackEmpty(S)){
Pop(S,i);//从栈中取出顶点开始输出
printf(“%c ”,G.vertices[i].data);
++count;//输出的顶点个数加1
for(p=G.vertices[i].firstarc;p;p=p->nextarc){//将顶点i的子节点的入度减1
k=p->adjvex;
if(!(--indegree[k]))Push(S,k);//如子节点的入度减为0,则入栈
}
}
if(count<=G.vexnum)return ERROR;
else return OK;}
/*················· 求最小生成树··········*/ int Minimum(MGraph G,closedges m){ int i,j,min=INFINITY;for(i=1;i<=G.vexnum;i++){//从待选的可达集合中选取一条代价最小的边
if(m[i].lowcost){//到顶点i可达时执行,即到顶点的权值不为0
if(m[i].lowcost min=m[i].lowcost; j=i; } } } return j;} /*················· 最小生成树(普里姆算法实现)··········*/ void MinSpanTree_PRIM(MGraph G,char u){ int i,j,k;closedges closedge; k=LocateVex(G,u);//获取初始顶点对应的数组下标 for(j=1;j<=G.vexnum;j++)//初始化辅助数组,计算从初始顶点到各顶点的最小代价 if(j!=k){ } closedge[j].adjvex=u;//u是已连通的顶点,表示该顶点J是同那个顶点连在一起 closedge[j].lowcost=G.arcs[k][j].adj; closedge[k].lowcost=0;//顶点k到自身的最小代价设为0,即该顶点已加入最小生成树中 for(i=2;i<=G.vexnum;i++){ k=Minimum(G,closedge);//获取最小代价边连通的顶点 printf(“%c%c ”,closedge[k].adjvex,G.vexs[k]);//输出最小生成树的弧 closedge[k].lowcost=0;//该顶点已加入最小生成树中 for(j=1;j<=G.vexnum;j++)//将顶点k代入重新计算到待连通顶点的最小代价 if(G.arcs[k][j].adj closedge[j].adjvex=G.vexs[k]; closedge[j].lowcost=G.arcs[k][j].adj; } } } /*················· 对链表进行拓扑排序,并存储在栈中··········*/ int TopologicalOrder(ALGraph G,SqStack &T){ int i,j,k,count;SqStack S; AList p;FindInDegree(G,indegree);InitStack(S); for(i=1;i<=G.vexnum;i++)if(!indegree[i])Push(S,i);InitStack(T);count=1;for(i=1;i<=G.vexnum;i++)ve[i]=0;//初始化到达各顶点的总权值花销为0 while(!StackEmpty(S)){ Pop(S,j);Push(T,j);++count; for(p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex; if(--indegree[k]==0)Push(S,k); if(ve[j]+p->quan>ve[k])ve[k]=ve[j]+p->quan;//顶点J的子节点K的总权值=顶点j的权值花销+弧的权值,即该顶点的最早发生时间 } } if(count<=G.vexnum)return ERROR;else return OK;} /*················· 关键路径 int j 指向顶点的数组下标 int k 被指向顶点的数组下标标 int ee 最早发生时间 int el 最晚发生时间 int dut 事件持续时间 char tag 关键路径标识符,*表示该弧为关键路径 SqStack T 堆 Alist p 链表的节点 int v1[MAX_VERTEX_NUM] 顶点权值记录数组,及该顶点的最早发生时间 ··········*/ int CriticalPath(ALGraph G){ int i,j,k,ee,el,dut,v1[MAX_VERTEX_NUM];SqStack T;AList p;char tag;int str[10];int count=0;//声明一个数组来存放关键路径的各个节点,count表示当前数组使用长度,也可理解为下一节点的存放位置 if(!TopologicalOrder(G,T))return ERROR;//按拓扑排序将各顶点依次入栈 for(i=1;i<=G.vexnum;i++){//初始化各顶点的权值为最后一个顶点的总权值花销,即工程的总时间花销 v1[i]=ve[G.vexnum];} while(!StackEmpty(T))//按拓扑顺序出栈,分别计算各顶点的最晚发生时间 for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex;dut=p->quan; if(v1[k]-dut } for(j=1;j<=G.vexnum;j++)//循环代入所有顶点,遍历其子节点,根据弧的权值,得到最早发生时间和最晚发生时间,并判断该弧是否为关键路径 for(p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex;dut=p->quan; ee=ve[j];el=v1[k]-dut; tag=(ee==el)?'*':' '; printf(“%d %d %d %d %d %cn”,j,k,dut,ee,el,tag); } /* 下面为非必需代码,功能为输出关键路径*/ if(count==0)//存储关键路径的第一个节点(第一个链接表的首节点—— str[count++]=j;if(tag=='*')//如果该弧为关键路径,则将该弧的被指向顶点存储到str中 { str[count++]=k;} for(int n=0;n printf(“%d”,str[n]); printf(“->”); } return OK;} //求关键路径 //Dijkstra算法 //求G(用邻接矩阵表示)中源点v到其他各顶点最短路径,n为G中顶点数 void Dijkstra(MGraph * G,PathType path[],int dist[],int v,int n){ int i,j,count,s[MAX_VERTEX_NUM],max,u;//s[n]用来标志源点到某顶点的最短路径是否求出 for(i=1;i<=n;i++){//1.初始化 s[i]=0;if(G->arcs[v][i].adj!=INFINITY)dist[i]=G->arcs[v][i].adj;else dist[i]=MAX_INT;//v到其他顶点的权为当前最短路径,送dist[i] path[i].pi[0]=v;path[i].end=0;} dist[v]=0;s[v]=1;//源点到源点本身的最短路径求出 count=1; while(count<=n-1){//求n-1条最短路径 max=MAX_INT;// MAX_INT为无穷大值,需要实际情况设置 for(j=1;j<=n;j++){//2.找当前最短路径长度 if(s[j]==0&&dist[j] if(max==MAX_INT)break;//最短路径求完(不足n-1)条,跳出while循环 s[u]=1;//表示V到Vu最短路径求出 path[u].end++;path[u].pi[path[u].end]=u;for(j=1;j<=n;j++){//3.u求出后,修改dist和path向量,执行完后返回2,知道跳出循环 if(s[j]==0&&dist[j]>dist[u]+G->arcs[u][j].adj&&G->arcs[u][j].adj!=INFINITY){ dist[j]=dist[u]+G->arcs[u][j].adj;path[j]=path[u];} } count++;} } /*················· 有向图的功能操作界面··········*/ void DG_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s;char x,y; for(k=0;;){ key=0;system(“cls”);//清空显示 printf(“**************************n”); printf(“你选择了对有向图的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3拓扑结构n4退出n”); printf(“**************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“有向图的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){//输出邻接矩阵 for(j=1;j<=G1.vexnum;j++){ printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“有向图的邻接表:n”); for(i=1;i<=G2.vexnum;i++){//输出链接表 printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“<%c ”,G2.vertices[i]); printf(“%c> ”,G2.vertices[j]); s=s->nextarc; } printf(“n”); }break; case 3:printf(“有向图的拓扑排序:n”);TopologicalSort(G2);break;case 4:key=1;break;} printf(“n”); if(key)break;//跳出循环,返回上一层 system(“pause”);//暂停程序执行,直到监听到操作 } printf(“nn”);} //DG /*················· 有向网的功能操作界面··········*/ void DN_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s; for(k=0;;){ key=0; system(“cls”); printf(“**************************n”); printf(“你选择了对有向网的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3关键路径n4最短路径n5退出n”); printf(“**************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“有向网的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ if(G1.arcs[i][j].adj==INT_MAX)printf(“ ∞”); else printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“有向网的邻接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“<%c ”,G2.vertices[i]); printf(“%c> ”,G2.vertices[j]); printf(“ %d ”,s->quan); s=s->nextarc; } printf(“n”); }break; case 3: printf(“有向网关键路径:n”);CriticalPath(G2);break; case 4: {int i,j,v,count=0;//v为起点,n为顶点个数 char c; PathType path[MAX_VERTEX_NUM];//v到各顶点的最短路径向量 int dist[MAX_VERTEX_NUM];//v到各顶点最短路径长度向量 printf(“请输入最短路径起点:”); fflush(stdin); scanf(“%c”,&c); v=LocateVex(G1,c); Dijkstra(&G1,path,dist,v,G1.vexnum); for(i=1;i<=G1.vexnum;i++){ if(dist[i]!=0&&dist[i]!=MAX_INT) { printf(“%c到%c的最短路径:”,G1.vexs[v],G1.vexs[i]); for(j=0;j<=path[i].end;j++){ printf(“%c ”,G1.vexs[path[i].pi[j]]); } printf(“n”); printf(“最短路径长度:%d”,dist[i]);//输出为MAX_INT则表示两点间无路径 printf(“n”); } else count++; } if(count==G1.vexnum)printf(“该顶点无出度!”); break;} case 5:key=1;break; }printf(“n”); if(key)break;system(“pause”);} printf(“nn”);} //DN /*················· 无向图的功能操作界面··········*/ void UDG_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s; for(k=0;;){ key=0; system(“cls”); printf(“**************************n”); printf(“你选择了对无向图的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3深度遍历n4广度遍历n5退出n”); printf(“**************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1:CreatGraph(G1);printf(“无向图的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“无向图的邻接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“(%c ”,G2.vertices[i]); printf(“%c)”,G2.vertices[j]); s=s->nextarc; } printf(“n”); }break; case 3: printf(“无向图的深度优先遍历:n”);DFSTraverse(G2);printf(“n”);break; case 4: printf(“无向图的广度优先遍历:n”);BFSTraverse(G2);break; case 5: key=1;break; }printf(“n”); if(key)break; system(“pause”);} printf(“nn”);} //UDG /*················· 无向网的功能操作界面··········*/ void UDN_(MGraph G1,ALGraph G2){ int i,j,m,k,key;AList s;char u; for(k=0;;){ key=0; system(“cls”); printf(“**********************************n”); printf(“你选择了对无向网的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3最小生成树n4退出n”); printf(“**********************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“无向网的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ if(G1.arcs[i][j].adj==INT_MAX)printf(“ ∞”); else printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“无向网的邻接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“(%c ”,G2.vertices[i]); printf(“%c)”,G2.vertices[j]); printf(“ %d ”,s->quan); s=s->nextarc; } printf(“n”); }break; case 3: printf(“请输入第一个顶点:”); fflush(stdin); scanf(“%c”,&u); printf(“无向网的最小生成树:n”); MinSpanTree_PRIM(G1,u);break; case 4: key=1;break; }printf(“n”); if(key)break; system(“pause”);} printf(“nn”);} //UDN /*················· 首界面··········*/ void main(){ MGraph G1; ALGraph G2;int i,n;for(i=0;;){ n=0; system(“cls”); printf(“n”); printf(“**************图的基本操作及应用***************n1:有向图的基本操作及应用n2:无向图的基本操作及应用n3:有向网的基本操作及应用n4:无向网的基本操作及应用n5: 退出n”); printf(“********************************n”); printf(“请选择:”); scanf(“%d”,&option); printf(“nn”); switch(option){ case 1: DG_(G1,G2);break; case 2: UDG_(G1,G2);break; case 3: DN_(G1,G2);break; case 4: UDN_(G1,G2);break; case 5: n=1;break; default: printf(“你输入的编码有误!”);break; } if(n)break; printf(“nn”);} } 数据结构课设 大整数计数器 1.问题描述 实现大整数(200位以内的整数)的加、减、乘、除运算。2.设计要求 设计程序实现两个大整数的四则运算,输出这两个大整数的和、差、积、商及余数。 3.数据结构 本课程设计采用顺序串来实现。4.问题分析 由于整数数据存储位数有限,因此引入串的概念,将整型数据用字符串进行存储,利用字符串的一个字符存储大整数的一位数值,然后根据四则运算规则,对相应位依次进行相应运算,同时保存进位,从而实现大整数精确的运算。具体设计思路如下: (1)计算大整数加法时,采用数学中列竖式的方法,从个位(即字符串的最后一个字符)开始逐位相加,超过或达到10则进位,同时将该位计算结果存到另一个字符串中,直至加完大整数的所有位为止。 (2)计算大整数减法时,首先调用库函数strcmp判断这两个大整数是否相等,如果相等则结果为0,否则用compare函数判断被减数和减数的大小关系,进而确定结果为正数还是负数,然后对齐位依次进行减法,不够减则向前借位,直至求出每一位减法之后的结果。 (3)计算大整数乘法时,首先让乘数的每一位都和被乘数进行乘法运算,两个乘数之积与进位相加作为当前位乘积,求得当前位的同时获取进位值,进而实现大整数的乘法运算。 (4)计算大整数除法时,类似做减法,基本思想是反复做减法,从被除数里最多能减去多少次除数,所求得的次数就是商,剩余不够减的部分则是余数,这样便可计算出大整数除法的商和余数。 需求分析(1)任何一个表达式都是由操作数、运算符和界限符组成的,我们称之为单词.(2)表达式求值首先要符合四则运算规则: ① 先乘除,后加减 ② 从左到右进行运算 ③ 先括号内,后括号外(3)功能实现: ① 若当前单词为数字串,则压入数值栈 ② 若当前单词为运算符并大于运算栈的栈顶符号,则进栈 ③ 若当前单词为运算符并等于运算栈的栈顶符号,去括号,输出 ④ 若当前单词为运算符并小于运算栈的栈顶符号,则进行运算 课程设计的目的 通过课程设计全面掌握《C语言程序设计》关键知识点,掌握C语言中数组、指针、结构体、文件等方面的基本知识。 通过课程设计了解并掌握C语言程序设计的方法,熟悉C程序设计的开发环境及C程序的 调试过程。 培养学生查阅参考资料、手册的自学能力,通过独立思考深入钻研有关问题,学会自己分析、解决问题的方法。 课程设计的任务和要求 任务: 编程求出输入的两个正整数之和,这两个正整数的可能达到200位。 要求: 输入: 共有两行,第一行为第1个正整数;第二行为第2个正整数。 输出: 2个正整数之和。 主要参与成员 姓 名 学 号 系 别 班 级 主要作用(分工) 成果形式 设计 软件 作品 其他: 完成情况及以后的拓展设想 通过用C语言编写函数基本实现了大整数相加这个程序,但该程序仍存在一些不足,还可以加上一些语句使程序具有容错功能,并且可以正确计算一个负数和一个正数相加。 课 程 设 计 鉴 定 情 况 表 小组鉴定意见 小组长签名: 年 月 日 指导教师意见 教师签名: ****年**月**日 课程设计成绩 优 良 及格 不及格 教研室意见 年 月 日 备注 《C语言程序设计》课程设计报告书 作者:廖 序 课程设计概述 课程设计名称 大整数相加 任务要求: 编程求出输入的两个正整数之和,这两个正整数的可能达到200位。 输入: 共有两行,第一行为第1个正整数;第二行为第2个正整数。 输出: 2个正整数之和。开发环境: C语言。C语言是目前世界上流行、使用最广泛的高级程序设计语言。1972年,C语言在美国贝尔实验室里问世,后来又被多次改进,并出现了多种版本。80年代初,美国国家标准化协会(ANSI),根据C语言问世以来各种版本对C语言的发展和扩充,制定了ANSIC标准。 目前,在微机上广泛使用的C语言编译系统有MicrosoftC、Turbo C、Borland C等。这些C语言版本不仅实现了ANSIC标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。 C语言的特点: C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。 由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。 此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。 参考资料 李铮、叶艳冰、汪德俊,C语言程序设计基础与应用,清华大学出版社,2005 [2]CSDN技术中心 二、概要设计 为了实现大整数相加这个程序,将程序划分为了三个模块: 输入数据。运算。输出结果。 首先定义了子函数Input()来存储用户输入的两个加数,为了满足任意位数的两个大整数相加,在子函数Input()中嵌套调用子函数Init()使sum数组里面存放的数初始化为”0”。 然后定义子函数Long_Add()使两个大整数作加法运算,从后面往前面相加,附带进位。定义子函数Output()实现输出结果。 最后如下图所示,在主函数main中调用Input(),Long_Add(),Output()三个子函数实现程序。 三、详细设计 程序的流程图: 四、调试过程 第一次 测试数据a=***7,b=111111 编译运行后不能输出结果,检查函数后编译正确。再次分析,发现如果直接把a,b,sum定义为unsigned int型的话,计算出来的和的范围只能在0~65535之间,否则就会出现错误。尝试将a,b,sum存放到字符数组中,从个位开始,一位一位相加。 第二次 测试数据a=***7,b=111111 编译运行后仍不能输出结果。分析原因,在用于输出的子函数Output()中,输出数组字符数组sum[]前未确定和的最高非零位。 尝试加入for(i=0;i 第三次 测试数据a=99999919,b=99 编译运行后发现计算出来结果不正确。经过分析,函数中没有对最后 一个进位进行处理。 尝试加入while(carry > 0)语句,再次进行调试。 { tempsum = sum[i]-'0'+carry;sum[i] = tempsum%10+'0';carry = tempsum/10;i--;} 第四次 测试数据a=99999919,b=99 编译运行后得到正确结果。 第五次 随意输入几组数据进行测试,结果都是正确的。程序得到实现。 五、结论与体会 通过不断的调试、修改,本课程设计最终实现了200位以内的两个大整数相加,但程序还 可以进一步完善,程序中仍存在一些不足之处,比如缺少容错功能,不能准确计算负整数加正整数,等等问题 虽然C语言程序设计在上学期做为我们的必修课已经学习过了,但书到用时方恨少,这次课程设计的学习程序设计中暴露出的我自身的问题更是非常明显。 一开始看到题目认为非常简单,直接将两个数都定义为整型。编写程序并运行后发现并不能达到题目的要求,计算出来的和只能小于等于65535,否则就会出现错误。分析后,将数据作为字符串来处理,用for循环语句从存数的字符数组中一位一位的取数出来,按照数位对齐,从个位开始,按位相加,逢十进一的运算规则进行运算。最后用字符输出函数putchar()输出计算出来的结果。由于程序偏大且较复杂,将程序划分为了输入数据、运算、输出数据三个子程序。数次编译调试后,最终使程序得以实现。 经过三个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,让我能够进一步的掌握和运用C语言来编写程序。要想学好C语言要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处和薄弱环节。 首先,基础掌握不牢固,对于C语言中的许多基本语法尚没有熟练掌握,在设计过程中仍需请教其它同学,查阅课本,设计效率很低。 其次,经典算法掌握不牢。在完成作业的过程中还需查阅书籍和借鉴他人。 再次,程序量过大的时候,头绪理不清。杂乱无章,无系统性,不便调试和阅览,自己也易于出错。 并且对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。 通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。 六、源程序清单 #include t;string.h> #define Max 1000 char sum[Max+1];/*和*/ char a[Max],b[Max];/*两个加数*/ int len1,len2;void Input(char a[],char b[]){ int i,len;void Init(char a[]);/*对Init()函数进行声明*/ printf(“Please enter two integer:n”);scanf(“%s %s”,a,b);len1=strlen(a);len2=strlen(b);Init(sum);len=strlen(a);for(i=len-1;i>=0;i--)sum[Max+i-len] = a[i];} void Init(char a[]) { int i;for(i=0;i void Long_Add(char sum[],char new[]){ int i,j;int len;int tempsum;int carry = 0;/*进位*/ len = strlen(new);/*从个位开始,按位相加,逢十进一*/ for(i=Max-1,j=len-1;i>=0,j>=0;i--,j--){ tempsum = sum[i]-'0'+new [j]-'0'+carry;sum[i] = tempsum%10+'0';carry = tempsum/10;} while(carry > 0)/*处理最后一个进位*/ { tempsum = sum[i]-'0'+carry;sum[i] = tempsum%10+'0';carry = tempsum/10;i--;} return;} void Output(char sum[]){int i,n;/*寻找和的最高非零位*/ for(i=0;i Long_Add(sum,b);Output(sum);getch();return 0; 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 课程设计报告 题目:华科校园导航 课程名称:数据结构课程设计 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 任务书 数据结构是计算机科学技术与信息安全等专业的一门重要专业基础课,牢固掌握数据结构的基础知识,熟练地运用数据结构的思想与技术方法解决实际应用问题是是本课程学习的基本任务与目标。而课程设计是实现这一学习目标的重要环节和组成部分。通过课程设计的训练,使学生加深对数据结构知识的理解,牢固掌握其应用方法,并合理灵活地解决一定实际问题,增强和提高综合分析问题与解决问题的能力。 设计题目 华科地图导航系统。设计目的 掌握图结构的物理存储结构、基本算法及其算法在相关领域中的应用。 设计内容 华中科技大学(Huazhong University of Science and Technology),简称华中大,坐落于湖北省武汉市,学校面积7000余亩。华科大校园具有典型的工科院校特征,道路笔直,建筑面积方方正正,这为构建电子地图提供了极大的便利。本次课程设计要求以华中科技大学为背景,设计一个简单的华科地图导航程序,可以方便的为用户提供搜索、导航等功能。 设计要求 基本要求: 1.输入地点名,可以在地图中以一定标记标示出地点所在的位置 2.鼠标移动到指定建筑处显示建筑名称 3.输入或点击起点和终点,找出最短的路径,并在图上描出路径,路径不能脱离道路 4.输入起点,输入特定的地点,如食堂,超市能够找到最近的两到三个 5.地点至少要包括清单中所列的位置 实验提示: 1.将每个十字路口或特定建筑看作节点,构建图模型,两个节点的边即是一个路段。对于某些节点,可能具有特定的意义,例如“图书馆”,可以为其设置一个名称;而对于大多数节点,例如普通路口,可能并不需要名称,只是用来构建图模型的一个节点。信息的录入可能需要人为输入,需要编写辅助程序。辅助程序可以如下构造: 程序首先载入一张图片并显示。程序具有多个文本框,当点击图片上 I 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 特定点时,获取该点的坐标,第一个文本框显示该点的图像坐标,第二个文本框可以输入地点名,第三个文本框用来输入节点编号,剩下的文本框用来输入直接相邻的节点编号或者节点的属性。点击“确认”后可以将信息保存到磁盘。这样可以实现坐标、节点编号和位置名称的绑定,为实验构图采集数据。 2.特定建筑只需考虑建筑大门所对应的路段上的一点。例如“图书馆”建 筑,可认为“图书馆”位于图书馆大门和学校道路相接处,简化处理。当鼠标移动到“图书馆”附近时,找到距离最近的具有名称的节点显示 即可。 3.对于存在折线的路段,将其看作多段处理;对于细碎的弯折路线,当作 直线简化处理。 参考文献 [1] 严蔚敏,吴伟民.数据结构(C语言版).北京: 清华大学出版社,1997 [2] 王晓东.计算机算法设计与分析.北京: 电子工业出版社, 2007 [3] 严蔚敏,吴伟民,米宁.数据结构题集(C语言版).北京: 清华大学出版社,1999 [4] Elliot B.Koffman and Paul A.T.Wolfgang..Objects, Abstraction, Data Structures and Design: Using C++.October 2005, ©2006 II华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 目录 任务书.............................................................................................................................I 1 系统需求分析与总体设计........................................................................................1 1.1系统需求分析.................................................................................................1 1.2系统总体设计.................................................................................................1 2 系统详细设计............................................................................................................2 2.1 有关数据结构的定义....................................................................................2 2.2 主要算法设计................................................................................................3 3 系统实现与测试........................................................................................................4 3.1 系统实现........................................................................................................4 3.2 系统测试........................................................................................................6 4 总结与展望..............................................................................................................13 4.1 全文总结......................................................................................................13 4.1 工作展望......................................................................................................13 5 体会..........................................................................................................................15 参考文献......................................................................................................................16 附录..............................................................................................................................17 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 系统需求分析与总体设计 1.1系统需求分析 华中科技大学(Huazhong University of Science and Technology),简称华中大,坐落于湖北省武汉市,学校面积7000余亩。华科大校园具有典型的工科院校特征,道路笔直,建筑面积方方正正,这为构建电子地图提供了极大的便利。本次课程设计以华中科技大学为背景,设计一个简单的华科校园地图导航程序,可以方便的为用户提供搜索、导航等功能。该系统的具体的功能为: 1.输入任意地点名,可以在地图中以一定标记显示出该地点所在的位置; 2.输入任意起点和终点,可以在地图上查询并显示从起点到终点的最佳路线以及最短距离; 3.输入任意地点名,可以在地图上查询并显示出距离该地点最近的食堂或者超市,并给出从该地点到达食堂或者超市的最佳路线和最短距离; 4.鼠标移动到地图上的某一地点是,显示该地点的名称和简介; 5.系统能为用户提供华科整体地图、系统使用说明、设计信息。拥有以上的功能的导航应用将给不熟悉华科的用户提供极大的便利,是人们所需要的。 1.2系统总体设计 系统的总体模块图如图1所示。用户进入系统后,在窗口主界面可以选择“地图导航”、“进入地图”、“使用帮助”“关于导航”、“退出导航”等功能。在“地图导航”功能中,用户可以查询某个地点或者某个地点附近最近的食堂和超市、到达该地点的最佳路径和距离等,在过了一定时间后,系统会提示用户选择返回“地图导航”界面还是进入“进入地图”功能,然后系统根据用户的选择进入相应的界面;在“进入地图”功能下,用户可以浏览整个华科地图并且查询某个地点的名称和简介;在“使用帮助”下,用户可以阅读该系统的使用说明;在“关于导航”下,用户可以了解该系统的设计信息;用户点击“退出导航”即可退出该系统。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 1 系统详细设计 2.1 有关数据结构的定义 华科校园导游系统是用图结构来实现的。具体数据结构如下: 定义景点的结构类型 typedef struct { 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 Point point;char name[20];char num;}Vexs; 定义景点坐标的结构类型 typedef struct { int x;int y;}Point; 定义图的结构类型 struct MGraph { }; 声明无向图的邻接矩阵类型 MGraph G[100],G0,G1; 初始化所有景点信息,存放在图G1中 int CreateUDG1(MGraph &G1);Vexs vexs[MAX_VEX_NUM]; //顶点向量 int vexnum,arcnum; //顶点数,边数 int arcs[MAX_VEX_NUM][MAX_VEX_NUM];//邻接矩阵 2.2 主要算法设计 Floyd算法:void Floyd(void); 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);„„;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 采用松弛技术(松弛操作),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);其状态转移方程为map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 条路。 通过弗洛伊德算法计算出两单间的最短路径之后,就可以通过距离计算公式计算出两点间的最短距离。 利用佛洛依德算法计算出每两点间的最短路径矩阵。里面有三重for循环,时间的复杂度为O(n^3)。系统实现与测试 3.1 系统实现 3.1.1 开发环境 本系统是在windows7下的Visual C++ 6.0编译器中进行设计,但是一般的编译器中没有包含编写界面的 Runtime Library 下选 Multi-threaded Debug(/MTd)Project->setting->C/C++->category(code generation)->using runtime library(debug multithread)。3.1.2 运行环境 Window7 64位旗舰版系统。3.1.3 主要函数及说明 1、void Floyd(void); 按照实际路况处理,利用佛洛依德算法,算出每两点间的最短路径矩阵。求 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 ->的最短路径,如果->有弧,则存在一条长度为arcs[i][j]的路径,但是该路径不一定是最短路径,尚需要进行n次试探。若存在(Vi,Vo,Vj),则比较(Vi,Vj)和(Vi,Vo)+(Vo,Vj)的大小。取(Vi,Vo,Vj)和(Vi,Vj)的较短者,继续添加结点。依此类推,每次都找到短路径,最后得到的便是最短路径。把最短的路径存到全局变量path中。 2、void LoadData(void); 加载初期设定的信息包括所有图片。并且将设定好的坐标信息存储到图G0中。并且使用佛洛依德算法,将每对景点之间的最短路径距离算出并存储最短路径到全局变量path中。以方便后续程序的进行。 3、int CreateUDG1(MGraph &G1);加载所有景点信息,并存储到图G1中。(图G1不包括路口坐标信息)。里面有两个for循环,一个用来加载景点坐标,名称和代号。另一个for循环用来构建完全图G1,计算出每对景点的最短路径(理想情况下处理的)。返回值为1。 4、int weight(Point a,Point b);计算两个点之间的距离,利用公式,计算出的结果是double类型的,将结果强制类型转换为int类型,并将其值返回。 5、void Musicplay(int mark); 利用mciSendString函数,mark用来控制背景音乐的播放与停止。mark=1,循环播放音乐。界面打开时后台启动。当主界面上点击音乐暂停图标mark=2,音乐暂停.。当主界面上点击音乐播放图标mark=3,音乐恢复播放。.6、void Windows(void);加载事先做好的主界面背景图。在上面输出文字信息。用GetMouseMsg();函数获取鼠标信息,设置鼠标响应区,当鼠标移动到响应区时,文字实现颜色的改变。当单击鼠标左键时,会进入到相应的函数里面,进行下一步操作。 7、void Viewmain(void);输出景点坐标及名称。设置景点活动区域,获取鼠标信息,当鼠标移动到相应的景点活动区域,就会加载相应的景点图片。 8、void Help(void); 有简单的操作说明。操作说明是以图片的形式加载进去的。图片是事先用PS 5 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 准备好的。 9、void About(void);有简单的作者信息及实验感想。背景是以图片的形式加载进去的。图片是事先用PS准备好的。里面还有一个网页链接,点击后会用Systen函数,打开该网页链接。 10、void Quit(void);关闭图形区域,退出导航。详细设计代码见附录。 3.2 系统测试 根据设计要求测试相关的功能,测试结果用相应的截图表示。 1、运行程序,进入系统主窗口界面,结果如图2所示。 图 2 2、选择主界面的“地图导航功”能,进入功能选区,结果如图3所示。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 3 2.1、在“地图导航”功能界面选择“place”(地点查询)功能,查询地点A(南大门)。输入A,系统在地图上正确地显示地点A的位置。结果如图4,图5所示。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 4 图 5 2.2、在“地图导航”功能界面选择“route”(路线查询)功能,查询A(南大门)到B(南一楼)之间的最佳路线和距离。输入AB,系统在地图上正确地显示AB之前的最佳路线和距离。结果如图6,图7所示。 图 6 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 7 2.3、在“地图导航”功能界面选择“repast”(食堂查询)功能,查询B(南一楼)附近最近的食堂。输入B,系统在地图上正确地显示B附近最近的食堂,并且给出了最佳路线和距离。结果如图8,图9所示。 图 8 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 9 2.4、在“地图导航”功能界面选择“market”(超市查询)功能,查询A(南大门)附近最近的超市。输入A,系统在地图上正确地显示A附近最近的超市,并且给出了最佳路线和距离。结果如图10,图11所示。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 10 图 11 3、在系统主界面选择“进入地图”功能,将鼠标光标移动到地图的地点(机械大楼)上面,地图右下角显示该地点的具体信息。结果如图12所示。 图 12 11 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 4、在系统主界面选择进入“使用帮助”功能,系统显示该系统的使用说明。结果如图13所示。 图 13 5、在系统主界面选择进入“关于导航”功能,系统显示该系统的设计信息。结果如图14所示。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 14 6、在系统主界面选择“退出导航”功能,点击“确定”即退出系统。结果如所示。总结与展望 图 1 54.1 全文总结 对自己的工作做个总结,主要工作总结如下: (1)分析设计题目、设计内容和设计要求,到图书馆和网上查阅相关资料,制定设计计划,为设计工作做准备。 (2)按照设计要求进行设计工作,设计合适的数据结构和算法,收集并处理相关的资料,编程实现。 (3)按照设计要求测试系统,调试程序BUG,优化、完善系统。(4)撰写课程设计报告。 4.1 工作展望 在今后的研究中,围绕着如下几个方面开展工作: (1)此次设计使用了弗洛伊德算法,没有设计出更高效的算法。所以应该 设计更合适的数据结构和更高效的算法,优化代码,提高系统的效率。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 (2)设计的系统功能还是比较单一。所以应该完善和扩充系统功能,使系 统能为用户提供更多、更优质的服务。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 体会 在该接触到本次《数据结构》的课程设计时,心里是没有底的,一开始就为了确定题目思考了很久,但是看到地图就有了很多想法,回想起在课程的学习中对图进行了深入地学习并且学习了诸多寻路算法,于是就选择了这个题目,我觉得我可以根据自己所学习的图的知识和算法设计出“华科地图导航”。 “华科地图导航”涉及到大量的图形信息与绘图信息,于是我开始寻找合适的开发的工具与语言进行编程设计。最开始在网上查询相关信息了解到QT是写图形界面的好工具,但是进行上手学习后发现QT函数库众多,而我不能正确熟悉地使用,于是考虑了很久就放弃了。后来了解到了C语言的图形库easyx,于是上网查询了相关的资料,对easyx有了大致的了解,上手很容易,只需根据其图形函数与绘图函数进行编程设计,课设就正式进入了设计、编写、测试,然后顺利完成课设。 感谢帮助过我同学和老师,也感谢我自己。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 参考文献 [1] 严蔚敏,吴伟民.数据结构(C语言版).北京: 清华大学出版社,1997 [2] 严蔚敏,吴伟民,米宁.数据结构题集(C语言版).北京: 清华大学出版社,1999 [3] 曹计昌,卢萍,李开.C语言与程序设计.北京: 电子工业出版社,2013 [4] 王晓东.计算机算法设计与分析.北京: 电子工业出版社, 2007 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 附录 1.TourGuide.h #include #define MAX_VEX_NUM 100 //最大地点个数 #define N 22 //当前地点个数 #define All 60 //地点和路口总数 #define MAX_ROAD 10000 //相当于两地点间断开 int shortest[MAX_VEX_NUM][MAX_VEX_NUM]; //全局变量存贮最小路径 int path[MAX_VEX_NUM][MAX_VEX_NUM]; //存贮路径 int pos[][2]={ //地点坐标及路口坐标 //地点坐标 {208,430},{209,387},{50,404} ,{105,355}, {110,300},{170,300},{167,234},{230,150}, {310,235},{310,320},{390,320},{615,155},{430,320},{430,150},{417,320},{368,307},{406,320},{472,160},{5,185} ,{339,293},{65,452} ,{109,439}, //路口坐标 {369,317},{46,379} ,{110,387},{368,293}, {168,386},{262,384},{112,320},{170,320}, {262,320},{309,292},{309,282},{110,284}, {170,284},{230,250},{309,250},{170,250}, {230,220},{307,220},{370,150},{2,219} , {108,188},{33,337} ,{109,250},{109,218}, {309,150},{108,150},{167,218},{427,250}, {368,218},{368,250},{166,150},{166,188}, {230,188},{309,188},{368,188},{230,282}, {230,320},{168,350} };char Num[]={ //地点编号 'A','B','C','D', 'E','F','G','H', 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V' };char Name[][20]={ //地点名称 “南大门”,“南一楼”,“西十二楼”,“西五楼”, “青年园”,“图书馆”,“科技楼”,“喻园餐厅”, 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 “机械学院”,“名人园”,“中心操场”,“东九楼”, “沁苑”,“喻园教工超市”,“东教工超市”, “东一食堂”,“紫荆园餐厅”,“清真食堂”, “百景园”,“东五楼”,“南三门”,“南二门” };typedef struct { int x;int y;}Point;typedef struct { Point point;char name[20];char num;}Vexs;struct MGraph { Vexs vexs[MAX_VEX_NUM]; //顶点向量 int arcs[MAX_VEX_NUM][MAX_VEX_NUM];//邻接矩阵 int vexnum,arcnum; //顶点数,边数 };MGraph G[100],G0,G1; //声明无向图的邻接矩阵类型 int Gi;IMAGE map,map1; //图片信息的加载 IMAGE loading;IMAGE about;IMAGE help;IMAGE background;IMAGE Aa,Bb,Cc,Dd,Ee,Ff,Gg,Hh,Ii,Jj,Kk,Ll,Mm,Nn,Oo,Pp,Qq,Rr,Ss,Tt,Uu,Vv,a1,a2,b1,b2,c1,c2,d1,d2;void LoadData(void); //加载信息 int CreateUDG1(MGraph &G1);//初始化所有景点信息 int weight(Point a,Point b);//计算两点之间的距离 void Windows(void); //主窗口界面 void Musicplay(int mark);//播放音乐 void Showplace(void); //查找地点位置 void Showpoint(int i);void Shortest(void); //两点之间的最短路径 void Showline(int i,int j);//显示输入框 void Showline1(int i,int j);//显示输入框 void Showline2(int i,int j);//显示输入框 void Floyd(void); //佛洛依德算法,算出每两点间的最短路径矩阵 void Linemin(int i,int j); //画最短路径 void Findrepast(void); //查找附近的食堂 void Findmarket(void); //查找附近的超市 void Entermap(void); //进入地图操作界面 void Viewmain(void); //浏览地点信息 void HelP(void); //操作说明 void About(void); //作者相关信息 void Quit(void); //退出系统 2.TourGuide.cpp 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 #include“head.h” int main(){ initgraph(640,480);HWND hwnd = GetHWnd(); // 设置窗口标题文字 SetWindowText(hwnd, “华科地图导航”);LoadData();CreateUDG1(G1);Musicplay(1);Windows();return 0;} /*功能:对输入的两个点计算它们之间的距离,并将其返回到调用的函数中*/ int weight(Point a,Point b){ double x;int y;x=pow((a.x-b.x),2)+pow((a.y-b.y),2);x=sqrt(x);y=int(x);return y;} /*功能:加载程序运行必须的图片及函数相关信息*/ void LoadData(void){ int i,j;loadimage(&loading,“./picture/loading.jpg”);loadimage(&about,“./picture/about.jpg”);loadimage(&help,“./picture/help.jpg”);loadimage(&background,“./picture/background.jpg”);loadimage(&map,“./picture/map.jpg”);loadimage(&map1,“./picture/map1.jpg”);loadimage(&Aa,“./picture/place/A.jpg”);loadimage(&Bb,“./picture/place/B.jpg”);loadimage(&Cc,“./picture/place/C.jpg”);loadimage(&Dd,“./picture/place/D.jpg”);loadimage(&Ee,“./picture/place/E.jpg”);loadimage(&Ff,“./picture/place/F.jpg”);loadimage(&Gg,“./picture/place/G.jpg”);loadimage(&Hh,“./picture/place/H.jpg”);loadimage(&Ii,“./picture/place/I.jpg”);loadimage(&Jj,“./picture/place/J.jpg”);loadimage(&Kk,“./picture/place/K.jpg”);loadimage(&Ll,“./picture/place/L.jpg”);loadimage(&Mm,“./picture/place/M.jpg”);loadimage(&Nn,“./picture/place/N.jpg”);loadimage(&Oo,“./picture/place/O.jpg”);loadimage(&Pp,“./picture/place/P.jpg”);loadimage(&Qq,“./picture/place/Q.jpg”);loadimage(&Rr,“./picture/place/R.jpg”);loadimage(&Ss,“./picture/place/S.jpg”);loadimage(&Tt,“./picture/place/T.jpg”);loadimage(&Uu,“./picture/place/U.jpg”);loadimage(&Vv,“./picture/place/V.jpg”);loadimage(&a1,“./picture/menu/a1.jpg”);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 loadimage(&a2,“./picture/menu/a2.jpg”);loadimage(&b1,“./picture/menu/b1.jpg”);loadimage(&b2,“./picture/menu/b2.jpg”);loadimage(&c1,“./picture/menu/c1.jpg”);loadimage(&c2,“./picture/menu/c2.jpg”);loadimage(&d1,“./picture/menu/d1.jpg”);loadimage(&d2,“./picture/menu/d2.jpg”);for(i=1;i<=All;i++){ for(j=1;j<=All;j++) { G0.arcs[i][j]=MAX_ROAD; } } for(i=1;i<=All;i++) { shortest[i][i]=0; } for(i=0;i G0.vexs[i+1].point.x=pos[i][0]; G0.vexs[i+1].point.y=pos[i][1]; } //初始化连通路径 G0.arcs[1][2]=G0.arcs[2][1]=weight(G0.vexs[1].point,G0.vexs[2].point);G0.arcs[1][22]=G0.arcs[22][1]=weight(G0.vexs[22].point,G0.vexs[1].point);G0.arcs[1][27]=G0.arcs[27][1]=weight(G0.vexs[27].point,G0.vexs[1].point); G0.arcs[1][28]=G0.arcs[28][1]=weight(G0.vexs[28].point,G0.vexs[1].point); G0.arcs[2][27]=G0.arcs[27][2]=weight(G0.vexs[27].point,G0.vexs[2].point); G0.arcs[2][28]=G0.arcs[28][2]=weight(G0.vexs[28].point,G0.vexs[2].point); G0.arcs[3][21]=G0.arcs[21][3]=weight(G0.vexs[21].point,G0.vexs[3].point); G0.arcs[3][24]=G0.arcs[24][3]=weight(G0.vexs[24].point,G0.vexs[3].point);G0.arcs[4][24]=G0.arcs[24][4]=weight(G0.vexs[24].point,G0.vexs[4].point); G0.arcs[4][25]=G0.arcs[25][4]=weight(G0.vexs[25].point,G0.vexs[4].point);G0.arcs[4][29]=G0.arcs[29][4]=weight(G0.vexs[29].point,G0.vexs[4].point);G0.arcs[4][60]=G0.arcs[60][4]=weight(G0.vexs[60].point,G0.vexs[4].point); G0.arcs[5][29]=G0.arcs[29][5]=weight(G0.vexs[29].point,G0.vexs[5].point);G0.arcs[5][34]=G0.arcs[34][5]=weight(G0.vexs[34].point,G0.vexs[5].point);G0.arcs[6][30]=G0.arcs[30][6]=weight(G0.vexs[6].point,G0.vexs[30].point);G0.arcs[6][35]=G0.arcs[35][6]=weight(G0.vexs[6].point,G0.vexs[35].point); G0.arcs[7][49]=G0.arcs[49][7]=weight(G0.vexs[7].point,G0.vexs[49].point);G0.arcs[7][38]=G0.arcs[38][7]=weight(G0.vexs[7].point,G0.vexs[38].point);G0.arcs[8][47]=G0.arcs[47][8]=weight(G0.vexs[8].point,G0.vexs[47].point);G0.arcs[8][53]=G0.arcs[53][8]=weight(G0.vexs[53].point,G0.vexs[8].point);G0.arcs[8][55]=G0.arcs[55][8]=weight(G0.vexs[55].point,G0.vexs[8].point);G0.arcs[9][37]=G0.arcs[37][9]=weight(G0.vexs[9].point,G0.vexs[37].point);G0.arcs[9][40]=G0.arcs[40][9]=weight(G0.vexs[9].point,G0.vexs[40].point);G0.arcs[10][31]=G0.arcs[31][10]=weight(G0.vexs[10].point,G0.vexs[31].point);G0.arcs[10][23]=G0.arcs[23][10]=weight(G0.vexs[10].point,G0.vexs[23].point);G0.arcs[10][32]=G0.arcs[32][10]=weight(G0.vexs[10].point,G0.vexs[32].point); G0.arcs[11][17]=G0.arcs[17][11]=weight(G0.vexs[11].point,G0.vexs[17].point); G0.arcs[11][23]=G0.arcs[23][11]=weight(G0.vexs[11].point,G0.vexs[23].point); G0.arcs[12][18]=G0.arcs[18][12]=weight(G0.vexs[12].point,G0.vexs[18].point); G0.arcs[13][50]=G0.arcs[50][13]=weight(G0.vexs[13].point,G0.vexs[50].point);G0.arcs[13][15]=G0.arcs[15][13]=weight(G0.vexs[13].point,G0.vexs[15].point); G0.arcs[14][18]=G0.arcs[18][14]=weight(G0.vexs[14].point,G0.vexs[18].point); G0.arcs[14][41]=G0.arcs[41][14]=weight(G0.vexs[14].point,G0.vexs[41].point);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 G0.arcs[14][50]=G0.arcs[50][14]=weight(G0.vexs[14].point,G0.vexs[50].point); G0.arcs[15][17]=G0.arcs[17][15]=weight(G0.vexs[15].point,G0.vexs[17].point); G0.arcs[16][23]=G0.arcs[23][16]=weight(G0.vexs[16].point,G0.vexs[23].point); G0.arcs[16][26]=G0.arcs[26][16]=weight(G0.vexs[16].point,G0.vexs[26].point); G0.arcs[19][42]=G0.arcs[42][19]=weight(G0.vexs[19].point,G0.vexs[42].point); G0.arcs[19][43]=G0.arcs[43][19]=weight(G0.vexs[19].point,G0.vexs[43].point); G0.arcs[20][26]=G0.arcs[26][20]=weight(G0.vexs[20].point,G0.vexs[26].point); G0.arcs[20][32]=G0.arcs[32][20]=weight(G0.vexs[20].point,G0.vexs[32].point); G0.arcs[21][22]=G0.arcs[22][21]=weight(G0.vexs[22].point,G0.vexs[21].point); G0.arcs[22][25]=G0.arcs[25][22]=weight(G0.vexs[22].point,G0.vexs[25].point); G0.arcs[24][44]=G0.arcs[44][24]=weight(G0.vexs[24].point,G0.vexs[44].point); G0.arcs[25][27]=G0.arcs[27][25]=weight(G0.vexs[25].point,G0.vexs[27].point); G0.arcs[26][52]=G0.arcs[52][26]=weight(G0.vexs[26].point,G0.vexs[52].point); G0.arcs[27][60]=G0.arcs[60][27]=weight(G0.vexs[27].point,G0.vexs[60].point); G0.arcs[28][31]=G0.arcs[31][28]=weight(G0.vexs[28].point,G0.vexs[31].point); G0.arcs[29][30]=G0.arcs[30][29]=weight(G0.vexs[29].point,G0.vexs[30].point); G0.arcs[29][44]=G0.arcs[44][29]=weight(G0.vexs[29].point,G0.vexs[44].point); G0.arcs[30][59]=G0.arcs[59][30]=weight(G0.vexs[30].point,G0.vexs[59].point);G0.arcs[30][60]=G0.arcs[60][30]=weight(G0.vexs[30].point,G0.vexs[60].point); G0.arcs[31][59]=G0.arcs[59][31]=weight(G0.vexs[31].point,G0.vexs[59].point); G0.arcs[32][33]=G0.arcs[33][32]=weight(G0.vexs[32].point,G0.vexs[33].point); G0.arcs[33][37]=G0.arcs[37][33]=weight(G0.vexs[33].point,G0.vexs[37].point); G0.arcs[33][58]=G0.arcs[58][33]=weight(G0.vexs[33].point,G0.vexs[58].point); G0.arcs[34][35]=G0.arcs[35][34]=weight(G0.vexs[34].point,G0.vexs[35].point); G0.arcs[34][45]=G0.arcs[45][34]=weight(G0.vexs[34].point,G0.vexs[45].point); G0.arcs[35][38]=G0.arcs[38][35]=weight(G0.vexs[35].point,G0.vexs[38].point);G0.arcs[35][58]=G0.arcs[58][35]=weight(G0.vexs[35].point,G0.vexs[58].point); G0.arcs[36][37]=G0.arcs[37][36]=weight(G0.vexs[36].point,G0.vexs[37].point); G0.arcs[36][38]=G0.arcs[38][36]=weight(G0.vexs[36].point,G0.vexs[38].point); G0.arcs[36][39]=G0.arcs[39][36]=weight(G0.vexs[36].point,G0.vexs[39].point);G0.arcs[36][58]=G0.arcs[58][36]=weight(G0.vexs[36].point,G0.vexs[58].point); G0.arcs[37][52]=G0.arcs[52][37]=weight(G0.vexs[37].point,G0.vexs[52].point);G0.arcs[38][45]=G0.arcs[45][38]=weight(G0.vexs[45].point,G0.vexs[38].point);G0.arcs[39][49]=G0.arcs[49][39]=weight(G0.vexs[39].point,G0.vexs[49].point); G0.arcs[39][55]=G0.arcs[55][39]=weight(G0.vexs[39].point,G0.vexs[55].point);G0.arcs[39][40]=G0.arcs[40][39]=weight(G0.vexs[39].point,G0.vexs[40].point); G0.arcs[40][56]=G0.arcs[56][40]=weight(G0.vexs[40].point,G0.vexs[56].point); G0.arcs[40][51]=G0.arcs[51][40]=weight(G0.vexs[40].point,G0.vexs[51].point); G0.arcs[41][47]=G0.arcs[47][41]=weight(G0.vexs[41].point,G0.vexs[47].point);G0.arcs[41][57]=G0.arcs[57][41]=weight(G0.vexs[41].point,G0.vexs[57].point);G0.arcs[42][44]=G0.arcs[44][42]=weight(G0.vexs[42].point,G0.vexs[44].point);G0.arcs[42][46]=G0.arcs[46][42]=weight(G0.vexs[42].point,G0.vexs[46].point);G0.arcs[43][46]=G0.arcs[46][43]=weight(G0.vexs[43].point,G0.vexs[46].point); G0.arcs[43][48]=G0.arcs[48][43]=weight(G0.vexs[43].point,G0.vexs[48].point);G0.arcs[43][54]=G0.arcs[54][43]=weight(G0.vexs[43].point,G0.vexs[54].point);G0.arcs[45][46]=G0.arcs[46][45]=weight(G0.vexs[45].point,G0.vexs[46].point); G0.arcs[46][49]=G0.arcs[49][46]=weight(G0.vexs[46].point,G0.vexs[49].point);G0.arcs[47][56]=G0.arcs[56][47]=weight(G0.vexs[47].point,G0.vexs[56].point);G0.arcs[48][53]=G0.arcs[53][48]=weight(G0.vexs[48].point,G0.vexs[53].point);G0.arcs[49][54]=G0.arcs[54][49]=weight(G0.vexs[49].point,G0.vexs[54].point); G0.arcs[50][52]=G0.arcs[52][50]=weight(G0.vexs[50].point,G0.vexs[52].point);G0.arcs[51][52]=G0.arcs[52][51]=weight(G0.vexs[51].point,G0.vexs[52].point);G0.arcs[51][57]=G0.arcs[57][51]=weight(G0.vexs[51].point,G0.vexs[57].point); G0.arcs[53][54]=G0.arcs[54][53]=weight(G0.vexs[53].point,G0.vexs[54].point);G0.arcs[54][55]=G0.arcs[55][54]=weight(G0.vexs[54].point,G0.vexs[55].point);G0.arcs[55][56]=G0.arcs[56][55]=weight(G0.vexs[55].point,G0.vexs[56].point);G0.arcs[56][57]=G0.arcs[57][56]=weight(G0.vexs[56].point,G0.vexs[57].point);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 G0.arcs[58][59]=G0.arcs[59][58]=weight(G0.vexs[58].point,G0.vexs[59].point Floyd();} /*功能:佛洛依德算法,将每对景点之间的最短路径距离算出并存储最短路径到path中 */ void Floyd() { int i,j,k; for(i=1;i<=All;i++) { for(j=1;j<=All;j++) { shortest[i][j]=G0.arcs[i][j]; path[i][j]=j; } } /*初始化数组*/ for(k=1;k<=All;k++) { for(i=1;i<=All;i++) { for(j=1;j<=All;j++) { if(shortest[i][j]>(shortest[i][k]+shortest[k][j])) { shortest[i][j]=shortest[i][k]+shortest[k][j]; path[i][j]=k; path[j][i]=k; /*记录经过的路径*/ } } } } } /*功能:初始化由所有景点构成的无向完全图G1,并加载必要信息*/ int CreateUDG1(MGraph &G1){ int p,q;Gi=0;G1.vexnum=22; for(q=0;q G1.vexs[q].point.x=pos[q][0]; G1.vexs[q].point.y=pos[q][1]; strcpy(G1.vexs[q].name,Name[q]); G1.vexs[q].num=Num[q];} for(q=0;q { for(p=q;p G1.arcs[q][p]=G1.arcs[p][q]=weight(G1.vexs[p].point,G1.vexs[q].point);} return 1;} /*把音乐以资源形式嵌入exe并播放,mark用来控制音乐的播放与暂停*/ void Musicplay(int mark){ mciSendString(“open./music/1024.mp3 alias music”,NULL,0,NULL);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 if(mark==1) mciSendString(_T(“play music repeat”),NULL,0,NULL);if(mark==2) mciSendString(_T(“pause music”),NULL,0,NULL);if(mark==3) mciSendString(_T(“resume music”),NULL,0,NULL);} /*功能:显示主窗口界面,进入功能选择区*/ void Windows(void){ cleardevice();int posx[]={265,265,265,265,265,31,62};int posy[]={180,220,260,300,340,449,449};putimage(0,0,&loading);settextstyle(25, 0, _T(“隶书”));setbkmode(TRANSPARENT);settextcolor(WHITE);outtextxy(posx[0],posy[0], _T(“地图导航”));outtextxy(posx[1],posy[1], _T(“进入地图”));outtextxy(posx[2],posy[2], _T(“使用帮助”));outtextxy(posx[3],posy[3], _T(“关于导航”));outtextxy(posx[4],posy[4], _T(“退出导航”));MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_MOUSEMOVE) { if(m.x>posx[0]&&m.x posy[0]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[0],posy[0], _T(“地图导航”)); if(m.x>posx[1]&&m.x posy[1]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[1],posy[1], _T(“进入地图”)); if(m.x>posx[2]&&m.x posy[2]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[2],posy[2], _T(“使用帮助”)); if(m.x>posx[3]&&m.x posy[3]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[3],posy[3], _T(“关于导航”)); if(m.x>posx[4]&&m.x posy[4]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[4],posy[4], _T(“退出导航”)); } if(m.uMsg==WM_LBUTTONUP) { 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 if(m.x>posx[0]&&m.x posy[0]&&m.y Entermap(); if(m.x>posx[1]&&m.x posy[1]&&m.y Viewmain(); if(m.x>posx[2]&&m.x posy[2]&&m.y HelP(); if(m.x>posx[3]&&m.x posy[3]&&m.y About(); if(m.x>posx[4]&&m.x posy[4]&&m.y Quit(); if(m.x>posx[5]&&m.x posy[5]&&m.y Musicplay(3); if(m.x>posx[6]&&m.x posy[6]&&m.y Musicplay(2); } } cleardevice();return;} /*功能:进入地图操作界面,可选功能项有最短路径查询和最佳路线问题*/ void Entermap(){ int posx[]={215,325,215,325,0};int posy[]={135,135,245,245,0};putimage(0,0,&background);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_MOUSEMOVE) { if(m.x>posx[0]&&m.x posy[0]&&m.y putimage(215,135,&c2); else putimage(215,135,&c1); if(m.x>posx[1]&&m.x posy[1]&&m.y putimage(325,135,&d2); else putimage(325,135,&d1); if(m.x>posx[2]&&m.x posy[2]&&m.y putimage(215,245,&a2); else putimage(215,245,&a1); if(m.x>posx[3]&&m.x posy[3]&&m.y putimage(325,245,&b2); else putimage(325,245,&b1); } if(m.uMsg==WM_LBUTTONUP) { if(m.x>posx[0]&&m.x posy[0]&&m.y Showplace(); if(m.x>posx[1]&&m.x posy[1]&&m.y Shortest(); if(m.x>posx[2]&&m.x posy[2]&&m.y Findrepast(); if(m.x>posx[3]&&m.x posy[3]&&m.y 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 Findmarket(); if(m.x>posx[4]&&m.x posy[4]&&m.y Windows(); } } } /*功能:弹出地点查询框,作为输入信息用*/ void Showplace(void){ char s[10];int choose;HWND wnd = GetHWnd();M: if(InputBox(s, 10, “查找地点,如:我的选择是:AnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入地点编号”,NULL,300,90,false)==true){ choose=s[0]-'A'+1; if(0 Showpoint(choose); else if(MessageBox(wnd, _T(“选择出现在A-V,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();} void Showpoint(int i){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“ 【红色为查询地点所在位置】”};char message[100];int a=i;strcpy(message,s[0]);putimage(0,0,&map1);strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);setfillcolor(0x001eff);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7); if(MessageBox(wnd, _T(message), _T(“提醒”),MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:弹出最短路径查询框,作为输入信息用*/ void Shortest(void){ char s[10];int choose1,choose2;HWND wnd = GetHWnd();华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 M: if(InputBox(s, 10, “查询线路,如:我的选择是:ABnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入两地点编号”,NULL,300,90,false)==true){ choose1=s[0]-'A'+1; choose2=s[1]-'A'+1; if(0 Showline(choose1,choose2); else if(MessageBox(wnd, _T(“选择出现在A-V,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();} /*功能:弹出食堂查询框,作为输入信息用*/ void Findrepast(void){ char s[10];int choose1,choose2;HWND wnd = GetHWnd();M: if(InputBox(s, 10, “查找地点附近食堂,如:我的选择是:AnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入编号”,NULL,300,90,false)==true){ choose1=s[0]-'A'+1; if(0 { if(choose1==6||choose1==7||choose1==8){ choose2=8; Showline1(choose1,choose2);} else if(choose1==1||choose1==2||choose1==9||choose1==10||choose1==16||choose1==20){ choose2=16; Showline1(choose1,choose2);} else if(choose1==11||choose1==13||choose1==15||choose1==17){ choose2=17; Showline1(choose1,choose2);} else if(choose1==12||choose1==14||choose1==18){ choose2=18; Showline1(choose1,choose2);} else{ choose2=19; Showline1(choose1,choose2);} } else if(MessageBox(wnd, _T(“选择出现在A-V,W-X,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 } /*功能:弹出食堂超市查询框,作为输入信息用*/ void Findmarket(void){ char s[10];int choose1,choose2;HWND wnd = GetHWnd();M: if(InputBox(s, 10, “查找地点附近超市,如:我的选择是:AnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入编号”,NULL,300,90,false)==true){ choose1=s[0]-'A'+1; if(0 { if(choose1==8||choose1==12||choose1==14||choose1==18||choose1==19){ choose2=14; Showline2(choose1,choose2);} else{ choose2=15; Showline2(choose1,choose2);} } else if(MessageBox(wnd, _T(“选择出现在A-V,W-X,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();} /*功能:输出最短路径线路图及最短距离*/ void Showline(int i,int j){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“→”,“的最短距离nn”,“最短距离为:”,“米 【蓝色为起点,红色为终点】”};char message[100];char string[10];int a,b;a=i;b=j;strcpy(message,s[0]);putimage(0,0,&map1);strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);strcat(message,G1.vexs[b-1].name);strcat(message,s[2]);strcat(message,s[3]);Linemin(a,b);itoa(shortest[a][b]*3.68,string,10);strcat(message,string);strcat(message,s[4]);setfillcolor(BLUE);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7);setfillcolor(0x001eff);fillcircle(G1.vexs[b-1].point.x,G1.vexs[b-1].point.y,7);if(MessageBox(wnd, _T(message), _T(“提醒”), 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:输出食堂最短路径线路图及最短距离*/ void Showline1(int i,int j){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“ 附近最近的食堂 ”,“ 其路径如图nn”,“最短距离为:”,“米 【蓝色为起点,红色为终点】”};char message[100];char string[10];int a,b;a=i;b=j;strcpy(message,s[0]);putimage(0,0,&map1);strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);strcat(message,G1.vexs[b-1].name);strcat(message,s[2]);strcat(message,s[3]);Linemin(a,b);itoa(shortest[a][b]*3.68,string,10);strcat(message,string);strcat(message,s[4]);setfillcolor(BLUE);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7);setfillcolor(0x001eff);fillcircle(G1.vexs[b-1].point.x,G1.vexs[b-1].point.y,7);if(MessageBox(wnd, _T(message), _T(“提醒”),MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:输出食堂最短路径线路图及最短距离*/ void Showline2(int i,int j){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“ 附近最近的超市 ”,“ 其路径如图nn”,“最短距离为:”,“米 【蓝色为起点,红色为终点】”};char message[100];char string[10];int a,b;a=i;b=j;strcpy(message,s[0]);putimage(0,0,&map1);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);strcat(message,G1.vexs[b-1].name);strcat(message,s[2]);strcat(message,s[3]);Linemin(a,b);itoa(shortest[a][b]*3.68,string,10);strcat(message,string);strcat(message,s[4]);setfillcolor(BLUE);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7);setfillcolor(0x001eff);fillcircle(G1.vexs[b-1].point.x,G1.vexs[b-1].point.y,7);if(MessageBox(wnd, _T(message), _T(“提醒”),MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:绘制最短路径线路图*/ void Linemin(int i,int j){ setlinestyle(PS_DASH|PS_JOIN_ROUND,4);if(path[i][j]==i||path[i][j]==j) line(G0.vexs[i].point.x,G0.vexs[i].point.y,G0.vexs[j].point.x,G0.vexs[j].point.y);else{ Linemin(path[i][j],i); Linemin(path[i][j],j);} setlinestyle(PS_SOLID,1);} /*功能:地图地点相关信息的介绍*/ void Viewmain(){ IMAGE temp;int choose;putimage(0,0,&map);getimage(&temp,465,275,210,260);setfillcolor(0x001eff);settextstyle(20,0,“楷体”);settextcolor(BLACK);setbkmode(TRANSPARENT);for(choose=1;choose<=N;choose++){ fillcircle(pos[choose-1][0],pos[choose-1][1],7);} outtextxy(0,0,“返回”);outtextxy(80,0,“Tips:鼠标移动到相应的点范围即可查看对应地点信息”);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_MOUSEMOVE)华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 { if(m.x>pos[0][0]-7&&m.x pos[0][1]-7&&m.y putimage(465,275,&Aa); else if(m.x>pos[1][0]-7&&m.x pos[1][1]-7&&m.y putimage(465,275,&Bb); else if(m.x>pos[2][0]-7&&m.x pos[2][1]-7&&m.y putimage(465,275,&Cc); else if(m.x>pos[3][0]-7&&m.x pos[3][1]-7&&m.y putimage(465,275,&Dd); else if(m.x>pos[4][0]-7&&m.x pos[4][1]-7&&m.y putimage(465,275,&Ee); else if(m.x>pos[5][0]-7&&m.x pos[5][1]-7&&m.y putimage(465,275,&Ff); else if(m.x>pos[6][0]-7&&m.x pos[6][1]-7&&m.y putimage(465,275,&Gg); else if(m.x>pos[7][0]-7&&m.x pos[7][1]-7&&m.y putimage(465,275,&Hh); else if(m.x>pos[8][0]-7&&m.x pos[8][1]-7&&m.y putimage(465,275,&Ii); else if(m.x>pos[9][0]-7&&m.x pos[9][1]-7&&m.y putimage(465,275,&Jj); else if(m.x>pos[10][0]-7&&m.x pos[10][1]-7&&m.y putimage(465,275,&Kk); else if(m.x>pos[11][0]-7&&m.x pos[11][1]-7&&m.y putimage(465,275,&Ll); else if(m.x>pos[12][0]-7&&m.x pos[12][1]-7&&m.y putimage(465,275,&Mm); else if(m.x>pos[13][0]-7&&m.x pos[13][1]-7&&m.y putimage(465,275,&Nn); else if(m.x>pos[14][0]-7&&m.x pos[14][1]-7&&m.y putimage(465,275,&Oo); else if(m.x>pos[15][0]-7&&m.x pos[15][1]-7&&m.y putimage(465,275,&Pp); else if(m.x>pos[16][0]-7&&m.x pos[16][1]-7&&m.y putimage(465,275,&Qq); else if(m.x>pos[17][0]-7&&m.x pos[17][1]-7&&m.y putimage(465,275,&Rr); else if(m.x>pos[18][0]-7&&m.x pos[18][1]-7&&m.y putimage(465,275,&Ss);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 else if(m.x>pos[19][0]-7&&m.x pos[19][1]-7&&m.y putimage(465,275,&Tt); else if(m.x>pos[20][0]-7&&m.x pos[20][1]-7&&m.y putimage(465,275,&Uu); else if(m.x>pos[21][0]-7&&m.x pos[21][1]-7&&m.y putimage(465,275,&Vv); else putimage(465,275,&temp); } if(m.uMsg==WM_LBUTTONUP) { if(m.x>0&&m.x<40&&m.y>0&&m.y<20) { setbkmode(TRANSPARENT); Windows(); } } } } /*功能:进入帮助功能界面,显示操作说明*/ void HelP(void){ putimage(0,0,&help);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_LBUTTONUP) if(m.x>0&&m.x<070&&m.y>0&&m.y<50) Windows();} } /*功能:显示作者相关信息*/ void About(void){ int posx[]={0,25};int posy[]={0,350};cleardevice();putimage(0,0,&about);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_LBUTTONUP) if(m.x>posx[0]&&m.x posy[0]&&m.y Windows();} } /*退出系统,结束程序的运行*/ void Quit(void){ HWND wnd = GetHWnd();if(MessageBox(wnd, _T(“你确定要退出吗?”), _T(“提醒”),31 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 } { } MB_OKCANCEL | MB_ICONQUESTION)== IDOK)closegraph();exit(0); 《c语言课程设计》课程设计报告 课程主题: 聪明的小蛇 Smart Snake 需求分析 【阐述课程设计应该完成的功能】 使用键盘的上下左右键来控制蛇的运动方向,ESC键退出,显示现在得分,三个难度选择(每一关地图不同,小蛇移动速度不同)系统分析和设计 2.1 数据结构的设计和选择的理由 本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。 2.1.1 蛇是由一连串举行组成,用结构体数组表示蛇每一节的横纵坐标。用数组实现 struct Snake { int x[N];int y[N];int node;/*蛇的节数*/ int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/ }snake;//这是蛇的结构体 小蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点: 1.蛇头由键盘控制,在无操作的时候蛇需要以原来的方向继续前进 2.运动时,蛇身后面一节移动到前面一节的位置。2.1.2 关于食物有两个属性: 1.坐标位置 2.状态:存在,或被吃。 (由于三者的存在状态基本相同所以我们用一个结构体表示)struct Food { int x;/*食物的横坐标*/ int y;/*食物的纵坐标*/ int yes;/*判断是否要出现食物的变量*/ }food;/*食物的结构体*/ 2.2 系统模块划分和模块结构 开始动画 游戏开始界面 游戏过程界面 游戏结束界面 2.3 流程图 2.4 数据类型、全局变量和函数说明 2.4.1数据类型&2.4.2全局变量 #include “stdafx.h” #include “graphics.h” #include “stdlib.h” #include “conio.h” #include “time.h” #include “stdio.h” #include “snake.h” #pragma comment(lib,“Winmm.lib”)//播放音乐 #ifndef SNAKE_H #define SNAKE_H #define LEFT 'a' #define RIGHT 'd' #define DOWN 's' #define UP 'w' #define ESC 27 #define N 200 #define ENTER 13 #define JACK 'j' #define KING 'k' #define LONG 'l' int score = 0;int Func = 0;int gamespeed = 200;//蛇运行速度 char mx1,mx2;int level=1;char string_score[100];char str[100]; 2.5 涉及的函数 static void Init(void);/*图形驱动*/ static void Close(void);/*图形结束*/ static void Game_interface(void);/*游戏界面*/ static void GameOver(void);/*结束游戏*/ static void GamePlay(void);/*游戏过程*/ static void PrScore(void);/*输出成绩*/ static void textdown(void);//选关焦点乡下 static void textup(void);//选关焦点向上 static void choose(void);//选关界面 static void difficult(void);//难度选择 程序测试和运行结果 反复调试 效果良好,能正常运行 课程报告小结 【遇到的问题及解决方法分析等】 4.1小蛇和指示标走过有显示 解决方法:每次都用一块与背景色相同的的矩形覆盖。 4.2食物出现在边界上 解决方法: if(level==1){ while(food.x%10!= 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } if(level==2){while((food.x%10!= 0)||((food.x>=145)&&(food.x<=510))&&((food.y>=250)&&(food.y<=270)))/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } /这段代码保证了食物不被产生在障碍上 附录 程序源代码: // mff.cpp : Defines the entry point for the console application.// #include “stdafx.h” #include “graphics.h” #include “stdlib.h” #include “conio.h” #include “time.h” #include “stdio.h” #include “snake.h” #pragma comment(lib,“Winmm.lib”)//播放音乐 int score = 0;int Func = 0;int gamespeed = 200;//蛇运行速度 char mx1,mx2;int level=1;char string_score[100];char str[100]; static void Init(void);/*图形驱动*/ static void Close(void);/*图形结束*/ static void Game_interface(void);/*游戏界面*/ static void GameOver(void);/*结束游戏*/ static void GamePlay(void);/*游戏过程*/ static void PrScore(void);/*输出成绩*/ static void textdown(void);static void textup(void);static void choose(void);static void difficult(void);int _tmain(int argc, _TCHAR* argv[]){ } /*图形驱动*/ static void Init(void){ int gd=9,gm=2; initgraph(&gd,&gm,“ ”);cleardevice();} /* 开始画面,左上角坐标为(,),右下角坐标为(,)的围墙*/ static void Game_interface(void){ int i;int j;int k; setcolor(YELLOW);/*setbkcolor(LIGHTGREEN);*/ setlinestyle(PS_SOLID,0,1);/*设置线型*/ for(i=50;i<=600;i+=10)/*画边框*/ { rectangle(i,40,i+10,49);/*上边框*/ rectangle(i,451,i+10,460);/*下边框*/ } if(level==2){ for(j=150;j<=500;j+=10) } if(level==3)///*画Level3下两条横向隔断*/ rectangle(j,245,j+10,254);/*画Level2下横向隔断*/ mciSendString(_T(“open 2.mp3 alias mymusic”), NULL, 0, NULL);mciSendString(_T(“play mymusic repeat”), NULL, 0, NULL);choose();return 0;system(“pause”);{ for(j=150;j<=500;j+=10)rectangle(j,180,j+10,189);for(k=150;k<=500;k+=10)rectangle(k,350,k+10,359);} for(i=40;i<=450;i+=10){ rectangle(50,i,59,i+10);/*左边框*/ rectangle(601,i,610,i+10);/*右边框*/ } } /* 游戏主函数*/ static void GamePlay(void){ int i;srand(time(NULL));/*随机数发生器*/ food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/ snake.life = 0;/*活着*/ snake.direction = 1;/*方向往右*/ snake.x[0] = 100;snake.y[0] = 100;snake.x[1] = 110;snake.y[1] = 100;snake.node = 2;/*节数*/ PrScore();/*输出得分*/ while(1)/*可以重复玩游戏,压ESC键结束*/ { while(!kbhit())/*在没有按键的情况下,蛇自己移动*/ { if(food.yes == 1)/*需要出现新食物*/ { food.x = rand()%400 + 60;food.y = rand()%350 + 60;if(level==1){ while(food.x%10!= 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } if(level==2){while((food.x%10!= 0)||((food.x>=145)&&(food.x<=510))&&((food.y>=250)&&(food.y<=270)))/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } if(level==3){while((food.x%10!= 0)||(((food.x < 530)&&(food.x > 135))&&((food.y < 185)&&(food.y > 185)))||(((food.x < 530)&&(food.x > 135))&&((food.y < 379)&&(food.y > 350))))/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } } if(food.yes == 0)/*画面上有食物了就要显示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x + 10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i] = snake.x[i-1];snake.y[i] = snake.y[i-1];} /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction){ case 1: snake.x[0] += 10;break;case 2: snake.x[0]-= 10;break;case 3: snake.y[0]-= 10;break;case 4: snake.y[0] += 10;break;} /* 从蛇的第四节开始判断是否撞到自己*/ for(i=3;i if(level==3){ if((((snake.x[0] < 520)&&(snake.x[0] > 145))&&((snake.y[0] < 195)&&(snake.y[0] > 175)))||(((snake.x[0] < 510)&&(snake.x[0] > 140))&&((snake.y[0] < 369)&&(snake.y[0] > 330))))/*蛇是否撞到level3中两条横向隔断*/ { GameOver();/*本次游戏结束*/ snake.life = 1;/*蛇死*/ } } if(snake.life == 1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break;if((snake.x[0] == food.x)&&(snake.y[0] == food.y))/*吃到食物以后*/ { setcolor(BLACK);/*把画面上的食物东西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node] =-20;snake.y[snake.node] =-20; /* 新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes = 1;/*画面上需要出现新的食物*/ score += 10;PrScore();/*输出新得分*/ } setcolor(RED);/*画出蛇*/ for(i=0;i if(snake.life == 1)/*如果蛇死就跳出循环*/ break; key=getch();/*接收按键*/ if(key == ESC)break;/*按ESC键退出*/ switch(key){ case UP: if(snake.direction!= 4)/*判断是否往相反的方向移动*/ snake.direction = 3;break;case RIGHT: if(snake.direction!= 2)snake.direction = 1;break;case LEFT: if(snake.direction!= 1)snake.direction = 2;break;case DOWN: if(snake.direction!= 3)snake.direction = 4;break;} }/*endwhile(1)*/ } /*游戏结束*/ static void GameOver(void){ cleardevice();PrScore();setcolor(RED);setfont(50, 0, _T(“楷体”));outtextxy(200, 200, _T(“GAME OVER”));getch();} /*输出成绩*/ static void PrScore(void){ setfillstyle(YELLOW);// bar(235, 560, 300, 580);char s[5] = {' '};setcolor(RED);setfont(50, 0, _T(“楷体”));outtextxy(200, 600, _T(“您的得分”));sprintf(s, “%d”, score); } outtextxy(450, 600, s[0]);outtextxy(480, 600, s[1]);outtextxy(510, 600, s[2]);outtextxy(540, 600, s[3]);outtextxy(570, 600,s[4]);static void Close(void){ closegraph();mciSendString(_T(“stop mymusic”), NULL, 0, NULL);mciSendString(_T(“close mymusic”), NULL, 0, NULL);exit(0);} void textdown(){ } } break; break;case 2: setcolor(BLACK);circle(250,320,10); setcolor(WHITE);circle(250,230,10);Func=0;switch(Func){ case 0: setcolor(BLACK); setcolor(WHITE);circle(250,275,10);Func++;break;circle(250,230,10);case 1: setcolor(BLACK);circle(250,275,10); setcolor(WHITE);circle(250,320,10);Func++; //功能按钮焦点向上 void textup(){ } static void choose(void){ Init();initgraph(700, 700);setcolor(GREEN); switch(Func){ case 0: } setcolor(BLACK);circle(250,230,10);setcolor(WHITE);circle(250,320,10);Func=2;break;circle(250,275,10); setcolor(WHITE);circle(250,230,10);Func=0;break;case 1: setcolor(BLACK);case 2: setcolor(BLACK);circle(250,320,10); setcolor(WHITE);circle(250,275,10);Func=1; break; setfont(30, 0, _T(“楷体”));outtextxy(220, 150, _T(“Smart Snake”)); setcolor(WHITE);setfont(25, 0, _T(“隶书”));circle(250,230,10);outtextxy(290, 220, _T(“开始游戏”));setfont(25, 0, _T(“隶书”));outtextxy(290, 310, _T(“退出游戏”));outtextxy(150, 400, _T(“当前难度:”));outtextxy(150, 450, _T(“简单”));setcolor(YELLOW);setfont(20, 0, _T(“楷体”));outtextxy(270, 525, _T(“Presented By:漂浮de星儿”));outtextxy(270, 550, _T(“Date:-03-08”));outtextxy(270, 575, _T(“Verson:.1.3(The Final Edition)”));setfont(25, 0, _T(“隶书”));outtextxy(290, 265, _T(“难度选择(默认为简单)”));{ while(true)if(mx1=getch()){ } // 延时(降低CPU 占用率)switch(mx1){ case ENTER: switch(Func){ case 0: cleardevice(); Game_interface();GamePlay(); Close();break;case 1:difficult();break;case 2:Close();break;};break;case DOWN:textdown();break;case UP:textup();break; } } } Sleep(20); void difficult()//难度选择函数 { outtextxy(150, 490, _T(“j-简单,k-中等,l-困难”));if(mx2=getch()){ case KING: //按键K gamespeed=150;switch(level)switch(mx2)gamespeed=200;switch(level){case 1:setcolor(BLACK); setcolor(WHITE);outtextxy(150, 450, _T(“简单”));level=1;break;{case JACK: //按键J outtextxy(150, 450, _T(“简单”));case 2: setcolor(BLACK);outtextxy(150, 450, _T(“中等”)); setcolor(WHITE);outtextxy(150, 450, _T(“简单”));level=1;break;case 3: setcolor(BLACK);outtextxy(150, 450, _T(“困难”)); setcolor(WHITE);outtextxy(150, 450, _T(“简单”));level=1;break;}break;{case 1:setcolor(WHITE);setcolor(WHITE);outtextxy(150, 450, _T(“中等”));outtextxy(150, 450, _T(“简单”)); } } level=2;break;case 2: setcolor(BLACK);outtextxy(150, 450, _T(“中等”)); setcolor(WHITE);outtextxy(150, 450, _T(“中等”));level=2;break;case 3: setcolor(BLACK);outtextxy(150, 450, _T(“困难”)); setcolor(WHITE);outtextxy(150, 450, _T(“中等”));level=2;break;}break;gamespeed=80;switch(level){case 1:setcolor(BLACK); } setcolor(WHITE);outtextxy(150, 450, _T(“困难”));level=3;break;case LONG: //按键L outtextxy(150, 450, _T(“简单”));case 2: setcolor(BLACK);outtextxy(150, 450, _T(“中等”)); setcolor(WHITE);outtextxy(150, 450, _T(“困难”));level=3;break;case 3: setcolor(BLACK);outtextxy(150, 450, _T(“困难”)); setcolor(WHITE);outtextxy(150, 450, _T(“困难”));level=3;break;}break;Snake.h: #ifndef SNAKE_H #define SNAKE_H #define LEFT 'a' #define RIGHT 'd' #define DOWN 's' #define UP 'w' #define ESC 27 #define N 200 #define ENTER 13 #define JACK 'j' #define KING 'k' #define LONG 'l' /*蛇的最大长度*/ char key;struct Food { int x;int y;int yes;}food; struct Snake { int x[N];int y[N];int node;int direction;int life;}snake;#endif /*控制按键*/ /*食物的横坐标*/ /*食物的纵坐标*/ /*判断是否要出现食物的变量*/ /*食物的结构体*/ /*蛇的节数*/ /*蛇移动方向*/ /* 蛇的生命,0活着,1死亡*/ 沈阳理工大学课程实践 摘 要 因纳特市场营销模拟平台软件是一个以市场营销为核心的管理信息系统,通过识别和规划企业现有资源,从而获取客户订单,完成加工和交付,最后得到客户付款的整个过程。它将企业内部所有资源整合在一起,对采购、生产、库存、销售、财务和市场营销进行了统一的规划,从而达到最佳资源组合,取得最佳效益。因纳特市场营销模拟平台软件是针对市场营销设计的角色体验的实验平台。在因纳特市场营销模拟平台软件模拟中,利用实物沙盘直观、形象地展示企业的内部资源和外部资源,并通过实际操作掌握企业在实际运营中所经历的步骤,使体验者对企业实际运营有所了解。本文以因纳特市场营销模拟平台软件模拟沙盘为研究对象,结合因纳特市场营销模拟平台软件相关理论,从市场预测的角度,分析了本次模拟沙盘实践的过程以及存在的一些问题,并针对问题提出了一些改进的方法,对经营规划进行了再思考,希望对今后的实际操作提供一定的帮助。关键词:模拟沙盘;因纳特市场营销模拟平台软件;市场预测 I 沈阳理工大学课程实践 目录 市场分析师业务分析..............................................................................................1 1.1 因纳特市场营销模拟平台软件概述...........................................................1 1.1.1 系统简介............................................................................................1 1.1.2 因纳特市场营销模拟平台软件的主要宗旨....................................1 1.1.3 因纳特市场营销模拟平台软件的重要性........................................1 1.1.4 因纳特市场营销模拟平台软件的核心内容....................................1.2 市场营销综合模拟实验概述.......................................................................2 1.2.1 营销综合模拟的实验目的................................................................2 1.2.2 营销综合模拟的基本要求................................................................31.3 营销综合模拟感想.......................................................................................3 1.3.1 角色及就职宣言................................................................................3 1.3.2 市场预测情况综述............................................................................5 1.3.3 公司经营状况总结............................................................................5 1.3.4 对市场预测的再思考........................................................................6 1.3.5 改进工作的思路................................................................................7 1.3.6 因纳特市场营销模拟平台软件模拟总结........................................7 参考文献........................................................................................................................9 II 沈阳理工大学课程实践 市场分析师业务分析 1.1 因纳特市场营销模拟平台软件概述 1.1.1 系统简介 因纳特市场营销模拟平台软件是由深圳因纳特科技有限公司总结MRPII软件的发展趋势的基础上提出的,因纳特给该软件的界定是:超越MRPII范围的集成功能;支持能动的监控能力、模拟分析和决策支持;支持开放的客户/服务器计算环境。该软件作为一个先进的企业管理模式,提供了企业信息化集成的最佳解决方案。它把企业的物流、资金流、信息流统一起来进行管理,以求最大限度地进行供应链协同和控制MRPII中的MRP计划过程和供应链管理流程,实现企业经济效益的最大化。1.1.2 因纳特市场营销模拟平台软件的主要宗旨 其主要宗旨是对企业所拥有的人、财、物、信息、时间和空间等综合资源进行综合平衡和优化管理,协调企业各管理部门,围绕市场导向开展业务活动,提高企业的核心竞争力,从而取得最好的经济效益。所以,因纳特市场营销模拟平台软件首先是一个软件,同时是一个管理工具。它是IT技术与管理思想的融合体,也就是先进的管理思想借助电脑,来达成企业的管理目标。1.1.3 因纳特市场营销模拟平台软件的重要性 1、实用性 因纳特市场营销模拟平台软件实际应用中更重要的是应该体现其“管理工具”的本质。 2、整合性 因纳特市场营销模拟平台软件最大特色便是整个企业信息系统的整合,比传统单一的系统更具功能性。 3、弹性 采用模块化的设计方式,使系统本身可应企业需要新增模块来支持并整合,提升企业的应变能力。 4、集中的数据储存 将原先分散企业各角落的数据整合起来,使数据得以一致性,并提升其精确 1 沈阳理工大学课程实践 性。 5、便利性 在整合的环境下,企业内部所产生的信息透过系统将可在企业任一地方取得与应用。 6、提升管理绩效 因纳特市场营销模拟平台软件将使部分间横向的联系有效且紧密,使得管理绩效提升。 7、实时性与动态管理 因纳特市场营销模拟平台软件是整个企业信息的整合管理,重在整体性,而整体性的关键就体现在“实时和动态管理”上,所谓“兵马未动,粮草先行”,强调的就是不同部门的“实时动态配合”,现实工作中的管理问题,也是部门协调与岗位配合的问题,因此缺乏“实时动态的管理手段和管理能力”的管理,就是空谈。 8、信息化及时性 因纳特市场营销模拟平台软件管理的关键是“现实工作信息化”,即把现实中的工作内容与工作方式,用信息化的手段来表现,因为人的精力和能力是有限的,现实事务达到一定的繁杂程度后,人就会在所难免的出错,将工作内容与工作方式信息化,就能形成因纳特市场营销模拟平台软件管理的信息化体系,才能拥有可靠的信息化管理工具。1.1.4 因纳特市场营销模拟平台软件的核心内容 在企业中,一般的管理主要包括三方面的内容:生产控制(计划、制造)、物流管理(分销、采购、库存管理)和财务管理(会计核算、财务管理)。这三大系统本身就是集成体,它们互相之间有相应的接口,能够很好的整合在一起来对企业进行管理。另外,要特别一提的是,随着企业对市场营销管理重视的加强,因纳特科技有限公司将市场营销管理纳入了因纳特市场营销模拟平台软件的一个重要组成部分。1.2 市场营销综合模拟实验概述 1.2.1 营销综合模拟的实验目的 通过营销综合模拟实践教学,弥补课堂教学的不足,将理论与实践相结合,2 沈阳理工大学课程实践 提高学生的学习兴趣、提升教学效果。利用软件辅助模拟教学过程,通过营造一个虚拟的市场环境,使我们经过各种市场经营决策的制定、运作,得到不同的结果,再经过反思、调整自己的策略,进而掌握营销知识。1.2.2 营销综合模拟的基本要求 营销综合模拟是将所学的理论知识应用于实际之中的一种教学活动,是课堂教学的深化。营销综合模拟教学环节要求学生根据教师指定的选题方向,开展市场调查、市场策划、模拟销售等活动,通过自身体验,学会在真实或仿真的市场营销环境中运用所学的市场营销学基础知识,分析和解决企业营销实际问题,进一步学习、消化和巩固课堂知识,培养和强化学生务实创新的意识,锻炼和提高其理论联系实际解决实际问题的能力。营销综合模拟教学实践环节的基本要求是:通过创建市场营销环境,鼓励学生通过亲身体验和团队合作,加深对课程基本知识和理论方法的理解,锻炼其综合运用理论知识解决实际问题的能力,增强对现实营销问题的认识,提高学生分析问题和解决问题的能力,培养学生运用营销思维、手段和方法有效开展市场营销活动的技能。营销综合模拟实践教学内容可以涉及市场调查、市场策划、模拟销售等活动,通过自身体验,学会在真实或模拟仿真的市场营销环境中运用所学的市场营销学基础知识,分析和解决企业营销实际问题。学生应系统地实践、体验和学习市场营销学各个方面的内容:市场调研和分析、营销计划和目标设计、营销策略设计和实施、结合总体战略的各种具体决策的制订和调整等。通过实验使学生掌握市场营销计划制定的方法,初步将理论与实践结合,制定出可实施的营销计划。因纳特市场营销模拟平台软件是以营销理论模型为基础以情景模拟为手段的教学工具可以让我们在复杂的模拟现实环境中演练学到的各种理论知识,充分体验企业从市场调查、竞争企业分析、营销战略制订到具体的营销战术的决策组织的全部过程,熟悉和了解各种市场调研预测工具的应用。1.3 营销综合模拟感想 1.3.1 角色及就职宣言 1、角色介绍 沈阳理工大学课程实践 在此次市场营销综合模拟中,我担任的是CEOD 公司市场分析师一职,主要工作是与进行下一年的市场预测,并参与广告费投放决策、投标过程的参与等。 2、就职宣言 作为公司的市场预测师,我深刻意识到对公司的责任之重大,我会倾尽自己的全力解决公司在市场决策方面的相关问题,帮助公司在今后六年的经营中取得骄人的经营业绩,在此也希望各部门能够配合我的工作,让我们齐心协力帮助公司战胜其他竞争对手,取得好的成绩。作为公司的管理者,我也将严格执行 CEO 下达的命令,遵守公司的章程,给其他员工做好表率,团结协作,一切以公司的利益作为行事的第一准则,也请各位成员能够监督我的工作,帮助我做的更好。 3、团队其他人员述职(1)CEO职责介绍 CEO的职责就是统筹全局,虽然不参与具体的策划,但是也具有指导和审核的作用,也会把部分意见和建议参与其中,还有就是在电脑中的录入,也是由 CEO 完成。在整个营销综合模拟过程中起着举足轻重的作用。(2)营销部门人员职责 营销总监及其助理,主要负责对市场的预测,广告的投放,以及根据生产力选择订单和安排交货。(3)市场部门人员职责 市场分析师及其助理,负责市场分析与预测,计算客户订单利润,竞争对手情况分析。(4)采购部人员职责 采购总监及其助理,主要负责根据生产情况制定原材料的采购计划以及在原材料不足的时候进行紧急采购。 4、职责运行总结 我们组的每一位成员都很负责,我们也会在每次上课之前进行讨论,商讨出之后几年的初步计划,包括对市场的预测,广告的投放,生产什么产品,拿什么订单,现金是否够用等一系列情况都会在上课之前进行商讨,然后再在实际操作的时候根据实际情况进行调整。虽然每个人都有不足之处,但是每个组员都在努力,都互相配合,都在慢慢 4 沈阳理工大学课程实践 改正,团队合作精神非常值得学习。 1.3.2 市场预测情况综述 1、第一年市场预测概述(1)产品选择 第一年市场只需要低端产品,因此确定生产低端产品。(2)广告费确定 由于是第一年,为避免被其他企业抛在后面,因此决定投入 140 万广告费。 (3)投标价格确定 为保证足够的利润,在投标价格方面选择了最大值。 2、第二年市场预测概述(1)产品选择 第二年市场仍只需要低端产品,因此确定生产低端产品。(2)广告费确定 本年吸取了上一年的经验,并针对市场竞争状况恶化的风险,决定再追加投入160万广告费。(3)投标价格确定 本年,为保证具有足够的竞争力,决定投标价格采用中上水平。 3、第三年市场预测概述(1)产品选择 第三年市场开始需要中端产品,因此决定中端产品和低端产品共同生产。 (2)广告费确定 对上一年的情况进行总结后,决定在今年投入200万广告费,以取得竞争的优势。(3)投标价格确定 为防止上一年的情况出现,决定再次压低价格,以底价位赢得客户。 1.3.3 公司经营状况总结 1、第一年经营状况总结 第一年我们小组取得了第一名,总结我们获胜原因有以下几点:(1)CEO带领市场分析师对市场情况作出了正确的分析;(2)市场营销总监及其助理综合各个方面,决策分析较其他组更加准确; 沈阳理工大学课程实践 (3)财务总监及助理对本组的财务状况进行了细致的分析;(4)采购部门对每一季度的产品运输和原材料采购掌握准确。 2、第二年经营状况总结 第二年我们小组取得了第五名,总结我们不足的原因如下:(1)市场分析师决策失误,没有预测到市场竞争的激烈,投标价格过高,低估了竞争者的恶意竞争;(2)营销总监没有做好市场决策,拿到的订单较差,资金没得到充分利用;(3)财务部门对贷款的计算不正确,导致贷款多余,增加了企业的负债;(4)出纳人员现金结算出错,牌面较乱。 3、第三年经营状况总结 第三年年初大家吸取去年的失败教训,在CEO带领下大家详细的进行各个方面的讨论,具体总结经验教训,对今年市场情况做了具体预测,对市场竞争者的情况做了总结分析。在这一年取得了第二名,总结原因如下:(1)市场分析师决策正确,准确预测了市场行情;(2)由于第二年业绩较差,这一年大家同心协力,目标明确;(3)营销总监对市场决策充分调研,拿到的订单较好,资金得到充分利用;(4)财务部门仔细对贷款进行计算。 4、经营结束后总结(1)营销计划是实现企业既定目标和战略的一系列活动,对于企业有着十分重要的意义。(2)要有效利用市场调研信息,正确客观评估公司的当前状况,并了解竞争者的状况,做到策略得当。(3)产品定价要考虑成本,产品供求状况和竞争状况。(4)新产品的开发要明确目标市场,产品要有其自身的独特性。(5)广告投入要合理慎重,花钱要花在刀刃上,要投有所值。1.3.4 对市场预测的再思考 1、产品选择的再思考 经过三年的模拟,我发现低端产品、中端产品和高端产品中,以低端产品的投入产出比最高,因此在经营过程中应适当放弃对中端产品和高端产品的生产,全力拿下低端产品市场,保证最大的收入,避免不必要的支出。 沈阳理工大学课程实践 2、广告费投入的再思考 经过三年的模拟,我发现广告费是一项不必过于投入的支出,因为在成熟的市场环境中,客户有多种区渠道获得企业资讯,过多的广告费投入不一定会取得更好的收入。因此在进行广告费投入时,只需做到行业同期的平均水平即可,不需要以此作为企业竞争的主要手段。 3、投标价格的再思考 经过三年的模拟,我发现价格是企业能否取得客户的决定性因素,只要能够在价格上取得优势,就会得到想要的客户。因此如何能够降低价格成为了企业生存发展的关键,也是企业需要首当其冲考虑的问题,是企业的生存发展之本。1.3.5 改进工作的思路 1、选对产品 在激烈的市场竞争中,要对所有的产品进行充分的了解,不能凭借片面的认识就作出结论。只有对各种产品进行充分的分析才能选对市场真正需要的且能够给企业带来最大利润的产品。 2、准确投入广告费 广告费作为企业一项重要的支出,需要慎重进行决定,要结合当前竞争者的投入状况和市场前景预测,不能盲目虚高,要做到每一分钱都物有所值,使企业的广告费成为企业的竞争力而不是累赘。 3、准确定位产品价格 产品价格作为企业的核心竞争力,应该在保证企业能够正常运作的情况下做到充分让利客户,只有这样才能在激烈的市场竞争中取得竞争优势,保证企业的产品能够销售出去,转变成企业的利润,为企业的发展奠定基础。1.3.6 因纳特市场营销模拟平台软件模拟总结 通过为期一周的因纳特市场营销模拟平台软件模拟,让我们通过模拟残酷激烈的市场竞争,使我们获得了在多种竞争形势下正确进行市场营销的经验。通过因纳特市场营销模拟平台软件模拟,进行产品细分和选择目标产品,让我们学会了竞争分析、资源分配、整合营销策划与实施等在平日里不曾接触到的东西。帮助我们学会制定以市场为导向的业务战略计划,认识到营销战略对于经营业绩的决定性作用,感受到内部营销与外部营销的相互关系。市场营销综合模拟课程时间虽然结束了,但经过一个星期的市场营销综合模 7 沈阳理工大学课程实践 拟实践课,我们对市场营销有了一个全新的认识。因纳特市场营销模拟平台软件模拟通过直观的企业经营沙盘来模拟企业运行状况,让我们在实践中提高各个方面的能力,形象地认识到企业资源的有限性,从而达到锻炼的目的;而且,它也极为有效地激发我们的学习兴趣和学习动力,对我们提高业务技能与水平,有非常重要的促进作用,也让我们更加了解了自己的优势和劣势。通过分组,使我们必须和他人一起努力,让我们意识到了团队合作的重要性,这也势必会在我们以后的实际工作中带来很大的帮助。感谢老师的辛勤教导,让我们学到了很多有用的知识,希望在以后还能进行市场营销综合模拟,到时候我们一定会做得更好。 沈阳理工大学课程实践 参考文献 [1]《营销模拟实训教程》,李善山编,上海交通大学出版社,2001年出版 [2]《市场营销学通论》,郭国庆主编,中国人民出版社,2007 年1月第3版 [3]《市场营销学实训》,王妙,高等教育出版社,2003年8月版 [4]《市场营销教程》,中国高等教育出版社,2004年出版 9第二篇:数据结构课设
第三篇:数据结构课设报告
第四篇:C语言课设 贪食蛇 含完整代码 课设报告
第五篇:因纳特市场预测沙盘模拟课设(可直接下载)