עבור לתוכן

עזרה עם מערכים ב- C

Featured Replies

פורסם

שלום לכולם, אני חדש כאן :yelclap:

קיבלתי תרגיל לכתוב פונקציה יעילה המקבלת מערך ממוין בגודל n של מספרים שלמים.

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

דוגמא:

עבור המערך:

93 93 81 81 81 81 72 60 60 50

הפונקציה תשנה את המערך המקורי כך שיראה כך:

0 0 0 0 0 93 81 72 60 50

על הפונקציה להחזיר את מספר האיברים שנותרו (5 בדוגמא).

אסור להשתמש במערך עזר!

על הפונקציה לרוץ בסדר גודל של n.

אני לא יודע איך לרשום את הפונקציה העיקרית.

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

זה מה שיש לי בינתיים:

http://pastie.org/5599435

תודה רבה מראש!!

פורסם
  • מחבר

H.I.T, למה אתה שואל?

פורסם

כי מלמדים אותך לכתוב קוד לא נכון.

א. אסור לכתוב void main, אלא צריך int main, ובסוף ה-main יש לכתוב ;return 0.

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

פורסם
  • מחבר

קודם כל תודה שאתה מגיב לי!

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

assert - אז אני כן אמור להשתמש בו או לא? ואם כן איפה לציין אותו.

אני חייב לציין שאין לי ידע קודם בתיכנות.

פורסם

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

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

assert - אז אני כן אמור להשתמש בו או לא? ואם כן איפה לציין אותו.

מצאתי מאמר לא רע שמסביר מתי מומלץ להשתמש ב-assert:

http://bugawareness.com/when_to_prove_you_are_right

שים לב לכלל האצבע הראשון: "אל תשתמשו ב-Assert לבדוק משהו שיכול להשתבש – גם אם בסבירות נמוכה מאוד". הקצאת זכרון כושלת היא בדיוק מצב כזה - היא יכולה להשתבש, אם כי בסבירות נמוכה.

שגיאות כמו הקצאת זכרון כושלת צריך פשוט לבדוק באמצעות if והדפסת שגיאה. דהיינו משהו כזה:

a = (int*)malloc(sizeof(int)*n);
if (a == NULL) {
printf("Memory allocation failed!\n");
exit(1);
}

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

פורסם
  • מחבר

בכל מקרה, איך אני ניגש לתרגיל הנ"ל?

פורסם

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

לגבי הזזת הערכים - תחשוב איך שימוש בשני מצביעים (כלומר לעקוב במקביל אחרי 2 תאים שונים במערך) יכול לעזור.

ארכיון

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

דיונים חדשים