C语言作业8.docx
- 文档编号:15738797
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:39
- 大小:74.75KB
C语言作业8.docx
《C语言作业8.docx》由会员分享,可在线阅读,更多相关《C语言作业8.docx(39页珍藏版)》请在冰点文库上搜索。
C语言作业8
2.集合排序(选做)
成绩:
5/折扣:
0.8
现有若干个集合的数据,每个数据集合可以自选一个指标参加排序。
这些指标包含如下四种:
∙Min,取集合中元素的最小值
∙Max,取集合中元素的最大值
∙Mean,取集合中元素的平均值,平均值的计算公式为:
(V1+V2+…+Vn)/n
∙Median,取集合中元素的中值,中值的计算公式为:
(Vmin+Vmax)/2
读入数据后,请根据各个集合选择的指标对这些集合进行降序排列,每个集合内的元素请升序排列。
输入:
每行一个集合。
[]内为该集合选取的用于集合间排序的指标。
随后为集合内各个元素,元素个数不定,以空格分隔。
若输入行的第一个字符为“*”,则表示输入数据结束。
输出:
每行输出一个集合。
{}内为计算出该集合的排序指标值,随后为该集合的各个元素的升序排列。
测试输入
期待的输出
时间限制
内存限制
额外进程
测试用例1
以文本方式显示
1.[Max]8 3 15↵
2.[Min]9 10 1 2 7↵
3.[Median]2 4↵
4.[Mean]30 20 10↵
5.*↵
以文本方式显示
1.{20}10 20 30↵
2.{15}3 8 15↵
3.{3}2 4↵
4.{1}1 2 7 9 10↵
1秒
64M
0
测试用例2
以文本方式显示
1.[Max]12 344 9 25 65 76 3 0 23↵
2.[Mean]178 1 349 32 32 567 23 322↵
3.[Mean]31 23 85 435 23432 27 999↵
4.[Max]87686 1199 12332 12344 12 3292↵
5.[Min]9 9128 3 53 766↵
6.[Median]84 43 145 3↵
7.[Median]99999 35 2266↵
8.[Min]4342 3255↵
9.[Median]0↵
10.*↵
以文本方式显示
1.{87686}12 1199 3292 12332 12344 87686↵
2.{50017}35 2266 99999↵
3.{3576}23 27 31 85 435 999 23432↵
4.{3255}3255 4342↵
5.{344}0 3 9 12 23 25 65 76 344↵
6.{188}1 23 32 32 178 322 349 567↵
7.{74}3 43 84 145↵
8.{3}3 9 53 766 9128↵
9.{0}0↵
1秒
64M
0
测试用例3
以文本方式显示
1.[Mean]88888↵
2.*↵
以文本方式显示
1.{88888}88888↵
1秒
64M
0
#include
#include
#include
typedefstructline
{
chartype[8];
inttypeValue;
intdata[100];
intn_data;
}line;
intstringToInt(charstr[])
{
intreturnValue=0;
intn=strlen(str);
for(inti=0;i { returnValue=returnValue+((int)str[i]-48)*pow(10.0,--n); } returnreturnValue; } voidinputToLineData(line*l,charinput[]) { intn,i;//linelength n=strlen(input); for(i=0;i { if(input[i+1]==']')break; l->type[i]=input[i+1]; } l->type[i]='\0'; l->n_data=0; intnumStart=i+2; charstr[100][10]; intm=0,j=0; for(i=numStart;i { if(input[i]=='') { str[j][m]='\0'; j++; m=0; l->n_data++; } else str[j][m++]=input[i]; } str[j][m]='\0'; l->n_data++; l->data[0]=0; for(i=0;i { l->data[i]=stringToInt(str[i]); } } voidsort(intdata[],intn) { inti,j,k; for(i=0;i for(j=0;j { if(data[j]>data[j+1]) { k=data[j]; data[j]=data[j+1]; data[j+1]=k; }}} intgetTypevalue(linel) { inti,j,k; if(strcmp(l.type,"Max")==0) { intMax; Max=l.data[0]; for(i=0;i { if(l.data[i]>Max)Max=l.data[i]; } returnMax;} if(strcmp(l.type,"Min")==0) { intMin; Min=l.data[0]; for(i=0;i { if(l.data[i] } returnMin; } if(strcmp(l.type,"Median")==0) { intMax; Max=l.data[0]; for(i=0;i { if(l.data[i]>Max)Max=l.data[i]; } intMin; Min=l.data[0]; for(i=0;i { if(l.data[i] return(Max+Min)/2; } if(strcmp(l.type,"Mean")==0) { intsum=0; for(i=0;i { sum=sum+l.data[i]; } returnsum/l.n_data; }} voidmain() { lineLine[100]; inti,j,k; i=0; charinput[100]; do { gets(input); if(strlen(input)>1) { inputToLineData(&Line[i],input); i++; } }while(strcmp(input,"*")! =0); intamount=i; for(i=0;i { sort(Line[i].data,Line[i].n_data); } for(i=0;i { Line[i].typeValue=getTypevalue(Line[i]); } linetemp; for(i=0;i for(j=0;j { if(Line[j].typeValue { temp=Line[j]; Line[j]=Line[j+1]; Line[j+1]=temp; } } for(i=0;i { printf("{%d}",Line[i].typeValue); for(j=0;j { if(j printf("%d",Line[i].data[j]); else printf("%d",Line[i].data[j]); } printf("\n"); } } 3.二叉排序树(选做) 成绩: 5/折扣: 0.8 撰写一个程序,能够构建字符串型的二叉排序树并在二叉排序树中查找节点。 所谓二叉排序树,简而言之,是一个每个节点可指向0、1或2个节点的递归的数据结构。 最上层的一个节点称为树根。 二叉排序树服从凡是比当前节点小的值都在其左下方,比当前节点大的值都在其右下方的规律。 该规律不仅适用于树的局部,也适用于整棵二叉排序树。 例如,在给定Kiwi,Banana,Apple,Melon,Berry的输入字符串的顺序下,以此构建二叉排序树的过程为: 建树后,请根据给定的字符串,查找树中是否有该节点。 若有,返回其节点在所在的层次数(根节点Kiwi的层次定义为0);若无,返回“NotFound”。 输入: 每行一个字符串,作为要插入二叉排序树的值。 若单独一个*字符占一行,则表明用于建树的字符串输入数据结束。 随后以[Search]开始的若干行,代表要在树中查找某个字符串值,用于查找的字符串紧跟其后。 若输入行的第一个字符为“#”,则表示输入数据结束。 输出: 输出每个要查找的值所在的层次数。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 以文本方式显示 1.Kiwi↵ 2.Banana↵ 3.Apple↵ 4.Melon↵ 5.Berry↵ 6.*↵ 7.[Search]Berry↵ 8.[Search]Strawberry↵ 9.#↵ 以文本方式显示 1.Berry-2↵ 2.Strawberry-Not Found↵ 1秒 64M 0 测试用例2 以文本方式显示 1.test↵ 2.*↵ 3.[Search]test↵ 4.[Search]text↵ 5.#↵ 以文本方式显示 1.test-0↵ 2.text-Not Found↵ 1秒 64M 0 #include #include #include structnode {chardate[20]; structnode*left; structnode*right; intfloor;}; intflag=0; intf(structnode*p,chart[]) { if(p==NULL) return0; elseif(strcmp(p->date,t)==0) { printf("%s-%d\n",t,p->floor); flag=1; }else { f(p->left,t); f(p->right,t); } } intmain() { structnode*p0,*pnew,*ptemp; p0=(structnode*)malloc(sizeof(structnode)); p0->left=NULL; p0->right=NULL; chartemp[40]; gets(temp); strcpy(p0->date,temp); p0->floor=0; gets(temp); while(temp[0]! ='*') { pnew=(structnode*)malloc(sizeof(structnode)); pnew->left=NULL; pnew->right=NULL; strcpy(pnew->date,temp); ptemp=p0; for(inti=1;;i++) { if(strcmp(temp,ptemp->date)>0) { if(ptemp->right==NULL) { ptemp->right=pnew; pnew->floor=i; break; }else ptemp=ptemp->right; }else { if(ptemp->left==NULL) { ptemp->left=pnew; pnew->floor=i; break; } else ptemp=ptemp->left; } }//for gets(temp); }//while gets(temp); while(temp[0]! ='#') { chart[40]; strcpy(t,&temp[8]); flag=0; f(p0,t); if(flag==0) printf("%s-NotFound\n",t); gets(temp); }} 1.配料员(选做) 成绩: 5/折扣: 0.8 背景: 你是一名室内装潢工程队的配料员。 你的伙伴们在铺大理石地砖的时候,习惯于按照以下两种之字形的遍历顺序之一: 学了C语言以后,你决定编写一个程序。 无论你的伙伴们想要以何种遍历顺序铺设任何图案的任何大小的地砖方阵,你的程序都能正确地生成一个线性遍历序列,指示你每次该递给他们什么图案的地砖。 输入: 首行为需要遍历的地砖矩阵的个数。 第二行为第一个矩阵的维数(其中的x是小写字母x,前后各有一个空格)。 如果是一个N维的矩阵,则接下来的N行每一行为矩阵该行各列的元素,整型,以空格分隔,每一个整数代表一种基本图案的地砖。 随后的一行为该矩阵遍历的模式,只能为TL-BR或者TR-BL两者之一。 若有多个矩阵,则从下一行起重复上述的输入模式。 输出: 按顺序输出所需原料的编号。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 以文本方式显示 1.1↵ 2.4 x 4↵ 3.1 2 3 4↵ 4.5 6 7 8↵ 5.1 2 3 4↵ 6.5 6 7 8↵ 7.TL-BR↵ 以文本方式显示 1.1,2,5,1,6,3,4,7,2,5,6,3,8,4,7,8↵ 1秒 64M 0 测试用例2 以文本方式显示 1.2↵ 2.4 x 1↵ 3.1↵ 4.2↵ 5.3↵ 6.4↵ 7.TL-BR↵ 8.4 x 1↵ 9.1↵ 10.2↵ 11.3↵ 12.4↵ 13.TR-BL↵ 以文本方式显示 1.1,2,3,4↵ 2.1,2,3,4↵ 1秒 64M 0 测试用例3 以文本方式显示 1.2↵ 2.1 x 1↵ 3.0↵ 4.TL-BR↵ 5.1 x 1↵ 6.5↵ 7.TR-BL↵ 以文本方式显示 1.0↵ 2.5↵ 1秒 64M 0 #include intx[50][50]; voidchange(int*a,int*b) { inttemp; temp=*a; *a=*b; *b=temp; } voidfun(inta,intb) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 作业