69,373
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
typedef struct student {
long id;
char name[20];
int math,chiness,english,total;
} STUDENT;
//主菜单,返回1-6选项;
int menu();
//1:创建学生信息文件并输出,返回学生数量
int create_stu_info();
//2:按学号排序并输出
int sort_by_id(STUDENT* s,int num);
//3:按姓名排序并输出
int sort_by_name(STUDENT* s,STUDENT* s_name,int num);
//4:增加学生信息,返回增加后的学生数量
int insert_stu(STUDENT* s,int num);
//5:删除某学生的数据,返回删除后的学生数量
int delete_stu(STUDENT* s,int num);
//intput/output:读入/输出 num个学生信息;
//fp==NULL时从键盘读入/屏幕输出,否则从文件读/写;
int input(FILE* fp, STUDENT* stu,int num);
void output(FILE* fp,STUDENT* stu,int num);
//排序的比较准则
int cmp_id(const void* lhs,const void* rhs);
int cmp_name(const void* lhs,const void* rhs);
//寻找合适的插入删除位置
int find_id(STUDENT* s,int num,long id);
int main() {
STUDENT s[N],s_name[N];
int num=0,ch;
//根据主菜单,进行相应的操作
while((ch=menu())!='6') {
switch (ch) {
case '1':
num=create_stu_info();
break;
case '2':
sort_by_id(s,num);
break;
case '3':
sort_by_name(s,s_name,num);
break;
case '4':
num=insert_stu(s,num);
break;
case '5':
num=delete_stu(s,num);
}
}
return 0;
}
//比较规则:按ID 升序
int cmp_id(const void* lhs,const void* rhs) {
return ((STUDENT*)lhs)->id>((STUDENT*)rhs)->id;
}
//比较规则:按姓名升序
int cmp_name(const void* lhs,const void* rhs) {
int result=strcmp(((STUDENT*)lhs)->name,((STUDENT*)rhs)->name);
return result>0;
}
//寻找合适的插入删除位置
int find_id(STUDENT* s,int num,long id) {
int pos;
for(pos=0; pos<num; ++pos)
if(s[pos].id>=id)
break;
return pos;
}
//从键盘或文件读入 num个学生信息
int input(FILE* fp,STUDENT* stu,int num) {
for(int i=0; i<num; ++i) {
if(fp==NULL) {
scanf("%ld%s%d%d%d",&stu[i].id,stu[i].name,
&stu[i].math,&stu[i].chiness,&stu[i].english);
stu[i].total=stu[i].math+stu[i].chiness+stu[i].english;
} else {
fscanf(fp,"%ld%s%d%d%d%d",&stu[i].id,stu[i].name,
&stu[i].math,&stu[i].chiness,&stu[i].english,&stu[i].total);
}
}
return 0;
}
//输出学生信息
void output(FILE* fp,STUDENT* stu,int num) {
//如在屏幕上显示则输出标题
if(fp==NULL)
printf("\n%10s\t%10s\t数学\t语文\t英语\t总成绩\n","学号","姓名");
//输出学生信息至屏幕/文件
for(int i=0; i<num; ++i)
if(fp==NULL) {
printf("%010d\t%10s\t%4d\t%4d\t%4d\t%4d\n",stu[i].id,
stu[i].name,stu[i].math,stu[i].chiness,stu[i].english,stu[i].total);
} else {
fprintf(fp,"%010d\t%10s\t%4d\t%4d\t%4d\t%4d\n",stu[i].id,
stu[i].name,stu[i].math,stu[i].chiness,stu[i].english,stu[i].total);
}
}
//主菜单,返回1-6选项;
int menu() {
int ch=0;
printf("\n1:创建学生信息文件并输出\n2:按学号排序并输出\n3:按姓名排序并输出\n4:增加学生信息\n5:删除某学生的数据\n6:退出程序\n");
printf("请选择:");
while(ch<'1'||ch>'6')
ch=getchar();
return ch;
}
//1:创建学生信息文件并输出,返回学生数量
int create_stu_info() {
int num;
STUDENT stu[N];
FILE* fp=fopen("student.data","w+");
printf("\n请输入学生数量:");
scanf("%d",&num);
printf("请按格式输入:学号\t姓名\t数学\t语文\t英语\n");
input(NULL,stu,num);//从键盘读入学生信息
output(fp,stu,num);//保存到文件
fclose(fp);
printf("保存成功,学生信息如下:\n");
output(NULL,stu,num);//在屏幕上显示
return num;
}
//2:按学号排序并输出
int sort_by_id(STUDENT* s,int num) {
FILE* fp=fopen("student.data","r");
printf("\n一共有%d名学生;",num);
//从文件中读入学生信息到数组s
input(fp,s,num);
fclose(fp);
//按id 排序
qsort(s,num,sizeof(STUDENT),cmp_id);
//保存到文件
fp=fopen("s_no.data","w");
output(fp,s,num);
fclose(fp);
//在屏幕上显示
printf("按ID排序后的信息如下:\n");
output(NULL,s,num);
return 0;
}
//3:按姓名排序并输出
int sort_by_name(STUDENT* s,STUDENT* s_name,int num) {
//将s复制到s_name
for(int i=0; i<num; ++i)
s_name[i]=s[i];
//按姓名排序
qsort(s_name,num,sizeof(STUDENT),cmp_name);
//保存到文件中
FILE* fp=fopen("s_name.data","w");
output(fp,s_name,num);
fclose(fp);
//在屏幕上显示
printf("\n按姓名排序后的信息如下:\n");
output(NULL,s_name,num);
return 0;
}
//4:增加学生信息,返回增加后的学生数量
int insert_stu(STUDENT* s,int num) {
STUDENT tmp;
printf("请按格式输入一名学生信息:学号\t姓名\t数学\t语文\t英语\n");
//从键盘读入一名学生信息
input(NULL,&tmp,1);
//寻找合适的安插位置
int pos=find_id(s,num,tmp.id);
//插入学生信息
for(int i=num; i>pos; --i)
s[i]=s[i-1];
s[pos]=tmp;
++num;
//在屏幕上显示
output(NULL,s,num);
return num;
}
//5:删除某学生的数据
int delete_stu(STUDENT* s,int num) {
long id;
printf("请输入需删除的学号:");
scanf("%ld",&id);
//按学号查找某学生
int pos=find_id(s,num,id);
//如找到,删除之
if(s[pos].id==id) {
for(int i=pos; i<num; ++i)
s[i]=s[i+1];
--num;
} else printf("\n未找到学号为: %d 的学生\n",id);
//在屏幕上显示
output(NULL,s,num);
return num;
}
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{ //这里不是交换 i 和 j,而是交换 i 和 k
team=s[i];
//s[i]=s[j];
//s[j]=team;
s[i]=s[k];
s[k]=team;
}
}
write(s,num,2);
}
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=1;i<num;i++)
{
for (k=0; k< num-i; k++)
{
if(s[k].id>s[k+1].id)
{
team=s[k];
s[k]=s[k+1];
s[k+1]=team;
}
write(s,num,2);
}
排序参考一下#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define N 30
typedef struct student
{
long id;
char name[20];
int score[4];
}STUDENT;
void write(STUDENT stu[],int num,int x);
void read(STUDENT s[],int num);
void print(STUDENT s[],int num);
void px(STUDENT s[],int num);
void px_as_name(STUDENT s[],int num);
void copy(STUDENT s[],int num);
int main()
{
STUDENT s[N];
int n,num=5;
printf("1:创建学生信息文件并输出;\n2:按学号排序并输出;\n3:按姓名排序并输出;\n4:增加学生信息;\n5:删除某学生的数据;\n");
do{
scanf("%d",&n);
switch(n)
{
case 1:
read(s,num);
print(s,num);
break;
case 2:
px(s,num);
print(s,num);
break;
case 3:
px_as_name(s,num);
print(s,num);
break;
}
}while(n!=6);
return 0;
}
void write(STUDENT stu[],int num,int x)
{
FILE *fp;
int i,j ;
//if(x=1)
if(x==1)
{
if((fp=fopen("E:\\c语言作业寒假\\student.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
else
{
if((fp=fopen("E:\\c语言作业寒假\\sno.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
for(i=0;i<num;i++)
{
fprintf(fp,"%010ld%8s",stu[i].id,stu[i].name);
for(j=0;j<4;j++)
{
fprintf(fp,"%4d",stu[i].score[j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}
void read(STUDENT s[],int num)
{
FILE *fp;
int i,j;
if((fp=fopen("E:\\c语言作业寒假\\student.data","r"))==NULL)
{
printf("错误\n");
exit(0);
}
for(i=0;i<num;i++)
{
fscanf(fp,"%ld",&s[i].id);
fscanf(fp,"%s",s[i].name);
for(j=0;j<4;j++)
{
fscanf(fp,"%d",&s[i].score[j]);
}
}
fclose(fp);
}
void print(STUDENT s[],int num)
{
int i,j;
printf(" 学号\t\t姓名\t数学\t语文\t英语\t总成绩\n");
for(i=0;i<num;i++)
{
printf("%010ld%10s",s[i].id,s[i].name);
for(j=0;j<4;j++)
{
printf("%8d",s[i].score[j]);
}
printf("\n");
}
}
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}
void px_as_name(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(strcmp(s[k].name, s[j].name) > 0)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}