C、 读取日期和数字,并进行排序
我一辈子都不知道该怎么做: 我应该以以下格式阅读此输入: yyyy-mm-dd总计(销售额) i、 e 1990年11月22日6.89 1990年11月24日7.20 1991 2 4 5.36 。。。(假设所有条目按年、月、日排序) 然后我要打印输入值、每月小计、每年小计和总计 我的问题:如何存储输入值,同时保持每个条目的一致性??在计算小计时,我必须能够检查我是否在同一年和同一个月。为了计算小计,我需要访问每个浮点数 哦,我只能使用stdio.h或创建自己的函数 那么,如何存储它们,以便在保持一致性的同时引用每个值呢C、 读取日期和数字,并进行排序,c,C,我一辈子都不知道该怎么做: 我应该以以下格式阅读此输入: yyyy-mm-dd总计(销售额) i、 e 1990年11月22日6.89 1990年11月24日7.20 1991 2 4 5.36 。。。(假设所有条目按年、月、日排序) 然后我要打印输入值、每月小计、每年小计和总计 我的问题:如何存储输入值,同时保持每个条目的一致性??在计算小计时,我必须能够检查我是否在同一年和同一个月。为了计算小计,我需要访问每个浮点数 哦,我只能使用stdio.h或创建自己的函数 那么,如何存储它们,以便在保
任何帮助都将不胜感激。提前谢谢。好吧,您可以声明一个结构,其中包含一个整年,两个字符表示月份和日期,以及一个浮点值。然后创建这些结构的数组。如果您提前知道文件中将有多少行,这将更容易。然后将数据读入结构,然后只需在数组中运行即可计算总数。您通常希望对结构执行以下操作:
struct sale {
int year;
int month;
int day;
double total;
};
然后,您可以创建一个
sale
项目数组,并引用单个字段,如:sales[i]。year==sales[i+1]。year
仅适用于已排序的年份和月份:
char line[100],lasty[100]="",lastm[100]="",y[100],m[100];
double subm,suby,x;
while( fgets(line,100,yourfilepointer) )
{
if( 3==sscanf(line,"%s%s%*s%lf",y,m,&x) )
{
if( strcmp(lastm,m) )
{
if( *lastm ) printf("\n%s %s =%f",lasty,lastm,subm);
strcpy(lastm,m); subm=x;
if( strcmp(lasty,y) )
{
if( *lasty ) printf("\n%s =%f",lasty,suby);
strcpy(lasty,y); suby=x;
}
else
suby+=x;
}
else
subm+=x,suby+=x;
}
}
if( *lastm ) printf("\n%s %s =%f",lasty,lastm,subm);
if( *lasty ) printf("\n%s =%f",lasty,suby);
除了已经说过的关于如何存储结果数据的内容之外,还有输入解析方面的内容 对于您的特定目标(仅使用
),您需要执行以下操作:
struct sale *s;
for (s = sales; !feof(stdin); s++) {
if (fscanf(stdin, "%4u %2u %2u %f\n",
&s->year, &s->month, &s->day, &s->total) != 4) {
error("Parsing error on <stdin>");
}
if (!date_is_valid(s))
error("Invalid date given");
}
struct sale*s;
for(s=销售额;!feof(stdin);s++){
如果(fscanf(stdin,“%4u%2u%2u%f”,
&年、月、日、总)!=4){
错误(“上的解析错误”);
}
如果(!日期有效)
错误(“给出的日期无效”);
}
但是,如果使用为以下目的而开发的现有功能,则错误处理/无效格式检测更容易:
标准C(而非UN*X/POSIX)具有用于此目的的功能(在标准包含文件中)。使用它而不是自己滚动的优点是,它可以解析多种格式,检查日期有效性(如与美国和欧洲客户打交道时发生的月/日混淆),并以常用数据结构(struct tm
)返回日期
这是另一个主题,不过…您不需要存储每个值。您只需要存储一些正在运行的小计。您还必须存储上一年和上一个月的数据,并能够检测这些数据何时发生变化。我正在从终端读取输入,而不是文件。我假设输入的最大数量是100。因此,您可以分配一个包含100个结构的数组,然后只计算实际读取的数量,剩下的部分为空。长而曲折的代码-并使用
strcpy()
和不在
中的朋友/