#include <stdio.h>
#define N_COND 3
#define COND_LEN (1 << N_COND)
struct { const char *str, *truth;}
cond[N_COND] = {
{"Printer does not print", "1111...."},
{"A red light is flashing", "11..11.."},
{"Printer is unrecognised", "1.1.1.1."},
},
solu[] = {
{"Check the power cable", "..1....."},
{"Check the printer-computer cable","1.1....."},
{"Ensure printer software is installed","1.1.1.1."},
{"Check/replace ink", "11..11.."},
{"Check for paper jam",".1.1...."},
};
int main()
{
int q, ans, c;
for (q = ans = c = 0; q < N_COND; q++) {
do {
if (c != '\n') printf("%s? ", cond[q].str);
c = getchar();
} while (c != 'y' && c != 'n');
ans = (ans << 1) | (c != 'y');
}
if (ans == COND_LEN - 1)
printf("\nSo, you don't have a problem then?\n");
else {
printf("\nSolutions:\n");
for (q = 0; q < sizeof(solu)/sizeof(solu[0]); q++)
if (solu[q].truth[ans] == '1')
printf(" %s\n", solu[q].str);
}
return 0;
}
output
Printer does not print? y
A red light is flashing? n
Printer is unrecognised? y
Solutions:
Check the power cable
Check the printer-computer cable
Ensure printer software is installed
Alternative Version Translation of: C Code
import std.stdio, std.string;
struct DataPair { string message, truth; }
immutable DataPair[] conditions = [
{"Printer does not print", "####...."},
{"A red light is flashing", "##..##.."},
{"Printer is unrecognised", "#.#.#.#."}];
immutable DataPair[] solutions = [
{"Check the power cable", "..#....."},
{"Check the printer-computer cable", "#.#....."},
{"Ensure printer software is installed", "#.#.#.#."},
{"Check/replace ink", "##..##.."},
{"Check for paper jam", ".#.#...."}];
void main() {
size_t code;
foreach (cond; conditions) {
write(cond.message, "? [y=yes/others=no] ");
string answer = "no";
try
answer = stdin.readln();
catch (StdioException)
writeln("no");
code = (code << 1) | !answer.startsWith('y', 'Y');
}
if (code == (2 ^^ conditions.length) - 1)
writeln("\nSo, you don't have a problem then?");
else {
writeln("\nSolutions:");
foreach (sol; solutions)
if (sol.truth[code] == '#')
writeln(" ", sol.message);
}
}
Output:
Printer does not print? [y=yes/others=no] no
A red light is flashing? [y=yes/others=no] no
Printer is unrecognised? [y=yes/others=no] no
So, you don't have a problem then?
จริงๆ มันคือการค้นหานั่นล่ะครับ
ไม่ต้องคิดให้มันซับซ้อน ในเมื่อเราใช้การค้นหาจากฐานข้อมูลอยู่แล้ว
กรณีนี้ข้อมูลมีลักษณะเป็น SET ซึ่งในหลายๆ ระบบฐานข้อมูลมีชนิดของข้อมูลลักษณะนี้อยู่
อย่างใน mysql ก็มีชนิดข้อมูล SET
ซึ่งเราสามารถใช้ form field แบบ array มาสร้าง query เพื่อใช้ค้นหาได้
ส่วนการค้นหาจาก checkbox สำหรับกรณีนี้ ให้กำหนด value ของ checkbox แต่ละตัวให้เป็นค่าที่ต้องการค้นหาเลยครับ
ตารางการตัดสินใจ (Decision Table) คือ ตารางมาตรฐานสำหรับการตัดสินใจเชิงตรรกะตามเงื่อนไขที่ระบบกำหนดไว้
ตารางการตัดสินใจเหมาะสำหรับใช้ในกรณีที่เป็นชุดการตัดสินใจที่มีความสัมพันธ์กันซึ่งจะช่วยให้มั่นใจได้ว่าไม่มีกรณีอื่นเหลืออยู่
และเป็นการเลือกสิ่งที่ดีที่สุดจากตัวเลือกที่มีหลากหลายโดยทั่วไปตารางการตัดสินใจมีส่วนประกอบที่สำคัญ 4 ส่วนดังตารางที่ 1
ตารางที่ 1 แสดงส่วนประกอบในตารางการตัดสินใจ
---------------------------------------------
|เงื่อนไข |ทางเลือกของเงื่อนไข |
---------------------------------------------
|การกระทำ |กฎของการกระทำ |
---------------------------------------------
ซึ่งมีขั้นตอนการสร้างตารางการตัดสินใจดังนี้
1. กำหนดเงื่อนไขหรือตัวแปรที่จะทำให้เกิดการตัดสินใจหรือการพิจารณาในการทำงาน
2. พิจารณาจำนวนทางเลือกที่เป็นไปได้ของแต่ละเงื่อนไขซึ่งโดยทั่วไปจะมีเพียง 2’จำนวนคือใช่และไม่ใช่ (Y/N) เท่านั้น
3. คำนวณหาจำนวนคอลัมน์ของตารางการตัดสินใจโดยนำจำนวนทางเลือกที่เป็นได้ของแต่ละเงื่อนไขมาคูณกัน
เช่นการตัดสินใจที่มี 3 เงื่อนไขจะได้เท่ากับ 2n = 8 คอลัมน์
4. เติมทางเลือกของแต่ละเงื่อนไขในส่วนของ“ทางเลือกของเงื่อนไข” เริ่มจากเงื่อนไขแรกโดยจำนวนคอลัมน์หารด้วยสอง (Y/N)
แล้วเติม Y ตามจำนวนคอลัมน์ที่คำนวณได้และเติม N ในคอลัมน์ที่เหลือสำหรับเงื่อนไขต่อๆไปให้นำจำนวนคอลัมน์ที่คำนวณได้ของ
เงื่อนไขก่อนหน้านั้นตั้งหารด้วยสองเช่นในตารางการตัดสินที่มี 8 คอลัมน์และมี 2 ทางเลือก (Y/N) ดังนั้นเงื่อนไขแรกจะเติม Y= 8/2 =4
คอลัมน์แรกและเติม N ใน 4 คอลัมน์ที่เหลือเงื่อนไขที่สองจะมีการแบ่งส่วนการเติมระหว่าง Y และ N สลับกันครั้งละ 4/2 = 2 คอลัมน์
และเงื่อนไขที่สามจะมีการแบ่งส่วนการเติมสลับกันระหว่าง Y และ N ครั้งละ 2/2 = 1 คอลัมน์ดังตัวอย่างในตารางที่ 2
ตารางที่ 2 แสดงขั้นตอนการสร้างทางเลือกของเงื่อนไข
-----------------------------------------------------
เงื่อนไข (Condition) | ทางเลือกของเงื่อนไข
-----------------------------------------------------
เงื่อนไข 1 | Y Y Y Y N N N N
เงื่อนไข 2 | Y Y N N Y Y N N
เงื่อนไข 3 | Y N Y N Y N Y N
-----------------------------------------------------
5. สร้างกฎที่เป็นไปได้ภายใต้เงื่อนไขที่ระบุจากนั่นทำเครื่องหมายในส่วนของการระบุการเลือกการกระทำภายใต้กฎที่เป็นไปได้
ดังตัวอย่างในตารางที่ 3
ตารางที่ 3 แสดงขั้นตอนการระบุการเลือกการกระทำ
-----------------------------------------------------
เงื่อนไข (Condition) | ทางเลือกของเงื่อนไข
-----------------------------------------------------
เงื่อนไข 1 | Y Y Y Y N N N N
เงื่อนไข 2 | Y Y N N Y Y N N
เงื่อนไข 3 | Y N Y N Y N Y N
-----------------------------------------------------
การกระทำ (Action) | กฎของการกระทำ
-----------------------------------------------------
การกระทำที่ 1 | X
การกระทำที่ 2 | X
การกระทำที่ 3 | X
การกระทำที่ 4 | X
6.ตรวจสอบกฎและการระบุการเลือกการกระทำที่มีความซับซ้อนหรือขัดแย้งกันดังตัวอย่างในตารางที่ 4
ตารางที่ 4 แสดงการเรียบเรียงเงื่อนไขและการกระทำใหม่
-----------------------------------------------------
เงื่อนไข (Condition) |ทางเลือกของเงื่อนไข
-----------------------------------------------------
เงื่อนไข 1 | Y Y N Y
เงื่อนไข 2 | Y N Y Y
เงื่อนไข 3 | N Y Y Y
-----------------------------------------------------
การกระทำ (Action) | กฎของการกระทำ
-----------------------------------------------------
การกระทำ 1 | X
การกระทำ 2 | X
การกระทำ 3 | X
การกระทำ 4 | X