c语言学生管理系统

Python010

c语言学生管理系统,第1张

C 语言学生成绩管理系统

#include<stdio.h>

#include<malloc.h>

#include<conio.h>

#include<string.h>

typedef struct STUDENT

{

char studentNumber[20]/*学生学号*/

char studentName[20]/*学生姓名*/

char className[20]/*班级名称*/

float mark1/*第1门成绩*/

float mark2/*第2门成绩*/

float mark3/*第3门成绩*/

struct STUDENT *next

}STUDENT

STUDENT *headLink/*链表表头指针*/

/*函数声明*/

void ReadInfoFormFile()

void Menu()

void CreateHeadLink()

STUDENT *MallocNode()

void GetInformation(STUDENT *t)

void OutputInformation()

void DesplayInfoBystudentName()

void DesplayInfoBystudentNumber()

void DesplayOneNode(STUDENT *t)

void InsertOneNode(STUDENT *t)

void DeleteNodeBystudentNumber()

void ChangeMarkByName()

void ChangeMarkByNumber()

void SaveLinkToFile()

void paixu()

void DesplayMarkSegment()

int choose/*用于接受用户的选择*/

/*主函数*/

main()

{

system("color 2a")

printf("\n\t\t欢迎进入***学院***班学生成绩管理系统\n\n\n")

printf("\t\t\t\tO(∩_∩)O\n\n\n\n")

printf("\t\t\t^_^\t\t\t^_^\n\n")

printf("\n\t\t注意:请按照要求输入相应信息,谢谢!\n\n\n\n\n")

printf("\t\t\t\t\t\t\t\t制作人:***\n\n\n")

printf("\t\t\t 按任意键进入…………")

getch()

system("cls")

CreateHeadLink()

ReadInfoFormFile()

Menu()

}

/*从文件中读学生信息到链表中*/

void ReadInfoFormFile(void)

{

FILE *fp

STUDENT *p

fp=fopen("student.txt","r")

if(!fp)

{

printf("\n")

return

}

p=MallocNode()

while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)

{

InsertOneNode(p)

p=MallocNode()

}

fclose(fp)

}

/*显示菜单,根据用户的输入完成相应的功能*/

void Menu(void)

{

STUDENT *p

printf("\t\t (^o^)欢迎使用学生成绩管理系统(^o^)\n\n")

printf("\t ※--------------------请选择相应功能---------------------※\n\n")

printf("\t1: 显示所有学生的信息 |")

printf(" \t 2: 按姓名查询 |\n\n")

printf("\t3: 按学号查询 |")

printf(" \t\t 4: 增加学生 |\n\n")

printf("\t5: 删除学生 |")

printf(" \t\t 6: 按姓名修改学生成绩 |\n\n")

printf("\t7: 按学号修改学生成绩 |")

printf(" \t 8: 保存所有学生信息 |\n\n")

printf("\t9: 按成绩输出学生信息 |")

printf("\t 10: 显示不及格及优秀学生 |\n\n")

printf("\t11: 返回主菜单 |")

printf("\t\t 12: 退出 |\n\n")

printf("\t ※----------------------O(∩_∩)O------------------------※\n\n")

printf("\t 请输入对应数字:")

scanf("%d",&choose)/*取得用户的选择*/

switch(choose)

{

case 1:system("cls")

OutputInformation()/*显示所有学生的信息*/

break

case 2: system("cls")

DesplayInfoBystudentName()

break

case 3: system("cls")

DesplayInfoBystudentNumber()/*根据用户输入的学号显示该学生的信息*/

break

case 4: system("cls")

p=MallocNode()/*先申请一个新结点*/

GetInformation(p)/*要求用户输入信息到新结点中*/

InsertOneNode(p)/*将新结点加到链表中*/

break

case 5: system("cls")

DeleteNodeBystudentNumber()/*根据用户输入的学号删除该学生*/

break

case 6: system("cls")

ChangeMarkByName()/*根据用户输入的姓名修改学生成绩*/

break

case 7: system("cls")

ChangeMarkByNumber()/*根据用户输入的学号修改学生成绩*/

break

case 8: system("cls")

SaveLinkToFile()/*保存数据*/

break

case 9: system("cls")

paixu()break

case 10: system("cls")

DesplayMarkSegment()break

case 11: system("cls")

break

case 12: system("cls")

SaveLinkToFile()/*保存数据后再退出*/

free(headLink)

exit(1)

break

default: system("cls")break

}

Menu()/*递归调用*/

}

/*建立链表表头*/

void CreateHeadLink(void)

{

STUDENT *p

p=(STUDENT*)malloc(sizeof(STUDENT))

headLink=p

p->next=NULL

}

/*申请一个新结点,并将其初始化*/

STUDENT *MallocNode(void)

{

STUDENT *p

int i

p=(STUDENT*)malloc(sizeof(STUDENT))

if(p==NULL)

return NULL

for(i=0i<10i++)

p->studentNumber='\0'

for(i=0i<20i++)

p->studentName='\0'

for(i=0i<20i++)

p->className='\0'

p->mark1=0.0

p->mark2=0.0

p->mark3=0.0

p->next=NULL

return p

}

/*取得用户输入的学生信息*/

void GetInformation(STUDENT *t)

{

printf("请输入学生学号:")

scanf("%s",t->studentNumber)

printf("请输入学生姓名:")

scanf("%s",t->studentName)

printf("请输入该生所在班级:")

scanf("%s",t->className)

printf("请输入第1门成绩:")

scanf("%f",&(t->mark1))

printf("请输入第2门成绩:")

scanf("%f",&(t->mark2))

printf("请输入第3门成绩:")

scanf("%f",&(t->mark3))

}

/*在链表的结尾处增加一个结点*/

void InsertOneNode(STUDENT *t)

{

STUDENT *p

p=headLink

while(p->next)

{

p=p->next

}

p->next=t

}

/*根据用户输入的学生姓名显示该学生的信息*/

void DesplayInfoBystudentName(void)

{

STUDENT *p

char studentName[20]

char flag=0

p=headLink->next

printf("请输入学生姓名:")

scanf("%s",studentName)

while(p)

{

if(strcmp(p->studentName,studentName)==0)

{system("cls")

printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n")

DesplayOneNode(p)

flag=1

break

}

p=p->next

}

if(!flag) {system("cls")

printf("\t 对不起,不存在姓名为 %s 的学生\n",studentName)}

}

/*根据用户输入的学号显示该学生的信息*/

void DesplayInfoBystudentNumber(void)

{

STUDENT *p

char studentNumber[20]

char flag=0

p=headLink->next

printf("请输入学生学号:")

scanf("%s",studentNumber)

while(p)

{

if(strcmp(p->studentNumber,studentNumber)==0)

{ system("cls")

printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n")

DesplayOneNode(p)

flag=1

break

}

p=p->next

}

if(!flag) {system("cls")

printf("\t 对不起,不存在学号为 %s 的学生\n",studentNumber)

}}

/*输出一个结点的信息*/

void DesplayOneNode(STUDENT *t)

{

printf("\t%s\t",t->studentNumber)

printf("%s\t",t->studentName)

printf("%s\t",t->className)

printf("%.2f\t",t->mark1)

printf("%.2f\t",t->mark2)

printf("%.2f\t",t->mark3)

printf("%.2f\t",t->mark1+t->mark2+t->mark3)

printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3)

}

/*根据用户输入的学号删除该学生*/

void DeleteNodeBystudentNumber(void)

{

char studentNumber[10]

STUDENT *p,*q

char flag=0

printf("请输入要删除的学生学号:")

scanf("%s",studentNumber)

p=headLink

q=headLink->next

while(q)

{

if(strcmp(q->studentNumber,studentNumber)==0)

{

p->next=q->next

free(q)

flag=1

break

}

p=p->next

q=q->next

}

if(!flag)

{ system("cls")

printf("\t 不存在该学号的学生\n")

return

}

system("cls")

printf("\t 成功删除\n")

}

/*显示所有学生的信息*/

void OutputInformation(void)

{

STUDENT *p

p=headLink->next

if(p==NULL)

{

printf("\t现在没有学生信息,请先输入学生信息\n\n")

return

}

printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n")

while(p)

{

DesplayOneNode(p)

p=p->next

}

}

/*根据输入的姓名修改成绩*/

void ChangeMarkByName(void)

{

STUDENT *p

char studentName[20]

char flag=0

float mark1,mark2,mark3

p=headLink->next

printf("请输入学生姓名:")

scanf("%s",studentName)

while(p)

{

if(strcmp(p->studentName,studentName)==0)

{

printf("请输入新的第1门成绩:\n")

scanf("%f",&mark1)

printf("请输入新的第2门成绩:\n")

scanf("%f",&mark2)

printf("请输入新的第3门成绩:\n")

scanf("%f",&mark3)

p->mark1=mark1

p->mark2=mark2

p->mark3=mark3

flag=1

printf("修改成功\n")

break

}

p=p->next

}

if(!flag) {system("cls")

printf("\t 对不起,不存在姓名为 %s 的学生\n",studentName)

} }

/*根据输入的姓名修改成绩*/

void ChangeMarkByNumber(void)

{

STUDENT *p

char studentNumber[20]

char flag=0

float mark1,mark2,mark3

p=headLink->next

printf("请输入学生学号:")

scanf("%s",studentNumber)

while(p)

{

if(strcmp(p->studentNumber,studentNumber)==0)

{

printf("请输入新的第1门成绩:\n")

scanf("%f",&mark1)

printf("请输入新的第2门成绩:\n")

scanf("%f",&mark2)

printf("请输入新的第3门成绩:\n")

scanf("%f",&mark3)

p->mark1=mark1

p->mark2=mark2

p->mark3=mark3

flag=1

printf("修改成功\n")

break

}

p=p->next

}

if(!flag){system("cls")

printf("\t 对不起,不存在学号为 %s 的学生\n",studentNumber)

}}

/*保存链表数据到文件中*/

void SaveLinkToFile(void)

{

STUDENT *p

FILE *fp

p=headLink->next

if(p==NULL)

{

printf("\t 现在没有学生信息,请先输入学生信息\n\n")

return

}

fp=fopen("student.txt","w+")

if(!fp)

{

printf("文件不存在\n")

return

}

while(p)

{

fprintf(fp,"%s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3)

p=p->next

}

fclose(fp)

}

/*显示优秀和不及格学生成绩*/

void DesplayMarkSegment(void)

{

STUDENT *p

int count=0

p=headLink->next

printf("\t60分以下(不及格)的学生成绩如下:\n")

printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n")

while(p)

{

if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/

{

count++

DesplayOneNode(p)

}

p=p->next

}

printf("\t不及格的学生一共有%d人\n",count)

p=headLink->next

printf("\t成绩优秀的学生成绩如下:\n")

printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n")

count=0

while(p)

{

if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10))))

{

count++

DesplayOneNode(p)

}

p=p->next

}

printf("\t成绩优秀的学生一共有%d人\n",count)

}

/*按总成绩排序*/

void paixu(void)

{

STUDENT exchange,*r,*p,*q

r=headLink->next

if(r==NULL)

{

printf("\t 现在还没学生信息,请先输入学生信息\n")

return

}

while(r)/*两层while循环实现排序*/

{

p=r

q=r->next

while(q)

{

if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))

{

strcpy(exchange.studentNumber,q->studentNumber)/*先复制q结点信息到exchange*/

strcpy(exchange.studentName,q->studentName)

strcpy(exchange.className,q->className)

exchange.mark1=q->mark1

exchange.mark2=q->mark2

exchange.mark3=q->mark3

strcpy(q->studentNumber,p->studentNumber)/*再复制p结点信息到q*/

strcpy(q->studentName,p->studentName)

strcpy(q->className,p->className)

q->mark1=p->mark1

q->mark2=p->mark3

q->mark3=p->mark3

strcpy(p->studentNumber,exchange.studentNumber)/*最后复制exchange结点信息到p*/

strcpy(p->studentName,exchange.studentName)

strcpy(p->className,exchange.className)

p->mark1=exchange.mark1

p->mark2=exchange.mark2

p->mark3=exchange.mark3

}

q=q->next

}

r=r->next

}

OutputInformation()

}

#include <iostream>

#include <iomanip>

#include <string>

using namespace std

typedef struct student {

unsigned m_id

string m_name

unsigned m_age

string m_sex

string m_address

string m_contact

string m_dormitory

struct student *m_next

}student

class CStudent {

private :

student *head

public :

CStudent() {

head = new student

head->m_id = 0

head->m_name = "noname"

head->m_next = NULL

}

~CStudent() {

student *p = head,*q

while(p) {

q = p

p = q->m_next

delete q

}

}

student readdata(int model) // model = 1:不读取学号,2:不读取姓名,其他,读取所有信息

void entering()

bool insert(const student &astu)

student *findid(unsigned id) const

student *findname(const string &name) const

student *findsex(const string &sex) const

student *finddormitory(const string &dormitory) const

unsigned boys() const

unsigned girls() const

unsigned headcount() const

bool eraseid()

bool erasename()

bool modifyid()

bool modifyname()

void Show() const

void query() const

void friend statistics(const CStudent &aclss)

void friend erase(CStudent &aclss)

void friend modify(CStudent &aclss)

}

string readstring() {

string str

while(cin.get() != '\n')

cin >> str

return str

}

student CStudent::readdata(int model) {

student tmp

if(model != 1) { cout << "学    号: " cin >> tmp.m_id }

if(model != 2) { cout << "姓    名: " tmp.m_name = readstring() }

cin >> tmp.m_age

cout << "性    别: "

tmp.m_sex = readstring()

cout << "住    址: "

tmp.m_address = readstring()

cout << "联系方式: "

tmp.m_contact  =readstring()

cout << "寝    室: "

tmp.m_dormitory = readstring()

return tmp

}

void CStudent::entering() {

student tmp

cout << "学号(0 to return): "

cin >> tmp.m_id

while(tmp.m_id) {

if(findid(tmp.m_id) == NULL) {

cout << "姓    名: "

tmp.m_name = readstring()

cout << "年    龄: "

cin >> tmp.m_age

cout << "性    别: "

tmp.m_sex = readstring()

cout << "住    址: "

tmp.m_address = readstring()

cout << "联系方式: "

tmp.m_contact = readstring()

cout << "寝    室: "

tmp.m_dormitory = readstring()

insert(tmp)

}

else cout << "重复的学号:" << tmp.m_id << endl

cout << "学号(0 to return): "

cin >> tmp.m_id

}

}

student *CStudent::findid(unsigned id) const {

student *p

for(p = head p->m_next p = p->m_next)

if(p->m_next->m_id == id) return p

return NULL

}

student *CStudent::findname(const string &name) const {

student *p

for(p = head p->m_next p = p->m_next)

if(p->m_next->m_name == name) return p

return NULL

}

student *CStudent::findsex(const string &sex) const {

student *p

for(p = head p->m_next p = p->m_next)

if(p->m_next->m_sex == sex) return p

return NULL

}

student *CStudent::finddormitory(const string &dormitory) const {

student *p

for(p = head p->m_next p = p->m_next)

if(p->m_next->m_dormitory == dormitory) return p

return NULL

}

bool CStudent::insert(const student &astu) {

student *newnode,*p = head

if(p->m_next == NULL) {

p->m_next = new student(astu)

p->m_next->m_next = NULL

return true

}

while(p->m_next) {

if(p->m_next->m_id == astu.m_id) {

cout << "重复的学号,插入失败!\n"

return false

}

if(p->m_next->m_id > astu.m_id) {

newnode = new student(astu)

newnode->m_next = p->m_next

p->m_next = newnode

return true

}

p = p->m_next

}

p->m_next = new student(astu)

p->m_next->m_next = NULL

return true

}

unsigned  CStudent::boys() const {

unsigned cnt = 0

student *p

for(p = head->m_next p p = p->m_next)

if(p->m_sex == "男") ++cnt

return cnt

}

unsigned CStudent::girls() const {

unsigned cnt = 0

student *p

for(p = head->m_next p p = p->m_next)

if(p->m_sex == "女") ++cnt

return cnt

}

unsigned CStudent::headcount() const {

unsigned cnt = 0

student *p

for(p = head->m_next p p = p->m_next,++cnt)

return cnt

}

bool CStudent::eraseid() {

student *q,*p

unsigned id

cout << "输入要删除的学号:"

cin >> id

p = findid(id)

if(p == NULL) {

cout << "没有找到学号是\"" << id << "\"的学生,删除失败!\n"

return false

}

q = p->m_next

p->m_next = q->m_next

delete q

return true

}

bool CStudent::erasename() {

student *q,*p

string name

cout << "输入要删除人的姓名:"

name = readstring()

p = findname(name)

if(p == NULL) {

cout << "没有找到姓名是\"" << name << "\"的学生,删除失败!\n"

return false

}

q = p->m_next

p->m_next = q->m_next

delete q

return true

}

bool CStudent::modifyid() {

student tmp,*p

unsigned id

cout << "输入要修改的学号:"

cin >> id

p = findid(id)

if(p == NULL) {

cout << "没有找到学号是\"" << id << "\"的学生,修改失败!\n"

return false

}

tmp = readdata(1)

tmp.m_id = id

*p = tmp

return true

}

bool CStudent::modifyname() {

student *p,tmp

string name

cout << "输入要修改人的姓名:"

name = readstring()

p = findname(name)

if(p == NULL) {

cout << "没有找到姓名是\"" << name << "\"的学生,修改失败!\n"

return false

}

tmp = readdata(2)

tmp.m_name = name

*p = tmp

return true

}

int menu() {

int choice

do {

system("cls")

cout << "\t****************************\n"

cout << "\t*   学生基本信息管理系统   *\n"

cout << "\t*==========================*\n"

cout << "\t*    1、录入学生信息       *\n"

cout << "\t*    2、显示学生信息       *\n"

cout << "\t*    3、查询学生信息       *\n"

cout << "\t*    4、添加学生信息       *\n"

cout << "\t*    5、统计学生信息       *\n"

cout << "\t*    6、删除学生信息       *\n"

cout << "\t*    7、修改学生信息       *\n"

cout << "\t*    0、退出管理系统       *\n"

cout << "\t****************************\n"

cout << "\n\t请选择:"

cin >> choice

}while(choice < 0 || choice > 7)

return choice

}

void show(student *p) {

cout << p->m_id << " " << p->m_name << " " << p->m_age << " "

cout << p->m_sex << " " << p->m_address << " "

cout << p->m_contact << " " << p->m_dormitory << endl

}

void CStudent::Show() const {

student *p

cout << "----------------------------------------------------------\n"

for(p = head->m_next p p = p->m_next) show(p)

cout << "----------------------------------------------------------\n"

system("pause")

}

void CStudent::query() const {

int select

unsigned id

string name

student *p

cout << "1、按学号查询\n2、按姓名查询\n0、返回\n"

cin >> select

switch(select) {

case 1 : cout << "请输入学号:" cin >> id

if(p = findid(id)) show(p->m_next)

break

case 2 : cout << "请输入姓名:" name = readstring()

if(p = findname(name)) show(p->m_next)

break

case 0 : return

default : cout << "选择错误。\n"

}

system("pause")

}

void statistics(const CStudent &a) {

unsigned total = a.headcount()

unsigned boys = a.boys()

unsigned girls = a.girls()

cout << "学生总数:" << total << "人。\n"

cout << "其中,男生:" << boys << "名。"

cout << "女生:" << girls << "名。\n"

system("pause")

}

void erase(CStudent &a) {

int select

unsigned id

string name

student *p,*q

cout << "1、按学号删除\n2、按姓名删除\n0、返回\n"

cin >> select

switch(select) {

case 1 : cout << "请输入学号:" cin >> id

if(p = a.findid(id)) {

q = p->m_next

p->m_next = q->m_next

delete q

cout << "成功删除 " << id << " 的信息。\n"

}

break

case 2 : cout << "请输入姓名:" name = readstring()

if(p = a.findname(name)) {

q = p->m_next

p->m_next = q->m_next

delete q

cout << "成功删除 " << name << " 的信息。\n"

}

break

case 0 : return

default : cout << "选择错误。\n"

}

system("pause")

}

void modify(CStudent &a) {

int select

cout << "1、按学号修改\n2、按姓名修改\n0、返回\n"

cin >> select

switch(select) {

case 1 : if(a.modifyid()) cout << "修改成功。\n" break

case 2 : if(a.modifyname()) cout << "修改成功。\n" break

case 0 : return

default : cout << "选择错误。\n"

}

system("pause")

}

int main() {

CStudent a

int an

do {

an = menu()

switch(an) {

case 1 : a.entering() break

case 2 : a.Show() break

case 3 : a.query() break

case 4 : a.entering() break

case 5 : statistics(a) break

case 6 : erase(a) break

case 7 : modify(a) break

case 0 : break

default : cout << "选择错误。\n" break

}

}while(an)

return 0

}