天天看點

zzulioj 1185: 添加記錄(結構體專題)

題目描述

有一學生成績表,包括學号、姓名、3門課程成績。已知該成績表按學号升序排序。請程式設計實作,添加一個新的學生資訊,且使成績表仍按學号有序;若待添加的學号與已有學号重複,則輸出錯誤資訊,拒絕添加。

輸入

首先輸入一個整數n(1<=n<=100),表示學生人數;

然後輸入n行,每行包含一個學生的資訊:學号(12位)、姓名(不含空格且不超過20位),以及3個整數,表示3門課成績,資料之間用空格隔開。

最後一行輸入一個待添加的學生資訊,包括學号、姓名和3門課成績

輸出

若待添加的學号與已有學号重複,則輸出隻有一行“error!”;否則,輸出n+1行,即添加後的成績單資訊。

樣例輸入 

3
541207010188 Zhangling 78 95 55
541207010189 Wangli 87 99 88
541207010191 Fangfang 68 76 75
541207010190 Lilei 68 79 82      

樣例輸出 Copy

541207010188 Zhangling 78 95 55
541207010189 Wangli 87 99 88
541207010190 Lilei 68 79 82
541207010191 Fangfang 68 76 75      

 解:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student{
	char num[13];
	char name[21];
	int x;
	int y;
	int z;
}student;
int main(){
	int n;
	scanf("%d",&n);
	getchar();
	student *a,new;
	a=(student*)malloc(sizeof(student)*(n+1));
	for(int i=0;i<n;i++){
		scanf("%s%*c%s%d%d%d",a[i].num,a[i].name,&a[i].x,&a[i].y,&a[i].z);
		getchar();
	}
	scanf("%s%*c%s%d%d%d",new.num,new.name,&new.x,&new.y,&new.z);
	int flag=0;
	for(int i=0;i<n-1;i++){
		if(strcmp(a[i].num,new.num)<0&&strcmp(a[i+1].num,new.num)>0){//如果待插入學号大于目前學号且小于下一個學号(該條件無法判斷待差學号在首尾的情況,是以下面單獨判斷
			for(int j=n-1;j>i;j--){
				a[j+1]=a[j];
			}
			a[i+1]=new;
			flag=1;
		}
	}
	if(strcmp(a[0].num,new.num)>0){//如果待插入序列在a[0]位置
		for(int i=n-1;i>-1;i--){
			a[i+1]=a[i];
		}
		a[0]=new;
		flag=1;
	}
	if(strcmp(a[n-1].num,new.num)<0){//如果待插入序列在a[n-1]位置
		a[n]=new;
		flag=1;
	}
	if(flag==0)
	printf("error!\n");
	else
	for(int i=0;i<=n;i++)
	printf("%s %s %d %d %d\n",a[i].num,a[i].name,a[i].x,a[i].y,a[i].z);
	free(a);
	return 0;
}
           

繼續閱讀