效率源于方法之一例
来源:互联网 发布:淘宝上的gsx查询可信吗 编辑:程序博客网 时间:2024/06/05 17:34
题目:
Modify the guessing program of Listing 8.4 so that it uses a more intelligent guessing strategy. For example, have the program initially guess 50, and have it ask the user whether the guess is high, low, or correct. If, say, the guess is low, have the next guess be halfway between 50 and 100, that is, 75. If that guess is high, let the next guess be halfway between 75 and 50, and so on. Using thisbinary search strategy, the program quickly zeros in on the correct answer, at least if the user does not cheat.
Listing 8.4
/* guess.c -- an inefficient and faulty number-guesser */#include <stdio.h>int main(void){ int guess = 1; printf("Pick an integer from 1 to 100. I will try to guess "); printf("it.\nRespond with a y if my guess is right and with"); printf("\nan n if it is wrong.\n"); printf("Uh...is your number %d?\n", guess); while (getchar() != 'y') /* get response, compare to y */ printf("Well, then, is it %d?\n", ++guess); printf("I knew I could do it!\n"); return 0;}
Code 1:
/* ex5, chptr8*/#include <stdio.h>#include <stdbool.h>#define PRNT "\nI guess right!"#define GUESS "I guess it's %d. Yes ('y') or No ('n')? "#define THEN "Then is it %d? "#define EXCEED "\nGuess exceeds %d!"#define FALL "\nGuess falls under %d!"char getinput(void);void providechoice(int mid);bool guessright(char equal);void guesswork(int guess, int limit, bool direction);int main(void){ char choice; bool dir = true; printf("\nPick a number between %d and %d and I'll try to guess it.",1, 100); providechoice(50); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') { providechoice(75); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') { providechoice(87); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') { providechoice(93); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(94, 100, dir); else guesswork(92, 88, !dir); } else { providechoice(81); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(82, 86, dir); else guesswork(80, 76, !dir); } } else { providechoice(62); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') { providechoice(68); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(69, 74, dir); else guesswork(67, 63, !dir); } else { providechoice(56); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(57, 61, dir); else guesswork(55, 51, !dir); } } } else { providechoice(25); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') { providechoice(37); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') { providechoice(43); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(44, 49, dir); else guesswork(42, 38, !dir); } else { providechoice(31); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(32, 36, dir); else guesswork(30, 26, !dir); } } else { providechoice(12); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') { providechoice(18); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(19, 24, dir); else guesswork(17, 13, !dir); } else { providechoice(6); choice = getinput(); if(guessright(choice)) puts(PRNT); else if(choice == 'h') guesswork(7, 11, dir); else guesswork(5, 1, !dir); } } }}void providechoice(int mid){ printf("\nIs the number is equal ('e') to %d or is lower ('l') or higher ('h') than that?\n", mid);}char getinput(void){ char ch; while((ch = getchar()) == '\n') continue; while(ch != 'e' && ch != 'h' && ch != 'l') { printf("%c is invalid input. Input again: ", ch); ch = getchar(); } return ch;}bool guessright(char ch){ bool rightornot = true; return (ch == 'e')? rightornot : !rightornot;}void guesswork(int guess, int limit, bool direction){ char yn; printf(GUESS, guess); if(direction) { while((yn = getchar()) == '\n') continue; while(yn != 'y' && guess < limit) { getchar(); printf(THEN, ++guess); yn = getchar(); } if(guess <= limit) puts(PRNT); else printf(EXCEED, limit); } else { while((yn = getchar()) == '\n') continue; while(yn != 'y'&& guess >= limit) { getchar(); printf(THEN, --guess); yn = getchar(); } if(guess >= limit) puts(PRNT); else printf(FALL, limit); }}
Code 2:
/* Programming Exercise 8-5*//* binaryguess.c -- an improved number-guesser */#include <stdio.h>#include <ctype.h>int main(void){ int high = 100; int low = 1; int guess = (high + low)/2; char response; printf("Pick an integer from 1 to 100. I will try to guess it.\n"); printf("Respond with a 'y' if my guess is right, with an 'h' if it is high, and with an 'l' if it is low.\n"); printf("Uh...is your number %d?\n", guess); while((response = getchar()) != 'y') /* get response */ { if(response == '\n') continue; if(response != 'h' && response != 'l') { printf("I don't understand that response. Please enter 'h' for high, 'l' for low, or 'y' for correct.\n"); continue; } if(response == 'h') high = guess - 1; else if(response == 'l') low = guess + 1; guess = (high + low)/2; printf("Well, then, is it %d?\n", guess); } printf("I knew I could do it!\n"); return 0;}
这两个代码在精神上孰优孰劣就立即显现了,不用多说。
- 效率源于方法之一例
- 创新源于模仿之一:TabActivity的美化
- 创新源于模仿之一:TabActivity的美化
- 创新源于模仿之一:TabActivity的美化
- 创新源于模仿之一:TabActivity的美化
- 源于生活的设计之一:职责问题
- 创新源于模仿之一:TabActivity的美化
- Android与服务器通信的方法之一(TCP)效率高安全性完善
- Android与服务器通信的方法之一(TCP)效率高安全性完善
- Android与服务器通信的方法之一(json)效率不高安全性不好
- Android与服务器通信的方法之一(TCP)效率高安全性完善
- Android与服务器通信的方法之一(TCP)效率高安全性完善
- Android与服务器通信的方法之一(TCP)效率高安全性完善
- Windows7激活信息备份方法 源于Vista的方法
- 一种异步加载资源的方法(源于SDK文档)
- CSDN博客转载方法--【本博客源于转载他人】
- 二次提交的避免方法(源于互联网)=>个人总结
- 代码效率测试方法
- 作为脚本语言的Python(Python Preview)
- 形态学图像处理
- hadoop参数说明
- 查询栏页面代码
- android 数据库 CURD
- 效率源于方法之一例
- 关于VC工程的RC文件
- 在Windows下配置MinGW编译环境和Code::Blocks编辑器
- 国外网络开放课程遍地开花
- 大话存储系列3——磁盘原理
- Incorrect Ownership and Permission after Relinking or Patching 11gR2 Grid Infrastructure [ID 1083982
- java 实现jms的客户端(发送接收消息)
- 如何用VBA读取UTF编码的文本文件?
- POCO C++库学习和分析 -- 数据类型转换