1 / 28

TKS

TKS. 1. 高级语言. (第二十四讲). ( 编程选讲六 ). 高考投档分数线 、 寻找好学生 、 单词缩写. 绍兴文理学院. 计算机系计算机应用教研室. 例 1 寻找好学生 [1417]( 改难 ). TKS. 2.

sai
Download Presentation

TKS

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. TKS 1 高级语言 (第二十四讲) (编程选讲六) 高考投档分数线、 寻找好学生、单词缩写 绍兴文理学院 计算机系计算机应用教研室

  2. 例1 寻找好学生[1417](改难) TKS 2 有n(3<=n<=10)个学生,每个学生的信息为:学号(6位字符),姓名(不超过8个的字符)和m(3<=m<=8)门课程的成绩(百分制整数),平均成绩取整数。请编写具有下面功能的程序。(1)求第k(1<=k<=m)门课程的平均分。(2)找出有2门及以上课程不及格的学生并输出bad:以及他们的学号、姓名、全部课程成绩和平均成绩。若无这样的学生,则该项内容输出“NO”。(3)找出平均成绩在90分及以上或全部课程成绩在85分以上的学生,输出good:以及他们的学号、姓名、全部课程成绩。若无这样的学生,则该项内容输出“NO”。 分别编写3个函数实现以上3个要求。分数采用百分制整数,平均成绩均保留整数。 13:20

  3. Input输入数据的第一行为一个正整数T, 表示测试数据的组数. 然后是T组测试数据。每组测试数据包含: 第一行输入n、m和k。 第二行开始的n行每行输入m个成绩。 Output 第一行输出第k门课程的平均成绩。 第二行输出(2)要求的信息。 第三行输出(3)要求的信息。 Sample Input 2 3 5 3 009101 AAAA 87 99 99 65 60 009102 BBBB 99 98 99 96 92 009103 CCCC 72 99 84 90 99 7 6 2 009101 AAAA 99 99 62 100 59 99 009101 BBBB 60 99 83 99 78 96 009103 CCCC 100 97 99 99 78 88 009104 DDDD 94 99 92 77 56 54 009105 EEEE 92 64 80 73 99 59 009106 FFFF 71 97 65 71 99 99 009107 GGGG 83 99 57 61 74 82 Sample Output 94 NO good:009012 BBBB 99 98 99 96 92 93 bad:009104 DDDD 94 99 92 77 56 54 78 good:009103 CCCC 100 97 99 99 78 88 TKS 3 13:20

  4. int main() {stud s[10],*p; int n,i,j,t,m,k,q; p=s; cin>>t; for(q=0;q<t;q++) {cin>>n>>m>>k; for(i=0;i<n;i++) {cin>>(p+i)->num>>(p+i)->name; for(j=0;j<m;j++) cin>>*((p+i)->sc+j); } f1(p,n,k); f2(p,n,m); f3(p,n,m); } return 0; } #include<iostream> using namespace std; struct stud {char num[7]; char name[9]; int sc[8]; }; TKS 4 void f1(stud *p,int n,int k) {int i,sum=0; for(i=0;i<n;i++) sum=sum+(p+i)->sc[k-1]; sum=sum/n; printf("%d\n",sum); } 13:20

  5. void f2(stud *p,int n,int m) {int i,j,k,sum,b=1; for(i=0;i<n;i++) {k=0; sum=0; for(j=0;j<m;j++) {if((p+i)->sc[j]<60) k++; sum=sum+(p+i)->sc[j]; } sum=sum/m; if(k>1) {printf("bad:%s %s",(p+i)->num,(p+i)->name); for(j=0;j<m;j++) printf(" %d",(p+i)->sc[j]); printf(" %d\n",sum); b=0; } } if(b) printf("NO\n"); } TKS 5 13:20

  6. void f3(stud *p,int n,int m) {int i,j,k,sum,b=1; for(i=0;i<n;i++) {sum=0;k=0; for(j=0;j<m;j++) {sum=sum+(p+i)->sc[j]; if((p+i)->sc[j]<85) k++; } sum=sum/m; if(k==0||sum>=90) {printf("good:%s %s",(p+i)->num,(p+i)->name); for(j=0;j<m;j++) printf(" %d",(p+i)->sc[j]); printf("\n"); b=0; } } if(b) printf("NO\n"); } TKS 6 例1 寻找好学生[1417](改难)C+24_1 13:20

  7. 例2 距离最近的数对[1418] TKS 7 输入n个整数(整数可以重复),找出任意两个整数距离最小的整数对(x y),输出这个最小距离和这样整数对的个数,接下去输出具有这个最小距离的整数对(x y)。 Input 输入数据的第一行为一个正整数T, 表示测试数据的组数. 然后是T组测试数据。每组测试数据包含:第一行输入一个正整数n(3<n<21),第二行输入n个整数。 Output 第一行输出最小距离,第二行输出具有该最小距离的整数对的个数。第三行输出全部的具有该最小距离的整数对的信息,每项的格式为(x,y),每项之间一个空格。其中:x和y的顺序均是在n个整数中的最左边开始,自左向右,并且x在左边y在右边。 13:20

  8. sample Input 2 10 2 46 3 53 47 1 80 38 81 19 15 62 12 14 79 86 36 45 28 49 16 77 1 57 9 99 sample Output 1 4 (2,3) (2,1) (46,47) (80,81) 2 3 (12,14) (14,16) (79,77) TKS 8 13:20

  9. #include<iostream> using namespace std; int main() {int i,j,m,n,k,a[20],t,p,d,b; cin>>t; for(p=0;p<t;p++) {cin>>n; for(i=0;i<n;i++) cin>>a[i]; m=a[1]>=a[0]?a[1]-a[0]:a[0]-a[1]; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) {d=a[i]>=a[j]?a[i]-a[j]:a[j]-a[i]; if(d<m) m=d; } printf("%d\n",m); TKS 9 13:20

  10. k=0; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) {d=a[i]>=a[j]?a[i]-a[j]:a[j]-a[i]; if(d==m) k++; } printf("%d\n",k);b=0; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) {d=a[i]>=a[j]?a[i]-a[j]:a[j]-a[i]; if(d==m) {b++; if(b>1) printf(" "); printf("(%d %d)",a[i],a[j]); } } TKS 10 例2 距离最近的数对[1418]C+24_2 printf("\n"); } return 0; } 13:20

  11. 例3 高考投档分数线[1416] TKS 11 假设有n个人参加高考,录取率为70%。在已经录取的人数中,二本(含一本)及以上、三本及以上、专科及以上的比率分别占25%、50%、100%,投档分数线按录取人数的1.2倍划定,对于n个考生的n个分数,请划定二本(含一本)、三本、专科的投档分数线。划定分数线时若人数k出现有小数的,则k值加1。 Input 输入数据的第一行为一个正整数T, 表示测试数据的组数. 然后是T组测试数据。对于每组测试数据,第一行为一个整数n(15<n<100),表示高考人数。第二行为n个整数,表示n个高考成绩。高考成绩为整数,满分为750分。 Output 分别输出二本(含一本)、三本、专科的投档分数线。每项之间一个空格。 13:20

  12. Sample Input 2 20 740 496 544 709 535 613 416 510 402 668 352 490 487 659 635 397 535 611 435 682 30 540 389 446 678 389 743 354 476 464 351 589 481 637 512 488 363 447 571 396 638 598 375 598 455 556 724 487 364 365 492 Sample Output 659 544 416 598 492 365 TKS 12 13:20

  13. #include<iostream> using namespace std; int main() {int i,j,k1,k2,k3,t,tt,p,n,a[100]; double s,s1,s2,s3; cin>>t; for(p=0;p<t;p++) {cin>>n; for(i=0;i<n;i++) cin>>a[i]; s=0.7*n; s1=s*0.25*1.2;k1=(int)s1; if(s1>k1) k1++; s2=s*0.5*1.2;k2=(int)s2; if(s2>k2) k2++; TKS 13 13:20

  14. s3=s*1.2;k3=(int)s3; if(s3>k3) k3++; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]<a[j]) {tt=a[i]; a[i]=a[j]; a[j]=tt; } printf("%d %d %d\n",a[k1-1],a[k2-1],a[k3-1]); } return 0; } TKS 14 例3 高考投档分数线[1416]C+24_3 13:20

  15. 例4 单词缩写[1415] TKS 15 小明刚学习完英文缩写课程,就决定缩写一段段的英文。可是由于没有认真学习,他根本就没有掌握缩写的方法,为了应付,他自创了一套非常简单的缩写规则: 在一段只由英文字母和空格组成的英文段落中,以空格为分隔符,分隔出一个个英文单词。如果英文单词的长度大于等于2,那么只取其头尾两个字母;如果英文单词的长度等于1,那么不改变这个英文单词。 Input 输入的第一行是一个数字T(N<100),表示测试数据的组数。接下来有T行,每行是长度不超过200个字符的字符串,字符串由字母、空格组成,每个字符串至少有一个英文单词。 Output 输出缩写后的英文片段,请保留原来单词之间的空格。 13:20

  16. Sample Input 3 a man a plan a canal panama Frankly I do not think we will make much OK Sample Output a mn a pn a cl pa Fy I do nt tk we wl me mh OK TKS 16 13:20

  17. #include<iostream> using namespace std; #include<string> int main() {char s[201]; int t,k; cin>>t;getchar(); for(k=0;k<t;k++) {gets(s); words(s); } return 0; } void words(char w[]) {int i,b=0; char ch=' '; for(i=0;w[i]!='\0';i++) {if(w[i]==' ') {if(b>1)cout<<ch; cout<<w[i];ch=w[i];b=0; } else {if(b==0) cout<<w[i]; ch=w[i];b++; } } if(b>1) cout<<ch; cout<<endl; } TKS 17 测试数据C+24_4.DOC 例4 单词缩写[1415]C+24_4 13:20

  18. 例5 分苹果 (1119) 班级准备进行春游,一大早,同学们背着满满的背包来到教室,过不了多久,一些同学之间就开始为包里的苹果多少而进行争论。老师为了平息争论,就命令所有学生把包里的苹果全部放到讲台上。 不久,一大堆苹果就出现在讲台上。老师说:“下面,我将把苹果均分成n堆,每个人获得一堆”。“等等,这可能吗?” 一个聪明的学生提出了疑问。告诉你n个学生包里的苹果数, 请你判断老师能否将苹果均分成n堆。 Input输入数据首先包含一个整数T,表示测试实例的个数,然后是T行测试数据。每行首先是1个正整数n (1 <= n <= 100)。然后接n个不大于128的正整数。 TKS 18 13:20

  19. Output 对于每组测试数据,若能均分苹果,则输出“YES”,否则输出"NO" TKS 19 Sample Input 2 5 5 2 7 3 8 6 7 11 2 7 3 4 Sample Output YES NO 例5 分苹果C+24_5 解: #include<iostream> using namespace std; int main() {int i,t,n,p,m,apple; cin>>t; for(p=0;p<t;p++) {cin>>n; m=0; for(i=0;i<n;i++) {cin>>apple; m=m+apple; } if(m%n==0) printf("YES\n"); else printf("NO\n"); } return 0; } 13:20

  20. 例6 按1的个数排序[1176] Sample Input 10011111 00001101 1010101 1 0 1100 Sample Output 0 1 1100 00001101 1010101 10011111 TKS 20 有一些01字串(长度不超过80),将其按1的个数的多少的顺序进行输出。若1的个数相同,则按字符串本身从小到大排序。(本问题只有一组测试数据,字串总数不超过100个) 分析: 1、正确的输入字符串; 2、设计判断函数cmp来判断两个01字串是否要交换; 3、设计函数fun来计算一个01字串中1的个数。 4、可用冒泡排序法实现之。 13:20

  21. 例6 按1的个数排序[1176]C+24_6 #include<iostream> using namespace std; #include<string> int s(char *p) {int i=0,d=0; while(*p!='\0') if(*p++=='1') d++; return d; } TKS 21 int main() {char str[100][81],ch[81]; int i,j,k=0; while(strlen(gets(str[k]))>0) k++; for(i=0;i<k-1;i++) for(j=0;j<k-i-1;j++) if(cmp(str,j)) {strcpy(ch,str[j]); strcpy(str[j],str[j+1]); strcpy(str[j+1],ch); } for(i=0;i<k;i++) puts(str[i]); return 0; } bool cmp(char str[][81],int i) {int d1,d2; d1=s(str[i]);d2=s(str[i+1]); if(d1==d2) return strcmp(str[i],str[i+1])>0; else return d1>d2; } 13:20

  22. 例7 保持链表有序[1421] TKS 22 本题要求使用链表完成!对于输入的若干学生的信息,按学号顺序从小到大建立有序链表,最后遍历链表,并按顺序输出学生信息。要求:每读入一个学生的信息就将该信息插入到链表中并使得链表保持有序。 Input 输入数据的第一行为一个正整数T, 表示测试数据的组数. 然后是T组测试数据。每组测试数据包含首先是一个正整数n表示学生的个数(1<=n<=100)。然后是n行信息,分别表示学生的学号和姓名。其中学号是8位的正整数(保证各不相同),姓名是长度不超过10的不含空格的字符串。 Output 对于每组测试,按顺序输出学生信息,学号和姓名之间留一空格(参看Sample Output)。每组测试之后加一空行。 13:20

  23. Sample Input 2 3 20080108 Zhangsan 20070328 Lisi 20070333 Wangwu 2 20070333 Wangwu 20081113 Lisi Sample Output 20070328 Lisi 20070333 Wangwu 20080108 Zhangsan 20070333 Wangwu 20081113 Lisi #include <iostream> using namespace std; #include<string> struct StudNode {int num; char name[11]; StudNode *next; }; void DispLink(StudNode *head) {StudNode *tp=head; while(tp) {printf("%d %s\n",tp->num,tp->name); tp=tp->next; } printf("\n"); } TKS 23 13:20

  24. StudNode *link(st *h,int num,char *name) {StudNode *newN,*p,*q; newN=new StudNode newN->num=num; strcpy(newN->name,name); newN->next=NULL; if(h==NULL) h=newN; else {p=h; while(p!=NULL&&newN->num>p->num) {q=p; p=p->next; } if(p==h) {newN->next=p; h=newN; } else {newN->next=p; q->next=newN; } } return h; } TKS 24 13:20

  25. int main(void) {StudNode *h; int t,k,n,i,num; char name[11]; cin>>t; for(k=0;k<t;k++) {h=NULL; cin>>n; for(i=0;i<n;i++) {cin>>num>>name; h=link(h,num,name); } DispLink(h); } return 0; } TKS 25 测试数据C+24_7.DOC 例7保持链表有序[1421]C+24_7 13:20

  26. 例8 字符替换[1183] TKS 26 Problem Description 对于给定的三个字符串A,B,C,请你把A里面的B全部用C替换。Input 每组测试一行,分别包含字符串A,B,C.(A,B,C 均是长度小于256的不包含空格的字符串),处理到文件结束。 Output 输出替换后的字符串。 Sample Input AaaaaDFaA a U AaaaaDFaA aa U B_B B ^ ADFFFJHJHJ H haha Sample Output AUUUUDFUA AUUDFaA ^_^ ADFFFJhahaJhahaJ 13:20

  27. int main() { string a,b,c;int i,pos; while(cin>>a>>b>>c) { for(i=0;a[i];i++) { pos=a.find(b,i); if(pos!=-1) { a.replace(pos,b.size(),c); i=pos+c.size()-1; } } cout<<a<<endl; } return 0; } 例8 字符替换[1183] TKS 27 #include<iostream> #include<string> using namespace std; 例8 字符替换C+24_8 13:20

  28. 成功在于努力!

More Related