בחינה לדוגמה - יסודות מדעי המחשב

 

 

מדעי המחשב

2 יחידות לימוד

 

הוראות לנבחן

 

א. משך הבחינה: שלוש שעות.

ב. מבנה השאלון ומפתח ההערכה:  בשאלון זה שלושה פרקים.

            פרק ראשון         -  בפרק זה חמש שאלות,

                          ועליך לענות על כולן.                    ( 5 ´ 10) -  50 נקודות

            פרק שני -   בפרק זה שלוש שאלות, מביניהן

               עליך לענות על שתיים                             ( 2 ´ 15 ) - 30  נקודות

פרק שלישי         -   בפרק זה שתי  שאלות, מביניהן

                עליך לענות על אחת בלבד                    ( 1 ´ 20 ) - 20  נקודות

ג. חומר עזר מותר בשימוש: כל חומר עזר  ( פרט למחשב הניתן לתכנות )

ד. הוראות מיוחדות: אין

 

 

בהצלחה !!!

 

פרק ראשון ( 50 נקודות )

ענה על כל השאלות 1 - 5 ( לכל שאלה - 10 נקודות ).

 

שאלה  1

יש לפתח אלגוריתם אשר הקלט שלו הוא מספר שלם חיובי תלת ספרתי, והפלט שלו הוא  'ספרות זהות'  אם כל ספרות המספר זהות ו 'ספרות שונות' אם לא כל הספרות זהות.                               

   לדוגמה:    עבור הקלט 555  הפלט יהיה 'ספרות זהות'

                   עבור הקלט 525  הפלט יהיה 'ספרות שונות'

א.      פרק את המשימה המתוארת בבעיה לתת-משימות.

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

ג.       כתוב אלגוריתם מילולי לפתרון.

 

שאלה  2

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

var

   Ch: char;

begin

  read(Ch);

  while Ch < > '.' do

    begin

if  (Ch='A') or (Ch='a') then  write('z')

else write((pred(Ch));

            read(Ch)

   end

end;

 

א.  מהו פלט קטע התוכנית עבור הקלט    ZaBzdA   ?

ב.  תן שתי דוגמות קלט שונות שעבור כל אחת מהן יהיה הפלט  zaBzdA   ?

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

    (כאשר 'a' עוקבת ל 'z'  ו-  'A' עוקבת ל- 'Z' )

 

שאלה  3

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

writeln('הקש מספר טבעי');

readln(N);

Count:=1;

while (N div 10) > 0 do

Count:=Count+1;

writeln(Count, ' מספר הספרות הוא ')

 

 

 

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

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

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

 

שאלה  4

חברת דיסקים החליטה לשמור את הנתונים של הדיסקים למוסיקה לריקודים בצורה מסודרת.

הנתונים לכל דיסק הם:

             סוג המוסיקה: (R - רוק, P - פופ, D - דנס, T - טרנס)

             מספר דיסק ( 1..150 )

             שנת הוצאה

             מחיר קטלוגי ( 50-120 )

             עבוד מחודש ( כן/לא )

א.       הגדר טיפוס הנתונים  DiskType   לשמירת נתונים אלה.

ב.       נתונה ההצהרה:     Disk : DiskType  var     

  כתוב משפט  if שיוריד את המחיר של Disk  במחצית אם שנת ההוצאה שלו קודמת ל- 1980 ולא נעשה לו עיבוד מחדש.

 

שאלה  5

נתונות ההגדרות הבאות:

const   N=50 ;

type ArrayType=array[1..N] of integer;

var   A:ArrayType;

         Max,Min:integer;

ונתונה כותרת הפרוצדורה:

   procedure MaxMin (________________________________________________);

{   טענת כניסה : הפרוצדורה מקבלת כפרמטר מערך מטיפוס ArrayType  }

{   טענת יציאה : הפרוצדורה מחזירה ב- Max וב- Min את האיבר הגדול ביותר  }

           {                     והאיבר הקטן ביותר במערך בהתאמה.                        }

ויש לזמן את הפרוצדורה בצורה הבאה:

MaxMin (A , Max , Min)

 

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

1.        procedure MaxMin( B : ArrayType ;  Maxi , Mini : integer);

2.        procedure MaxMin( B : ArrayType ;  var Maxi : integer;  var  Mini  : integer);

3.    procedure MaxMin( A :integer ; var  Maxi :integer;  var Mini : integer);

4.   procedure MaxMin( var  Maxi : integer;   var  Mini : integer ; B :

                                                                                           ArrayType );

5. procedure MaxMin( B: array[1..N] of integer ;  var  Maxi :

                                                   integer;  var Mini :    integer);

 

פרק שני ( 30 נקודות)

ענה על שתיים מבין השאלות 6 - 8 (לכל שאלה - 15 נקודות).

 

שאלה 6

לפניך פונקציה:

  function Count_k_pairs(K:integer):integer;

{טענת כניסה: הפונקציה מקבלת כפרמטר מספר שלם חיובי K                                                 }

{טענת יציאה: ___________________________________          }

   var

       Num, Count, I : integer;

       A:array[1..10] of integer;

   begin

        writeln(‘ הקש 10 מספרים שלמים ‘);

         for I:=1 to 10 do

            readln(A[I]);

         Count:=0;

         for I:=1 to 9 do

             if ( A[I]+A[I+1] ) = K then

                 Count:=Count+1;

         Count_k_pairs:=Count

   end;  { Count_k_pairs }

 

א.      מה יהיה פלט הפונקציה עבור הערך 15 כפרמטר והקלט : 10  5  8 7  8  4   14   1  3  9 

ב.      השלם את טענת היציאה של הפונקציה.

ג.       הפונקציה מבצעת את החישוב הדרוש באמצעות מערך. נמק מדוע אין צורך בכך?

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

 

שאלה 7

נתונה כותרת הפונקציה               function Smaller (Letter1 , Letter2 : char ) : boolean;

                              { טענת כניסה: הפונקציה מקבלת כפרמטרים שתי אותיות                       }

                              { טענת יציאה: הפונקציה מחזירה אמת אם האות הראשונה קטנה מהשניה. }

א. השלם את גוף הפונקציה.

 

נתונה ההצהרה:   type      CharArray=array[1..100] of char;                                                ונתונה כותרת הפונקציה :                                  function Substring(S:CharArray):integer;

{ טענת כניסה: הפונקציה מקבלת כפרמטר מערך אותיות S בגודל 100                                      }

{ טענת יציאה: הפונקציה מחזירה את אורך הרצף הארוך ביותר של אותיות המסודרות בסדר         }

{                     עולה ממש .                                                                  }

לדוגמה: עבור המערך בגודל 10

b

d

f

r

d

g

k

c

b

h

 

  תחזיר הפונקציה ערך 4  כיוון שאורך הרצף  bdfr הוא 4 .

ב. העזר בפונקציה Smaller שבסעיף א' וכתוב את גוף הפונקציהSubstring  .

 

שאלה 8

נתונה הפונקציה הרקורסיבית הבאה:

   function Secret ( N , A :integer):integer;

                     { טענת כניסה: N ו- A שלמים חיוביים                                } 

                     {טענת יציאה: ___________________________               }

   begin

            if  N = A then

     Secret:=1

            else  if  N < A then

                         Secret:=0

                     else

                          Secret:=Secret ( N- A , A ) + 1

   end;  {Secret }

א.      מה תחזיר הפונקציה עבור הזימון  Secret ( 6 , 2 )  ?

ב.      מה תחזיר הפונקציה עבור הזימון  Secret (7, 3 )  ?

ג.       השלם את טענת היציאה של הפונקציה.

ד.      כתוב פונקציה לא רקורסיבית המבצעת אותה משימה.

 

פרק שלישי ( 20 נקודות)

ענה על אחת מבין השאלות 9 -   10    (20 נקודות).

 

שאלה מספר 9

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

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

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

פלט האלגוריתם יכלול שלושה מרכיבים:

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

ב.  מספרי המנויים שממוצע ההפרעות שלהם גדול מממוצע ההפרעות של החברה בשני החודשים ביחד.

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

 

א.  בחר משתנים עיקריים, הגדר את טיפוסיהם ותאר את תפקידיהם.

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

ג.  כתוב תוכנית בשפת פסקל לפתרון הבעיה על פי האלגוריתם שפיתחת ( אין צורך לחזור על טענות הכניסה והיציאה שפרטת בסעיף ב' ).

 

שאלה מספר 10

על מנת לשפר את האקלים החברתי בקורס "כור היתוך" נקבעה וועדת תרבות. משימתה הראשונה של הוועדה היה לערוך רישום מדויק של כל חבריה. על כן נתבקש כל משתתף למסור את הפרטים הבאים: גילו (במספרים שלמים בין 14 ל - 20), מינו (b/g  ) והחודש בו חל יום הולדתו (1 - 12 ).

כעת, הוועדה מבקשת  לענות על השאלות הבאות:

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

ב.  באיזה חודש/חודשים חל המספר הקטן ביותר של ימי הולדת?

ג.  באיזה חודש/חודשים יש יותר ימי הולדת לבנות מאשר לבנים?

 

יש לפתח ולישם אלגוריתם שהקלט בו הוא נתונים על  200 חברי הקורס, והפלט שלו הוא הדפסת התשובות לשאלות הועדה.

א.  בחר משתנים עיקריים, הגדר את טיפוסיהם ותאר את תפקידיהם.

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

ג.  כתוב תוכנית בשפת פסקל לפתרון הבעיה על פי האלגוריתם שפיתחת ( אין צורך לחזור על טענות הכניסה והיציאה שפרטת בסעיף ב' ).

                                                                                                            בהצלחה ! ! !

פתרונות המבחן לדוגמא - יסודות מדעי המחשב

שאלה מספר 1

א. פירוק המשימה לתת-משימות.

              קליטת המספר התלת סיפרתי

              פירוק המספר לספרותיו

              בדיקה האם הספרות זהות

              הצגה כפלט של ההודעה המתאימה

ב. בחירת המשתנים והגדרת תפקידיהם וטיפוסם.

   Num  - מספר שלם השומר על ערך המספר שנקלט.

  Units - מספר שלם השומר על ערך ספרת האחדות של המספר.

Tens  -  מספר שלם השומר על ערך ספרת העשרות של המספר.

Hund - מספר שלם השומר על ערך ספרת המאות של המספר.

ג. אלגוריתם מילולי

קלוט מספר והשם ב- Num

חשב את ספרת האחדות ע"י Num mod 10  והשם ב Units.

חשב את ספרת העשרות ע"י  ( Num div 10 ) mod 10  והשם ב Tens.

חשב את ספרת המאות ע"י Num div 100  והשם ב Hund.

אם ( Units = Tens ) וגם ( Tens = Hund ) אזי

                                    הצג כפלט ' ספרות זהות'

אחרת  הצג כפלט ' ספרות שונות'

 

שאלה מספר 2

א.      פלט התוכנית הוא:  YzAycz .

ב.      דוגמא 1:    AbCAeB

     דוגמא 2:    abCaeB

ג.       קטע התוכנית החדש:

var

   Ch: char;

begin

  read(Ch);

  while Ch <  >  '.' do

    begin

if  (Ch='Z')  then write( 'A' )

else  if  (Ch='z') then  write('a')

         else write((succ(Ch));

            read(Ch)

   end

end;

 

שאלה מספר 3

א.      4 .  ( למעשה כל סיפרה  0 - 9 ) .

ב.      123 . ( נוצרת לולאה אין סופית ).

ג.       תיקון קטע התוכנית:

writeln('הקש מספר טבעי');

readln(N);

Count := 0;

while N  >  0 do

            begin

               N := N div 10;

   Count := Count+1

end;

writeln(Count, ' מספר הספרות הוא ')

שאלה מספר 4

א.      הגדרת טיפוס הנתונים DiskType :

DiskType = record

                        Kind:char;

                        Num:integer;

                        Year:integer;

                        Price:real;

                        New:boolean;

                    end

ב.      משפט התנאי המבוקש:

if   (Disk.Year < 1980 ) and ( not Disk.New ) then Disk.Price  :=  Disk.Price / 2

 

שאלה מספר 5

1.                   אינה מתאימה - Max ו- Min  אינם מחזירים ערכים כמבוקש.

2.                   מתאימה.

3.                   אינה מתאימה - A מוגדר כמספר שלם ולא כמערך.

4.                   אינה מתאימה - חוסר התאמה בסדר של הפרמטרים.

5.                   אינה מתאימה - אסור להצהיר על טיפוס בפרמטר.

פרק שני

שאלה מספר 6

א.      פלט הפונקציה הוא: 4

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

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

ד.      הפונקציה המתוקנת:

function Count_k_pairs(K : integer) : integer;

{טענת כניסה: הפונקציה מקבלת כפרמטר מספר שלם חיובי K                                          }

{טענת יציאה: הפונקציה מחזירה את מספר הזוגות של מספרים עוקבים שסכומם שווה ל  K   }

   var

       Num1, Num2, Count, I : integer;

begin

Count := 0;

writeln(‘ הקש 10 מספרים שלמים ‘);

readln(Num1);

for I := 1 to 9 do

            begin

                readln(Num2);

                if ( Num1+Num2 ) = K then

                      Count := Count+1;

                Num1 := Num2

            end;

         Count_k_pairs := Count

   end;  { Count_k_pairs }

שאלה 7

א.      השלמת גוף הפונקציה:

begin

   Smaller :=  Letter1<Letter2

end

ב.      השלמת גוף הפונקציה Substring

 

function Substring(S : CharArray) : integer;

   var

     MaxLength , I , Count:integer;

   begin

        Maxlength := 0 ; Count := 1;

        for I := 1 to 99 do

            if  Smaller(S[I],S[I+1]) then

                 Count := Count+1

            else

                   begin

                        if  Count  >   MaxLength then

                             MaxLength  :=  Count;

                              Count  :=  1;

                   end

if  Count   >   MaxLength then   {בדיקת הרצף האחרון }

                             MaxLength := Count;

        Substring := MaxLength;

   end;

שאלה מספר 8

א.      3

ב.      2

ג.       טענת היציאה: הפונקציה מחזירה את תוצאת הפעולה  N div A .

ד.      פונקציה לא רקורסיבית:

function Secret ( N , A :integer):integer;

                               { טענת כניסה: N ו- A שלמים חיוביים                                 } 

                               {טענת יציאה: הפונקציה מחזירה את תוצאת הפעולה  N div A }

   begin

            Secret := N div A

   end;  {Secret }

פרק שלישי

שאלה מספר 9

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

קבועים

MaxCustomers - מספר לקוחות

טיפוסים

  MonthArrays - מערך מספרים מטיפוס  integer  לשמירת מספר ההפרעות בכל חודש.

 

משתנים

  FirstMonth - מערך מטיפוס MonthArrays  לשמירת מספר ההפרעות של כל לקוח בחודש הראשון.

 SecondMonth - מערך מטיפוס MonthArrays  לשמירת מספר ההפרעות של כל לקוח בחודש השני.

FirstSum - משתנה שלם לשמירת סך ההפרעות בחודש הראשון.

 SecondSum - משתנה שלם לשמירת סך ההפרעות בחודש השני.

  CAve- משתנה לשמירת ממוצע ההפרעות של החברה במשך חודשיים.

 

ב.      פירוק הבעיה לתת בעיות

1.                   קליטת הנתונים עבור כל לקוח בשני חודשים והשמתם ב FirstMonth  וב- SecondMonth בהתאמה

2.                   חישוב סך ההפרעות של הלקוחות בחודש הראשון והשמתו  ב FirstSum.

3.                   חישוב סך ההפרעות של הלקוחות בחודש השני והשמתו ב SecondSum.

4.                   הודעה אם SecondSum  גדול   מ-  FirstSum.

5.                   חישוב ממוצע ההפרעות של החברה במשך שני החודשים.

 

 

הפרוצדורות והפונקציות המתאימים

1.  קליטת הנתונים עבור כל לקוח :

procedure GetInfo(var FirstMonth,SecondMonth:MonthArray);

{טענת יציאה: הפרוצדורה מחזירה במערך FirstMonth את מספר ההפרעות של כל לקוח        }

{                 בחודש הראשון ובמערך SeconMonth FirstMonth את מספר ההפרעות של כל }

{                 לקוח בחודש השני                                                                                }

 

2.  חישוב סך ההפרעות של הלקוחות בחודש

function SumDis(Month:MonthArray):integer;

{טענת כניסה:  הפונקציה מקבלת מערך של הפרעות הלקוחות במשך חודש אחד }

{טענת יציאה :  הפונקציה מחזירה את סך כל ההפרעות בחודש }

 

3.  חישוב ממוצע ההפרעות של החברה במשך שני החודשים

function CompanyAve(FirstSum , SecondSum :integer):real;

{טענת כניסה: הפונקציה מקבלת את סך כל ההפרעות בשני החודשים            }

{טענת יציאה  הפונקציה מחזירה את ממוצע ההפרעות בחושיים                   }

 

4.  מציאת מספרי המנויים שממוצע ההפרעות גדול ממוצע החברה בחודשיים

procedure CustomerAve(FirstMonth , SecondMonth : MonthArray;

                                         CompanyAve:real);

{ טענת כניסה: הפרוצדורה מקבלת מערכי הפרעות של שני החודשים וממוצע ההפרעות של }

{                   החברה בחודשים אלה                                                                     }

{טענת יציאה : הפרוצדורה מדפיסה את מספרי המנויים שממוצע ההפרעות שלהם גדול      }

{                   מממוצע החברה בחודשיים                                                               }

 

5. הדפסת המנוי שמספר הההפרעות שלו הקרוב ביותר למספר ההפרעות הממוצע

procedure CloseCustomer(FirstMonth: MonthArray ; FirstSum : integer);

{טענת כניסה: הפרוצדורה מקבלת מערך הפרעות של החודש הראשון וסך ההפרעות של          }

{                   החברה בחודש הראשון                                                                        }

{ טענת יציאה: הפרוצדורה מדפיסה את המנוי שמספר הההפרעות שלו הקרוב ביותר למספר    } 

{                  ההפרעות הממוצע                                                                               }

 

ג. התוכנית בשפת פסקל

 

program Telephon(input,output);

const

  MaxCustomers=100;

type

  MonthArray=array[1..MaxCustomers] of integer;

var

  FirstMonth , SecondMonth : MonthArray;

  FirstSum , SecondSum : integer;

  CAve: real;

 

procedure GetInfo(var FirstMonth,SecondMonth:MonthArray);

  var

    I:integer;

  begin

    for I := 1 to MaxCustomers do

      begin

        writeln('הקש את מספר ההפרעות בחודש הראשון ובחודש השני ');

        readln(FirstMonth[I], SecondMonth[I]);

      end;

  end; { GetInfo }

 

  function SumDis(Month:MonthArray):integer;

   var

     I,Sum:integer;

   begin

     Sum := 0;

     for I := 1 to MaxCustomers do

         Sum := Sum+Month[I];

     SumDis := Sum

   end;

 

function CompanyAve(FirstSum , SecondSum :integer):real;

  begin

         CompanyAve := (FirstSum+SecondSum)/(2*MaxCustomers)

    end;

 

   procedure CustomerAve(FirstMonth,SecondMonth :MonthArray;

                         CompanyAve:real);

    var

      I:integer;

    begin

      for I := 1 to MaxCustomers do

          if ((FirstMonth[I]+SecondMonth[I]) / 2  )  >   CompanyAve  then

                                                          writeln(I,'more dis');

    end;

 

    procedure CloseCustomer(FirstMonth: MonthArray;

                                                 FirstSum:integer);

      var

        I:integer;

        Ave,Temp:real;

        Closest:integer;

      begin

        Closest := 1;

        ave := FirstSum/MaxCustomers;

        for I := 1 to MaxCustomers do

          begin

               Temp := abs(FirstMonth[I]-Ave);

               if Temp<Closest then

                                Closest := I;

          end;

        writeln(Closest,'cusomer');

      end;

 

 

   begin  { main }

     GetInfo (FirstMonth , SecondMonth );

     FirstSum  :=  SumDis( FirstMonth );

     SecondSum  :=  SumDis( SecondMonth );

     if (SecondSum  >  FirstSum) then

                       writeln ('סה"כ ההפרעות בחודש השני גדול מסה"כ ההפרעות בחודש הראשון ');

     else writeln ('סה"כ ההפרעות בחודש השני אינו גדול מסה"כ ההפרעות בחודש הראשון ');

     CAve  :=  CompanyAve (FirstSum , SecondSum);

     CustomerAve (FirstMonth , SecondMonth , CAve);

     CloseCustomer (FirstMonth , FirstSum);

end.

 

 

 

 

 

 

שאלה מספר 10

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

קבועים

מספר החברים בקורס: Max                 

טיפוסים

1.                 רשומה המייצגת חבר בקורס  :           MemberType = record

     Age : integer;

         Sex : char;

 Month : integer;

                            end

2.                   מערך רשומות מטיפוס  Member  לשמירת נתוני כל חברי הקורס.

                   MemberArray = array[1..Max] of Member

3.                   מערך מספרים מטיפוס  integer  לשמירת מספר ימי ההולדת בכל חודש.

                  IntArray = array[1..12] integer                    

משתנים

1.      Members - מערך מטיפוס      MemberArrayלקליטת הנתונים עבור כל החברים.

2.      Birthdays - מערך מטיפוס IntArray למניית ימי ההולדת בכל חודש.

3.      Boys  - מערך מטיפוס IntArray למניית ימי ההולדת של הבנים בכל חודש.

4.       Girls- מערך מטיפוס IntArray למניית ימי ההולדת של הבנות בכל חודש.

 

 

 

 

ב. חלוקה לתת-משימות

1.      קליטת הנתונים לכל המדריכים.

2.      בדיקה אם קבוצת הגיל 18 מאוזנת.

3.      איפוס מערך מונים.

4.      יצירת מערך מונים מטיפוס שלם למניית מספרי ימי ההולדת בכל חודש.

5.      מציאת החודשים בהם חל המספר הקטן ביותר של ימי ההולדת.

6.      יצירת מערכי מונים מטיפוס שלם למניית מספרי ימי ההולדת עבור בנים ובנות בנפרד.

7.      מציאת החודשים בהם יש יותר ימי הולדת לבנים מאשר לבנות.

 

כותרות הפרוצדורות/פונקציות

א. קליטת הנתונים לכל המדריכים.

procedure  GetInfo ( var Members : MemberArray);

{טענת יציאה: הפרוצדורה קולטת את נתוני החברים                                                  }

 

ב. בדיקה אם קבוצת הגיל 18 מאוזנת.

function  Balance ( Members : MemberArray ) : boolean;

{ טענת כניסה: הפונקציה מקבלת את מערך נתוני החברים                                         }

{טענת יציאה:  הפונקציה מחזירה ערך true אם קבוצת הגיל  18 מאוזנת, false - אחרת    }

 

ג. איפוס מערך מונים

procedure Init( var Birthdays:IntArray);

{ טענת כניסה: הפרוצדורה מקבלת מערך מונים                                                     }

{טענת יציאה: הפרוצדורה מאפסת את אברי המערך                                               }

 

ד. יצירת מערך מונים מטיפוס שלם למניית מספרי ימי ההולדת בכל חודש.

Procedure Birth (Members : MemberArray ; var Birthdays:IntArray );

{טענת כניסה: הפרוצדורה מקבלת את מערך נתוני החברים                                     }

{טענת יציאה: הפרוצדורה יוצרת מערך מניה עבור מספר ימי ההולדת בכל חודש          }

 

ה.      מציאת החודשים בהם חל המספר הקטן ביותר של ימי ההולדת.

procedure MinBirth (Members : MemberArray ; Birthdays : IntArray );

{טענת כניסה: הפרוצדורה מקבלת את מערך נתוני החבדים ואת מערך מוני החודשים         }

{ טענת יציאה: הפרוצדורה פולטת את מספרי החודשים בהם חל המספר הקטן ביותר של  ימי } {                   הולדת.                                                                                            }

 

ו.         יצירת מערך מונים מטיפוס שלם למניית מספרי ימי ההולדת עבור בנים ובנות בנפרד.

Procedure BirthBySex (Members : MemberArray; Sex:char ; var Mem:IntArray );

{טענת כניסה: הפרוצדורה מקבלת את מערך נתוני החברים, וסוג מין מבוקש ( b/g )           }

{ טענת יציאה: הפרוצדורה יוצרת מערך מנייה עבור החברים בעלי המין Sex                    }

 

ז. מציאת החודשים בהם יש יותר ימי הולדת לבנים מאשר לבנות.

procedure MoreBoys ( Members : MemberArray ; Birthdays : IntArray );

{טענת כניסה: הפרוצדורה מקבלת את מערך נתוני התלמידים ואת מערך מוני החודשים          }

{טענת יציאה:  הפרוצדורה מוצאת את מספרי החודשים בהם יש יוצר ימי הולדת לבנים מאשר } {                  לבנות                                                                                                                )

 

ג.       התוכנית בשפת פסקל

program Course(input,output);

const

 Max=200;

type

 MemberType = record

                Age : integer;

                Sex : char;

                Month : integer;

              end;

 

 MemberArray = array[1..Max] of MemberType;

 IntArray = array[1..12] of integer;

var

 Members : MemberArray;

 Birthdays, Boys , Girls :IntArray;

 

procedure  GetInfo ( var Members : MemberArray);

 var

  I : integer;

 begin

  for I := 1 to Max do

   begin

    writeln;

    readln(Members[I].Age);

    readln(Members[I].Sex);

    readln(Members[I].Month);

   end;

 end;

 

function  Balance( Members : MemberArray ) : boolean;

   var

    I : integer;

    Count:integer;

   begin

    Count := 0;

    for I := 1 to Max do

      begin

        if members[I].age=18 then

                             if Members[I].Sex='b' then Count := Count+1

                             else Count := Count-1;

        Balance := abs(Count)<=5;

      end;

   end;

 

procedure Init( var Birthdays:IntArray);

    var

     I : integer;

    begin

     for I := 1 to 12 do

       Birthdays[I] := 0;

    end;

 

procedure Birth (Members : MemberArray ; var Birthdays:IntArray );

  var

     I:integer;

 

  begin

     for I := 1 to Max do

        Birthdays[Members[I].Month] := Birthdays[Members[I].Month]+1;

  end;

 

procedure MinBirth (Birthdays : IntArray );

   var

     I , Min : integer;

   begin

     Min := Max;

     for I := 1 to 12 do

       if Birthdays[I]<Min then Min := Birthdays[I];

     for I := 1 to 12 do

       if Birthdays[I]=Min then writeln( I );

   end;

 

 

procedure BirthBySex (Members : MemberArray; Sex:char ; var Mem:IntArray );

  var

     I:integer;

 

  begin

     for I := 1 to Max do

       if Members[I].Sex=Sex then

        Mem[Members[I].Month] := Mem[Members[I].Month]+1;

  end;

 

procedure MoreBoys ( Boys,Girls: IntArray );

   var

    I :integer;

   begin

      for I := 1 to 12 do

       if Girls[I] > Boys[I] then writeln ( I );

   end;

 

 begin  { main }

   GetInfo ( Members);

   writeln (Balance(Members));

   Init(Birthdays);

   Birth(Members,Birthdays);

   MinBirth(Birthdays);

   Init(Boys);

   Init(Girls);

   BirthBySex(Members,'b',Boys);

   BirthBySex(Members,'g',Girls);

   MoreBoys( Boys,Girls);

 end.