C语言作业8.docx
《C语言作业8.docx》由会员分享,可在线阅读,更多相关《C语言作业8.docx(39页珍藏版)》请在冰豆网上搜索。
![C语言作业8.docx](https://file1.bdocx.com/fileroot1/2023-7/14/57e203df-55d2-4625-b076-43fd17acbc0f/57e203df-55d2-4625-b076-43fd17acbc0f1.gif)
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;in_data;i++)
{
l->data[i]=stringToInt(str[i]);
}
}
voidsort(intdata[],intn)
{
inti,j,k;
for(i=0;ifor(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;ifor(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(jprintf("%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)
{
for(inti=0;ifor(intj=0;j
{
inttemp;
temp=x[i][j];
x[i][j]=x[i][b-j-1];
x[i][b-j-1]=temp;
}
}
intmain()
{
intn;
scanf("%d",&n);
while(n--!
=0)
{
for(inti=0;i<50;i++)
for(intj=0;j<50;j++)
x[i][j]=-1;
inta,b;
chartempchar[6];
scanf("%d%c%d",&a,&tempchar[0],&b);
//input
for(inti=0;ifor(intj=0;j
scanf("%d",&x[i][j]);
scanf("%s",tempchar);
if(tempchar[4]=='L')
fun(a,b);
change(&a,&b);
//output
intmax=a>b?
a:
b;
inti,j;
max=max/2*2+1;
printf("%d",x[0][0]);
for(intp=1;p{
for(i=0,j=p;j>=0;i++,j--)
if(x[i][j]!
=-1)
printf(",%d",x[i][j]);
for(i=p+1,j=0;i>=0;i--,j++)
if(x[i][j]!
=-1)
printf(",%d",x[i][j]);
}
for(intp=1;p{
for(i=p,j=max-1;iif(x[i][j]!
=-1)
printf(",%d",x[i][j]);
for(i=max-1,j=p+1;jif(x[i][j]!
=-1)
printf(",%d",x[i][j]);
}
printf("\n");
}
}
50猜猜我是谁
成绩:
5/折扣:
0.8
在指定的文本文件中包含了我需要的信息,请从指定文件中读取指定的行。
如果文件中没有指定的行,则显示“LineNoError.”。
如果文件不存在,则显示“Error.”。
输入:
第一行为要以只读方式打开的文本文件名
第二行要读取的行号(从1开始)
输出:
文件中指定行号的内容(完整一行的内容)
数据文件
∙data1.txt
测试输入
期待的输出
时间限制
内存限制
额外进程
测试用例1
以文本方式显示
1.data1.txt↵
2.2↵
以文本方式显示
1.This is Line 2.↵
无限制
64M
0
测试用例2
以文本方式显示
1.data1.txt↵
2.1↵
以文本方式显示
1.This is Line 1.↵
无限制
64M
0
测试用例3
以文本方式显示
1.data1.txt↵
2.10↵
以文本方式显示
1.Line No Error.↵
无限制
64M
0
测试用例4
以文本方式显示
1.data.txt↵
2.2↵
以文本方式显示
1. Error.↵
无限制
64M
0
#include
#include
intmain()
{
FILE*pf;
charname[20];
scanf("%s",name);
pf=fopen(name,"r");
if(pf==NULL)
{
printf("Error.\n");
exit(0);
}
intn;
scanf("%d",&n);
chars[20];
while(n--)
{
if(fgets(s,20,pf)==NULL)
{
pf=NULL;
break;
}
}
if(pf==NULL)
printf("LineNoError.\n");
else
printf("%s",s);
}
H18恭喜发财利是窦来(选做)
成绩:
5/折扣:
0.8
在中国,过春节时人们有给孩子压岁钱(粤语称为利是)的习俗。
最早的压岁钱出现于汉代,又叫压胜钱,并不在市面上流通,而是铸成钱币形式的玩赏物,有避邪的功能。
钱币正面一般铸有“万岁千秋”、“去殃除凶”等吉祥话和龙凤、龟蛇、双鱼等吉祥图案。
据说嘉兴府有一户姓管的人家,夫妻老年得子,十分珍爱。
在年三十晚上,为防止“祟”来侵扰一直逗孩子玩,小孩用红纸包了八枚铜钱,包了又拆,拆了又包,睡下以后,包着的八枚铜钱就放在枕边。
半夜里,一阵阴风吹过,黑矮的小人正要用他的白手摸孩子的头,突然孩子枕边迸出一道金光,祟尖叫着逃跑了。
于是这件事传扬开来,大家纷纷效仿,在大年夜用红纸包上钱给孩子,祟就不敢再来侵扰了。
因而人们把这种钱叫“压祟钱”,“祟”及“岁”发音相同,日久天长,就被称为“压岁钱”了。
现在有N个人,他们都有小孩,春节来了,他们要发压岁钱给朋友的小孩,而他们自己的小孩也会收到压岁钱。
为了简单,他们在发压岁钱的时候,使用以下的计算方法,譬如某甲有100块,它要给另外三个人的小孩发压岁钱,则每个小孩会分到100/3=33块,剩余的1块就不发了。
给你这N个人的信息,以及他们把压岁钱发给了谁的小孩,请你计算他们每个人的小孩收到的压岁钱和他们发出去的压岁钱的差额是多少。
输入
第1行:
一个整数N(2<=N<=10)
第2..N+1行:
每行是一个人名,每个名字不超过14个字符
第N+2..结束:
N组按照以下规则组织的数据:
组中的第一行为送出压岁钱的人名。
第二行包括