博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
alg : 3个量杯的问题3
阅读量:1992 次
发布时间:2019-04-27

本文共 11409 字,大约阅读时间需要 38 分钟。

前言

有3个量杯,容量分别是8,5,3.

水无限, 目标容器一个。
要求给定一个任意单位水数量,将水通过这3个量杯,输送到目标容器中.

实验

用C写个小程序来实现,在linux环境中, 将量杯操作打印出来。

在做这个实验时,收获了一个好用的打印宏,可以打印彩色文本.

运行效果

这里写图片描述

实现

// @file main.cpp#include 
#include
#include
#include "color_define.h"#define LINE10 "----------"#define LINE20 LINE10 LINE10#define LINE40 LINE20 LINE20#define LINE80 LINE40 LINE40// only have 3 cups to take water#define CUP_SIZE_8 8#define CUP_SIZE_5 5#define CUP_SIZE_3 3typedef int (*PFN_take_water)();int take_water_1_unit();int take_water_2_unit();int take_water_3_unit();int take_water_4_unit();int take_water_5_unit();int take_water_6_unit();int take_water_7_unit();int take_water_8_unit();void take_water(long l_water_to_take);PFN_take_water g_pfn_ary_get_water[] = { take_water_1_unit, take_water_2_unit, take_water_3_unit, take_water_4_unit, take_water_5_unit, take_water_6_unit, take_water_7_unit, take_water_8_unit};int main(int argc, char** argv){ char sz_buf[6 + 1] = {
'\0'}; long l_water_unit = 0; int rc = 0; do { system("clear"); PRINT_INFO("please input how much water will be take :"); rc = scanf("%6s", sz_buf); // rc is input element counter if (1 != rc) { PRINT_ERR("error : please input water unit counter\n"); break; } PRINT_INFO("input content = [%s]\n", sz_buf); l_water_unit = atol(sz_buf); PRINT_INFO("will be take [%ld] unit water\n", l_water_unit); if (l_water_unit <= 0) { PRINT_ERR("please input water unit counter > 0\n"); break; } PRINT_INFO("%s\n", LINE80); PRINT_INFO("take water begin ...\n"); PRINT_INFO("%s\n", LINE80); take_water(l_water_unit); PRINT_INFO("%s\n", LINE80); PRINT_INFO("take water end\n"); PRINT_INFO("%s\n", LINE80); } while (0); PRINT_INFO("THE END\n"); return EXIT_SUCCESS;}void take_water(long l_water_to_take){ int i_to_take = 0; long l_object_water_pool = 0; while (l_water_to_take > 0) { if (l_water_to_take > CUP_SIZE_8) { i_to_take = CUP_SIZE_8; l_water_to_take -= CUP_SIZE_8; } else { i_to_take = l_water_to_take; l_water_to_take = 0; } l_object_water_pool += g_pfn_ary_get_water[i_to_take - 1](); PRINT_WARN("object water pool = %ld, need take %ld\n", l_object_water_pool, l_water_to_take); } PRINT_WARN("ok : object water pool take over\n");}int take_water_1_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 1 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO("cup3 = 3;\n"); PRINT_INFO("cup3 => cup8;\n"); PRINT_INFO("cup8 = 3; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup3 = 3;\n"); PRINT_INFO("cup3 => cup8;\n"); PRINT_INFO("cup8 = 6; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup3 = 3;\n"); PRINT_INFO("cup3 => cup8;\n"); PRINT_INFO("cup8 = 8; cup5 = 0; cup3 = 1;\n"); PRINT_INFO(" \n"); PRINT_INFO("take cup3 to object water pool\n"); PRINT_INFO("\n"); return 1;}int take_water_2_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 2 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup5 = 5;\n"); PRINT_INFO("cup5 => cup3;\n"); PRINT_INFO("cup8 = 0; cup5 = 2; cup3 = 3;\n"); PRINT_INFO(" \n"); PRINT_INFO("take cup5 to object water pool\n"); PRINT_INFO("\n"); return 2;}int take_water_3_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 3 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup3 = 3;\n"); PRINT_INFO("take cup3 to object water pool\n"); PRINT_INFO("\n"); return 3;}int take_water_4_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 4 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup5 = 5;\n"); PRINT_INFO("cup5 => cup3;\n"); PRINT_INFO("cup5 => cup8;\n"); PRINT_INFO("cup8 = 2; cup5 = 0; cup3 = 3;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup3 = 0;\n"); PRINT_INFO("cup5 = 5;\n"); PRINT_INFO("cup5 => cup3;\n"); PRINT_INFO("cup5 => cup8;\n"); PRINT_INFO("cup8 = 4; cup5 = 0; cup3 = 3;\n"); PRINT_INFO(" \n"); PRINT_INFO("take cup8 to object water pool\n"); PRINT_INFO("\n"); return 4;}int take_water_5_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 5 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup5 = 5;\n"); PRINT_INFO("take cup5 to object water pool\n"); PRINT_INFO("\n"); return 5;}int take_water_6_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 6 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup3 = 3;\n"); PRINT_INFO("cup3 => cup8;\n"); PRINT_INFO("cup8 = 3; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup3 = 3;\n"); PRINT_INFO("cup3 => cup8;\n"); PRINT_INFO("cup8 = 6; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("take cup8 to object water pool\n"); PRINT_INFO("\n"); return 6;}int take_water_7_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 7 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup5 = 5;\n"); PRINT_INFO("cup5 => cup8;\n"); PRINT_INFO("cup8 = 5; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup5 = 5;\n"); PRINT_INFO("cup5 => cup3;\n"); PRINT_INFO("cup8 = 5; cup5 = 2; cup3 = 3;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup5 => cup8;\n"); PRINT_INFO("cup8 = 7; cup5 = 0; cup3 = 3;\n"); PRINT_INFO(" \n"); PRINT_INFO("take cup8 to object water pool\n"); PRINT_INFO("\n"); return 7;}int take_water_8_unit(){ PRINT_INFO("%s\n", LINE80); PRINT_WARN("get 8 unit water\n"); PRINT_INFO("%s\n", LINE80); PRINT_INFO("cup8 = 0; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("cup8 = 8;\n"); PRINT_INFO("cup8 = 8; cup5 = 0; cup3 = 0;\n"); PRINT_INFO(" \n"); PRINT_INFO("take cup8 to object water pool\n"); PRINT_INFO("\n"); return 8;}
// @file color_define.h// @brief define color and color function on linux/**         foreground backgroundblack        30         40red          31         41green        32         42yellow       33         43blue         34         44magenta      35         45cyan         36         46white        37         47*/#define COLOR_TYPE_BLACK "30" // 黑#define COLOR_TYPE_RED "31" // 浅蓝#define COLOR_TYPE_GREEN "32" // 亮蓝#define COLOR_TYPE_YELLOW "33" // 墨绿#define COLOR_TYPE_BLUE "34" // 粉红#define COLOR_TYPE_MAGENTA "35" // 红#define COLOR_TYPE_CYAN "36" // 白#define COLOR_TYPE_WHITE "37" // 黄// [1 is bold text#define COLOR_FONT_BOLD "1"// [0 is normal text#define COLOR_FONT_NORMAL "0"#define COLOR_BEGIN_BLACK_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_BLACK "m"#define COLOR_BEGIN_RED_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_RED "m"#define COLOR_BEGIN_GREEN_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_GREEN "m"#define COLOR_BEGIN_YELLOW_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_YELLOW "m"#define COLOR_BEGIN_BLUE_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_BLUE "m"#define COLOR_BEGIN_MAGENTA_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_MAGENTA "m"#define COLOR_BEGIN_CYAN_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_CYAN "m"#define COLOR_BEGIN_WHITE_BOLD "\033[" COLOR_FONT_BOLD ";" COLOR_TYPE_WHITE "m"#define COLOR_BEGIN_BLACK "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_BLACK "m"#define COLOR_BEGIN_RED "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_RED "m"#define COLOR_BEGIN_GREEN "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_GREEN "m"#define COLOR_BEGIN_YELLOW "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_YELLOW "m"#define COLOR_BEGIN_BLUE "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_BLUE "m"#define COLOR_BEGIN_MAGENTA "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_MAGENTA "m"#define COLOR_BEGIN_CYAN "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_CYAN "m"#define COLOR_BEGIN_WHITE "\033[" COLOR_FONT_NORMAL ";" COLOR_TYPE_WHITE "m"#define COLOR_END "\033[0m"// print black#define PRINT_BLACK(...) \{ \    printf(COLOR_BEGIN_BLACK); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print red#define PRINT_RED(...) \{ \    printf(COLOR_BEGIN_RED); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print green#define PRINT_GREEN(...) \{ \    printf(COLOR_BEGIN_GREEN); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print yellow#define PRINT_YELLOW(...) \{ \    printf(COLOR_BEGIN_YELLOW); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print blue#define PRINT_BLUE(...) \{ \    printf(COLOR_BEGIN_BLUE); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print magenta#define PRINT_MAGENTA(...) \{ \    printf(COLOR_BEGIN_MAGENTA); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print cyan#define PRINT_CYAN(...) \{ \    printf(COLOR_BEGIN_CYAN); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print white#define PRINT_WHITE(...) \{ \    printf(COLOR_BEGIN_WHITE); \    printf(__VA_ARGS__); \    printf(COLOR_END); \}// print information#define PRINT_INFO(...) \{ \    PRINT_GREEN(__VA_ARGS__); \}// print warning#define PRINT_WARN(...) \{ \    PRINT_YELLOW(__VA_ARGS__); \}// print error#define PRINT_ERR(...) \{ \    PRINT_RED(__VA_ARGS__); \}// print color text example// PRINT_INFO("%s\n", "print information");// PRINT_WARN("%s\n", "print warning");// PRINT_ERR("%s\n", "print error");// PRINT_BLACK("PRINT_BLACK\n"); // 黑// PRINT_BLUE("PRINT_BLUE\n"); // 浅蓝// PRINT_CYAN("PRINT_CYAN\n"); // 亮蓝// PRINT_GREEN("PRINT_GREEN\n"); // 墨绿// PRINT_MAGENTA("PRINT_MAGENTA\n"); // 粉红// PRINT_RED("PRINT_RED\n"); // 红// PRINT_WHITE("PRINT_WHITE\n"); // 白// PRINT_YELLOW("PRINT_YELLOW\n"); // 黄
# ==============================================================================# makefile# ==============================================================================BIN = take_waterLINE80 = --------------------------------------------------------------------------------CC = g++ -std=c++98CFLAGS = -Wall -gINC = -I.LIBS = -m64 -lstdc++ -pthreadLIBPATH = ./DEPEND_CODE_DIR = ./empty_dir \DEPEND_CODE_SRC = $(shell find $(DEPEND_CODE_DIR) -name '*.cpp')DEPEND_CODE_OBJ = $(DEPEND_CODE_SRC:.cpp=.o)# root code dir is ./'s code, e.g. main.cppROOT_CODE_SRC = $(shell find ./ -name '*.cpp')ROOT_CODE_OBJ = $(ROOT_CODE_SRC:.cpp=.o)# if no sub code dir, must fill a sub dir exist but empty. e.g. ./empty_dir# if have sub code dir, fill it like DEPEND_CODE_DIR# e.g. ./xx_subdir/xx_type/SUB_CODE_DIR = ./empty_dirSUB_CODE_SRC = $(shell find $(SUB_CODE_DIR) -name '*.cpp')SUB_CODE_OBJ = $(SUB_CODE_SRC:.cpp=.o)clean:    clear    @echo $(LINE80)    @echo make clean    rm -f $(BIN) $(ROOT_CODE_OBJ) $(DEPEND_CODE_OBJ) $(SUB_CODE_OBJ)all:$(BIN)    @echo $(LINE80)    @echo make all    chmod 777 $(BIN)    find . -name $(BIN)$(BIN) : $(ROOT_CODE_OBJ) $(DEPEND_CODE_OBJ) $(SUB_CODE_OBJ)    $(CC) $(CFLAGS) -o $@ $^.cpp.o:    $(CC) -c $(CFLAGS) $^ -o $@ $(INC) -L$(LIBPATH) $(LIBS)rebuild:    make clean    @echo $(LINE80)    make all    ./$(BIN)
你可能感兴趣的文章
oracle sql
查看>>
java.net.BindException: 无法指定被请求的地址
查看>>
scala list
查看>>
多人协作流程与规范
查看>>
k8s设置阿里云仓库
查看>>
svn服务器安装
查看>>
spark 笔记1
查看>>
SVN服务器多个项目的权限分组管理
查看>>
svn 没有作者信息) | (没有时间信息
查看>>
shell笔记1
查看>>
shell参数
查看>>
shell dirname basename
查看>>
eureka rest operations
查看>>
线程分析
查看>>
jenkins
查看>>
DOM(总结)
查看>>
JS判断一个数据的数据类型
查看>>
MySQL学习总结(一)
查看>>
MySQL学习总结(二)
查看>>
MySQL学习总结(三)
查看>>