///week14p2.c / week14p2.cpp -- for HWK# @Week14 ///// 注意必須測試另存新檔成 .c 和 .cpp 都要測試 ! #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> // C string #ifdef __cplusplus #include <string> // C++ string #include <iostream> using namespace std; // std:: extern "C" { // 表示以下都是 "C" program #endif // "C" program char aa[6][26], bb[6][26], cc[6][26]; // Global char tt[26]=".Su Mo Tu We Th Fr Sa _+_"; // Global int whoRU( ), testInput( ), testP3M( ); int isInStr(char c, const char *str) { int k=strlen(str); while(k > 0) { k--; if(c == str[k]) return 1; if(k==0) return 0; }//while return 0; // 其實不可能跑到這 ! } // isInStr(c, str int main( ) { whoRU( ); srand(time(0)); printf("isInStr('q', \"QqEe\")==%d\n", isInStr('q', "QqEe") ); testInput( ); testP3M( ); fprintf(stderr, "=== End of main( ) ===\n"); } int findNums(int g[ ], char*buf) { int num = 0; if(buf==0 || buf[0]==0) return 0; char *bufOLD = buf; g[0] = strtol(buf, &buf, 10); if(bufOLD == buf) return 0; bufOLD = buf; g[1] = strtol(buf, &buf, 10); if(bufOLD == buf) return 1; bufOLD = buf; g[2] = strtol(buf, &buf, 10); if(bufOLD == buf) return 2; return 3; // Got 3 numbers } // findNums typedef enum COUNTRY { TAIWAN=38, CHINA=49, JAPAN=55, USA= 22, } COUNTRY; COUNTRY ccc = USA; // Country Code defaualt == USA; Global int prtCCC(COUNTRY p) { if(p == TAIWAN) { fprintf(stderr, "Switch to TAIWAN\n"); return p; } switch(p){ case USA: fprintf(stderr, "Switch to USA 美國英國加拿大\n"); break; case CHINA: fprintf(stderr, "清朝和中國都和 TAIWAN 同!\n"); break; case JAPAN: printf("日本\n"); break; default: break; } return p; } // prtCCC( int testInput( ){ char buf[99]; int got[9]; // 其實只用三個 元素 COUNTRY cccOLD = ccc; while(38) { cccOLD = ccc; // 記住原先 ccc fprintf(stderr,"打一列數值或cjQ: "); fgets(buf, sizeof buf, stdin); if(feof(stdin)) exit(3388); // EOF, 故意結束整個程式 if(isInStr(buf[0], "QEqe") ) break; if( isInStr(buf[0], "JjNn") ) ccc = JAPAN; if( isInStr(buf[0], "tT") ) ccc = TAIWAN; if( isInStr(buf[0], "Cc") ) ccc = CHINA; if( isInStr(buf[0], "AUua") ) ccc = USA; if(cccOLD != ccc) { prtCCC(ccc); continue; // 不處理 input 數值 } int n = findNums(got, buf); char fmt[66] = " Got %d numbers: %d %d %d \n"; // 以下偷改 fmt[ ] 內容 if(n==0) sprintf(fmt+15, ".%s\n", " "); // 注意這的 fmt+15 有義意喔 if(n==1) sprintf(fmt+14, ": %s\n", " %d "); if(n==2) sprintf(fmt+15, ":%s", " %d %d\n\r "); fprintf(stderr, fmt, // 注意 fmt 在上面幾句可能已經被偷改掉 n, got[0], got[1], got[2]); // 若有多的參數沒對應到 %d 或 %啥的並沒關係 ! } // while fprintf(stderr, "Bye ! 再見 !\n"); } // testInput( int clearABC( ){ // 注意 aa, bb, cc 都是 char [6][26] int i; for(i=0; i<6; ++i) { sprintf(aa[i],"%25s", " "); // 用 %25s 是因 [26] 有 26 Bytes sprintf(bb[i],"%25s", " "); // 注意C字串 結束須有 '\0' (NULL) sprintf(cc[i],"%25s", " "); // 以下兩列 Debug 用, 建議刪除或註解掉! if(i==0)fprintf(stderr, "strlen of them===%d %d %d\n", strlen(aa[i]), strlen(bb[i]), strlen(cc[i]) ); } }// clearABC int putABC(int y, int m, char abc[6][26]){ // 用來塞入 aa[], bb[], cc[] sprintf(abc[0], "%15d%10s", y, " "); // 共 25 char sprintf(abc[1], "%%13s:: [%13s] ", "LINE 1"); // 要確保 25 char 不然格式會亂掉 sprintf(abc[2], "%%-13s:: [%-13s] ", "LINE 2"); // " " sprintf(abc[3], "%3d %5d %7d%7s|", m, m, m, " "); // 補個 %7s| 也是共 25 char; int i, gg= 2 + rand( )%5; for(i=0; i< 7; ++i) { sprintf(abc[4]+3*i, " %2d", gg+i); // 6 7 8 9 10 11 12 sprintf(abc[5]+3*i, " %2d", gg+i+7); // 13 .. 19 } sprintf(abc[4]+21, " ]"); sprintf(abc[5]+21, " "); // 故意 } int testP3M( ) { // Demo Print 3 Month int i; clearABC( ); // 清除 字串 aa[], bb[], cc[] fprintf(stderr, "testP3M( ) . . .\n"); putABC(2345222, 2, bb); putABC(2024, 3, cc); putABC(10111, 7, aa); fprintf(stderr, "Now print 3M out\n"); fprintf(stdout, "%s%s%s\n", tt, tt, " Su Mo Tu We Th Fr Sa =" ); //故意 ! for(i=0; i<=5; ++i){ fprintf(stdout, "%s%s%s\n", aa[i], bb[i], cc[i]); } } // testP3M( int whoRU( ) { int m=38, kk=49; fprintf(stderr, "Original: m=%d, kk=%d\n", m, kk); // good for C/C++ #if defined(__cplusplus) // 用#if 因為只最新版的 C 的 #ifdef 才可用 #elifdef cerr << "You are using C++ compiler ! Filename is .cpp ?\n"; cerr << "C++ has Generic template function swap(T,T) 只要 #include <iostream>就可用\n"; swap(m, kk); cerr << "m=" << m <<"; kk="<<kk<<endl; cerr << "記得也要另存新檔 .c 檔案再次測試 !\n"; #else fprintf(stderr, "You R uning pure C compiler. with a .c File?\n"); fprintf(stderr, "你需要自己寫 swap(變數指標, 變數指標) 做對調\n"); #endif } #ifdef __cplusplus } // 對應前面的 extern "C" { #endif ////// End of week14p02.c / week14p02.cpp // more TBA ? /// 就降子啦 ////////////// // https://www.tondering.dk/claus/cal/chinese.php (ncal / Calendar FAQ) /////////////////////