לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #5  
ישן 25-12-2008, 23:44
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 4 שנכתבה על ידי h_stolero שמתחילה ב "[font=Verdana]גם ברצף וגם לא..."

אוקי...

אז בוא ננסה לנתח את זה:

אתה מקבל מחרוזת עם תוים שונים.
מה שמשנה בשבילך זה כמות הפעמים שמופיע תו מסויים.

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

קוד:
void substr_unique(char *str) { char chr[256]; int offset[100], length[100], // Let's hope that the string isn't too long... idx=0; // Index in the string. first char has idx=0 short i=0, topKey=0; // Has the key of the offset/length array. Indicates the longest string chunk. while(*(str++) != '\n') { if (chr[(int)(*str)]) // This char already exist { offset[i] = idx; if (i) // Is i>0? { length[i] = idx - offset[i-1] - length[i-1]; if (length[i] > length[i-1]) topKey = i; } else { length[i] = idx+1; topKey = i; } ++i; } ++idx; } /* Now the subject string is divided to chunks. * Use offset[topKey] and length[topKey] to fetch the chunk/sub-string you need. * All the other results are stored in the offset and length arrays. * Note: If there are 2 or more chunks with the same length and they are the longest, * the first longest chunk would be assigned to topKey; */ }


יש לי הרגשה שהיה אפשר לעשות את זה עם הרבה פחות משתנים, אבל בגלל שאני לא רגיל לשפת C (וגם לא מוכרות לי הפונקציות שלה ואיך מתעסקים איתן), זה קצת בעייתי בשבילי.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 26-12-2008, 00:56
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
עדכון חשוב
בתגובה להודעה מספר 5 שנכתבה על ידי dorM שמתחילה ב "אוקי... אז בוא ננסה לנתח את..."

שכחתי להוסיף משהו חשוב מאוד לפונקציה..

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

דבר נוסף, אחרי כל איטרציה יש להגדיר כ-true את ה-member המתאים במערך chr.
דבר אחרון, שיניתי את הסוג של המשתנה chr מ-char ל-short כי הערכים במערך מסמלים רק true או false...

הפונקציה הסופית (אני מקוה):
קוד:
void substr_unique(char *str) { /* PAY ATTENTION: i changed the chr type from `char` to `short`, because the values can be 0 OR 1 */ short chr[256]; // All the chars available in 8bit encoding are 256 chars (2^8). int offset[100], length[100], // Let's hope that the string isn't too long... idx=0; // Index in the subject string. first char has idx=0 short i=0, topKey=0; // Has the key of the offset/length array. Indicates the longest string chunk. while(*(str++) != '\n') { if (chr[(int)(*str)]) // This char already exist { offset[i] = idx; if (i) // Is i>0? { length[i] = idx - offset[i-1] - length[i-1]; if (length[i] > length[i-1]) topKey = i; } else { length[i] = idx+1; topKey = i; } ++i; /* CLEAN chr HERE (set all array members to be "Boolean false") */ } else chr[(int)(*str)] = 1; // "Boolean true" ++idx; } }
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 13:42

הדף נוצר ב 0.03 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר