c语言趣味题.docx

上传人:b****7 文档编号:9266383 上传时间:2023-02-03 格式:DOCX 页数:15 大小:19.69KB
下载 相关 举报
c语言趣味题.docx_第1页
第1页 / 共15页
c语言趣味题.docx_第2页
第2页 / 共15页
c语言趣味题.docx_第3页
第3页 / 共15页
c语言趣味题.docx_第4页
第4页 / 共15页
c语言趣味题.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

c语言趣味题.docx

《c语言趣味题.docx》由会员分享,可在线阅读,更多相关《c语言趣味题.docx(15页珍藏版)》请在冰豆网上搜索。

c语言趣味题.docx

c语言趣味题

 一、九九乘法表

1*1=1 

        1*2=22*2=4 

        1*3=32*3=63*3=9 

        1*4=42*4=83*4=124*4=16 

        1*5=52*5=103*5=154*5=205*5=25 

        1*6=62*6=123*6=184*6=245*6=306*6=36 

        1*7=72*7=143*7=214*7=285*7=356*7=427*7=49 

        1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64 

        1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81 

        分析:

 

        ①这需要编写一个循环结构的程序。

 

        ②需要循环嵌套。

外循环控制打印第几行,内循环控制打印某一行的若干个等式。

 

        程序如下:

 

        main() 

        {intm,n; 

        for(m=1;m<=9;m++) 

        {for(n=1;n<=m;n++) 

        printf("%1d*%1d=%-4d",m,n,m*n); 

        printf("\n"); 

        } 

        } 

        请思考:

请你用别的编程方法再解此题。

二、说谎

有甲、乙、丙三人,每人或者说真话,或者说假话。

 

        甲说:

“乙说假话。

” 

        乙说:

“甲和丙是同一种人。

” 

        问甲、乙、丙三人谁说真话,谁说假话?

 

        分析:

 

        ①本题看似漫无边际,无法入手,不知道怎么与C语言程序设计挂钩。

但只要和“真”、“假”、逻辑表达式联系起来,脉络就清晰起来。

 

        ②这里用整型变量a、b、c表示甲、乙、丙三人说话的真假,当变量值为1时表示此人说真话,变量值为0时表示此人说假话。

        甲说:

“乙说假话。

”这有两种可能:

甲说的是真话,而乙确实说假话,即:

 

        a==1&&b==0等价于a&&!

        或者甲说的是假话,而乙说真话,即:

 

        a==0&&b==1等价于!

a&&b 

        由此可得逻辑表达式:

 

        a&&!

b||!

a&&b 

        乙说:

“甲和丙是同一种人。

”这有两种可能:

乙说真话,而甲和丙确是同一种人,即:

 

        b==1&&a==c等价于b&&a==c 

        或者乙说的是假话,而甲和丙不是同一种人,即:

 

        b==0&&a!

=c等价于!

b&&a!

=c 

        由此可得逻辑表达式:

 

        b&&a==c||!

b&&a!

=c 

        上述两个逻辑表达式是“与”的关系(因为该满足的条件都要满足,所以是“与”的关系),最终得到确定谁说真话的逻辑表达式        (a&&!

b||!

a&&b)&&(b&&a==c||!

b&&a!

=c) 

        ③穷举每个人说真话或说假话的各种情况,用上述表达式测试,使上述表达式的值为1(真)的情况就是正确的结果。

 

        程序如下:

 

        main() 

        { 

        inta,b,c; 

        for(a=0;a<=1;a++) 

        for(b=0;b<=1;b++) 

        for(c=0;c<=1;c++) 

        {if((a&&!

b||!

a&&b)&&(b&&a==c||!

b&&a!

=c)) 

        printf("a=%d,b=%d,c=%d\n",a,b,c); 

        } 

        } 

        运行结果为:

 

        a=0,b=1,c=0 

        a=1,b=0,c=0 

        请思考:

如果题目中加入“丙说:

‘甲说假话。

’”,则程序如何编写?

运行结果又是什么?

三、兔子繁殖问题

求Fibonacci数列:

1,1,2,3,5,8,13,…的前40项。

 

        本题来自于一个有趣的古典数学问题:

有一对兔子,从出生后的第3个月起每个月都生一对兔子。

小兔子长到第3个月又生一对兔子。

如果生下的所有兔子都能成活,且所有的兔子都不会因年龄大而老死,问每个月的兔子总数为多少?

 

        分析:

 

        ①此数列的规律是第1、2项都是1,从第3项开始,都是其前两项之和,并且有固定循环次数,因此可以用for循环实现。

 

        ②这里用到的是什么算法呢?

是迭代算法。

迭代算法的基本思想是:

不断地用新值取代变量的旧值,或由旧值递推出变量的新值。

 

       

 

 程序如下:

 

        main() 

        { 

        longintf1,f2; 

        inti; 

        f1=1;f2=1; 

        for(i=1;i<=20;i++) 

        { 

        printf("%12ld%12ld",f1,f2);/*每次输出两项*/ 

        if(i%2==0)printf("\n"); 

        f1=f1+f2; 

        f2=f2+f1;/*求出两项*/ 

        } 

        } 

四、百钱与百鸡

我国古代数学家张丘建在《算经》中提出了著名的“百钱百鸡问题”:

“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?

”意思是说:

一只公鸡卖5枚钱,一只母鸡卖3枚钱,三只小鸡卖1枚钱,用100枚钱买100只鸡,能买到公鸡、母鸡、小鸡各多少只?

 

        分析:

 

        ①这是一个不定方程问题。

有3个未知数,2个方程:

设公鸡、母鸡、小鸡数分别为i、j、k,则有i+j+k=100,i*5+j*3+k/3=100。

需要让计算机去一一测试是否符合条件,找出所有可能的答案。

由于价格的限制,如果只是一种鸡,则公鸡最多为19只(由于共100只鸡的限制,不能等于20只),母鸡最多33只,小鸡最多99只。

 

        ②这里用到的是穷举算法。

穷举算法的基本思想是:

对问题的所有可能答案一一测试,直到找到正确答案或测试完全部可能的答案。

 

        程序如下:

 

        main() 

        { 

        inti,j,k; 

        for(i=1;i<=19;i++) 

        for(j=1;j<=33;j++) 

        for(k=3;k<=99;k=k+3) 

        {if((i+j+k==100)&&(i*5+j*3+k/3==100)) 

        printf("i=%d,j=%d,k=%d\n",i,j,k); 

        } 

        } 

        运行结果为:

 

        i=4,j=18,k=78 

        i=8,j=11,k=81 

        i=12,j=4,k=84 

        请思考:

还有没有别的编程方法?

五、该程序在TC3.0环境下编译通过,共有9个函数。

分别是printScreen,start,leave,levelChoice,newWord,moving,wordHit,result和main。

其功能分别是:

printScreen:

刷新屏幕输出的图像。

Start:

用户进入程序时选择开始,退出和求助。

Leave:

用户离开程序事提示感谢使用

levelChoice:

用户开始之前选择等级

newWord:

生成一个新的字母并将其置于首行。

moving:

将屏幕上的所有字母向下移动一行

wordHit:

判断用户是否输入字母,如果输入,且屏幕上有该字母则将该字母所在位置置空。

result:

判断该用户的得分,提示其是否进入下一等级。

main:

总体控制以上各函数,判断其是否运行。

压缩包下载:

打字游戏

-------------------------------------------------------------以下是程序源码----------------------------------------------------

#include"stdio.h"

#include"time.h"

#include"stdlib.h"

#include"conio.h"

#include"dos.h"

#definexLine70

#defineyLine20

#definefull100

#definetrue1

#definefalse0

/*---------------------------------------------------------------------*/

voidprintScreen(intlevel,intright,intsum,charp[yLine][xLine])/*刷新屏幕的输出图像*/

{

  inti,j;

  clrscr();

  printf("level:

%d      Press0toexit;1topause      score:

%d/%d\n",level,right,sum);/*输出现在的等级,击中数和现在已下落总数*/

  printf("----------------------------------------------------------------------\n");

  for(i=0;i

  {

    for(j=0;j

      printf("%c",p[i][j]);

    printf("\n");

  }/*for(i)*/

printf("----------------------------------------------------------------------\n");

}/*printScreen*/

/*---------------------------------------------------------------------*/

voidleave()/*离开程序时,调用该函数结束程序。

*/

{

  clrscr();

  printf("\n\n\n\nThankyouforplaying.");

  delay(2500);

  exit(0);

}

/*----------------------------------------------------------------------*/

intlevelChoice(intlevel)/*进入游戏时选择游戏等级*/

{

 

  while(true)/*void*/

  {

 

    clrscr();

    printf("pleaseinput1-9tochoicelevel.choice0toreturn.\n");

    level=getch();

    level=level-48;

    if(level>0&&level<10)return(level);

    elseif(level==0)

      leave();

    else

      printf("Pleaseinputacorrectnumber!

\n");

  }/*while(true)*/

}/*levelChoice*/

/*---------------------------------------------------------------------*/

intnewWord(intsum,charp[yLine][xLine])/*随生成一个新的字符并将其加入数组的首行*/

{

  intj,w;

  if(sum!

=full)

  {

  j=(rand()%(xLine-2))+1;

  w=(rand()%26)+65;

  p[0][j]=w;

  return(++sum);

  }/*if*/

  return(sum);

}/*newWord*/

/*---------------------------------------------------------------------*/

intmoving(intmiss,charp[yLine][xLine])/*将最后一行置空,并使所有在数组中其他行的字符下降一行*/

{

  inti,j;

  charw;

  for(j=1,i=yLine-1;j

  {

    if(p[i][j]!

='')

  {

      miss++;

      p[i][j]='';

  }

  }

  for(i=yLine-2;i>=0;i--)/*从倒数第二行的最后一个字符开始开始向前遍历该数组内的元素,如果该位置非空则将该字符移动至下一行*/

  {

    for(j=xLine-2;j>0;j--)

  {

      if(p[i][j]!

='')

  {

        w=p[i][j];

        p[i][j]='';

        p[i+1][j]=w;

      }/*if*/

    }/*for(j)*/

  }/*for(i)*/

  return(miss);

}/*moving*/

/*---------------------------------------------------------------------*/

intwordHit(charp[yLine][xLine])

/*判断是否有字符从键盘键入。

如果有,则从最后一行的最后一个元素开始遍历该数组,找出该字符,并把对应位置置空,且返回1。

如果有输入,但屏幕上无对应项,或无输入则返回0*/

{

  inti,j;

  charkey;

  if(kbhit())/*判断用户是否从键盘键入字符。

如果kbhit返回值为*/

  key=getch();

  if(key)

  {

    if(key=='0')leave();

    if(key=='1')

  {

      clrscr();

      printf("Pressanykeytocontinue.");

      getch();

  }

    for(i=yLine;i>0;i--)

  {

      for(j=xLine;j>0;j--)

  {

        if(key-32==p[i-1][j-1])

    {

          p[i-1][j-1]='';

          return(true);

        }/*if*/

      }/*for(j)*/

    }/*for(i)*/

    sound(300);

  }/*if(key)*/

  return(false);

}/*wordHit*/

/*---------------------------------------------------------------------*/

intresult(intright)

/*判断该次的成绩并输出对应的结果,询问用户是否继续,若继续,判断是否可以进入下一级别。

*/

{

  intscore;

  charyn;

  score=right*100/full;

  nosound();

  clrscr();

  if(score==100)

  printf("perfect!

\n");

  elseif(score>=85)

  printf("good!

\n");

  elseif(score>=70)

  printf("That'sOK!

\n");

  else

  printf("youneedtoplayagain.\n");

  printf("doyouwanttocontinue?

 Y/N\n");

  for(;;)/*void*/

  {

  yn=getch();

  switch(yn)

  {

  case'y':

  {

  if(score>=70) return(true);

  else return(false);

  }/*case*/

  case'n':

leave();

  default:

printf("Pleaseinputacorrectchoice:

");

  }/*switch*/

  }/*for*/

}/*result*/

/*---------------------------------------------------------------------*/

intstart()/*进入程序时调用该函数,提示其操作。

*/

{

  charc;

  while(true)

  {

clrscr();

    printf("\n\n\n\n\n     Welcometotypegame!

\n\n\n     1.start\n     2.Howtoplay\n     0.Exit");

    c=getch();

    switch(c)

  {

    case'0':

leave();/*用户选择退出,退出主程序*/

    case'2':

     {

 clrscr();

          printf("\n\n\n\n\n     Hitthetypewhenyouseeitonthescreen.\n     Press0toexit.\n     Press1topause\n     1.start\n     0.exit");

          while(true)

     {

          c=getch();

            if(c=='0')leave();

            if(c=='1')return(true);

     }

     }

    case'1':

return(true);

  }

  }

}

/*----------------------------------------------------------------------*/

 

voidmain()

{

  /*---------------------------------------------------------------------*/

  /*函数声明*/

  voidprintScreen(intlevel,intright,intsum,charp[yLine][xLine]);

  voidleave();

  intlevelChoice(intlevel);

  intnewWord(intsum,charp[yLine][xLine]);

  intmoving(intmiss,charp[yLine][xLine]);

  intwordHit(charp[yLine][xLine]);

  intresult(intright);

  intstart();

  /*---------------------------------------------------------------------*/

  charp[yLine][xLine];

  inti,j,level,right,sum,n,m,miss;

  srand(time(NULL));

  start();

  for(i=0;i

  {

  for(j=0;j

    if(j==0||j==xLine-1)

      p[i][j]=140;

    else

      p[i][j]='';

  }/*for(i)*/

  level=levelChoice(level);

  for(;;)/*开始运行主程序*/

  { sum=0;

  right=0;

  miss=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1