שאלה ב-C

eloya

New member
שאלה ב-C

יש לי שאלה כזו קלוט 15 מספרים שלמים ולאחסן במערך מתאים אז לקלוט מספר טבעי n ולהזיז את איברי המערך n מקומות ימינה כתבתי את התוכנית הזאת (קובץ מצורף) תסבירו לי למה היא לא טובה
 

twiti

New member
שאלת הבהרה, אתה רוצה לעשות מעיין

Shift או לדחוף את האיברים החיצוניים (במקומות העליונים) החוצה מן המערך? תסביר ואנסה לעזור.
 

twiti

New member
בכל מקרה, הנה קובץ המבצע את מה שאני

הבנתי, הוא מסובב את המערך ולא דורס איברים קיימים.
 

אלדד27

New member
המממממ

1. התוכנית שלך לא עובדת כי היא דורסת נתונים ומתייחסת למיקומים שאינם קיימים בזיכרון. 2. הפתרון יכול להיות דומה לזה שהוצע פה. יש עוד פתרון, בזבזני מבחינת מיקום בזיכרון אבל מהיר הרבה הרבה יותר - ניתן להקצות למערך 30 תאים ולא 15, ולבצע את ההזזה בעזרת שתי פקודות memmove. הראשונה תזיז את כל המערך N מקומות ימינה, והשניה תזיז את N המקומות האחרונים, שמתחילים מאמצע המערך, לתחילתו. יש עוד פתרון שהוא הרבה הרבה יותר מהיר, אבל אני לא אתייחס אליו כאן כי זה כבר מטורף מדי
 

emissary

New member
יש משהוא שנקרא הקצאה דינמית

אני פשוט לא יודע מה זה, אולי מישהו יכול להסביר לי מה זה...
 

אלדד27

New member
הקצאה דינמית בכמה מילים.

היא הקצאה של איזור רציף בזיכרון (אם יש מספיק זיכרון) למשתנה מסוים. המשתנה הזה יכול להיות מערך של משתנים, למשל. המטרה של ההקצאה הדינמית היא לענות על הצורך במשתנים בזמן ריצה, כשאנחנו לא יודעים כמה מקום אנחנו צריכים מבעוד מועד. למשל, השאלה הבאה: "קלוט מספר תלמידים בכיתה, ואז קלוט את כל שמות התלמידים בכיתה והדפס אותם בצורה ממויינת". באופן טבעי נרצה להחזיק מערך של מחרוזות, שיחזיקו את כל השמות של התלמידים, ואח"כ נקלוט לתוכו ונמיין אותו. אבל באיזה גודל יהיה המערך? הוא צריך להיות מספיק גדול כדי להחזיק את מספר התלמידים בכיתה. אז אפשר לשער מראש שמספר התלמידים לא יעלה על 50, ולעשות הקצאה סטטית של מערך כזה. מצד שני, יהיה זה הרבה יותר חסכוני ובטוח להשתמש בהקצאה דינמית. הקצאה דינמית של שטח רציף בזיכרון מבוצעת על ידי הפקודה malloc בשפת C, או new בשימוש ב - ++C. אם משתמשים ב malloc, צריך לשחרר את הזכרון כשלא צריך אותו בעזרת הפקודה free. אם משתמשים ב - new, צריך לשחרר אותו עם delete. בכל מקרה, הנושא הזה הרבה הרבה יותר מורכב משלוש הפסקאות האלו, אז אתה יכול לראות בזה מעין טיזר קטן
 

ihovav

New member
שכחת שיש לזה שימוש נרחב מאוד

בתכנות משלבים די מוקדמים שלא לדבר על מבני נתונים...
 

אלדד27

New member
אם שכחתי את זה,

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

ליאור ב

New member
האם לזה התכוונת???

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 n=6 - - - - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15​
אם זאת כוונתך, התשובה מצורפת בקובץ. אם לא נסה להבהיר כוונתך. ליאור.
 

אלדד27

New member
המממ.

התוכנית שלך לא עוברת קומפילציה. אתה לא יכול לעשות:
//Declare new array 15+n long. (numbers+shift) int num2[15+n];​
זה בדיוק מה שאי אפשר לעשות בהקצאה סטטית... בשביל זה יש הקצאה דינמית. חוץ מזה שלא עשית הזזה של המערך, ויתרה מכך, אתה מדפיס את המערך num, כשבעצם לא שינית אותו בכלל, ואתה מדפיס אותו ועוד כמה איברים אחריו (n איברים ליתר דיוק) שהם, כמובן, זבל.
 

ליאור ב

New member
צודק !!! כנראה השעה השפיעה...

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