已创建了一个包含学生学号、身高、性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取。 编写一个函数 void reverse(Seqlist *lp); 功能是对已建立的学生身

已创建了一个包含学生学号、身高、性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取。(结构体数组版本)

(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 <stdio.h>
#include <stdlib.h>
#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;
}

具体展示的图片如下:

1.records.txt普通输出
2.按学号正序输出
3.倒置输出
4.求某性别的平均身高
5.删除某性别

文件存放修改位置

文件存放目录位置

一定要用双斜杠哦!

在一般的程序语言中都存在一种字符,即“转义字符”,C语言中的’\‘是一个转义字符,所以如果在路径名中采用单斜杠,编译器就会认为这是一个转义字符,而不是真正的’\‘字符,进而出现打开文件失败的错误。那么解决这个问题就显得顺理成章,既然’\‘是转义字符,我们就采用双斜杠的形式"\\",这样在编译器看来,转义字符’\‘将’\\‘解释为’\’。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

建桥之魂

建桥人,建桥魂,建桥都是人上人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值