מתקשה לפתור תרגיל בשפת C אם למישהו יש ריעין

abdola

New member
מתקשה לפתור תרגיל בשפת C אם למישהו יש ריעין

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

 

BravoMan

Active member
ומה בדיוק הבעיה שלך? מה ניסית?

בגדול, יש שתי דרכים לפתור את זה: שימוש ב-if, ושימוש במטריצה גדולה יותר.
 
מטריצה גדולה יותר לא נותנת פתרון פשוט לחישוב ממוצע.

אגב, למה לקלוט שתי מטריצות?
 

BravoMan

Active member
אכן, שכחתי שספציפית עבור ממוצע

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

abdola

New member
תודה לעונים, מוסיף עוד פרטים

קודם תודה לכם שהתייחסתם, ועניתם
הפונקציה מקבלת 2 מטריצות באותו גודל, אחת מכילה מספרים והשנייה ריקה,
הפעולה שצריך לבצע פשוטה , פשוט לחשוב ממוצע של איבר במטריצה A במערכת נניח (0,1) וכל האיברים שמקיפים איתו ולהציב את התוצאה (הממוצע) לתוך נאיבר המקביל (0,1) במטריצה B (המטריצה הריקה).
חישוב הממוצע הוא די פשוט אומנם הבעיה היא באיברים ההיקפים של המטריצה שכן חלק מהאיברים שמקיפים אותם נמצאים מחוץ למטריצה ומכילים זבל
לדוגמא, האיבר (0,1) מקיפים אותו (0,2)(1,0)(1,1) והשאר נמצאים מחוץ לתחום המטריצה
איך מתגברים על הבעיה, תנו לי רעיון (לא מבקש פיתרון מלא)
תודה
 

BravoMan

Active member
אין דבר כזה "איברים מחוץ למטריצה".

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

abdola

New member
אז אין פיתרון?

זו שאלה שקבלנו במבחן סוף סמסטר
אז איך יכול להיות שיתנו לנו שאלה שאין לה פיתרון
 

BravoMan

Active member
למה החלטתה שאין פתרון?

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

קוד:
void average(int A[M][N], double B[M][N]) {
	for (int i=0;i<M;i++) {
		for (int j=0;j<N;j++) {
			double sum=0;
			int count=0;
			for (int p=i>0?i-1:0;p<=i+1 && p<M;p++) {
				for (int q=j>0?j-1:0;q<=j+1 && q<N;q++) {
					sum+=A[p][q];
					count++;
				}
			}
			B[i][j]=sum/count;
		}
	}
}
 

abdola

New member


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


קוד:
//חישוב ממוצע איבר ועוד האיברים המקיפים אותו במטריצה הראשונה והצבת התוצאה
//באיבר המקביל לו במטריצה השנייה

#include <stdio.h>
#define M 4
#define N 4

void matavg(int mat1[][N], float mat2[][N]);

void main()
{
int mat1[M][N]={{1,5,2,4},{2,3,2,1},{4,4,2,4},{1,1,3,4}};
float mat2[M][N];
int i,j;

for(i=0; i<M; i++)
    {
    for(j=0; j<N; j++)
        printf("%-5d",mat1[i][j]);
    puts("\n");
    }


matavg(mat1,mat2);


}

void matavg(int mat1[][N], float mat2[][N])
{
   int i,j,count;
   float avg;

   for(i=0; i<M; i++)
    for(j=0; j<N; j++)
        {
            count=1;
            avg=mat1[i][j];
                if(i-1>=0 && j-1>=0)
                {
                 avg+=mat1[i-1][j-1];
                 count++;
                }
                if(i-1>=0)
                {
                 avg+=mat1[i-1][j];
                 count++;
                }
                if(j+1<N && i-1>=0)
                {
                 avg+=mat1[i-1][j+1];
                 count++;
                }
                if(j+1<N)
                {
                 avg+=mat1[i][j+1];
                 count++;
                }
                if(j+1<N && i+1<M)
                {
                 avg+=mat1[i+1][j+1];
                 count++;
                }
                if(i+1<M)
                {
                 avg+=mat1[i+1][j];
                 count++;
                }
                if(i+1<M && j-1>=0)
                {
                 avg+=mat1[i+1][j-1];
                 count++;
                }
                if(j-1>=0)
                {
                 avg+=mat1[i][j-1];
                 count++;
                }
            avg/=count;
            mat2[i][j]=avg;
        }

   for(i=0; i<M; i++)
    {
    for(j=0; j<N; j++)
        printf("%-7.2f",mat2[i][j]);
    puts("\n");
    }
}
 

פרסאוס

New member
אל תכתוב מתחת ל0.

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