西工大计算机实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机实习报告
一、趣味题
彩色的圆环:
分析图形可知,一共有n个同心圆,外面大圆n等分,然后从每个等分点作所有同心圆的两条切线。如果用极坐标表示,可以很容易求解切点,代码如下所示:
n=10; %同心圆数量
m=40; %等分点数
R=1; %外圆半径
s=0:0.01*pi:2*pi; %控制圆的光滑程度的极坐标角度
t=0:2*pi/m:2*pi; %等分点极坐标角度
x0=R*cos(t);y0=R*sin(t); %等分点直角坐标
color=['b','r','c','g','m','y']; %画图颜色
lc=length(color); %颜色数量长度,超出后从头开始
for i=1:n %开始同心圆循环
r=R/n*i; %当前同心圆半径
a=acos(r/R); %切线与圆心线角度(弧度制)
x1=r*cos(t-a);y1=r*sin(t-a); %任意等分点相对当前同心圆的第一个切点
x2=r*cos(t+a);y2=r*sin(t+a); %任意等分点相对当前同心圆的第二个切点
plot(r*cos(s),r*sin(s),color(mod(i,lc)+1));hold on; %画同心圆for j=1:m %对每一个等分点循环
plot([x0(j),x1(j)],[y0(j),y1(j)],color(mod(i,lc)+1));hold on;
%第一条切线
plot([x0(j),x2(j)],[y0(j),y2(j)],color(mod(i,lc)+1)); hold on; %第二条切线
end
end
axsi equal; %横纵坐标比例一致
实验绘图结果如下图所示:
二、算法题
求无向图的最短路径(Dijkstra算法):
实验原理分析、原理及代码如下所示(此实验代码不仅包含了实验所要求的求带权无向图最短路径,我还拓展了求有向、无向、带权有向图最短路径的内容):
#include
#include
using namespace std;
#define wuqiong 0
class tu
{
public:
int chazhao(int);//查找
void zjdingdian(int x);//增加顶点
tu();
void zengjia();//控制增加弧边和点
void zjhubian();//增加弧边
void bianli();//控制遍历
void shendu(int );//深度
void guangdu(int );//广度
void jindui(int );//进队列
int chudui();//出对了
bool pankong();//判空
//上面所有的函数与邻接矩阵有关
void zxgouzao();//初始化与最小路劲有关的东东void zxshuchu();//求S中的最小路劲private:
int kind; //类图;
int length; // 顶点个数
int *dingdian; //顶点
int *juzhen; //矩阵
int num;//最大顶点数目
int* visted;//访问情况
int *duilie;//模拟队列
int duichang;//队列长度
//上面所有的变量与邻接矩阵有关
int *s;//存放当前顶点
int slength;//当前顶点的长度
int* dist;//存放最小路劲
int* pre;//存放路劲;
int* final;//存放顶点
};
tu::tu()//初始化图
{
cout<<"请输入图的种类1:有向.2:无向.3:带权有向.4:带权无向"<
cout<<"请输入图的顶点数目"< cin>>num; dingdian = new int[num];//为顶点分配内存保存 juzhen = new int[num*num];//产生矩阵 if(kind==1||kind==2)//为无权图初始化矩阵 { for(int i =0;i juzhen[i] = 0; } else//有权图初始化矩阵 { for(int i =0;i juzhen[i] = wuqiong; } length = 0; } //增加顶点 void tu::zjdingdian(int x) { if(chazhao(x)!=-1||length==num) cout<<"图内有此顶点或图内无空间可插入,插入失败"< else { dingdian[length] = x; length++; } } //增加边 void tu::zjhubian() { int i;//弧头 int j;//弧尾 if(kind==1||kind==2)//无权图 { cout<<"请输入弧的头和尾"< cin>>i>>j; if(kind == 1)//有向图 { juzhen[i*num+j]=1;