困难——循环控制结构

1.

编写一个简单的23 根火柴游戏程序,实现人跟计算机玩这个游戏的程序。
为了方便程序自动评测,假设计算机移动的火柴数不是随机的,而是将剩余的火柴根数减1后对4求余来计算,如果计算结果为0,则取走1根。
游戏规则是:
1、两个游戏者开始拥有23 根火柴棒;
2、每个游戏者轮流移走1 根、2根或3根火柴;
3、谁取走最后一根火柴为失败者。
程序一次运行示例如下: 
这里是23根火柴游戏!!
注意:最大移动火柴数目为三根
请输入移动的火柴数目:
3
您移动的火柴数目为:3
您移动后剩下的火柴数目为:20
计算机移动的火柴数目为:3
计算机移动后剩下的火柴数目为:17
请输入移动的火柴数目:
2
您移动的火柴数目为:2
您移动后剩下的火柴数目为:15
计算机移动的火柴数目为:2
计算机移动后剩下的火柴数目为:13
请输入移动的火柴数目:
3
您移动的火柴数目为:3
您移动后剩下的火柴数目为:10
计算机移动的火柴数目为:1
计算机移动后剩下的火柴数目为:9
请输入移动的火柴数目:
1
您移动的火柴数目为:1
您移动后剩下的火柴数目为:8
计算机移动的火柴数目为:3
计算机移动后剩下的火柴数目为:5
请输入移动的火柴数目:
2
您移动的火柴数目为:2
您移动后剩下的火柴数目为:3
计算机移动的火柴数目为:2
计算机移动后剩下的火柴数目为:1
请输入移动的火柴数目:
3
您移动的火柴数目为:3
您移动后剩下的火柴数目为:-2
对不起!您输了!

补充说明:
如果输入的火柴数超过3,则输出"对不起!您输入了不合适的数目,请点击任意键重新输入!\n",如果玩家赢了,则输出"恭喜您!您赢了! \n"
#include <stdio.h>

int iSum = 23;
int iPlayer;
int iComputer;
int iRes = 23;

int main (void)
{
    printf ("这里是23根火柴游戏!!\n");
    printf ("注意:最大移动火柴数目为三根\n");

    while (1)
    {
        printf ("请输入移动的火柴数目:\n");
        scanf ("%d", &iPlayer);

        while (iPlayer > 3 || iPlayer <= 0)
        {
            printf ("对不起!您输入了不合适的数目,请点击任意键重新输入!\n");

            printf ("请输入移动的火柴数目:\n");
            scanf ("%d", &iPlayer);
        }

        printf ("您移动的火柴数目为:%d\n", iPlayer);

        iRes -= iPlayer;
        printf ("您移动后剩下的火柴数目为:%d\n", iRes);

        if (iRes <= 0)
        {
            printf ("对不起!您输了! \n");

            return 0;
        }

        iComputer = ((iRes - 1) % 4 == 0) ? 1 : ((iRes - 1) % 4);
        printf ("计算机移动的火柴数目为:%d\n", iComputer);

        iRes -= iComputer;
        printf ("计算机移动后剩下的火柴数目为:%d\n", iRes);

        if (iRes == 0)
        {
            printf ("恭喜您!您赢了! \n");

            return 0;
        }
    }
}

(PS: 尝试一下赢过电脑 :D)

2.

程序模拟简单运算器的工作:输入一个算式(没有空格),遇等号'='说明输入结束,输出结果。假设计算器只能进行加、减、乘、除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。例如输入"1+2*10-10/2="后,输出10。
**输出格式要求:"%d" 出错提示信息:"错误的运算符:%c"
程序运行示例如下:
1+2*10-10/2=    <===此行为输入
10              <===此行为输出
#include <stdio.h>
#include <stdbool.h>

bool bFlag = true;

int main (void)
{
    int iAns;
    int iPut;
    char ch;
    
    scanf ("%d", &iAns);
    
    while ((ch = getchar ()) != '=')
    {
        scanf ("%d", &iPut);
        
        if (iPut == 0 && ch == '/')
        {
            bFlag = false;
            
            break;
        }
        
        switch (ch)
        {
            case '+':
                iAns += iPut;
                break;
            case '-':
                iAns -= iPut;
                break;
            case '*':
                iAns *= iPut;
                break;
            case '/':
                iAns /= iPut;
                break;
            default :
                bFlag = false;
                break;
        }
        
        if (bFlag == false)
        {
            break;
        }
    }
    
    if (bFlag == false)
    {
        printf("错误的运算符:%c", ch);
    }
    else
    {
        printf ("%d", iAns);
    }
    
    return 0;
}

3.

*输出正六边型。编写程序输出连长为N的空心正六边型,其边由‘*’组成。
**输入格式要求:"%d"  提示信息:"Enter length:"
**输出格式要求:"%c"
程序运行示例如下:
Enter length:5
    *****
   *     *
  *       *
 *         *
*           *
 *         *
  *       *
   *     *
    *****
#include<stdio.h>

int main (void)
{
    int n;

    printf ("Enter length:");

    scanf("%d", &n);

    int i, j;
    for (i = 1; i <= (2 * n - 1); i++)
    {
        if (i == 1 || i == (2 * n - 1))
        {
            for (j = 1; j <= (2 * n - 1); j ++)
            {
                (j < n) ? printf(" ") : printf("*");
            }
        }

        if (i>1 && i <= n)
        {
            for (j = 1; j <= (2 * n + i - 2); j ++)
            {
                (j == (n - i + 1) || j == (2 * n + i - 2)) ? printf("*") : printf(" ");
            }
        }

        if (i > n && i < (2 * n - 1))
        {
            for (j = 1; j <= (4 * n - i - 2); j ++)
            {
                (j == (i + 1 - n) || j == (4 * n - i - 2)) ? printf("*") : printf(" ");
            }
        }

        printf("\n");
    }

    return 0;
}

4.

从键盘输入1行字符串(每行最多输入80个字符),
统计字符串中所包含的各个英文小写字符及其对应的数量。
**输入格式要求:不要有任何提示信息,直接输入1行字符。
**输出格式要求:按字母顺序输出统计结果,"%c=%d\n"
每行输出一个字母的统计信息。
如果某个字母没有出现,则不输出该字母的统计信息。
如:输入字符串: 
abc2ed a7bcdcd
则输出:
a=2
b=2
c=3
d=3
e=1
#include<stdio.h>
#include<string.h>

#define MAXN 80

int main (void)
{
    char letter[26]; // 存放小写字母
    char str[MAXN];
    int book[26] = {0}; // 记录出现次数

    int i, j;
    for (i = 0; i < 26; i++)
    {
        letter[i] = 'a' + i;
    }

    while ((gets(str)))
    {
        for (i = 0; i <= MAXN; i ++)
        {
            if (str[i] == '\0')
            {
                break;
            }
            else
            {
                for (j = 0; j < 26; j ++)
                {
                    if (str[i] == letter[j])
                    {
                        book[j] ++;
                    }
                }
            }
        }

        for (i = 0; i < 26; i ++)
        {
            if (book[i] != 0)
            {
                printf("%c=%d\n", letter[i], book[i]);
            }
        }
    }

    return 0;
}

5.

程序改错-3
从键盘任意输入两个符号各异的整数,直到输入的两个整数满足要求为止,然后打印这两个数。请通过测试找出下面这个程序存在的问题(不止一个问题哦),并改正。同时用下面给出的运行结果示例检查修改后的程序。

#include <stdio.h>

int main()

{

    int x1, x2;

    do

    {

        printf("Input x1, x2:");

        scanf("%d,%d", &x1, &x2);

    }

    while (x1 * x2 > 0);

    printf("x1=%d,x2=%d\n", x1, x2);

    return 0;

}

程序正确的运行结果示例:
Input x1, x2:
a,s↙
Input x1, x2:
a,1↙
Input x1, x2:
2,s↙
Input x1, x2:
1,2↙
Input x1, x2:
-1,-2↙
Input x1, x2:
0,3↙
Input x1, x2:
1.2,3.4↙
Input x1, x2:
1.2,5↙
Input x1, x2:
-1,3↙
x1=-1,x2=3

输入格式: "%d,%d"
输入提示信息:"Input x1, x2:\n"
输出格式:"x1=%d,x2=%d\n"
#include <stdio.h>
 
int main (void)
{
    int x1, x2;
    int flag = 0;
 
    do
    {
        printf("Input x1, x2:\n");
        
        flag = scanf("%d,%d", &x1, &x2);
 
        while (getchar() != '\n');
    }
    while((flag != 2) || (x1 * x2 >= 0 ));
 
    printf("x1=%d,x2=%d\n",x1,x2);
 
    return 0;
}

6.

写一个程序显示如下的金字塔树:
           
   *
  ***
   *
  ***
 *****
   *
  ***
 *****
*******
   |
===V===

树的特点是由一系列逐渐增加的层构成。上面显示的树有3层,最后一行的=数量分别左右各3个。例如,两层时显示下面的结果:
  *
 ***
  *
 ***
*****
  |
==V==
要求程序从键盘输入层数(最后一行的=数量随着树的层数增加)。

**输入格式要求:"%d" 提示信息:"请输入树的层数:"
#include <stdio.h>

void LeafPrint (int row, int n);
void TailPrint (int row);

int main (void)
{
    int n;
    printf ("请输入树的层数:");
    scanf ("%d", &n);
    
    int row = 2;
    
    while (row <= n + 1)
    {
        LeafPrint (row, n);
        
        row ++;
    }

    if (n == 1)
    {
        LeafPrint (2, 2);
    }
    
    TailPrint (n);
    
    return 0;
}

void 
LeafPrint (int row, int n)
{
    int i, j, k, x;
    
    for (i = 1; i <= row; i ++)
    {   
        // 前空格
        for (x = 0; x < n - row + 1; x ++)
        {
            printf (" ");
        }

        for (j = 1; j <= row - i; j ++)
        {
            printf(" ");        
            
        } 
        
        for (k = 1; k <= 2 * i - 1; k ++)
        {   
            printf("*");
        }
        
        printf("\n");          
    }
}

void 
TailPrint (int row)
{
    int i;
    for (i = 0; i < row; i ++)
    {
        printf (" ");
    }
    
    printf ("|\n");
    
    for (i = 0; i < 2 * row + 1; i ++)
    {
        if (i == row)
        {
            printf ("V");
        }
        else
        {
            printf ("=");
        }
    }
}

7.

猴子吃桃程序_扩展2
猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。同时还要增加对用户输入数据的合法性验证(如:不允许输入的天数是0和负数)

程序运行结果示例:
Input days:
0↙
Input days:
-5↙
Input days:
a↙
Input days:
3↙
x=10

输入格式:"%d"
输出格式:
输入提示信息:"Input days:\n"
输出:"x=%d\n"
#include<stdio.h>

int peachSum (int day);

int main (void)
{
	int day;
    int flag;

    do
    {
        printf ("Input days:\n");
        
        flag = scanf ("%d", &day);

        while (getchar () != '\n');
    }
    while (day <= 0 || flag != 1);

	printf ("x=%d\n", peachSum (day));

	return 0;
}

int
peachSum (int day)
{
	if (day == 1)
	{
		return 1;
	}
	else
	{
		return (peachSum (day - 1) + 1) * 2;
	}
}

8.

计算1-1/2+1/3-1/4+...+1/99-1/100+...,直到最后一项的绝对值小于1e-4为止。
**输出格式要求:"sum = %f\n"
#include <stdio.h>

#define EPS 1.0e-4

int main (void)
{
    double sum = 0.0;
    int sign = -1;
    double part = 0;
    int i = 1;
    
    do
    {
        part = 1.0 / i;
        sign = -sign;
        
        sum += part * sign;
        
        i ++;
    }
    while (part > EPS);
    
    printf ("sum = %f\n", sum);
    
    return 0;
}

9.

*对输入的行和字符进行计数。在计算机中,一行是以一个回车符\n作为行结束标记的,这样在程序中可以通过搜索\n对行进行计数。在UNIX操作系统中,一般有ctrl+d作为文件结束标记,其字符码为-1.当输入ctrl+d时表示文件输入结束,停止计数。在C语言中,以EOF(End Of File)作为文件结束标志
**输出格式要求:"chars=%d, lines=%d\n"
#include <stdio.h>

int main (void)
{
    int lines = 0;
    int chars = 0;
    char ch;
    
    while ((ch = getchar ()) != EOF)
    {
        chars ++;
        
        if (ch == '\n')
        {
            lines ++;
        }
    }
    
    printf ("chars=%d, lines=%d\n", chars, lines);
    
    return 0;
}

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值