代码如下:
#include
#include
#include
#include
#include
typedef struct examinee //考生信息结构
{ char examno[20]; //准考证号
char name[10]; //姓名
char sex[4]; //性别
short age; //年龄
char examtype[10]; //报考科目
}ElemType;
typedef struct Node //定义链表结点
{
ElemType data; //数据域
struct Node *next; //指针域
}Node,*List,*position;
List make_empty( List L ); //创建一个带头结点的空表
int is_empty( List L ); //测试链表是否是空表
int is_last( position p, List L ); //测试当前位置是否是表尾
position make_node( position p,int n ); //创建结点并输入考生信息
void put_information( position p ); //是否输出该考生信息
void put_name_information( List L ); //输出姓名为xx的考生信息
int put_pos_information( position p ); //输出该地址考生信息
void link_to_tail( List L, position p ); //将结点连接到表尾
int ciculation_make(); //循环创建考生信息
int judge_put_all(); //是否输出所有考生信息
void put_all(List L); //输出所有考生信息。
position find( List L ); //查找第一个姓名为xx的元素并返回位置
position find_previous( List L ); //查找第一个姓名为xx的元素并返回该元素直接前驱的位置
//int judge_delete_val(); //询问是否删除考生数据
int delete_val( List L ); //删除指定考生信息并输出其信息
void menu(List L); //菜单函数
List L;
//position p;
int
main( void )
{
List L = NULL; //定义头结点指针
position p = NULL; //定义表工作指针
L = make_empty( L ); //创建空表
printf("\t\t\t★★考生报名管理程序★★\n\t\t----------------------------------------\n");
menu(L);
return 0;
}
//创建一个带头结点的空表
List
make_empty( List L)
{
L = ( List ) malloc (sizeof( Node ));
if(NULL == L)
{
printf("内存分配失败");
exit( 1 );
}
L->next = NULL;
//printf("空表创建成功。\n");
return L;
}
//创建结点并输入考生信息
position
make_node( position p ,int n)
{
if(n) //n为1是创建结点并输入,n为0是修改
{
p = ( position ) malloc ( sizeof ( Node ));
p->next = NULL ;
}
printf("请输入考生准考证号:");
gets(p->data.examno);
printf("请输入考生姓名:");
gets(p->data.name);
do
{
printf("请输入考生性别,只能输入“男”或者“女”:");
gets(p->data.sex);
}
while( 0 != strcmp( p->data.sex, "男" ) && 0 != strcmp( p->data.sex, "女" )); //判断性别是否有误
printf("请输入考生年龄:");
scanf("%hd",&p->data.age);
getchar(); //如果把这句删掉,就“无法执行”下面的报考类别
/*下面的do while用来判断报考类别是否输入有误*/
do
{
printf("请输入报考类别,只能输入“数学”或“英语”或者“数据结构”:");
gets(p->data.examtype);
}
while( 0 != strcmp( "英语", p->data.examtype ) && 0 != strcmp( "数学", p->data.examtype ) && 0 != strcmp( "数据结构", p->data.examtype ));
if(n)
{
printf("报名成功\n");
}
else
{
printf("修改成功\n");
}
return p;
}
//前插法;
void
link_to_tail( List L, position p)
{
p->next = L->next;
L->next = p;
}
//查找第一个姓名为xx的元素并返回位置
position
find( List L )
{
position p = L->next;
char name[10];
printf("请输入你要查找的考生姓名:");
gets(name);
while( p != NULL && 0 != strcmp( p->data.name , name))
{
p=p->next;
}
return p;
}
//测试链表是否是空表
int
is_empty( List L )
{
return L->next == NULL;
}
//测试当前位置是否是表尾
int
is_last( position p, List L )
{
return p->next == NULL;
}
//输出姓名为xx的考生信息
void
put_name_information( List L )
{
position p = find(L);
if(p!=NULL)
{
printf("您要查找的考生信息:\n");
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
}
else
{
printf("没有您要找的学生。\n");
}
}
//循环创建考生信息
int
ciculation_make()
{
int n = 2;
do
{
printf("是否继续创建考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//是否输出考生信息
void
put_information( position p )
{
int n=2;
do
{
printf("是否输出该考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
if(n)
{
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
}
}
//是否输出所有考生信息
int
judge_put_all()
{
int n = 2;
do
{
printf("是否输出所有考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//输出所有考生信息
void
put_all(List L)
{
if(L->next == NULL)
{
printf("现无考生报名!\n");
}
else
{
position p=L->next;
while( p != NULL )
{
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
p=p->next;
}
}
//getchar();
}
//询问是否删除考生数据
int
judge_delete_val()
{
int n = 2;
do
{
printf("是否要删除某个考生数据?是请输入“1”,不是输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//查找第一个姓名为xx的元素并返回其直接前驱的位置
position
find_previous( List L )
{
position q = L;
position p = L->next;
char name[10];
printf("请输入你要查找的考生姓名:");
gets(name);
while( p != NULL && 0 != strcmp( p->data.name , name))
{
q=p;
p=p->next;
}
if( p != NULL )
{
return q;
}
else
return p;
}
//删除指定考生信息并输出其信息
int
delete_val(List L)
{
int n=2;
position q=NULL;
position p=find_previous( L ); //返回考生信息地址
if( NULL == p )
{
printf("你要删除的考生不存在\n");
return 0;
}
else
{
q = p->next;
p->next = q->next;
printf("删除成功。\n删除的考生信息为:\n");
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",q->data.examno,q->data.name,q->data.sex,q->data.age,q->data.examtype);
free(q);
return 1;
}
}
//输出该地址考试信息
int
put_pos_information( position p )
{
if(p != NULL )
{
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
return 1;
}
else
{
printf("没有您要查找的学生。");
return 0;
}
}
//菜单函数
void
menu(List L)
{
printf("\t\t\t a. 考生报名入口\n");
printf("\t\t\t b. 查询考生信息\n");
printf("\t\t\t c. 修改考生信息\n");
printf("\t\t\t d. 删除考生信息\n");
printf("\t\t\t e. 全部考生信息\n");
printf("\t\t\t f. 程序作者信息\n");
printf("\t\t\t g. 退出程序\n");
char n='h';
while(n != 'g')
{
do //确定正确输入
{
printf("请通过字母序号选择功能:");
n = getchar();
getchar();
putchar('\n');
if( n < 'a' || n > 'g')
{
printf("错误的字母序号。\n");
}
}
while( n < 'a' || n > 'g' );
switch (n)
{
case 'a':
{
printf("请输入报名考生信息:\n");
position p = make_node( p, 1 ); //创建新结点
link_to_tail( L, p ); //将新结点连接到表上
put_information( p ); //是否输出该考生信息
putchar('\n');
}
break;
case 'b':
{
put_name_information( L );
putchar('\n');
}
break;
case 'c':
{
int n=0;
position p = NULL;
printf("您正在进行修改操作。\n");
p = find(L);
n = put_pos_information( p );
if(n)
{
make_node( p , 0 );
put_information( p ); //是否输出该考生信息
}
putchar('\n');
}
break;
case 'd':
{
printf("您正在进行删除操作。\n");
delete_val( L );
putchar('\n');
}
break;
case 'e':
{
put_all( L );
putchar('\n');
}
break;
case 'f':
{
printf(" 修改日期 版本号 修改人 修改内容 \n");
printf(" --------------------------------------------------------\n");
printf(" 2018.6.19 v2.0 陈百川 增加主菜单\n");
printf(" 2018.6.23 v3.0 陈百川 增加生成文件功能\n\n");
printf(" 该版本号为v2.0\n");
putchar('\n');
}
break;
default:
break;
}
}
printf(" 感谢本次使用,祝您生活愉快。");
getch();
}
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。[1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
百度百科——C语言
/*引用库函数*/
#include
#include
#include
/*定义结构体数组*/
typedef struct
{
char num[12]; /*学号*/
char name[20]; /*姓名*/
char sex[2]; /*性别*/
int score[3]; /*成绩*/
float avg; /*平均分*/
int sum; /*总成绩*/
}Student;
Student studentAll[80]; /*结构体数组*/
int student_number = 0; /*总人数*/
/*菜单函数*/
int menu_select()
{
int check_number;
do{
system("cls"); /*运行前清屏clear screen,在stdlib.h中*/
printf("\t★☆☆☆☆☆☆学生成绩管理系统☆☆☆☆☆☆★\n"); /*菜单选择*/
printf("\t★| 1. 添加学生信息 |★\n");
printf("\t★| 2. 显示学生信息 |★\n");
printf("\t★| 3. 按学号排序 |★\n");
printf("\t★| 4. 按总成绩排序 |★\n");
printf("\t★| 5. 查找单个学生 |★\n");
printf("\t★| 6. 删除指定学生 |★\n");
printf("\t★| 7. 修改学生信息 |★\n");
printf("\t★| 8. 查看各门课程的成绩情况 |★\n");
printf("\t★| 9. 待定功能 |★\n");
printf("\t★| 0. 保存退出 |★\n");
printf("\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n");
printf("请输入选择(0-9):");
scanf("%d",&check_number); /*读入选择*/
}while(check_number<0||check_number>9);
return(check_number); /*返回选择*/
}
//以下的student都是形式参数,真正的数组是在全局变量里定义的studentAll数组
/*输入若干条记录*/
void Input(Student student[])
{
int i=0,j;
char flag,clear[10]; /*clear[10]为清除多余的数据所用*/
char studentNum[12]; //暂存某学生学号
//判断是否已经存在相同学生的学号
while(flag!='n'&&flag!='N') //判断flag是不是n/N,以此判断是否继续输入学生信息
{
printf("请输入学生学号: ");
scanf("%s",studentNum);
while(strcmp(student[i].num,studentNum)!=0&&i
i++; /*查找判断*/
}
//查找到学生,无法增加学生信息,返回主函数
if(i
//如果没有查找到学生,即可增加学生信息
else
{ if(i==student_number)
{memset(student[i].num, 0, sizeof(student[i].num));//字符串清空
strcpy(student[i].num,studentNum);
printf("学生姓名:");
scanf("%s",student[student_number].name);
printf("学生性别:");
scanf("%s",student[student_number].sex);
printf("c语言成绩:");
scanf("%d",&student[student_number].score[0]);
printf("数据结构成绩:");
scanf("%d",&student[student_number].score[1]);
printf("数据库成绩:");
scanf("%d",&student[student_number].score[2]);
student[student_number].sum=0;
for(j=0;j<3;j++)
student[student_number].sum+=student[student_number].score[j];
student[student_number].avg = (float)student[student_number].sum/3;
//printf("%.2f\n",student[student_number].avg);
gets(clear); //*清除多余的输入
printf("此学生信息录入完毕,是否继续?(Y/N)");
scanf("%c",&flag); //输入判断
student_number++;//总人数加1
i=0;}
}
}
}
/*显示所有记录*/
void Display(Student student[])
{
int i=0;
printf("——————————————————————————————————————\n");
printf("|学号 姓名 性别 C语言成绩 数据结构成绩 数据库成绩 平均成绩 总成绩|\n");
printf("——————————————————————————————————————\n");
while(i!=student_number)
{
printf("| %s %s %s %d %d %d %f %d\n",student[i].num,student[i].name,student[i].sex,student[i].score[0],student[i].score[1],student[i].score[2],student[i].avg,student[i].sum);
i=i+1;
}
}
/*按学号排序*/
void Sort_by_num(Student student[])
{
Student student_sort;
int i,j;
for(i=0;i
for(j=0;j
if(strcmp(student[j].num,student[j+1].num)>0)
{
student_sort=student[j];
student[j]=student[j+1];
student[j+1]=student_sort;
}
}
}
}
/*按总成绩排序*/
void Sort_by_sum(Student student[])
{
Student student_sort;
int i,j;
for(i=0;i
for(j=0;j
if(student[j].sum>student[j+1].sum)
{
student_sort=student[j];
student[j]=student[j+1];
student[j+1]=student_sort;
}
}
}
}
/*按姓名查找并显示一个记录*/
void Query_a_record(Student student[])
{
int i,j;
char findname[20]; //输入学生的姓名
scanf("%s",findname);
for(j=0;j
if(strcmp(student[j].name,findname)==0)
{i=j;
} /*查找判断*/
}
printf("|学号 姓名 性别 C语言成绩 数据结构成绩 数据库成绩 平均成绩 总成绩|\n");
printf("———————————————————————————————————————\n");
printf("| %s %s %s %d %d %d %f %d\n",student[i].num,student[i].name,student[i].sex,student[i].score[0],student[i].score[1],student[i].score[2],student[i].avg,student[i].sum);
}
/*按学号查找,删除一条记录*/
void Delete_a_record(Student student[])
{
int i,j;
char findname[20];
printf("请输入将要删除的学生名字"); //输入学生的姓名
scanf("%s",findname);
for(j=0;j
if(strcmp(student[j].name,findname)==0)
{
i=j;
}
} /*查找判断*/
for(;i
student[i]=student[i+1];
}
student_number--;
}
/*修改学生信息*/
void modifyStudentinformation(Student student[])
{
char changenum[20];
int i=0;
printf("输入将要修改的学生学号");
scanf("%s",changenum);
while(strcmp(student[i].num,changenum)!=0&&i
i++; /*查找判断*/
}
if(i
printf("输入新的学生学号");
scanf("%s",student[i].num);
printf("输入新的学生姓名:");
scanf("%s",student[i].name);
printf("输入新的学生性别:");
scanf("%s",student[i].sex);
printf("输入新的c语言成绩:");
scanf("%d",&student[i].score[0]);
printf("输入新的数据结构成绩:");
scanf("%d",&student[i].score[1]);
printf("输入新的数据库成绩:");
scanf("%d",&student[i].score[2]);
}
student[i].sum=student[i].score[0]+student[i].score[1]+student[i].score[2];
student[i].avg=(float)student[i].sum/3;
}
/*查看各门课程的成绩情况*/
void showClass(Student student[])
{
int i;
int score[3]={0,0,0};
int average[3]={0,0,0};
for(i=0;i
score[0]=score[0]+student[i].score[0];
score[1]=score[1]+student[i].score[1];
score[2]=score[2]+student[i].score[2];
}
average[0]=score[0]/student_number;
average[1]=score[1]/student_number;
average[2]=score[2]/student_number;
printf("C语言的平均成绩是 %d总成绩是%d\n",average[0],score[0]);
printf("数据结构的平均成绩是%d总成绩是%d\n",average[1],score[1]);
printf("数据库的平均成绩是 %d总成绩是%d\n",average[2],score[2]);
}
/*从文件中读入数据*/
void AddfromText(Student student[])
{
int i=0;
int number = 0;
FILE *fp; /*定义文件指针*/
if((fp=fopen("C:\\xin\\student2.txt","rb"))==NULL) /*打开二进制文件,如果不存在则创建*/
{
fp=fopen("C:\\xin\\student2.txt","wb");
}
fscanf(fp,"共有%d条记录\n",&student_number); /*读入总记录量*/
while(i
fscanf(fp,"%s %s %s %d %d %d %f %d\n",student[i].num,student[i].name,student[i].sex,&student[i].score[0],&student[i].score[1],&student[i].score[2],&student[i].avg,&student[i].sum);
i++;
}
fclose(fp);
}
/*将所有记录写入文件*/
WritetoText(Student student[])
{
int i=0;
FILE *fp;
fp=fopen("C:\\xin\\student2.txt","wb");
fprintf(fp,"共有%d条记录\n",student_number);
while(i
fprintf(fp," %s %s %s %d %d %d %f %d\n",student[i].num,student[i].name,student[i].sex,student[i].score[0],student[i].score[1],student[i].score[2],student[i].avg,student[i].sum);
i++;
}
fclose(fp);
}
/*主函数*/
int main()
{
AddfromText(studentAll);
for(;;)
{
switch(menu_select()) /*选择判断*/
{
case 1:
printf("插入学生信息\n"); /*输入若干条记录*/
Input(studentAll);
break;
case 2:
printf("显示记录\n"); /*显示所有记录*/
Display(studentAll);
system("pause");
break;
case 3:
printf("按学号排序\n");
Sort_by_num(studentAll); /*按学号排序*/
printf("按学号排序成功!\n");
Display(studentAll);
system("pause");
break;
case 4:
printf("按总成绩排序\n");
Sort_by_sum(studentAll); /*按总成绩排序*/
printf("按总成绩排序成功!\n");
Display(studentAll);
system("pause");
break;
case 5:
printf("查找单个学生\n");
Query_a_record(studentAll); /*按姓名查找学生*/
system("pause");
break;
case 6:
printf("删除指定学生\n");
Delete_a_record(studentAll); /*按姓名查找,删除一条记录*/
system("pause");
break;
case 7:
printf("修改学生信息\n");
modifyStudentinformation(studentAll); /*修改学生信息*/
system("pause");
break;
case 8:
printf("查看各门课程的成绩情况\n");
showClass(studentAll); /*查看各门课程的成绩情况*/
system("pause");
break;
case 9:
printf("待定功能\n");
printf("功能描述");
system("pause");
break;
case 0:
WritetoText(studentAll);
printf("已保存,退出系统\n"); /*结束程序*/
system("pause");
exit(0);
}
}
}
#include
#include
#include
void frist_print()
{
printf("\t\t********************************\n\n"); //欢迎信息
printf("\t\t\t欢迎进入学生成绩系统\n");
}
void menu()
{
printf("\n\t\t********************************\n"); //管理菜单
printf("\t\t==\t1.录入学生成绩\n\t\t+\n");
printf("\t\t==\t2.显示学生成绩\n\t\t+\n");
printf("\t\t==\t3.查询学生成绩\n\t\t+\n");
printf("\t\t==\t4.添加学生成绩\n\t\t+\n");
printf("\t\t==\t5.修改学生成绩\n\t\t+\n");
printf("\t\t==\t6.删除学生成绩\n\t\t+\n");
printf("\t\t==\t7.清空页面\n\t\t+\n");
printf("\t\t==\t8.退出系统\n");
printf("\t\t********************************\n");
printf("please choise 1--8:\t");
putchar(10);
}
struct MM // 结构体定义变量
{
char num[20];
char name[10];
float pay;
int many;
}mm;
void scanf_1() //第一次输入信息并保存在文件中
{
char ch;
FILE *fp;
if((fp=fopen("dd.dat","wb+"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
do
{
printf("请输入成绩的--编号:\t");
getchar();
gets(mm.num);
printf("姓名:\t");
gets(mm.name);
printf("成绩:\t");
scanf("%f",&mm.pay);
printf("学号:\t");
scanf("%d",&mm.many);
if(fwrite(&mm,sizeof(struct MM),1,fp)!=1)
{
printf("file write error\n");
exit(0);
}
printf("是否继续输入y or n ?\t");
getchar();
ch=getchar();
}while(ch=='y'||ch=='Y');
fclose(fp);
}
void find() //查询成绩的信息
{ int a,b=0;
char ch[20];
FILE *fp;
if((fp=fopen("dd.dat","rb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
printf("请输入要查询的成绩的方式\n\t1.编号 2.姓名:\n\t请选择 1 or 2 \t");
scanf("%d",&a);
if(a==1)
{ getchar();
printf("请输入成绩的编号:\t");
gets(ch);
while(fread(&mm,sizeof(struct MM),1,fp)==1)
if(strcmp(mm.num,ch)==0)
{
b++;
printf("编号\t姓名\t价格\t\t学号\n");
printf("%s\t%s\t%.3f\t\t%d\n",mm.num,mm.name,mm.pay,mm.many);
}
if(b==0) printf("对不起!没有找到相关信息:\n");
}
else if(a==2)
{ printf("请输入成绩的姓名:\t");
getchar();
gets(ch);
while(fread(&mm,sizeof(struct MM),1,fp)==1)
if(strcmp(mm.name,ch)==0)
{
b++;
printf("编号\t姓名\t价格\t\t学号\n");
printf("%s\t%s\t%.3f\t\t%d\n",mm.num,mm.name,mm.pay,mm.many);
}
if(b==0) printf("input error!\n");
}
fclose(fp);
}
void scanf_2() //第二次输入信息并保存在文件中
{
char ch;
FILE *fp;
if((fp=fopen("dd.dat","ab"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
do
{
printf("请输入要添加成绩的--编号:\t");
getchar();
gets(mm.num);
printf("姓名:\t");
gets(mm.name);
printf("价格:\t");
scanf("%f",&mm.pay);
printf("学号:\t");
scanf("%d",&mm.many);
if(fwrite(&mm,sizeof(struct MM),1,fp)!=1)
{
printf("file write error\n");
exit(0);
}
printf("是否继续输入y or n ?\t");
getchar();
ch=getchar();
}while(ch=='y'||ch=='Y');
fclose(fp);
}
void print() //输出文档中的信息
{
FILE *fp;
if((fp=fopen("dd.dat","rb"))==NULL)
{
printf("cannot open file\n");
return ;
}
printf("编号\t姓名\t价格\t\t学号\n");
while(fread(&mm,sizeof(struct MM),1,fp)==1)
printf("%s\t%s\t%.3f\t\t%d\n",mm.num,mm.name,mm.pay,mm.many);
fclose(fp);
}
void change()
{ //修改信息的函数,定义另一个文件,把要修改的信息放到该文件中
struct XX //然后把其余的信息复制到该文件中;并把该文件从新命名为原来的名
{ //把原来的文件移除;
char num[20];
char name[10];
float pay;
int many;
}xx;
FILE *fp2;
int a,b=0,c=0,n=0;
char ch[20],ck;
FILE *fp;
do{
if((fp=fopen("dd.dat","rb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
if((fp2=fopen("temp.dat","wb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
printf("请输入要修改成绩的编号:\t");
scanf("%s",ch);
n++;
while(fread(&mm,sizeof(struct MM),1,fp)==1)
{
if((strcmp(mm.num,ch)==0))
{
b++; //b的值如果一直没有改变说明,没有找到相关的信息;
printf("编号\t姓名\t价格\t\t学号\n");
printf("%s\t%s\t%.3f\t\t%d\n",mm.num,mm.name,mm.pay,mm.many);
getchar();
printf("请输入成绩的新编号:\t");
gets(xx.num);
printf("请输入成绩的新姓名:\t");
gets(xx.name);
printf("请输入成绩的新价格:\t");
scanf("%f",&xx.pay);
printf("请输入成绩新学号:\t");
scanf("%d",&xx.many);
getchar();
fwrite(&xx,sizeof(struct XX),1,fp2);
}
if(strcmp(mm.num,ch)!=0)
fwrite(&mm,sizeof(struct MM),1,fp2);
}
if(b==0)
{
printf("\t没有找到相关信息!\n");
getchar();
}
rewind(fp); //如果要继续修改的话,要把标记返回到文件的开头;
printf("是否继续修改?enter 'y' or 'n' \t");
ck=getchar();
fclose(fp);
fclose(fp2);
remove("dd.dat");
rename("temp.dat","dd.dat");
}while(ck=='y'||ck=='Y');
if(b!=0) //如果没有找到相关信息就不能输出
printf("\t修改成功:\n");
}
void del()
{ //删除函数和修改很相似
FILE *fp2;
int a,b=0,c=0,n=0;
char ch[20],ck;
FILE *fp;
do {
if((fp=fopen("dd.dat","rb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
if((fp2=fopen("temp.dat","wb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
printf("请输入要删除成绩的编号:\t");
scanf("%s",ch);
n++;
while(fread(&mm,sizeof(struct MM),1,fp)==1)
{
if((strcmp(mm.num,ch)==0))
{
b++; //b的值如果一直没有改变说明,没有找到相关的信息;
printf("编号\t姓名\t价格\t\t学号\n");
printf("%s\t%s\t%.3f\t\t%d\n",mm.num,mm.name,mm.pay,mm.many);
}
else if(strcmp(mm.num,ch)!=0)
fwrite(&mm,sizeof(struct MM),1,fp2);
}
if(b==0)
{
printf("\t没有找到相关信息!\n");
getchar();
}
rewind(fp);
getchar();
getchar();
printf("删除成功!");
getchar(); //如果要继续修改的话,要把标记返回到文件的开头;
printf("是否继续删除?enter 'y' or 'n' \t");
ck=getchar();
fclose(fp);
fclose(fp2);
remove("dd.dat");
rename("temp.dat","dd.dat");
}while(ck=='y'||ck=='Y');
if(b!=0) //如果没有找到相关信息就不能输出
printf("\t保存成功:\n");
}
void myexit()
{
int a;
char ch;
printf("\t是否确定退出?请选择 y or n: ");
getchar();
ch=getchar();
if(ch=='y'||ch=='Y') exit(0);
else
menu();
}
int main()
{
int a;
frist_print();
menu();
while(1)
{
scanf("%d",&a);
if(a==1)
scanf_1();
else if(a==2)
print();
else if(a==3)
find();
else if(a==4)
scanf_2();
else if(a==5)
change();
else if(a==6)
del();
else if(a==7)
system("cls");
else if(a==8)
myexit();
else printf("输入错误!!!请重新输入:\t");
printf("\t按任意键继续!\n");
getch();
menu();
}
getch();
}
一个成绩管理系统,注释不是太多,写的不太好,能运行,符合你初级水平。
满意请采纳。
这是成绩管理系统
一.需求分析
用动态链表储管理姓名、电话、住址、身份证等信息和具备添加、删除等编辑功能
可以通过身份证号码识别性别,省份,年龄
可以统计总人数,男生人数,女生人数,同一年龄段人数
可以通过姓名,身份证号查询与修改数据
具备较美观的界面与汉字提示
具备保存信息至文件,及从文件中读取信息的功能
用动态链表来储存数据,便于管理
二.概要设计
流程图
添加信息
声明一个结构体来储存数据,并通过声明指针来动态添加信息
显示信息
声明一个结构体指针,让指针等于头指针,并遍历所有节点,打印每个节点的信息
查询信息
1.获取用户的选择确定 用姓名查找或是身份证号查找
2.遍历所有节点,找到与用户输入相和的节点
3.打印该节点的信息
修改信息
1.获取用户的选择确定 用姓名查找或是用身份证号查找并修改
2.遍历所有节点,找到与用户输入相和的节点
3.开始修改该节点的姓名,身份证号,手机号
删除信息
1.获取用户的选择确定 用姓名查找并删除或是用身份证号查找并删除,及全部删除
2.遍历所有节点,找到与用户输入相和的节点的上一个节点的地址
3.将这个节点的next储存为下下个节点的地址
4.删除中间的节点
数据分析
1.遍历所有节点
2.依次辨别性别,年龄段
3.在储存总人数,男生人数,女生人数,年龄段的数据上添加人数
保存信息至文件
1.遍历每个节点
2.将每个节点的信息储存到文件中
3.每储存一个count便加一
4.打印储存数据的个数
从文件中读取数据
1.将文件中的数据依次添加到新的节点上
退出程序
将菜单的while(running)循环,running=0
三.详细设计
信息添加
struct IdCard
{
char num[20];
char phone[11];
int sex;
char city[20];
char name[20];
long age;
struct IdCard *next;
};
struct IdCard *head=NULL;//声明一个头节点作为全局变量,且使他为空
动态生成节点,并往节点中添加信息,生成动态链表
while(strcmp(pid1->num,str)!=0){
n++;
if(n==1) head=pid1;
else pid2->next=pid1;
pid2=pid1;
pid1=(struct IdCard*)malloc(sizeof(struct IdCard));
printf("请输入身份证号(按0退出):");
char str[]="0";//用来辨别
scanf("%s",pid1->num);
if(strcmp(pid1->num,str)==0) break;
在此处通过身份证号计算相应的年龄,性别,将这些信息添加到该节点上。
效果图如下
菜单样式
通过printf打印选项
在while中循环,使菜单一直刷新存在
在while中的最后加system(“pause”)使每个键盘信息能被显示出来
效果图如下:
显示信息
struct IdCard *pid;//遍历节点
pid=head;
通过遍历节点打印出所有节点的信息
效果图如下:
查询信息
int num;
printf("按1,身份证号查询\n按2,姓名查询:\n");
获取用户的选择
声明字符串变量来储存用户输入的姓名或身份证号
遍历所有节点,找到与用户相符合的那个节点,并打印
struct IdCard *pid;
pid=head;
while(pid){
if(strcmp(pid->num,num)==0){
printf("------------------------------显示所有信息---------------------------------------\n");
printf("身份证号 姓名 性别 省份 手机号 年龄\n");
printf("%18s ",pid->num);
printf("%-16s",pid->name);
printf("%-13s",pid->sex==1?"男":"女");
printf("%-14s",pid->city);
printf("%11s",pid->phone);
printf(" %d\n",pid->age);
printf("---------------------------------------------------------------------------------\n");
}
pid=pid->next;
}
效果图如下:
修改信息
获取用户的选择
ystem("cls");
char name[20];
printf("请输入要修改的名字(20个字节):\n");
while(1!=scanf("%s",name)){
printf("你的输入有误,请重新输入(20个字节):");
fflush(stdin);
选择相应的修改方式
遍历节点选到与用户输入相符的节点,并修改
struct IdCard *pid,*ptmp;
pid=head;
while(pid){
if(strcmp(pid->name,name)==0){
printf("请输入你要重写的身份证号:\n");
while(1!=scanf("%s",pid->num)||strlen(pid->num)!=18){
printf("你的输入有误,请重新输入(18位):");
fflush(stdin);
}
效果图如下:
保存信息至文件
以只写的二进制方式打开一个文件
FILE *pf = fopen("FILENAME", "wb");
遍历节点
struct IdCard *pid = head;
if(!pf)
{
printf("打开待写入的文件失败!\n");
return;
}
while(pid)
{
fwrite(pid, 1, sizeof(struct IdCard), pf);//把每位学生信息写入文件
i++;
pid = pid->next;
}
fclose(pf);
printf("\t\t\t成功写入%d信息",i);
将每个节点写入文件中,用frwite函数
声明一个变量来计算写入的信息数
效果图如下:
从文件中读取信息
以只读的二进制方式打开文件夹
FILE *pf;
struct IdCard *pid;
if((pf = fopen("FILENAME", "rb")) == NULL)
{
printf("文件还没有创建,请手工输入学生信息并保存吧!\n");
return;
}
申请新的空间将地址赋给节点
struct IdCard *pid1,*pid2;
pid1=pid2=(struct IdCard*)malloc(sizeof(struct IdCard));
fread(pid1,1,sizeof(struct IdCard),pf);
while(!feof(pf)){
i++;
if(head==NULL){
head=pid1;
}else{
pid2->next=pid1;
}
pid2=pid1;
pid1 = (struct IdCard*)malloc(sizeof(struct IdCard));
fread(pid1,1, sizeof(struct IdCard), pf);
}
fclose(pf);
printf("文件读取完毕!新增学生信息%d条。\n",i);
将文件信息写入节点中
将节点添加进动态链表中
声明一个变量来记录读出信息数量
效果图如下:
数据分析
遍历每个节点
int ManCount=0,
WomanCount=0,
age1Count=0,
age2Count=0,
count=0;
struct IdCard *pi;
pi=head;
while(pi){
count++;
if(pi->sex==1){
ManCount++;
}else{
WomanCount++;
}
if(pi->age>10&&pi->age<20)
age1Count++;
if(pi->age>20&&pi->age<40)
age2Count++;
pi=pi->next;
}
printf("\n");
printf("总共有%d个身份证\n男的占%d个\n女的占%d个\n年龄段在10到20岁之间的有%d个\n年龄段在20到40岁之间的有%d个\n",count,ManCount,WomanCount,age1Count,age2Count);
辨别每个节点的性别,年龄段
在相应的变量上加减
于是统计出了总信息数量,男生数量,女生数量,各年龄段数量
效果图如下:
四.测试结果
程序开始运行
回车键后显示菜单
添加信息
当身份证号输入的位数不够18位时,会报错,当手机号不够11位时,会报错重新输入
查询信息
删除一个信息
删除所有信息
修改信息
保存信息至文件
从文件中读取信息
显示所有信息
数据分析
五.用户使用说明
信息添加:
可以输入相应的身证号,名字与手机号。当身份证号与手机号的位数输入错误时,会有相应的提示,此时你可以重新输入。在输入信息结束时,可以按0
保存信息至文件
如果想要在下一次打开此程序时,还能看到相应的信息,一定要记得保存信息至文件,但此次保存文件会覆盖上一次的信息
从文件中读取信息
从文件中读取的信息会添加到你新写的信息后面,当显示所有信息时,会以链表形式逐个打印出来
查询信息
当你输入的信息查找不到时,此时不会打印任何信息,可按任意键回到菜单。
同样输入手机号和身份证号会检查你的位数对不对,不对的话,将提示你重新输入
修改信息
当你输入相应的身份证号或名字时,会让你把这个人的信息全部输入一次
删除所有信息
该选项将会删除你所有的信息,谨慎!
删除一个信息
可以选择你想删除的身份证号或名字,删除掉其中一个信息,不会影响其他信息
数据分析
会统计出总信息数量,男生数量,女生数量,各年龄段数量
退出程序
按0会退出程序,此次使用身份证信息管理系统结束
Hu118391 徊 c语言课程设计
希望我的回答,你能喜欢