版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告
实验名称:(一)魔方阵(二)本科生导师制问题
实验类型:设计性实验
班级:20230631
学号:
姓名:万星含
(一)魔方阵
1.问题描述
魔方阵是一个古老的智力问题,它规定在一个mXm的矩阵中填入1〜m?的数
字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所
Zj\O
15812417
16147523
22201364
321191210
92251811
图1五阶魔方阵示例
②基本规定
・输入魔方阵的行数m,规定m为奇数,程序对所输入的m作简朴的判断,
如m有错,能给出适当的提醒信息。
・实现魔方阵。
・输出魔方阵。
③实现提醒
本实验使用的数据结构是数组。
解魔方阵问题的方法很多,这里采用如下规则生成魔方阵。
•由1开始填数,将1放在第0行的中间位置。
1将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况:
令左上角超过上方边界,则在最下边相相应的位置填入下一个数字;
令左上角超过左边边界,则在最右边相应的位置填入下一个数字;
令假如按上述方法找到的位置已填入数据,则在同一列下一行填入下一
个数字。
以3X3魔方阵为例,说明其填数过程,如图2所示。
(g)(h)(i)
图2三阶魔方阵的生成过程
由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(xT,
yT),假如xTNO,不用调整,否则将其调整为xT+m;同理,假如yT20,不用
调整,否则将其调整为y—1+m。所以,位置(x,y)的左上角的位置可以用求模的
方法获得,即:
x=(x-l+m)%m
y=(y-l+m)%m
假如所求的位置已有数据了,将该数据填入同一列下一行的位置。这里需要
注意的是。此时的x和y已经变成之前的上一行上一列了,假如想变回之前位置
的下一行同一列,x需要跨越两行,y需要跨越一列,即:
x=(x+2)%m
y=(y+l)%m
④思考
•可以考虑使用其他方法生成魔方阵。任何算法都有不同的实现方法,通过
采用不同实现方法来重新实现算法,这要比单纯学习算法的效果好得
多。
2.实验规定
(1)认真阅读和掌握和本实验相关的教材内容、算法和设计程序。
(3)上机运营程序。
(4)保存和打印出程序的运营结果,并结合程序进行分析。
3.实验目的
(1)设计数据结构;
(2)设计算法完毕任意n阶魔方阵的填数;
(3)分析算法的时间复杂度。
4.程序源代码
#inc1ude<stdio.h>
#include<stdlib.h>
#defineMAX_NUM500/*这里可以修改最大阶*Aintmain(>{
introws=0,center=0,iArrayCMAX_NUM][MAX_NUM]/intRowSet=0,
LineSet=0,newRowSet=0,newLineSet=0;Ainti=0,j=0;
intokNum=05A//settheiternsofarray"iArray"tobeOfor(i=
0;i<MAX_NUM;i+4-)Afor(j=0;j<MAX_NUM;j++)
iArray[i][j]=0;
//gettherowsnumber
whiIe(1)
{Aprintf("输入行数:\n")泠seanf("%d",&rows);
if(rows<=MAX_NUM>{
rows
break;町else
Printf("行数必须在0和%d之间,请重新”,MAX_NUM);A)
)A
//setnumber1crows2;
iArray[0][center]=1:AA//nitiaIizetheokNum,RowSetandLine
SetAokNum
RowSet0;
LineSetcenter
teachemn"iArray
While(okNum(rows+1)*(r0ws+)A
ifRowSt0&&LineSetrows)
RowS+=
}
wRowSetRowSet0)?rowsRowSet1
newLineSet(LineSetrOWS)?0:LineSet+1
Af(iAray[newROwSet][wLineSet]!=0)
//thsaireadyanumbhere
RowSet(RowSerows)?0RowSe1
//RowSet1)
se(
RowSenewRowSet;ALineSetnewLineSet
))
iArray[RowSet][LineSet]++okNum;A}
printthe"iArray
for(i=0;rows;i++)A{Afor(j=0;<=rows;j++)
printf("%5d”Array[i][j])
printf);
}
system("pause");Areturn0
}
6.调试结果
1791352719
2416863426
2523157533
32302214124
39129211311
10236282018
(-)本科生导师制问题
1.问题描述
在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被
分给几个老师,每个老师带n个学生,假如该老师还带研究生,那么研究生也可
直接带本科生。本科生导师制问题中的数据元素具有如下形式:
•导师带研究生A(老师,((研究生1,(本科生1,本科生m1)),(研
究生2,(本科生1,…,本科生m2))…))
•导师不带研究生A(老师,(本科生1,…,本科生m))
导师的自然情况只涉及姓名、职称;研究生的自然情况只涉及姓名、班级;
本科生的自然情况只涉及姓名、班级。
②基本规定
规定完毕以下功能:
1建立:建立导师广义表。
•插入:将某位本科生或研究生插入到广义表的相应位置。
・删除:将某本科生或研究生从广义表中删除。
•查询:查询导师、本科生(研究生)的情况。
・记录:某导师带了多少个研究生和本科生。
I输出:将某导师所带学生情况输出。
•退出:程序结束。
2.设计思绪
本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。
定义教师、学生结点结构体如下:
typedefstructGLNode
(
charname[100];/*教师或学生的姓名*/
charprof[100];/*教师结点表达职称,学生结点表达班级
*/
inttype;/*结点类型:0—教师,1-研究生,2-本
科生*/
struct{structGLNode*hp,*tp;}ptr;
/*hp指向同级的下一结点,tp指向下级的首结
占*/
八、、I
{GList;
人员信息的表达形式为:高老师-专家-0、李刚一二班-1、李明-二班-2.
人员信息中的姓名、职称、班级、人员类型用隔开,如高老师-专家一
0,“高老师”表达姓名,“教师”表达职称,“0”表达人员的类型是教师;李刚-
二班一1,“李刚”表达姓名,“二班”表达班级,“1”表达人员的类型是研究
生;李明-二班一2,“李明”表达姓名,“二班”表达班级,“2”表达人员的类型
是本科生。
广义表((高老师-专家-0,(李明-一班-2,王平-二班一2)),(李老师一
副专家一0,(白梅-二班-1,(李刚-一班-2)))可以用图3表达。
高老师教授o『「T_李老师副教授o
李明一班2*
图3导师制用广义表实现示例
3.功能规定
规定完毕以下功能:
⑴插入:将某位本科生或研究生插入到广义表的相应位置;
⑵删除:将某本科生或研究生从广义表中删除;
⑶查询:查询导师、本科生(研究生)的情况;
⑷记录:某导师带了多少个研究生和本科生;
⑸输出:将某导师所带学生情况输出。
4.源代码
#inelude<stdio.h>
#inelude<string.h>A#inc1ude<malloc.h>AtypedefcharDataType;A#includ
eGList.h
voidmain()A{charstrl[]n(((a,b,c),(d)),e)
charstr2[]="(((a,b,c),(d)),e)";Acharhstr[100]?GLNode*h,*p;
intdepth,numbeelength/h=CreatGList(strl);
printf("广义表strl=%s",str2);
DecomposeStr(str2,hstr);
printf("\n表头二%s",hstr)泠printf("表尾二%s",str2);AAdepth=GLi
n
stDepth(h);Aprintf(\n深度depth=%d",depth);Alength=GListLength
(h);
printf("\n深度Iength=%dIength);
number=GListAtomNum(h);
printf("\n原子元素个数number=%d",number);
p=GListSearch(h;d>if(p!=NULL)Aprintf("\n数据元素%(:在广义表中
n
,p->val.atom);Aelse
printf("\n广义表中不存在要查找的数据元素\n”);ADestroyGList(h)泠
头文献:
typedefstructGListNode
{Ainttag;Aunions{DataTypeatom;//原子元素域A
structsubGLA{structGListNode*head;〃头指针AstructGListN
ode*tai1;//尾指针
}subList;〃子表域
}va1泠}GLNode;
voidDecomposeStr(charstr[]zcharhstr[])
{Ajnti,jftag,n=str1en(str);
charch;chstr[O];tag0泠for(i0;i<=n-1;i++)
if(str[i]tag==1)break;〃搜索最外层的第一个逗号
chs[i];
f(ch'(')tag++;Aif(ch'),)tag—;A)
<=n-1&&str[i]==7)〃广义表表尾部分非空时A
for(j=0;i-1;j++)hstr[j]str[j+1];〃取表头字符串
hstr[j]0//添加结束符
fstr[i])i++;
str[O]'(';//添'('Afor(j1;i<=n-2;i++,j++)
str[j]sr[i1;取表尾字符串
tr[j]=')';〃添'str[H-+j],\O';//添加结束符A)
else〃广义表表尾部分空时4str++;〃路过最左边的'('astrnc
py(hstr;stn-2);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年太原市晋源区网格员招聘笔试参考试题及答案详解
- 2026年合肥市长丰县公开招聘中小学新任教师专业测试考试参考题库及答案详解
- 2026年福建福州市闽都文化艺术中心面向社会招聘编外人员12人笔试模拟试题及答案详解
- 2026年新乡牧野区城镇公益性岗位人员招聘60人笔试参考题库及答案详解
- 2026四川省郫筒酱园有限责任公司招聘10人笔试参考题库及答案详解
- 2026贵州黔东南州人民医院聘请行风监督员笔试备考试题及答案详解
- 2026年潍坊高新区公开招聘事业编制教师(第二批次)(43名)笔试备考试题及答案详解
- 广汉市生产力促进中心2026年公开考核招聘工作人员考试备考题库及答案详解
- 2026广西北海市图书馆招聘编外聘用人员1人笔试备考试题及答案详解
- 陕西西安市烽火通信2027届校园招聘笔试参考题库及答案详解
- 企业劳动合同2026版标准模板下载
- 2025青岛工程职业学院教师招聘考试题目及答案
- 2026年国家开放大学生产与运作管理期末复习资料模拟试题含答案详解(能力提升)
- T∕CRES 0045-2026 生物质可磨性指数测定方法 哈德格罗夫法
- 2026年海南数金备考题库技术有限公司招聘备考题库参考答案详解
- 运输管理课件教学
- 建筑班组长管理培训
- 2025年城管协管员笔试题目及答案
- 锂电池安全培训考试题及答案解析
- 燃料电池知识培训课件
- 2025-2030燃煤机组深度调峰对脱硫系统影响及应对策略报告
评论
0/150
提交评论