(1)30’ 编写一个函数 void reverse(Seqlist *lp); 功能是对已建立的学生身高信息表进行倒置,结果输出在屏幕。
(2)30’ 编写一个函数 double avg(Seqlist *lp, int sex); 功能是统计某性别学生(0为男生,1为女生)的平均身高并返回该值。
(3)40’ 编写一个函数 void deleX(Seqlist *lp, int sex); 功能是删除某性别(0为男生,1为女生)的所有学生。
直接上代码
#include
#include
#define MAX 50
typedef struct {
int xh; /*学号*/
float sg; /*身高*/
int sex; /*性别,0为男生,1为女生*/
} datatype;
typedef struct{
datatype data[MAX]; /*存放顺序表元素的数组*/
int last; /*表示data中实际存放元素个数*/
}Seqlist;
void initList(Seqlist *lp);/*置一个空表*/
void createList(Seqlist *lp);/*建一个学生顺序表*/
void sort_xh(Seqlist *lp);/*按学号排序*/
void pntList(Seqlist *lp);/*输出学生表*/
void save(Seqlist *lp,char strname[]);/*保存学生顺序表到指定文件*/
void reverse(Seqlist *lp);//倒置
double avg(Seqlist *lp,int sex);//默认性别的平均值
void deleX(Seqlist *lp,int sex);//删掉特定性别的信息
int main()
{
Seqlist L;
initList(&L);
createList(&L);
int n,m;
printf("请输入序号:\n1.records.txt普通输出\n2.按学号正序输出\n3.倒置输出\n4.求某性别的平均身高\n5.删除某性别\n\n");
scanf("%d",&n);
if(n==1){
printf("--records.txt普通输出--\n");
pntList(&L);
}
else if(n==2){
printf("--按学号正序输出--\n");
sort_xh(&L);/*先按学号排序*/
pntList(&L);
}
else if(n==3){
printf("--倒置输出--\n");
reverse(&L);//倒置
pntList(&L);
}
else if(n==4){
printf("--求某性别的平均身高--\n");
printf("请输入性别:0.男生 1.女生\n");
scanf("%d",&m);
printf("平均身高为:%.2f",avg(&L,m));
}
else if(n==5){
printf("--删除某性别的信息--\n");
printf("请输入性别:0.男生 1.女生\n");
scanf("%d",&m);
deleX(&L,m);
pntList(&L);
}
return 0;
}
/*置一个空表*/
void initList(Seqlist *lp)
{ lp->last=0; }
/*建一个学生顺序表*/
void createList(Seqlist *lp)
{
FILE *fp;
int xh;
float sg;
int sex;
if((fp=fopen("D:\\records.txt","r"))==NULL) //文件位置改为自己保存的位置哦!
{
printf("can not open read file !\n");
exit(1); /*返回OS,该函数定义在stdlib.h中*/
}
while(!feof(fp))
{ fscanf(fp,"%d%f%d",&xh,&sg,&sex);
lp->data[lp->last].xh=xh;
lp->data[lp->last].sg=sg;
lp->data[lp->last].sex=sex;
lp->last++;
}
fclose(fp);
}
/*按学号排序*/
void sort_xh(Seqlist *lp)
{ int i,j,k;
datatype st;
for(i=0;i<lp->last-1;i++)
{k=i;
for(j=i+1;j<lp->last;j++)
if(lp->data[j].xh<lp->data[k].xh )
k=j;
if(k!=i)
{st=lp->data[k];
lp->data[k]=lp->data[i];
lp->data[i]=st;}
}
}
void reverse(Seqlist *lp){
int tmp=0;
datatype st;
for(tmp=0;tmp<lp->last/2;tmp++){
st = lp->data[lp->last-tmp-1];
lp->data[lp->last-tmp-1] = lp->data[tmp];
lp->data[tmp] = st;
}
}
/*输出学生顺序表*/
void pntList(Seqlist *lp)
{ int i;
for(i=0;i<lp->last ;i++)
printf("%2d: %.2f %d\n",lp->data [i].xh,lp->data [i].sg,lp->data[i].sex);
}
/*保存学生顺序表到指定文件*/
void save(Seqlist *lp,char strname[])
{ FILE *fp;
int i;
if((fp=fopen(strname,"w"))==NULL)
{
printf("can not open write file !\n");
exit(1); /*返回OS*/
}
for(i=0;i<lp->last ;i++)
{
fprintf(fp,"%2d %5.2f %2d\n",lp->data[i].xh,lp->data[i].sg,lp->data[i].sex);
}
fclose(fp);
}
double avg(Seqlist *lp,int sex)
{
int i,tmp=0;
double total=0;
for(i=0;i<lp->last;i++){
if(lp->data[i].sex==sex){//匹配性别
total+=lp->data[i].sg;
tmp++;
}
}
double result = total/tmp;
return result+0.005;//保留两位小数时的进位操作
}
void deleX(Seqlist *lp, int sex){
int tmp = 0;
for(int i=0;i<lp->last;i++){
if(lp->data[i].sex!=sex){//删除匹配性别的学生
lp->data[tmp++] = lp->data[i];
}
}
lp->last=tmp;
}
在一般的程序语言中都存在一种字符,即“转义字符”,C语言中的’\‘是一个转义字符,所以如果在路径名中采用单斜杠,编译器就会认为这是一个转义字符,而不是真正的’\‘字符,进而出现打开文件失败的错误。那么解决这个问题就显得顺理成章,既然’\‘是转义字符,我们就采用双斜杠的形式"\\",这样在编译器看来,转义字符’\‘将’\\‘解释为’\’。