您现在的位置是: 首页 > 景区门票 景区门票

旅游路线规划数据结构程序设计报告_旅游路线规划设计方案

2024-10-26 11:32:20 77人已围观

简介1.数据结构与程序设计的内容简介2.数据结构与算法作业:用C语言编程随机生成一个迷宫,然后找出从入口到出口的路线图。急!3.C++数据结构问题 设计程序完成如下功能:对给定的图结构和起点,产生其所有的深度优先搜索遍历序列,并给算术表达式求值演示一、概述数据结构课程设计,要求学生在数据结构的逻辑特性和

1.数据结构与程序设计的内容简介

2.数据结构与算法作业:用C语言编程随机生成一个迷宫,然后找出从入口到出口的路线图。急!

3.C++数据结构问题 设计程序完成如下功能:对给定的图结构和起点,产生其所有的深度优先搜索遍历序列,并给

算术表达式求值演示

一、概述

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。

二、 系统分析

1. 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

2. 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。

3. 演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。 4. 程序执行时的命令:

本程序为了使用具体,用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错误) 5. 测试数据。

2

算术表达式求值演示

一、概述

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。

二、 系统分析

1. 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

2. 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。

3. 演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。 4. 程序执行时的命令:

本程序为了使用具体,用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错误) 5. 测试数据。

操作集合:

(1)void InitStack1(SqStack1 &S1);//声明栈建立函数 (2)void InitStack2(SqStack2 &S2);//声明栈建立函数

(3)void evaluate(SqStack1 &S1,SqStack2 &S2);//确定如何入栈函数 (4)void Push1(SqStack1 &S1,char e);//声明入栈函数 (5)void Push2(SqStack2 &S2,float e);//声明入压栈函数 (6)char GetTop1(SqStack1 &S1);//声明取栈顶元素函数 (7)float GetTop2(SqStack2 &S2);//声明取栈顶元素函数 (8)char Pop1(SqStack1 &S1);//声明出栈函数 (9)float Pop2(SqStack2 &S2);//声明出栈函数 (10)char Compare(char m,char n);//声明比较函数

(11)float Operate(float a,char rheta,float b);//声明运算函数 (12)void DispStack1(SqStack1 &S1);//从栈底到栈顶依次输出各元素 (13)void DispStack2(SqStack2 &S2);//从栈底到栈顶依次输出各元素 }ADT SqStack

结构分析:

栈中的数据节点是通过数组来存储的。因为在C语言中数组是用下标从零开始的,因此我

们在调用他们的数据是要特别注意。指针变量的值要么为空(NULL),不指向任何结点;要么其值为非空,即它的值是一个结点的存储地址。注意,当P为空值时,则它不指向任何结点,此时不能通过P来访问结点,否则会引起程序错误。如果输入的数字不符合题目要求,则会产生错误结果。

算法的时空分析:

时间和空间性能分析:时间上,对于含n个字符的表达式,无论是对其进行合法性检测还是对其进行入栈出栈操作n次,因此其时间复杂度为O(n)。空间上,由于是用数组来存储输入的表达式,用栈来存储运算中的数据和运算符,而栈的本质也用到的数组,数组在定义时必须确定其大小。在不知表达式长度的情况下确定数组的长度确非易事,此时极易造成空间的浪费,因此空间性能不是很好。

数据结构与程序设计的内容简介

楼主跟我的C语言程序设计课程要求设计的程序很像,有一点点不同,不过我的程序应该能满足你的要求,代码如下:

#include <stdio.h>

#include <conio.h>

#include <string.h>

#define N 10

struct student{

char name[20];

int cla;

int point1;

int point2;

int point3;

int sum;

int num;

};

void printf_student(struct student stu[]);

void in_student(struct student stu[]);

void look_student(struct student stu[]);

void main(){

student stu[N];

int choice1;

while(choice1!=5){

printf("请选择您要操作的项目:\n");

printf("1.读取数据\n2.录入数据\n3.分析数据\n4.保存数据\n5.退出\n");

scanf("%d",&choice1);

switch(choice1){

case 1:

printf_student(stu);

break;

case 2:

in_student(stu);

break;

case 3:

look_student(stu);

break;

}}

}

void printf_student(struct student stu[]){

FILE *fout;

int i=0;

int j=0;

fout=fopen("stu1.txt","r");

if(fout==NULL){printf("找不到文件");}

else{

while(!feof(fout)){

fscanf(fout,"%s %d %d %d %d",stu[i].name,&stu[i].cla,&stu[i].point1,&stu[i].point2,&stu[i].point3);

i++;

}

printf("已经读取.");

printf("\n姓名\t\t班级\t\t成绩1\t\t成绩2\t\t成绩3\n");

for(j=0;j<i;j++){

printf("%s\t\t",stu[j].name);

printf("%d\t\t",stu[j].cla);

printf("%d\t\t",stu[j].point1);

printf("%d\t\t",stu[j].point2);

printf("%d\t\t",stu[j].point3);}

}

fclose(fout);

}

void in_student(struct student stu[]){

FILE *fp;

student flag;

char ch[50]={0};

fp=fopen("stu1.txt","a+");

int choice=1;

if(fp==0){printf("无法打开文件\n");}

else{

while(choice){

printf("请依次输入姓名,班级,成绩1,成绩2,成绩3\n");

scanf("%s %d %d %d %d",flag.name,&flag.cla,&flag.point1,&flag.point2,&flag.point3);

sprintf(ch,"%s\t%d\t%d\t%d\t%d",flag.name,flag.cla,flag.point1,flag.point2,flag.point3);

/*fwrite(flag.name,20,1,fp);

fwrite("\t",2,sizeof("\t"),fp);

fwrite(&flag.cla,sizeof(flag.cla),1,fp);

fwrite("\t",sizeof("\t"),1,fp);

fwrite(&flag.point1,sizeof(flag.point1),1,fp);

fwrite("\t",2,sizeof("\t"),fp);

fwrite(&flag.point2,sizeof(flag.point2),1,fp);

fwrite("\t",2,sizeof("\t"),fp);

fwrite(&flag.point3,sizeof(flag.point3),1,fp);*/

fwrite(ch,strlen(ch),1,fp);

printf("%s",ch);

printf("若想继续录入,请输入1,若退出,请输入0\n");

scanf("%d",&choice);

}}

fclose(fp);

}

void look_student(struct student stu[]){

FILE *fp;

int i=0;

int sum=0;

student flag;

fp=fopen("stu1.txt","r");

if(fp==0){printf("无法打开文件\n");}

else{

while(!feof(fp)){

fscanf(fp,"%s %d %d %d %d",stu[i].name,&stu[i].cla,&stu[i].point1,&stu[i].point2,&stu[i].point3);

i++;

}}

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

sum=stu[j].point1+stu[j].point2+stu[j].point3;

stu[j].sum=sum;

sum=0;

}

int t=0;

for(t=1;t<i;t++){

for(j=0;j<i-t;j++){

if(stu[j].sum<stu[j+1].sum){

strcpy(flag.name,stu[j+1].name);

flag.cla=stu[j+1].cla;

flag.point1=stu[j+1].point1;

flag.point2=stu[j+1].point2;

flag.point3=stu[j+1].point3;

flag.sum=stu[j+1].sum;

strcpy(stu[j+1].name,stu[j].name);

stu[j+1].cla=stu[j].cla;

stu[j+1].point1=stu[j].point1;

stu[j+1].point2=stu[j].point2;

stu[j+1].point3=stu[j].point3;

stu[j+1].sum=stu[j].sum;

strcpy(stu[j].name,flag.name);

stu[j].cla=flag.cla;

stu[j].point1=flag.point1;

stu[j].point2=flag.point2;

stu[j].point3=flag.point3;

stu[j].sum=flag.sum;

}

}

}

for(j=0;j<i;j++){

stu[j].num=j+1;

}

fclose(fp);

FILE *creat;

char ch[30]={0};

creat=fopen("stu2.txt","w");

for(j=0;j<i;j++){

sprintf(ch,"%s\t%d\t%d\t%d\t%d\t%d\t%d",stu[j].name,stu[j].cla,stu[j].point1,stu[j].point2,stu[j].point3,stu[j].sum,stu[j].num);

fwrite(ch,30,1,creat);

}

printf("姓名\t班级\t成绩1\t成绩2\t成绩3\t总分\t排名\n");

for(j=0;j<i;j++){

printf("%s\t",stu[j].name);

printf("%d\t",stu[j].cla);

printf("%d\t",stu[j].point1);

printf("%d\t",stu[j].point2);

printf("%d\t",stu[j].point3);

printf("%d\t",stu[j].sum);

printf("%d\n",stu[j].num);

}

fclose(creat);

}

注意一下,我创建的文件时stu1.txt

数据结构与算法作业:用C语言编程随机生成一个迷宫,然后找出从入口到出口的路线图。急!

《数据结构与程序设计》比较系统地介绍了线性表、栈和队列、串、数组和广义表、树、图、查找、排序等内容,共分为9章,最后有一套实验题目。每章都配置了本章要点、本章小结和习题,便于读者理解、消化书中的内容。《数据结构与程序设计》的最后,有一套实验题目,共有六个实验,每个实验又包含多道实验题目,每道实验题都从问题描述、基本要求、测试数据、实验提示、选作内容等几个环节给予解析,通过实验进一步提高读者运用数据结构知识解决实际问题的能力。全书融入了作者长期的教学经验,在编排上注意体现教学思路的完整性,力求做到深入浅出、通俗易懂,同时也考虑了自学者的学习方便,适于教学和自学。

《数据结构与程序设计》的读者对象是学习数据结构课程的本、专科及高职类学生,也可作为信息类各专业考试、高校教师以及其他专业技术人员的参考用书。

C++数据结构问题 设计程序完成如下功能:对给定的图结构和起点,产生其所有的深度优先搜索遍历序列,并给

几点说明:

1.本程序是动态的,运行后自动寻找迷宫出路

2.本程序对C语言刚学完的有很大的意义.

3.四周是墙,坐标(1,1)是入口,右下脚是出口

声明:本程序用VC调试是无法通过的需要修改

本程序调试工具是TC.....................

#include "graphics.h"

#include "dos.h"

#include "stdlib.h"

#include "process.h"

#define MAX_COL 14/*定义迷宫大小*/

#define MAX_ROW 14

typedef struct

{ int vert;

int horiz;

}offsets;

mapture(int i,int j,int k);/*标记迷宫,(i,j)标记为k模式*/

initmaze();/*初始化迷宫数组*/

findmaze(int i,int j);/*找到了(i,j)可走,标记*/

mapmaze();/*画出原始迷宫*/

int findpath(int row,int col);/*递归函数,找出迷宫路径*/

mapbar();/*画出方格*/

initgrap();/*初始化VGA*/

print();/*迷宫走完后,输出是否成功 */

int startx=50,starty=50;/*画图的屏幕坐标*/

int maze[MAX_ROW][MAX_COL];

offsets move[8]={{0,1},{1,1},{-1,1},{1,0},{-1,0},{0,-1},{1,-1},{-1,-1}}; /*8个方向寻找*/

initmaze()/*初始化迷宫数组 */

{ int i,j;

for(i=0;i<MAX_ROW;i++)/*迷宫四周设置为1 代表墙*/

{ maze[i][0]=1;

maze[i][MAX_COL-1]=1;

}

for(i=0;i<MAX_COL;i++)

{ maze[0][i]=1;

maze[MAX_ROW-1][i]=1;

}

randomize();

for(i=1;i<MAX_ROW-1;i++)/*迷宫图形随机产生 1表示不通 0表示可行*/

for(j=1;j<MAX_COL-1;j++)

{

maze[i][j]=random(2);

}

}

findmaze(int i,int j)/*找到 (i,j)可走*/

{

mapture(j,i,2);/*在图形上标记*/

sleep(1);

}

returnmaze(int i,int j)/*找到(i,j)可走 ,但下一步无路走则标记*/

{

mapture(j,i,3);/*在图形上标记*/

sleep(1);

}

print(int i)/*迷宫走完后,输出是否成功*/

{ settextstyle(1,0,5);

if(i==1)

outtextxy(340,400,"Ture path!");

else if(i==2)

outtextxy(340,400,"No path!");

}

int findpath(int row,int col)/*用递归法找迷宫*/

{ int direct,next_row,next_col;

direct=0;

maze[1][1]=2;

mapture(1,1,2);

sleep(1);

while(direct<8)/*8个方向寻找*/

{ next_row=row+move[direct].vert;/*设置下一步坐标*/

next_col=col+move[direct].horiz;

if(maze[next_row][next_col]==0) /*可走,便标记*/

{ maze[next_row][next_col]=2;

findmaze(next_row,next_col) ;

if(next_row==(MAX_ROW-2)&&next_col==(MAX_COL-2))/*找到出口退出程序*/

{ print(1);

getch();

exit(0);

}

else

findpath(next_row,next_col);/*没有到出口继续递归*/

maze[next_row][next_col]=3;

returnmaze(next_row,next_col);

}

direct++;

}

return(row);

}

TC调试良好

你可以参考一下:

/* 图的深度优先遍历 */

#include <stdlib.h>

#include <stdio.h>

struct node /* 图顶点结构定义 */

{

int vertex; /* 顶点数据信息 */

struct node *nextnode; /* 指下一顶点的指标 */

};

typedef struct node *graph; /* 图形的结构新型态 */

struct node head[9]; /* 图形顶点数组 */

int visited[9]; /* 遍历标记数组 */

/*根据已有的信息建立邻接表*/

void creategraph(int node[20][2],int num)/*num指的是图的边数*/

{

graph newnode; /*指向新节点的指针定义*/

graph ptr;

int from; /* 边的起点 */

int to; /* 边的终点 */

int i;

for ( i = 0; i < num; i++ ) /* 读取边线信息,插入邻接表*/

{

from = node[i][0]; /* 边线的起点 */

to = node[i][1]; /* 边线的终点 */

/* 建立新顶点 */

newnode = ( graph ) malloc(sizeof(struct node));

newnode->vertex = to; /* 建立顶点内容 */

newnode->nextnode = NULL; /* 设定指标初值 */

ptr = &(head[from]); /* 顶点位置 */

while ( ptr->nextnode != NULL ) /* 遍历至链表尾 */

ptr = ptr->nextnode; /* 下一个顶点 */

ptr->nextnode = newnode; /* 插入节点 */

}

}

/* 图的深度优先搜寻法 */

void dfs(int current)

{

graph ptr;

visited[current] = 1; /* 记录已遍历过 */

printf("vertex[%d]\n",current); /* 输出遍历顶点值 */

ptr = head[current].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

if ( visited[ptr->vertex] == 0 ) /* 如过没遍历过 */

dfs(ptr->vertex); /* 递回遍历呼叫 */

ptr = ptr->nextnode; /* 下一个顶点 */

}

}

int main()

{

graph ptr; /* 边线数组 */

int node[20][2] = { {1, 2}, {2, 1},

{1, 3}, {3, 1},

{1, 4}, {4, 1},

{2, 5}, {5, 2},

{2, 6}, {6, 2},

{3, 7}, {7, 3},

{4, 7}, {4, 4},

{5, 8}, {8, 5},

{6, 7}, {7, 6},

{7, 8}, {8, 7} };

int i;

for ( i = 1; i <= 8; i++ ) /* 顶点数组初始化 */

{

head[i].vertex = i; /* 设定顶点值 */

head[i].nextnode = NULL; /* 指针为空 */

visited[i] = 0; /* 设定遍历初始标志 */

}

creategraph(node,20); /* 建立邻接表 */

printf("Content of the gragh's ADlist is:\n");

for ( i = 1; i <= 8; i++ )

{

printf("vertex%d ->",head[i].vertex); /* 顶点值 */

ptr = head[i].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

printf(" %d ",ptr->vertex); /* 印出顶点内容 */

ptr = ptr->nextnode; /* 下一个顶点 */

}

printf("\n"); /* 换行 */

}

printf("\nThe end of the dfs are:\n");

dfs(1); /* 打印输出遍历过程 */

printf("\n"); /* 换行 */

system("pause");

return 0;

}