7-40 稳赢,输入上的问题

7-40 稳赢
分数 15
作者 陈越
单位 浙江大学
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。

输入格式:
输入首先在第一行给出正整数K(≤10),即平局间隔的次数。随后每行给出对方的一次出招:ChuiZi代表“锤子”、JianDao代表“剪刀”、Bu代表“布”。End代表输入结束,这一行不要作为出招处理。

输出格式:
对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。

输入样例:
2
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
End
输出样例:
Bu
ChuiZi
Bu
ChuiZi
JianDao
ChuiZi
Bu


#include<stdio.h>
#include<string.h>
int main(){
    int n;
    scanf("%d",&n);
    char s[1000];
    int count=0;
    while(1){
        scanf("%s",&s);
        if(strcmp(s,"End")==0)//一定要放到最上面,不能放到下面
            break;
        if(count==n){
            puts(s);
            count=0;
            continue;
        }
        if(strcmp(s,"ChuiZi")==0)
            printf("Bu\n");
        else if(strcmp(s,"JianDao")==0)
            printf("ChuiZi\n");
        else if(strcmp(s,"Bu")==0)
            printf("JianDao\n");
        count++;
    }
} 

代码是会写,不懂它的输入是怎么一回事

img


像这个,输入了chuizi不应该返回个bu吗,但是什么也没返回,输入End就直接结束了

if(strcmp(s,"ChuiZi") 这里 C Z 是大写的,而输入的时候 chuizi 都是小写的。后面的JianDao Bu 都是第一个字母是大写的,输入时要注意。

大小写问题

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7488236
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 这里需要对堆有一定的了解,堆就是一个比较特殊的完全二叉树,在最大堆里,每个节点的值都大于其左右两个孩子节点的值。这就是最大堆。反之就是最小堆。拿最大堆举例子,每次堆顶的元素值,不就是当前数列的最大吗?这不就成选择排序里的简单排序了吗?找完之后,将他和完全二叉树里最后一个结点的值进行交换,然后做一个自顶向下的自我调整,将他再次调整成一个完全二叉堆。第二次取最大的树,这时我们需要将上一次找到的结点屏蔽掉,不然会陷入一个死循环。无数次找完之后,再按层序的思想将二叉树里的数据遍历到一个数组当中,这时的数组为一个有序的数组。 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答

    1. 这段代码的功能是什么?能否解释一下它是如何工作的?

    这段代码是一个游戏程序,根据输入的字符串进行游戏操作并输出相应的字符串。具体来说,它是一个猜拳游戏,玩家输入一串字符串,程序根据输入的字符串进行判断并产生相应的输出。游戏规则如下:

    • 程序会首先通过 scanf 函数获取一个整数 n,表示每次输入一组字符串之后,需要连续输出多少次。
    • 然后循环获取字符串 s 的输入,直到输入的字符串为 "End"。
    • 在每一次循环中:
      • 如果计数器 count 已经达到了 n,则直接输出当前输入的字符串 s
      • 否则,程序会根据 s 的值进行判断并输出相应的字符串:
      • 如果 s 等于 "ChuiZi",则程序输出 "Bu"。
      • 如果 s 等于 "JianDao",则程序输出 "ChuiZi"。
      • 如果 s 等于 "Bu",则程序输出 "JianDao"。
      • 然后计数器 count 增加1。
    • 循环结束后,程序退出。

    在这个游戏中,每轮输入一个字符串后,程序会根据字符串的值输出一个对应的字符串。如果某次输入的字符串为 "End",则程序会结束游戏。每次输入的字符串,如果计数器 count 属于索引 n 的倍数,那么输入的字符串将会被直接输出,否则根据规则进行猜拳操作并输出结果。

    1. 为什么我输入 "chuizi" 没有得到 "bu" 的输出?而是直接输入 "End" 就结束了。

    这是因为在代码中判断字符串的时候,使用的是 strcmp 函数,它是区分大小写的,而你输入的是 "chuizi",而正确的比较应该是 "ChuiZi",这导致程序无法匹配到相应的输出语句,所以直接结束了。你需要确保输入的字符串大小写与代码中的规则完全匹配。将 "chuizi" 改为 "ChuiZi" 即可获得正确的输出。

    以下是修正后的代码,已经解决了问题:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        int n;
        scanf("%d", &n);
        char s[1000];
        int count = 0;
        while(1) {
            scanf("%s", s);
            if(strcmp(s, "End") == 0)
                break;
            if(count == n) {
                puts(s);
                count = 0;
                continue;
            }
            if(strcmp(s, "ChuiZi") == 0)
                printf("Bu\n");
            else if(strcmp(s, "JianDao") == 0)
                printf("ChuiZi\n");
            else if(strcmp(s, "Bu") == 0)
                printf("JianDao\n");
            count++;
        }
    } 
    

    代码优化建议: - 在使用 scanf 函数获取字符串输入时,不需要使用 & 运算符,因为字符串是一个字符数组,它自己就是一个指针,已经足够传递给 scanf 函数。 - 对于字符串的比较,可以考虑使用 switch 语句或者使用 if-else if-else 语句的嵌套,可以提高代码的可读性和可维护性。例如:

    if (strcmp(s, "ChuiZi") == 0) {
        printf("Bu\n");
    } else if (strcmp(s, "JianDao") == 0) {
        printf("ChuiZi\n");
    } else if (strcmp(s, "Bu") == 0) {
        printf("JianDao\n");
    }
    

    这样可以使代码更加简洁明了,易于理解和修改。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^