计算机科学技术专业技能模拟考核.docx
- 文档编号:10479850
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:25
- 大小:29.25KB
计算机科学技术专业技能模拟考核.docx
《计算机科学技术专业技能模拟考核.docx》由会员分享,可在线阅读,更多相关《计算机科学技术专业技能模拟考核.docx(25页珍藏版)》请在冰豆网上搜索。
计算机科学技术专业技能模拟考核
1.最短距离(本题100分)
(dist.cpp/c)
【问题描述】
开车从起始点A到目的地B的路线有多条。
给你一张描述待选路线的表(n*n的矩阵A),让你找出行车距离最短的路线。
表中表示了任意两个路口的连通情况,以及距离。
矩阵元素a(i,j)=0表示路口i,j不连通,a(i,j)!
=0表示路口i,j的行车距离。
其中起始点A在路口1,目的地B在路口n。
完成源程序DIST.CPP中Dijkstra函数的编写。
#include"stdio.h"
#definemaxint10000
intn,used[31],map[31][31];
voidini()
{
inti,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==0)map[i][j]=maxint;
}
}
voidDijkstra(){
intdist[100];
inti,j;
//初始
for(i=1;i<=n;i++)
{
dist[i]=map[1][i];
used[i]=0;
}
used[1]=1;
for(i=1;i { //选择最短 intmind=maxint,k=-1; for(j=1;j<=n;j++) { if(! used[j]&&dist[j] { mind=dist[j]; k=j; } } if(k<0) break; used[k]=1; //路径扩展 for(j=1;j<=n;j++) { if(! used[j]&&map[k][j] { dist[j]=dist[k]+map[k][j]; } } } printf("%d\n",dist[n]); } intmain() { freopen("dist.in","r",stdin); freopen("dist.out","w",stdout); ini(); Dijkstra(); return0; } 【输入】 输入文件dist.in的第一行为一个自然数n(1 接着n行,每行n个整数,描述待选路线的表(元素的值小于1000); 【输出】 输出文件dist.out包括一行,为一个整数,表示起始点A到目的地B的最短行车的距离。 【输入输出样例1】 dist.in dist.out 4 0234 2011 3100 4100 3 【输入输出样例2】 dist.in dist.out 6 013490 102130 320048 410037 8 934304 008740 2.路径回溯(本题100分) (DictS.cpp) 【问题描述】 已知从起始点A到达各目站点(B、C、D...)的各最短路径上所有站点的前驱站点,以及至前驱站点的距离。 以一个二维数组pre描述已知信息,第1列是前驱站点的序号(以0、1、2...分别表示站点A、B、C...),第2列是至前驱站点的距离。 试推算和输出从起始点出发到达各其余站点的最短路径和距离。 完成源程序DictS.CPP中Pathway函数的编写。 #include"stdio.h" intn,pre[26][2]; charstation[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; voidini() { inti; scanf("%d",&n); for(i=0;i scanf("%d%d",&pre[i][0],&pre[i][1]); } voidPathway() { //******************************************************** inti,j,sum=0; intst[100],top; for(i=1;i {//从'B'开始 for(j=i,top=sum=0;;) {//从尾到头('A')进栈 st[top++]=pre[j][0]; sum+=pre[j][1]; j=pre[j][0]; if(j==0) {//到达'A' break; } } for(j=top-1;j>=0;j--) { printf("%c-",station[st[j]]); } printf("%c",station[i]); printf("%d\n",sum); } //======================================================== } intmain() { freopen("DictS.in","r",stdin); freopen("DictS.out","w",stdout); ini(); Pathway(); fclose(stdin); fclose(stdout); return0; } 【输入】 输入文件DictS.in的第1行为1个自然数n(1 后续n行,每行2个整数,分别描述站点A、B、C...的前驱站点和至前驱站点的距离。 【输出】 输出文件DictS.out包含n-1行,每行2个部分,前部为最短路径,后部为距离。 格式见输出样例。 【输入输出样例1】 DictS.in DictS.out 9 00 040 020 410 030 225 310 240 620 A-B40 A-C20 A-E-D40 A-E30 A-C-F45 A-E-D-G50 A-C-H60 A-E-D-G-I70 【输入输出样例2】 DictS.in DictS.out 5 00 275 0135 033 0123 A-C-B210 A-C135 A-D33 A-E123 3.有限自动机(本题100分) (dfa.cpp/c) 【问题描述】 设有如下确定的状态转换图,0为起始状态,3,4为终结状态。 编写程序,判断用户输入的符号串,是否被该有限自动机接受。 #include"stdio.h" #definemax1000 intdfachk(charstr[]) {//******************************************************** inti,j,f[10][5]; ints=0; for(i=0;i<10;i++) { for(j=0;j<5;j++) { f[i][j]=-1; } } //根据表转换: f[i][j]=k,代表从状态i,输入字符j,(j: 0代表'a',1: 代表'b'),转移到状态k f[0][0]=0; f[0][1]=1; f[1][0]=2; f[2][0]=1; f[1][1]=3; f[3][1]=3; f[3][0]=4; f[4][0]=3; //一遍循环字符串,头到尾 for(i=0;str[i];i++) { if(str[i]! ='a'&&str[i]! ='b') returni+1;//非'a'非'b' s=f[s][str[i]-'a']; if(s<0) returni+1;//无路可走 } if(s! =3&&s! =4) returni+1;//非法结束 return0; //======================================================== } voidmain() { charins[max]={0}; freopen("dfa.in","r",stdin); freopen("dfa.out","w",stdout); gets(ins); printf("%d",dfachk(ins)); } 【输入】 输入文件dfa.in为一行字符串(字符个数小于1000); 【输出】 输出文件dfa.out包括一行,为一个整数,表示输入的符号串是否被该有限自动机接受,若接受,则输出0,否则输出首次出错字符所在的位置(注: 输入串首字符的位置为1)。 学生只要编写函数intdfachk(charstr[]),该函数的参数str为输入串,若输入串str被该有限自动机接受,则函数返回值为0。 若输入串str在第n个字符处首次出错,则函数返回值为n。 【输入输出样例1】 dfa.in dfa.out aa 3 【输入输出样例2】 dfa.in dfa.out abbaaa 0 【输入输出样例3】 dfa.in dfa.out ababaaab 4 【输入输出样例4】 dfa.in dfa.out abaacaab 5 【数据规模】 输入的字符串长度L<1000 4.数据库查询(本题100分) (DB.c) 【问题描述】 Student数据库里面有个Grade表,该表里面存储了每个学生的学号,姓名,maths成绩,english成绩和computer成绩。 现要查询Grade表,显示三门课都及格的学生学号、姓名、maths、english、computer字段,并按照学号升序排列。 完成源程序DB.C中select2函数的编写。 #include #defineSIZE100 intn; structGrade_table { intno_stu;/*thenumberofstudent*/ charname[20];/*thenameofstudent*/ intmaths; intenglish; intcomputer; }; structGrade_tablegrade[SIZE]; voidini() { inti,j=0; scanf("%d",&n); for(i=0;i { scanf("%d%s%d%d%d",&(grade[i].no_stu),grade[i].name,&(grade[i].maths),&(grade[i].english),&(grade[i].computer)); } } voidselect2() { //******************************************************** intrank[SIZE],tot=0; inti,j,k; for(i=0;i { if(grade[i].maths>=60&&grade[i].english>=60&&grade[i].computer>=60) { //存下标 rank[tot++]=i; } } //选择排序,只对下标排序,比较简单 for(i=0;i { k=i; for(j=i+1;j { if(grade[rank[j]].no_stu {//记录最小 k=j; } } if(k! =i) {//最小学号的下标k与i交换 Grade_tabletmp=grade[rank[k]]; grade[rank[k]]=grade[rank[i]]; grade[rank[i]]=tmp; } } for(i=0;i { printf("%d,%s,%d,%d,%d\n",grade[rank[i]].no_stu,grade[rank[i]].name,grade[rank[i]].maths, grade[rank[i]].english,grade[rank[i]].computer); } //======================================================== } intmain() { freopen("DB.in","r",stdin); freopen("DB.out","w",stdout); ini(); select2(); return0; } 【输入】 输入文件DB.in的第一行为一个自然数n(1 接着n行,每行代表一个学生的记录(学号姓名maths成绩english成绩computer成绩),其中0<=成绩<=100,每个字段之间用空格间隔开。 【输出】 输出文件DB.out包括x行,每行代表一个学生的记录,显示字段为: 学号、姓名、maths成绩、english成绩、computer成绩。 每个字段之间用逗号间隔开 【输入输出样例1】 DB.in DB.out 4 101Zhangsan564789 102Kate896078 102,Kate,89,60,78 107,Wangwu,68,78,67 104Jay528990 107Wangwu687867 【输入输出样例2】 DB.in DB.out 10 145Anm448676 123Bob986686 246Bay969593 286Bekt568623 281Eho868475 301Dawy656364 324Deuwu786556 320Dyosn231465 411Eio763181 450Erobt132347 123,Bob,98,66,86 246,Bay,96,95,93 281,Eho,86,84,75 301,Dawy,65,63,64 5.图像平滑线性滤波器(本题100分) (image.cpp) 【问题描述】 利用加权平均掩模实现数字图像的平滑(图像边缘不予处理);加权平均掩模如下图。 完成源程序 image.cpp中Smooth_Filter函数的编写。 #include"stdio.h" #defineMAX_INT300 intn,map[MAX_INT][MAX_INT],out[MAX_INT][MAX_INT]; voidini() {inti,j; for(i=0;i for(j=0;j { map[i][j]=0; out[i][j]=0; } scanf("%d",&n); for(i=0;i for(j=0;j scanf("%d",&map[i][j]); } voidSmooth_Filter(){ //******************************************************** inti,j,p,q,sum; //加权平均掩模 intsrc[3][3]={{1,2,1},{2,4,2},{1,2,1}}; //加权平均例如第1行第1列=(1*0+2*2+1*3+2*2+4*0+2*1+1*3+2*1+1*0)/16 for(i=0;i { for(j=0;j { sum=0; for(p=i;p { for(q=j;q { sum+=map[p][q]*src[p-i][q-j]; } } sum/=16; //out[i][j]=sum; printf("%d",sum);//我直接输出sum,也可保存在out[i][j]中最后输出 j==n-3? printf("\n"): printf(""); } } //======================================================== } intmain() {freopen("image.in","r",stdin); freopen("image.out","w",stdout); ini(); Smooth_Filter(); return0; } 【输入】 输入文件 image.in的第一行为一个自然数n(1= 接着n行,每行n个整数,描述n×n像素图像(元素的值介于0~255之间); 【输出】 输出文件image.out为n-2行,每行n-2个整数,表示滤波后n-2×n-2像素图像。 【输入输出样例1】 image.in image.out 4 0234 2011 3100 4100 11 10 【输入输出样例2】 image.in image.out 6 111111 111111 111111 111111 111111 111111 1111 1111 1111 1111 6.模拟进程调度算法(本题100分) (os.cpp) 【问题描述】 进程调度算法FCFS+SJF模拟。 编写FCFS+SJF算法,输入一组若干个进程的调度信息,输出根据先来先服务和短进程优先算法的调度结果。 (提示: 短进程优先算法仅在进程的到达时间一样时,才启用)。 完成源程序 os.cpp中fcfs_sjf函数的编写。 提醒: 每个输出数据之前输出1个‘\t’。 #include #include structJob_type { intno;//作业号 inttb;//作业开始时间(分) inttr;//运行时间(分) }x; Job_typejob[36]; intn; voidload() {inti,j; scanf("%d",&n); for(i=0;i {scanf("%d",&job[i].no); scanf("%d",&job[i].tb); scanf("%d",&job[i].tr); } printf("输入作业顺序: \n"); for(i=0;i printf("\t%d\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr); } voidfcfs_sjf() { //******************************************************** inti,j,timeNow; structJob_typet; //冒泡排序,二级排序。 关键字: 作业开始时间,作业运行时间。 for(i=0;i { for(j=0;j { if(job[j].tb! =job[j+1].tb)//作业开始时间不相等 { if(job[j].tb>job[j+1].tb) { t=job[j]; job[j]=job[j+1]; job[j+1]=t; } } else { if(job[j].tr>job[j+1].tr) { t=job[j]; job[j]=job[j+1]; job[j+1]=t; } } } } //======================================================== printf("FCFSsjf调度结果: \n"); printf("开始时间作业号到达时间运行时间完成时间等待时间周转时间\n"); //******************************************************** timeNow=0; for(i=0;i { printf("\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", timeNow, job[i].no, job[i].tb, job[i].tr,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机科学 技术 专业技能 模拟 考核