עבור לתוכן

שאלה נוספת - פונקציה בC

Featured Replies

פורסם

אמ, זה לא באמת יעבוד...

הביטוי הזה:

sizeof(arr[n-1])

בעצם שקול לביטוי הזה:

sizeof(float)

והוא תמיד יחזיר 4.

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

ולגבי 0 או 1 - תשנה את תנאי העצירה ל n!=1, וככה לא תצטרך להדפיס את המערך במקום n-1 אלא תוכל להדפיס את המערך במקום n. זה גם יותר אסתטי.

UI - הוא לא יכול להעביר ל-printArray פרמטר נוסף, כי זה נוגד את הדרישות של התרגיל:

חייב להשתמש בפונקציות הבאות:

void printArray(const float [],int ,?); //פונקציה מקבלת מערך וכמות האברים שלו ומצביע לפונקצית ההדפסה (הסימן שאלה)

void printMat(const float mat[][N],int ,?);//פונקציה מקבלת מטריצה וכמות השורות, ומצביע לפונקצית ההדפסה

פורסם

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

פורסם
  • מחבר

unsigninterger - לא הבנתי מה שהצעת עם הNAN

שניצל- התנאי הוא כבר n!=1

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

צירפתי את התרגיל

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

[attachment deleted by admin]

פורסם

קבל תיקון, התכוונתי n!=0.

קראתי את התרגיל, ולא הבנתי למה אתה מתעקש להגדיר N=20. אני לא מוצא סיבה שלא יהיה מוגדר N=4.

פורסם
  • מחבר

קודם כל כשאני מציב בתנאי n!=0 זה עובר על המטריצה 7 פעמים (ולא 6) מה שאומר שזה גם יחזור 7 פעמים ואז זה ידפיס לי שורה של זבל.

לכן עשיתי מהתחלה אם n!=1 ושלחתי mat[n-1]

מבין?

בקשר ללמה אני מתעקש לעשות N 20 , זה כי התכנית צריכה להיות כללי ואם אני יעשה N 4 לא עשינו כלום. כי אם מטריצות בגודל יותר מ4 לא יתקמפלו

ומטריצות בגודל פחות מ4 לא יודפסו כהלכה.

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

בעיה :s07:

פורסם

עדיף ליצור קבוע, ולא להשתמש במשתנים גלובליים.

פורסם
  • מחבר

כן כבר ניסיתי אבל הקבוע מתאפס כל סיבוב של הרקורסיה כי הוא חוזר על האיתחול =0 ככה שזה לא עוזר

פורסם

קבוע לא יכול להתאפס. והתכוונתי למאקרו, התבלבלתי במינוח.

פורסם
  • מחבר

לא הבנתי אותך

אתה מתכוון למשתנה סטטי?

בכל אופן הגעתי למסקנה של קאונטר לא משנה איזה לא יעזור לי כי בכל מקרה התוצאה שלו תהיה 20

אני מתחיל להגיע למסקנה שזה בלתי אפשרי. כי ברגע שאני נכנס לפונקציה הראשונה מהמיין הN הוא 20 ואי אפשר לחשב את אורך המערכים

פורסם

קודם כל כשאני מציב בתנאי n!=0 זה עובר על המטריצה 7 פעמים (ולא 6) מה שאומר שזה גם יחזור 7 פעמים ואז זה ידפיס לי שורה של זבל.

לכן עשיתי מהתחלה אם n!=1 ושלחתי mat[n-1]

מבין?

צודק, שכחתי שאתה לא יכול לומר ל-printArray להתחיל מ-n-1, אלא הוא חייב להתחיל מ-n.

בקשר ללמה אני מתעקש לעשות N 20 , זה כי התכנית צריכה להיות כללי ואם אני יעשה N 4 לא עשינו כלום. כי אם מטריצות בגודל יותר מ4 לא יתקמפלו

ומטריצות בגודל פחות מ4 לא יודפסו כהלכה.

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

בעיה :s07:

בהחלט בעיה. אבל אין פתרון אחר, והתרגיל לא דרש לטפל במטריצות מגודל אחר, אלא רק במטריצות מהגודל הזה...

העניין הוא שאין שום דרך להסיק את גודלו של המערך מתוך המערך עצמו.

אני אסביר - הביטוי הזה:

int arr[5] = { 1,2,3 };

בעצם מתורגם לביטוי הזה:

int arr[5] = { 1,2,3,0,0 };

כלומר, בשני המקרים הקומפיילר ייצור מערך בגודל 5, וה-sizeof שלו יהיה 20. אין דרך לגרום לו להבין שבעצם מדובר במערך בגודל 3 ולא 5, למעט באמצעות העברת פרמטר.

כיוון ש-printMat מקבלת כפרמטר רק את מספר השורות במטריצה, היא לא יכולה להעביר ל-printArray את מספר האיברים בכל שורה. לכן, printArray חייבת לדעת מבעוד מועד (באמצעות const) את המספר הזה.

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

פורסם
  • מחבר

כן זה באמת נראה דרך ללא מוצא. למרות שלא נראה לי הגיוני להגדיר N 4 כי הוא טען שבזמן הבדיקה הוא יעשה copy paste למטריצות משלו ואני בטוח שלא כולם יהיו בגודל 4

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

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

תודה בנתיים לשניכם, אולי נפגש עוד בהמשך כי חוץ מהתרגיל הזה יש לי עוד 2 וכמו שראית הם לא פשוטים ;)

ישר כוח.

פורסם

התוכנית כמובן צריכה להיות כללית עבור כל מטריצה אחרת מאותו הטיפוס.

אם הטיפוס הוא

float[][N]

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

אבל באמת הכי כדאי לשאול אותו.

ארכיון

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

דיונים חדשים