标题:写了个唐诗组合任务小程序,有兴趣大家研究一下。
取消只看楼主
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
已结贴  问题点数:40 回复次数:18 
写了个唐诗组合任务小程序,有兴趣大家研究一下。
先上代码:
程序代码:
#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>
#include  <string.h>
#include  <windows.h>

struct  TIME
{
    int hour, minute, second;
    void  count_down();
    void  time_show();
    void  time_run();
    void  time_set(int, int, int);
};

void poem_store();
void poem_show(char letter, char a[10]);

int  main(void)
{
    char array[10], check[2];
    char letter;
    int  h = 0, m = 0, s = 2;
    int  i, j = 2, score = 0;
   
    printf("请在5分钟内完成唐诗组合任务!\n");
    TIME a;
    a.time_set(h, m, s);
    a.time_run();
    printf("\n");
    poem_store();       
    printf("\n请用上面诗句对应的大写字母组织两个五言绝句:");
    while(j--)
    {
      printf("\n请输入四个大写字母,用空格间隔后回车:\n");
      for (i = 0; i < 4 && EOF != scanf(" %c", &letter); i++)
      {
        poem_show(letter, array);
      }
      array[i] = 0;
      check[j] = array[0];
      if (strcmp(array,"star") == 0 || strcmp(array, "foug") == 0)
      {
        if (check[1] == check[0])
            printf("重复组合,得0分!\n");
        else
        {
          score += 15;
          printf("你太厉害了,再接再厉!现在的分数是%d\n", score);
        }
      }
      else
          printf("错误!得0分.\n");
    }
      printf("稍等片刻……\n");
      Sleep(3000);
      system("cls");
      poem_store();
      printf("\n请用上面诗句对应的大写字母组织一个五言律诗:");
      printf("\n请输入八个大写字母,用空格间隔后回车:");
      for (i = 0; i < 8 && EOF != scanf(" %c", &letter); i++)
      {
        poem_show(letter, array);
      }
      array[i] = 0;
      if (strcmp(array,"bmecknyz") == 0 )
      {
      score += 30;
      printf("你太厉害了,再接再厉!现在的分数是%d\n", score);
      }
      else
          printf("错误!得0分.\n");    
      printf("稍等片刻……\n");
      Sleep(3000);
      system("cls");
      poem_store();
      printf("\n请用上面诗句对应的大写字母组织一个五言乐府:");       
      printf("\n请输入十个大写字母,用空格间隔后回车:");
      for (i = 0; i < 10 && EOF != scanf(" %c", &letter); i++)
      {
        poem_show(letter, array);
      }
      array[i] = 0;
      if (strcmp(array,"wjhpdilqvx") == 0 )
      {
      score += 40;
      printf("你太厉害了!现在的分数是%d\n", score);
      }
      else
          printf("错误!得0分.\n");   
    if (h == 0 && m == 0 && s == 0)
    {
        printf("时间到!你的成绩是%d分\n", score);
        Sleep(3000);
        exit(0);
    }
    return 0;
}

void poem_store()
{
   printf("A:本来无一物B:百川东到海C:常恐秋节至D:荡胸生层云E:何处惹尘埃\n");
   printf("F:两句三年得G:归卧故山丘H:何时复西归I:岱宗夫如何J:决眦入归鸟\n");
   printf("K:焜黄华叶衰L:老大徒伤悲M:明镜亦非台N:一吟双泪流O:知音如不赏\n");
   printf("P:菩提本无树Q:青青园中葵R:齐鲁青未了S:少壮不努力T:造化钟神秀\n");
   printf("U:会当凌绝顶V:一览众山小W:万物生光辉X:阴阳割昏晓Y:阳春布德泽Z:朝露待日晞\n");
}

void poem_show(char letter, char a[10])
{   
   switch (letter)
   {
   case 'A': printf("本来无一物\n"); a[2] = 'a'; break;
   case 'B': printf("百川东到海\n"); a[6] = 'l'; break;
   case 'C': printf("常恐秋节至\n"); a[4] = 'd'; break;
   case 'D': printf("荡胸生层云\n"); a[4] = 'k'; break;
   case 'E': printf("何处惹尘埃\n"); a[3] = 'r'; break;
   case 'F': printf("两句三年得\n"); a[0] = 'f'; break;
   case 'G': printf("归卧故山丘\n"); a[3] = 'g'; break;
   case 'H': printf("何时复西归\n"); a[7] = 'q'; break;
   case 'I': printf("岱宗夫如何\n"); a[0] = 'b'; break;
   case 'J': printf("决眦入归鸟\n"); a[5] = 'n'; break;
   case 'K': printf("焜黄华叶衰\n"); a[5] = 'i'; break;
   case 'L': printf("老大徒伤悲\n"); a[9] = 'x'; break;
   case 'M': printf("明镜亦非台\n"); a[1] = 't'; break;
   case 'N': printf("一吟双泪流\n"); a[1] = 'o'; break;
   case 'O': printf("知音如不赏\n"); a[2] = 'u'; break;
   case 'P': printf("菩提本无树\n"); a[0] = 's'; break;
   case 'Q': printf("青青园中葵\n"); a[0] = 'w'; break;
   case 'R': printf("齐鲁青未了\n"); a[1] = 'm'; break;
   case 'S': printf("少壮不努力\n"); a[8] = 'v'; break;
   case 'T': printf("造化钟神秀\n"); a[2] = 'e'; break;
   case 'U': printf("会当凌绝顶\n"); a[6] = 'y'; break;
   case 'V': printf("一览众山小\n"); a[7] = 'z'; break;
   case 'W': printf("万物生光辉\n"); a[3] = 'p'; break;
   case 'X': printf("阴阳割昏晓\n"); a[3] = 'c'; break;
   case 'Y': printf("阳春布德泽\n"); a[2] = 'h'; break;
   case 'Z': printf("朝露待日晞\n"); a[1] = 'j'; break;
   default:  printf("哦米拖佛,施主请输入大写字母\n"); break;
   } 
}

void TIME::count_down()
{
    long t = time(NULL);
    while (t == time(NULL));
    if (--second < 0)
    {
        second = 59;
        if (--minute < 0)
        {
            minute = 59;
            --hour;
        }
    }
}

void  TIME::time_show()
{
    printf("\r");
    if (hour < 10)
        printf("0");
        printf("%d:", hour);
    if (minute < 10)
        printf("0");
        printf("%d:", minute);
    if (second < 10)
        printf("0");
        printf("%d", second);
}

void  TIME::time_run()
{
    while (second != 0 || minute != 0 || hour != 0)
    {
        count_down();
        time_show();
    }
}
void  TIME::time_set(int h, int m, int s)
{
    hour = h;
    minute = m;
    second = s;
}


我本来的愿望是通过一个倒计时器去限制任务的时间,但是我的计时器无法与人员操作同步,貌似要把倒计时器的规定时间显示完了后 才能进入唐诗组合任务界面, 有什么办法边做任务边计时,然后到了规定时间(5分钟)必须交卷!

[ 本帖最后由 有容就大 于 2012-2-4 17:49 编辑 ]
搜索更多相关主题的帖子: minute second 唐诗 
2012-02-04 17:26
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
以下是引用zklhp在2012-2-4 17:52:17的发言:

个人建议 在熟悉了写法之后尝试用些数据结构一类的东西优化一下
main函数里的唐诗组合应该可以写成一个子函数,传入输入字母的个数做参数,我试了下,但是要改变相应的letter 和 array[],由于只有4次组合,我就直接都放在主函数里了。不知还有哪里可以更简洁点。
Z版怎么让计时器发生作用,难道这个牵扯到多线程?

梅尚程荀
马谭杨奚







                                                       
2012-02-04 17:59
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 4楼 zklhp
c里也可以用吧,反正可以编译通过。

梅尚程荀
马谭杨奚







                                                       
2012-02-04 17:59
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
谢谢各位老大的建议,水越淌越深咯。

梅尚程荀
马谭杨奚







                                                       
2012-02-04 21:32
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
以下是引用TonyDeng在2012-2-5 02:15:54的发言:

編程環境:VS2010 SP1,.NET Framework4
移植性事項:1.帶_s後綴為新型安全函數,不兼容的編譯器,請替換為舊版函數名稱;
            2._getch()、_putch()、_kbhit()是MSC庫函數,用TC、BC系列的,沒有下劃線,即getch()、putch()、kbhit(),在conio.h頭中

btw: 這個函數使用的死循環輪詢模式是傳統DOS系統下面向對象引發事件的標準做法,也是Windows下C編程中WndPro()過程的機制,根本上Windows就是這樣寫出來的。hellovfp說的那個tt遊戲,也用這種原理寫即可,機器夠快,穿插做其他事感覺很輕微。當然,若有系統中斷會帶來某種方便,不過並非全依賴中斷不可。kbhit()其實是系統鍵盤中斷函數,但這裡的用法卻不算是使用了中斷。如果要顯示跳錶式的倒計時畫面,只要有光標自由跳動的功能即可,跳開去顯示時間然後返回來,這樣的功能是控制臺流模式無法做到的,必須用conio.h中的寫屏技術,TC/BC中有現成的gotoxy()函數,VC中要調用API的SetCursorPosition()函數(要麼用CLR的Console命名空間),只是這樣與操作系統的結合緊密許多,也正是conio.h頭不入標準庫的原因。我曾經在壇上貼過的仿LED時鐘就是這樣做的,在控制臺下顯示類似Windows的狀態欄,很早就不存在問題了,TC/BC IDE介面就是這種東西,在以前不會寫這樣的程序簡直無法混IT,後來的人一開始就接觸Windows不知道舊式程序是怎麼寫的,才覺得控制臺程序只能黑漆漆罷了,TC/BC五顏六色的介面你以為是Windows的窗口控件?

     
#include <stdio.h>
#include <time.h>
#include <ctype.h>
#include <conio.h>

 
#define K_ENTER        0x0D
 
bool GetString(char InputString[], size_t Length, unsigned long int Seconds);
 
void main(void)
{
    char Buffer[6];
 
    printf_s("Please type a string, max %d characters, Press Enter to confirm: ", sizeof(Buffer) - 1);
    GetString(Buffer, sizeof(Buffer) - 1, 5UL);
    printf_s("\nYour input is: %s\n", Buffer);
 
    _getch();
}
 
bool GetString(char InputString[], size_t Length, unsigned long int Seconds)
{
    time_t Start;                  // 開始時間
    time_t End;                    // 結束時間
    int Character = '\0';          // 輸入的字符
    size_t Counter = 0;            // 字符計數器
    bool Success = true;
 
    if (Length < 1)                // 只容納一個字符的字符串直接返回空串,並報告輸入失敗
    {
        InputString[0] = '\0';
        return false;
    }
 
    time(&Start);
    do
    {
        time(&End);
        if (End - Start >= Seconds)
        {
            Success = false;
            Counter = 0;           // 如果需要超時保留已輸入的字符串,則此處不要歸零
            break;
        }
        if (_kbhit())
        {
            Character = _getch();
            if (Character == 0xE0)
            {
                // 沒收控制鍵,諸如BackSpace、Delete、TAB、光標鍵等均不接受
                _getch();
                continue;
            }
            if (isprint(Character) && (Character != K_ENTER))
            {
                // 本代碼全程使用ANSI版本的函數,isprint()是排斥中文字符的,因此若要輸入中文,不使用isprint()即可,但
                // 要檢測中文字符,對應Counter += 2(與系統的編碼體系有關),否則有字符串溢出危險。改用寬字符版本函數
                // 可有效避免此種麻煩。
                InputString[Counter++] = Character;
                _putch(Character);
            }
        }
    } while((Character != K_ENTER) && (Counter < Length));
    InputString[Counter] = '\0';
 
    return Success;
}
谢谢T版的代码,研究了下有几个问题请教:
1.size_t的使用,度娘说size_t是一个无符号整数memsize基地型的C / C + +语言的标准库中定义的,头文件是
stddef.h。那么ctype.h和他是否有相似的作用?size_t不一定和int同长度,而是视机器而定?
2.  为什么是sizeof(Buffer) - 1而不用 sizeof(Buffer),貌似 这样Buffer【6】只能输出最大长度是5个字符。
3. if (Character == 0xE0)
            {
                // 沒收控制鍵,諸如BackSpace、Delete、TAB、光標鍵等均不接受
                _getch();
                continue;
            }
   是不是如果输入BackSpace、Delete、TAB、光標鍵都将返回0xE0?将0xE0改成0可不可以?我测试了下有个有趣的现象,即在长度小于最大长度时结尾输入上面中的一个系统将不回显字符串。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 09:22
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 18楼 TonyDeng
3.輸入控制符是即使被廢掉,不進入字符串,可以繼續按鍵的,不會返回,只是等同於你沒有輸入一樣。
哦,我的问题是这样的,即在一串已经输入的字符串后输入一个控制符,那么整个前面的字符都将不回显。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 10:54
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 21楼 TonyDeng
哦 ,原来如此。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 10:58
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 17楼 beyondyf
杨大哥,羡慕死你了。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 11:01
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
我现在的问题是需要一个时钟显示,如倒计时显示00:00:59-->00:00:00.并在这个显示的催促下完成相应作业。那么kbhit()和timer()能实现这个目的吗。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 11:19
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 29楼 TonyDeng
如果不下载graphic.h到vc6.0++中,就不能调用gotoxy()吧,可以自己写个光标移动函数吗?

[ 本帖最后由 有容就大 于 2012-2-5 11:33 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-02-05 11:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360398-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.633889 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved