思路大概是:先产生100个商场序号及四个季度的销售额写入文件,然后再读取这个文件,然后计算一年的销售总额读入商场结构数组,再写入文件,malls.txt文件应该是自动生成在编译生成的exe文件的同一个目录下,下面是一个实现,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct mall{
int id;
double quarterlySales[4];
double yearSales;
};
int main(void){
struct mall malls[100];
FILE * fp=fopen("malls.txt","w+");
if(fp==NULL){
printf("打开文件或创建文件失败!\n");
return 0;
}
int i=0;
int idarr[100];
for(i=0;i<500;i++){ //初始化500个商场序号,用于后面产生随机数从中取走一个商场序号
idarr[i]=i+1;
}
printf("开始生成销售数据!\n");
srand(time(0)+rand()); //用当前时间再加随机数做随机数种子,以便让每一次随机不一样
i=0;
int k;
int num;
double j;
while(i<100){
num=rand()%500; //产生一个下标 ,用于从商场序号数组中取走一个商场序号
while(idarr[num]==0){ //如果这个位置的商场序号被取走,则重新再生成一个下标再次取一次序号,直到取到序号
num=rand()%500;
}
if(idarr[num]!=0){ //取到序号后写入文件
// malls[i].id=idarr[num];
fprintf(fp,"%d ",idarr[num]);
idarr[num]=0; //商场序号数组当前位置置0,表示这个位置的商场序号已被取走
}
for(k=0;k<4;k++){ //产生一个1到10万之间的数,表示每个季度的销售额
j=(double)(rand()%100000+1);
// malls[i].quarterlySales[k]=j;
fprintf(fp,"%.2lf ",j);
}
i++;
}
fclose(fp);
printf("销售数据已生成!\n");
printf("开始写入销售数据!\n");
fp=fopen("malls.txt","r");
if(fp==NULL){
printf("打开文件失败!\n");
return 0;
}
i=0;
while(i<100){ //从文件读取100个商场的序号及其每个季度的销售额,并计算每年的销售总额到 商场结构数组中
fscanf(fp,"%d%lf%lf%lf%lf ",&malls[i].id,
&malls[i].quarterlySales[0],&malls[i].quarterlySales[1],
&malls[i].quarterlySales[2],&malls[i].quarterlySales[3]);
malls[i].yearSales=malls[i].quarterlySales[0]+malls[i].quarterlySales[1]+
malls[i].quarterlySales[2]+malls[i].quarterlySales[3];
i++;
}
fclose(fp);
printf("销售数据已写入!\n");
printf("按任意键开始计算并写入一年的销售总额!"); //此时暂停,用于查看和备份malls.txt生成的数据是否正常
getchar();
printf("开始计算和写入一年的销售总额。\n");
fp=fopen("malls.txt","w");
if(fp==NULL){
printf("打开文件失败!\n");
return 0;
}
i=0;
while(i<100){ //加上计算的一年的销售总额,再次写入文件
fprintf(fp,"%d %.2lf %.2lf %.2lf %.2lf %.2lf ",malls[i].id,
malls[i].quarterlySales[0],malls[i].quarterlySales[1],
malls[i].quarterlySales[2],malls[i].quarterlySales[3]
,malls[i].yearSales);
i++;
}
fclose(fp);
printf("一年的销售总额已写入!\n");
printf("程序退出!\n");
return 0;
}