⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glpmpl05.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 2 页
字号:
static void error2(MPL *mpl, const char *fmt, const char *f,      const char *msg){     xprintf("Format string passed to time2str:\n");      xprintf("%s\n", fmt);      xprintf("%*s\n", (f - fmt) + 1, "^");      error(mpl, "%s", msg);      /* no return */}static int weekday(int j){     /* determine weekday number (1 = Mon, ..., 7 = Sun) */      return (j + jday(1, 1, 1970)) % 7 + 1;}static int firstday(int year){     /* determine the first day of the first week for a specified year         according to ISO 8601 */      int j;      /* if 1 January is Monday, Tuesday, Wednesday or Thursday, it is         in week 01; if 1 January is Friday, Saturday or Sunday, it is         in week 52 or 53 of the previous year */      j = jday(1, 1, year) - jday(1, 1, 1970);      switch (weekday(j))      {  case 1: /* 1 Jan is Mon */ j += 0; break;         case 2: /* 1 Jan is Tue */ j -= 1; break;         case 3: /* 1 Jan is Wed */ j -= 2; break;         case 4: /* 1 Jan is Thu */ j -= 3; break;         case 5: /* 1 Jan is Fri */ j += 3; break;         case 6: /* 1 Jan is Sat */ j += 2; break;         case 7: /* 1 Jan is Sun */ j += 1; break;         default: xassert(j != j);      }      /* the first day of the week must be Monday */      xassert(weekday(j) == 1);      return j;}void fn_time2str(MPL *mpl, char *str, double t, const char *fmt){     /* convert the calendar time to character string */      int j, year, month, day, hh, mm, ss, len;      double temp;      const char *f;      char buf[MAX_LENGTH+1];      if (!(-62135596800.0 <= t && t <= 64092211199.0))         error(mpl, "time2str(%.*g,...); argument out of range",            DBL_DIG, t);      t = floor(t + 0.5);      temp = fabs(t) / 86400.0;      j = (int)floor(temp);      if (t < 0.0)      {  if (temp == floor(temp))            j = - j;         else            j = - (j + 1);      }      xassert(jdate(j + jday(1, 1, 1970), &day, &month, &year) == 0);      ss = (int)(t - 86400.0 * (double)j);      xassert(0 <= ss && ss < 86400);      mm = ss / 60, ss %= 60;      hh = mm / 60, mm %= 60;      len = 0;      for (f = fmt; *f != '\0'; f++)      {  if (*f == '%')         {  f++;            if (*f == 'a')            {  /* the abbreviated weekday name */               memcpy(buf, week[weekday(j)-1], 3), buf[3] = '\0';            }            else if (*f == 'A')            {  /* the full weekday name */               strcpy(buf, week[weekday(j)-1]);            }            else if (*f == 'b' || *f == 'h')            {  /* the abbreviated month name */               memcpy(buf, moon[month-1], 3), buf[3] = '\0';            }            else if (*f == 'B')            {  /* the full month name */               strcpy(buf, moon[month-1]);            }            else if (*f == 'C')            {  /* the century of the year */               sprintf(buf, "%02d", year / 100);            }            else if (*f == 'd')            {  /* the day of the month as a decimal number (01..31) */               sprintf(buf, "%02d", day);            }            else if (*f == 'D')            {  /* the date using the format %m/%d/%y */               sprintf(buf, "%02d/%02d/%02d", month, day, year % 100);            }            else if (*f == 'e')            {  /* the day of the month like with %d, but padded with                  blank (1..31) */               sprintf(buf, "%2d", day);            }            else if (*f == 'F')            {  /* the date using the format %Y-%m-%d */               sprintf(buf, "%04d-%02d-%02d", year, month, day);            }            else if (*f == 'g')            {  /* the year corresponding to the ISO week number, but                  without the century (range 00 through 99); this has                  the same format and value as %y, except that if the                  ISO week number (see %V) belongs to the previous or                  next year, that year is used instead */               int iso;               if (j < firstday(year))                  iso = year - 1;               else if (j < firstday(year + 1))                  iso = year;               else                  iso = year + 1;               sprintf(buf, "%02d", iso % 100);            }            else if (*f == 'G')            {  /* the year corresponding to the ISO week number; this                  has the same format and value as %Y, excepth that if                  the ISO week number (see %V) belongs to the previous                  or next year, that year is used instead */               int iso;               if (j < firstday(year))                  iso = year - 1;               else if (j < firstday(year + 1))                  iso = year;               else                  iso = year + 1;               sprintf(buf, "%04d", iso);            }            else if (*f == 'H')            {  /* the hour as a decimal number, using a 24-hour clock                  (00..23) */               sprintf(buf, "%02d", hh);            }            else if (*f == 'I')            {  /* the hour as a decimal number, using a 12-hour clock                  (01..12) */               sprintf(buf, "%02d",                  hh == 0 ? 12 : hh <= 12 ? hh : hh - 12);            }            else if (*f == 'j')            {  /* the day of the year as a decimal number (001..366) */               sprintf(buf, "%03d",                  jday(day, month, year) - jday(1, 1, year) + 1);            }            else if (*f == 'k')            {  /* the hour as a decimal number, using a 24-hour clock                  like %H, but padded with blank (0..23) */               sprintf(buf, "%2d", hh);            }            else if (*f == 'l')            {  /* the hour as a decimal number, using a 12-hour clock                  like %I, but padded with blank (1..12) */               sprintf(buf, "%2d",                  hh == 0 ? 12 : hh <= 12 ? hh : hh - 12);            }            else if (*f == 'm')            {  /* the month as a decimal number (01..12) */               sprintf(buf, "%02d", month);            }            else if (*f == 'M')            {  /* the minute as a decimal number (00..59) */               sprintf(buf, "%02d", mm);            }            else if (*f == 'p')            {  /* either AM or PM, according to the given time value;                  noon is treated as PM and midnight as AM */               strcpy(buf, hh <= 11 ? "AM" : "PM");            }            else if (*f == 'P')            {  /* either am or pm, according to the given time value;                  noon is treated as pm and midnight as am */               strcpy(buf, hh <= 11 ? "am" : "pm");            }            else if (*f == 'r')            {  /* the calendar time using the format %I:%M:%S %p */               sprintf(buf, "%02d:%02d:%02d %s",                  hh == 0 ? 12 : hh <= 12 ? hh : hh - 12,                  mm, ss, hh <= 11 ? "AM" : "PM");            }            else if (*f == 'R')            {  /* the hour and minute using the format %H:%M */               sprintf(buf, "%02d:%02d", hh, mm);            }            else if (*f == 'S')            {  /* the second as a decimal number (00..59) */               sprintf(buf, "%02d", ss);            }            else if (*f == 'T')            {  /* the time of day using the format %H:%M:%S */               sprintf(buf, "%02d:%02d:%02d", hh, mm, ss);            }            else if (*f == 'u')            {  /* the day of the week as a decimal number (1..7),                  Monday being 1 */               sprintf(buf, "%d", weekday(j));            }            else if (*f == 'U')            {  /* the week number of the current year as a decimal                  number (range 00 through 53), starting with the first                  Sunday as the first day of the first week; days                  preceding the first Sunday in the year are considered                  to be in week 00 */#if 1 /* 09/I-2009 */#undef sun/* causes compilation error in SunOS */#endif               int sun;               /* sun = the first Sunday of the year */               sun = jday(1, 1, year) - jday(1, 1, 1970);               sun += (7 - weekday(sun));               sprintf(buf, "%02d", (j + 7 - sun) / 7);            }            else if (*f == 'V')            {  /* the ISO week number as a decimal number (range 01                  through 53); ISO weeks start with Monday and end with                  Sunday; week 01 of a year is the first week which has                  the majority of its days in that year; week 01 of                  a year can contain days from the previous year; the                  week before week 01 of a year is the last week (52 or                  53) of the previous year even if it contains days                  from the new year */               int iso;               if (j < firstday(year))                  iso = j - firstday(year - 1);               else if (j < firstday(year + 1))                  iso = j - firstday(year);               else                  iso = j - firstday(year + 1);               sprintf(buf, "%02d", iso / 7 + 1);            }            else if (*f == 'w')            {  /* the day of the week as a decimal number (0..6),                  Sunday being 0 */               sprintf(buf, "%d", weekday(j) % 7);            }            else if (*f == 'W')            {  /* the week number of the current year as a decimal                  number (range 00 through 53), starting with the first                  Monday as the first day of the first week; days                  preceding the first Monday in the year are considered                  to be in week 00 */               int mon;               /* mon = the first Monday of the year */               mon = jday(1, 1, year) - jday(1, 1, 1970);               mon += (8 - weekday(mon)) % 7;               sprintf(buf, "%02d", (j + 7 - mon) / 7);            }            else if (*f == 'y')            {  /* the year without a century as a decimal number                  (00..99) */               sprintf(buf, "%02d", year % 100);            }            else if (*f == 'Y')            {  /* the year as a decimal number, using the Gregorian                  calendar */               sprintf(buf, "%04d", year);            }            else if (*f == '%')            {  /* a literal % character */               buf[0] = '%', buf[1] = '\0';            }            else               error2(mpl, fmt, f, "invalid conversion specifier");         }         else            buf[0] = *f, buf[1] = '\0';         if (len + strlen(buf) > MAX_LENGTH)            error(mpl, "time2str; output string length exceeds %d chara"               "cters", MAX_LENGTH);         memcpy(str+len, buf, strlen(buf));         len += strlen(buf);      }      str[len] = '\0';      return;}/* eof */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -