ภาษา C ขอแจม...ครับ (Data Structure) ใครพอจะเทพ ภาษา C บ้างครับ แบบ...
งง ครับ แบบไรหรอ อ้อ..ไม่เก่ง ไม่เทพอ่ะครับ
Date :
2009-12-04 16:15:32
By :
panyapol
แบบ Advance ๆ นะครับ ????
Date :
2009-12-04 16:28:59
By :
t-monroe
www.thaidev.com ครับ ที่นี่ เมพมาก เรื่อง C
Date :
2009-12-04 16:47:56
By :
deawx
ถามหาอาจารย์นิรุจ เลยครับ ใน ThaiDev.com
Date :
2009-12-04 20:57:41
By :
panyapol
สอบถามอะไรหรอครับผมพอเก่งอยู่บ้าง
Date :
2009-12-05 00:06:14
By :
stepby
ก็ได้น่ะ ถ้ายังจำได้อยู่ อิอิ
ปล. ถ้าไม่ถามมา ก็บอกไม่ได้หรอกว่าตอบได้เปล่า
Date :
2009-12-05 02:22:44
By :
xbeginner01
Pre: ไม่มี
Post: มีคิวว่างเกิดขึ้น
Enqueue (E : StdElement)
Pre: คิวยังไม่เต็ม
Post: คิวจะมี E เป็นสมาชิกล่าสุดของคิว และ E จะถูกใส่ลงในท้ายคิว (tail)
Serve (VAR E : StdElement)
Pre: คิวต้องไม่ว่าง
Post: E เป็นสมาชิกแรกสุด (head) ของ Q-pre คิวหลังการดำเนินงานหรือ Q-post จะไม่มี E เป็นสมาชิกอีก
ต่อไป
Empty : boolean
Pre: ไม่มี
Post: ถ้า คิวไม่มีสมาชิกอยู่เลย แล้ว Empty จะเป็นจริง ไม่เช่นนั้น Empty จะเป็นเท็จ
Full : boolean
Pre: ไม่มี
Post: ถ้า คิวมีสมาชิกเต็ม แล้ว Full จะเป็นจริง ไม่เช่นนั้น Full จะเป็นเท็จ
Clear
Pre: ไม่มี
Post: คิวจะเป็นคิวว่าง
Length : Integer
Pre: ไม่มี
Post: Length จะเป็นจำนวนสมาชิกในคิว
****************************
1. เห็นได้ว่ามีการกำหนดขนาดของ Queue ให้เท่ากับ 10 จงสร้างเมนูที่ 5 เพื่อกำหนด
ขนาดของQueue ตามที่ User ต้องการ
2. จงนำข้อมูลที่ถูกเก็บใน Queue ออกมาคำนวณหาค่าเฉลี่ยของแต่ละวิชา กำหนดให้
สร้างเป็นเมนูที่ 6
3. จงสร้าง Queue แบบ วงกลม
******************************************************
ขอบคุณครับ
== Code ==
// ภาษา C ครับ
...
#define MAX 10
typedef enum Bool{false=0, true=1} TBool;
struct StdElement{
int id;
char name[10];
int math,stat,com;
};
TBool IsEmpty(int,int);
TBool IsFull(int,int);
void EnQueue(struct StdElement *, struct StdElement, int *);
void DeQueue(struct StdElement *, struct StdElement, int *);
char ShowMenu(void);
void ShowData(struct StdElement *, int, int, int);
int main(){
struct StdElement *QUEUE,tmp;
char choice;
int head, tail;
head=tail=1;
while((choice=ShowMenu()) != '9'){
switch(choice){
case '1' :
if(IsFull(tail,MAX) != true){
printf("\nEnter ID : "),scanf("%d",&tmp.id);
printf("Enter Name : "),scanf("%s",&tmp.name);
printf("Enter Math Score : "),scanf("%d",&tmp.math);
printf("Enter Stat Score : "),scanf("%d",&tmp.stat);
printf("Enter Comp Score : "),scanf("%s",&tmp.com);
EnQueue(QUEUE,tmp,&tail);
printf("\nInsert Data comlete !");
ShowData(QUEUE,head,tail,MAX);
}else{
printf("\n\nStack Full !!!");
}
getch();
break;
case '2':
if(IsEmpty(head,tail) != true){
DeQueue(QUEUE,tmp,&head);
printf("\n\nRetvie data is : %d,%s,%d,%d,%d\n\n",tmp.id,tmp.name,tmp.math,tmp.stat,tmp.com);
}else{
printf("\n\nCan't retrive data,Stack was empty !!!");
}
ShowData(QUEUE,head,tail,MAX);
getch();
break;
case '3':
ShowData(QUEUE,head,tail,MAX);
getch();
break;
case '4':
printf("\n\nPlease select 1,2,3,4 or 9 only !!!\n");
printf("\n\nQueue was clear.\n\n");
ShowData(QUEUE,head,tail,MAX);
getch();
break;
/* case '5':
printf("\nEnter number of Queue :"),scanf("%d",MAX);
printf("\nSave Number success !\n");
getch();
break;
*/
default:
printf("\n\nPlease select 1,2,3,4 or 9 Only !!!\n");
getch();
}
}
return 0;
}
TBool IsFull(int tail, int max){
if(tail == max-1)
return true;
else
return false;
}
TBool IsEmpty(int head, int tail){
if(head == tail)
return true;
else
return false;
}
void EnQueue(struct StdElement *queue, struct StdElement tmp, int *tail){
*tail = *tail+1;
queue[*tail] = tmp;
}
void DeQueue(struct StdElement *queue, struct StdElement tmp, int *tail){
*tail = *tail+1;
queue[*tail] = tmp;
}
char ShowMenu(void){
clrscr();
printf("***************************************************\n");
printf("**************** Using Queue ********************\n");
printf("***************************************************\n");
printf("1.Enqueue Data\n");
printf("2.Dequeue Data\n");
printf("3.Show Queue\n");
printf("4.Clear Queue\n");
printf("5.Insert Number Queue\n");
printf("9.Quit\n");
printf("***************************************************\n");
printf("Please select 1,2,3,4 or 9 only :\n");
printf("***************************************************\n");
printf("Please select choice : ");
return getche();
}
void ShowData(struct StdElement *queue, int head, int tail, int max){
int idx;
if(head == tail)
printf("\n\nQueue is Empty !!!\n");
printf("\n===================================================\n");
printf("\n========== Current Student Data in Queue =========\n");
printf("\n===================================================\n");
for(idx=0;idx<max;idx++){
if(idx>head && idx<=tail && head != tail)
printf("\n=->= %-5d%-10s%5d%5d%5d =",queue[idx].id,queue[idx].name,queue[idx].math,queue[idx].stat,queue[idx].com);
}
printf("\n===================================================\n");
printf("\n=================== End of Queue =================\n");
printf("\n===================================================\n");
}
Date :
2009-12-09 09:34:03
By :
t-monroe
วาน พี่ๆ หน่อยก้าบบบ... T^T
Date :
2009-12-09 16:05:55
By :
t-monroe
เงียบจังน้อ.....
Date :
2009-12-10 23:12:00
By :
t-monroe
เข้าคิวเหรอคับ
พอดีไม่เคยเขียน c: ก็งงๆ และไม่ได้เรียน ทฤษฏีคิว กะเขา แต่เข้าคิวเป็นนะ
เขียนให้ง่ายๆ กว่านี้ไม่ได้เรอะ
Date :
2009-12-11 00:03:13
By :
pjgunner
อะไร pre อะไร post ม่ายเข้าใจ แต่ข้อ1 พอจะช่วยมั่วๆ ได้
Code
int NEW_MAX=MAX;
int main(){
struct StdElement *QUEUE,tmp;
char choice;
int head, tail;
head=tail=1;
while((choice=ShowMenu()) != '9'){
#undef MAX
#define MAX NEW_MAX
switch(choice){
case '1' :
if(IsFull(tail,MAX) != true){
printf("\nEnter ID : "),scanf("%d",&tmp.id);
printf("Enter Name : "),scanf("%s",&tmp.name);
printf("Enter Math Score : "),scanf("%d",&tmp.math);
printf("Enter Stat Score : "),scanf("%d",&tmp.stat);
printf("Enter Comp Score : "),scanf("%s",&tmp.com);
EnQueue(QUEUE,tmp,&tail);
printf("\nInsert Data comlete !");
ShowData(QUEUE,head,tail,MAX);
}else{
printf("\n\nStack Full !!!");
}
getch();
break;
case '2':
if(IsEmpty(head,tail) != true){
DeQueue(QUEUE,tmp,&head);
printf("\n\nRetvie data is : %d,%s,%d,%d,%d\n\n",tmp.id,tmp.name,tmp.math,tmp.stat,tmp.com);
}else{
printf("\n\nCan't retrive data,Stack was empty !!!");
}
ShowData(QUEUE,head,tail,MAX);
getch();
break;
case '3':
ShowData(QUEUE,head,tail,MAX);
getch();
break;
case '4':
printf("\n\nPlease select 1,2,3,4 or 9 only !!!\n");
printf("\n\nQueue was clear.\n\n");
ShowData(QUEUE,head,tail,MAX);
getch();
break;
case '5':
printf("\nEnter number of Queue :"),scanf("%d",&NEW_MAX );
printf("\nSave Number success !\n");
getch();
break;
default:
printf("\n\nPlease select 1,2,3,4 or 9 Only !!!\n");
getch();
}
}
return 0;
}
ส่วนข้อ2 คิดว่าไม่น่ายากดึงข้อมูลทั้งหมดมาบวกกันแล้วหารกับจำนวน ลองๆทำดูน่ะ (ถ้าว่างอาจจะลองทำให้ แต่คงไม่ว่าง แง่มๆ)
ส่วนข้อ 3 วงกลมคือไรว๊า... ต่างกับวงรีป่ะ *.* อันนี้ไม่เข้าใจ
Date :
2009-12-11 05:29:12
By :
xbeginner01
ขอบคุณครับ.....
ข้อ 3. คือปกติแล้วการเก็บข้อมูลจะเรียงตามลำดับของอาเรย์ สมมุติ arr[1,2,3,4,5,6,7,8,9,10] พอเก็บถึง 8 ก็ยังเก็บได้อีกคือ 9,10 พอเก็บถึง 10 ก็เต็ม
ถ้าเรา ถ้าเรา กด 2 (DeQueue ออก)ข้อมูลในอาเรย์ ตั้ว ที่ 1 ก็จะหายไป กดอีกที ตัวที่ 2 ก็หายไป จะมีคิวว่างอยู่ คิวที่ 1,2 ปกติแล้วเราจะใส่ข้อมูลเพิ่มไม่ได้ เนื่องจากข้อมูลใส่ถึง MAX แล้ว แต่ก็ยังมีคิวว่างอยู่ 1,2 เราต้องการ ใส่ข้อมูลเข้ามา(แทรกเข้า 1,2) โดยที่ข้อมูล ส่วนอื่นก็ยังเหมือนเกิม ถ้าไม่มีการ DeQueue ออก ถ้าข้อมูลในอาเรย์ตัวไหนถูกเอาออกไปก็สามารถรับค่าเข้ามาไว้จนเต็มอีกได้
เป็น Stact ที่สามารถรับข้อมูล ได้เหมือนวงกลมครับ คือ วนกลับรับค่าใหม่ในอาเรย์ตัวที่ยังว่างอยู่ เช่น อาเรย์ ที่ 6,7,8,9,10 มีข้อมูล เราต้องการใส่ข้อมูล
เพิ่มที่ 1,2,3,4,5 ตามลำดับครับ ถ้าเกิดคิวของอาเรย์ EnQueue DeQueue อยู่ตำแหน่งเดียวกัน ก็แสดงว่าในสแต็คมีข้อมูลเต็ม 1-10
รบกวนหน่อยนะครับ....ขอบคุณครับ
Date :
2009-12-11 10:14:52
By :
t-monroe
เอ่อ คิว มันต้องเรียงกันไม่ใช่เหรอคับ ตามที่อธิบาย เหมือน เป็นที่เก็บหนังสือเฉยๆ ถ้า 1-5 ว่าง ใส่ มามันต้องหลัง สิบไม่ใช่เหรอ คือเลือนลงมาอ่ะ ปรกติ คิดว่า มันต้องเลื่อนทีละอันนะ คงไม่ใช่ stack(FILO)
หรือว่าลัดคิวได้
Date :
2009-12-11 10:46:56
By :
pjgunner
คับ คือตอนแรก EnQueue() คงได้ null ก่อน ส่วน DeQueue() คงได้ (1 ตำแหน่งแรก 1เบส หรือจะเอา 0)
ถ้าหากว่า ใส่ ด้วย EnQueue() จะได้ 1(1เบส) ตำแหน่งว่างเป็น 2
จากโค้ดที่มี ไม่ได้มีเมธอด ดึงคิวทิ้ง (remove(), หรื pull()) ดังนั้น ถ้าหากเต็มแล้วก็ใส่ไม่ได้ ควรมีเมนูลบทิ้งหรืออย่างไร ถ้าหากลบคิวทิ้งได้ ต้องลบจากตำแหน่งไหนก่อน(หรือตำแหน่งที่ Enqueue())
แล้วเรื่องกำหนดจำนวน คิว Max นั้น ทำได้ครั้งแรก หรือปรับเปลี่ยนได้ตลอดเวลา
ใช้ตัววิ่ง สองตัวนี่มัน โอเวอร์โฟลวจริงๆ (เต็มแล้ว de กะ en เท่ากัน หาให้รันคิว ก็ต้องถูกดึงออกไป ตัวชี้ Enque ต้องวิ่งไปตำแหน่งแรก dequeue ต้องวิ่งขึ้นบอกตำแหน่ง ที่มีอยู่)
เวลาเอาคิวไปใช้เขาใช้ยังไงเหรอ
Date :
2009-12-11 12:38:49
By :
pjgunner
อ่อมันคือ queue คิวนี้เอง 55+ นึกออกแหล่ะครับ เราก็เคยเรียนนี้น่า
Date :
2009-12-11 13:23:08
By :
xbeginner01
ผมว่าโค้ดน่าจะมีปัญหานะครับเพราะไม่ได้ใช้ malloc ช่วยจองพื้นที่
Date :
2009-12-11 18:14:11
By :
sss
เงียบจัง...น้อ
Date :
2009-12-16 17:06:32
By :
t-monroe
ตัวแปร pointer เป็นตัวแปรที่เก็บค่า address เท่านั้นครับ
ถ้าไม่ใช้ malloc จองพื้นที่ และตรวจสอบค่าว่ามีพื้นที่ว่างพอหรือเปล่า อาจจะไปคาบเกี่ยวกับตัวแปรอื่นๆ ได้ครับ
นอกจาก compiler เว้นช่วงพื้นที่ตัวแปรไว้เยอะก็ไม่ชนกันครับ
Date :
2009-12-16 17:17:24
By :
num
ดีค่ะ อยากทราบว่าโค้ดภาษาซีที่เขียนรูปวงกลม คือรัยค่ะ ใช้ลูปฟอร์นะค่ะ ช่วยด้วยค่ะ คิดไม่ออก..
ขอบคุณคร้า
Date :
2009-12-18 00:34:54
By :
รักเทอไม่มีวันหยุด
Load balance : Server 05