ABA


"בניית מערך תור ב-C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #8866 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 8866
BlackShadow
חבר מתאריך 1.7.02
271 הודעות
   13:45   18.01.03   
אל הפורום  
  בניית מערך תור ב-C  
 
מחסנית הצלחתי לבנות ללא כל בעיה. מה שאני צריך עכשיו שזה קצת בעייתי, זה לבנות פונקציה של תור (מערך בן 20 תאים לדוגמא). פונקציה אחת (PUSH) מקבלת מספר, דוחפת לתור ומחזירה 0/1 האם הצליחה או לא. פונקציה שניה (POP) מקבלת פוינטר של משתנה אליו יוצב המספר הבא בתור ומחזירה 0/1 האם הצליחה או לא.
כל הבעייתיות בנושא זה שהתור צריך להיות אינסופי ובנוי בצורת FIFO.


אשמח לעזרה.

נ.ב התוכנית צריכה להיות ב-C ולא ב-C++ ככה שאפשר לשכוח ממשתנה בוליאני.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אם אינסופי, אתה חייב להקצות זכרון דינאמית dryice 18.01.03 14:19 1
     צריך אינסופי BlackShadow 18.01.03 14:30 2
         מערך ואינסופי לא עובד ביחד, כי הרי המערך סופי dryice 18.01.03 14:36 3
             ידוע.... BlackShadow 18.01.03 15:31 4
                 אז הוא לא אינסופי, הוא מחזורי! dryice 18.01.03 17:34 5
                     לא השתמשת בכלל בפונקציות של תור GK2k 18.01.03 18:23 6
                         נו באמת, תשנה את השמות של הפונקציות dryice 18.01.03 19:34 7
                             אני סתם הערתי חשבתי שאולי לא שמת לב GK2k 24.01.03 19:43 10
                     תודה, BlackShadow 19.01.03 23:20 8
  יש גרסה סופית BlackShadow 22.01.03 19:16 9

       
dryice

   14:19   18.01.03   
אל הפורום  
  1. אם אינסופי, אתה חייב להקצות זכרון דינאמית  
בתגובה להודעה מספר 0
 
   למשל ברשימה מקושרת, ולשמור מצביע לתחילת התור, לצורך הכנסה,
ומצביע לסוף לצורך הוצאה.
אתה עושה את הרשימה דו כיוונית, בשביל שתוכל לקדם אחורנית את המצביע
בעת הוצאה מהתור.

אם מספיק לך אורך סופי, אתה יכול במערך ואז אתה מחזיק שני אינדקסים,
אחד מאיפה אתה מכניס ושני מאיפה אתה מוציא, ונותן להם להתקדם בכיוונים
מנוגדים באופן ציקלי, על גבי מערך סופי. אם אינדקס ההוצאה פוגש
את אינדקס ההכנסה התור ריק, אם אינדקס ההכנסה פוגש את אינדקס ההוצאה
התור מלא לחלוטין, ולא ניתן להכניס עוד איברים.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
BlackShadow
חבר מתאריך 1.7.02
271 הודעות
   14:30   18.01.03   
אל הפורום  
  2. צריך אינסופי  
בתגובה להודעה מספר 1
 
עבר עריכה לאחרונה בתאריך 18.01.03 בשעה 14:31
 
אני צריך את התור אינסופי. אני יודע שצריך להשתמש בשני אינדיקטורים להתחלה ולסוף. השאלה איך לדאוג שהם לא יפגשו ואיך לדאוג שברגע שהאינדיקטור לתחילת התור מגיע לסוף המערך שיעבור להתחלה שלו להמשך הצבה.
כל הבעייתיות בנושא זה לפי איזו חוקיות לעשות את התור.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   14:36   18.01.03   
אל הפורום  
  3. מערך ואינסופי לא עובד ביחד, כי הרי המערך סופי  
בתגובה להודעה מספר 2
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
BlackShadow
חבר מתאריך 1.7.02
271 הודעות
   15:31   18.01.03   
אל הפורום  
  4. ידוע....  
בתגובה להודעה מספר 3
 
כל החכמה בנושא וכל הבעייתיות זה לגרום לזה שיהיה אינסופי (כמובן ברגע שהוא מלא לא להציב מספרים יותר). כל החכמה זה שברגע שהאינדיקטור המצביע על המקום אליו צריך להציב מספר, מגיע לסוף המערך, הוא בודק בתחילת המערך האם פנוי ואם כן ממשיך לשם עד שמגיע לאינדקטור אשר מצביע לסוף המערך.

הדבר בר ביצוע, השאלה לפי איזו חוקיות. מתישהוא אני אפתור את זה ואשים את התשובה כאן.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   17:34   18.01.03   
אל הפורום  
  5. אז הוא לא אינסופי, הוא מחזורי!  
בתגובה להודעה מספר 4
 
  

#define N 100
int arr[N];
int insert=0,remove=0,count=0;

int insert(int x)
{
if (count>=N) return FAIL;
arr[insert--]=x;
insert%=N;
count++;
return SUCCESS;
}

int remove()
{
int x;
if (count==0) return FAIL;
x=arr[remove--];
remove%=N;
return x;
}


DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GK2k

   18:23   18.01.03   
אל הפורום  
  6. לא השתמשת בכלל בפונקציות של תור  
בתגובה להודעה מספר 5
 
   זאת אומרת לא השתמשת בתור


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   19:34   18.01.03   
אל הפורום  
  7. נו באמת, תשנה את השמות של הפונקציות  
בתגובה להודעה מספר 6
 
   ל insert תקרא push
ול remove תקרא pop

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GK2k

   19:43   24.01.03   
אל הפורום  
  10. אני סתם הערתי חשבתי שאולי לא שמת לב  
בתגובה להודעה מספר 7
 
   וכדי שה"חבר" שביקש את התשובה לא יתבלבל גם


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
BlackShadow
חבר מתאריך 1.7.02
271 הודעות
   23:20   19.01.03   
אל הפורום  
  8. תודה,  
בתגובה להודעה מספר 5
 
אני אבדוק את זה ואעשה את השיפוצים שדרושים לי (כמו לדוגמא ש-POP צריך לקבל פוינטר) אבל זה כבר בקטנה. תודה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
BlackShadow
חבר מתאריך 1.7.02
271 הודעות
   19:16   22.01.03   
אל הפורום  
  9. יש גרסה סופית  
בתגובה להודעה מספר 0
 
עבר עריכה לאחרונה בתאריך 22.01.03 בשעה 19:17
 
תודה לכל המנסים לעזור אך הסתדרתי לבסוף לבד. מדובר על 2 פונקציות (insert, remove) שעושות את המשיכה וההצבה, וכל היתרון הוא שכל עוד המערך לא מלא זה ממשיך לנצח (ברור שצריך לשלוף מדי פעם מהמערך).


int const MAX=10;
int iQueue;
int iEnd=0, iBegin=0;

int insert (int iNum)
{

if (iEnd==iBegin-1 || (iEnd==MAX-1 && iBegin==0))
return 0;
else
iQueue=iNum;
if (iEnd==(MAX-1))
iEnd=0;
else
if (iEnd!=iBegin-1)
iEnd++;
return 1;
}


int remove (int *iNum)
{
if (iBegin==iEnd)
return 0;
else
{
*iNum=iQueue;
if (iBegin==MAX-1)
iBegin=0;
else
iBegin++;
}
return 1;
}



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net