《C语言作业8(23页).doc》由会员分享,可在线阅读,更多相关《C语言作业8(23页).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-C语言作业8-第 23 页2. 集合排序(选做) 现有若干个集合的数据,每个数据集合可以自选一个指标参加排序。这些指标包含如下四种: Min ,取集合中元素的最小值 Max ,取集合中元素的最大值 Mean ,取集合中元素的平均值,平均值的计算公式为: (V1+V2+Vn) / n Median ,取集合中元素的中值,中值的计算公式为: (Vmin+Vmax) / 2 读入数据后,请根据各个集合选择的指标对这些集合进行降序排列,每个集合内的元素请升序排列。 输入: 每行一个集合。 内为该集合选取的用于集合间排序的指标。随后为集合内各个元素,元素个数不定,以空格分隔。 若输入行的第一个字符为“
2、*”,则表示输入数据结束。输出: 每行输出一个集合。 内为计算出该集合的排序指标值,随后为该集合的各个元素的升序排列。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示 1. Max8315 2. Min910127 3. Median24 4. Mean302010 5. *以文本方式显示 1. 20102030 2. 153815 3. 324 4. 11279101秒 64M 0 测试用例 2以文本方式显示 1. Max1234492565763023 2. Mean1781349323256723322 3. Mean3123854352343227999 4. Ma
3、x8768611991233212344123292 5. Min99128353766 6. Median84431453 7. Median99999352266 8. Min43423255 9. Median0 10. *以文本方式显示 1. 876861211993292123321234487686 2. 5001735226699999 3. 35762327318543599923432 4. 325532554342 5. 3440391223256576344 6. 1881233232178322349567 7. 7434384145 8. 339537669128 9
4、. 001秒 64M 0 测试用例 3以文本方式显示 1. Mean88888 2. *以文本方式显示 1. 88888888881秒 64M 0 #include #include #include typedef struct line char type8; int typeValue; int data100; int n_data; line; int stringToInt(char str) int returnValue=0; int n=strlen(str); for(int i=0;istrlen(str);i+) returnValue=returnValue+(int
5、)stri-48)*pow(10.0,-n); return returnValue; void inputToLineData(line * l,char input) int n,i;/line length n=strlen(input); for(i=0;itypei=inputi+1; l-typei=0; l-n_data=0; int numStart=i+2; char str10010; int m=0,j=0; for(i=numStart;in_data+; else strjm+=inputi; strjm=0; l-n_data+; l-data0=0; for(i=
6、0;in_data;i+) l-datai=stringToInt(stri); void sort(int data,int n) int i,j,k; for(i=0;in;i+) for( j=0;jdataj+1) k=dataj; dataj=dataj+1; dataj+1=k; int getTypevalue(line l) int i,j,k; if(strcmp(l.type,Max)=0) int Max; Max=l.data0; for(i=0;iMax) Max=l.datai; return Max; if(strcmp(l.type,Min)=0) int Mi
7、n; Min=l.data0; for(i=0;il.n_data;i+) if(l.dataiMin) Min=l.datai; return Min; if(strcmp(l.type,Median)=0) int Max; Max=l.data0; for(i=0;iMax) Max=l.datai; int Min; Min=l.data0; for(i=0;il.n_data;i+) if(l.dataiMin) Min=l.datai; return (Max+Min)/2; if(strcmp(l.type,Mean)=0) int sum=0; for(i=0;i1) inpu
8、tToLineData(&Linei,input); i+; while(strcmp(input,*)!=0); int amount=i; for(i=0;iamount;i+) sort(Linei.data,Linei.n_data); for(i=0;iamount;i+) Linei.typeValue=getTypevalue(Linei); line temp; for(i=0;iamount;i+) for(j=0;jamount-1;j+) if(Linej.typeValueLinej+1.typeValue) temp=Linej; Linej=Linej+1; Lin
9、ej+1=temp; for(i=0;iamount;i+) printf(%d,Linei.typeValue); for(j=0;jLinei.n_data;j+) if(jLinei.n_data-1) printf(%d ,Linei.dataj); else printf(%d,Linei.dataj); printf(n); 3. 二叉排序树(选做) 撰写一个程序,能够构建字符串型的二叉排序树并在二叉排序树中查找节点。 所谓二叉排序树,简而言之,是一个每个节点可指向 0、1 或 2 个节点的递归的数据结构。最上层的一个节点称为树根。二叉排序树服从凡是比当前节点小的值都在其左下方,比
10、当前节点大的值都在其右下方的规律。该规律不仅适用于树的局部,也适用于整棵二叉排序树。 例如,在给定 Kiwi, Banana, Apple, Melon, Berry 的输入字符串的顺序下,以此构建二叉排序树的过程为:建树后,请根据给定的字符串,查找树中是否有该节点。若有,返回其节点在所在的层次数(根节点Kiwi的层次定义为0);若无,返回“Not Found”。输入: 每行一个字符串,作为要插入二叉排序树的值。若单独一个*字符占一行,则表明用于建树的字符串输入数据结束。随后以Search开始的若干行,代表要在树中查找某个字符串值,用于查找的字符串紧跟其后。若输入行的第一个字符为“#”,则表示
11、输入数据结束。输出: 输出每个要查找的值所在的层次数。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示 1. Kiwi 2. Banana 3. Apple 4. Melon 5. Berry 6. * 7. SearchBerry 8. SearchStrawberry 9. #以文本方式显示 1. Berry-2 2. Strawberry-NotFound1秒 64M 0 测试用例 2以文本方式显示 1. test 2. * 3. Searchtest 4. Searchtext 5. #以文本方式显示 1. test-0 2. text-NotFound1秒 64M
12、 0 #include#include#includestruct nodechar date20;struct node *left;struct node *right;int floor;int flag=0;int f(struct node *p,char t)if(p=NULL)return 0;else if(strcmp(p-date,t)=0)printf(%s-%dn,t,p-floor);flag=1;elsef(p-left,t);f(p-right,t);int main()struct node *p0,*pnew,*ptemp;p0=(struct node*)
13、malloc (sizeof (struct node);p0-left=NULL;p0-right=NULL;char temp40;gets(temp);strcpy(p0-date,temp);p0-floor=0;gets(temp);while(temp0!=*)pnew=(struct node*) malloc (sizeof (struct node);pnew-left=NULL;pnew-right=NULL;strcpy(pnew-date,temp);ptemp=p0;for(int i=1;i+)if(strcmp(temp,ptemp-date)0)if(ptemp
14、-right=NULL)ptemp-right=pnew;pnew-floor=i;break;else ptemp=ptemp-right;elseif(ptemp-left=NULL)ptemp-left=pnew;pnew-floor=i;break;else ptemp=ptemp-left;/forgets(temp);/whilegets(temp);while(temp0!=#)char t40;strcpy(t,&temp8);flag=0;f(p0,t);if(flag=0)printf(%s-Not Foundn,t);gets(temp);1. 配料员(选做)背景: 你是
15、一名室内装潢工程队的配料员。你的伙伴们在铺大理石地砖的时候,习惯于按照以下两种之字形的遍历顺序之一:学了 C 语言以后,你决定编写一个程序。无论你的伙伴们想要以何种遍历顺序铺设任何图案的任何大小的地砖方阵,你的程序都能正确地生成一个线性遍历序列,指示你每次该递给他们什么图案的地砖。输入: 首行为需要遍历的地砖矩阵的个数。第二行为第一个矩阵的维数(其中的 x 是小写字母 x,前后各有一个空格)。如果是一个 N 维的矩阵,则接下来的 N 行每一行为矩阵该行各列的元素,整型,以空格分隔,每一个整数代表一种基本图案的地砖。随后的一行为该矩阵遍历的模式,只能为 TL-BR 或者 TR-BL 两者之一。若
16、有多个矩阵,则从下一行起重复上述的输入模式。输出: 按顺序输出所需原料的编号。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示 1. 1 2. 4x4 3. 1234 4. 5678 5. 1234 6. 5678 7. TL-BR以文本方式显示 1. 1,2,5,1,6,3,4,7,2,5,6,3,8,4,7,81秒 64M 0 测试用例 2以文本方式显示 1. 2 2. 4x1 3. 1 4. 2 5. 3 6. 4 7. TL-BR 8. 4x1 9. 1 10. 2 11. 3 12. 4 13. TR-BL以文本方式显示 1. 1,2,3,4 2. 1,2,3,4
17、1秒 64M 0 测试用例 3以文本方式显示 1. 2 2. 1x1 3. 0 4. TL-BR 5. 1x1 6. 5 7. TR-BL以文本方式显示 1. 0 2. 51秒 64M 0 #includeint x5050;void change(int *a,int *b)int temp;temp=*a;*a=*b;*b=temp;void fun(int a,int b)for(int i=0;ia;i+)for(int j=0;jb/2;j+)int temp;temp=xij;xij=xib-j-1;xib-j-1=temp;int main()int n;scanf(%d,&n)
18、;while(n-!=0)for(int i=0;i50;i+)for(int j=0;j50;j+)xij=-1;int a,b;char tempchar6;scanf(%d %c %d,&a,&tempchar0,&b);/inputfor(int i=0;ia;i+)for(int j=0;jb?a:b;int i,j;max=max/2*2+1;printf(%d,x00);for(int p=1;p=0;i+,j-)if(xij!=-1)printf(,%d,xij);for(i=p+1,j=0;i=0;i-,j+)if(xij!=-1)printf(,%d,xij);for(in
19、t p=1;pmax-1;p+=2)for(i=p,j=max-1;imax;i+,j-)if(xij!=-1)printf(,%d,xij);for(i=max-1,j=p+1;jmax;i-,j+)if(xij!=-1)printf(,%d,xij);printf(n);50 猜猜我是谁在指定的文本文件中包含了我需要的信息,请从指定文件中读取指定的行。如果文件中没有指定的行,则显示“Line No Error.”。如果文件不存在,则显示“File Name Error.”。输入:第一行为要以只读方式打开的文本文件名第二行要读取的行号(从1开始)输出:文件中指定行号的内容(完整一行的内容)数
20、据文件测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示 1. 2. 2以文本方式显示 1. ThisisLine2.无限制 64M 0 测试用例 2以文本方式显示 1. 2. 1以文本方式显示 1. ThisisLine1.无限制 64M 0 测试用例 3以文本方式显示 1. 2. 10以文本方式显示 1. LineNoError.无限制 64M 0 测试用例 4以文本方式显示 1. 2. 2以文本方式显示 1. FileNameError.无限制 64M 0 #include#includeint main()FILE * pf;char name20;scanf(%s,
21、name);pf=fopen(name,r);if(pf=NULL)printf(File Name Error.n);exit(0);int n;scanf(%d,&n);char s20;while(n-)if(fgets(s,20,pf)=NULL)pf=NULL;break;if(pf=NULL)printf(Line No Error.n);elseprintf(%s,s);H18 恭喜发财 利是窦来(选做)在中国,过春节时人们有给孩子压岁钱(粤语称为利是)的习俗。最早的压岁钱出现于汉代,又叫压胜钱,并不在市面上流通,而是铸成钱币形式的玩赏物,有避邪的功能。钱币正面一般铸有“万岁千秋
22、”、“去殃除凶”等吉祥话和龙凤、龟蛇、双鱼等吉祥图案。据说嘉兴府有一户姓管的人家,夫妻老年得子,十分珍爱。在年三十晚上,为防止“祟”来侵扰 一直逗孩子玩,小孩用红纸包了八枚铜钱,包了又拆,拆了又包,睡下以后,包着的八枚铜钱就放在枕边。半夜里,一阵阴风吹过,黑矮的小人正要用他的白手摸孩 子的头,突然孩子枕边迸出一道金光,祟尖叫着逃跑了。于是这件事传扬开来,大家纷纷效仿,在大年夜用红纸包上钱给孩子,祟就不敢再来侵扰了。因而人们把这种钱叫“压祟钱”,“祟”与“岁”发音相同,日久天长,就被称为 “压岁钱”了。现在有 N 个人,他们都有小孩,春节来了,他们要发压岁钱给朋友的小孩,而他们自己的小孩也会收到
23、压岁钱。为了简单,他们在发压岁钱的时候,使用以下的计算方法,譬 如某甲有 100 块,它要给另外三个人的小孩发压岁钱,则每个小孩会分到 100/3 = 33 块,剩余的 1 块就不发了。给你这 N 个人的信息,以及他们把压岁钱发给了谁的小孩,请你计算他们每个人的小孩收到的压岁钱和他们发出去的压岁钱的差额是多少。输入第 1 行: 一个整数 N(2 = N = 10)第 2.N+1 行: 每行是一个人名,每个名字不超过 14 个字符第 N+2.结束: N 组按照以下规则组织的数据:组中的第一行为送出压岁钱的人名。 第二行包括两个数字,第一个是该人有多少钱(02000),第二个是它要把钱发给几个人的
24、小孩,用 NGi 表示(0 NGi N-1). 如果 NGi 为非零,则下面的 NGi 行会列出接受压岁钱的人的名字。 输入样例 5 dave laura owen vick amr dave 200 3 laura owen vick owen 500 1 dave amr 150 2 vick owen laura 0 2 amr vick vick 0 0 输出格式输出为 N 行,每行上是一个人名与它收到和送出的压岁钱之差额,这两项之间有一个空格。这 N 行的顺序应该和输入中第 2N+1 行的顺序相同。 输出样例dave 302 laura 66 owen -359 vick 141 a
25、mr -150 测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示 1. 5 2. dave 3. laura 4. owen 5. vick 6. amr 7. dave 8. 2003 9. laura 10. owen 11. vick 12. owen 13. 5001 14. dave 15. amr 16. 1502 17. vick 18. owen 19. laura 20. 02 21. amr 22. vick 23. vick 24. 00以文本方式显示 1. dave302 2. laura66 3. owen-359 4. vick141 5. am
26、r-150无限制 64M 0 测试用例 2以文本方式显示 1. 10 2. mitnik 3. Poulsen 4. Tanner 5. Stallman 6. Ritchie 7. Baran 8. Spafford 9. Farmer 10. Venema 11. Linus 12. mitnik 13. 3003 14. Poulsen 15. Tanner 16. Baran 17. Poulsen 18. 10001 19. Tanner 20. Spafford 21. 20009 22. mitnik 23. Poulsen 24. Tanner 25. Stallman 26.
27、 Ritchie 27. Baran 28. Farmer 29. Venema 30. Linus 31. Tanner 32. 12341 33. Poulsen 34. Stallman 35. 5363 36. Farmer 37. Venema 38. Linus 39. Ritchie 40. 20001 41. mitnik 42. Baran 43. 792 44. Tanner 45. Farmer 46. Farmer 47. 00 48. Venema 49. 129 50. mitnik 51. Poulsen 52. Tanner 53. Stallman 54. R
28、itchie 55. Baran 56. Spafford 57. Farmer 58. Linus 59. Linus 60. 10001 61. mitnik以文本方式显示 1. mitnik2923 2. Poulsen557 3. Tanner128 4. Stallman-311 5. Ritchie-1777 6. Baran245 7. Spafford-1997 8. Farmer440 9. Venema391 10. Linus-599无限制 64M 0 #include#include#includestruct datechar name15;int money;int
29、 get;int num;int res;int main()struct date people10;for(int x=0;x10;x+)peoplex.get=0;int n,itemp,ktemp,ntemp,moneytemp;char temp20;scanf(%d,&n);for(int i=0;in;i+)scanf(%s,peoplei.name);for(int a=0;an;a+)scanf(%s,temp);for(itemp=0;strcmp(temp,peopleitemp.name);itemp+)scanf(%d%d,&peopleitemp.money,&nt
30、emp);if(ntemp!=0)moneytemp=peopleitemp.money/ntemp;peopleitemp.num=ntemp;while(ntemp-)scanf(%s,temp);for(ktemp=0;strcmp(temp,peoplektemp.name);ktemp+)peoplektemp.get+=moneytemp;for(int a=0;an;a+)if(peoplea.num)peoplea.res=peoplea.get-peoplea.money+peoplea.money%peoplea.num;elsepeoplea.res=peoplea.ge
31、t;for (int a=0;an;a+)printf(%s %dn,peoplea.name,peoplea.res);51 猜数字看人品描述Tom 和 Jerry 做猜数字的游戏,Tom 想一个数字然后让 Jerry 去猜,数字的范围在 1 到 10 之间。对于 Jerry 每讲的一个数,Tom 都要讲这个数是 too high 或者 too low 或者 right on,直到 right on 结束。为了防止 Tom 作弊,Jerry 把每一次的对话记录下来,现在让你去判断 Tom 有没有作弊。输入游戏可能做很多次,直到 Jerry 猜 0 的时候游戏结束,每一次猜测由一个正整数和一行
32、回答组成。输出对每一次游戏如果 Tom 的回答有自相矛盾的地方,就输出 Tom is dishonest,否则输出 Tom may be honest。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示 1. 5 2. toolow 3. 7 4. toohigh 5. 6 6. righton 7. 10 8. toohigh 9. 3 10. toolow 11. 4 12. toohigh 13. 2 14. righton 15. 0以文本方式显示 1. Tommaybehonest 2. Tomisdishonest无限制 64M 0 #include int ba
33、cktobase(int *p) for(int i=1;i=10;i+) *p=i; p+; return 0; int cleanright(int *right,int n) for(int i=n;i=1;i-) *left=0; left-; return 0; int main() int base1011=0,0,0,0,0,0,0,0,0,0,0; int *p; int *right; right=NULL; int *left; left=NULL; p=&base101; backtobase(p); char cmd20; int n=0; int c=0; /switch case for(int q=0;q1;) char temp; scanf(%d,&n); temp=getchar(); gets(cmd); if (n=0) break; if (cmd4=h) c=1; /1 high else if(cmd4=