|
20鱼币
/*
** Copyright (C) QPSOFT.COM All rights reserved.帮帮了!!!改为不是乱码,可以正常显示//代码如下
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MENU_NUM 8
#define N 3
/****************************结构体********************************/
typedef struct s1
{
char xue[10] ; //学号由10个字符组成
char name[15] ; //学生姓名
float score[N] ; //各门课成绩
float sum ; //总分
float average ; //平均分
char jian[255]; //简介
char sex[10]; //性别
struct s1 *next ; //指向后继结点的指针
}STUDENT; //定义结构体类型
/********************************全局变量*************************/
struct s1 * head=NULL; //链表头结点
//函数声明//
void InputData( STUDENT * ptr ); //录入信息
void PrintMenu( ); //显示菜单
int MenuSelect( ); //选择菜单项
void Init( ); //初始化
void create( ); //创建链表
void print( ) ; //打印链表数据
void Delete( ); //删除指定学号的记录数据
void Dele_name( );
void append(); //追加一个数据到链表尾部
void computer(); //计算链表中所有人的总分和平均分
void savefile(); //文件保存
void version(); //版主
void jjfile();
/***********************************主函数********************************/
void main()
{
int key;
while(1) {
key=MenuSelect();
switch(key)
{
case 0:
version(); //版本作者
case 1:
Init(); //将head置为空NULL
break;
case 2:
create(); //创建链表,输入数据
break;
case 3:
Delete(); //删除一个指定学号的记录数据
break;
case 4:
print(); //打印链表中所有数据
break;
case 5:
Dele_name( ); //姓名查找删除
break;
case 6:
append(); //增加一个学生记录
break;
case 7:
computer(); //计算链表中所有人的总分和平均分
break;
case 8:
savefile( ); //保存文件
break;
case 9:
Init(); //释放链表
exit(0);
}
}
}
//菜单函数
void PrintMenu( )
{
int i;
char * menu[]={
"***********************************************",
"*| 学生成绩管理系统 |*",
"*| 1. 初始化链表 2. 创建链表 |*",
"*| 3. 学号删除 4. 打印成绩信息 |*",
"*| 5. 姓名删除 6. 插入一条学生记录|*",
"*| 7. 总分和平均分 8. 保存文件 |*",
"*| 9. 退出 0. 系统版本 |*",
"***********************************************",
};
printf("\n\n");
for (i=0;i<MENU_NUM;i++)
printf("%s\n",menu[i]);
printf("\n输入要进行的操作(0-9):");
}
//选择菜单选项,返回选择的选项
int MenuSelect( )
{
int key;
PrintMenu( );
scanf("%d",&key);
return key;
}
//初始化单链表
void Init( )
{
STUDENT *p,*ptr; //针变量p,ptr
p=head;
ptr=head; //指向头指针head ;
while(ptr!=NULL)
{
ptr=ptr->next; //ptr指向下一个结构数据
free(p); //释放p
p=ptr; //将p指向ptr所指向的数据
}
head=NULL; //将head指向NULL
}
//创建单链表
void create( )
{
STUDENT *pt, *pth=NULL; //pt指向即将申请新的数据内存,pth指向当前数据
while(1)
{
pt=(STUDENT *)malloc(sizeof(STUDENT)); //让pt指向新申请的内存空间
InputData(pt); //输入数据,存放到pt所指向的结构数据。让pt的next指向NULL
if (strcmp(pt->xue,"#")==0) // #结束输入学号
{
free(pt); //释放pt
break; //退出循环
}
else if (head==NULL)
{
pth=pt;
head=pt; //将头指针head和pth指向pt
}
else
{
pth->next=pt; //将pth的next指向pt;
pth=pt; //将pth指向pt;
}
}
}
//打印单链表中所有数据
void print( )
{
int i=0;
STUDENT *p; //第一个指针p
p=head; //将p指向head
printf("\n");
printf("******************************STUDENT*******************************************\n");
printf("|rec| 学号 | 姓名 | 性别 | 英语1| 数学2| 数据3|总成绩|平均成绩| 简介信息|\n");
printf("|---|----------|---------|------|------|------|------|------|--------|---------|\n");
//打印表头
while (p!=NULL)
{
printf("|%3d|%10s|%9s|%6s|%6.1f|%6.1f|%6.1f|%6.2f|%8.2f|%9s|\n",
++i,p->xue,p->name,p->sex,p->score[0],p->score[1],p->score[2],
p->sum,p->average,p->jian); //打印p所指向的结构中的所有数据
p=p->next; //将p指向p的下一个结构数据
}
printf("********************************END*********************************************\n");
//打印表尾
}
//删除指定学号的记录
void Delete( )
{
STUDENT *p,*pth; //定义两个指针p,pth
char no[11]; //定义一个整数no(用来存储输入的学号)
printf("输入要删除学生的学号:");
scanf("%s",no); //用输入语句输入一个学号存储到no中
p=head;pth=head; //将p和pth都指向头指针
if (strcmp(p->xue,no)==0) //也就是若头指针指向的数据需要删除
{
head=head->next; //将head指针指向head的下一个数据;
free(p); //释放p所指向的数据
}
else
{
p=p->next; //将p指向p的下一个数据
while ( p!=NULL)
{
if (strcmp(p->xue,no)==0) //找到了要删除的数据
{
pth->next=p->next; //将pth的next指向p的next
free(p); //释放p
break; //退出循环
}
else
{
pth=pth->next; //将pth指向pth的next 或 将pth指向p
p=p->next; //将p指向p的next
}
}
}
}
//姓名查找删除·
void Dele_name( )
{
STUDENT *p,*pth; //定义两个指针p,pth
char str_name[20]; //定义一个整数no(用来存储输入的学号)
printf("输入要删除学生的姓名:");
scanf("%s",str_name); //用输入语句输入一个学号存储到no中
p=head;pth=head; //将p和pth都指向头指针
if(strcmp(p->name,str_name)==0) //也就是若头指针指向的数据需要删除
{
head=head->next; //将head指针指向head的下一个数据;
free(p); //释放p所指向的数据
}
else
{
p=p->next; //将p指向p的下一个数据
while ( p!=NULL)
{
if (strcmp(p->name,str_name)==0) //找到了要删除的数据
{
pth->next=p->next; //将pth的next指向p的next
free(p); //释放p
break; //退出循环
}
else
{
pth=pth->next; //将pth指向pth的next 或 将pth指向p
p=p->next; //将p指向p的next
}
}
}
}
//增加学生记录
void append()
{
STUDENT *p,*pth; //定义两个指针变量p,pth
pth=head; //将pth指向head
while ( pth->next!=NULL)
{
pth=pth->next; //ptr指向ptr的next
}
p=(STUDENT *)malloc(sizeof(STUDENT)); //将p指向新申请的内存空间
InputData(p);
p->next=NULL; //数据数据存储到p所指向的内存空间,注意将p的next置为NULL
pth->next=p; //将ptr的next指向p
}
//输入学生信息
void InputData( STUDENT *ptr )
{
int i;
printf("输入学号:");
scanf("%s",ptr->xue);
if (strcmp(ptr->xue,"#")==0 )
return;
printf("输入姓名:");
scanf("%s",ptr->name);
printf("输入性别:");
scanf("%s",ptr->sex);
printf("输入简介:");
scanf("%s",ptr->jian);
for(i=0;i<3;i++)
{
printf("输入成绩:");
scanf("%f",&ptr->score[i]);
}
ptr->sum=0;
ptr->average=0;
ptr->next=NULL; //不要忘记这一步
}
//计算学生总成绩和平均成绩
void computer()
{
{
STUDENT *p;
p=head;
for(;p;p=p->next)
{
p->sum=p->score[0]+p->score[1]+p->score[2];
p->average=(p->score[0]+p->score[1]+p->score[2])/3;
p->jian;
p->sex;
}
printf("------>按‘4’查看<--------");//提示信息
}
}
//文件保存//
void savefile()
{
STUDENT *p=NULL;
STUDENT *p1=head;
FILE *fp;
char ch, filename[20];
int count=0;
printf("Please input the filename you want to write: ");
scanf("%s", filename);
fp = fopen(filename, "wt+");
if(fp==NULL)
{
printf("Cannot open the file!n");
exit(0); // 终止程序
}
p=p1->next;//调用头指针
while(p)
{
if(fwrite(p,sizeof(STUDENT),1,fp)==1)
{
p=p->next;
count++;
}
else
{
break;
}
}
if(count>0)
{
printf("count= %d\n",count);
getch();
}
fclose(fp);
}
//版本信息//
void version()
{
printf("最新版本 ###:###:@@@\n");
printf("版主:\n");
}
帮帮了!!!改为不是乱码,可以正常显示
|
最佳答案
查看完整内容
楼上的写法没有错,是把所有的字符放到了一个字符串中,下面的写法是你的想法:
用字符串数组的时候请注意,不要丢失遍历下标
|