一道小美录入传单的C语言题目

作者:坏人。123
链接:https://www.nowcoder.com/discuss/66128
来源:牛客网

小美开了一家网店,经营着几十种商品,由于重品质,讲信誉,加之小美为人谦和大方,所以各种商品的销量一直不错。然而令小美困惑的是各种商品的月销量却总有些起伏不定,很难根据月销量数据判定哪种商品才是最受顾客欢迎的商品。为此,小美精选了30种商品,在线发放了1000份调查问卷,请求收到调查问卷的顾客为调查问卷上的这30种商品分别评分,最高10.0分,最低0.0分。小美想,等到某个截止日期时,就可以根据收回的调查问卷信息,确定究竟哪种商品才是最受顾客欢迎的商品了。为了便于理解和编程,作如下约定: ​a. 到截止日期时,不一定就能收回全部1000份调查问卷;同样,在收回的调查问卷中,评分人也不见得对所有的30种商品都进行了评分。但只要是评了分的信息都是有效的; ​b. 为了减少工作负荷,每天要对当天收回的调查问卷数据进行录入和存储。这就意味着存储数据的文件会被多次打开和使用; ​c. 30种商品的编号分别用1,2,……,30表示; ​d. 某个评分人对某种商品的评分被称作是一条记录。所有收回的调查问卷上的有效信息都以记录的形式存储在二进制文件“vote.dat”中; ​e. “最受欢迎的商品”定义为评分总人数不少于300人且平均分最高的商品。若有多个商品的平均分最高,约定商品编号较小的那种商品为“最受欢迎的商品”。 ​程序中可能用到的结构体类型如下: ​struct vote​​struct count ​{ char voter_name[20];​ //评分人姓名​​{ float sum;​//某种商品的总得分 ​​ int goods_id;​​ //商品编号​​​ int n;​​//某种商品的评分总人数 ​​ float point;​​​ //评分​​​​}; ​}; ​(1) 编写一个void data_in(void)函数,要求函数能提供良好的控制台人机交互界面,实现数据的录入和存储。 ​(2) 编写一个void process(struct count goods[30])函数,要求从“vote.dat”文件中读出数据,统计并判断是否存在“最受欢迎的商品”,若存在,输出该商品的编号、评分总人数和平均分;若不存在,输出“对不起,没有最受欢迎的商品!”。 process函数的调用形式为:struct count goods[30]={0}; process(goods); 怎么做,求解…

 

上述  题目 就是那个人提出来的,但是并没有进行解答,我同学问了我一下,我就写了,但并不知道是否正确,如有错误,欢迎指正探讨。源码如下:

/*
	A:Wesley
F:	D:2019-11-6 8:23 
*/ 
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
char name[255]="vote.dat";

struct vote{
	char voter_name[20];
	int goods_id;
	float point;
}; 
struct count
{
	float sum;
	int n;
};
struct count goods[30];
void Init()
{
	int i;
	for(i=0;i<30;i++)
	{
		goods[i].sum=0;
		goods[i].n=0;
	}
}
void process(struct count goods[30])
{
	FILE *infile = fopen(name, "rb");
	 if(infile == NULL )
    {

        printf("%s, %s",name,"not exit/n");
        exit(1);
    }
	int i=1;
	struct count MaxSum;
	MaxSum.sum=0;
	int MaxNum=0;
	struct vote onGoods;
	fseek (infile , 0 , SEEK_END);       
	long lSize = ftell (infile);
	int num = lSize/sizeof(struct vote);
	printf("信息有多少:%d\n",num); 
	fseek(infile,0,0);
	for(i=0;i<num;i++)
	{
		/*	A:Wesley 
			
			2019-11-5-21:15此处存在问题 
			Q:读取文件出现错误
		
			
			
			2019-11-5-21:33此处问题解决 
			B:在于文件指针位置错误   在于文件打开模式出现错误 
			
		*/
		//fscanf(infile,"%s %d %f\n",onGoods.voter_name,&onGoods.goods_id,&onGoods.point);
		fread(&onGoods,sizeof(struct vote),1,infile);
		printf("----------------------%d\n",i);
		printf("评分员名称:%s\n",onGoods.voter_name);
		printf("商品ID:%d\n",onGoods.goods_id);
		printf("评分:%.2f\n",onGoods.point);
		printf("\n");
		if(onGoods.point>=0&&onGoods.point<=10)
		goods[onGoods.goods_id-1].n++;
		goods[onGoods.goods_id-1].sum+=onGoods.point;
		
		/*
		TODO
			A:Wesley 
			
			2019-11-5-21:34此处存在问题 
			Q:此处文件300数量未经过测试,需要进行数据导入过三百进行条件测试 
		*/
		 
		if(goods[onGoods.goods_id-1].n>=300)
		{
			if(1.0*goods[onGoods.goods_id-1].sum/goods[onGoods.goods_id-1].n>1.0*MaxSum.sum/MaxSum.n)
			{
				MaxSum.n=goods[onGoods.goods_id-1].n;
				MaxSum.sum=goods[onGoods.goods_id-1].sum;
				MaxNum=onGoods.goods_id;
			}
			else
			{
				if(1.0*goods[onGoods.goods_id-1].sum/goods[onGoods.goods_id-1].n==1.0*MaxSum.sum/MaxSum.n&&MaxNum>onGoods.goods_id)
				{
					MaxSum.n=goods[onGoods.goods_id-1].n;
					MaxSum.sum=goods[onGoods.goods_id-1].sum;
					MaxNum=onGoods.goods_id;
				}
			}
		}
	}
	if(MaxSum.sum==0)
	{
		printf("对不起没有最受欢迎的产品\n");
	}
	else
	{
		printf("最受欢迎的产品是:%d\n",MaxNum);
	}
	fclose(infile);
  	 
}
void SaveDate()
{
	FILE *outfile = fopen(name, "a+" );
	 if( outfile == NULL  )
    {

        printf("%s, %s",name,"not exit/n");
        exit(1);
    }
  	int flag=1;
 	int choice=0; 
 	struct vote onGoods;
 	while(flag==1)
 	{
 		printf("1.录入商品名称\n");
 		scanf("%s",onGoods.voter_name);
		printf("2.录入商品ID\n");  
		scanf("%d",&onGoods.goods_id);
		printf("3.录入评分\n");  
		scanf("%f",&onGoods.point);
		printf("4.继续录入请按1:\n");  
 		scanf("%d",&flag);
 		if(onGoods.goods_id<=30&&onGoods.goods_id>=1)
 			fwrite( &onGoods, sizeof(struct vote), 1, outfile);
	 }
	 fclose(outfile);
}
void data_in(void)
{
 	int flag=1;
 	int choice=0; 
 	while(flag==1)
 	{
 		printf("1.录入存储\n");
		printf("2.读出数据\n");  
		printf("3.退出\n");  
 		printf("录入请输入1,读出请按2,退出请按3:");
 		scanf("%d",&choice);
 		switch(choice)
 		{
 			case 1:SaveDate();break;
 			case 2:process(goods);break;
 			case 3:flag=0;break; 
 			default:printf("输入错误\n");
		 }
	 }
}

int main()
{
	
	Init();   
	data_in();
} 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值