Java/מערכים/תרגילים

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

פעולות בסיסיות[עריכה]

בנייה ואתחול של מערך[עריכה]

כתבו תוכנית שתיצור מערך מסוג int ובו 10 איברים, ותכניס לתאיו את הערכים 1 עד 10, בהתאמה. לאחר מכן תדפיס התוכנית את תוכן המערך.

פתרון
public class MyArray {

	public static void main(String[] args) {
		int[] arr = new int[10];
		
		for(int i=0; i<arr.length; i++) 
			arr[i] = i+1;
		for(int i=0; i<arr.length; i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}

}


מערך בגודל משתנה[עריכה]

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

פתרון
import java.util.Scanner;

public class MyArray {

	public static void main(String[] args) {
		int size;
		Scanner s = new Scanner(System.in);
		System.out.print("Enter array size: ");
		size = s.nextInt();	
		if(size<1 && size>100) {
			System.out.println("Illegal size.");
			System.exit(1);
		}
		
		int[] arr = new int[size];
		
		for(int i=0; i<arr.length; i++) 
			arr[i] = i+1;
		for(int i=0; i<arr.length; i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}

}


חיפוש במערך[עריכה]

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

int[] arr = new int[100];
for(int i=0; i<arr.length; i++) 
	arr[i] = (int) (1 + Math.random()*100);

הסבר: הפונקציה Math.random יוצרת מספר אקראי מסוג double, שערכו נע בין 0.0 ל-0.999.... כדי לקבל מספר בין 0 ל-99, הכפלנו את התוצאה ב-100, וכדי לקבל ערך בין 1 ל-100 - הוספנו 1. לאחר מכן המרנו את המספר להיות מסוג int במקום מסוג double.

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

פתרון
import java.util.Scanner;

public class MyArray {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		boolean found, flag = true;
		int[] arr = new int[100];
		for(int i=0; i<arr.length; i++) 
			arr[i] = (int) (1 + Math.random()*100);
		do {
			System.out.print("Enter number to search: ");
			int num = s.nextInt();
			if(num>0 && num<=100) {
				int i;
				found = false;
				// Search the array until number is found, or until end of array
				for(i=0; i<arr.length && !found; i++) {
					if(arr[i] == num) found = true;
				}
				if(found) 
					System.out.println("Number was found on cell "+i);
				else
					System.out.println("Number was not found");
			}
			else flag = false;
		} while(flag);
	}
}

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


אתגר:

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

מיון של מערך[עריכה]

גם התוכנית הזו תשתמש במערך של מספרים אקראיים, אך למען הנוחות נקטין את גודל המערך ל-10. כתבו תוכנית שתיצור מערך כזה ותדפיס אותו, ולאחר מכן תסדר אותו בסדר עולה ותדפיס אותו כשהוא ממויין. לדוגמה, אם נוצר המערך 10 6 15 4, אחרי פעולת המיון המערך יהיה 4 6 10 15. הערה: כדאי לקחת פסק זמן למחשבה ולתכנון לפני כתיבת התוכנית. קיימות דרכים רבות מאוד ליצור תוכנית כזו, חלקן יעילות יותר וחלקן פחות. נסו למצוא דרך שתעבוד בכל מצב, גם אם אינה היעילה ביותר.

פתרון
public class MyArray {

	public static void main(String[] args) {
		int[] arr = new int[10];
		for(int i=0; i<arr.length; i++) 
			arr[i] = (int) (1 + Math.random()*100);
		for(int i=0; i<arr.length; i++)
			System.out.print(arr[i]+" ");
		System.out.println();
		int x = arr.length;
		boolean swapped;
		// Sort the array using bubble sort
		do {
			x--;
			swapped = false;
			for(int j=0; j<x; j++) {
				// Switch locations between arr[j] and arr[j+1]
				if(arr[j]>arr[j+1]) {
					swapped = true;
					int temp = arr[j+1];
					arr[j+1] = arr[j];
					arr[j] = temp;
				}
			}
		} while(swapped);
		for(int i=0; i<arr.length; i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
}

פתרון זה משתמש במיון בועות, שיטה פשוטה אך לא יעילה במיוחד למיון מערך.


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

אמנות מודרנית[עריכה]

כתבו תוכנית שתבנה מערך דו מימדי בגודל 5X5, תמלא אותו באופן אקראי בסימנים "*", "#", "!", או "&", ותדפיס אותו.

פתרון
public class MyArray {

	public static void main(String[] args) {
		char arr[][] = new char[5][5];
		for(int i=0; i<arr.length; i++) {
			for(int j=0; j<arr[i].length; j++) {
				int num = (int) (Math.random()*4);
				char ch = ' ';
				if(num==0) ch = '#';
				if(num==1) ch = '*';
				if(num==2) ch = '!';
				if(num==3) ch = '&';
				arr[i][j] = ch;
			}
		}
		for(int i=0; i<arr.length; i++) {
			for(int j=0; j<arr[i].length; j++) {
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
	}
}

שנו את התוכנית כך שהמערך יכיל 10 עמודות, ושורות המערך יהיו בגודל אקראי (בין 1 ל-10).

פתרון
public class MyArray {

	public static void main(String[] args) {
		char arr[][] = new char[10][];
		for(int i=0; i<arr.length; i++)
			arr[i] = new char[(int) (1+Math.random()*10)];
		for(int i=0; i<arr.length; i++) {
			for(int j=0; j<arr[i].length; j++) {
				int num = (int) (Math.random()*4);
				char ch = ' ';
				if(num==0) ch = '#';
				if(num==1) ch = '*';
				if(num==2) ch = '!';
				if(num==3) ch = '&';
				arr[i][j] = ch;
			}
		}
		for(int i=0; i<arr.length; i++) {
			for(int j=0; j<arr[i].length; j++) {
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
	}
}