פרק שלישי
שאלה מספר 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;
ompanyAve: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.