הקצאה דינמית ב ++C

benny++C, Arrays, functions, UncategorizedLeave a Comment

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

 

הערה חשובה: לעיתים הבודק האוטומטי לא מקבל את פקודת delete – ולכן לא יתקבל ציון 80. במקרה כזה, יש לסמן כהערה את פקודת ה delete לפני העלאה לבדיקה נוספת (אך לא למחוק אותה. פקודה חסרה לא תקבל ציון בבדיקה הידנית).

 

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

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

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

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

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

  • הוספת קו למערכת
  • הורדת קו מהמערכת

 

 

לצורך כך, כתוב תכנית, אשר כוללת את הנתונים והפעולות הבאים:

מסד הנתונים של החברה ישמר במערך דו ממדי בשם buses. מספר השורות במערך הוא (בדיוק) כמספר הקווים הקיימים. ומספר העמודות הוא 3. כאשר, עבור כל קו – העמודה הראשונה מכילה את מספר הקו, השנייה את מספר התחנות במסלול, והשלישית – את משך הנסיעה. (להזכירך: מערך דו ממדי, הוא למעשה מערך חד ממדי של מצביעים. כאשר –  כל אחד מהמצביעים מצביע על מערך חד ממדי נוסף).
המטריצה תישמר בכל עת כשהיא ממוינת לפי מספרי הקווים.

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

  • addLine הוספת קו אוטובוס חדש למערכת. הפונקציה מקבלת את המטריצה buses ואת גודלה, וכן – נתונים על הקו החדש: מספר הקו, מספר תחנות ומשך נסיעה. על הפונקציה להוסיף את המידע למערך buses. (שים לב: המשמעות היא, בין השאר, שאורך מערך המצביעים גדל ב-1. כמו כן – גם המערך buses החדש יהיה ממויין לפי מספרי הקווים).
  • deleteLine הורדת קו אוטובוס קיים מהמערכת. הפונקציה מקבלת את המטריצה buses ואת גודלה, וכן – את מספר הקו להורדה מהמערכת. על הפונקציה למחוק את כל המידע על קו זה מהמערך buses. (המשמעות היא, בין השאר, שאורך מערך המצביעים  קטן ב- 1).
    שים לב! במידה שהקו אותו ביקש המשתמש למחוק לא קיים במערכת, הפונקציה תשאיר את המערך ללא שינוי (אין הודעת שגיאה ואין קליטת קלט חדש)
  • printהדפסת כל הנתונים שקיימים במערכת. הפונקציה מקבלת את המטריצה buses ואת גודלה. על הפונקציה להדפיס את כל הנתונים במטריצה (כלומר: עבור כל קו יודפס: מספר הקו, מספר התחנות בקו ומשך זמן הנסיעה)
  • search חיפוש קו אוטובוס במערכת. הפונקציה מקבלת את המטריצה buses ואת גודלה.וכן – את מספר הקו לחיפוש. על הפונקציה לבדוק האם מספר הקו קיים במערכת. אם הקו קיים, הפונקציה תחזיר את מספר השורה בה נמצאים נתוני הקו במערכת. במידה והקו לא קיים במערכת, יוחזר הערך -1.
  • averageTravelחישוב זמן הנסיעה הממוצע (כלומר: סכום זמני הנסיעות של כל הקווים, מחולק במספר הקווים הקיימים). הפונקציה מקבלת את המטריצה buses ואת גודלה. על הפונקציה להחזיר את ממוצע זמן הנסיעה של מסלול באוטובוסי החברה.
  • averageStopsחישוב מספר התחנות הממוצע (כלומר: סכום מספר התחנות של כל הקווים, מחולק במספר הקווים הקיימים). הפונקציה מקבלת את המטריצה buses ואת גודלה. על הפונקציה להחזיר את ממוצע מספר התחנות של אוטובוסי החברה, כשהוא מעוגל למספר שלם הקרוב.
  • shortestמציאת הקו עם זמן הנסיעה המינימאלי. הפונקציה מקבלת את המטריצה buses ואת גודלה. על הפונקציה להחזיר את מספר הקו שמשך הנסיעה בו הוא הקצר ביותר. במידה והמערך ריק הפונקציה תחזיר -1.

תזכורת: יש לשחרר את הזיכרון הדינמי עם סיום השימוש בו!

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

כאשר המשתמש בוחר בפעולה 0,  התכנית הראשית תקלוט את פרטי הקו החדש, ותקרא לפונקציה addLine, ולאחר מכן לפונקציה  print.

כאשר המשתמש בוחר בפעולה 1, התכנית הראשית תקלוט את מספר הקו למחיקה, תקרא לפונקציה deleteLine, ולאחר מכן לפונקציה  print.

כאשר המשתמש בוחר בפעולה 2, התכנית הראשית תקרא לפונקציה print

כאשר המשתמש בוחר בפעולה 3, התכנית הראשית תקלוט את מספר הקו לחיפוש, ותקרא לפונקציה search

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

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

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

 

 

 

הנחיות נוספות:

 

  • עבור הפעולה 0 (הוספת קו)

התכנית תדפיס:

enter the line to add

enter the number of stops

enter the duration of the ride

 

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

 

  • עבור הפעולה 1 (מחיקת קו)

התכנית תדפיס:

enter the line to delete

 

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

 

לאחר כל הוספה או מחיקה על התוכנית להדפיס את המערך המעודכן

 

  • עבור הפעולה 2 יודפסו נתוני המערך בצורה הבאה:
  • על התוכנית להדפיס את הנתונים (מספר קו, מספר תחנות, משך נסיעה) כך שהנתונים של כל קו מופיעים באותה שורה (מופרדים באמצעות רווחים), וכל קו מופיע בשורה נפרדת.
  • לדוגמא: עבור שני קווים 2 ו5 כך שבקו 2 היה 10 תחנות וזמן נסיעה של 55 דקות ובקו 2 היו 12 נסיעות עם זמן נסיעה של 70 דקות, הפלט יהיה:

2 10 55

5 12 70

 

  • עבור הפעולה 3 (חיפוש)

התכנית תדפיס:

enter the line to search for

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

 

  • עבור הפעולה 4 (חישוב זמן ממוצע של נסיעה )

התוכנית תדפיס את הערך המוחזר מהפונקציה  averageTravel.

(שים לב: הפונקציה מחזירה את הערך להדפסה ותוכנית הראשית מדפיסה אותו)

 

  • עבור הפעולה 5 (חישוב ממוצע מספר התחנות )

התוכנית תדפיס את הערך המוחזר מהפונקציה  averageStops.

(שים לב: הפונקציה מחזירה את הערך להדפסה ותוכנית הראשית מדפיסה אותו)

 

  • עבור הפעולה 6 (שם הקו בעל משך הנסיעה המינימלי)

התוכנית תדפיס את הערך המוחזר מהפונקציה  shortest.

(שים לב: הפונקציה מחזירה את הערך להדפסה ותוכנית הראשית מדפיסה אותו)

 

  • עבור הפעולה 7 (יציאה )

יציאה מהתוכנית, ללא כל הדפסה נוספת.

 

  • עבור כל מספר אחר (שגיאת קלט)

התכנית תדפיס את ההודעה הבאה:

ERROR

enter 0-7 .

 

המלצה: תכנן את התוכנית – על ידי Top Down Design  – ראשית כתוב את התוכנית הראשית, ולאחר מכן כתוב את הפונקציות.  ניתן להשתמש בשלד התוכנית הראשית המתוארת למטה, עם שינויים כרצונך. כמובן, שחובה עליך לכתוב את הפונקציות להן קוראת התוכנית הראשית.

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

 

ועוד משהו: עבור הפונקציות addbuses ו-deletebuses    שים לב להעביר את המצביע כ-reference אחרת השינוי שנעשה בפונקציה לא יהוא לידי ביטוי בתכנית הראשית.

לדוגמה

addLine(int **& buses)

 

בהצלחה!

 

 

 

 




/*************************
targil bait 8 shela 1
student:benyamin royttenberg
ID:300678802
lecture: Dr meir komer
discription: create a dynamic data base ,1) 
add information or 2) delete information from the 
data base. 3) search in the data base. 4) 
print some clculations from the data base.
**************************/
#include <iostream>
using namespace std;

//prototipe

void addLine(int **buses, int numBuses, int line, int stops, int durationOfRide);
void print(int**buses, int numBuses);
void deleteLine(int** buses, int &numBuses, int line);
void sortBuble(int** buses, int numBuses);
int search(int **buses, int numBuses, int line);
float averageTravel(int**buses, int numBuses);
int shortest(int** buses, int &numBuses);
float averageStops(int** buses, int numBuses); 


int  main()
{
	int ** buses = NULL;
	int numBuses = 0;
	int line;
	int stops;
	int durationOfRide;
	int choice;
	int searchAnswer;
	float averageRide;
	float average_stops;
	int shortRide;

	do {
		cout << "enter 0-7" << endl; cin >> choice;
		switch (choice)
		{
		case 0: // add line
			cout << "enter the line to add" << endl; cin >> line;
			cout << "enter the number of stops" << endl; cin >> stops;
			cout << "enter the duration of the ride" << endl; cin >> durationOfRide;

			numBuses++;    
			// keep the number of buses in data base updated;
			if (numBuses == 1)
				buses = new int *[1];
// creating a dynamic memory for the firsr bus.
			addLine(buses, numBuses, line, stops, durationOfRide);

			sortBuble(buses, numBuses);

			print(buses, numBuses);
			break;

		case 1:	// delete line
			cout << "enter the line to delete" << endl; cin >> line;
			deleteLine(buses, numBuses, line);
			print(buses, numBuses);
			break;
		case 2: // print all lines
			print(buses, numBuses);
			break;
		case 3: // search for a particular line
			cout << "enter the line to search for" << endl; cin >> line;
			searchAnswer = search(buses, numBuses, line);
			cout << searchAnswer << endl;
			break;
		case 4: // calculate average travel time of all buses
			averageRide = averageTravel(buses, numBuses);
			cout << averageRide << endl;
			break;
		case 5:  // calcuate average stops of all buses
			average_stops = averageStops(buses, numBuses);
			cout << average_stops << endl;
			break;
		case 6: // calculate the bus with the shortest travel time
			shortRide = shortest(buses, numBuses);
			cout << shortRide << endl;
			break;
		case 7: break;   // exit the program

		default: cout << "ERROR" << endl;
		}// switch
	} while (choice != 7);

	/*for (int i = 0; i < numBuses; i++) delete[] buses[i]; if (numBuses > 0)
	delete[] buses;*/

	//	system("pause");
	return 0;
}

void addLine(int **buses, int numBuses, int line, int stops, int durationOfRide)
{
	buses[numBuses - 1] = new int[3];
	buses[numBuses - 1][0] = line;
	buses[numBuses - 1][1] = stops;
	buses[numBuses - 1][2] = durationOfRide;

}
void print(int**buses, int numBuses)
{
	for (int i = 0; i < numBuses; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << buses[i][j] << " ";

		}
		cout << endl;
	}

}

void deleteLine(int** buses, int &numBuses, int line)
{

	int**temp = NULL; int chack = 0;
	temp = new int *[numBuses];
	for (int i = 0; i < numBuses; i++)
	{
		temp[i] = new int[3];
	}

	for (int i = 0; i < numBuses; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (buses[i][0] == line)    // if the first element (the line number is always in the index 0) is equal to line 
			{
				chack = 1;           // let me know and change the all the information about this line (all element in thisrow) to (-1) value . 
				buses[i][j] = -1;
				buses[i][j + 1] = -1;
				buses[i][j + 2] = -1;
			}

		}
	}

	if (chack == 1)   // if the line that we wont to delete is Exist
	{
		int *tempArray1;              // create a 1D dynamic temporary array
		tempArray1 = new int[3 * numBuses];  // the size will be 'number of buses *3'

		for (int i = 0, w = 0; i < numBuses; i++)        //  copy all lines data to the temporary array (includind (-1) values).
		{
			for (int j = 0; j < 3; j++)
			{
				tempArray1[w] = buses[i][j];
				w++;
			}
		}

		int* tempArray2 = new int[3 * numBuses];            //  create a another 1D dinamyc temporary_2 array

		for (int i = 0, j = 0; i < 3 * numBuses; i++)
		{
			if (tempArray1[i] != -1)            // copy all lines data to the temporary_2 array without (-1) values.
			{
				tempArray2[j++] = tempArray1[i];
			}
		}

		numBuses--;
		for (int i = 0, w = 0; i < numBuses; i++)
		{
			for (int j = 0; j < 3; j++)                //  copy all lines data back to the busus data base.
			{
				buses[i][j] = tempArray2[w];
				w++;
			}
		}
		//  release the dynamic memory.
		delete[]tempArray2;
		delete[]tempArray1;
		for (int i = 0; i < numBuses; i++)
			delete[] temp[i];
		delete[]temp;
	}

}
void sortBuble(int** buses, int numBuses)
{
	int*array = new int[3 * numBuses];          //  create a 1D dynamic temporary array.
	int temp[3];                        // create another 1D  temporary array 
	for (int i = 0, w = 0; i < numBuses; i++)
	{
		for (int j = 0; j < 3; j++, w++)
		{
			array[w] = buses[i][j];   // copy all lines data to the dynamic temporary array.
		}
	}
	//sortBuble
	int i;
	for (int r = 0; r < numBuses - 1; r++)
	{
		for (i = 0; i < 3 * (numBuses - 1); i += 3) { if (array[i]>array[i + 3])
			{
				for (int j = i, k = 0; k < 3; k++, j++)
				{
					temp[k] = array[j + 3];

				}

				for (int k = 0, j = i; k < 3; k++, j++)
				{
					array[j + 3] = array[j];
				}


				for (int k = 0, j = i; k < 3; k++, j++)
				{
					array[j] = temp[k];

				}

			}

		}

	}


	for (int i = 0, w = 0; i < numBuses; i++)
	{
		for (int j = 0; j < 3; j++, w++)
		{
			buses[i][j] = array[w];      // copy all the sorted data back to the busus data base.
		}
	}
	delete[]array;
}
int search(int **buses, int numBuses, int line)
{

	int i = 0, flag = 0;
	for (i = 0; i < numBuses; i++)
	{
		if (buses[i][0] == line)
		{
			flag = i;
		}
	}

	if (flag == i)
	{
		return flag;
	}
	if (flag == 0)
		return -1;


}
float averageTravel(int**buses, int numBuses)
{
	float averageTravel; int sum = 0;
	for (int i = 0; i < numBuses; i++)
	{
		sum += buses[i][2];
	}
	averageTravel = (float)sum / numBuses;
	return averageTravel;

}
float averageStops(int** buses, int numBuses)
{
	float averageStops; int sum = 0;
	for (int i = 0; i < numBuses; i++)
	{
		sum += buses[i][1];
	}
	averageStops = (float)sum / numBuses;
	return averageStops;

}
int shortest(int** buses, int &numBuses)
{
	int small = 0, flag = 0;
	for (int i = 0; i < numBuses; i++)
	{
		for (int j = 0; j < numBuses; j++)
		{
			if (buses[i][2] < buses[j][2]) { small++; if (small == numBuses - 1) { flag = buses[i][0]; } } } } if (flag>0)
	{
		return flag;

	}
	else
	{
		return -1;
	}
}

/***********OUTPUT*************
enter 0-7
0
enter the line to add
1
enter the number of stops
1
enter the duration of the ride
1
1 1 1
enter 0-7
0
enter the line to add
3
enter the number of stops
2
enter the duration of the ride
4
1 1 1
3 2 4
enter 0-7
0
enter the line to add
5
enter the number of stops
6
enter the duration of the ride
4
1 1 1
3 2 4
5 6 4
enter 0-7
0
enter the line to add
7
enter the number of stops
6
enter the duration of the ride
5
1 1 1
3 2 4
5 6 4
7 6 5
enter 0-7
1
enter the line to delete
1
3 2 4
5 6 4
7 6 5
enter 0-7
6
5
enter 0-7
4
4.33333

****************************/



כתיבת תגובה

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