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

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



  #1  
ישן 03-01-2012, 15:11
  Guyche87 Guyche87 אינו מחובר  
 
חבר מתאריך: 03.01.12
הודעות: 4
סידור לקסוגרפי בC

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


קוד:
void arrange_lksografi(char *string) //aranging the string by lksigrafi order { int i,j,letter_counter=0, maxIndex,temp; for(i=0;string[i];i++) letter_counter++; for (i=1;i<letter_counter;i++) { maxIndex=0; for (j=1;j<=letter_counter-i;j++) /* find max index */ if (string[j]>string[maxIndex]) maxIndex=j; temp=string[letter_counter-i]; /* swap */ string[letter_counter-i]=string[maxIndex]; string[maxIndex]=temp; } printf("the sorted string:\n"); /* print sort array */ for (i=0;string[i]!;i++) if(string[i]!=' ')printf("%c ", string[i]); printf("\n"); }


תודה רבה מראש!!!
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 03-01-2012, 17:49
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 3 שנכתבה על ידי Guyche87 שמתחילה ב "לא אמרו כלום לגביי זה אז אני..."

אוקיי, אז הייתי הולך על זה ככה:

רעיון ראשון

עושים משהו כזה:
  1. מחלקים את המשפט למלים
  2. ממיינים את המילים
  3. בונים משפט חדש
הפונקציות יראו בערך ככה:
קוד:
#include <stdlib.h> #include <stdio.h> int compare_words(const void* const a, const void* const b) { // trivial... } void explode(const char * const str, const char delim, char *** arr, size_t * const count) { // too annoying to implement } void lexico(const char * const src, char * const dst) { char** words_arr = 0; size_t words_cnt = 0; size_t i = 0; size_t cur_loc = 0; explode(src, ' ', &words_arr, &words_cnt); qsort(words_arr, words_cnt, sizeof(words_arr[0]), &compare_words); //copy word words_arr[i] into dst[cur_loc] } int main() { char user_input[256*256]; char ordered[sizeof(user_input)]; printf("Enter something: "); fgets(user_input, sizeof(user_input), stdin); lexico(user_input, ordered); printf("\r\nAnd the results are......\r\n\r\n%s\r\n", ordered); return 0; }

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

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





רעיון שני

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


"abcd efgh ijkl mnop qrs tu vwx yz"
אנחנו רוצים לקבל רשימה של מצביעים, שכל אחד מהם מצביע למילה אחת בכל הסיפור הזה.
בעצם, כבר כמעט יש לנו את המילים המפורקות. צריך רק להחליף בכל מקום רווח ל-NUL ככה:
"abcd\0efgh\0ijkl\0mnop\0qrs\0tu\0vwx\0yz"
עכשיו צריך רק לסדר רשימה של מצביעים לנקודות האלה. זה כבר לא כל-כך קשה.

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


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

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 03-01-2012, 16:46
  משתמש זכר inspired-session inspired-session אינו מחובר  
מנהל מולטימדיה
 
חבר מתאריך: 07.12.07
הודעות: 1,955
בתגובה להודעה מספר 6 שנכתבה על ידי Guyche87 שמתחילה ב "אוקיי זה גם מה שאני חשבתי רק..."

אתה קולט את המשפט למערך של תווים (מצביע מסוג תו). שמור מצביע לראש המערך הזה ותעשה את הדבר הבא:
1. צור מערך של מחרוזות (מצביע למצביע מסוג תו).
צור משתנה שיהיה אינדקס למיקום הנוכחי שלך במערך הזה. (מתחיל ב0)
הצבע מהאינדקס הנוכחי במערך המחרוזות למערך התווים המקורי.
2. רוץ על מערך התווים המקורי שמהווה שאת המשפט. כל פעם שתתקל ברווח, תחליף אותו בסימן NULL, ותגדיל ב1 את האינדקס של מערך המחרוזות.
הצבע מהאינדקס הנוכחי במערך המחרוזות למיקום הנוכחי שלך בתוך המערך המקורי (שזה תא אחד אחרי איפה ששמת NULL).

וכך הלאה עד שתגיע לסוף המשפט, שזה אומר שהגעת לNULL במערך התווים המקוריו.

יצרת מערך מחרוזות - עכשיו יש לך מערך של מילים שאתה יכול למיין בקלות.

בהצלחה
_____________________________________



תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 03-01-2012, 18:07
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 8 שנכתבה על ידי inspired-session שמתחילה ב "אתה קולט את המשפט למערך של..."

זה לא מערך של מילים. זה עדיין מערך של תווים.
אופרטור + יזיז אותו תו אחד קדימה ולא מילה קדימה, sizeof על כל איבר במערך יחזיר 1 ולא את אורך המילה, וכו'.
זה מערך של תווים שאיננו מחרוזת C סטנדרטית, ולכן צריך לעבוד עם הדבר הזה נורא בזהירות, והרבה דברים שעושים בדרך-כלל באופן אינטואיטיבי עם מערכים ו/או מחרוזות אסור לעשות עם הדבר הזה.

דוגמה לקוד שמראה איך נראה מערך אמיתי של מילים:
קוד:
#include <stdio.h> int arr_i[] = {1,2,3,43,546,546}; size_t arr_i_size = sizeof(arr_i)/sizeof(arr_i[0]); char * arr_s[] = {"hello","world","foo"}; size_t arr_s_size = sizeof(arr_s)/sizeof(arr_s[0]); int main() { size_t i = 0; printf("arr_i size is: %d\r\n\r\n", arr_i_size); for (i = 0; i< arr_i_size; i++) printf("arr_i[%d] = %d\r\n", i, arr_i[i]); printf("arr_s size is: %d\r\n\r\n", arr_s_size); for (i = 0; i< arr_s_size; i++) printf("arr_s[%d] = %s\r\n", i, arr_s[i]); printf("sizeof arr_s[1] is: %d\r\n", sizeof(arr_s[1])); return 0; }
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #14  
ישן 04-01-2012, 16:08
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 13 שנכתבה על ידי inspired-session שמתחילה ב "[QUOTE]אתה אמרת לייצר..."

ציטוט:
במקור נכתב על ידי inspired-session
ציטוט:
אתה אמרת לייצר char**‎. זה לא מערך.

אתה צוחק עליי?
אתה צוחק על עצמך. הראתי לך בקוד למעלה מה זה מערך ב-C.
קוד:
#include <stdlib.h> #include <stdio.h> #define PRINT_ARRAY_INFO( arr ) \ printf("sizeof(" #arr "): %d\r\n", sizeof(arr)); \ printf("len of(" #arr "): %d\r\n", sizeof(arr)/sizeof(arr[0])); int arr_int[] = {1,2,3,43,546,546}; char arr_char[] = "Hello, World!"; char * p_char = "Hello, World!"; char * arr_p_char[] = {"hello","world","foo"}; //char ** p_p_char = {"hello","world","foo"}; // ILLEGAL char ** p_p_char = arr_p_char; int main() { size_t i = 0; PRINT_ARRAY_INFO(arr_int); PRINT_ARRAY_INFO(arr_char); PRINT_ARRAY_INFO(p_char); PRINT_ARRAY_INFO(arr_p_char); PRINT_ARRAY_INFO(p_p_char); return 0; }
מצביע ומערך זה דברים שונים. תלמד, ואז תבין שאף אחד לא צוחק עליך: http://c-faq.com/aryptr/index.html


ציטוט:
במקור נכתב על ידי inspired-session
ציטוט:
ואיך אתה יודע כמה להקצות.
כיוון שמישהו לפני כבר הציע את הדרך לספור את כמות המילים במשפט, לא ראיתי צורך לחזור על העניין.
ספירה פשוטה של כמות הרווחים במילה יכולה להגיד לנו כמה מילים יש במשפט.
נפלא! אבל אתה לא יודע מה האורך של כל מילה...
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

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

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

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

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



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

הדף נוצר ב 0.07 שניות עם 10 שאילתות

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

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