明解C语言中级篇练习代码------第四章

博主在假期期间遇到C语言第四章的难题,尤其是4-6题,感到非常困难。文中列举了从练习4-1到4-7的所有题目,表达了对于这些高难度习题的挑战和困扰。
摘要由CSDN通过智能技术生成

一放假真的就看不进书了害
而且这章习题真的好难!超级无敌巨难!!!
4-6想了好久还是没想出来 哭哭( •̥́ ˍ •̀ू )

练习4-1

//编写一个限制玩家可以输入次数的“珠玑妙算”程序。

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

void make4digit (int x[])
{
   
    int i, j, val;

    for (i=0; i<4; i++) {
   
        do {
   
            val = rand()%10;
            for (j=0; j<i; j++)
                if (val == x[j])
                    break;
        } while (j<i);
        x[i] = val;
    }
}

int check (const char s[])
{
   
    int i, j;

    if (strlen(s) != 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;
}

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)++;
                else
                    (*blow)++;
        }
    }
}

void printf_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,blow;
	int no[4];
	char buff[10];
	clock_t start,end;
	int times = 10;                            //限制次数

	srand( time(NULL) );

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

	make4digit(no);

	start = clock();

	do {
   
        if (times == 0) {
   
            printf("□GAME OVER!\n");
            break;
        }

        printf("□你只有%d次机会了噢~\n\n",times);

        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++;
        times--;
        judge(buff, no, &hit, &blow);
        printf_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-2

//给“珠玑妙算”添加提示功能。

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

int no[4];                //把目标数字变为全局变量,因为在不同函数中都有用到
int hint = 4;             //最多提示次数
int hint_bit = 1;         //提示的位数
int hint1 = -1;
int hint2 = -1;

void make4digit (int x[])
{
   
    int i, j, val;

    for (i=0; i<4; i++) {
   
        do {
   
            val = rand()%10;
            for (j=0; j<i; j++)
                if (val == x[j])
                    break;
        } while (j<i);
        x[i] = val;
    }
/*
    for (i=0; i<4; i++)            检查答案
        printf("%d ",x[i]);
    puts("\n");
*/
}

int check (const char s[])
{
   
    int i, j;

    if (strlen(s) != 4)
        return 1;

    for (i=0; i<4; i++) {
   
        if (!isdigit(s[i]))
            return 2;
        for (j=0; j<i; j
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值