⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 学生成绩shu.cpp

📁 某个班一个学期的学生成绩管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <iostream.h> // cin 及 cout 
#include <stdlib.h> 
#include <malloc.h> // 用到申请内存函数 malloc() 和释放内存函数 free() 
#include <string.h> // 字符串处理 
#include <stdio.h> // 文件操作(读文件) 
struct address /*家庭地址*/ 
{ 
char city[10]; /*城市*/ 
char town[10]; /*县城*/ 
char village[10]; /*乡镇*/ 
}; 

struct telephone /*联系方式*/ 
{ 
char SJ[50]; /*手机*/ 
char JD[30]; /*家庭电话*/ 
char XD[30]; /*学校电话*/ 
}; 

struct person /*个人信息*/ 
{ 
char name[20]; /*名字*/ 
char sex[10] ; /*性别*/ 
char MZ[16]; /*民族*/ 
char GJ[17]; /*国籍*/ 
char XL[19]; /*学历*/ 
}; 

struct score //成绩 
{ 
char num[20]; //学号 
char english[20]; 
char chinese[20]; 
char math[20]; 
char physics[20]; 
}; 

typedef struct linknode //定义节点的类型 
{ 
char address[100]; //地址 
char birthday[100]; //出生日期 
struct score sc; //成绩 
struct person pe; //个人信息 
struct telephone te; //联系方式 
bool flag; 
struct linknode* next; 
}nodetype; 

class List 
{ 
nodetype* head; 

public: 
List(); 
List::~List(); 

linknode* creatlist(int); //创建链表 
int listlen(); //返回链表长度 
nodetype* findnode(int); //通过查找序号返回节点的指针 
nodetype* find(char c[]); //通过查找姓名返回节点的指针 
int find2(char c[]); //通过查找姓名返回节点的序号 
nodetype* insnode(int); //插入节点 
void delnode(int); //删除节点 

nodetype* load(); //初始化:从外部读入数据 

void readstr(FILE *f,char *string); //读行函数 
bool check(char *a, char *b); //对比两个字符串是否相等 
void help(); //显示帮助菜单 

void editperson(nodetype*); //编辑个人说明 
void editscore(nodetype*); //编辑学科成绩 
void edittelephone(nodetype*); //编辑联系方式 

void dispname(); //显示所有学生姓名 
void dispnode(nodetype* p); //显示一个学生的所有信息 
void dispperson(nodetype*); //显示一个学生的个人说明 
void dispscore(nodetype*); //显示一个学生的学科成绩 
void disptelephone(nodetype*); //显示一个学生的联系方式 

}; 
bool List::check(char *a, char *b) //对比两个字符串是否相等 
{ 
int i; 
int j=strlen(b); 
for(i=0; i<j; i++) 
{ 
if(*a==*b) 
{ 
a++; 
b++; 
} 
else 
return 0; 
} 
return 1; 
} 


nodetype* List::creatlist (int n) //创建链表 
{ 
nodetype *h=NULL, *s, *t; 
int i=1; 

for(int j=0; j<n; j++) 
{ 
if(i==1) //创建第一个节点 
{ 
h=(nodetype*)malloc(sizeof(nodetype)); 
h->next=NULL; 
t=h; 
} 
else //创建其余节点 
{ 
s=(nodetype*)malloc(sizeof(nodetype)); 
s->next=NULL; 
t->next=s; 
t=s; //t 始终指向生成的单链表的最后一个节点 
} 

i++; 
} 

head=h; 
return h; 
} 


void List::readstr(FILE *f,char *string) 
{ 
do 
{ 
//①: 先读入一行文本 
fgets(string, 255, f); //fgets(): 从文件 f 读入长度为 255-1 的字符串 
// 并存入到 string 中 
} while ((string[0] == '/') || (string[0] == '\n')); 

return; 
} 

nodetype* List::load() 
{ 
FILE *fp; 
nodetype *p; 
char c[255]; 
int num; 
if((fp=fopen("student.txt", "r"))==NULL) 
{ 
cout<<"打开文件失败"<<endl; 
return 0; 
} 
readstr(fp, c); 
sscanf(c, "The Length Of Link: %d", &num); //获取链表长度 

p=creatlist(num); //创建链表 

for(int i=0; i<num; i++) 
{ 
readstr(fp, c); 
strcpy(p->address, c); 
readstr(fp, c); 
strcpy(p->birthday, c); 

readstr(fp, c); 
strcpy(p->sc.num, c); 
readstr(fp, c); 
strcpy(p->sc.chinese, c); 
readstr(fp, c); 
strcpy(p->sc.english, c); 
readstr(fp, c); 
strcpy(p->sc.math, c); 
readstr(fp, c); 
strcpy(p->sc.physics, c); 

readstr(fp, c); 
strcpy(p->pe.name, c); 
readstr(fp, c); 
strcpy(p->pe.sex, c); 
readstr(fp, c); 
strcpy(p->pe.GJ, c); 
readstr(fp, c); 
strcpy(p->pe.MZ, c); 
readstr(fp, c); 
strcpy(p->pe.XL, c); 

readstr(fp, c); 
strcpy(p->te.SJ, c); 
readstr(fp, c); 
strcpy(p->te.JD, c); 
readstr(fp, c); 
strcpy(p->te.XD, c); 

p=p->next; 
} 

fclose(fp); 

return p; 
} 

void List::dispnode(nodetype* p) //显示一个学生的所有信息 
{ 
if(p!=NULL) 
{ 
dispperson(p); 
dispscore(p); 
disptelephone(p); 
} 
} 

void List::dispname() //显示所有学生姓名 
{ 
nodetype* p=head; 
cout<<"现有的学生: "<<endl; 
if(p==NULL) 
cout<<"没有任何学生数据"<<endl; 
while(p!=NULL) 
{ 
cout<<"姓名: "<<p->pe.name; 

p=p->next; 
} 
} 

int List::listlen() //返回链表长度 
{ 
int i=0; 
nodetype* p=head; 
while(p!=NULL) 
{ 
p=p->next; 
i++; 
} 
return i; 
} 

nodetype* List::findnode (int i) //通过查找序号返回节点的指针 
{ 
nodetype* p=head; 
int j=1; 
if( i>listlen()||i<=0 ) // i 上溢或下溢 
return NULL; 
else 
{ 
while( p!=NULL && j<i ) //查找第 i 个节点并由 p 指向该节点 
{ 
j++; 
p=p->next; 
} 
return p; 
} 
} 

nodetype* List::find(char c[]) //通过查找姓名返回节点的指针 
{ 
nodetype* p=head; 
int j=1; 
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符 
while( p!=NULL && !(check(c, p->pe.name))) //查找第 i 个节点并由 p 指向该节点 
{ 
j++; 
p=p->next; 
} 
return p; 
} 

int List::find2(char c[]) //通过查找姓名返回节点的序号 
{ 
nodetype* p=head; 
int j=1; 
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符 
while( p!=NULL && !(check(c, p->pe.name))) //查找第 i 个节点并由 p 指向该节点 
{ 
j++; 
p=p->next; 
} 
return j; 
} 

nodetype* List::insnode(int i) 
{ 
nodetype *h=head, *p, *s; 
s=(nodetype*)malloc(sizeof(nodetype)); //创建节点 s 
s->next=NULL; 
if(i==0) //i=0 时 s 作为该单链表的第一个节点 
{ 
s->next = h; 
h=s; //重新定义头节点 
} 
else 
{ 
p=findnode(i); //查找第 i 个节点,并由 p 指向该节点 
if(p!=NULL) 
{ 
s->next=p->next; 
p->next=s; 
} 
else cout<<"输入的 i 值不正确"<<endl; 
} 
head=h; 

return s; 
} 

void List::delnode(int i) //删除第 i 个节点 
{ 
nodetype *h=head, *p=head, *s; 
int j=1; 
if(i==1) //删除第一个节点 
{ 
h=h->next; 
free(p); 
} 
else 
{ 
p=findnode(i-1); //查找第 i-1 个节点,并由 p 指向这个节点 
if(p!=NULL && p->next!=NULL) 
{ 
s=p->next; // s 指向要删除的节点 
p->next=s->next; 
free(s); 
} 
else 
cout<<"输入的 i 值不正确"<<endl; 
} 
head=h; 
} 

void List::editperson(nodetype* p) 
{ 
char c[100]; 
cout<<"请输入姓名: "<<endl; 
cin>>c; 
strcat(c, "\n"); 
strcpy(p->pe.name, c); 

cout<<"请输入性别:"<<endl; 
cin>>c; 
strcat(c, "\n"); 
strcpy(p->pe.sex, c); 

cout<<"请输入生日(格式举例:1982-1-1): "<<endl; 
cin>>c; 
strcat(c, "\n"); 
strcpy(p->birthday, c); 

cout<<"请输入民族:"<<endl; 
cin>>c; 
strcat(c, "\n"); 
strcpy(p->pe.MZ, c); 

cout<<"请输入国籍:"<<endl; 
cin>>c; 
strcat(c, "\n"); 
strcpy(p->pe.GJ, c); 

cout<<"请输入学历:"<<endl; 
cin>>c; 
strcat(c, "\n"); 
strcpy(p->pe.XL, c); 

cout<<"请输入家庭住址(例如:广西玉林市解放路11号)"<<endl; 
cin>>c; 
strcat(c, "\n"); 
strcpy(p->address, c); 

cout<<"编辑个人信息完成!"<<endl; 

dispperson(p); 
} 

void List::editscore(nodetype* p) 
{ 
char a[50]; 
cout<<"请输入学号: "<<endl; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -