עבור לתוכן

מיון של Struct

Featured Replies

פורסם

אני מנסה לעשות מיון של שם

כלומר שיסדר לי את סטראקט ע"פ שם

אז בניתי את הפונקציה הזו:

void sort(worker w[])

{

worker temp;

for (int i=0 ; i<worker_num; i++)

{

for (int j=0 ; !w.last[j++] ; j++)

{

if ((strcmp(w.last[j],w[i++].last[j]))<0)

{

temp=w;

w=w[i++];

w[i++]=temp;

}

}

}

}

מה שהתברר כלא מוצלח במיוחד

יש לי שגיאות של הקומפיילר שאני לא יכול להמיר INT ל char*

???

last מוגדר כ ------------------------------------------------------------------------->

char last[21];

פורסם

איך בדיוק מוגדר worker?

פורסם

מעבר לעובדה שלא ציינת איך worker מוגדר, ברור גם שכל ה ++i שלך גורמים לשגיאות.

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

פורסם
  • מחבר

#define n 21

#define worker_num 2

typedef struct

{

char last[n];

char name[n];

int gil;

int vetek;

char rank[10];

int sal;

int holiday[12];

int sum;

}worker;

איך אני אמור להישתמש ב I ?

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

אני חושב שהבעיה היא בשימוש שלי עם הפונקציה בשורה הזו:

if ((strcmp(w.last[j],w[i++].last[j]))<0)

פורסם

אני כרגע לא מתייחס לאם התוכנית עושה מה שאתה רוצה, אלה רק לשגיאת קומפלציה

הבעיה שלך בשורת ה-if היא שהפונקציה strcmp מקבלת שני מחזורות, כלומר משתנים מטיפוס char*

w הוא מטיפוס worker*

w הוא מטיפוס worker

w.last הוא מטיפוס char*

w.last הוא מטיפוס char

כמו שאתה רואה אתה מעביר לפונקציה משתנה מטיפוס char במקום char*

פורסם
  • מחבר

מה שאני מנסה לעשות זה למיין את last לפי השם, כלומר שהוא ימיין את מערך הסטראקטים ע"פ השם משפחה

אז איך אני צריך לעשות את זה אם

w.last הוא מטיפוס char

?

פורסם

w.last

פורסם

STRCMP לא טוב להשוואת תווים בודדים לשם כך יותר מומלץ

לעשות השוואה על ערכי ה-ASCII של התווים לדוגמא להשוואת ch,ch2

תרשום:

( (if( int(ch) > int(ch2

פורסם

הוא לא רוצה להשוות בין תווים, אלא בין מחרוזות שלמות.

void sort(worker w[])

{

worker *temp;

int i,j;

for (i=0 ; i<worker_num; i++)

{

for (j=0 ; j<worker_num ; j++)

{

if ( (strcmp(w.last, w[i+1].last)) < 0)

{

temp=w;

w=w[i+1];

w[i+1=temp;

}

}

}

}

פורסם
  • מחבר

זה עובר את הקומפיילר אבל התוכנית לא ממיינת לי את מערך הסטראקטים... :-\

פורסם

void sort(worker w[])

{

worker temp;

int i,j;

for (i=0 ; i<worker_num; i++)

   {

   for (j=i ; j<worker_num ; j++)

      {

      if ( (strcmp(w.last, w[j].last)) < 0)

         {

         temp=w;

         w=w[j];

         w[j]=temp;

         }

      }

   }

}

לאט לאט הפורום הזה נהיה פורום שעורי בית

פורסם
  • מחבר

עבדתי על זה עוד כמה שעות רק בשביל להבין שהסמן בשורה

if ( (strcmp(w.last, w[j].last)) < 0)

היה צריך להיות בכיוון השני , ככה:

if ( (strcmp(w.last, w[j].last)) > 0)

ואז זה עבד סוף סוף!!! 8)

"הלב אומר תודה"

:P

פורסם

אפשר להשוות (השמה) בכזו צורה בין מבנים?

worker1 = worker2 ?

לא ידעתי.

בפתרון שלי התכוונתי להחליף את הכתובות ובגלל זה הגדרתי את temp כמצביע.

אבל אם זה עובד גם ככה - אז יופי.

פורסם

זה עובד טוב כל עוד בSTRUCT עצמו אין מצביעים שאתה מתכוון לשנות אותם אחרכך

כי אם אתה משנה אחרכך אז זה משנה בשניהם

אני לא זוכר איך קוראים להשמה הזו

פורסם

אתה עובד עם ++C או C?

כי אם זה C אז אני לא חושב שזו השמה סטנדרטית, עפ"י ANSI. לדעתי הקומפיילר פשוט מתייחס אליהם בתור אובייקטים (אפילו אם זה מקומפל בתור C, הקומפיילר אולי לוקח את אחת התכונות של CPP לשם ההשמה) וההשמה היא האופרטור הברירת מחדל למחלקות (העתקת כל משתני המחלקה למחלקה השניה).

לפחות כך אני סבור שזה עובד. בכל מקרה בחיים לא ראיתי שמותר לעשות השמה בין שני struct ב- C (לא ++).

תבדוק אם יש לך אזהרות מצד הקומפיילר לגבי ההשמה הזו.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים