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

📄 glpmpl05.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* glpmpl05.c *//************************************************************************  This code is part of GLPK (GNU Linear Programming Kit).**  Authors: Andrew Makhorin <mao@mai2.rcnet.ru>, <mao@gnu.org>*           Heinrich Schuchardt <xypron.glpk@gmx.de>**  Copyright (C) 2000,01,02,03,04,05,06,07,08,2009 Andrew Makhorin,*  Department for Applied Informatics, Moscow Aviation Institute,*  Moscow, Russia. All rights reserved. E-mail: <mao@mai2.rcnet.ru>.**  GLPK is free software: you can redistribute it and/or modify it*  under the terms of the GNU General Public License as published by*  the Free Software Foundation, either version 3 of the License, or*  (at your option) any later version.**  GLPK is distributed in the hope that it will be useful, but WITHOUT*  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY*  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public*  License for more details.**  You should have received a copy of the GNU General Public License*  along with GLPK. If not, see <http://www.gnu.org/licenses/>.***********************************************************************/#define _GLPSTD_STDIO#define _GLPSTD_TIME#include "glpmpl.h"double fn_gmtime(MPL *mpl){     /* obtain the current calendar time (UTC) */      time_t timer;      struct tm *tm;      int j;      time(&timer);      if (timer == (time_t)(-1))err:     error(mpl, "gmtime(); unable to obtain current calendar time");      tm = gmtime(&timer);      if (tm == NULL) goto err;      j = jday(tm->tm_mday, tm->tm_mon + 1, 1900 + tm->tm_year);      if (j < 0) goto err;      return (((double)(j - jday(1, 1, 1970)) * 24.0 +         (double)tm->tm_hour) * 60.0 + (double)tm->tm_min) * 60.0 +         (double)tm->tm_sec;}static char *week[] = { "Monday", "Tuesday", "Wednesday", "Thursday",      "Friday", "Saturday", "Sunday" };static char *moon[] = { "January", "February", "March", "April", "May",      "June", "July", "August", "September", "October", "November",      "December" };static void error1(MPL *mpl, const char *str, const char *s,      const char *fmt, const char *f, const char *msg){     xprintf("Input string passed to str2time:\n");      xprintf("%s\n", str);      xprintf("%*s\n", (s - str) + 1, "^");      xprintf("Format string passed to str2time:\n");      xprintf("%s\n", fmt);      xprintf("%*s\n", (f - fmt) + 1, "^");      error(mpl, "%s", msg);      /* no return */}double fn_str2time(MPL *mpl, const char *str, const char *fmt){     /* convert character string to the calendar time */      int j, year, month, day, hh, mm, ss, zone;      const char *s, *f;      year = month = day = hh = mm = ss = -1, zone = INT_MAX;      s = str;      for (f = fmt; *f != '\0'; f++)      {  if (*f == '%')         {  f++;            if (*f == 'b' || *f == 'h')            {  /* the abbreviated month name */               int k;               char *name;               if (month >= 0)                  error1(mpl, str, s, fmt, f, "month multiply specified"                     );               while (*s == ' ') s++;               for (month = 1; month <= 12; month++)               {  name = moon[month-1];                  for (k = 0; k <= 2; k++)                  {  if (toupper((unsigned char)s[k]) !=                         toupper((unsigned char)name[k])) goto next;                  }                  s += 3;                  for (k = 3; name[k] != '\0'; k++)                  {  if (toupper((unsigned char)*s) !=                         toupper((unsigned char)name[k])) break;                     s++;                  }                  break;next:             ;               }               if (month > 12)                  error1(mpl, str, s, fmt, f, "abbreviated month name m"                     "issing or invalid");            }            else if (*f == 'd')            {  /* the day of the month as a decimal number (01..31) */               if (day >= 0)                  error1(mpl, str, s, fmt, f, "day multiply specified");               while (*s == ' ') s++;               if (!('0' <= *s && *s <= '9'))                  error1(mpl, str, s, fmt, f, "day missing or invalid");               day = (*s++) - '0';               if ('0' <= *s && *s <= '9')                  day = 10 * day + ((*s++) - '0');               if (!(1 <= day && day <= 31))                  error1(mpl, str, s, fmt, f, "day out of range");            }            else if (*f == 'H')            {  /* the hour as a decimal number, using a 24-hour clock                  (00..23) */               if (hh >= 0)                  error1(mpl, str, s, fmt, f, "hour multiply specified")                     ;               while (*s == ' ') s++;               if (!('0' <= *s && *s <= '9'))                  error1(mpl, str, s, fmt, f, "hour missing or invalid")                     ;               hh = (*s++) - '0';               if ('0' <= *s && *s <= '9')                  hh = 10 * hh + ((*s++) - '0');               if (!(0 <= hh && hh <= 23))                  error1(mpl, str, s, fmt, f, "hour out of range");            }            else if (*f == 'm')            {  /* the month as a decimal number (01..12) */               if (month >= 0)                  error1(mpl, str, s, fmt, f, "month multiply specified"                     );               while (*s == ' ') s++;               if (!('0' <= *s && *s <= '9'))                  error1(mpl, str, s, fmt, f, "month missing or invalid"                     );               month = (*s++) - '0';               if ('0' <= *s && *s <= '9')                  month = 10 * month + ((*s++) - '0');               if (!(1 <= month && month <= 12))                  error1(mpl, str, s, fmt, f, "month out of range");            }            else if (*f == 'M')            {  /* the minute as a decimal number (00..59) */               if (mm >= 0)                  error1(mpl, str, s, fmt, f, "minute multiply specifie"                     "d");               while (*s == ' ') s++;               if (!('0' <= *s && *s <= '9'))                  error1(mpl, str, s, fmt, f, "minute missing or invali"                     "d");               mm = (*s++) - '0';               if ('0' <= *s && *s <= '9')                  mm = 10 * mm + ((*s++) - '0');               if (!(0 <= mm && mm <= 59))                  error1(mpl, str, s, fmt, f, "minute out of range");            }            else if (*f == 'S')            {  /* the second as a decimal number (00..60) */               if (ss >= 0)                  error1(mpl, str, s, fmt, f, "second multiply specifie"                     "d");               while (*s == ' ') s++;               if (!('0' <= *s && *s <= '9'))                  error1(mpl, str, s, fmt, f, "second missing or invali"                     "d");               ss = (*s++) - '0';               if ('0' <= *s && *s <= '9')                  ss = 10 * ss + ((*s++) - '0');               if (!(0 <= ss && ss <= 60))                  error1(mpl, str, s, fmt, f, "second out of range");            }            else if (*f == 'y')            {  /* the year without a century as a decimal number                  (00..99); the values 00 to 68 mean the years 2000 to                  2068 while the values 69 to 99 mean the years 1969 to                  1999 */               if (year >= 0)                  error1(mpl, str, s, fmt, f, "year multiply specified")                     ;               while (*s == ' ') s++;               if (!('0' <= *s && *s <= '9'))                  error1(mpl, str, s, fmt, f, "year missing or invalid")                     ;               year = (*s++) - '0';               if ('0' <= *s && *s <= '9')                  year = 10 * year + ((*s++) - '0');               year += (year >= 69 ? 1900 : 2000);            }            else if (*f == 'Y')            {  /* the year as a decimal number, using the Gregorian                  calendar */               if (year >= 0)                  error1(mpl, str, s, fmt, f, "year multiply specified")                     ;               while (*s == ' ') s++;               if (!('0' <= *s && *s <= '9'))                  error1(mpl, str, s, fmt, f, "year missing or invalid")                     ;               year = 0;               for (j = 1; j <= 4; j++)               {  if (!('0' <= *s && *s <= '9')) break;                  year = 10 * year + ((*s++) - '0');               }               if (!(1 <= year && year <= 4000))                  error1(mpl, str, s, fmt, f, "year out of range");            }            else if (*f == 'z')            {  /* time zone offset in the form zhhmm */               int z, hh, mm;               if (zone != INT_MAX)                  error1(mpl, str, s, fmt, f, "time zone offset multipl"                     "y specified");               while (*s == ' ') s++;               if (*s == 'Z')               {  z = hh = mm = 0, s++;                  goto skip;               }               if (*s == '+')                  z = +1, s++;               else if (*s == '-')                  z = -1, s++;               else                  error1(mpl, str, s, fmt, f, "time zone offset sign mi"                     "ssing");               hh = 0;               for (j = 1; j <= 2; j++)               {  if (!('0' <= *s && *s <= '9'))err1:                error1(mpl, str, s, fmt, f, "time zone offset valu"                        "e incomplete or invalid");                  hh = 10 * hh + ((*s++) - '0');               }               if (hh > 23)err2:             error1(mpl, str, s, fmt, f, "time zone offset value o"                     "ut of range");               if (*s == ':')               {  s++;                  if (!('0' <= *s && *s <= '9')) goto err1;               }               mm = 0;               if (!('0' <= *s && *s <= '9')) goto skip;               for (j = 1; j <= 2; j++)               {  if (!('0' <= *s && *s <= '9')) goto err1;                  mm = 10 * mm + ((*s++) - '0');               }               if (mm > 59) goto err2;skip:          zone = z * (60 * hh + mm);            }            else if (*f == '%')            {  /* literal % character */               goto test;            }            else               error1(mpl, str, s, fmt, f, "invalid conversion specifie"                  "r");         }         else if (*f == ' ')            ;         elsetest:    {  /* check a matching character in the input string */            if (*s != *f)               error1(mpl, str, s, fmt, f, "character mismatch");            s++;         }      }      if (year < 0) year = 1970;      if (month < 0) month = 1;      if (day < 0) day = 1;      if (hh < 0) hh = 0;      if (mm < 0) mm = 0;      if (ss < 0) ss = 0;      if (zone == INT_MAX) zone = 0;      j = jday(day, month, year);      xassert(j >= 0);      return (((double)(j - jday(1, 1, 1970)) * 24.0 + (double)hh) *         60.0 + (double)mm) * 60.0 + (double)ss - 60.0 * (double)zone;}

⌨️ 快捷键说明

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