С, чтение даты и числа, и сортировка - PullRequest
1 голос
/ 21 марта 2011

Я не могу за свою жизнь понять, как это сделать:

Я должен прочитать этот ввод в следующем формате:

гггг мм дд всего (продаж)

т.е.

1990 11 22 6,89

1990 11 24 7,20

1991 2 4 5,36

... (предполагается, что все записи отсортированы по году, затем по месяцу, затем по дню)

Затем я должен напечатать входные значения, промежуточные итоги за каждый месяц, промежуточные итоги за каждый год и итоговую сумму.

Мой вопрос: как мне сохранить входные значения, сохраняя при этом каждую запись непротиворечивой? Я должен иметь возможность проверить, нахожусь ли я в том же году и месяце при расчете промежуточных итогов. И мне нужно получить доступ к каждому числу с плавающей запятой, чтобы рассчитать промежуточные итоги.

Да, и я могу использовать только stdio.h или создавать свои собственные функции.

Так как мне сохранить их, чтобы я мог ссылаться на каждое значение, сохраняя их согласованность ??

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 21 марта 2011

Помимо того, что уже было сказано о том, как хранить результирующие данные, есть также сторона анализа входных данных.

Для вашей конкретной цели (используйте only <stdio.h>), вынужно сделать что-то вроде:

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");
}

Но обработка ошибок / обнаружение недопустимого формата проще, если использовать существующие функции, предназначенные для этой цели:

Стандарт C (UN * X / POSIX,скорее), имеет функцию strptime()<time.h>, которая является стандартным включаемым файлом) для этой цели.Преимущество использования этого вместо того, чтобы переходить по собственному усмотрению, состоит в том, что он может анализировать широкий спектр форматов, проверять правильность даты (вы знаете, например, смешивания месяца / дня, которые происходят при работе с американскими и европейскими клиентами) и возвращает вам дату вчасто используемые структуры данных (struct tm).

Это другая тема, хотя ...

1 голос
/ 21 марта 2011

Обычно вы хотите сделать что-то подобное со структурой:

struct sale {
    int year;
    int month;
    int day;
    double total;
};

Затем вы можете создать массив из sale элементов и ссылаться на отдельное поле, например: sales[i].year == sales[i+1].year.

1 голос
/ 21 марта 2011

Ну, вы могли бы объявить структуру, содержащую int для года, два символа для месяца и дня и и число с плавающей точкой для значения.Затем создайте массив этих структур.Это проще, если вы заранее знаете, сколько строк будет в файле.Затем считайте данные в структуры, а затем просто просмотрите массив, чтобы вычислить ваши итоги.

0 голосов
/ 21 марта 2011

работает только для отсортированных лет И месяцев:

  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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...