» נושאי לימוד
» נושאי לימוד
יום ראשון 22 בדצמבר 2024
פעולות עם מערכים דו-ממדיים
דף ראשי  פרק 3 :יסודות שפת פסקל  מערכים  מערכים דו-ממדיים  פעולות עם מערכים דו-ממדיים גרסה להדפסה

פעולות עם מערכים דו מימדיים

 

דוגמא נוספת:

כתוב תת תוכנית המקבלת כקלט שני מערכים בגודל כלשהו השווים בסדר שלהם (M*N). תת התוכנית תקבל גם משתנה בוליאני, שכאשר ערכו שקר (false) יתבצע חיסור בין המערכים וכאשר ערכו אמת (true) יתבצע חיבור בין המערכים.

תת התוכנית תחזיר מערך שהוא החיבור או החיסור של שני המערכים. ידוע גם שהמערכים לא יעלו על הסדר (100*100).

 

פתרון:

חיבור או חיסור מערכים הוא כאשר מחברים או מחסרים תא מסוים לתא המתאים במערך השני. לדוגמא, פעולת החיבור היא:

 

                  

 

program NAME;

type

   ARRAY_10_10_REAL=array[1..100,1..100] of real;

   ·       

   ·        קטע הבא לפני תת תוכנית זו

   ·       

procedure SUM_SUB_ARRAY(var A,B,C:ARRAY_10_10_REAL;

                        ROW ,COL:integer; SUM:Boolean);

   { תת תוכנית לסכום שני מערכים }

   (* var A,B – קלט שני מערכים *)

   (* ROW, COL – שורות ועמודות – סדר המערך המכיל את הערכים *)

   (* SUM -  אמת-סכום, שקר- הפרש     *)

var

   I,J: integer;  (* מוני הלולאות- שורות ועמודות בהתאמה *)

begin

   for I:=1 to ROW do (* לולאה חיצונית על השורות *)

      for J:= to COL do (* לולאה פנימית על העמודות *)

          case SUM of

              true : C[I,J]:= A[I,J] + B[I,J]; (* חבר *)

              false: C[I,J]:= A[I,J] – B[I,J]; (* חסר *)

          end;

end;

    ·       

    ·        קטע הבא אחרי תת תוכנית זו

    ·       

 

 להורדת הפרוצדורה לחץ כאן

 

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

בהעברת משתנה, הגוזל זיכרון גדול, רצוי להעבירו בהגדרת ה-var

כדי לחסוך מקום בזיכרון.

 

נניח כי נרצה להכפיל מערך A המערך B ואת התוצאה מציב במערך C.

לדוגמא:

 

       

                   

 

כלומר, סכום מכפלות שורה במערך A (השמאלי) בעמודה במערך B. את התוצאה מציבים לתא ב-C ששורתו היא שורת A ועמודתו היא עמודת B.

 

בכתיב מתמטי, כל תא במערך C עם עמודה J ושורה I  

( [C[I,J]) נציב:

 

 

כאשר N הוא מספר העמודות ב-A, השווה (תמיד) למספר השורות במערך B.

בכפל מערכים, עלינו לדאוג שמספר השורות במערך B יהיה שווה למספר העמודות במערך A . ולכן ברור שאם ניתן לבצע A*B  אזי לא תמיד ניתן לבצע B*A.

 

דוגמא:

 

כתוב תת תוכנית המקבלת מערך A ומערך B ומחזירה את תוצאת הכפל   C=A*B.

 

סדר המערך A הוא (LINES_A*COLUMNS_A)

סדר המערך B הוא (COLUMNS_A*COLUMNS_B)

 

כאשר A_COLUMNS הוא בעצם השורות במערך B.

הנח כי הכפל אפשרי ונבדק בתת תוכנית אחרת.

גודל המערכים המועברים אינו עולה על 10*10.

 

פתרון:

 

program NAME;

type

   ARRAY_10_10_REAL=array[1..10,1..10] of real;

       ·       

       ·        קטע הבא לפני תת תוכנית זו

       ·       

procedure MUL_ARRAY(var A,B,C:ARRAY_10_10_REAL;

                    LINES_A, COLUMNS_A, COLUMNS_B: integer);

   { תת-תוכנית לביצוע כפל מערכים }

   (* var A,B,C – קלט המערכים *)

   (* LINES_A, COLUMNS_A, COLUMNS_B – ממדי המערכים *)

   (* B הם השורות במערך A העמודות במערך  *)

var

   I,J,K:integer; (* מוני הלולאות *)

begin

   { B  לולאה חיצונית על העמודות במערך }

   for I:=1 to COLUMNS_B do

   { A נכפול בכל השורות במערך B כל עמודה במערך  }

       for I:= 1 to LINES_A do

       begin

           C[I,J]:=0; (*איפוס הצובר *)

           { כפול שורה בעמודה }

           for K:=1 to COLUMNS_A do C[I,J]:=A[I,K]*B[K,J]+C[I,J];

       end;

end;

      ·       

      ·        קטע הבא אחרי תת תוכנית זו

      ·       

 

 להורדת הפרוצדורה לחץ כאן

 10-03-04 / 23:08  עודכן ,  03-09-03 / 19:09  נוצר ע"י כפיר מרגי  בתאריך 
 מערכים דו-ממדיים - הקודםהבא - בחן את עצמך 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 11