学生信息插入
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Description
某班 有n个学生(不超过100),每个学生的信息包括学号(long no),姓名(char name[9])和成绩(int score)。
编写程序,先将n个学生的信息录入到结构体数组中(n个学生的数据已按成绩降序有序),
然后需要将m个学生的信息插入到该班中,使得插入后该数组仍然按成绩有序。
最后输出所有学生的信息。
注意:main函数已经给定(如下所示)。
请将程序补充完整。
提交时只需要提交自己补充的代码部分,不需要提交给定的main函数的代码部分。
#include<stdio.h>
int main()
{
int i,n,m;
struct student stu[100];
while(scanf("%d",&n)!=EOF)
{
input(stu,n); //读入n个学生的数据
scanf("%d",&m);
for(i=0;i<m;i++)
{
insert(stu,n); //按照总分降序排序,如果总分相同的学号小的在前面
n++;
}
print(stu,n); //输出n个学生的信息
}
return 0;
}
Input
包含多组测试数据,每组测试数据第一行包含1个正整数n,表示已有学生人数。
接下来的n行,每行为1个学生的详细信息(已按成绩降序有序),包括学号,姓名和成绩,各数据之间用空格隔开。
接下来的一行包括一个正整数m,表示待插入的学生人数。
最后是m行,每行为1个待插入学生的信息,包括学号,姓名和成绩,各数据之间用空格隔开。
其中,n+m的值不超过100。
Output
每组测试数据输出占n+m行,每行输出一个学生的信息。每一行的输出数据依次为:学号,姓名,成绩。各部分数据之间用空格隔开。(具体详见样例输出)
Sample Input
3 1001 aaa 86 1002 bbb 78 1003 ccc 70 2 1004 ddd 50 1005 eee 99
Sample Output
1005 eee 99 1001 aaa 86 1002 bbb 78 1003 ccc 70 1004 ddd 50
题目分析:
插入的时候,一定要从后往前,把 stu[j+1] = stu[j] 才不会出问题,否则后面的会盖过前面的信息。。
实际上很简单,嘛。就像多米诺骨牌一样,一个搭在另一个上面,然后要找一个特定的位置插入。
以下仅为答案部分代码。
最后:抄代码是不对的哟~
struct student
{
long no;
char name[9];
int score;
};
void input(struct student stu[100],int n)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%ld %s %d",&stu[i].no,stu[i].name,&stu[i].score);
}
return;
}
void insert(struct student stu[100],int n)
{
int i,j,k,f;
//为什么要考队列插入 啊 啊 啊
struct student t;
scanf("%ld %s %d",&t.no,t.name,&t.score);
for(i=1;i<=n;i++)
{
f=0;
if(stu[i].score<t.score)
{
for(j=n;j>=i;j--)
{
stu[j+1]=stu[j];
}
stu[i]=t;
f=1;
break;
}
else if(stu[i].score==t.score)
{
j=i;
while(stu[j].score==t.score)
{
if(stu[j].no>t.no)
{
for(k=n;k>=j;k--)
{
stu[k+1]=stu[k];
}
stu[j]=t;
f=1;
break;
}
j++;
}
if(f==0)
{
for(k=n;k>=j;k--)
{
stu[k+1]=stu[k];
}
stu[j]=t;
f=1;
}
break;
}
if(f==0)
stu[n+1]=t;
}//抄作业是不对的哟!
return;
}
void print(struct student stu[100],int n)
{
int i;
for(i=1;i<=n;i++)
{
printf("%ld %s %d\n",stu[i].no,stu[i].name,stu[i].score);
}
return;
}