PAT 乙级 1041
题目
题目地址:PAT 乙级 1041
题解
这道题学到的东西恰好和1037中学到的东西相互补充,总结如下:
在之前的博文中我曾提到过——“结构体在函数内部对数据的操作不能赋给主函数中的实参,函数内部的变量只是局部变量”,因此当时使用了三种方式解决这个问题:“一是调用结束后将数据返回,二是采用全局变量,三是以引用的方式传参“;本题同样使用结构体的方式,其中使用排序函数来对题设中的索引条件排序,可以极大地简化代码、减少程序的时间复杂度,这本身是一个很好的设想,但是在程序过程中遇到了问题,使用了引用方式传入函数,排序结束后的结果并不能返回主函数中?问题的症结在于——排序的对象是一个结构体数组,因此以上的解决方案中引用的方式不能解决问题,因为引用的本质是一个变量的别名,但是对于一个数组而言它有很多成员,无法对于数组取一个统一的别名,因此需要用全局变量或函数调用结束后将数据返回的方式解决回传的问题,代码中使用全局变量的方式。
总结:对于一个数组而言,无法使用引用解决主函数与被调函数中参数传递的问题,解决方式是使用全局变量或在调用结束后将数据返回。
代码
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 struct stu { 6 string num; 7 int shiji; 8 int kaoshi; 9 }; 10 11 stu s[1005]; 12 13 void sort(int n) { 14 for (int i = 0; i < n; i++) { 15 for (int j = i + 1; j < n; j++) 16 if (s[i].shiji > s[j].shiji) { 17 stu tmp; 18 tmp = s[i]; 19 s[i] = s[j]; 20 s[j] = tmp; 21 } 22 } 23 } 24 25 int main() { 26 int cnt = 0; 27 int n = 0; 28 cin >> n; 29 while (n--) { 30 string tmp; 31 int tmp1 = 0, tmp2 = 0; 32 cin >> tmp >> tmp1 >> tmp2; 33 s[cnt].num = tmp; 34 s[cnt].shiji = tmp1; 35 s[cnt].kaoshi = tmp2; 36 cnt++; 37 } 38 sort(cnt); 39 int m = 0; 40 cin >> m; 41 while (m--) { 42 int tmp = 0; 43 cin >> tmp; 44 cout << s[tmp - 1].num << " " << s[tmp - 1].kaoshi << endl; 45 } 46 47 return 0; 48 }