功能要求
1.使用单链表实现
2.学生成绩应包含4科成绩和总成绩(C语言、数据结构、高数、英语)
3.建立学生成绩单并保存到文件中(直接从控制台获取)
4.打印学生成绩单
5.按学号或者姓名查找学生成绩单
6.删除指定学生的信息
7.修改学生信息
8.要有菜单显示
功能模块
1.定义学生信息结构体和单链表结构体
typedef struct student
{
char name[20];//姓名
char clas[20];//班级
char stuNumber[20];//学号
int grade[5];//4科成绩和总成绩
}student;
typedef struct stuNode
{
student data;
struct stuNode *next;
}stuNode;
2.头插法建立学生成绩单
void createStudentInfo(stuNode **head)
{
stuNode *newNode = (stuNode*)malloc(sizeof(stuNode));
printf("依次输入姓名 班级 学号 C语言 数据结构 高数 英语成绩:\n");
scanf("%s", newNode->data.name);
scanf("%s", newNode->data.clas);
scanf("%s",newNode->data.stuNumber);
scanf("%d %d %d %d", &(newNode->data.grade[0]), &(newNode->data.grade[1]), &(newNode->data.grade[2]), &(newNode->data.grade[3]));
newNode->data.grade[4] = newNode->data.grade[0] + newNode->data.grade[1] + newNode->data.grade[2] + newNode->data.grade[3];
if (*head == NULL)
{
newNode->next = NULL;
*head = newNode;
}
else
{
newNode->next = *head;
(*head) = newNode;
}
}
3.将成绩单导入到文件stu1中
void printToFile(stuNode *head)
{
stuNode *cur = head;
FILE *pfile;
pfile = fopen("C:\\Users\\user\\Desktop\\stu1.txt", "w");//以只写的方式打开一个文件stu1.txt
if (pfile == NULL)
{
printf("失败\n");
exit(-1);
}
while (cur)
{
fputs(cur->data.name, pfile);//项文件中写入字符串(name)
fputc(' ', pfile);//空格间隔开所输入的信息
fputs(cur->data.clas, pfile);
fputc(' ', pfile);
fputs(cur->data.stuNumber, pfile);
putc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[0]);//格式化写入文件
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[1]);
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[2]);
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[3]);
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[4]);
fputc('\n', pfile);
cur = cur->next;
}
fclose(pfile);
}
4.打印学生成绩单
void print(stuNode *head)
{
stuNode *cur = head;
while (cur)
{
printf("%s %s %s %d %d %d %d %d\n", cur->data.name, cur->data.clas, cur->data.stuNumber, cur->data.grade[0], cur->data.grade[1], cur->data.grade[2], cur->data.grade[3], cur->data.grade[4], cur->data.grade[5]);
cur = cur->next;
}
}
5.查找学生成绩(按照学号查找)
void search(stuNode *head,char *stuNumber)
{
stuNode *cur = head;
while (cur)
{
if (strcmp(cur->data.stuNumber, stuNumber) == 0)
{
printf("%s %s %s %d %d %d %d %d\n", cur->data.name, cur->data.clas, cur->data.stuNumber, cur->data.grade[0], cur->data.grade[1], cur->data.grade[2], cur->data.grade[3], cur->data.grade[4], cur->data.grade[5]);
return;
}
cur = cur->next;
}
printf("查无此人!\n");
}
6.删除指定学生的信息
void delete(stuNode *head, char *stuNumber)
{
stuNode *preCur = head;
stuNode *cur = head;
while (cur)
{
if (strcmp(cur->data.stuNumber, stuNumber) == 0)
{
preCur->next = cur->next;
free(cur);
return;
}
else
{
preCur = cur;
cur = cur->next;
}
}
printf("查无此人!\n");
}
7.修改指定学生的信息
void update(stuNode *head, char *stuNumber)
{
stuNode *cur = head;
while (cur)
{
if (strcmp(cur->data.stuNumber, stuNumber) == 0)
{
printf("请输入该学生的信息:\n");
scanf("%s", cur->data.name);
scanf("%s", cur->data.clas);
scanf("%s", cur->data.stuNumber);
scanf("%d %d %d %d", &(cur->data.grade[0]), &(cur->data.grade[1]), &(cur->data.grade[2]), &(cur->data.grade[3]));
cur->data.grade[4] = cur->data.grade[0] + cur->data.grade[1] + cur->data.grade[2] + cur->data.grade[3];
//更新文件
printToFile(head);
return;
}
else
{
cur = cur->next;
}
}
printf("查无此人\n");
}
8.菜单显示
c语言程序
.h文件
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<string.h>
typedef struct student
{
char name[20];//姓名
char clas[20];//班级
char stuNumber[20];//学号
int grade[5];//4科成绩和总成绩
}student;
typedef struct stuNode
{
student data;
struct stuNode *next;
}stuNode;
void createStudentInfo(stuNode **head);
void print(stuNode *head);
void printToFile(stuNode *head);
void search(stuNode *head, char *stuNumber);
void delete(stuNode *head,char *stuNumber);
void update(stuNode *head,char *stuNumber);
void menue();
.c文件
#include"grade.h"
void createStudentInfo(stuNode **head)
{
stuNode *newNode = (stuNode*)malloc(sizeof(stuNode));
printf("依次输入姓名 班级 学号 C语言 数据结构 高数 英语成绩:\n");
scanf("%s", newNode->data.name);
scanf("%s", newNode->data.clas);
scanf("%s",newNode->data.stuNumber);
scanf("%d %d %d %d", &(newNode->data.grade[0]), &(newNode->data.grade[1]), &(newNode->data.grade[2]), &(newNode->data.grade[3]));
newNode->data.grade[4] = newNode->data.grade[0] + newNode->data.grade[1] + newNode->data.grade[2] + newNode->data.grade[3];
if (*head == NULL)
{
newNode->next = NULL;
*head = newNode;
}
else
{
newNode->next = *head;
(*head) = newNode;
}
}
void print(stuNode *head)
{
stuNode *cur = head;
while (cur)
{
printf("%s %s %s %d %d %d %d %d\n", cur->data.name, cur->data.clas, cur->data.stuNumber, cur->data.grade[0], cur->data.grade[1], cur->data.grade[2], cur->data.grade[3], cur->data.grade[4], cur->data.grade[5]);
cur = cur->next;
}
}
void printToFile(stuNode *head)
{
stuNode *cur = head;
FILE *pfile;
pfile = fopen("C:\\Users\\user\\Desktop\\stu1.txt", "w");//以只写的方式打开一个文件stu1.txt
if (pfile == NULL)
{
printf("失败\n");
exit(-1);
}
while (cur)
{
fputs(cur->data.name, pfile);//项文件中写入字符串(name)
fputc(' ', pfile);//空格间隔开所输入的信息
fputs(cur->data.clas, pfile);
fputc(' ', pfile);
fputs(cur->data.stuNumber, pfile);
putc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[0]);//格式化写入文件
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[1]);
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[2]);
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[3]);
fputc(' ', pfile);
fprintf(pfile, "%d", cur->data.grade[4]);
fputc('\n', pfile);
cur = cur->next;
}
fclose(pfile);
}
void search(stuNode *head,char *stuNumber)
{
stuNode *cur = head;
while (cur)
{
if (strcmp(cur->data.stuNumber, stuNumber) == 0)
{
printf("%s %s %s %d %d %d %d %d\n", cur->data.name, cur->data.clas, cur->data.stuNumber, cur->data.grade[0], cur->data.grade[1], cur->data.grade[2], cur->data.grade[3], cur->data.grade[4], cur->data.grade[5]);
return;
}
cur = cur->next;
}
printf("查无此人!\n");
}
void delete(stuNode *head, char *stuNumber)
{
stuNode *preCur = head;
stuNode *cur = head;
while (cur)
{
if (strcmp(cur->data.stuNumber, stuNumber) == 0)
{
preCur->next = cur->next;
free(cur);
return;
}
else
{
preCur = cur;
cur = cur->next;
}
}
printf("查无此人!\n");
}
void update(stuNode *head, char *stuNumber)
{
stuNode *cur = head;
while (cur)
{
if (strcmp(cur->data.stuNumber, stuNumber) == 0)
{
printf("请输入该学生的信息:\n");
scanf("%s", cur->data.name);
scanf("%s", cur->data.clas);
scanf("%s", cur->data.stuNumber);
scanf("%d %d %d %d", &(cur->data.grade[0]), &(cur->data.grade[1]), &(cur->data.grade[2]), &(cur->data.grade[3]));
cur->data.grade[4] = cur->data.grade[0] + cur->data.grade[1] + cur->data.grade[2] + cur->data.grade[3];
//更新文件
printToFile(head);
return;
}
else
{
cur = cur->next;
}
}
printf("查无此人\n");
}
void menue()
{
printf("------------------------------------------\n");
printf(" 学生成绩管理系统\n");
printf("1.建立学生成绩单 2.保存到文件\n");
printf("3.打印 4.查找\n");
printf("5.删除 6.修改\n");
printf("0.退出 \n");
printf("------------------------------------------\n");
printf("请选择:>");
}
主函数
#include"grade.h"
int main()
{
stuNode *head = NULL;
char *stuNumber = NULL;
int choice;
do
{
menue();
scanf("%d", &choice);
switch (choice)
{
case 0:
printf("退出系统,欢迎下次使用\n");
break;
case 1:
createStudentInfo(&head);
break;
case 2:
printToFile(head);
break;
case 3:
print(head);
break;
case 4:
printf("请输入学号进行查找:>");
scanf("%s",stuNumber);
search(head,stuNumber);
break;
case 5:
printf("请输入学号进行删除:>");
scanf("%s", stuNumber);
delete(head, stuNumber);
break;
case 6:
printf("请输入学号进行修改:>");
scanf("%s", stuNumber);
update(head, stuNumber);
break;
default:printf("输入有误,请重新输入\n");
break;
}
} while (choice);
return 0;
}