#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
}
#include <stdio.h>#include <string.h>
#include <stdlib.h>
#define MAX 1000
/*定义学生成绩信息结构*/
struct stu
{
char id[8]
char name[8]
double Chinese
double Math
double English
double average
double total
}
/*学生结构数组,用于存储学生成绩信息*/
struct stu students[MAX]
/*当前学生人数*/
int current
void input()
{
int i
printf("请输入学生人数:")
scanf("%d", &current)
for (i = 0i <currenti++)
{
printf("\n请输入学生学号,最多为7位数: ")
scanf("%s", students[i].id)
printf("请输入学生姓名:")
scanf("%s", students[i].name)
printf("请输入语文成绩:")
scanf("%lf", &students[i].Chinese)
printf("请输入数学成绩:")
scanf("%lf", &students[i].Math)
printf("请输入英语成绩:")
scanf("%lf", &students[i].English)
students[i].total = students[i].Chinese + students[i].Math + students[i].English
students[i].average = students[i].total / 3
}
}
/*排名次,即对学生结构数组排序*/
void sort(struct stu array[], int n)
{
int i, j
struct stu temp
for (i = 0i <ni++)
{
for (j = i+1j <nj++)
{
if (array[i].average - array[j].average <1e-16)
{
temp = array[i]
array[i] = array[j]
array[j] = temp
}
}
}
}
/*统计平均成绩,并输出各分数段的人数*/
void print_score(struct stu array[], int n)
{
int i
double ave = 0
int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0
for (i = 0i <ni++)
{
ave += array[i].average
switch ((int)(array[i].average / 10))
{
case 10:
case 9: sum1++break
case 8: sum2++break
case 7:
case 6: sum3++break
default: sum4++
}
}
printf("全班的平均分为:%.1f\n", ave/n)
printf("平均分在90分以上的人数为:%d\n", sum1)
printf("平均分在80~89的人数为:%d\n", sum2)
printf("平均分在60~79的人数为:%d\n", sum3)
printf("平均分在60分以下的人数为:%d\n", sum4)
}
/*输出不及格科目及学生名单*/
void print_unreach(struct stu array[], int n)
{
int i
printf("科目\t学号\t名字\n")
for (i = 0i <ni++)
{
if (array[i].Chinese <60)
{
printf("语文\t%s\t%s\n", array[i].id, array[i].name)
}
if (array[i].Math <60)
{
printf("数学\t%s\t%s\n", array[i].id, array[i].name)
}
if (array[i].English <60)
{
printf("英语\t%s\t%s\n", array[i].id, array[i].name)
}
}
}
/*打印优等生名单*/
void print_good(struct stu array[], int n)
{
int i
char mark = 0
if (n >3)
{
n = 3
}
printf("学号\t姓名\t语文\t数学\t英语\t平均分\t名次\n")
for (i = 0i <ni++)
{
if ((array[i].Chinese >60) &&(array[i].Math >60) &&(array[i].English >60))
{
if (array[i].average >90) mark = 1
else if (array[i].average >85)
{
if (array[i].Chinese == 100) mark = 1
if (array[i].Math == 100) mark = 1
if (array[i].English == 100) mark = 1
if (array[i].Chinese >95 &&array[i].English >95) mark = 1
if (array[i].Chinese >95 &&array[i].Math >95) mark = 1
if (array[i].Math >95 &&array[i].English >95) mark = 1
}
if (mark == 1)
{
printf("%s\t%s\t", array[i].id, array[i].name)
printf("%.f\t%.f\t%.f\t%.1f\t", array[i].Chinese, array[i].Math, array[i].English, array[i].average)
printf("%d\n", i+1)
}
}
}
}
/*按学生姓名查询成绩*/
void search_name(struct stu array[], int n, char* name)
{
int i
char mark = 1
for (i = 0i <ni++)
{
if (strcmp(name, array[i].name) == 0)
{
printf("学生姓名:%s\n", name)
printf("学生学号:%s\n", array[i].id)
printf("语文:%.f\n", array[i].Chinese)
printf("数学:%.f\n", array[i].Math)
printf("英语:%.f\n", array[i].English)
printf("平均分:%.1f\n", array[i].average)
mark = 0
}
}
if (mark == 1) puts("不存在该学生记录")
}
/*按学生学号查询成绩*/
void search_id(struct stu array[], int n, char* id)
{
int i
char mark = 1
for (i = 0i <ni++)
{
if (strcmp(id, array[i].id) == 0)
{
printf("学生姓名:%s\n", array[i].name)
printf("学生学号:%s\n", array[i].id)
printf("语文:%.f\n", array[i].Chinese)
printf("数学:%.f\n", array[i].Math)
printf("英语:%.f\n", array[i].English)
printf("平均分:%.1f\n", array[i].average)
mark = 0
break
}
}
if (mark == 1) puts("不存在该学生记录")
}
void print_menu()
{
system("cls")
printf("1.输入学生信息\n")
puts("2.统计全班学生成绩")
puts("3.按学号查询学生成绩")
puts("4.按姓名查询学生成绩")
puts("5.输出不及格情况")
puts("6.输出优等生名单")
puts("0.退出本程序")
printf("\n\n 请输入你的选择:")
}
int main(int argc, char **argv)
{
char ch = 0
char id[8], name[8]
while (ch != '0')
{
print_menu()
ch = getchar()
switch (ch)
{
case '1':
{
system("cls")
input()
sort(students, current)
break
}
case '2':
{
system("cls")
print_score(students, current)
break
}
case '3':
{
system("cls")
printf("请输入学号:")
scanf("%s", id)
search_id(students, current, id)
break
}
case '4':
{
system("cls")
printf("请输入姓名:")
scanf("%s", name)
search_name(students, current, name)
break
}
case '5':
{
system("cls")
print_unreach(students, current)
break
}
case '6':
{
system("cls")
print_good(students, current)
break
}
case '0': exit(0)
}
printf("\n\n按任意键返回主菜单……")
getchar()
getchar()
}
return 0
}
代码如下:
#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