עזרה דחופה בC

קוארבו

New member
עזרה דחופה בC

יש לי מערך CHAR 50X15 חמישים מלים בעלות עד 15 אותיות מאופס אני מקבל מילה בודק את המערך אם אין את המלה במערך ואם אין אני צריך להכניס את המלה באופן ממויין למערך מה שיש לי זה קלט מלה במערך בדיקה אם יש את המלה ואיתור המקום הנכון להכניס את המלה מה שנתקעתי זה בקטע שבוא אני צריך לקדם את כל המלים ב-1 מהמקום הרלוונטי
 

WarLord

New member
מה שאני הייתי עושה

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

shed

New member
זה מקרה קלאסי לרשימה מקושרת.

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

philips

New member
אכן אכן...

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

קוארבו

New member
לצערי רעיונותיכם מעולים וטובים

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

shed

New member
מערכים ויצירתיות... או הנה פתרון !

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

קוארבו

New member
קוד של פתרון אפשרי שלא כ´כ עובד לי

אני מביא כאן את הקוד של פתרון שאני מנסה הבעייה שכבר התבלבלתי כבר עם כל הפויינטרים האלה שום דבר לא מסתדר לי בקידום הפויינטרים אם למישהו.י בא להעיף מבט אולי אני אוכל גם לעשות משהו השבת
do { printf ("enter word\n"); flushall(); gets(st); k=strlen(st); } while(k>15); count++; strlwr(st); if(count==1){strcpy(words,st); break;} for(j=1;j<count;j++,words=words+j*14) { qu=strcmp(st,words); if(qu==0) { printf("The word is already exist\n"); break; } if(qu>0) { for(i=count;i>j;i--) strcpy(&words[i+1],&words); } }
 

באפט

New member
קוד לדוגמה

הנה קוד חלקי, אני מקווה שתלמד ממנו משהו, ושהבנתי אותך נכון. הקוד ממומש תחת ההנחה שאין להשתמש ברשימות דינמיות, ולכן הוא גם לא יעיל.
#include <string.h> /* strcmp(), strcpy() or implement those yourself */ #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define SizeOfWord 15 #define NumberOfWords 50 typedef char[SizeOfWord] Word; typedef Word[NumberOfWords] Words; /* .....Prototypes here... */ void MakeUpSpace (Words *words, int index) { /* * we will lose the last element by shifting all the elements, * starting with the one at position ´index´, by 1 to the right */ int i; for (i = NumberOfWords - 1; i >= index; i--) { strcpy((*words), (*words)[i - 1]); } } int AddWord(Words *words, Word *word) { int i = 0; int wordFound = FALSE; int currentSizeOfWord = 0; /* The last comparing result */ while (i < NumberOfWords && !wordFound && currentSizeOfWord > 0) { currentSizeOfWord = strcmp(*word, (*words)); if (currentSizeOfWord == 0) /* if words are equal */ wordFound = TRUE; } if (wordFound) { return FALSE; /* word was found, set we cannot add */ } else { /* we found the place to insert */ /* you need to decide what to do in the case (i == NumberOfWords) */ MakeUpSpace(words, i); /* Shift all the words to the right */ strcpy((*words), *word); /* set new word */ } } int main() { Words words; Word word; InitWords(&words); while (UserWantsToAddAWord()) { GetWordFromUser(&word); AddWord(&words, &word); } return 0; }
 
למעלה