 |
ช่วยหน่อยคะ ต้องการสร้างตารางการตัดสินใจ ด้วยภาษา php โดยใช้เทคนิคตารางความจริง ได้ตัวอย่างโค้ดมาเป็นภาษาอื่นไม่เข้าใจ แนะนำด้วยคะ |
|
 |
|
|
 |
 |
|
ช่วยแนะนำด้วยคะปวดหัวมากเลย
พอดีตัวอย่างโค้ดที่ได้มาเป็นภาษาอื่น และยังไม้อัตโนมัติเลยคะ แต่ต้องเขียนเป็น php ไม่ถนัดเลยคะ
โดยใช้เทคนิคตรารางการตัดสินใจ และต้องเขียนโค้ดให้สร้างตารางตัดสินใจให้โดยอัตโนมัติ
หมายถึง ส่วนของ conditions จำนวนทางเลือกเงื่อนไขจะเป็น 2^n (n คือ จำนวนเงื่อนไข) เช่น
เมื่อ เงื่อนไขมีสามข้อ (n)=3
ทางเลือกของเงื่อนไขจะเท่า 8 ทางเลือก
หรือ ถ้าเงื่อนไขมีสามข้อ (n)=4
ทางเลือกของเงื่อนไขจะเท่า 16 ทางเลือก
ปล.อยากทำเป็นระบช่วยตัดสินใจโดยใช้เทคนิคของตารางการตัดสินใจมาประกอบความน่าเชื่อถือ ช่วยแนะนำเพิ่มเติมได้
ตัวอย่างโค้ดภาษา C
#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?
อันนี้คือลองทำดู มั่วเอา 555++
ทำเป็นแบบรับค่า้วนลูปเอา แต่ทำไมค่าแรกถึงไม่่่่่่่่่่่่่่่่่่่่่ตรงกันคะ
งง รายชื่อที่แสดงรายการยังไม่ถูกเพราะค่าที่รับไปมันไม่ตรงกัน

Code (PHP)
<html>
<body>
<?
$N_Condition = 3;
$N_Rules =8;
$condition=array("srt"=>array("พัดลม","หอพักสตรี","หอพักชาย"),
"truth"=>array("11110000","11001100", "10101010")
);
$Solutions=array("srt"=>array("หอสตรีตระกูลฟลุ๊ค",
"หอชายวรัญญา",
"หอพักสตรีกำนัน",
"หอพักชายไอดิน",
"หอพักสตรีนันทกาญจน์"),
"truth"=>array ("111010100",
"000110010",
"010101000",
"000110010",
"001100000"));
?>
<table border="1" cellspacing="0" cellpadding="2">
<form action="DS_Table.php" method="post">
<tr bgcolor="#D4DEC4">
<td width="200" ><center>รายการคุณสมบัติ</center></td>
<td width="50" align="center">ต้องการ</td>
<td width="50" align="center">มีไม่มีก็ได้</td>
</tr>
<? for($t=0;$t<$N_Condition;$t++){?>
<tr>
<td bgcolor="white" ><? echo $condition["srt"][$t]?></td>
<td align="center"><input name="q[]" type="checkbox" value="1" /> </td>
<!-- <td align="center"><input name="q[]" type="checkbox" value="0" /> </td> -->
</tr>
<?
}?>
<tr><td colspan="3" align="center"><input name="" type="submit" value="ส่งค่า" /></td></tr>
</form>
<?
echo "ค่าที่ส่งตัวแปรอาเรย์[0]=".$_POST["q"][0]." ,[1]=".$_POST["q"][1]." ,[2]=".$_POST["q"][2]."</br>";
for($r,$code1=0;$r<count($_POST["q"]);$r++){
$answer=$_POST["q"][$r];
if($answer==""){$answer=0;}
echo "<br>answer: ".$answer;
$code1=($code1<<1)|($answer!="1"); /*ไม่แน่ใจว่าถูกไหมลองดัดแปลงภาษา C */
}
if ($code1==$N_Rules){
echo"<tr><td colspan=\"3\">So, you don't have a problem then?</td></tr>";
}else {
echo"<tr><td colspan=\"3\" bgcolor=\"#D4DEC4\" align=\"center\">Solutions</td></tr>";
$s=0;
foreach($Solutions["srt"] as $Solutions["srt"][$s]){
if($Solutions["truth"][$s][$code1]=="1"){
echo "<tr>";
echo "<td colspan=\"3\">".$Solutions["srt"][$s]."</td>";
echo "</tr>";
}$s++;
}
}
?>
</table>
</body>
</html>
Tag : PHP, MySQL, JavaScript, Windows, Web Service
|
ประวัติการแก้ไข 2013-07-22 01:19:51 2013-07-22 02:29:29 2013-07-22 10:56:46 2013-07-22 17:25:52
|
 |
 |
 |
 |
Date :
2013-07-22 01:16:24 |
By :
nune.supaporn |
View :
3085 |
Reply :
24 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เขียนได้เยอะแล้วนี่ครับ ลองพยายามอีกนิดครับ
|
 |
 |
 |
 |
Date :
2013-07-23 06:41:22 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เป็นอัลกอริทึมที่ซับซ้อนมากๆ (สำหรับผม)
แต่ถ้าเขียนโปรแกรมใช้จริงคงมีแค่
Code (SQL)
SELECT * FROM my_table WHERE fld_condition = '101'
|
 |
 |
 |
 |
Date :
2013-07-23 20:29:51 |
By :
{Cyberman} |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จริงๆ มันคือการค้นหานั่นล่ะครับ
ไม่ต้องคิดให้มันซับซ้อน ในเมื่อเราใช้การค้นหาจากฐานข้อมูลอยู่แล้ว
กรณีนี้ข้อมูลมีลักษณะเป็น SET ซึ่งในหลายๆ ระบบฐานข้อมูลมีชนิดของข้อมูลลักษณะนี้อยู่
อย่างใน mysql ก็มีชนิดข้อมูล SET

ซึ่งเราสามารถใช้ form field แบบ array มาสร้าง query เพื่อใช้ค้นหาได้
ส่วนการค้นหาจาก checkbox สำหรับกรณีนี้ ให้กำหนด value ของ checkbox แต่ละตัวให้เป็นค่าที่ต้องการค้นหาเลยครับ
ตัวอย่างการสร้าง SQL query จาก checbox
<html>
<body>
<form>
<div><label><input type="checkbox" name="dorm_types[]" value="male" /> หอพักชาย</label></div>
<div><label><input type="checkbox" name="dorm_types[]" value="female" /> หอพักหญิง</label></div>
<div><label><input type="checkbox" name="dorm_options[]" value="fan" /> มีพัดลม</label></div>
<div><label><input type="checkbox" name="dorm_options[]" value="air" /> มีแอร์</label></div>
<div><label><input type="checkbox" name="dorm_options[]" value="tv" /> มีทีวี</label></div>
<div><label><input type="checkbox" name="dorm_options[]" value="refrigerator" /> มีตู้เย็น</label></div>
<hr />
<input type="submit" value="ค้นหา" />
<?php
//$mysqli = mysqli_connect('localhost', 'root', '', 'yourdatabase');
// ตรวจว่ามีตัวแปร $_GET ที่เป็นตัวเลือกในการค้นหาส่งมาหรือไม่
// ถ้าไม่มี ให้สร้าง array ขึ้นมาเปล่าๆ
// เพราะ checkbox จะไม่ส่งค่า่ตัวแปรตามชื่อมา หากไม่มี checkbox ชื่อนั้นๆ ถูกเลือกเลย
if (!isset($_GET['dorm_types']) || !is_array($_GET['dorm_types'])) {
$_GET['dorm_types'] = array();
}
if (!isset($_GET['dorm_options']) || !is_array($_GET['dorm_options'])) {
$_GET['dorm_options'] = array();
}
// array ของเงื่อนไข
$where = array();
foreach ($_GET['dorm_types'] as $value) {
//$value = $mysqli->real_escape_string($value);
// เราใช้ FIND_IN_SET() หรือ LIKE ในการตรวจสอบว่ามีค่าที่ต้องการอยู่ใน SET หรือไม่
$where[] = "FIND_IN_SET('$value', `types`) > 0";
}
foreach ($_GET['dorm_options'] as $value) {
//$value = $mysqli->real_escape_string($value);
$where[] = "FIND_IN_SET('$value', `options`) > 0";
}
// query หลัก คือเลือกทุกแถวออกมาจากฐานข้อมูล
$query = "SELECT * FROM `dorms`\n";
// ถ้ามีการระบุตัวเลือกในการค้นหา ให้เพิ่ม WHERE เข้าไปใน query
if ($where) {
$query .= "WHERE\n" . implode("\nAND ", $where);
}
?>
<pre><?php echo $query; ?></pre>
</form>
</body>
</html>
Form

Query

|
 |
 |
 |
 |
Date :
2013-07-23 21:28:30 |
By :
cookiephp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หวังว่าคงไม่งงนะครับ นี่เป็นแค่ตัวอย่างการสร้าง query ซึ่งคุณจะต้องเอาไปประยุกต์ใช้ติดต่อกับฐานข้อมูลเอาเอง
แต่หลักๆ คืออยากให้ลองใช้ชนิดของข้อมูลให้ตรงกับงานครับ ซึ่งถ้าไม่ใช้ SET ก็สามารถแยก option ต่างๆ เป็น column ได้เหมือนกัน
แต่อาจจะทำให้ลำบากตอนเพิ่มหรือแก้ไขเปลี่ยนแปลงครับ (SET ออกแบบมาเพื่อข้อมูลลักษณะอย่างนี้เลย)
|
 |
 |
 |
 |
Date :
2013-07-23 21:32:24 |
By :
cookiephp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ทำไมตัวเลขมันยาวอย่างนี้ล่ะคับ
111010100
มันน่าจะมีแค่ สามตัวเช่น 000หอกระเทย) 111 101 110 001 010 100
111 = พัดลม ช ญ
100 = พัดลม ไม่รับ ช ญ
ซึ่งจริงๆ จะไม่มี 100 หรือ 000 ซึ่งจะเหลือแค่
111 101 110 001 010 011
ใช้ where
ex.
Code (PHP)
$cb = array(1, 1, 0); // พัดลม + ช ต้องทำให้มีครบ 3 จากค่าที่รับมา
$regex = '';
foeach($cb as $val)
$regex .= ($val == 1) ? '1' : '.';
$sql = "SELECT * FROM dormitory WHERE type REGEXP '^{$regex}$'";
ปล. มั่วๆนะ
|
ประวัติการแก้ไข 2013-07-23 22:19:26 2013-07-23 22:21:06 2013-07-23 22:26:02
 |
 |
 |
 |
Date :
2013-07-23 22:18:31 |
By :
pjgunner.com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
งงครับ เกี่ยวกับโจทย์หอพัก นี่ให้โปรแกรมหาให้ใช่หรือไม่หรือ คนเลือกกันแน่
มันเกี่ยวอะไรกับการเลือกหอพักเหรอคับ ดูจากตัวอย่าง แล้วมันเป็นคำถามคำตอบ ส่วนเลือกหอพักอันนี้ คือเราถามเหรอ
ถ้าอย่างนั้นเราเลือกทีละหลายอัน มันจะเลือกคำตอบยังไง
|
ประวัติการแก้ไข 2013-07-23 23:18:50
 |
 |
 |
 |
Date :
2013-07-23 23:13:40 |
By :
pjgunner.com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่ว่างอ่ะคับ แต่น่าสนใจ 
เอาไปทำ ai ได้
|
 |
 |
 |
 |
Date :
2013-07-23 23:28:41 |
By :
pjgunner.com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตัวอย่าง ที่จะทำจากระบบค้นหาที่พักในจังหวัดแม่ห้องสอน
รับค่าการค้นหาจาก

จากรายชื่อหอพักจะแสดงขึ้น ผู้ใช้สามารถคลิ๊กเข้าไปดูรายละเอียด
ข้อมูลพื้นฐานภายในหอพักได้

ผู้ใช้สามารถเปรียบเทียบคุณสัมบัติที่มีได้

และอื่นๆ อีกนิดหน่อย(กลัวทำไม่ทัน) แต่หลักๆที่สำคัญ คือ การค้นหาโดยใช้เทคนิคตารางการตัดสินใจ นี้แหละคะ
|
ประวัติการแก้ไข 2013-07-23 23:39:40 2013-07-23 23:41:11 2013-07-23 23:43:47
 |
 |
 |
 |
Date :
2013-07-23 23:39:11 |
By :
nune.supaporn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อัลกอริธึ่มไม่ได้ยากครับ แต่ผมว่าน้องใช้ผิดงาน
คือถ้าเอามาใช้กับการค้นหาแถวในฐานข้อมูล มันไม่จำเป็นต้องใช้การเขียนโปรแกรมแบบนี้น่ะครับ
เพราะตามชื่อมันก็บอกว่า ตารางการตัดสินใจ
ซึ่ง "ปัญหา" มี attribute ของมัน และ "การกระทำ" ก็มี attribute ของมัน
การเลือกการกระทำ จะดูจาก SET attribute ของการกระทำ ว่ามีอยู่ใน SET attribute ของปัญหาหรือไม่
แต่โปรแกรมตัวอย่างที่น้องจะทำ มันคือการค้นหา ซึ่งไม่ได้เป็นการ "ตัดสินใจ" จาก "ปัญหา"
แต่เป็นการ "เลือกการกระทำ (ข้อมูลในฐานข้อมูล)" จาก "ตัวเลือก" ที่ผู้ใช้กำหนด แบบตัวอย่างที่ผมให้ไป
ซึ่งถ้ามองกันดีๆ แล้ว ตารางการตัดสินใจ ถ้าจะมาใช้กับการค้นหาข้อมูลในฐานข้อมูล
ข้อมูลในฐานข้อมูลมันก็คือ solutions ส่วนข้อมูลที่รับมาจากผู้ใช้ (ฟอร์ม) ก็คือ conditions นั่นแหละครับ
ซึ่งความเป็นไปได้ของการแก้ปัญหา มันก็ขึ้นอยู่กับข้อมูลที่อยู่ในฐานข้อมูลนั่นเอง
ลองทำความเข้าใจตัวอย่างของผมดูก็ได้ จริงๆ มันก็คือการสร้างทางแก้ปัญหา (query) จากข้อมูลที่รับมาจากผู้ใช้นั่นแหละครับ
|
 |
 |
 |
 |
Date :
2013-07-23 23:46:33 |
By :
cookiephp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอนนี้ยังไม่ว่างอ่านจริงๆ
ไอ้ที่โปรแกรหมากรุก มันใช้ วิธีนี้ด้วยใช่มั้ย
|
ประวัติการแก้ไข 2013-07-23 23:50:49
 |
 |
 |
 |
Date :
2013-07-23 23:49:35 |
By :
pjgunner.com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จากโค้ดตัวอย่าง แล้วเปลี่ยนเป็น php ได้แล้ว
เหลือทำยังไงให้ทางเลือกของเงื่อนไขเพิ่มขึ้นได้อัตโนมัติตามจำนวนของเงื่อนไข
ทำไงดีคะ
|
 |
 |
 |
 |
Date :
2013-08-03 21:15:33 |
By :
nune.supaporn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|