码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-12-08 15:44:52      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:for   lock   efi   while   不同   else   color   多少   scanf   

练习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;
}

 

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

标签:for   lock   efi   while   不同   else   color   多少   scanf   

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

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!