C、 读取日期和数字,并进行排序

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或创建自己的函数 那么,如何存储它们,以便在保

我一辈子都不知道该怎么做:

我应该以以下格式阅读此输入:

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()
和不在
中的朋友/