怎样用C语言写学生成绩管理系统?

Python022

怎样用C语言写学生成绩管理系统?,第1张

程序如下: #include\x0d\x0avoid main()\x0d\x0a{\x0d\x0a float student[100][7]\x0d\x0a//student[][0]存放学号,student[][1]到student[][4]存放四门成绩,\x0d\x0a//student[][5]存放总分,student[][6]存放平均分,student[][7]存放排名\x0d\x0a int n,i,j,k,p,t,count,flag\x0d\x0a int a[100],b[100],c[100]\x0d\x0a//a[]存放排序后的下标,b[]存放总分(备份),c[]存放排名的数据\x0d\x0a printf("输入学生的个数:\n")\x0d\x0a scanf("%d",&n)\x0d\x0a for(i=0ib[i+1])\x0d\x0a{\x0d\x0a c[i]=count\x0d\x0a count++\x0d\x0a}\x0d\x0a }\x0d\x0a printf("\n以下是统计结果:\n")\x0d\x0a printf("学号 s[1]s[2]s[3]s[4] 总分 平均分排名\n")\x0d\x0a for(i=0i 回答于 2022-11-16

代码如下:

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

typedef struct examinee //考生信息结构

{   char examno[20]//准考证号

char name[10]//姓名

char sex[4]//性别

short age//年龄

char examtype[10]//报考科目

}ElemType

typedef struct Node //定义链表结点

{

ElemType data//数据域

struct Node *next//指针域

}Node,*List,*position

List make_empty( List L )//创建一个带头结点的空表

int is_empty( List L )//测试链表是否是空表

int is_last( position p, List L )//测试当前位置是否是表尾

position make_node( position p,int n )//创建结点并输入考生信息

void put_information( position p )//是否输出该考生信息

void put_name_information( List L )//输出姓名为xx的考生信息

int put_pos_information( position p )//输出该地址考生信息

void link_to_tail( List L, position p )//将结点连接到表尾

int ciculation_make()//循环创建考生信息

int judge_put_all()//是否输出所有考生信息

void put_all(List L)//输出所有考生信息。

position find( List L )//查找第一个姓名为xx的元素并返回位置

position find_previous( List L )//查找第一个姓名为xx的元素并返回该元素直接前驱的位置

//int judge_delete_val()//询问是否删除考生数据

int delete_val( List L )//删除指定考生信息并输出其信息

void menu(List L)//菜单函数

List L

//position p

int

main( void ) 

{

List L = NULL//定义头结点指针

position p = NULL//定义表工作指针

L = make_empty( L )//创建空表

printf("\t\t\t★★考生报名管理程序★★\n\t\t----------------------------------------\n")

menu(L)

return 0

}

//创建一个带头结点的空表

List

make_empty( List L)

{

L = ( List ) malloc (sizeof( Node ))

if(NULL == L)

{

printf("内存分配失败")

exit( 1 )

}

L->next = NULL

//printf("空表创建成功。\n")

return L

}

//创建结点并输入考生信息

position

make_node( position p ,int n)

{

if(n) //n为1是创建结点并输入,n为0是修改

{

p = ( position ) malloc ( sizeof ( Node ))

p->next = NULL

}

printf("请输入考生准考证号:")

gets(p->data.examno)

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

gets(p->data.name)

do

{

printf("请输入考生性别,只能输入“男”或者“女”:")

gets(p->data.sex)

}

while( 0 != strcmp( p->data.sex, "男" ) &&0 != strcmp( p->data.sex, "女" ))//判断性别是否有误

printf("请输入考生年龄:")

scanf("%hd",&p->data.age)

getchar()  //如果把这句删掉,就“无法执行”下面的报考类别

/*下面的do while用来判断报考类别是否输入有误*/

do

{

printf("请输入报考类别,只能输入“数学”或“英语”或者“数据结构”:")

gets(p->data.examtype)

}

while( 0 != strcmp( "英语", p->data.examtype ) &&0 != strcmp( "数学", p->data.examtype ) &&0 != strcmp( "数据结构", p->data.examtype ))

if(n)

{

printf("报名成功\n")

}

else

{

printf("修改成功\n")

}

return p

}

//前插法;

void

link_to_tail( List L, position p)

{

p->next = L->next

L->next = p

}

//查找第一个姓名为xx的元素并返回位置

position

find( List L )

{

position p = L->next

char name[10]

printf("请输入你要查找的考生姓名:")

gets(name)

while( p != NULL &&0 != strcmp( p->data.name , name))

{

p=p->next

}

return p

}

//测试链表是否是空表

int

is_empty( List L )

{

return L->next == NULL

}

//测试当前位置是否是表尾

int

is_last( position p, List L )

{

return p->next == NULL

}

//输出姓名为xx的考生信息

void

put_name_information( List L )

{

position p = find(L)

if(p!=NULL)

{

printf("您要查找的考生信息:\n")

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

}

else

{

printf("没有您要找的学生。\n")

}

}

//循环创建考生信息

int

ciculation_make()

{

int n = 2

do

{

printf("是否继续创建考生信息?是请输入“1”,不是请输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

return n

}

//是否输出考生信息

void

put_information( position p )

{

int n=2

do

{

printf("是否输出该考生信息?是请输入“1”,不是请输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

if(n)

{

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

}

}

//是否输出所有考生信息

int

judge_put_all()

{

int n = 2

do

{

printf("是否输出所有考生信息?是请输入“1”,不是请输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

return n

}

//输出所有考生信息

void

put_all(List L)

{

if(L->next == NULL)

{

printf("现无考生报名!\n")

}

else

{

position p=L->next

while( p != NULL )

{

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

p=p->next

}

}

//getchar()

}

//询问是否删除考生数据

int

judge_delete_val()

{

int n = 2

do

{

printf("是否要删除某个考生数据?是请输入“1”,不是输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

return n

}

//查找第一个姓名为xx的元素并返回其直接前驱的位置

position

find_previous( List L )

{

position q = L

position p = L->next

char name[10]

printf("请输入你要查找的考生姓名:")

gets(name)

while( p != NULL &&0 != strcmp( p->data.name , name))

{

q=p

p=p->next

}

if( p != NULL )

{

return q

}

else

return p

}

//删除指定考生信息并输出其信息

int

delete_val(List L)

{

int n=2

position q=NULL

position p=find_previous( L )//返回考生信息地址

if( NULL == p )

{

printf("你要删除的考生不存在\n")

return 0

}

else

{

q = p->next

p->next = q->next

printf("删除成功。\n删除的考生信息为:\n")

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",q->data.examno,q->data.name,q->data.sex,q->data.age,q->data.examtype)

free(q)

return 1

}

}

//输出该地址考试信息

int

put_pos_information( position p )

{

if(p != NULL )

{

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

return 1

}

else

{

printf("没有您要查找的学生。")

return 0

}

}

//菜单函数

void

menu(List L)

{

printf("\t\t\t   a. 考生报名入口\n")

printf("\t\t\t   b. 查询考生信息\n")

printf("\t\t\t   c. 修改考生信息\n")

printf("\t\t\t   d. 删除考生信息\n")

printf("\t\t\t   e. 全部考生信息\n")

printf("\t\t\t   f. 程序作者信息\n")

printf("\t\t\t   g.   退出程序\n")

char n='h'

while(n != 'g')

{

do  //确定正确输入

{

printf("请通过字母序号选择功能:")

n = getchar()

getchar()

putchar('\n')

if( n <'a' || n >'g')

{

printf("错误的字母序号。\n")

}

}

while( n <'a' || n >'g' )

switch (n)

{

case 'a':

{

printf("请输入报名考生信息:\n")

position p = make_node( p, 1 )//创建新结点

link_to_tail( L, p )//将新结点连接到表上

put_information( p )   //是否输出该考生信息

putchar('\n')

}

break

case 'b':

{

put_name_information( L )

putchar('\n')

}

break

case 'c':

{

int n=0

position p = NULL

printf("您正在进行修改操作。\n")

p = find(L)

n = put_pos_information( p )

if(n)

{

make_node( p , 0 )

put_information( p )   //是否输出该考生信息

}

putchar('\n')

}

break

case 'd':

{

printf("您正在进行删除操作。\n")

delete_val( L )

putchar('\n')

}

break

case 'e':

{

put_all( L )

putchar('\n')

}

break

case 'f':

{

printf("              修改日期    版本号      修改人      修改内容    \n")

printf("        --------------------------------------------------------\n")

printf("              2018.6.19    v2.0       陈百川     增加主菜单\n")

printf("              2018.6.23    v3.0       陈百川   增加生成文件功能\n\n")

printf("            该版本号为v2.0\n")

putchar('\n')

}

break

default:

break

}

}

printf("                     感谢本次使用,祝您生活愉快。")

getch()

}

回答于 2022-12-11

#include

#include

#include

#include

#define max 20

typedef struct student //学生

{

char sno[max]// 学号

char sname[max]//姓名

char sex[max]//性别

char age[max]//年龄

char depart[max]//系

char classs[max]//班

char grade[max]//年级

struct student* next

} student

student* head

int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输

{

char username[max],password[max]

printf("\n请输入用户名:")

scanf("%s",username)

printf("\n请输入密码(最多15位):")

//开始以不回显且支持退格方式获取输入密码

int i=0

while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围

{

if(password[i-1]=='\b')//对退格键的处理

{

printf("%c%c%c",'\b','\0','\b')

i=i-2

}

else

printf("*")

}

password[--i]='\0'

//已获取密码。验证用户身份

if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))

{

printf("\n登录成功!")

return 1

}

else

return 0

}

void regist()

{

char ch

student *s,*ptr//s用来建新结点,ptr用来暂存头结点

do

{

s=(student*)malloc(sizeof(student))// 新建一个学生结点

printf("\n开始注册...")//开始注册

printf("\n请输入该学生的学号:")

scanf("%s",s->sno)

printf("\n请输入该学生的姓名:")

scanf("%s",s->sname)

printf("\n请输入该学生的性别:")

scanf("%s",s->sex)

printf("\n请输入该学生的年龄:")

scanf("%s",s->age)

printf("\n请输入该学生的系:")

scanf("%s",s->depart)

printf("\n请输入该学生所在的班:")

scanf("%s",s->classs)

printf("\n请输入该学生所在的年级")

scanf("%s",s->grade)

ptr=head

head=s//将新结点插入队头

s->next=ptr

fflush(stdin)

printf("\n请问是否继续注册?(Y/N)")

scanf("%c",&ch)

}while(ch=='Y'||ch=='y')

return

}

void ElePrint(char str[]) //输出单个元素

{

if(str==NULL) exit(0)

printf("%s",str)

for(unsigned int i=0i<12-strlen(str)i++) printf(" ")//为了对齐输出,需插入一些空格

return

}

int LinePrint(student *ptr) //输出一行

{

if(ptr==NULL) //检查传进来的指针

return 0

printf("\n")

ElePrint(ptr->sno)

ElePrint(ptr->sname)

ElePrint(ptr->age)

ElePrint(ptr->sex)

ElePrint(ptr->depart)

ElePrint(ptr->classs)

ElePrint(ptr->grade)

return 1

}

void print() //输出全部学生信息

{

student *ptr=head

printf("\n学号 姓名 年龄 性别 系 班 年级 ")

while(ptr)

{

LinePrint(ptr)

ptr=ptr->next

}

printf("\n")

return

}

void search()//查询模块

{

int method//查询方式

char no[max],name[max],departm[max],clss[max],grades[max]//用来接收查询关键字

while(1)

{

printf("\n请选择查询方式")

printf("\n1.按学号查询")

printf("\n2.按姓名查询")

printf("\n3.按所在系查询")

printf("\n4.按所在班级查询")

printf("\n5.按所在年级查询")

printf("\n6.打印全部学生信息")

printf("\n7.返回主菜单\n")

scanf("%d",&method)

student *p=head,*temp

switch(method)

{

case 1:

printf("\n请输入要查询的学号:")

scanf("%s",no)

while(p)

{

if(!strcmp(p->sno,no))

break

else

{

temp=p

p=p->next

}

}

printf("\n学号 姓名 年龄 性别 系 班 年级 ")

LinePrint(p)

break

case 2:

printf("\n请输入要查询的姓名:")

scanf("%s",name)

printf("\n学号 姓名 年龄 性别 系 班 年级 ")

while(p)

{

if(!strcmp(p->sname,name))

LinePrint(p)

p=p->next

}

break

case 3:

printf("\n请输入学生所在的系:")

scanf("%s",departm)

printf("\n学号 姓名 年龄 性别 系 班 年级 ")

while(p)

{

if(!strcmp(p->depart,departm))

LinePrint(p)

p=p->next

}

break

case 4:

printf("\n请输入学生所在的班:")

scanf("%s",clss)

printf("\n请输入学生所在的年级:")

scanf("%s",grades)

printf("\n学号 姓名 年龄 性别 系 班 年级 ")

while(p)

{

if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))

LinePrint(p)

p=p->next

}

break

case 5:

printf("\n请输入学生所在的年级:")

scanf("%s",grades)

printf("\n学号 姓名 年龄 性别 系 班 年级 ")

while(p)

{

if(!strcmp(p->grade,grades))

LinePrint(p)

p=p->next

}

break

case 6:

print()

break

case 7:

return

default:

printf("很抱歉,暂无此查询方式!")

break

}

}

}

void modify()//修改学生信息

{

char num[max]

student *p=head

printf("\n请输入要修改的学生的学号:")

scanf("%s",num)

while(p)

{

if(!strcmp(p->sno,num))

break

else

p=p->next

}

if(p==NULL)

{

printf("\n错误:没有此学生的信息!\n")

return

}

LinePrint(p)

printf("\n请输入要修改的该学生的信息:")

printf("\n1.姓名")

printf("\n2.性别")

printf("\n3.年龄")

printf("\n4.所在的系")

printf("\n5.所在的班")

printf("\n6.所在的年级")

char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max]

int select

fflush(stdin)

scanf("%d",&select)

printf("\n请输入新的信息:")

switch(select)

{

case 1:

scanf("%s",name1)

strcpy(p->sname,name1)

break

case 2:

scanf("%s",sex1)

strcpy(p->sex,sex1)

break

case 3:

scanf("%s",age1)

strcpy(p->age,age1)

break

case 4:

scanf("%s",depart1)

strcpy(p->depart,depart1)

break

case 5:

scanf("%s",class1)

strcpy(p->classs,class1)

break

case 6:

scanf("%s",grade1)

strcpy(p->grade,grade1)

break

default:

printf("\nError!")

break

}

LinePrint(p)

return

}

void del()// 删除某学生的信息

{

student *p=head,*temp=head,*s

char num1[max]

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

scanf("%s",num1)

while(p)//查找该学生所在的结点

{

if(!strcmp(p->sno,num1))

break

else

{

temp=p

p=p->next

}

}//while

if(!p)

{

printf("\n不存在此学生的信息.")

return

}

LinePrint(p)//输出该学生的信息

printf("\n请问真的要删除该学生的信息吗?(Y/N)")

char ch

fflush(stdin)

scanf("%c",&ch)

if(ch=='Y'||ch=='y')

{

s=p->next

temp->next=s

free(p)

printf("\n已经删除该学生的信息.")

}

return

}

void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现

{

student *ptr,*s=head,*p

int count=0,count1

while(s)//统计链表结点个数

{

count++

s=s->next

}

for(int i=1i<counti++)

{

ptr=head

p=NULL

count1=count-i//用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点

while(ptr&&ptr->next&&(count1--))

{

if(strcmp(ptr->sno,ptr->next->sno)>0)

{

s=ptr->next

ptr->next=s->next

if(p==NULL) //ptr处于队头时

head=s

else

p->next=s

s->next=ptr

p=s

}

else

{

ptr=ptr->next

if(p==NULL) //ptr处于队头时

p=head

else

p=p->next

}

}

}

return

}

void quit()

{

char ch

printf("\n真的要退出?(Y/N)")

fflush(stdin)

scanf("%c",&ch)

if(ch=='Y'||ch=='y')

exit(0)

return

}

int main()

{

int option

printf("\nCopyright@2005 KongXinCai All rights reserved.")

printf("\n欢迎使用学生信息管理系统!\n")

//登录模块

int icheck=0

while(icheck<3)

{

if(LogOn()==0)

icheck++

else

break

}

if(icheck==3)

{

printf("\n连续登录三次不成功,退出!")

exit(0)

}

//系统界面

while(1)

{

printf("\n\n请选择需要的服务:")

printf("\n1.注册")

printf("\n2.查询")

printf("\n3.修改")

printf("\n4.删除")

printf("\n5.排序")

printf("\n7.求平均")

printf("\n6.退出\n")

scanf("%d",&option)

switch(option)

{

case 1:

regist()

break

case 2:

search()

break

case 3:

modify()

break

case 4:

del()

break

case 5:

sort()

break

case 6:

quit()

break

}

}

return 0

}