6-1 函数指针(理科实验班)
分数 20
全屏浏览题目
切换布局
作者 何振峰
单位 福州大学
梦山高中现需要将某普通班的最优秀学生调整入理科实验班。为此,将从两个方面考察学生,一是数学和英语两门课的总分;另一个是所有四门课的总分。分别找出两科总分和全科总分的第一名,并从中决定调整人选。
输入将首先输入学生数n, (n为不超过80的正整数);接下来依次输入各位学生的学号,数学、英语、语文、理科综合成绩。学号及四科成绩均为不超过300的正整数。
输出时:第一行输出两科总分第一的学号,第二行输出四科总分第一的学号。 约定在两位学生成绩相同时,优先选择学号较小的学生;各位学生的学号均不相同。
裁判测试程序样例:
#include <iostream> using namespace std; const int N=80; struct Student{ int num; int score[4]; }; /* 请在这里填写答案 */ int main() { int i, j, k, n; bool s2(const Student &, const Student &); bool s4(const Student &, const Student &); Student st[N]; cin>>n; for(i=0;i<n;i++){ cin>>st[i].num; for(j=0;j<4;j++) cin>>st[i].score[j]; } cout<<select(st, n, s2)<<endl; cout<<select(st, n, s4)<<endl; }
输入样例:
1. 3 2. 6 148 150 120 252 3. 5 148 150 117 260 4. 7 145 148 128 287
输出样例:
1. 5 2. 7
1. bool s2(const Student &a, const Student &b) 2. { 3. if(a.score[0]+a.score[1]!=b.score[0]+b.score[1]) 4. { 5. return a.score[0]+a.score[1]>b.score[0]+b.score[1]; 6. } 7. else 8. { 9. return a.num<b.num; 10. } 11. } 12. bool s4(const Student &a, const Student &b) 13. { 14. if(a.score[0]+a.score[1]+a.score[2]+a.score[3]!=b.score[0]+b.score[1]+b.score[2]+b.score[3]) 15. { 16. return a.score[0]+a.score[1]+a.score[2]+a.score[3]>b.score[0]+b.score[1]+b.score[2]+b.score[3]; 17. } 18. else 19. { 20. return a.num<b.num; 21. } 22. } 23. int select(Student st[],int n,bool(*s)(const Student &a,const Student &b)) 24. { 25. int max=0; 26. for(int i=1;i<n;i++) 27. { 28. if(!s(st[max],st[i])) 29. { 30. max=i; 31. } 32. } 33. return st[max].num; 34. }
6-2 玩转函数指针
分数 20
全屏浏览题目
切换布局
作者 周强
单位 青岛大学
这道题,让我们来玩转函数指针。
函数接口定义:
void proceed(int *a, int *b, int size, void (*fp)(int x, int y));
其中,参数a
和b
是分别是两个相同大小的整型数组的首地址,size
是两个数组的长度,fp
是一个函数指针。
题目要求,proceed
函数依次以数组a
和b
里的每一对元素为参数,调用fp
所指向的函数。
例如数组a
和b
分别为[1,2,3]
和[4,5,6]
,则依次以(1,4)
、(2,5)
、(3,6)
作为参数调用fp
所指向的函数。
裁判测试程序样例:
一个可能的函数被调用进行测试的例子像这样: ** 注意: 实际的测试程序可能与下面这个程序很不同! #include <stdio.h> void isFactorOf(int x, int y){ if(x % y) printf("%d is not a factor of %d.\n", y, x); else printf("%d is a factor of %d.\n", y, x); } void proceed(int *a, int *b, int size, void (*fp)(int x, int y)); int main() { int n; scanf("%d", &n); int a[n], b[n]; for(int i=0; i<n; i++) scanf("%d", a+i); for(int i=0; i<n; i++) scanf("%d", b+i); proceed(a, b, n, isFactorOf); return 0; } /* 你的代码将被嵌到这里 */
输入样例:
1. 3 2. 1 10 15 3. 5 5 10
输出样例:
1. 5 is not a factor of 1. 2. 5 is a factor of 10. 3. 10 is not a factor of 15.
1. void proceed(int *a, int *b, int size, void (*fp)(int x, int y)) 2. { 3. for(int i=0;i<size;i++) 4. { 5. (*fp)(a[i],b[i]); 6. } 7. }
6-3 万能的排序函数
分数 20
全屏浏览题目
切换布局
作者 吴敏华
单位 首都师范大学
有n个整数,需要对他们进行各种排序:升序排序、降序排序、按个位数升序排序、按十位数降序排序,为了提高代码的重用性,可以用指向函数的指针作排序函数的参数。
程序输入n+2个整数:
第一行是整数n,表示后面有n个整数需要排序
第二行是待排序的n个整数
第三行是排序需求,分别是1-4,依次表示升序排序、降序排序、按个位数升序排序、按十位数降序排序
程序的输出是排好序的n个整数,两个整数之间用空格隔开
函数接口定义:
需要实现以下函数:
void sort(int *p, int (*compare)(int a,int b), int N); int Descending(int a, int b); int bit1_Des(int a, int b);
其中 p
是数据的首地址, N
是需要排序的数据个数, compare
是指向函数的指针。sort
函数用选择法进行排序
裁判测试程序样例:
#include <stdio.h> void sort(int *p, int (*compare)(int a,int b), int N); int Ascending(int a, int b); int Descending(int a, int b); int bit0_Asc(int a, int b); int bit1_Des(int a, int b); int main() { int n=10,k; int *s,*p; int (*fun)(int,int); scanf("%d",&n); p=(int*)malloc(n*sizeof(int)); for(s=p; s<p+n; s++) scanf("%d",s); scanf("%d",&k); switch(k) { case 1:fun=Ascending; break; case 2:fun=Descending; break; case 3:fun=bit0_Asc; break; case 4:fun=bit1_Des; break; } sort(p,fun,n); for(s=p; s<p+n-1; s++) printf("%d ",*s); printf("%d\n",*s); return 0; } int Ascending(int a, int b) { return a>b; } int bit0_Asc(int a, int b) { return a%10>b%10; } /* 请在这里填写答案 */
输入样例:
1. 11 2. 886 461 856 581 514 272 197 182 564 121 894 3. 3
输出样例:
461 581 121 272 182 514 564 894 856 886 197
1. void sort(int *p, int (*compare)(int a,int b), int N) 2. { 3. for(int i=0;i<N-1;i++) 4. { 5. int k=i; 6. for(int j=i+1;j<N;j++) 7. { 8. if((*compare)(p[k],p[j])) 9. k=j; 10. } 11. if(k!=i) 12. { 13. int temp=p[i]; 14. p[i]=p[k]; 15. p[k]=temp; 16. } 17. } 18. } 19. int Descending(int a, int b) 20. { 21. return a < b; 22. } 23. 24. int bit1_Des(int a, int b) 25. { 26. return a/10%10 < b/10%10; 27. }
6-4 利用函数指针实现递增或递减排序
分数 20
全屏浏览题目
切换布局
作者 C专题课程组-humin
单位 浙江大学
本题要求实现一个函数,根据主程序运行提示完成一组整数的递增或递减排序。
函数接口定义:
static void sortAorD(int *array, int n, int (*compare)(int a, int b))
其中array是要排序的数组的起始地址,n是要排序的数的个数,compare 是函数指针,具体含义见给出的程序。
裁判测试程序样例:
本程序运行时,若输入符号A, 则按照升序排序,输入符号D,则按降序排序。
#include <string.h> static int array[20]; static int ascending(int a, int b); static int descending(int a, int b); static void sortAorD(int array[ ], int n, int (*compare)(int a, int b)) ; typedef struct { char name; int (*cmd)(int a, int b); }SortCmd; int main() { int k,n; char cmdType; scanf("%c", &cmdType); scanf("%d", &n) ; SortCmd cmds[]={ {'A', ascending}, /* Ascending */ {'D', descending} /*Descending */ }; for (k = 0; k<n; k++) scanf("%d", &array[k]); for (k = 0; k < sizeof(cmds)/sizeof(cmds[0]); k++) { if (cmdType==cmds[k].name) sortAorD(array, n, cmds[k].cmd); } for (k=0; k<n; k++) printf("%d ", array[k]); } static int ascending(int a, int b) { return (a>=b); } static int descending(int a, int b) { return (a<b); }
输入样例:
在这里给出一组输入。例如:
1. A 2. 15 3. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
输出样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1. static void sortAorD(int *array, int n, int (*compare)(int a, int b)) { 2. for (int i= 0; i< n-1; i++) 3. { 4. for (int j= 0; j< n-1-i; j++) 5. { 6. if ((*compare)(array[j],array[j+1])) 7. { 8. int temp = array[j]; 9. array[j] = array[j+1]; 10. array[j+1] = temp; 11. } 12. } 13. } 14. }
6-5 进步排行榜的比较函数
分数 20
全屏浏览题目
切换布局
作者 黄龙军
单位 绍兴文理学院
设学生信息的结构体设计如下:
1. struct Stu { 2. string username; //用户名 3. int diff; //进步总数 4. int total; //解题总数 5. };
解题进步排行榜中,按进步总数diff
及解题总数toatal
生成排行榜。要求先输入n
个学生的信息;然后按diff
降序排列;若diff
相同,则按toatal
降序排列;若diff
和toatal
都相同,则按用户名username
升序排列。
要求实现一个比较函数cmp,该函数作为sort()函数的第三个参数。
函数接口定义:
bool cmp(Stu s, Stu t);
其中 s
和 t
是用户传入的两个Stu类型的结构体参数。
裁判测试程序样例:
#include <iostream> #include <string> #include <algorithm> using namespace std; bool cmp(Stu s, Stu t); //输入整数n,再输入n个学生的信息,按要求排序后输出,处理到文件尾 int main() { int n; while(cin>>n) { Stu a[n]; int i; for(i=0; i<n; i++) cin>>a[i].username>>a[i].diff>>a[i].total; sort(a, a+n, cmp); for(i=0; i<n; i++) cout<<a[i].username<<" "<< a[i].diff<<" "<<a[i].total<<endl; } return 0; }
输入样例:
1. 10 2. usx15131 21 124 3. usx15101 27 191 4. usx15107 24 154 5. usx15113 31 124 6. usx15117 27 191 7. usx15118 21 124 8. usx15119 22 117 9. usx15121 43 214 10. usx15128 21 124 11. usx15136 27 199
输出样例:
1. usx15121 43 214 2. usx15113 31 124 3. usx15136 27 199 4. usx15101 27 191 5. usx15117 27 191 6. usx15107 24 154 7. usx15119 22 117 8. usx15118 21 124 9. usx15128 21 124 10. usx15131 21 124
1. bool cmp(Stu s, Stu t) 2. { 3. if(s.diff!=t.diff) 4. { 5. return s.diff>t.diff; 6. } 7. else 8. { 9. if(s.total!=t.total) 10. { 11. return s.total>t.total; 12. } 13. else 14. { 15. return s.username<t.username; 16. } 17. } 18. }