#include"stdio.h"
#include"malloc.h"
#include<stdlib.h>
#include<windows.h>
#include <iostream>
#include <conio.h>
#define MaxNum 2 //科目总数
/*********************************管理员结构体************/
typedef struct user{
char username[20]; //账号
char password[20]; //密码
} User;
/**********************班级学生信息结构体******************/
typedef struct student
{ char C_name[10]; //班级名称
int stuNum; //学号
char name[10]; //姓名
char sex; //性别
float score; //总成绩
float subject[MaxNum]; //科目总数
struct student *pNext; //设置下一个指针
}Student;
Student *head= NULL;
/**********************函数声明*************************/
void menu(); //创建菜单
void student_list(); //打印学生信息
void input_score(); //录入学生成绩
void search_score(); //查询成绩
void modify_score(); //修改成绩
void delete_score(); //删除成绩
void save_score(); //保存成绩
void class_Score(); //班级得分
void Account_system(); //账号管理系统
/***********************主函数***************************/
int main()
{
Account_system();
int choose;
while(1)
{
menu();
scanf("%d",&choose);
getchar();
switch(choose)
{
case 1:
input_score(); //录入学生成绩
student_list();
input_score();
break;
case 2:
search_score(); //查询成绩
student_list();
break;
case 3:
modify_score(); //修改成绩
student_list();
break;
case 4:
delete_score(); //删除成绩
student_list();
break;
case 5:
save_score(); //保存成绩
student_list();
break;
case 6: class_Score();
break;
case 0:
goto end;
default:
goto end;
}
}
end:
return 0;
}
//*****************函数定义***************
/*******************************************
*函数名称:menu *
*功能: 给用户提供菜单选项 *
*输入: 无 *
*输出: 无 *
********************************************/
void menu(){
system("cls");
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\t*\n");
printf("*\t0、退 出\t\t*\n");
printf("*********************************\n");
printf("请输入你的选择(0-----6)");
}
/*******************************************
*函数名称:student_list *
*功能: 打印学生信息 *
*输入: 无 *
*输出: 无 *
********************************************/
void student_list(){
int actnum = 0;
int a = 0;
float totalScore = 0;
system("cls"); //小黑框,清屏
Student *p =head; //定义一个指针用来打印学生成绩
Student *temp = head;
printf("****你刚刚录入的学生信息为*****\n");
printf("班级\t\t学号\t姓名\t性别\t总成绩\n");
while(p != NULL) //利用while循环打印
{
printf("%-8s%10d%8s%8c%11.2f\n",p->C_name,p->stuNum,p->name,p->sex,p->score);
if(p->score >= 140){ //判断成绩在140分以上的
actnum++;
}
p = p->pNext; //不断将下一个节点的地址给p用来打印
}
printf("总成绩在140分以上的学生人数为:%d\n", actnum); // 输出成绩在140分以上的学生人数
while (temp != NULL) {
totalScore += temp->score; //求和
a++;
temp = temp->pNext;
}
totalScore = (totalScore/a); //求平均值
printf("全校的平均分是%.2f\n",totalScore);
system("pause"); //暂停小黑框用来停止程序,按任意键可以继续程序
}
/*******************************************
*函数名称:Account_system *
*功能: 设置管理员账号密码 *
*输入: 无 *
*输出: 无 *
********************************************/
void Account_system(){
User admin;
User encipher;
User user;
char ch;
int i = 0;
strcpy(admin.username, "114514");
strcpy(admin.password, "114514");
printf("请输入管理员账号:");
scanf("%s", user.username);
printf("请输入管理员密码:");
while (1)
{
ch = _getch(); // 从控制台获取一个字符而不显示在屏幕上
if (ch == 13) // 如果是回车键,结束输入
break;
encipher.password[i] = ch;
std::cout << '*'; // 显示星号
i++;
}
encipher.password[i] = '\0'; // 添加字符串结束符
if (strcmp(user.username, admin.username) != 0 && strcmp(user.password, admin.password) != 0)
{ printf("管理员账号或密码错误!\n");
return;
}
}
/*******************************************
*函数名称: class_Score
*功能: 根据用户需要,打印班级平均值
*输入: 无
*输出: 无
********************************************/
void class_Score()
{
int num;
int actnum;
float totalScore = 0.00;
Student *temp = head;
printf("请输入要查找的班级编号");
scanf("%d",&num);
while (temp != NULL) {
if(temp->serial == num) {
totalScore += temp->score; //求和
actnum++;
}
temp = temp->pNext;
}
totalScore = (totalScore/actnum); //求平均值
printf("你输入编号为:%d 的班级平均分是:%.2f\n",num,totalScore);
system("pause");
}
/*******************************************
*函数名称:input_score *
*功能: 录入学生成绩 *
*输入: 无 *
*输出: 无 *
********************************************/
void input_score(){
while(1){
Student *p = head; //声明一个指针用于从头到尾遍历
Student *prev = NULL; //再声明一个指针用于存放前一个节点的地址,相当于数学里的数列p-1
Student *newNode=(Student *)malloc(sizeof(Student)); //分配内存空间用于存储信息
printf("请输入班级的名字:");
scanf("%s",newNode->C_name);
printf("请输入班级的编号:");
scanf("%d",&newNode->serial);
printf("请输入学生的学号:");
scanf("%d",&newNode->stuNum);
printf("请输入学生的姓名:");
scanf("%s",newNode->name);
getchar();
printf("请输入学生的性别(男:M,女:F):");
scanf("%c",&newNode->sex);
printf("请输入学生的数学成绩:\n");
for(int k = 0; k < MaxNum; k++)
{
scanf("%f",&newNode->subject[k]);
printf("请输入学生的语文成绩\n");
}
for(int i = 0;i < MaxNum; i++){
newNode->score += newNode->subject[i];
}
newNode->pNext = NULL; //新节点的指针为NULL,即链表结束
// 判断是否有需要排序的节点
if(!head || (newNode->stuNum ) > (head->stuNum))
{
newNode->pNext =head; //将新节点插入到链表的头部,使其成为新的头节点。
head = newNode; //将新节点插入到了链表的头部,并将其设为新的头节点
return;
}
//遍历链表,寻找需要插入新节点的位置
while(p && p->stuNum >= newNode->stuNum)
{
prev = p; //prev指向p指向的节点
p = p->pNext; //p指向当前节点的下一个节点地址
} //循环结束后p的地址就是需要插入的地方
prev->pNext = newNode; //将新节点插入到prev节点的后面
newNode->pNext = p; //将节点p作为新节点的下一个节点,完成插入
student_list();
printf("还继续吗(y/n)"); // 判断是否停止录入,跳出循环
getchar();
char s=getchar();
if(s=='n'||s=='N')
break;
}
}
/*******************************************
*函数名称:search_score *
*功能: 查询学生成绩 *
*输入: 无 *
*输出: 无 *
********************************************/
void search_score(){
int num;
printf("请输入要查找的学号");
scanf("%d",&num);
Student *temp = head; //将头指针的地址给temp
while(temp!=NULL)
{
if(temp->stuNum == num)
break;
temp = temp->pNext; //如果没有找到学号,继续向下遍历
}
if(temp == NULL) //判断链表是否为空。
{
printf("没有符合条件的记录");
system("pause"); //暂停小黑框
}else {
printf("找到的信息如下:\n");
printf("学号\t\t姓名\t性别\t成绩\n");
printf("%-16d%-8s%-8c%-8.2f\n",temp->stuNum,temp->name,temp->sex,temp->score);
system("pause");
}
}
/*******************************************
*函数名称:modify_score *
*功能: 修改学生成绩 *
*输入: 无 *
*输出: 无 *
********************************************/
void modify_score(){
int num;
char choose;
printf("请输入你要修改的学号:");
scanf("%d",&num);
Student *temp = head;
while(temp!= NULL)
{
if(temp->stuNum == num)
{
break;
temp = temp->pNext;
}
}
if(temp == NULL)
{
printf("没有符合条件的记录");
system("pause");
}else {
printf("找到的信息如下:\n");
printf("学号\t\t姓名\t性别\t成绩\n");
printf("%-16d%-8s%-8c%-8.2f\n",temp->stuNum,temp->name,temp->sex,temp->score);
getchar();
printf("是否为您要修改的记录?(y/n)");
choose = getchar();
if(choose =='y'||choose =='Y')
{
printf("请输入新的成绩:");
scanf("%f",&temp->score);
}
}
}
/*******************************************
*函数名称:delete_score *
*功能: 删除学生成绩 *
*输入: 无 *
*输出: 无 *
********************************************/
void delete_score(){
int stuNumber;
char choose;
Student *p = head; //遍历的准备工作
Student *prev = NULL;
printf("请输入你要删除的学号");
scanf("%d",&stuNumber);
getchar();
if(!head) //判断头指针,就可以判断链表是否为空
{
printf("链表为空。\n");
return;
}
if(head->stuNum == stuNumber) //找到学号
{
head = head->pNext; //让头指针指向下一个节点地址,从而断开连接
free(p); //释放内存
return;
}
while(p&& p->stuNum != stuNumber) //没有找到学号,一直往下遍历
{
prev = p;
p = p->pNext;
}
if(p)
{ //找到了学号,将学号里的信息打印出来。
printf("找到的学号如下:\n");
printf("学号\t\t姓名\t性别\t成绩\n");
printf("%-16d%-8s%-8c%-8.2f\n",p->stuNum,p->name,p->sex,p->score);
printf("是否为你要删除的记录?(y\n)");
choose = getchar();
if(choose=='y'|| choose=='Y')
{
prev->pNext= p->pNext;
free(p);
}
}else{
printf("学号%d的学生没有找到。\n",stuNumber);
}
}
/*******************************************
*函数名称:save_score *
*功能: 保存学生成绩 *
*输入: 无 *
*输出: 无 *
********************************************/
void save_score(){
FILE *fp; //定义文件指针
fp = fopen("d://sutuden.txt","a+"); //先写w+,运行一遍后改成a+
if(fp = NULL)
{
printf("文件打开失败。");
return;
}
Student *temp = head;
while(temp != NULL)
{
fprintf(fp,"%d %s %c %.2f\n,temp->stuNum,temp->name,temp->sex,temp->score");
temp = temp->pNext;
}
fclose(fp);
printf("文件保存成功。");
system("pause");
return;
}