C 函数的运行顺序与我输入的顺序不同
首先,感谢你花时间阅读这篇文章。我几乎已经弄明白了这个程序,但有一个问题,我似乎无法动摇。这是节目单C 函数的运行顺序与我输入的顺序不同,c,excel,C,Excel,首先,感谢你花时间阅读这篇文章。我几乎已经弄明白了这个程序,但有一个问题,我似乎无法动摇。这是节目单 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> FILE *fp; char str[100]; char* filename; char* filename = str; int timer; s
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
FILE *fp;
char str[100];
char* filename;
char* filename = str;
int timer;
struct Pumps
{
char cityname[30];
int volume;
float priceperpump;
float priceperactiv; /*150 dollars each time the pump turns on*/
int activated;
int hourInput;
int hourOutput;
};
struct Pumps Pumps1;
struct Pumps Pumps2;
struct Pumps Pumps3;
struct Pumps Pumps4;
void functionInput(void)
{
/*City 1*/
strcpy(Pumps1.cityname, "Valdez");
Pumps1.priceperactiv = 210;
/*City 2*/
strcpy(Pumps2.cityname, "Glenallen");
Pumps2.priceperactiv = 210;
/*City 3*/
strcpy(Pumps3.cityname, "Tok");
Pumps3.priceperactiv = 210;
/*City 4*/
strcpy(Pumps4.cityname, "Fairbanks");
Pumps4.priceperactiv = 210;
}
int uniform_distribution_ranges(int rangeLow, int rangeHigh)
{
double myRand = rand()/(1.0 + RAND_MAX);
int range = rangeHigh - rangeLow +1;
int myRand_Scaled = (myRand * range ) + rangeLow;
return myRand_Scaled;
}
void volumefinal( struct Pumps pump );
int main(void)
{
printf("\n Enter the filename :");
gets(str);
printf("\n Creating %s.csv file",str);
filename=strcat(filename,".csv");
functionInput();
fp=fopen(filename,"w");
volumefinal( Pumps1 );
volumefinal( Pumps2 );
volumefinal( Pumps3 );
volumefinal( Pumps4 );
fclose(fp);
return 0;
}
void volumefinal( struct Pumps pump )
{
fp=fopen(filename,"a");
fprintf(fp,"%s,\t",pump.cityname);
int rangeLow, rangeHigh;
/* Define Volume, initial with uniform distribution */
rangeLow=40;
rangeHigh=80;
pump.volume = uniform_distribution_ranges(rangeLow, rangeHigh);
/*Define Input, with uniform distribution */
rangeLow=4;
rangeHigh=10;
pump.hourInput = uniform_distribution_ranges(rangeLow, rangeHigh);
/*Define Output, with uniform distribution */
rangeLow=15;
rangeHigh=20;
pump.hourOutput = uniform_distribution_ranges(rangeLow, rangeHigh);
srand ( time(0) );
for(timer=0;timer<24;timer++)
{
/*Define input,with uniform distribution */
pump.activated = (rand()% 2);
if(pump.volume < 45)
{
pump.activated = 0;
pump.volume = pump.volume + pump.hourInput;
}
else
{
pump.activated = 1;
pump.volume = pump.volume + pump.hourInput - pump.hourOutput;
}
fprintf(fp,"%d,\t",pump.activated);
fprintf(fp,"%d,\t",pump.volume);
}
fprintf(fp,"\n");
}
#包括
#包括
#包括
#包括
文件*fp;
char-str[100];
字符*文件名;
char*filename=str;
整数定时器;
结构泵
{
char cityname[30];
国际卷;
浮子泵;
浮动价格每次泵启动时,浮动价格为150美元*/
int激活;
国际胡林普特;
内部输出;
};
结构泵1;
结构泵2;
结构泵3;
结构泵4;
void函数输入(void)
{
/*城市1*/
strcpy(Pumps1.cityname,“Valdez”);
泵1.priceperactiv=210;
/*城市2*/
strcpy(Pumps2.cityname,“Glenallen”);
泵2.priceperactiv=210;
/*城市3*/
strcpy(Pumps3.cityname,“Tok”);
泵3.priceperactiv=210;
/*城市4*/
strcpy(Pumps4.cityname,“费尔班克斯”);
泵4.priceperactiv=210;
}
整数均匀分布范围(整数范围低,整数范围高)
{
双myRand=rand()/(1.0+rand_MAX);
int范围=范围高-范围低+1;
int myRand_Scaled=(myRand*范围)+rangeLow;
返回myRand_刻度;
}
空隙体积最终(结构泵);
内部主(空)
{
printf(“\n输入文件名:”);
获取(str);
printf(“\n正在创建%s.csv文件”,str);
文件名=strcat(文件名为“.csv”);
函数输入();
fp=fopen(文件名,“w”);
体积最终(泵1);
体积最终(泵2);
体积最终(泵3);
体积最终(泵4);
fclose(fp);
返回0;
}
空隙体积最终值(结构泵)
{
fp=fopen(文件名,“a”);
fprintf(fp,“%s\t”,pump.cityname);
int rangeLow,rangeHigh;
/*定义体积,初始均匀分布*/
rangeLow=40;
范围高=80;
泵量=均匀分布范围(范围低、范围高);
/*定义输入,均匀分布*/
rangeLow=4;
范围高=10;
pump.hourInput=均匀分布范围(范围低、范围高);
/*以均匀分布定义输出*/
rangeLow=15;
范围高=20;
pump.hourOutput=均匀分布范围(范围低、范围高);
srand(时间(0));
对于(timer=0;timer,每次尝试在以下位置重新打开文件:
void volumefinal( struct Pumps pump )
如果删除该调用,则效果良好:
void volumefinal( struct Pumps pump )
{
// fp=fopen(filename,"a"); <----
fprintf(fp,"%s,\t",pump.cityname);
int rangeLow, rangeHigh;
// ..
}
void volumefinal(结构泵)
{
//fp=fopen(文件名“a”);我以前尝试过删除该行,但如果您这样做,它将不会编译,因为fp在函数中没有定义,a将附加文件而不是创建新文件。我将尝试关闭该块中的文件,看看会发生什么。@AKNorthfp
是一个全局变量,而该行无论如何都不是一个声明诀窍是,谢谢你让我朝着正确的方向前进,所以问题是C不能连续两次打开同一个文件而没有问题。相反,你可以打开它并找到它,关闭它,然后再打开并再次找到它。为了解决这个问题,我只需在void volumefinal(struct Pumps)中添加fclose(fp);即可