明解C语言 中级篇 第四章答案

练习4-1

/* 珠玑妙算 */

#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--- 生成4个不同数字的组合并存入数组x ---*/
void make4digits(int x[])
{
    int i, j, val;

    for (i = 0; i < 4; i++) {
        do {
            val = rand() % 10;            /* 0~9的随机数 */
            for (j = 0; j < i; j++)        /* 是否已获得此数值 */
                if (val == x[j])
                    break;
        } while (j < i);        /* 循环直至获得不重复的数值 */
        x[i] = val;
    }
}

/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
    int i, j;

    if (strlen(s) != 4)            /* 字符串长度不为4 */
        return 1;

    for (i = 0; i < 4; i++) {
        if (!isdigit(s[i]))
            return 2;            /* 包含了除数字以外的字符 */
        for (j = 0; j < i; j++)
            if (s[i] == s[j])
                return 3;        /* 含有相同数字 */
    }
    return 0;                    /* 字符串有效 */
}

/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int* hit, int* blow)
{
    int i, j;

    *hit = *blow = 0;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            if (s[i] == ‘0‘ + no[j])    /* 数字一致 */
                if (i == j)
                    (*hit)++;            /* hit(位置也一致)*/
                else
                    (*blow)++;            /* blow(位置不一致)*/
        }
    }
}

/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
    if (spos == 4)
        printf("回答正确!!");
    else if (snum == 0)
        printf("    这些数字里没有答案数字。\n");
    else {
        printf("    这些数字里包括%d个答案数字。\n", snum);

        if (spos == 0)
            printf("    但是数字的位置都不一致。\n");
        else
            printf("    其中有%d个数字的位置是一致的。\n", spos);
    }
    putchar(‘\n‘);
}

int main(void)
{
    int try_no = 0;        /* 输入次数 */
    int chk;            /* 已输入的字符串的检查结果 */
    int hit;            /* 位置和数字都正确的数字个数 */
    int blow;            /* 数字正确但位置不正确的数字个数 */
    int no[4];            /* 要猜的数字串 */
    char buff[10];        /* 用于存放读取的数字串的字符串 */
    clock_t    start, end;                /* 开始时间/结束时间 */
    int cnt;
    srand(time(NULL));                /* 设定随机数种子 */

    puts("■ 来玩珠玑妙算吧。");
    puts("■ 请猜4个数字。");
    puts("■ 其中不包含相同数字。");
    puts("■ 请像4307这样连续输入数字。");
    puts("■ 不能输入空格字符。\n");

    make4digits(no);                    /* 生成4个数字各不相同的数字串 */
    printf("请输入限定次数:");
    scanf("%d", &cnt);
    start = clock();                    /* 开始计算 */

    do {
        do {
            printf("请输入:");
            scanf("%s", buff);            /* 读取为字符串 */

            chk = check(buff);            /* 检查读取到的字符串 */

            switch (chk) {
            case 1: puts("\a请确保输入4个字符。"); break;
            case 2: puts("\a请不要输入除了数字以外的字符。"); break;
            case 3: puts("\a请不要输入相同的数字。"); break;
            }
        } while (chk != 0);

        try_no++;
        judge(buff, no, &hit, &blow);    /* 判断 */
        print_result(hit + blow, hit);    /* 显示判断结果 */

    } while (hit < 4&&try_no<cnt);

    end = clock();                        /* 计算结束 */
    if(try_no==cnt)
    {
        printf("次数已经耗尽,游戏结束");
    }
    printf("用了%d次。\n用时%.1f秒。\n",
        try_no, (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}

练习4-2

/* 珠玑妙算 */

#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--- 生成4个不同数字的组合并存入数组x ---*/
void make4digits(int x[])
{
    int i, j, val;

    for (i = 0; i < 4; i++) {
        do {
            val = rand() % 10;            /* 0~9的随机数 */
            for (j = 0; j < i; j++)        /* 是否已获得此数值 */
                if (val == x[j])
                    break;
        } while (j < i);        /* 循环直至获得不重复的数值 */
        x[i] = val;
    }
}

/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
    int i, j;

    if (strlen(s) != 4)            /* 字符串长度不为4 */
        return 1;

    for (i = 0; i < 4; i++) {
        if (!isdigit(s[i]))
            return 2;            /* 包含了除数字以外的字符 */
        for (j = 0; j < i; j++)
            if (s[i] == s[j])
                return 3;        /* 含有相同数字 */
    }
    return 0;                    /* 字符串有效 */
}

/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int* hit, int* blow)
{
    int i, j;

    *hit = *blow = 0;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            if (s[i] == ‘0‘ + no[j])    /* 数字一致 */
                if (i == j)
                    (*hit)++;            /* hit(位置也一致)*/
                else
                    (*blow)++;            /* blow(位置不一致)*/
        }
    }
}

/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
    if (spos == 4)
        printf("回答正确!!");
    else if (snum == 0)
        printf("    这些数字里没有答案数字。\n");
    else {
        printf("    这些数字里包括%d个答案数字。\n", snum);

        if (spos == 0)
            printf("    但是数字的位置都不一致。\n");
        else
            printf("    其中有%d个数字的位置是一致的。\n", spos);
    }
    putchar(‘\n‘);
}

int main(void)
{
    int try_no = 0;        /* 输入次数 */
    int chk;            /* 已输入的字符串的检查结果 */
    int hit;            /* 位置和数字都正确的数字个数 */
    int blow;            /* 数字正确但位置不正确的数字个数 */
    int no[4];            /* 要猜的数字串 */
    char buff[10];        /* 用于存放读取的数字串的字符串 */
    int tips;
    int tem, i, j;
    int cnt = 0;
    int m;
    int p = 0;
    clock_t    start, end;                /* 开始时间/结束时间 */
    srand(time(NULL));                /* 设定随机数种子 */

    puts("■ 来玩珠玑妙算吧。");
    puts("■ 请猜4个数字。");
    puts("■ 其中不包含相同数字。");
    puts("■ 请像4307这样连续输入数字。");
    puts("■ 不能输入空格字符。\n");
    printf("限定提示次数:");
    scanf("%d", &m);
    make4digits(no);                    /* 生成4个数字各不相同的数字串 */
    start = clock();                    /* 开始计算 */

    do {
        do {
            printf("请输入:");
            scanf("%s", buff);            /* 读取为字符串 */

            chk = check(buff);            /* 检查读取到的字符串 */

            switch (chk) {
            case 1: puts("\a请确保输入4个字符。"); break;
            case 2: puts("\a请不要输入除了数字以外的字符。"); break;
            case 3: puts("\a请不要输入相同的数字。"); break;
            }
        } while (chk != 0);

        try_no++;
        judge(buff, no, &hit, &blow);    /* 判断 */
        print_result(hit + blow, hit);    /* 显示判断结果 */
        if (hit != 4&&(try_no%3==0)&&(p!=m)) {

            puts("需要提示吗?需要----1 不需要----0");
            scanf("%d", &tem);
            if (tem == 1) {
                printf("请选择提示类型:1.提示hit数字中最前面的字符。2提示blow的数字中最末尾的1个字符");
                scanf("%d", &tips);
                if (tips == 1)
                {
                    for (i = 0; i < 4; i++) {
                        if ((buff[i] - ‘0‘) == no[i]) {
                            printf("hit第一位是%d\n", no[i]);
                            p++;
                            break;
                        }
                    }

                    }if (tips == 2) {
                    cnt = 0;
                    for (i = 3; i >= 0; i--) {
                        for (j = 3; j >= 0; j--) {
                            if ((buff[j] - ‘0‘) == no[i]) {
                                if (i != j) {
                                    printf("blow的最后一位是%d\n", (buff[j] - ‘0‘));
                                    p++;
                                    cnt++;
                                }
                            }
                        }
                        if (cnt != 0)
                            break;
                    }

                }

            }
        }
    } while (hit < 4);

    end = clock();                        /* 计算结束 */
    printf("用了%d次。\n用时%.1f秒。\n",
        try_no, (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}

练习4-3

/* 珠玑妙算 */

#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--- 生成num个不同数字的组合并存入数组x ---*/
void make4digits(int x[],int num)
{
    int i, j, val;

    for (i = 0; i < num; i++) {
        do {
            val = rand() % 10;            /* 0~9的随机数 */
            for (j = 0; j < i; j++)        /* 是否已获得此数值 */
                if (val == x[j])
                    break;
        } while (j < i);        /* 循环直至获得不重复的数值 */
        x[i] = val;
    }
}

/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[],int num)
{
    int i, j;

    if (strlen(s) != num)            /* 字符串长度不为num */
        return 1;

    for (i = 0; i < num; i++) {
        if (!isdigit(s[i]))
            return 2;            /* 包含了除数字以外的字符 */
        for (j = 0; j < i; j++)
            if (s[i] == s[j])
                return 3;        /* 含有相同数字 */
    }
    return 0;                    /* 字符串有效 */
}

/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int* hit, int* blow, int num)
{
    int i, j;

    *hit = *blow = 0;
    for (i = 0; i <num ; i++) {
        for (j = 0; j < num; j++) {
            if (s[i] == ‘0‘ + no[j])    /* 数字一致 */
                if (i == j)
                    (*hit)++;            /* hit(位置也一致)*/
                else
                    (*blow)++;            /* blow(位置不一致)*/
        }
    }
}

/*--- 显示判断结果 ---*/
void print_result(int snum, int spos,int num)
{
    if (spos == num)
        printf("回答正确!!");
    else if (snum == 0)
        printf("    这些数字里没有答案数字。\n");
    else {
        printf("    这些数字里包括%d个答案数字。\n", snum);

        if (spos == 0)
            printf("    但是数字的位置都不一致。\n");
        else
            printf("    其中有%d个数字的位置是一致的。\n", spos);
    }
    putchar(‘\n‘);
}

int main(void)
{
    int try_no = 0;        /* 输入次数 */
    int chk;            /* 已输入的字符串的检查结果 */
    int hit;            /* 位置和数字都正确的数字个数 */
    int blow;            /* 数字正确但位置不正确的数字个数 */
    static int num;
    int no[128];        /* 要猜的数字串 */
    char buff[10];        /* 用于存放读取的数字串的字符串 */
    clock_t    start, end;                /* 开始时间/结束时间 */

    srand(time(NULL));                /* 设定随机数种子 */

    puts("■ 来玩珠玑妙算吧。");
    puts("■ 其中不包含相同数字。");
    puts("■ 请像4307这样连续输入数字。");
    puts("■ 不能输入空格字符。\n");
    printf("请设置珠玑妙算的位数:");
    scanf("%d", &num);

    make4digits(no,num);                    /* 生成4个数字各不相同的数字串 */

    start = clock();                    /* 开始计算 */

    do {
        do {
            printf("请输入:");
            scanf("%s", buff);            /* 读取为字符串 */

            chk = check(buff,num);            /* 检查读取到的字符串 */

            switch (chk) {
            case 1: puts("\a请确保输入个字符。"); break;
            case 2: puts("\a请不要输入除了数字以外的字符。"); break;
            case 3: puts("\a请不要输入相同的数字。"); break;
            }
        } while (chk != 0);

        try_no++;
        judge(buff, no, &hit, &blow,num);    /* 判断 */
        print_result(hit + blow, hit,num);    /* 显示判断结果 */

    } while (hit < num);

    end = clock();                        /* 计算结束 */

    printf("用了%d次。\n用时%.1f秒。\n",
        try_no, (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}

练习4-4

/* 珠玑妙算 */

#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--- 生成4个不同数字的组合并存入数组x ---*/
void make4digits(int x[])
{
    int i, j, val;

    for (i = 0; i < 4; i++) {
            val = rand() % 10;            /* 0~9的随机数 */
            x[i] = val;
    }
}

/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
    int i, j;

    if (strlen(s) != 4)            /* 字符串长度不为4 */
        return 1;

    for (i = 0; i < 4; i++) {
        if (!isdigit(s[i]))
            return 2;            /* 包含了除数字以外的字符 */
    }
    return 0;                    /* 字符串有效 */
}

/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int* hit, int* blow)
{
    int i, j;

    *hit = *blow = 0;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            if (s[i] == ‘0‘ + no[j])    /* 数字一致 */
                if (i == j)
                    (*hit)++;            /* hit(位置也一致)*/
                else
                    (*blow)++;            /* blow(位置不一致)*/
        }
    }
}

/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
    if (spos == 4)
        printf("回答正确!!");
    else if (snum == 0)
        printf("    这些数字里没有答案数字。\n");
    else {
        printf("    这些数字里包括%d个答案数字。\n", snum);

        if (spos == 0)
            printf("    但是数字的位置都不一致。\n");
        else
            printf("    其中有%d个数字的位置是一致的。\n", spos);
    }
    putchar(‘\n‘);
}

int main(void)
{
    int try_no = 0;        /* 输入次数 */
    int chk;            /* 已输入的字符串的检查结果 */
    int hit;            /* 位置和数字都正确的数字个数 */
    int blow;            /* 数字正确但位置不正确的数字个数 */
    int no[4];            /* 要猜的数字串 */
    char buff[10];        /* 用于存放读取的数字串的字符串 */
    clock_t    start, end;                /* 开始时间/结束时间 */
    int i;
    srand(time(NULL));                /* 设定随机数种子 */

    puts("■ 来玩珠玑妙算吧。");
    puts("■ 请猜4个数字。");
    puts("■ 请像4307这样连续输入数字。");
    puts("■ 不能输入空格字符。\n");

    make4digits(no);                    /* 生成4个数字各不相同的数字串 */
    for (i = 0; i < 4; i++) {
        printf("%d", no[i]);
    }
    start = clock();                    /* 开始计算 */

    do {
        do {
            printf("请输入:");
            scanf("%s", buff);            /* 读取为字符串 */

            chk = check(buff);            /* 检查读取到的字符串 */

            switch (chk) {
            case 1: puts("\a请确保输入4个字符。"); break;
            case 2: puts("\a请不要输入除了数字以外的字符。"); break;
            }
        } while (chk != 0);     

        try_no++;
        judge(buff, no, &hit, &blow);    /* 判断 */
        print_result(hit + blow, hit);    /* 显示判断结果 */

    } while (hit < 4);

    end = clock();                        /* 计算结束 */

    printf("用了%d次。\n用时%.1f秒。\n",
        try_no, (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}

练习4-5

想不出来可以直接输入汉字的办法,所以一般来说就将数字赋予不同的数字,然后生成0~7的随机数来猜吧

练习4-7

想不出来

练习4-8

/* 猜数游戏(其五:显示输入记录)*/

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_STAGE    10        /* 最多可以输入的次数 */
void make4digits(int x[])
{
    int i, j, val;

    for (i = 0; i < 3; i++) {
        do {
            val = rand() % 10;            /* 0~9的随机数 */
            for (j = 0; j < i; j++)        /* 是否已获得此数值 */
                if (val == x[j])
                    break;
        } while (j < i);        /* 循环直至获得不重复的数值 */
        x[i] = val;
    }
}
int main(void)
{
    int i;
    int stage;                /* 已输入的次数 */
    int no;                    /* 读取的值 */
    int ans[3];                /* 目标数字 */
    int num[MAX_STAGE];        /* 读取的值的历史记录 */
    srand(time(NULL));        /* 设定随机数的种子 */
    make4digits(ans);
    int x;
    x = ans[0] + ans[1] * 10 + ans[2] *100;

    printf("请猜一个0~999的整数。\n\n");
    printf("%d", x);
    stage = 0;
    do {
        printf("还剩%d次机会。是多少呢:", MAX_STAGE - stage);
        scanf("%d", &no);
        num[stage++] = no;            /* 把读取的值存入数组 */

        if (no > x)
            printf("\a再小一点。\n");
        else if (no < x)
            printf("\a再大一点。\n");
    } while (no != x && stage < MAX_STAGE);

    if (no != x)
        printf("\a很遗憾,正确答案是%d。\n", x);
    else {
        printf("回答正确。\n");
        printf("您用了%d次猜中了。\n", stage);
    }

    puts("\n--- 输入记录 ---");
    for (i = 0; i < stage; i++)
        printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - x);

    return 0;
}

原文地址:https://www.cnblogs.com/nightswatch-candle/p/11995601.html

时间: 2024-07-29 01:48:50

明解C语言 中级篇 第四章答案的相关文章

明解C语言 中级篇 第三章答案

练习3-1 /* 猜拳游戏(其四:分割函数/显示成绩)*/ #include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char* hd[] = { "石头", &q

明解C语言 入门篇 第七章答案

练习7-1 #include <stdio.h> int main() { int n; printf("%d\t%d\t%d\n", sizeof 1,sizeof(unsigned)-1,sizeof n+2 ); //此行显示结果为 4 3 6 因为1的字节就是为4,而-1的字节也是4再减去-1所以显示为3,最后是n+2为6 printf("%d\t%d\t%d\n", sizeof +1, sizeof(double) - 1, sizeof(n

明解C语言 中级篇 第一章答案

练习1-1 #include <stdio.h> #include<stdlib.h> int main() { srand(time(0)); int anw = rand() % 7; printf("您的签运是:"); switch (anw) { case 0:printf("大吉"); break; case 1:printf("吉"); break; case 2:printf("小吉");

明解C语言 入门篇 第二章答案

练习2-1 1 #include <stdio.h> 2 3 int main() { 4 int x; 5 int y; 6 int percent; 7 8 puts("请输入两个整数"); 9 printf("整数x:"); 10 scanf("%d", &x); 11 printf("整数y:"); 12 scanf("%d", &y); 13 percent = (x

明解C语言 入门篇 第十二章答案

练习12-1 /* 用表示学生的结构体来显示高尾的信息 */ #include <stdio.h> #define NAME_LEN 64 /* 姓名的字符数 */ /*=== 表示学生的结构体 ===*/ struct student { char name[NAME_LEN]; /* 姓名 */ int height; /* 身高 */ float weight; /* 体重 */ long schols; /* 奖学金 */ }; int main(void) { struct stud

明解C语言,练习13-3,从文件中读入个人信息,按身高排序后显示

#include <stdio.h> #define NUMBER 6 #define F_PATH "D:\\C_C++\\ec13-3\\hw.dat" typedef struct { char name[20]; int height; float weight; } student; void swap(student *x,student *y) { student tmp = *x; *x = *y; *y = tmp; } void sort(student

明解C语言pdf

下载地址:网盘下载 <明解C语言>图文并茂,示例丰富,设有190段代码和164幅图表,对C语言的基础知识进行了彻底剖析,内容涉及数组.函数.指针.文件操作等.对于C语言语法以及一些难以理解的概念,均以精心绘制的示意图,清晰.通俗地进行讲解. 柴田望洋(Shibata Bouyou) 1963年出生,日本福冈工业大学信息工程学院副教授.在日本IT界家喻户晓,编写了一些列极富影响力的计算机教材和参考书,如<明解C++>.<明解Java>等,本书于2000年荣获日本工学教育协

Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service method) 4.4 String类型 String类型不是基本类型,而是引用类型(reference type).

Kotlin——从无到有系列之中级篇(四):面向对象的特征与类(class)继承详解

如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 在前面的章节中,详细的详解了类的使用,但是由于篇幅的限制,关于类的很多特性都没有讲解到.今天在这篇文章中,详细的讲解Kotlin中类的特性.如果您对Kotlin中的类还没有一个整体的了解的话,请参见我上一篇文章Kotlin--类(class)详解 众所周知,Kotlin是一门面向对象的开发语言.那么他也有面向对象语言