Jump to content


Photo

ใครพอจะแนะนำ webboard ภาษา java ให้ได้บ้างครับ


  • Please log in to reply
32 ความเห็นในกระทู้นี้

#1 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 19 ตุลาคม พ.ศ. 2555 - 09:13

คือผมมีข้อสงสัยครับ อยากจะเรียนถาม ไม่ทราบว่าที่นี่มีใคร พอจะรู้จัก webboard ภาษา java บ้างครับ

หรือถ้าสามารถตอบข้อสงสัยผมได้ จะขอบพระคุณมาก

เนื่องจากผมกำลังเรียน ภาษา java จาก internet อยู่ และมีข้อสงสัยที่ไม่เข้าใจ เกี่ยวกับ การไหลของข้อมูล คือใน source code ของหัวข้อ insert sorting โจทย์เป็นแบบนี้นะครับ

ใน method insert sort

static void insertSort(int [] number ,int length){
for(int T = 1 ; T < length ; T++){
int testnumber = number[T];
int S = T;

while( S>0 && number[S-1]>testnumber ){

number[S] = number[S-1];
S--;
} number[S] = testnumber;
}
}

คือผมสงสัย ว่า หลังจากออกจาก loop while แล้ว code ที่ผม ทำตัวหนาไว้ มีหน้าที่อะไรครับ เพราะพอผมลองลบตัวนี้แล้ว ค่าใน array ของผม ก็เปลี่ยนไป ทำให้ run ออกมาแล้วได้ผลที่ไม่ถูกต้อง

รบกวนเพื่อนสมาชิกด้วยครับ ไม่อยากผ่านไปแบบไม่เข้าใจ

Edited by ทรงธรรม, 19 ตุลาคม พ.ศ. 2555 - 09:14.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#2 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 22 ตุลาคม พ.ศ. 2555 - 23:20

testnumber เป็นเหมือนที่พักข้อมูลชั่วคราว
ในลูป while นั้นจะการมีเขียนทับอาเรย์ตำแหน่งนั้นๆ
ด้วยตำแหน่งอาเรย์ที่น้อยกกว่า เมื่อเข้าเงือนไข
เมื่อมีตัวที่ถูกเขียนทับไปแล้ว มันก็ต้องมีตัวที่ซ้ำใช่ไหม
เช่น number[s] = number[s-1]
พอออกจากลูป while แล้วแสดงว่ามีตัวที่ซ้ำค่ากัน
ก็ต้องใส่ค่า testnumber ลงไปที่ตำแหน่งอาเรย์ S

Edited by phoosana, 22 ตุลาคม พ.ศ. 2555 - 23:40.

We love fender.

#3 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 23 ตุลาคม พ.ศ. 2555 - 02:43

ไม่รู้จะงงหนักขึ้นไปอีกหรือเปล่า :D ลองศึกษาวิธีการ Sort แบบโบราณดูก็ได้
เช่น C sort กับ shell sort หลักการง่ายกว่าแต่เสียเวลาวนลูบหลายรอบ

ส่วนรูปนี่ผมลองทดสอบกำหนดค่า 1 - 5 แล้วให้มันเรียงตาม
program ของคุณทรงธรรม ครับ

Attached Images

  • sort.jpg

We love fender.

#4 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 23 ตุลาคม พ.ศ. 2555 - 10:25

testnumber เป็นเหมือนที่พักข้อมูลชั่วคราว
ในลูป while นั้นจะการมีเขียนทับอาเรย์ตำแหน่งนั้นๆ
ด้วยตำแหน่งอาเรย์ที่น้อยกกว่า เมื่อเข้าเงือนไข
เมื่อมีตัวที่ถูกเขียนทับไปแล้ว มันก็ต้องมีตัวที่ซ้ำใช่ไหม
เช่น number[s] = number[s-1]
พอออกจากลูป while แล้วแสดงว่ามีตัวที่ซ้ำค่ากัน
ก็ต้องใส่ค่า testnumber ลงไปที่ตำแหน่งอาเรย์ S


ใช่เลยครับท่าน phoosana พอลบ code นี้ออก ทำให้ค่าใน array ผม ซ้ำกันถึง สองคู่ เพราะเหตุผล ที่ท่านว่าน่ะล่ะ
ไม่ว่ากันนะครับ ถ้าผมจะถามท่านอีกสักข้อ คือ ผมไม่เข้าใจในเรื่อง การส่งค่า อีก โจทย์นะครับ ดังนี้

class product {

private String name;
private double price;

product(String name,double price){
setName(name);
setPrice(price);
}
String getName(){
return name;
}

void setName(String name){
if (name.equals(" " )){
name = "stationary";
}
this.name = name;
}

double getPrice(){
return price;
}

void setPrice(double price){
if (price <= 0.0) {
this.price = 1.50;
} else {
this.price = price;
}
}
}

คือ ปัญหา ที่อยากจะถามคือ ใน method setName นั้น เมื่อมีการเปรียบเทียบค่า ใน if แล้ว เป็นไปตามเงื่อนไข ทำไม การส่งค่า "stationary" จึงไม่ส่งไปที่ this.name แต่กลับส่งไปที่ name ที่เป็นตัวเดียวกับ parameter แทน

เมื่อเทียบกับ method setPrice ที่เมื่อมีการเปรียบเทียบค่า ใน if แล้ว เป็นไปตามเงื่อนไข การส่งค่า 1.50 กลับส่งไปให้ this.price ไม่ส่งไปที่ price ที่เป็น parameter

ตามความเห็นของผม มันน่าจะส่งไปที่ ค่าตัวแปรตั้งต้น ข้างบน คือส่งด้วย this.name แทนที่จะส่งให้ name ที่เพิ่งถูกสร้างจาก parameter แต่ กลับเป็นว่า พอผม ไปแก้ code โปรแกรมก็ทำงานผิดปกติทันที

รบกวน คุณ phoosana หรือ ท่านอื่น ที่พอช่วยได้ ด้วยครับ ผมไม่อยากใช้แค่ความจำ ต้องการเข้าใจด้วย

Edited by ทรงธรรม, 23 ตุลาคม พ.ศ. 2555 - 10:35.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#5 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 23 ตุลาคม พ.ศ. 2555 - 15:27

ตอบว่า ถ้าเข้าเงื่อนไงของ if คือตัวแปล parameter name = " "

if (name.equals(" " )){
name = "stationary";
}
this.name = name;
}
_____________________________________
name = "stationary"
this.name = name = "stationary" ด้วยครับ

แต่ถ้าเราไปแก้เป็น

if (name.equals(" " )){
this.name = "stationary";
}
this.name = name;
}

จะกลายเป็นว่า ให้ this.name = "stationary" แล้วมาถูกเขียนทับด้วยตัวแปล name ที่เป็น parameter อีกที
this.name = name = " "

Edited by phoosana, 23 ตุลาคม พ.ศ. 2555 - 15:28.

We love fender.

#6 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 23 ตุลาคม พ.ศ. 2555 - 15:42

เข้าใจว่าเขาต้องการให้เห็นวิธีการเขียนทั้งสองแบบ
โดยการนำตัวแปล name มา reuse โดยไม่ต้องใช้ else
หากจะใช้ else ก็จะออกแบบนี้ เหมือนกับ method setPrice
แต่ก็ให้ผลลัพธ์เหมือนกัน

if (name.equals(" " )){
this.name = "stationary";
}
else {
this.name = name;
}

ลองดูครับ

Edited by phoosana, 23 ตุลาคม พ.ศ. 2555 - 18:38.

We love fender.

#7 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 24 ตุลาคม พ.ศ. 2555 - 07:57

ท่าน phoosana ตอบให้ผมกระจ่างเลยครับ ขอบคุณมาก ได้เข้าใจท่านอาจารย์ นรินทร จันทวงศ์ มาอีกหน่อยแล้ว

วันนี้ ได้คืบหน้า เพราะท่านทั้งสอง ขอเรียก ท่าน phoosana ว่า อาจารย์ด้วยครับ

Edited by ทรงธรรม, 24 ตุลาคม พ.ศ. 2555 - 07:58.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#8 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 24 ตุลาคม พ.ศ. 2555 - 08:24

ไม่ต้องถึงกับเรียกอาจารย์ก็ได้ครับ ว่าแต่ใช้โปรแกรมอะไรช่วยเขียน

แนะนำให้ลองใช้ netbeans IDE ช่วยให้การเขียนง่ายขึ้น www.netbeans.org
แต่ถ้าตัวที่ใช้อยู่เป็น jbuilder ก็ไม่ต้องใช้ netbeans ก็ได้ครับเพราะคล้ายๆ กัน

Edited by phoosana, 24 ตุลาคม พ.ศ. 2555 - 08:49.

We love fender.

#9 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 24 ตุลาคม พ.ศ. 2555 - 12:10

ผมใช้ของ Eclipse ครับ รุ่น europa ค่อนข้างเก่าหน่อยครับ ได้รับคำแนะนำจาก อาจารย์ นรินทร จันทวงศ์ แต่ของอาจารย์ ใช้รุ่น helios ซึ่งเป็นรุ่นล่าสุด

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#10 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 25 ตุลาคม พ.ศ. 2555 - 16:38

ครับ ที่ถามเผื่อยังไม่มี ถ้ามีอะไรสงสัยก็ถามมาได้ หรือหลังไมล์มาก็ได้ครับ
We love fender.

#11 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 29 ตุลาคม พ.ศ. 2555 - 13:26

ครับ ที่ถามเผื่อยังไม่มี ถ้ามีอะไรสงสัยก็ถามมาได้ หรือหลังไมล์มาก็ได้ครับ

มีปัญหา มาถามอีกแล้วครับ ท่าน phoosana
อยากถามเกี่ยวกับ การใช้ method ภายใน method ของตัวเอง
หรือ จะเรียก อีกนัยหนึ่งคือ method ซ้อนกัน ไม่รู้จบ (อันนี้ผมตั้งด้วยความเข้าใจตัวเองครับ)

จากตัวอย่างนะครับ

public class MergeSort
{
private int a[];

public MergeSort(int b[])
{
a = b;
}
public void sort()
{
if(a.length <= 1)
return;
int first[] = new int[a.length / 2];
int second[] = new int[a.length - first.length];
for(int x = 0; x < first.length; x++)
first[x] = a[x];
for(int x = first.length, y = 0; x < a.length; x++, y++)
first[y] = a[x];
//Split the array again
MergeSort sort1 = new MergeSort(first);
MergeSort sort2 = new MergeSort(second);

sort1.sort();
sort2.sort();

merge(first, second);
}
private void merge(int first[], int second[])
{
int x = 0;
int y = 0;
int z = 0;
while(x < first.length && y < second.length)
{
if(first[x] < second[y])
{
a[z] = first[x];
x++;
}
else
{
a[z] = second[y];
y++;
}
z++;
}
//copy remaining elements to the tail of a[];
for(int i = x; i < first.length; i++)
{
a[z] = first[i];
z++;
}
for(int i = y; i < second.length; i++)
{
a[z] = second[i];
z++;
}
}
}

จาก code นี้ ตามความเข้าใจของผมคือ ถ้า method ตัวเอง ถูกเรียกใช้ภายในตัวเอง จะทำให้เกิดการซ้อน ของ method ไม่รู้จบ ใช่หรือไม่ครับ ดูจากกรณีนี้คือ การ sort เป็นคู่ ๆ แต่ใช้คำสั่ง แบ่งแค่ครั้งเดียว และให้ method ซ้อนตัวเองไปเรื่อย ๆ เพื่อทำการ แบ่งซอยย่อยไปเรื่อย ๆ (split array again and again...) ให้สุดท้าย เหลือ element เดี่ยว ๆ

แล้ว คำสั่ง merge ที่ถูกเรียกมาใช้ใน method sort ก็จะทำงาน ซ้อนไปเรื่อย ๆ พร้อม ๆ กันด้วย ใช่หรือไม่ครับ

ผมคิดแบบนี้ ไม่ทราบว่า เข้าใจถูกหรือเปล่าครับ

และการซ้อนกัน ของ method ก็จำเป็น ต้องใช้ constructor เป็นตัวช่วย เพื่อจะทำให้ object ที่สร้างใหม่อยู่ภายใน method นั้น สามารถเรียก method ตัวเองได้ด้วย ใช่หรือไม่ครับ
หรือว่า constructor นั้น ทำเพื่อเชื่อม private int a[] กับ method sort เท่านั้น

Edited by ทรงธรรม, 29 ตุลาคม พ.ศ. 2555 - 13:53.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#12 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 29 ตุลาคม พ.ศ. 2555 - 14:59

constructor หมายถึง ภายในคลาสนั้น มี method ชื่อเดียวกันกับ class
แล้ว constructor เอาไว้ทำอะไร

เอาไว้ตอนที่สร้าง object ชึ้นมาใหม่ มันจะทำงานโดยอัตโนมัติ
เราจะ สร้าง object ขึ้นมาใหม่กี่ตัวก็ได้ เช่น sort1 ,sort2 .....
ถ้าไม่ใช้ construtor ก็ไม่สามารถ สร้าง object ขึ้นใหม่ ด้วยคำสั่ง new ได้

public class MergeSort
{
private int a[];

public MergeSort(int b[])
{
a = b;
}

class MergeSort มี method ชื่อ MergeSort ชื่อเดียวกันกับชื่อคลาส
method MergeSort จะทำงานทันทีที่มีการสร้าง Object นั้นขึ้นมา
นั่นคือ ให้ a = b แค่นั้น

ส่วนข้อสงสัยคงหมายถึง ใน methord sort() มีการ new sort1 กับ sort2 ภายใน
method sort และมีการเรียกใช้ method sort ภายในmethod sort ด้วย มีผลยังไง
ขอริ้อฟ้นความจำนิดหนึ่ง

Edited by phoosana, 29 ตุลาคม พ.ศ. 2555 - 17:51.

We love fender.

#13 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 29 ตุลาคม พ.ศ. 2555 - 16:32

	public void sort()
	{
		if(a.length <= 1)
			return;
		int first[] = new int[a.length / 2];
		int second[] = new int[a.length - first.length];
		for(int x = 0; x < first.length; x++)
			first[x] = a[x];
		for(int x = first.length, y = 0; x < a.length; x++, y++)
			first[y] = a[x];
		//Split the array again
		MergeSort sort1 = new MergeSort(first);
		MergeSort sort2 = new MergeSort(second);
		sort1.sort();
		sort2.sort();
		merge(first, second);
	}

first[y] = a[x]; ควรจะเป็น second[y] = a[x]; ครับ

Edited by phoosana, 29 ตุลาคม พ.ศ. 2555 - 16:47.

We love fender.

#14 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 29 ตุลาคม พ.ศ. 2555 - 16:46

จาก code นี้ ตามความเข้าใจของผมคือ ถ้า method ตัวเอง ถูกเรียกใช้ภายในตัวเอง จะทำให้เกิดการซ้อน ของ method ไม่รู้จบ ใช่หรือไม่ครับ ดูจากกรณีนี้คือ การ sort เป็นคู่ ๆ แต่ใช้คำสั่ง แบ่งแค่ครั้งเดียว และให้ method ซ้อนตัวเองไปเรื่อย ๆ เพื่อทำการ แบ่งซอยย่อยไปเรื่อย ๆ (split array again and again...) ให้สุดท้าย เหลือ element เดี่ยว ๆ

แล้ว คำสั่ง merge ที่ถูกเรียกมาใช้ใน method sort ก็จะทำงาน ซ้อนไปเรื่อย ๆ พร้อม ๆ กันด้วย ใช่หรือไม่ครับ

ผมคิดแบบนี้ ไม่ทราบว่า เข้าใจถูกหรือเปล่าครับ


ถูกต้องแล้วครับ
We love fender.

#15 apinan191

apinan191

    น้องใหม่

  • Members
  • Pip
  • 4 posts

ตอบ 30 ตุลาคม พ.ศ. 2555 - 17:01

ไม่ยักกระรู้ในนี้มีเทพจาวาอยู่ด้วย อิอิ
ติดตามการรายงานผลบอลสดๆที่นีก่อนใคร

#16 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 10:25

public class testmerge {

static int[] number = { 6, 5, 3, 1, 8, 7, 2, 4};

static int[] array1;


static void sort(int[]array){


if (array1.length<=1) {

return;

}

int[]first = new int[array1.length/2];

int[]second = new int[array1.length-first.length];

for (int x = 0; x < first.length; x++) {

first[x] = array1[x];

}

for (int x = first.length, y = 0; x < array1.length; x++,y++) {

second[y] = array1[x];

}

sort(first);

sort(second);

merge(first,second);

}

static void merge(int[]fi,int[]se){

int x = 0;

int y = 0;

int z = 0;

while (x<fi.length&&y<se.length) {

if (fi[x]<se[y]) {

array1[z] = fi[x];

x++;

} else {

array1[z] = se[y];

y++;

}

z++;

}

for (int i = x; i < fi.length; i++) {

array1[z] = fi;

z++;

}

for (int i = y; i < se.length; i++) {

array1[z] = se;

z++;


}

}

public static void main(String[] args) {

System.out.println("Before merge sort");

for (int i = 0; i < number.length; i++) {

System.out.print(number + " ");

}

array1 = number;

sort(number);


System.out.println("After merge sort");

for (int i = 0; i < number.length; i++) {

[i]System.[i]out.print([i]number[i] + " ");

}

}

}

อันนี้ code นะครับ

ตัวที่ทำให้ใหญ่ขึ้น compiler ฟ้องว่าเป็นตัวปัญหาครับ ส่วนที่ผมกำหนดค่าให้ array1 = number เพราะตอนไม่กำหนดค่าให้มัน มันฟ้องว่า



Before merge sort


6 5 3 1 8 7 2 4 Exception in thread "main" java.lang.NullPointerException

at phase3.testmerge.sort(

testmerge.java:54

Edited by ทรงธรรม, 31 ตุลาคม พ.ศ. 2555 - 10:58.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#17 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 10:49

ครับ ที่ถามเผื่อยังไม่มี ถ้ามีอะไรสงสัยก็ถามมาได้ หรือหลังไมล์มาก็ได้ครับ


รบกวนท่านอีกแล้วครับ คือผมได้ลองเปลี่ยน (edit code) mergesort จากวิธีใช้ สร้าง object ผ่าน constructor ไป ใช้วิธี ให้เสร็จภายใน class ด้วยแนวทางของ static way โดยใช้ static นำหน้า method นะครับ

code คือ rep ข้างบนนะครับ

แต่พอผมแก้ไข แล้ว compiler มัน run แล้วฟ้องแบบนี้ครับ




Before merge sort

6 5 3 1 8 7 2 4 Exception in thread "main" java.lang.StackOverflowError

at phase3.testmerge.sort(testmerge.java:20)

at phase3.testmerge.sort(testmerge.java:20)

at phase3.testmerge.sort(testmerge.java:20)

at phase3.testmerge.sort(testmerge.java:20)

คือ ผมลองไปหาดูพบว่า stackoverflow นี่เกิดจาก infinite recursion หรือการซ้อนกันของ method ที่ไม่รู้จบ น่ะครับ

ปัญหาคือ ทำไมพอเปลี่ยน code ไปใช้แบบนั้นแล้ว ถึงเกิดการ infinite recursion ได้ล่ะครับ ทั้งที่ตัว method sort เอง ก็ได้กำหนดขอบเขต ของ array length แล้วนี่นา

จากโจทย์นี้ array length ของ number เป็น 8 น่าจะเกิดการ recursion แค่ 3 ครั้ง เหตุใด จึงเกิดแบบไม่รู้จบล่ะครับ

Edited by ทรงธรรม, 31 ตุลาคม พ.ศ. 2555 - 11:07.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#18 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 12:49

คุณทรงธรรม ช่วยแปะ โค๊ดลงในเครื่อง tag code ที่เป็น รูป <> ครับ
code บางตัวไปไปตรงกันกับ tag ของเว็บบอร์ด เช่นตัวเอียง

Edited by phoosana, 31 ตุลาคม พ.ศ. 2555 - 13:06.

We love fender.

#19 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 13:25

คุณทรงธรรม ช่วยแปะ โค๊ดลงในเครื่อง tag code ที่เป็น รูป <> ครับ
code บางตัวไปไปตรงกันกับ tag ของเว็บบอร์ด เช่นตัวเอียง


public class testmerge {
static int[] number = { 6, 5, 3, 1, 8, 7, 2, 4};
static int[] array1;

static void sort(int[]array){
 
  if (array1.length<=1) {
   return;
  }
  int[]first = new int[array1.length/2];
  int[]second = new int[array1.length-first.length];
  for (int x = 0; x < first.length; x++) {
   first[x] = array1[x];
  }
  for (int x = first.length, y = 0; x < array1.length; x++,y++) {
   second[y] = array1[x];
  }
  sort(first);
  sort(second);
  merge(first,second);
}
static void merge(int[]fi,int[]se){
  int x = 0;
  int y = 0;
  int z = 0;
  while (x<fi.length&&y<se.length) {
   if (fi[x]<se[y]) {
    array1[z] = fi[x];
    x++;
   } else {
    array1[z] = se[y];
    y++;
   }
   z++;
  }
  for (int i = x; i < fi.length; i++) {
   array1[z] = fi[i];
   z++;
  }
  for (int i = y; i < se.length; i++) {
   array1[z] = se[i];
   z++;
  
  }
}
public static void main(String[] args) {
  System.out.println("Before merge sort");
  for (int i = 0; i < number.length; i++) {
   System.out.print(number[i] + " ");
  }
  array1 = number;
  sort(number);
 
  System.out.println("After merge sort");
  for (int i = 0; i < number.length; i++) {
   System.out.print(number[i] + " ");
  }
}
}

Edited by ทรงธรรม, 31 ตุลาคม พ.ศ. 2555 - 13:28.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#20 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 13:31

static void sort(int[]array){
ตรงนี้ ตัวแปลพารามิเตอร์ array ไม่ได้ใข้งานเลยครับ

อีกที่หนึ่งคือต้องส่งอาเรย์เข้าไปใน ฟังชั่น merge() ด้วย

public class testmerge {

    static int[] number = { 6, 5, 3, 1, 8, 7, 2, 4};
    static int[] array1;
 
    static void sort(int[] array){
	    if (array.length<=1) {
		    return;
	    }
	    int[]first = new int[array.length/2];
	    int[]second = new int[array.length-first.length];
	    for (int x = 0; x < first.length; x++) {
		    first[x] = array[x];
	    }
	    for (int x = first.length, y = 0; x < array.length; x++,y++) {
		    second[y] = array[x];
	    }
	    sort(first);
	    sort(second);
	    merge(first,second,array);

    }
    static void merge(int[]fi,int[]se,int[] <img src='http://static.serithai.net/webboard/public/style_emoticons/<#EMO_DIR#>/cool.png' class='bbc_emoticon' alt='B)' />{

	    int x = 0;
	    int y = 0;
	    int z = 0;

	    while (x<fi.length&&y<se.length) {

		    if (fi[x]<se[y]) {
			    b[z] = fi[x];
			    x++;
		    } else {
			    b[z] = se[y];
			    y++;
		    }
		    z++;
	    }
	    for (int i = x; i < fi.length; i++) {
		    b[z] = fi[i];
		    z++;
	    }
	    for (int i = y; i < se.length; i++) {
		    b[z] = se[i];
		    z++;
	    }

    }

    public static void main(String[] args) {

	    System.out.println("Before merge sort");

	    for (int i = 0; i < number.length; i++) {
		    System.out.print(number[i] + " ");
	    }

	    array1 = number;
	    sort(number);
	    System.out.println("After merge sort");
	    for (int i = 0; i < number.length; i++) {
		    System.out.print(number[i] + " ");

	    }
    }
}

ลองดูครับ :lol:
We love fender.

#21 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 14:03

ขอบคุณอย่างใหญ่หลวง ครับท่าน phoosana จริงอย่างท่านว่าเลย ผมแก้ไปแก้มา สุดท้าย ไม่ได้ใช้ตัวที่สร้างใน parameter เลย ผิดพลาดอย่างแรง

และที่ผมไม่ได้ เพิ่ม ตัวเชื่อมใน method merge ทั้งที่ควรทำ เพราะมัวไปยึดรูปแบบ method merge เดิม ของเจ้าของ code นั่นเอง

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#22 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 15:47

ครับ ที่ถามเผื่อยังไม่มี ถ้ามีอะไรสงสัยก็ถามมาได้ หรือหลังไมล์มาก็ได้ครับ


วันนี้ รบกวน ถี่เลยครับ อีก code นะครับ

public class testquick {
static int[] number = { 6, 5, 3, 1, 8, 7, 2, 4};
static int partition(int[]numb,int lo,int hi){
int low = lo;
int high = hi;
int middle = numb[(low+high)/2];

while (low<=high) {
while (numb[low] < middle) {
low++;
}
while (numb[high]>middle) {
high--;
}
if (low<=high) {
int temp = numb[low];
numb[low] = numb[high];
numb[high] = temp;
low++;
high--;
}
}


return low;
}
static void quicksort(int[]array,int low,int high){
int lo = low;
int hi = high;
int middle = partition(array, lo, hi);
if (lo<middle-1) {
quicksort(array, lo, middle-1);
}
if (middle<hi) {
quicksort(array, middle, hi);
}
}
public static void main(String[] args) {
System.out.println("Before quick sort");
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
quicksort(number,0,number.length-1);
System.out.println("After quick sort");
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
}
}

ตรงนี้ ผมมีข้อสงสัย คือ ทำไม ตรงเงื่อนไข while (low<=high) และตรงเงื่อนไข if(low<=high)
คือ ทำไมมันต้องมี = ต่อด้วยครับ ทำไมมันไม่ใช้ < แค่อย่างเดียว พอผมไปลบเท่ากับออก ก็ stackoverflow อีกแล้ว
ทั้งที่คิดตามหลักทั่วไป ถ้าจะมีการทำงาน กับสองสิ่ง มันไม่น่าจะเป็นตัวเดียวกันได้เลย น่าจะแค่ มากกว่า หรือ น้อยกว่า เออ ถ้าเป็น >= 0 หรือ <= element สุดท้าย อันนี้ ก็พอเข้าใจได้

ผมไม่ทราบ เหตุผลจริง ๆ ครับ ว่า low กับ high ทำไม ถ้า = คือ เท่ากันแล้ว ทำไมยังต้องเข้ามาทำงานอีก

Edited by ทรงธรรม, 31 ตุลาคม พ.ศ. 2555 - 15:53.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#23 Gop

Gop

    สมาชิกขั้นสูง

  • Members
  • PipPipPipPip
  • 4,450 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 20:36

แวะเข้ามาให้กำลังใจคุณทรงธรรมครับ เสียดายเรื่องพวกนี้ผมไม่ถนัดเลย สู้ๆนะครับ คุณทำได้แน่

หลักฐานไม่เคยโกหก (Gilbert Grissom C.S.I.)<p>Beneath this mask there is more than flesh. Beneath this mask there is an idea, Mr. Creedy, and ideas are bulletproof.

 


#24 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 31 ตุลาคม พ.ศ. 2555 - 22:32

	    while (low<=high) {
		    while (numb[low] < middle) {
			    low++;
		    }
		    while (numb[high] > middle) {
			    high--;
		    }
		    if (low <= high) {
			    System.out.println(low + " " + high );
			    int temp = numb[low];
			    numb[low] = numb[high];
			    numb[high] = temp;
			    low++;
			    high--;
		    }
	    }

จะเกิดอะไรขึ้นเมื่อ low = high ซึ่งมีโอกาสจะเกิดขึ้นได้
ในเงื่อนไข if มีการเช็คเงื่อนไข <= หากใช้ < เพราะคิดว่าน่าจะแค่นี้ก็พอ
ก็จะกลายเป็นว่า ไม่มีการ เพิ่มค่าให้ low และลดค่าให้ high
พอวนไปเช็คเงื่อนไขที่ลูป while(low <= high)
ก็จะวนอยู่อย่างนั้นกลายเป็นลูปอมตะ
We love fender.

#25 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 1 พฤศจิกายน พ.ศ. 2555 - 01:01

ตัวอย่าง
numb = {1, 2, 3, 4, 8, 7, 6, 5} หรือ เลขที่น้อยกว่า 4 มาอยู่ฝั่งซ้ายทั้งหมด เลขที่มากกว่า 4 ไปอยู่ทางขวาทั้งหมด
low = 0
high = 7
middle = numb[(0+7)/2)] = numb[3] ซึ่งมีค่า = 4 (นับจาก 0 ไปถึง 3)

while (low<=high) {
while (numb[low] < middle) {
low++;
}
//วนลูปตั้งแต่ low=0 ถึง low= 2 เพราะ numb[0] ถึง numb[2] มีค่าน้อยกว่า middle จนรอบที่ low=3 จึงออกจากลูป

while (numb[high] > middle) {
high--;
}
//วนลูปตั้งแต่ high=7 ถึง high = 4 เพราะ numb[7] ถึง numb[4] มีค่ามากกว่า middle จนรอบที่ high=3 จึงออกจากลูป

if (low <= high) { //low = high = 3
int temp = numb[low];
numb[low] = numb[high];
numb[high] = temp;
low++;
high--;
} //low = 4, high = 2
}
//ออกจากลูป return ค่า low = 4

Edited by phoosana, 1 พฤศจิกายน พ.ศ. 2555 - 01:18.

We love fender.

#26 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 1 พฤศจิกายน พ.ศ. 2555 - 02:14

ในส่วน while( low <= high)
ทำไมไม่เขียน while(low < high)
ลองข้อมูลหลายๆ แบบดูจะพบว่าการจัดเรียงผิดพลาด

เช่น number = {1, 2, 3, 4, 4, 3, 2, 1}
ผลลัพธ์ออกมาเป็น
number = {1, 2, 2, 1, 3, 3, 4, 4}
We love fender.

#27 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 1 พฤศจิกายน พ.ศ. 2555 - 06:55

ขอบคุณท่าน phoosana ครับ กระจ่างแจ้งมากเลยเรื่อง if

ส่วนเรื่อง while ที่ท่านว่า ทำให้การจัดเรียงตัวเลขผิดพลาดนั้น เมื่อคืนวาน ผมลองไปนอนคิดดูแล้ว การหา element ที่เป็นกลางจริง ๆ เพื่อเป็น partition นั้น ก็จำเป็นต้องกำหนด ให้ while (low<=high) จริง ๆ
เพราะถ้าในกรณี { 1, 2, 3, 4, 5, 6, 7, 8} อย่างที่ท่านทำให้ดู low กับ high จะไม่เท่ากันที่ element 3 ดังนั้น ค่า low ที่ return ออกมา เพื่อเป็น partition ก็จะไม่เท่ากับ element 4 ซึ่งพอไปใช้ใน method quicksort แล้ว ค่า middle จะไม่เป็นตรงกลางอย่างแท้จริง คือเป็น element 3 แทนที่จะเป็น element 4 และค่า middle-1 ก็จะเป็น element 2 ไม่ใช่ element 3 ซึ่งนั่นเองทำให้ ค่าออกมาผิดพลาด

ผมผิดพลาดจริง ที่ไม่ดู ความต้องการที่แท้จริงของ การหาค่า partition จึงตีความ while(low<=high) ผิดไป

Edited by ทรงธรรม, 1 พฤศจิกายน พ.ศ. 2555 - 07:20.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#28 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 7 พฤศจิกายน พ.ศ. 2555 - 08:51

ครับ ที่ถามเผื่อยังไม่มี ถ้ามีอะไรสงสัยก็ถามมาได้ หรือหลังไมล์มาก็ได้ครับ


มีปัญหาใหม่ มาอีกแล้วครับ ท่าน
package phase4;
public class HeapSort {
private static int[] a;
private static int n;
private static int left;
private static int right;
private static int largest;

public static void buildheap(int []a){
	 n=a.length-1;
	 for(int i=n/2;i>=0;i--){
		 maxheap(a,i);
	 }
}

public static void maxheap(int[] a, int i){
	 left=2*i;
	 right=2*i+1;
	 if(left <= n && a[left] > a[i]){
		 largest=left;
	 }
	 else{
		 largest=i;
	 }
	
	 if(right <= n && a[right] > a[largest]){
		 largest=right;
	 }
	 if(largest!=i){
		 exchange(i,largest);
		 maxheap(a, largest);
	 }
}

public static void exchange(int i, int j){
	 int t=a[i];
	 a[i]=a[j];
	 a[j]=t;
	 }

public static void sort(int []a0){
	 a=a0;
	 buildheap(a);
	
	 for(int i=n;i>0;i--){
		 exchange(0, i);
		 n=n-1;
		 maxheap(a, 0);
	 }
}

public static void main(String[] args) {
	 int []a1={4,1,3,2,16,9,10,14,8,7};
	 sort(a1);
	 for(int i=0;i<a1.length;i++){
		 System.out.print(a1[i] + " ");
	 }
}
}

จุดที่ผมสงสัยนะครับ คือ ตอนที่เราสร้าง (build heap) นั้น เราได้ค่า i มาจาก n/2 แล้วลดลงที่ละหนึ่ง คือ
4.5 ค่า left = 9 right = null i ไปดึงมาจาก index ที่ 4
3.5 ค่า left = 7 right = 8 i ไปดึงมาจาก index ที่ 3
2.5 ค่า left = 5 right = 6 i ไปดึงมาจาก index ที่ 2
1.5 ค่า left = 3 right = 4 i ไปดึงมาจาก index ที่ 1
0.5 ค่า left = 1 right = 2 i ไปดึงมาจาก index ที่ 0

Edited by ทรงธรรม, 7 พฤศจิกายน พ.ศ. 2555 - 08:59.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#29 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 7 พฤศจิกายน พ.ศ. 2555 - 08:58

ต่อนะครับ จุดที่ผม สงสัยคือ ตอนที่อยู่ที่ method sort นั้น หลังจากที่ exchange 0 และ i ไปแล้ว
ได้ทำการเรียกใช้ method maxheap อีกรอบ โดย กำหนด (a , 0) นั้น ทำให้ผมงงครับ เพราะถ้า กำหนด ให้ i เป็น 0 แต่แรก (อ้างอิงจาก parameter ใน method maxheap) แล้ว พอไปเข้าเงื่อนไข ตั้งค่า left แล้ว

left ควรจะเป็น 0 แล้ว right ควรจะเป็น 1 แต่ถ้าดูจากข้อมูลที่ผมลองทำแล้ว
ถ้าให้ left เป็น 0 แล้ว right เป็น 1 จะไม่สามารถเรียงลำดับได้ถูกต้อง

ถ้าจะให้ถูก ต้องเทียบ i = 0 left = 1 right = 2 ซึ่งอ้างอิงตาม heap ที่ถูก build ขึ้นจาก method buildheap จึงจะเรียงลำดับได้ถูกต้อง

แต่ถ้า i = 0 แล้ว left เป็น 1 ได้อย่างไร ไม่ขัดกับ code ที่ว่า left = 2 * i หรอกหรือ

ช่วยไขความกระจ่างทีครับ

Edited by ทรงธรรม, 7 พฤศจิกายน พ.ศ. 2555 - 09:04.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#30 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 7 พฤศจิกายน พ.ศ. 2555 - 09:07

อีกหนึ่งข้อ นะท่าน

package phase4;

import java.lang.*;
import java.io.*;
public class RadixSort{
	 public static void radixSort(int[] arr){
		 if(arr.length == 0)
			 return;
		 int[][] np = new int[arr.length][2];
		 int[] q = new int[0x100];
		 int i,j,k,l,f = 0;
		 for(k=0;k<4;k++){
			 for(i=0;i<(np.length-1);i++)
				 np[i][1] = i+1;
			 np[i][1] = -1;
			 for(i=0;i<q.length;i++)
				 q[i] = -1;
			 for(f=i=0;i<arr.length;i++){
				 j = ((0xFF<<(k<<3))&arr[i])>>(k<<3);
				 if(q[j] == -1)
					 l = q[j] = f;
				 else{
					 l = q[j];
					 while(np[l][1] != -1)
						 l = np[l][1];
					 np[l][1] = f;
					 l = np[l][1];
				 }
				 f = np[f][1];
				 np[l][0] = arr[i];
				 np[l][1] = -1;
			 }
			 for(l=q[i=j=0];i<0x100;i++)
				 for(l=q[i];l!=-1;l=np[l][1])
						 arr[j++] = np[l][0];
		 }
	 }
	 public static void main(String[] args){
		 int i;
		 int[] arr = new int[15];
		 System.out.print("original: ");
		 for(i=0;i<arr.length;i++){
			 arr[i] = (int)(Math.random() * 1024);
			 System.out.print(arr[i] + " ");
		 }
		 radixSort(arr);
		 System.out.print("\nsorted: ");
		 for(i=0;i<arr.length;i++)
			 System.out.print(arr[i] + " ");
		 System.out.println("\nDone ;-)");
	 }
}


class นี้เป็นอะไรที่งง มากครับ เริ่มจากบรรทัดที่
int[] q = new int[0x100];
0x100 มันหมายความว่าไงครับ

j = ((0xFF<<(k<<3))&arr[i])>>(k<<3);

อันนี้งงที่สุด ผมลองหาความหมายของ shift left กับ shift right มาแล้ว

Edited by ทรงธรรม, 7 พฤศจิกายน พ.ศ. 2555 - 09:09.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#31 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 7 พฤศจิกายน พ.ศ. 2555 - 09:19

ต่อนะครับ ท่าน
คือ shift left เท่ากับ ขยับค่าหลัก ของเลขฐานไปทางบวก N หลัก (k<<3) ก็น่าจะเป็น ขยับค่าของเลขฐาน k ไปทางบวก 3 หลัก
แต่ที่ไม่เข้าใจคือ k เป็นเลขฐานอะไร มันมีทั้ง ฐานสอง,ฐานแปด,ฐานสิบ และ ฐานสิบหก เลยขยับไม่ถูก
แล้ว 0xFF คือเลขฐานสิบหกหรือเปล่าครับ แล้วเกี่ยวอะไรกับ k ด้วย

แล้วสมมติถ้า k เป็นเลขฐานสอง k ขยับไปสาม เท่ากับ k * 8 ใช่หรือไม่

แล้วตัว bit wise & นี่อีก ผมไปดูความหมายมา คือจะจับเฉพาะหลักที่เหมือนกัน ของเลขฐาน 2 ตัว ในที่นี้ต้องเป็นเมื่อเทียบกับ
(0xFF<<(k<<3)) ตัวหนึ่ง และ array[i] ตัวหนึ่ง ใช่หรือไม่ครับ

แล้วใช้เลขฐานอะไรก็ไม่รู้ อีกแล้ว

ก่อนจะไป shift right คือ ขยับไปทางลบ ด้วย (k<<3)

เรียกว่า งง กันสุด ๆ เลยครับ

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#32 NightMare

NightMare

    พอจะทนแดงได้จิ๊ดๆ

  • Members
  • PipPipPip
  • 849 posts

ตอบ 19 มกราคม พ.ศ. 2556 - 01:15

ฮ่าๆ แค่อ่านก็ปวดหัว ถึงกับขยับบิตกันเลยวุ๊ยส์ คุณทรงธรรมจะเอาไปทำอะไรกันครับเนี่ย ???


เมื่อน้ำค้างหยดหล่นบนดอกไม้

ลมรำเพยระเหยหายเมื่อใกล้สาง

กับชีวิตวันนี้ที่บอบบาง

เหมือนน้ำค้างระเหยหายด้วยสายลม

~¤ สนธิกาญจน์ กาญจนาสน์ ¤~


#33 NightMare

NightMare

    พอจะทนแดงได้จิ๊ดๆ

  • Members
  • PipPipPip
  • 849 posts

ตอบ 19 มกราคม พ.ศ. 2556 - 01:17

ปล. ถ้าตอบคำถามเจ้าของกระทู้ web java ในไทยก็ นาริสา ล่ะครับ ผมคิดว่างั้นนะ  ^_^


เมื่อน้ำค้างหยดหล่นบนดอกไม้

ลมรำเพยระเหยหายเมื่อใกล้สาง

กับชีวิตวันนี้ที่บอบบาง

เหมือนน้ำค้างระเหยหายด้วยสายลม

~¤ สนธิกาญจน์ กาญจนาสน์ ¤~





ผู้ใช้ 1 ท่านกำลังอ่านกระทู้นี้

สมาชิก 0 ท่าน, ผู้เยี่ยมชมทั่วไป 1 ท่าน และไม่เปิดเผยตัวตน 0 ท่าน