C语言项目
1、学生成绩管理系统
本项目旨在增强,学习C语言的指针和链表部分知识
1.1 功能需求部分介绍
此处首先介绍一下该项目要完成的功能主要包括如下9个功能:
1、录入学生信息:即链表的功能
2、打印学生信息:链表元素的遍历
3、保存学生信息:文件的“写”功能,数据持久化
4、读取学生信息:文件的“读”功能
5、统计学生人数:链表元素的遍历
6、查找学生信息:链表元素的搜索
7、修改学生信息:链表元素的修改
8、删除学生信息:链表元素的删除
9、系统的保持、清屏、退出。
1.2 头文件的准备
在头文件中准备好学生信息操作的链表节点结构体,以及学生信息结构体,头文件命名为StudentInfoSystem.h
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Student {
char name[20]; //姓名
int age; //年龄
char stuNum[10];//学号
float score; //成绩
}Student;
typedef struct _Node {
Student stu;
struct _Node * pNext;
}Node;
Node* g_pHead = NULL;
//欢迎
void welcome();
//录入学生信息
void inputStuInfo();
//打印学生信息
void printStuInfo();
//保存学生信息
void saveStuInfo();
//读取学生信息
void readStuInfo();
//统计所有学生人数
void countStuNum();
//查找学生
Node* findStudentByName(char name[20]);
//修改学生信息
void changeStuInfo();
//删除学生信息
void delStuInfo();
1.3 学生管理系统欢迎界面的制作
代码实现:
包括 switch语句实现按键选择功能,以及一个欢迎的展示。
#define _CRT_SECURE_NO_WARNINGS
#include "StudentInfoSystem.h"
int main()
{
while (1) {
welcome();
//从键盘接受一个字符,进入等待和选择
//scanf
//getch
//getchar();
char ch = _getch();
char name[20];
Node* stu;
switch (ch){
case '1'://录入学生信息
inputStuInfo();
break;
case '2'://打印学生信息
printStuInfo();
break;
case '3'://保存学生信息
saveStuInfo();
break;
case '4'://读取学生信息
readStuInfo();
break;
case '5'://统计学生人数
countStuNum();
break;
case '6'://查找学生信息
printf("请输入要查找的学生姓名:");
scanf("%s", name);
stu = findStudentByName(name);
if (stu != NULL) {
printf("学生姓名为:%s\n", stu->stu.name);
printf("学生学号为:%s\n", stu->stu.stuNum);
printf("学生年龄为:%d\n", stu->stu.age);
printf("学生成绩为:%f\n", stu->stu.score);
}
else {
printf("没有该学生的信息");
}
system("pause");
system("cls");
break;
case '7'://修改学生信息
changeStuInfo();
break;
case '8'://删除学生信息
delStuInfo();
break;
case '0'://退出系统
printf("bye bye\n");
return 0;
break;
default:
printf("您的输入有误请重新输入\n");
system("pause");
system("cls");
}
}
return 0;
}
void welcome() {
printf("*************************************************\n");
printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");
printf("*************************************************\n");
printf("*\t\t请选择功能列表\t\t\t*\n");
printf("*************************************************\n");
printf("*\t\t1.录入学生信息\t\t\t*\n");
printf("*\t\t2.打印学生信息\t\t\t*\n");
printf("*\t\t3.保存学生信息\t\t\t*\n");
printf("*\t\t4.读取学生信息\t\t\t*\n");
printf("*\t\t5.统计学生人数\t\t\t*\n");
printf("*\t\t6.查找学生信息\t\t\t*\n");
printf("*\t\t7.修改学生信息\t\t\t*\n");
printf("*\t\t8.删除学生信息\t\t\t*\n");
printf("*\t\t0.退出系统\t\t\t*\n");
printf("*************************************************\n");
}
1.4 录入学生信息功能实现
代码实现:
void inputStuInfo() {
//创建链表,首先开辟空间
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
//头插法,尾插法
//头插法
if (g_pHead == NULL) {
g_pHead = pNewNode;
}
else {
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
printf("请输入学生姓名:\n");
scanf("%s", pNewNode->stu.name);
printf("请输入学生年龄:\n");
scanf("%d", &pNewNode->stu.age);
printf("请输入学生学号:\n");
scanf("%s", pNewNode->stu.stuNum);
printf("请输入学生成绩:\n");
scanf("%f", &pNewNode->stu.score);
printf("学生信息录入成功\n");
system("pause");
system("cls");
}
功能展示:
1.5 打印学生信息
代码实现:
//打印学生信息
void printStuInfo() {
system("cls");
printf("*************************************************\n");
printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");
printf("*************************************************\n");
printf("* 学号 * 姓名 * 年龄 * 成绩 *\n");
printf("*************************************************\n");
Node* curPoint = g_pHead;
while (curPoint != NULL) {
printf("* %s * %s * %d * %f *\n", curPoint->stu.stuNum, curPoint->stu.name, curPoint->stu.age, curPoint->stu.score);
printf("*************************************************\n");
curPoint = curPoint->pNext;
}
system("pause");
system("cls");
}
功能展示(包含信息录入):
1.6 保存学生信息
代码实现:
//保存学生信息
void saveStuInfo() {
//打开文件
FILE* fp = fopen("F:\\C++\\StudentInfoSystem\\stuInfo.dat", "w");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
//遍历链表
Node* p = g_pHead;
while (p != NULL) {
//写
fwrite(&p->stu,1, sizeof(Student),fp);
p = p->pNext;
}
//关闭文件
fclose(fp);
//数据保存成功
printf("保存成功\n");
system("pause");
system("cls");
}
功能展示:
1.7 读取学生信息
代码实现:
void readStuInfo() {
//打开文件
FILE* fp = fopen("F:\\C++\\StudentInfoSystem\\stuInfo.dat", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
//读文件
Student stu;
while (fread(&stu, 1, sizeof(Student), fp)) {
//创建一个新结点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
memcpy(pNewNode, &stu, sizeof(Student));
//头插法
if (g_pHead == NULL) {
g_pHead = pNewNode;
}
else {
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
//关闭文件
fclose(fp);
printf("是否要打印学生信息y/n\n");
char choose;
scanf("%c", &choose);
if (choose == 'y') {
system("cls");
//打印文件中的学生信息
printStuInfo();
}
else {
printf("读取成功\n");
system("pause");
system("cls");
}
}
功能展示:
1.8 统计学生人数
代码实现:
//统计学生人数
void countStuNum() {
Node* p = g_pHead;
int count = 0;
while (p != NULL) {
count++;
p = p->pNext;
}
printf("学生的人数为%d\n", count);
system("pause");
system("cls");
}
功能展示:
1.9 查找学生信息
代码实现:
//查找学生
Node* findStudentByName(char name[20]) {
system("cls");
Node* p = g_pHead;
while (p != NULL) {
if (strcmp(p->stu.name, name)==0) {
return p;
}
p = p->pNext;
}
return NULL;
}
功能展示:
1.10 修改学生信息
代码实现:
//修改学生信息
void changeStuInfo() {
system("cls");
char name[20];
printf("请输入要修改的学生姓名:");
scanf("%s", name);
Node* stu = findStudentByName(name);
if (stu == NULL) {
printf("不存在该学生");
}
else {
printf("原先的姓名为:%s,请输入要修改的姓名:", stu->stu.name);
scanf("%s", stu->stu.name);
printf("原先的学号为:%s,请输入要修改的学号:", stu->stu.stuNum);
scanf("%s", stu->stu.stuNum);
printf("原先的年龄为:%d,请输入要修改的年龄:", stu->stu.age);
scanf("%d", &stu->stu.age);
printf("原先的成绩为:%f,请输入要修改的成绩:", stu->stu.score);
scanf("%f", &stu->stu.score);
printf("修改成功");
}
system("pause");
system("cls");
}
功能展示:
1.11 删除学生信息
代码实现:
//删除学生信息
void delStuInfo() {
system("cls");
char name[20];
printf("请输入要删除的学生姓名");
scanf("%s", name);
Node *p1, *p2;
//判断是不是头结点
if (strcmp(g_pHead->stu.name, name) == 0) {
p1 = g_pHead;
g_pHead = g_pHead->pNext;
free(p1);
printf("删除成功");
system("pause");
system("cls");
return;
}
//不是头结点
Node *p = g_pHead;
while (p->pNext != NULL) {
if (strcmp(p->pNext->stu.name, name)) {
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
system("pause");
system("cls");
return;
}
p = p->pNext;
}
if (p->pNext == NULL) {
printf("没有该学生");
}
else {
printf("删除成功");
}
system("pause");
system("cls");
}
功能展示: