回精華區
作者itoc (cygreadline4.dll), 信區: plan
標題[功能] 聯考榜單查詢
時間2004/05/21 Fri 09:16:41 Updated: 2005/08/09
: etc/jcee

  抓 http://cpu.twbbs.org/~itoc/jcee.tgz 解壓縮在 etc/ 下
  也就是要有 etc/jcee/##.txt,## 是民國年

: menu.c 在適當的選單加上

+ "bin/jcee.so:main_jcee", 0, - M_XMODE,
+ "JCEE       ♂ 聯考查榜 ♀",

: game/Makefile

SO =    ... jcee.so

: game/jcee.c 新增此程式

/*-------------------------------------------------------*/
/* jcee.c       ( NTU FPG BBS Ver 2.00 )                 */
/*-------------------------------------------------------*/
/* target : 聯考榜單查詢                                 */
/* create : 98/08/08                                     */
/* update : 01/08/21                                     */
/* author : 吳紹衍                                       */
/* modify : itoc.bbs@bbs.tnfsh.tn.edu.tw                 */
/*-------------------------------------------------------*/


#if 0

 資料來源
 http://www.csie.nctu.edu.tw/service/jcee/歷年

#endif


#include "bbs.h"


#define END_YEAR   94      /* 最後一年的榜單是民國 94 年 */


static int
ueequery_item(count, i, examnum, ptr, now)
  int count, i, examnum;
  char *now, *ptr;
{
  char buf[32];

  if (count > XO_TALL && (count % XO_TALL) == 1)
  {
    move(1, 0);
    clrtoeol();
    outs("\033[1;33m本頁查詢已滿,換頁查詢請按任意鍵,結束查詢請按 Q\033[m");

    if (vkey() == 'q')
      return 0;

    i = 0;
    vs_bar("聯考榜單查詢");
    move(2, 0);
    outs(COLOR2 " 准考證   姓  名    錄 取 大 學         "
      "錄 取 科 系                           \033[m");
  }

  move(3 + i, 0);

  sprintf(buf, " %%-%d.%ds%%%ds   %%-8s  %%s", examnum, examnum, 9 - examnum);
  prints(buf, ptr, "", ptr + examnum, now);

#if 0
  if (examnum == 6)
    prints(" %-6.6s   %-8s  %s", ptr, ptr + examnum, now);
  else if (examnum == 7)
    prints(" %-7.7s  %-8s  %s", ptr, ptr + examnum, now);
  else if (examnum == 8)
    prints(" %-8.8s %-8s  %s", ptr, ptr + examnum, now);
#endif

  move(b_lines, 0);
  clrtoeol();
  prints(COLOR1 " 榜單查詢 " COLOR2 " 目前共查詢到 %4d 筆資料。"
    "本資料僅供參考,錄取結果以聯招會公布為準 \033[m", count);

  return i + 1;
}


static void
ueequery_foot(count)
  int count;
{
  if (count == 0)
  {
    move(4, 0);
    outs("沒有查詢到任何資料");
  }
  move(b_lines, 0);
  clrtoeol();
  prints(COLOR1 " 榜單查詢 " COLOR2 " 目前共查詢到 %4d 筆資料。"
    "查詢結束,按任意鍵離開                   \033[m", count);
  vkey();
}


static int
x_ueequery()
{
  char buf[256], query[20], now[80], *ptr;
  int i, count, year, examnum;
  FILE *fp;

  vs_bar("聯考榜單查詢");

  outs("\n注意事項\n"
    "1. 完整准考證號碼及部份姓名兩項至少需填寫一項才能夠查詢\n"
    "2. 若姓名只有兩字,請於兩字中間加全形空白\n"
    "3. 83-86 年需要六位准考證號碼,87-90 年需要七位准考證號碼\n"
    "4. 91年起需要八位准考證號碼\n");

  sprintf(buf, "請輸入聯考年度(83 ~ %d)?[%d] ", END_YEAR, END_YEAR);

  if (!vget(9, 0, buf, query, 3, DOECHO))
  {
    year = END_YEAR;
  }
  else
  {
    year = atoi(query);
    if (year < 83 || year > END_YEAR)
      return 0;
  }

  if (year <= 86)
    examnum = 6;
  else if (year <= 90)
    examnum = 7;
  else
    examnum = 8;

  if (vget(11, 0, "請輸入完整准考證號碼:", query, examnum + 1, DOECHO))
  {
    if (strlen(query) != examnum)
    {
      vmsg("不正確的完整准考證號碼");
      return 0;
    }
  }
  else if (!vget(13, 0, "請輸入部份姓名:", query, 10, DOECHO))
  {
    vmsg("請於准考證號碼於姓名二欄中擇一填寫");
    return 0;
  }

  sprintf(buf, "etc/jcee/%d.txt", year);

  if (fp = fopen(buf, "r"))
  {
    int j;
    char *pquery;

    count = 0;  /* 算全部有幾個 */
    i = 0;      /* 算本頁的第幾個 */

    vs_bar("聯考榜單查詢");
    prints("查詢《%s》中....\n", query);
    outs(COLOR2 " 准考證   姓  名    錄 取 大 學         "
      "錄 取 科 系                           \033[m");

    while (fgets(buf, 256, fp))
    {
      if (buf[0] == ' ')        /* 這樣就是科系的開頭 */
      {
        ptr = strtok(buf + 5, " ");
        strcpy(now, ptr);
        ptr = strtok(NULL, " ");
        sprintf(now, "%-24s%-30s", now, ptr);
        continue;
      }

      ptr = strtok(buf, "    ");

      do
      {
        if (pquery = strstr(ptr, query))
          j = (pquery - ptr) + examnum + 1;
        else
          j = 2;               /* 表示未找到 */

        if (j == (pquery - ptr) + examnum + 1 || j % 2)/* 處理中文字的問題 */
        {
          count++;
          if (!(i = ueequery_item(count, i, examnum, ptr, now)))
          {
            fclose(fp);
            ueequery_foot(count);
            return 0;
          }
        }
      } while (ptr = strtok(NULL, "    "));
    }
    fclose(fp);
  }

  ueequery_foot(count);
  return 0;
}


static int
x_ueequery2()
{
  char buf[256], query[30], query2[30], now[80], *ptr;
  int i, count, year, examnum;
  int school, dept;
  FILE *fp;

  vs_bar("聯考榜單查詢");

  outs("\n注意事項\n"
    "1. 大學及科系兩項至少需填寫一項才能夠查詢\n"
    "2. 輸入部分字串即可\n");

  sprintf(buf, "請輸入聯考年度(83 ~ %d)?[%d] ", END_YEAR, END_YEAR);

  if (!vget(9, 0, buf, query, 3, DOECHO))
  {
    year = END_YEAR;
  }
  else
  {
    year = atoi(query);
    if (year < 83 || year > END_YEAR)
      return 0;
  }

  if (year <= 86)
    examnum = 6;
  else if (year <= 90)
    examnum = 7;
  else
    examnum = 8;

  vget(11, 0, "請輸入查詢大學:", query, 20, DOECHO);
  vget(13, 0, "請輸入查詢科系:", query2, 20, DOECHO);

  if (!*query && !*query2)
    return 0;

  sprintf(buf, "etc/jcee/%d.txt", year);

  if (fp = fopen(buf, "r"))
  {
    count = 0;  /* 算全部有幾個 */
    i = 0;      /* 算本頁的第幾個 */

    vs_bar("聯考榜單查詢");
    prints("查詢《%s%s》中....\n", query, query2);
    outs(COLOR2 " 准考證   姓  名    錄 取 大 學         "
      "錄 取 科 系                           \033[m");

    while (fgets(buf, 256, fp))
    {
      if (buf[0] == ' ')         /* 這樣就是科系的開頭 */
      {
        ptr = strtok(buf + 5, " ");
        strcpy(now, ptr);

        if (!*query || strstr(now, query))      /* 找到學校 */
          school = 1;
        else
          school = 0;

        ptr = strtok(NULL, " ");
        if (!*query2 || strstr(ptr, query2))    /* 找到科系 */
          dept = 1;
        else
          dept = 0;

        sprintf(now, "%-24s%-30s", now, ptr);
        continue;
      }

      ptr = strtok(buf, "    ");

      do
      {
        if (school && dept && strlen(ptr) >= 6)/* 處理中文字的問題 */
        {
          count++;
          if (!(i = ueequery_item(count, i, examnum, ptr, now)))
          {
            fclose(fp);
            ueequery_foot(count);
            return 0;
          }
        }
      } while (ptr = strtok(NULL, "    "));
    }

    fclose(fp);
  }

  ueequery_foot(count);
  return 0;
}


int
main_jcee()
{
  int ch;

  ch = vans("聯考榜單查詢,請選擇 1)金榜查詢 2)科系錄取名單 [Q]離開 ");
  if (ch == '1')
    x_ueequery();
  else if (ch == '2')
    x_ueequery2();
  else
    return XEASY;

  return 0;
}

--
□ 本文章由 itocitoc.Dorm11.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻