最新最全版本,专治期末课程设计没思路,看不懂,0基础快速上手,复制代码可直接运行~
欢迎批评指正,不明白的地方可以留言交流!
一、程序设计目的
使用C语言编写学生成绩管理系统,一方面拓展学生在文件、结构体、指针等方面的C语言知识,另一方面使学生运用所学理论知识进行实践开发,更好的培养学生综合学习能力和实践能力。
二、运行环境
vim+gcc+gdb
三、程序功能
- 能够记录学生信息包括但不限于学号、姓名、性别、电话号码、C语言程序设计、计算机网络、数据结构
- 读写保存了学生成绩记录的文件
- 实现学生成绩的增删改查
- 实现学生总成绩的排序功能
四、思路
使用一个while循环,展示菜单,用户可以选择增删查改或者退出。利用switch选择函数,在具体的函数中实现功能。每次操作后会对文件进行读写,保存所做的修改。
五、数据结构
使用顺序表保存学生的信息:
typedef struct{
int nstudent;
student stu[MAX];
}*studentDB;
结构体用来存储学生的基本信息:
typedef struct {
int id;
char name[40];
char sex[10];
int number;//学号
int c;//c语言成绩
int web;//计算机网络成绩
int data;//数据结构成绩
int sum;//总分
}*student,student1;
六、读文件中的数据
执行IO主要分为三个步骤——打开文件使用fopen等函数,进行读写,关闭文件使用fclose。
FILE *fopen(const char *filename, const char *mode)
用于以按照mode模式打开filename指定的文件,检查返回值不为NULL。
int fscanf(FILE *stream, const char *format, …)
从流 stream 读取格式化输入
void read (studentDB db)
{
FILE *fp;//文件结构指针
fp=fopen("record.txt","r");//以只读方式打开record.txt文件
if (fp==NULL)
{ printf("打开失败!");
return;
}
while(!feof(fp))//当到达文件末尾时停止读取
{
db->stu[db->nstudent]=(student)malloc(sizeof(student1));
fscanf(fp,"%d %s %s %d %d %d %d %d ",&db->stu[db->nstudent]->id,db->stu[db->nstudent]->name,db->stu[db->nstudent]->sex,&db->stu[db->nstudent]->number,&db->stu[db->nstudent]->c,&db->stu[db->nstudent]->web,&db->stu[db->nstudent]->data,&db->stu[db->nstudent]->sum);
db->nstudent++;
}
fclose(fp);//关闭文件
printf("读入成功!\n");
}
七、排序功能
使用冒泡排序法按照总分以递减规律排序。
冒泡排序的原理:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
void sort(studentDB db)
{
int i=0,j=0;
student temp;
temp=(student)malloc(sizeof(student));
for(i=1;i<db->nstudent;i++)
{
for(j=0;j<db->nstudent-i;j++)//从第0个到n-i个,分别与后面一个两两比较
{
if (db->stu[j]->sum < db->stu[j+1]->sum)//顺序不满足递减时进行交换
{
temp=db->stu[j];
db->stu[j]=db->stu[j+1];
db->stu[j+1]=temp;
}
}
}
八、完整源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct {
int id;
char name[40];
char sex[10];
int number;//学号
int c;//c语言成绩
int web;//计算机网络成绩
int data;//数据结构成绩
int sum;//总分
}*student,student1;
typedef struct{
int nstudent;
student stu[MAX];
}*studentDB;
void menu();
void add(studentDB db);
void del(studentDB db);
void search(studentDB db);
void update(studentDB db);
void sort(studentDB db);
void display(studentDB db);
void read (studentDB db);
void save (studentDB db);
int main ()
{ int a;
studentDB db;
db= (studentDB)malloc(sizeof(*db));
db->nstudent=0;
read(db);
while(1)
{
menu();
scanf("%d",&a);
//getchar();
switch(a)
{
case 1:
add(db);
break;
case 2:
del(db);
break;
case 3:
search(db);
break;
case 4:
update(db);
break;
case 5:
display(db);
break;
case 6:
sort(db);
break;
case 7:
exit(0);
break;
default:
printf("请输入正确选项!");
}
save(db);
}
return 0;
}
void menu()
{
printf("********欢迎使用成绩管理系统********\n");
printf("\t1.增加学生成绩\t\t\n");
printf("\t2.删除学生成绩\t\t\n");
printf("\t3.查找学生成绩\t\t\n");
printf("\t4.修改学生成绩\t\t\n");
printf("\t5.显示学生成绩\t\t\n");
printf("\t6.按总分排列成绩\t\n");
printf("\t7.退出系统\t\t\n");
printf("请选择操作:\n");
}
void read (studentDB db)
{
FILE *fp;//文件结构指针
fp=fopen("record.txt","r");//以只读方式打开record.txt文件,要求此时必须存在此文件
if (fp==NULL)
{ printf("打开失败!");
return;
}
while(!feof(fp))
{
db->stu[db->nstudent]=(student)malloc(sizeof(student1));
fscanf(fp,"%d %s %s %d %d %d %d %d ",&db->stu[db->nstudent]->id,db->stu[db->nstudent]->name,db->stu[db->nstudent]->sex,&db->stu[db->nstudent]->number,&db->stu[db->nstudent]->c,&db->stu[db->nstudent]->web,&db->stu[db->nstudent]->data,&db->stu[db->nstudent]->sum);
db->nstudent++;
}
fclose(fp);
printf("读入成功!\n");
}
void save (studentDB db)
{
FILE *op;
op=fopen("record.txt","w");
if (op==NULL){
printf("打开失败!\n");
return;
}
for(int i=0;i<db->nstudent;i++)
{
fprintf(op,"%d %s %s %d %d %d %d %d\n",db->stu[i]->id,db->stu[i]->name,db->stu[i]->sex,db->stu[i]->number,db->stu[i]->c,db->stu[i]->web,db->stu[i]->data,db->stu[i]->sum);
}
printf("保存成功!\n");
fclose(op);
}
//1.创建变量分配内存 2.输入数据
void add(studentDB db)
{
db->stu[db->nstudent]=(student)malloc(sizeof(student1));
printf("学号 姓名 性别 电话 C语言 计算机网络 数据结构 总分\n");
scanf("%d %s %s %d %d %d %d %d",&db->stu[db->nstudent]->id,db->stu[db->nstudent]->name,db->stu[db->nstudent]->sex,&db->stu[db->nstudent]->number,&db->stu[db->nstudent]->c,&db->stu[db->nstudent]->web,&db->stu[db->nstudent]->data,&db->stu[db->nstudent]->sum);
db->nstudent++;
}
void del(studentDB db)
{ int i,j,sid;
printf("请输入要删除的学生的学号:");
scanf("%d",&sid);
for(i=0;i<db->nstudent;i++)
{
if(sid==db->stu[i]->id)
{
printf("找到该学生!\n");
db->stu[i]=db->stu[i+1];
printf("删除成功!\n");
}
}
db->nstudent--;
}
void search(studentDB db)
{
int sid,i=0;
printf("请输入学号查找:");
scanf("%d",&sid);
for(i=0;i< db->nstudent;i++)
{
if(sid==db->stu[i]->id)
{
printf("找到该学生!\n");
printf("%d %s %s %d %d %d %d %d\n",db->stu[i]->id,db->stu[i]->name,db->stu[i]->sex,db->stu[i]->number,db->stu[i]->c,db->stu[i]->web,db->stu[i]->data,db->stu[i]->sum);
}
}
}
void update(studentDB db)
{
int sid,i=0;
printf("请输入要修改的学生的学号:\n");
scanf("%d",&sid);
for(i=0;i<db->nstudent;i++)
{
if(sid==db->stu[i]->id)
{
printf("找到该学生!\n");
printf("请输入改后成绩:C语言 计算机网络 数据结构 总分\n");
scanf("%d %d %d %d",&db->stu[i]->c,&db->stu[i]->web,&db->stu[i]->data,&db->stu[i]->sum);
printf("修改成功!\n");
}
}
}
void sort(studentDB db)
{
int i=0,j=0;
student temp;
temp=(student)malloc(sizeof(student));
for(i=1;i<db->nstudent;i++)
{
for(j=0;j<db->nstudent-i;j++)
{
if (db->stu[j]->sum < db->stu[j+1]->sum)
{
temp=db->stu[j];
db->stu[j]=db->stu[j+1];
db->stu[j+1]=temp;
}
}
}
printf("排序完成!\n");
}
void display(studentDB db)
{
int i=0;
printf("学号 姓名 性别 电话 C语言 计算机网络 数据结构 总分\n");
for(i=0;i< db->nstudent;i++)
{
printf("%d %s %s %d %d %d %d %d\n",db->stu[i]->id,db->stu[i]->name,db->stu[i]->sex,db->stu[i]->number,db->stu[i]->c,db->stu[i]->web,db->stu[i]->data,db->stu[i]->sum);
}
printf("已全部显示!\n");
}