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

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



  #1  
ישן 13-12-2009, 10:43
צלמית המשתמש של bazooka joe
  bazooka joe bazooka joe אינו מחובר  
 
חבר מתאריך: 16.07.02
הודעות: 6,814
Facebook profile
עזרה צריך עזרה בהבנת תרגיל(רשימות מקושרות)

להלן, קטע מדף ההנחייה
In this assignment, we deal with students that register
to courses. We keep lists of students and lists of courses,
where each student knows to which course they are registered,
and each course also “knows” which students are
registered to it.
The structures student and course are informational
קוד:
typedef struct student { char *name; int id; struct clist *courses; } student; typedef struct course { char *title; int number; struct slist *students; } course
;
The structures slist and clist keep the data structure:
קוד:
typedef struct slist { student *info; struct slist *next; } slist; typedef struct clist { course *info; struct clist *next; } clist
;
Note that the nested data structures are kept via pointers
as well—in order to be able to keep data pertaining
to the same student or course in several lists, without
multiplication.
אני פשוט לא מצליח להבין איך בדיוק נעשים הקישורים הבאים
בין תלמיד לבין הקורסים אליהם הוא רשום
בין קורס לתלמידים הרשומים אליו

תודה מראש

_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 13-12-2009, 11:18
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 1 שנכתבה על ידי bazooka joe שמתחילה ב "צריך עזרה בהבנת תרגיל(רשימות מקושרות)"

המ.. תחשוב על זה ככה...
יש לך 2 רשימות:
1) רשימת קורסים
2) רשימת סטודנטים

עכשיו, כל איבר ברשימות הללו, מכיר מספר איברים מהרשימה הנוספת. כשאני אומר "מכיר" אני מתכוון, כמובן, למכיל מצביע אליו.
אותו מצביע נשמר ברשימה בתוך אותו האיבר.
בצורה סכמאטית זה נראה בערך כך:

תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

מה שקורה פה הוא שכל איבר ברשימה מכיל רשימה משלו המקושרת לאיברים של הרשימה השניה.
סטודנט שרשום לקורס מכיל ברשימה שלו מצביע את הקורס הזה.
קורס שנלמד ע"י סטודנט מכיל ברשימה שלו מצביע אל הסטודנט הזה.

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 01-01-2012, 00:25
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 6 שנכתבה על ידי Army_Boy שמתחילה ב "אוקי קיבלתי תרגיל דומה ..."

ממה שאני מבין, יש לך מבנה מסוג student ורשימה של סטודנטים בשם slist.
אתה מתבקש להוסיף סטודנט לרשימה בפונקציה ולכן עליך:
1. להקצות דינאמית מקום למופע מסוג סטודנט
2. להוסיף אותו לרשימה
את הפרטים של הסטודנט אתה כבר מקבל מבחוץ (שם ומזהה).
ישנה שאלה על טיבו של השם - מאיפה אתה משיג אותו? האם הוא בעצמו הוקצה דינאמית או מה?
בכל מקרה, בשביל סעיף 1 אתה צריך להקצות מקום רק לסטודנט אחד, ולא לפי גודל כל הרשימה:
קוד PHP:
 student = (struct Student*) malloc (sizeof(struct Student));
student.name name;
student.id id

זה בהנחה שיש לך מבנה בשם Student.
שים לב להעתקה של המצבע לשם. במידה וגם במבנה הוא מופיע כמצביע, אתה יכול פשוט לתת למצביע להצביע למחרוזת שכבר מהווה את השם. במידה ואתה מקבל במבנה מקום מוגדר עבור השם, עליך לבצע העתקה מלאה של השם למחרוזת:
קוד PHP:
 strcpy(student.namename); 

או משהו כזה, לא זוכר מי קודם - היעד או המקור.. חפש בגוגל

עריכה: אני מקווה שלא בילבלתי את הגישה למשתנה... אני זוכר שלאחר הקצאה, מתייחסים למשתנה כאל מופע ממש ולכן משתמשים בנקודה (.) כדי לגשת לשדות שבו.
מצד שני, הוא מצביע, אז אולי צריך להשתמש בחץ (<-).. קיצר, אני כבר לא זוכר, אבל זה משהו שאתה אמור לשחות בו
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com


נערך לאחרונה ע"י Narxx בתאריך 01-01-2012 בשעה 00:28.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 02-01-2012, 00:44
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 8 שנכתבה על ידי Army_Boy שמתחילה ב "תודה על הניסיון לעזור אבל זה לא עובד :)"

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

בנוגע למבנה "סטודנט", יש לך במבנה מחרוזת (שם).
כדי לממש מחרוזת, יש לך 2 אפשרויות:
1. הגדרת גודל המחרוזת מראש (חסם עליון כלשהו על שם, נניח 50 תווים בהנחה שלא יתכן שם ארוך מ 50 תווים)
2. הגדרת מצביע מסוג *char אשר יצביע על מחרוזת חיצונית.

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

איך עושים?
נניח שיש לך buffer כלשהו שאתה סורק אליו, ולצורך הפשטות, נניח שאתה משתמש ב scanf (אם אתה משתמש בפונקציה אחרת, פשוט זרום עם הדוגמא שלי ותשנה אצלך בקוד למה שזה לא יהיה).
קוד PHP:
 char buffer[255];
/* scan details */
printf("enter a name\n");
scnaf("%s"buffer);

/* create a new student */
struct Studentstudent = (struct Student*) malloc (sizeof(struct Student));

/* create a new string for student's name */
student.name = (char*) malloc (sizeof(char) * strlen (buffer));

/* copy the name from buffer into student.name */
strcpy (student.name buffer); 

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #12  
ישן 02-01-2012, 14:10
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 11 שנכתבה על ידי Army_Boy שמתחילה ב "זה מה שכתבתי..."

לא. זה לא מה שכתבת. אתה כתבת משהו אחר, וזה נראה כאילו לא קראת או התעלמת ממה שאני ו-NARXX כתבנו לך למעלה. קודם כל, בחלק הזה יש באג:
ציטוט:
במקור נכתב על ידי Army_Boy
קוד:
slist* add_student(slist *students, char *name, int id) { student* head; if (!( head = (student*)malloc(sizeof(student)))) exit (1); head->id = id; head->name = name;

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

איך עושים?
נניח שיש לך buffer כלשהו שאתה סורק אליו, ולצורך הפשטות, נניח שאתה משתמש ב scanf (אם אתה משתמש בפונקציה אחרת, פשוט זרום עם הדוגמא שלי ותשנה אצלך בקוד למה שזה לא יהיה).
קוד PHP:
 char buffer[255];
/* scan details */
printf("enter a name\n");
scnaf("%s"buffer);

/* create a new student */
struct Studentstudent = (struct Student*) malloc (sizeof(struct Student));

  
/* create a new string for student's name */
student.name = (char*) malloc (sizeof(char) * strlen (buffer));

/* copy the name from buffer into student.name */ 
strcpy (student.name buffer); 

מה שאתה עשית אומר שהמצביע שאמור להצביע לשם של הסטודנט החדש שיצרת, מצביע למחרוזת שהעבירו לך לפונקציה. אבל אחרי שנגמרת הפונקציה, יכול להיות שהזיכרון שאליו אתה מצביע נעלם. בגלל זה אתה צריך להקצות זיכרון משלך ולהעתיק לשם את השם של הסטודנט. כמו ש-NARXX גם הסביר וגם כתב בקוד שלו...
לדוגמה:
קוד:
void f() { char buf[255]; printf("Enter name: "); fgets(buf, sizeof(buf)); slist* students = getFromSomewhere(); add_student(students, buf, 123); } void g() { f(); }

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


הבאג השני שלך הוא שבמקום להוסיף את הסטודנט לרשימה שנתנו לך, אתה זורק את הרשימה לעזאזל, ויוצר רשימה חדשה:
ציטוט:
במקור נכתב על ידי Army_Boy
קוד:
if (!( students = (slist*)malloc(sizeof(slist)))) exit (1); students->info = head ; students->next = NULL ; return students; }
כאילו, על מה חשבת כשעשית את זה?
נותנים לך את הפרמטר students, ואז אתה מתעלם ממה שיש בו, ודורס אותו עם ערך חדש משלך.
אז למה קיבלת את הפרמטר הזה בכלל?
כמובן שכתבתי למעלה מה היית אמור לעשות, אבל כמו במקרה עם NARXX, או שלא קראת או שהתעלמת.
ציטוט:
במקור נכתב על ידי פסטן
והוא צריך גם לייצר slist חדש, ולהוסיף אותו לרשימה. אחרי שיצרנו את הסטודנט שעשית למעלה, צריך:
קוד:
slist * slist_student = malloc(sizeof(slist)); slist_student.info=student; slist_student.next=NULL; for (slist*cur=students; cur.next!=NULL || cur.next=slist_student; cur=cur.next);
לכבוד השנה החדשה כתבתי קוד מזעזע במיוחד.
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #14  
ישן 02-01-2012, 18:55
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 13 שנכתבה על ידי Army_Boy שמתחילה ב "עריכה"

איך אפשר בלי לולאה?
אני רוצה להגיע לאיבר האחרון ברשימה, ולהוסיף לשם את האיבר שיצרתי:
קוד:
slist foo = 0; slist * new_element = malloc(sizeof(slist)); new_element.info = new_student; new_element.next = 0; foo = (*students).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; foo = (*foo).next; ... (*foo).next = new_element;

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

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #32  
ישן 08-01-2012, 01:01
צלמית המשתמש של Army_Boy
  Army_Boy Army_Boy אינו מחובר  
 
חבר מתאריך: 14.07.06
הודעות: 2,115
לגבי הפונקציה שרושמת סטודנטים לקורסים והפוך:
בתגובה להודעה מספר 1 שנכתבה על ידי bazooka joe שמתחילה ב "צריך עזרה בהבנת תרגיל(רשימות מקושרות)"

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

קוד:
void reg_student(slist *students, clist *courses, int id, int number) { slist* new_std; clist* new_crs; if (!students||!courses) return; if (! (new_std = (slist*) malloc (sizeof(slist)))) exit (1); if (! (new_crs = (clist*) malloc (sizeof(clist)))) exit (1); for (;students->info->id!=id;students=students->next); for (;courses->info->number!=number;courses=courses->next); new_std->info = students->info ; new_crs->info = courses->info ; while (courses->info->students) courses->info->students = courses->info->students->next ; new_std->next = NULL ; courses->info->students = new_std ; while (students->info->courses) students->info->courses = students->info->courses->next ; new_crs->next = NULL ; students->info->courses = new_crs ; }



[התמונה הבאה מגיעה מקישור שלא מתחיל ב https ולכן לא הוטמעה בדף כדי לשמור על https תקין: http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash4/381203_2883134434593_1147066737_33189722_283559361_n.jpg]


וזאת הבעיה :


[התמונה הבאה מגיעה מקישור שלא מתחיל ב https ולכן לא הוטמעה בדף כדי לשמור על https תקין: http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/388823_2883599406217_1147066737_33189878_2086358940_n.jpg]
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

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

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

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

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



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

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

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

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