一、题目如下
输入案例:
//这里我们可以知道应该需要四次scanf(输入我们需要的数据)
输出样例:
//输出试机座位号3、4对应的 准考证号 +考试座位号;
二、源代码(程序一)//是不符合PTA给分系统的程序;满分程序是第二个;
#include<stdio.h>
struct student{
long int a;//准考证号
int c; //考试座位号
int b;;//试机座位号
};
int main(void){
int n,m,k;
scanf("%d",&n);//n:总人数
struct student stu[n];//应该是结构体数组
for(int i=0;i<n;i++)
scanf("%ld%d%d",&stu[i].a,&stu[i].b,&stu[i].c);
scanf("%d",&m);//迟到人数
for(int i=0;i<m;i++){
scanf("%d",&k); //迟到者的试机座位号
for(int r=0;r<n;r++){
if(stu[r].b==k)
printf("%ld %d\n",stu[r].a,stu[r].c);
break;
}
}
return 0;
}
以上代码是我编译出来的初稿,在运行过程中出现段错误和运行超时;
下面的是经过数次改编的满分代码二
三、源代码(程序二)
#include<stdio.h>
#define MAX 100000//宏定义后就不会出现段错误
struct student{
long int a;
int c;
};
struct students {
int b;
struct student stu;
}; /*利用结构体嵌套可使程序二进行内存访问时,会有更好的内存局部性,从而提高了程序的运行效率*/
int main(void){
int n,m,k;
scanf("%d",&n);
struct students s[MAX];
for(int i=0;i<n;i++)
scanf("%ld%d%d",&s[i].stu.a,&stu[i].b,&s[i].stu.c);
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&k);
for(int r=0;r<n;r++){
if(s[r].b==k)
printf("%ld %d\n",s[r].stu.a,s[r].stu.c);
break;
}
}
return 0;
}
五、原因
在程序一和程序二中,程序二使用了一个结构体数组struct students s[MAX],
而程序一则直接使用了结构体数组struct student stu[n]。
程序二中的结构体students包含一个整型成员b和一个嵌套的结构体student,
而程序一中的结构体student则包含了一个额外的整型成员b。
程序二中的结构体students在每个元素中包含了一个额外的整型成员b,这意味着在内存中,
每个students结构体的大小会比student结构体更大。
因此,程序一中的结构体数组s的总大小可能会比程序一中的结构体数组stu更大。
当程序一和程序二进行内存访问时,程序二可能会有更好的内存局部性,
因为它的结构体数组中的元素在内存中更接近。
这可能会导致程序二在访问数组元素时具有更好的缓存命中率,从而提高了程序的运行效率。
另外,程序二中的结构体数组s的大小是通过预处理指令#define MAX 100000定义的,
而程序一中的结构体数组stu的大小是通过运行时输入的n定义的。
在某些情况下,编译器可能会对不同大小的数组进行不同的优化,这也可能导致程序二的运行时间更短。
总的来说,程序二比程序一运行时间更短可能是由于内存布局的差异和编译器优化的影响。