//多给点财富吧
#include<stdio.h>
#include<stdlib.h>
typedef struct tagHuJiXinXi
{
char shfzhh[64]//身份z号
char xm[16]//姓名
char xb[8]//性别
int nl//年龄
char xl[64]//学历
char zhzh[64]//住址
char dh[32]//电话
}HuJiXinXi,*PtHuJiXinXi
void readfromfile()
void writetofile()
void tuichu()
void add()
void outputone()
void outputall()
void sortbyage()
void myrealloc()
void findbyagerange()
void del()
void alter()
void find()
void showmenu()
void processmenu(int m)
PtHuJiXinXi pt
int count=0,capacity=16
int main()
{
int m
pt=(PtHuJiXinXi)calloc(capacity,sizeof(HuJiXinXi))
readfromfile()
while(1)
{
showmenu()
scanf("%d",&m)
processmenu(m)
}
system("PAUSE")
return EXIT_SUCCESS
}
void processmenu(int m)
{
switch(m)
{
case 0:
tuichu()
break
case 1:
add()
break
case 2:
del()
break
case 3:
alter()
break
case 4:
outputall()
break
case 5:
sortbyage()
break
case 6:
findbyagerange()
break
case 7:
writetofile()
break
case 8:
find()
break
default:
printf("不可识别的命令。\n")
}
}
//数铅段实现存储空间的自动扩充
void myrealloc()
{
if(count+1>=capacity)
{
int i
capacity*=2
PtHuJiXinXi temppt=(PtHuJiXinXi)calloc(capacity,sizeof(HuJiXinXi))
for(i=0i<counti++)
{
temppt[i]=pt[i]
}
free(pt)
pt=temppt
}
}
void readfromfile()
{
char f[128]
FILE *inf
HuJiXinXi hjxx
printf("请输入包含户籍信薯誉息的文件的文件名,如果还没有文件,请输入omit(文激昌件中每行一条户籍信息,")
printf("格式:身份z号 姓名 性别 年龄 学历 住址 电话)...\n")
gets(f)
if(!strcmp(f,"omit"))
{
return
}
inf=fopen(f,"r")
if(NULL!=inf)
{
do
{
fscanf(inf,"%s %s %s %d %s %s %s",hjxx.shfzhh,hjxx.xm,hjxx.xb,&hjxx.nl,hjxx.xl,hjxx.zhzh,hjxx.dh)
myrealloc()
pt[count++]=hjxx
}while(!feof(inf))
fclose(inf)
printf("信息已成功加载。\n")
}
else
{
printf("文件名无效或文件无数据。\n")
}
}
void writetofile()
{
char f[128]={'\0'}
FILE *outf
int i
printf("请输入保存户籍信息的文件的文件名:\n")
scanf("%s",f)
outf=fopen(f,"w")
if(NULL!=outf)
{
for(i=0i<counti++)
{
fprintf(outf,"%s %s %s %d %s %s %s",pt[i].shfzhh,pt[i].xm,pt[i].xb,pt[i].nl,pt[i].xl,pt[i].zhzh,pt[i].dh)
if(count-1!=i)
{
fprintf(outf,"%s","\n")
}
}
fclose(outf)
printf("文件保存成功。\n")
}
else
{
printf("文件名无效。\n")
}
}
void showmenu()
{
char menu[]="菜单:\n0、退出\n1、添加一条信息\n2、删除一条信息\n3、批量修改\n4、浏览全部信息\n5、按年龄排序 \n6、按年龄区间查询\n7、保存到文件\n8、随意查询\n请选择一个菜单:"
puts(menu)
}
void tuichu()
{
if(NULL==pt)
{
free(pt)
}
exit(0)
}
//判断身份z号是否重复
int isshfzhhchf(char s[64])
{
int i,r=0
for(i=0i<counti++)
{
if(!strcmp(pt[i].shfzhh,s))
{
r=1
break
}
}
return r
}
void add()
{
myrealloc()
printf("添加一条户籍信息。\n")
printf("请输入身份z号 姓名 性别 年龄 学历 住址 电话:\n")
scanf("%s %s %s %d %s %s %s",pt[count].shfzhh,pt[count].xm,pt[count].xb,&pt[count].nl,
pt[count].xl,pt[count].zhzh,pt[count].dh)
if(!isshfzhhchf(pt[count].shfzhh))
{
count++
printf("添加成功。\n")
}
else
{
printf("身份z号重复,添加失败。\n")
}
}
//输出下标为n的一条户籍信息
void outputone(int n)
{
if(n>=0 &&n<count)
{
printf("第%d条户籍信息:\n",n+1)
printf("%s %s %s %d %s %s %s。\n",pt[n].shfzhh,pt[n].xm,pt[n].xb,pt[n].nl,pt[n].xl,pt[n].zhzh,pt[n].dh)
}
else
{
printf("没有第%d条户籍信息存在。\n",n+1)
}
}
void outputall()
{
if(0==count)
{
printf("系统已空。\n")
}
else
{
int i
for(i=0i<counti++)
{
outputone(i)
}
}
}
void sortbyage()
{
int i,j,px
HuJiXinXi hjxx
printf("子菜单:\n1、升序\n2、降序\n请选择:")
scanf("%d",&px)
if(1==px || 2==px)
{
for(i=0i<count-1i++)
{
for(j=0j<count-i-1j++)
{
if(1==px)
{
if(pt[j].nl>pt[j+1].nl)
{
hjxx=pt[j+1]
pt[j+1]=pt[j]
pt[j]=hjxx
}
}
else
{
if(pt[j].nl<pt[j+1].nl)
{
hjxx=pt[j+1]
pt[j+1]=pt[j]
pt[j]=hjxx
}
}
}
}
printf("排序完成。\n")
}
else
{
printf("无法处理的子菜单命令。\n")
}
}
void findbyagerange()
{
int i,min,max,c=0
printf("请输入要查找的户籍信息的最小年龄和最大年龄:")
scanf("%d %d",&min,&max)
printf("查询结果如下:\n")
for(i=0i<counti++)
{
if(pt[i].nl>=min &&pt[i].nl<=max)
{
outputone(i)
printf("符合你的要求。\n")
c++
}
}
if(0==c)
{
printf("没有符合你的要求的户籍信息。\n")
}
}
//删除一条户籍信息
void del()
{
int i,n
HuJiXinXi hjxx
printf("请输入要删除的是第几条户籍信息:")
scanf("%d",&n)
if(n-1>=0 &&n-1<count)
{
hjxx=pt[n-1]
for(i=ni<counti++)
{
pt[i-1]=pt[i]
}
printf("删除成功。\n第%d条户籍信息:\n",n)
printf("%s %s %s %d %s %s %s。",hjxx.shfzhh,hjxx.xm,hjxx.xb,hjxx.nl,hjxx.xl,hjxx.zhzh,hjxx.dh)
printf(",已删除。\n")
count--
}
else
{
printf("删除失败。\n不存在第%d条户籍信息。\n",n)
}
}
//根据hjxx的值修改下标为n的户籍信息
//对于pt[n]的对应字段,如果在hjxx中是用*表示的,则不修改
void change(HuJiXinXi hjxx,int n)
{
//返回非0值,意味着hjxx.shfzhh(身份z号)不等于*,即需要修改pt[n].shfzhh字段,以下都类似
if(strcmp(hjxx.shfzhh,"*"))
{
strcpy(pt[n].shfzhh,hjxx.shfzhh)
}
if(strcmp(hjxx.xm,"*"))
{
strcpy(pt[n].xm,hjxx.xm)
}
if(strcmp(hjxx.xb,"*"))
{
strcpy(pt[n].xb,hjxx.xb)
}
//不等于-1表示需要修改pt[n].nl(年龄)
if(-1!=hjxx.nl)
{
pt[n].nl=hjxx.nl
}
if(strcmp(hjxx.xl,"*"))
{
strcpy(pt[n].xl,hjxx.xl)
}
if(strcmp(hjxx.zhzh,"*"))
{
strcpy(pt[n].zhzh,hjxx.zhzh)
}
if(strcmp(hjxx.dh,"*"))
{
strcpy(pt[n].dh,hjxx.dh)
}
}
//对户籍信息进行批量修改
void alter()
{
int n
HuJiXinXi hjxx
char nl[16]
while(1)
{
printf("请输入要修改第几条户籍信息(-1退出循环):")
scanf("%d",&n)
if(-1==n)
{
break
}
else if(n-1>=0 &&n-1<count)
{
printf("修改...\n")
outputone(n-1)
printf("请输入将此户籍信息修改后的新的姓名 性别 年龄 学历 住址 电话(保持原值的用*代替):\n")
scanf("%s %s %s %s %s %s",hjxx.xm,hjxx.xb,nl,hjxx.xl,hjxx.zhzh,hjxx.dh)
//因为只有nl(年龄)是int型,故对nl作特殊处理,-1表示修改时年龄保持原值不变(不修改)
hjxx.nl=(strcmp(nl,"*") ? atoi(nl) : -1)
strcpy(hjxx.shfzhh,"*")
change(hjxx,n-1)
printf("修改完成。\n")
}
else
{
printf("无法修改,不存在第%d条户籍信息。\n",n)
}
}
}
//用于判断pt[n]是否匹配hjxx的模式
int ismatch(HuJiXinXi hjxx,int n)
{
int r=1
if(strcmp(hjxx.shfzhh,"*") &&strcmp(hjxx.shfzhh,pt[n].shfzhh))
{
r=0
}
if(r &&strcmp(hjxx.xm,"*") &&strcmp(hjxx.xm,pt[n].xm))
{
r=0
}
if(r &&strcmp(hjxx.xb,"*") &&strcmp(hjxx.xb,pt[n].xb))
{
r=0
}
if(r &&-1!=hjxx.nl &&hjxx.nl!=pt[n].nl)
{
r=0
}
if(r &&strcmp(hjxx.xl,"*") &&strcmp(hjxx.xl,pt[n].xl))
{
r=0
}
if(r &&strcmp(hjxx.zhzh,"*") &&strcmp(hjxx.zhzh,pt[n].zhzh))
{
r=0
}
if(r &&strcmp(hjxx.dh,"*") &&strcmp(hjxx.dh,pt[n].dh))
{
r=0
}
return r
}
//按模式查询户籍信息
void find()
{
int i,c=0
char nl[16]
HuJiXinXi hjxx
printf("请输入要查询的户籍信息的身份z号 姓名 性别 年龄 学历 住址 电话(只需提供关键信息以用于查询,不提供的信息请用*代替):\n")
scanf("%s %s %s %s %s %s %s",hjxx.shfzhh,hjxx.xm,hjxx.xb,nl,hjxx.xl,hjxx.zhzh,hjxx.dh)
//因为只有nl(年龄)是int型,故对nl作特殊处理,-1表示查询时不需比较年龄
hjxx.nl=(strcmp(nl,"*") ? atoi(nl) : -1)
for(i=0i<counti++)
{
if(ismatch(hjxx,i))
{
printf("找到第%d条满足你的模式要求的户籍信息如下:\n",c+1)
printf("%s %s %s %d %s %s %s。\n",pt[i].shfzhh,pt[i].xm,pt[i].xb,pt[i].nl,pt[i].xl,pt[i].zhzh,pt[i].dh)
c++
}
}
if(!c)
{
printf("系统中没有满足你的模式要求的户籍信息。\n")
}
}
#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
}
512行的#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
//***********************函数声明*********************
int menu()//菜单
struct scorenode *create(void)//创建链表,并返回链表的头指针
struct scorenode *load() //调用导入学生记录函数
struct scorenode *search(struct scorenode *) //成绩查询函数
struct scorenode *del(struct scorenode *) //删除学生资料
struct scorenode *add(struct scorenode *) //追加学生资料
void print_s(struct scorenode *) //显示学生资掘芹侍料
void statistics(struct scorenode *) //统计学生成绩函数
void save(struct scorenode *) //保存学生资料
void sort(struct scorenode *) //排序函数
//*******************数据定义*************************
struct scorenode
{
int number //学号
char name[10] //姓名
float physics //物理成绩
float english //英语成绩
float maths //数学成绩
struct scorenode *next//存储下一个结点的地址
}
int n //n为全局变量,存储录入的人数
//*********************主程序*************************
void main()
{
struct scorenode *head=NULL,*stu=NULL //定义链表头指针为空
int k
while(1)
{
k=menu()
switch(k)
{
case 1:head=create()break //创建链表,录入数据
case 2:head=load()break //调用导入判吵学生函首正数
case 3:head=search(head)break //成绩查询函数函数
case 4:head=del(head)break //删除学生资料函数
case 5:head=add(head)break //追加学生资料函数
case 6:print_s(head)break //显示学生资料函数
case 7:statistics(head)break//统计学生成绩函数
case 8:save(head)break //保存学生的资料
case 9:sort(head)break //排序函数
case 0:exit(0)
default:printf("输入错误,请重试!\n")
}
}
}
//*********************菜单选择界面**********************
int menu()
{
int i,k
printf("\n\t\t\t欢迎进入成绩管理系统\n\n")
printf("\t\t\t04电子应用\n")
for(i=0i<80i++)
printf("*")
printf("1.输入学生的资料\t 2.从文件调入资料\t 3.查询学生的成绩\n")
printf("4.删除学生的资料\t 5.追加学生的资料\t 6.显示学生的成绩\n")
printf("7.统计学生的成绩\t 8.保存输入的资料\t 9.对成绩进行排序\n")
printf("0.退出\n")
for(i=0i<80i++)
printf("*")
printf("请选择您的 *** 作:")
scanf("%d",&k) //读取输入的选择
getchar() //吸收回车符
return(k)
}
//***************创建链表,并返回链表的头指针******************
struct scorenode *create(void)
{
struct scorenode *head=NULL //定义链表头指针为空
struct scorenode *p1,*p2,*p3
int i
n=0
p1=p2=p3=(struct scorenode*)malloc(sizeof(struct scorenode)) //开辟一个新的存储单元
while(1)
{
printf("请输入学生资料,输(0)退出!\n")
repeat:
printf("请输入学号(学号应大于0):")
scanf("%d",&p1->number)
while(p1->number<0) //判断输入学号是否正确
{
printf("输入错误,请重新输入学号:")
scanf("%d",&p1->number)
}
getchar() //吸收回车符
if(p1->number==0)//输入为0,退出
goto endd
else
{
p3=head
if(n>0)
{
for(i=0i<ni++)
{
if(p1->number!=p3->number) //判断输入的学号是否重复
p3=p3->next
else
{
printf("学号重复,请重输!\n")
goto repeat
}
}
}
}
printf("请输入姓名:")
scanf("%s",&p1->name)
printf("请输入物理,英语,数学成绩(0-100):")
scanf("%f,%f,%f",&p1->physics,&p1->english,&p1->maths)
while(p1->physics<0||p1->physics>100||p1->english<0||p1->english>100
||p1->maths<0||p1->maths>100)//判断输入的成绩数据是否正确
{
printf("输入错误,请重新输入成绩:")
scanf("%f,%f,%f",&p1->physics,&p1->english,&p1->maths)
}
getchar() //吸收回车符
n=n+1 //录入的人数加1
if(n==1)
head=p1
else
{
p2->next=p1
p2=p1 //存储此次录入的数据
}
p1=(struct scorenode*)malloc(sizeof(struct scorenode)) //开辟一个新的存储单元
}
endd:
p2->next=NULL
save(head)
return(head) //返回此次录入的链表值
}
//***********************保存学生资料************************
void save(struct scorenode *p1)
{
FILE *fp
if((fp=fopen("scroce.txt","w"))==NULL)
{
printf("不能打开文件!\n")
}
while(p1!=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\n",p1->number,p1->name,p1->physics,
p1->english,p1->maths)
p1=p1->next //下移一个结点
}
fclose(fp)
printf("文件已保存!\n")
}
//****************调用导入学生记录函数********************
struct scorenode *load()
{
FILE *fp
struct scorenode *p1,*p2,*head
int m=0
if((fp=fopen("scroce.txt","r"))==NULL) //打开文件
{
printf("不能打开文件!\n")
return 0
}
printf("\n\t\t成绩管理系统\n\n")
printf("\t\t 04电子应用\n")
printf("---------------------------------------------------------\n")
printf("学号\t姓名\t物理\t英语\t数学\t\n")
printf("---------------------------------------------------------\n")
head=NULL
p1=p2=(struct scorenode*)malloc(sizeof(struct scorenode)) //开辟一个新的存储单元
while(!feof(fp))//文件是否结束
{
fscanf(fp,"%d%s%f%f%f",&p1->number,&p1->name,&p1->physics,
&p1->english,&p1->maths) //从文件中读入数据
printf("%d\t%s\t%.1f\t%.1f\t%.1f\n",p1->number,p1->name,p1->physics,
p1->english,p1->maths)//打印数据
m=m+1
if(m==1)
head=p1
else
{
p2->next=p1 //指向下一个节点
p2=p1
}
p1=(struct scorenode*)malloc(sizeof(struct scorenode)) //开辟一个新的存储单元
}
p2->next=NULL
printf("---------------------------------------------------------\n")
fclose(fp)
return head
}
//**********************成绩查询函数*****************************
struct scorenode *search(struct scorenode *head)
{
int number
struct scorenode *p1,*p2
printf("\n请输入要查询的学生的学号(0)退出:")
scanf("%d",&number)//读取输入的学号
printf("---------------------------------------------------------\n")
printf("学号\t姓名\t物理\t英语\t数学\t\n")
printf("---------------------------------------------------------\n")
while(number!=0)//输入是0,退出
{
getchar() //吸收回车符
if(head==NULL) //判断链表中是否有数据
{
printf("\n没有任何学生资料!\n")
return(head)
}
p1=head
while(number!=p1->number&&p1->next!=NULL) //判断链表中数据是否结束
{
p2=p1
p1=p1->next//指向链表下一个结点
}
if(number==p1->number)
{
printf("%d\t%s\t%.1f\t%.1f\t%.1f\n",p1->number,p1->name,p1->physics,
p1->english,p1->maths)//打印数据
printf("---------------------------------------------------------\n")
}
else
printf("%d号学生不存在!\n",number)
printf("输入要查询的学生的学号(0)退出:")
scanf("%d",&number)
}
printf("退出查询!\n")
return(head)
}
//*************************删除学生资料***********************************
struct scorenode *del(struct scorenode *head)
{
struct scorenode *p1,*p2
int number
printf("\n请输入要删除的学生的学号(0)退出:")
scanf("%d",&number)//读取输入的学号
while(number!=0)//输入是0,退出
{
if(head==NULL) //判断链表中是否有数据
{
printf("\n没有任何学生资料!\n")
return(head)
}
p1=head
while(number!=p1->number&&p1->next!=NULL) //判断链表中数据是否结束
{
p2=p1
p1=p1->next//指向链表下一个结点
}
if(number==p1->number)
{
if(p1==head) //判断链表是否是头指针
head=p1->next
else
p2->next=p1->next //删除链表
n=n-1 //学生人数减一
}
printf("输入要删除的学生的学号(0)退出:")
scanf("%d",&number)
}
printf("现在的学生数为:%d个!\n",n)
save(head)//保存资料
return(head)
}
//*******************追加学生资料****************************
struct scorenode *add(struct scorenode *head)
{
struct scorenode *p0,*p3,*stu
int i
while(1)
{
stu=(struct scorenode*)malloc(sizeof(struct scorenode)) //开辟一个新的存储单元
printf("\n输入要增加的学生资料!\n")
repeat2:
printf("请输入学号(学号应大于0):")
scanf("%d",&stu->number)
while(stu->number<0) //判断输入学号是否正确
{
printf("输入错误,请重新输入学号:")
scanf("%d",&stu->number)
}
if(stu->number==0)//输入为0,退出
goto end2
else
{
p3=head
if(n>0)
{
for(i=0i<ni++)
{
if(stu->number!=p3->number) //判断输入的学号是否重复
p3=p3->next
else
{
printf("学号重复,请重输!\n")
goto repeat2
}
}
}
}
printf("请输入姓名:")
scanf("%s",&stu->name)
printf("请输入物理,英语,数学成绩(0-100):")
scanf("%f,%f,%f",&stu->physics,&stu->english,&stu->maths)
while(stu->physics<0||stu->physics>100||stu->english<0||stu->english>100
||stu->maths<0||stu->maths>100)//判断输入的成绩数据是否正确
{
printf("输入错误,请重新输入成绩:")
scanf("%f,%f,%f",&stu->physics,&stu->english,&stu->maths)
}
getchar() //吸收回车符
stu->next=NULL
p0=head
if(p0==NULL)//都没数据
{
head=stu //存储新追加的数据
head->next=NULL
}
else
{
while(p0->next!=NULL)
p0=p0->next
p0->next=stu //存储新追加的数据
}
n=n+1//学生个数加1
}
end2:
printf("现在的学生数为:%d个!\n",n)
//sort(head)
save(head)//保存资料
return(head) //返回此次录入的链表值
}
//***********************显示学生资料**************************
void print_s(struct scorenode *head)
{
struct scorenode *p
if(head==NULL)
printf("\n没有任何学生资料!\n")
else
{
printf("总人数:%d\n",n) //显示总人数
printf("---------------------------------------------------------\n")
printf("学号\t姓名\t物理\t英语\t数学\t\n")
printf("---------------------------------------------------------\n")
p=head
while(p!=NULL)
{
printf("%d\t%s\t%.1f\t%.1f\t%.1f\n",p->number,p->name,p->physics,
p->english,p->maths)//打印数据
p=p->next //指向下一结点
}
printf("---------------------------------------------------------\n")
}
}
//*****************统计学生成绩函数************************
void statistics(struct scorenode *head)
{
float sum,sum1=0,sum2=0,sum3=0,ave,ave1=0,ave2=0,ave3=0,max=0,min=0
struct scorenode *p
int y=0,i=0
p=head
if(head==NULL)
printf("\n没有任何学生资料!\n")
else
{
printf("---------------------------------------------------------\n")
printf("学号\t姓名\t物理\t英语\t数学\t总分\t平均分\n")
printf("---------------------------------------------------------\n")
while(p!=NULL)
{
sum=p->physics+p->english+p->maths //计算个人总分
ave=sum/3 //计算个人平均分
printf("%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p->number,p->name,p->physics,
p->english,p->maths,sum,ave)//打印数据
sum1=sum1+p->physics //累加物理分数
sum2=sum2+p->english //累加英语分数
sum3=sum2+p->maths //累加数学分数
y=y+1 //计算人数
if(max<sum)
max=sum//计算最高分
else if(min>sum)
min=sum//计算最低分
p=p->next //指向下一结点
}
ave1=sum1/y//计算物理平均分
ave2=sum2/y//计算英语平均分
ave3=sum3/y//计算数学平均分
printf("物理平均分:%.1f\n",ave1)
printf("英语平均分:%.1f\n",ave2)
printf("数学平均分:%.1f\n",ave3)
printf("总分最高分:%.1f\n",max)
printf("总分最低分:%.1f\n",min)
printf("\n")
}
}
//******************结点中数据交换*******************
void swap(struct scorenode *max,struct scorenode *p)
{
int k
char t[10]
float temp
k=max->number
max->number=p->number
p->number=k
strcpy(t,max->name)
strcpy(max->name,p->name)
strcpy(p->name,t)
temp=max->physics
max->physics=p->physics
p->physics=temp
temp=max->english
max->english=p->english
p->english=temp
temp=max->maths
max->maths=p->maths
p->maths=temp
}
//*****************排序函数***************************
void sort(struct scorenode *head)
{
struct scorenode *p,*max
int i,j,x
if(head==NULL)
{
printf("\n没有任何学生资料,请先建立链表!\n")
}
for(i=0i<80i++)
printf("*")
printf("1.按学生学号排序\t2.按学生姓名排序\t3.按物理成绩排序\n")
printf("4.按英语成绩排序\t5.按数学成绩排序\n")
printf("请选择 *** 作(0)退出:")
scanf("%d",&x) //读取输入的选择
getchar()
for(i=0i<80i++)
printf("*")
switch(x)
{
case 1: //学号排序
for(i=1i<ni++)
{
max=p=head
p=p->next
for(j=0j<n-ij++)
{
if(max->number>p->number)
swap(max,p)
p=p->next
max=max->next
}
}
print_s(head)break //打印数据
case 2:
for(i=1i<ni++)//姓名排序(冒泡方式)
{
max=p=head
p=p->next
for(j=0j<n-ij++)
{
if(strcmp(max->name,p->name)>0)
swap(max,p)
p=p->next
max=max->next
}
}
print_s(head)break
case 3:
for(i=1i<ni++)//按物理成绩排序
{
max=p=head
p=p->next
for(j=0j<n-ij++)
{
if(max->physics>p->physics)
swap(max,p)
p=p->next
max=max->next
}
}
print_s(head)break
case 4:
for(i=1i<ni++) //按英语成绩排序
{
max=p=head
p=p->next
for(j=0j<n-ij++)
{
if(max->english>p->english)
swap(max,p)
p=p->next
max=max->next
}
}
print_s(head)break
case 5:
for(i=1i<ni++) //按数学成绩排序
{
max=p=head
p=p->next
for(j=0j<n-ij++)
{
if(max->maths>p->maths)
swap(max,p)
p=p->next
max=max->next
}
}
print_s(head)break
case 0:
break
}
save(head) //保存排序后的数据
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)