📄 040530513.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "conio.h"
#include<malloc.h>
typedef struct lesson{
char cause[11];//course
int score;
char teacher[11];
struct lesson *next;
}lesson1;
typedef struct student{
char ID[20];
char name[20];
int age;
char sex; //m表示男生 ,f表示女生
int num; //记录课程数目
int flag;
struct lesson *next;
}list;
typedef struct hash // 定义哈希表
{
list elem[11];
int length;
}hash;
typedef struct
{
int key;
int age;
}sqlist;
typedef struct{
int age; //年龄
char key[17]; //班级里的学号
int mark; //学生的平均成绩
int num; //几门课
}info;
typedef struct{//构造存储学生学号信息的结构体
info r[11];//学号
int length;//学生个数
}st;
int change(char ID[]) //提取学号后三位
{
int I=0,t1=0,t2=0,t3=0;
t1=ID[6]-48;
t2=ID[7]-48;
t3=ID[8]-48;
I=100*t1+10*t2+t3;
return I;
}
int adress(hash *stu,char *ID)//生成地址
{
int i,j=0,I;
I=change(ID);
i=I%11;
if(stu->elem[i].age!=-1)
{
j=i+1;
if(j>11)
j=j-11;
for(;stu->elem[j].age!=-1;)
{
j++;
if(j>=11)
j=j-11;
}
}
if(j!=0)
return j;
else
return i;
}
hash *inithash(hash *stu)
{
int n,i,j,q;
lesson1 *s,*t;
char m[17]; ///学号
printf("输入学生数目: ");
scanf("%d",&n);
stu->length=11; //
printf("\n\n");
for(i=0;i<11;i++) ///
stu->elem[i].age=-1;
for(i=0;i<n;i++)
{
printf(" 学号\t");
printf(" 姓名\t");
printf(" 年龄\t");
printf(" 性别\t\n");
scanf("%s",m);
q=adress(stu,m);
strcpy(stu->elem[q].ID,m);
scanf("%s",stu->elem[q].name);
scanf("%d",&stu->elem[q].age);
scanf(" %c",&stu->elem[q].sex);
/* if(stu->elem[q].sex!='m'&&stu->elem[q].sex!='f') ////判断输入性别合法是否
{
printf("输入有误,请重新输入:");
scanf("%c",&x);
stu->elem[q].sex=x;
printf("\n");
}*/
printf("请输入课程数目: ");
scanf("%d",&stu->elem[q].num);
printf("\n");
printf("请输入该同学的课程信息:\n");
printf("课程\t");
printf("分数\t");
printf("教师\n");
stu->elem[q].next=(lesson1*)malloc(sizeof(lesson1));
s=stu->elem[q].next;
for(j=0;j<stu->elem[q].num;j++)
{
scanf("%s %d %s",s->cause,&s->score,s->teacher);
s->next=(lesson1*)malloc(sizeof(lesson1));
t=s;
s=s->next;
}
free(s);
t->next=NULL;
printf("\n");
}
return stu;
}
// 输出全部信息
void print(hash *stu)
{
int i;
//int z; //看是否有信息
lesson1 *s;
printf("\n\n");
printf(" 学号 \t姓名 \t年龄 \t性别 \t");
printf(" 课程 \t 分数 \t 教师\n");
printf("\n\n");
for(i=0;i<stu->length;i++)
{
if(stu->elem[i].age!=-1)
{
printf(" %s\t",stu->elem[i].ID);
printf("%s\t",stu->elem[i].name);
printf(" %d\t",stu->elem[i].age);
printf(" %c\t",stu->elem[i].sex);
s=stu->elem[i].next;
while(s)
{
printf("%-6s",s->cause);
printf("\t %-d\t",s->score);
printf(" %s\n",s->teacher);
s=s->next;
printf("\n");
printf("\t\t\t\t\t");
}
printf("\n");
}
}
}
//判断输入学号是否合法
int judge1(char *num){
int i;
for(i=0;i<=8;i++)
if(num[i]=='#')
return 0;//输入不合法
return 1;
}
//按学号查找
void xuehao(hash*stu)
{
char id[9];
int i;
lesson1 *s;
printf("\n");
printf("请输入要查找的学生的学号: ");
scanf("%s",id);
printf("\n");
if(judge1(id)==0)
printf("学号输入有误");
for(i=0;i<stu->length;i++)
if(stu->elem[i].age!=-1)
{
if(strcmp(id,stu->elem[i].ID)==0) ///chazhao dao xuehao
{
printf(" 学号 \t姓名 \t年龄 \t性别 \t");
printf(" 课程 \t 分数 \t 教师\n\n");
printf(" %s\t",stu->elem[i].ID);
printf("%s\t",stu->elem[i].name);
printf(" %d\t",stu->elem[i].age);
printf(" %c\t",stu->elem[i].sex);
s=stu->elem[i].next;
while(s)
{
printf("%-6s",s->cause);
printf("\t %-d\t",s->score);
printf(" %s\n",s->teacher);
s=s->next;
printf("\n");
printf("\t\t\t\t\t");
}
printf("\n");
break;
}
}
if(i==stu->length)
{
system("cls");
printf("没有查到该学号学生的信息\n");
}
}
//按姓名查找
void xingming(hash*stu)
{
int i;
char name[11];
lesson1 *s;
printf("\n");
printf("请输入要查找的学生的姓名:");
scanf("%s",name);
printf("\n");
for(i=0;i<stu->length;i++)
if(stu->elem[i].age!=-1)
{
if(strcmp(name,stu->elem[i].name)==0) ///chazhao dao xuehao
{
printf(" 学号 \t姓名 \t年龄 \t性别 \t");
printf(" 课程 \t 分数 \t 教师\n\n");
printf(" %s\t",stu->elem[i].ID);
printf("%s\t",stu->elem[i].name);
printf(" %d\t",stu->elem[i].age);
printf(" %c\t",stu->elem[i].sex);
s=stu->elem[i].next;
while(s)
{
printf("%-6s",s->cause);
printf("\t %-d\t",s->score);
printf(" %s\n",s->teacher);
s=s->next;
printf("\n");
printf("\t\t\t\t\t");
}
break;
}
}
printf("\n");
if(i==stu->length)
printf("没有查到该学生的信息\n");
}
int judge2(char sex) //判断输入性别是否合法
{ if(sex=='m'||sex=='f')
return 1;
else
return 0;
}
void nannv(hash*stu)
{
int i,j=0;
char sex;
lesson1 *s;
printf("\n");
printf("请输入要查找的学生的性别: ");
scanf("%s",&sex);
printf("\n");
if(judge2(sex)==0)
printf("输入错误\n");
else
{
printf(" 学号 \t姓名 \t年龄 \t性别 \t");
printf(" 课程 \t 分数 \t 教师\n");
for(i=0;i<stu->length;i++)
if(stu->elem[i].age!=-1)
{
if(stu->elem[i].sex==sex)
{
printf("\n");
printf(" %s\t",stu->elem[i].ID);
printf("%s\t",stu->elem[i].name);
printf(" %d\t",stu->elem[i].age);
printf(" %c\t",stu->elem[i].sex);
s=stu->elem[i].next;
j++;
s=stu->elem[i].next;
while(s)
{
printf("%-6s",s->cause);
printf("\t %-d\t",s->score);
printf(" %s\n",s->teacher);
s=s->next;
printf("\n");
printf("\t\t\t\t\t");
}
}
}
}
}
void nanji(hash*stu) /// 某年级的全部课程
{
int i,l,j=0,m=0;
char *c[17]; //一个年级所开课程不超过17门
char s[4]; //年级的代码
lesson1 *p;
for(i=0;i<10;i++)
{
c[i]=(char *)malloc(17*sizeof(char));
c[i]="*******";
}
printf("\n");
printf("输入所要查找的年级: ");
scanf("%s",s);
for(i=0;i<stu->length;i++)
if(stu->elem[i].age!=-1)//
{
if(s[3]==stu->elem[i].ID[3])
{
p=stu->elem[i].next;
while(p)
{
c[j]=p->cause;
p=p->next;
j++;
}
}
}
printf("\n\n");
printf("大学%d年级的全部课程为:",7-s[3]+48);
for(i=0;i<10&&c[i]!="*******";i++)
{
for(j=0,l=0;j<i;j++)
if(strcmp(c[i],c[j])!=0)
l++;
if(l==i)
printf("\t%s",c[i]);
}
printf("\n\n\n");
}
// 听某教师讲授课的全部学生
void teacher(hash*stu)
{
char m[7];
int i,j=0; ///j标记是否查到
lesson1 *s;
printf("\n");
printf("请输入教师的姓名: ");
scanf("%s",m);
printf("\n");
printf("该教师的学生: ");
for(i=0;i<stu->length;i++)
if(stu->elem[i].age!=-1)
{
s=stu->elem[i].next;
while(s)
{
if(strcmp(s->teacher,m)==0)
{
printf("%s\t",stu->elem[i].name);
j++;
break;
}
s=s->next;
}
}
printf("\n\n\n");
if(j==0)
printf("没有查到该教师的学生!\n");
}
void kecheng(hash*stu) ///选修某门课程的全部学生
{
char g[17];
int i,j=0;
lesson1 *s;
printf("\n");
printf("输入所要查找的课程:");
scanf("%s",g);
printf("\n");
printf("学习有该课程的学生: ");
for(i=0;i<stu->length-1;i++)
if(stu->elem[i].age!=-1)
{
s=stu->elem[i].next;
while(s)
{
if(strcmp(s->cause,g)==0)
{
printf("%s\t",stu->elem[i].name);
j++;
break;
}
s=s->next;
}
}
printf("\n\n");
if(j==0)
printf("没有查到学习该课程的学生!\n\n");
}
int chaxun(hash*stu)
{
int i;
while(1)
{
printf("\n\n\n");
printf( "1:按学号查找\n\n2:按姓名顺序查找\n\n3:按男/女生查找\n\n4:某年级的全部课程\n\n5:听某教师讲授课的全部学生\n\n6:选修某门课程的全部学生\n\n7:返回\n\n8:退出系统\n\n");
printf("请选择操作: ");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1:
system("cls");
xuehao(stu);
break;
case 2:
system("cls");
xingming(stu);
break;
case 3:
system("cls");
nannv(stu);
break;
case 4:
system("cls");
nanji(stu);
break;
case 5:
system("cls");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -