Java/תנאים ולולאות/תרגילים

לולאות - התחלה עריכה

כוכביות עריכה

כתבו תוכנית, קצרה ככל האפשר, המדפיסה בשורה 20 כוכביות ('*').

פתרון
public class SimpleLoop {

	public static void main(String[] args) {		
		for(int i=0; i<20; i++) {
			System.out.print("*");
		}
		System.out.println();
	}
}


כוכביות 2 עריכה

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

פתרון
public class SimpleLoop {
	

	public static void main (String[] args) 
		{
		for(int i=0; i<20; i++) {
			 for(int j=0; j<i; 
j++) {
				 for(int r=j; j<i; j++) {
                    System.out.print(" ");
            }
                    System.out.print("*");
			 }
			 System.out.println("\t");
                    
    }
  }
}


מחרוזות - חזרה עריכה

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

היפוך עריכה

כתבו תוכנית פשוטה שתקבל מחרוזת מהמשתמש, ותהפוך אותה על פניה. כלומר: אם התקבלה המחרוזת "ding dong", תודפס המחרוזת "gnod gnid". הנחיה: השתמשו בפונקציית הספרייה charAt ובלולאה מתאימה.

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

public class Strings {

    public static void main(String[] args) {

        String str;
        
        System.out.print("Enter a string: ");
        Scanner s = new Scanner(System.in);
        str = s.nextLine();
        System.out.print("Backwards: ");
        for(int i=str.length()-1; i>=0; i--) {
        	System.out.print(str.charAt(i));
        }
        System.out.println(); 
    }

}


חיפוש במחרוזת עריכה

כעת כיתבו תוכנית שתקבל אות ומחרוזת, ותדע לומר מתי מופיעה האות במחרוזת בפעם הראשונה. לדוגמה: אם המשתמש יכניס "a" ו-"Bla bla", הפלט יהיה 3, שכן האות מופיעה בפעם הראשונה במקום השלישי. דאגו לכך שאם האות לא מופיעה כלל, תגיב התוכנית בהתאם.

הנחיות:

  • את קליטת האות בצעו באמצעות קליטה של מחרוזת, ואז שימוש ב-charAt.
  • שימו לב למקרה בו מופיעה אות כמה פעמים במחרוזת - דאגו שבמקרה כזה לא ישתבש פלט התוכנית.
  • שגיאה נוספת יכולה להיווצר מהצורה בה מתייחסת הפקודה charAt למחרוזות. בעוד שעבורנו האות הראשונה מספרה 1, עבור charAt האות הראשונה היא במקום ה-0. תיקון קל יכול לסדר את הבעייה.
פתרון
import java.util.Scanner;

public class Strings {

    public static void main(String[] args) {

        String str;
        char c;
        int location=-1;
        boolean found = false;
        
        System.out.print("Enter a string: ");
        Scanner s = new Scanner(System.in);
        str = s.nextLine();
        System.out.print("Now enter a character: ");
        c = s.nextLine().charAt(0);
        for(int i=0; i<str.length() && !found; i++) {
        	if(str.charAt(i) == c) {
        		location = i+1;
        		found = true;
        	}
        }
        if (location!=-1)
			System.out.println(location);
		else
			System.out.println("Not found");
    }

}


תנאים לקלט עריכה

סדרה עריכה

סדרה חשבונית היא סדרה של מספרים עם הפרש קבוע ביניהם. למשל: 1,2,3,4,5 היא סדרה חשבונית. גם 9,7,5,3,1 היא סדרה חשבונית. 1,2,4,8 היא לא סדרה חשבונית, כיוון שההפרש בין האיברים הוא לא קבוע. כתבו תוכנית המקבלת קלט שמורכב מהאיבר הראשון של הסדרה, ההפרש בין האיברים, ומספר האיברים בסדרה, ומדפיסה את הסדרה כולה. אם, לדוגמה, מקבלת התוכנית את הקלט 1 2 3 תדפיס התוכנית את הסדרה 1,3,5 (שלושה איברים, שההפרש ביניהם 2, והראשון מביניהם הוא 1). מספר האיברים שהתוכנית שלנו תסכים להדפיס הוא מוגבל: לכל הפחות, תודפס סדרה ובה איבר אחד (שהוא האיבר הראשון). לכל היותר, תדפיס התוכנית 15 איברים. דאגו לכך שאם המשתמש מכניס קלט אחר, תדפיס התוכנית הודעה מתאימה ותעצור. ניתן להשתמש בפקודה System.exit(0) כדי לעצור את פעולת התוכנית, אך לא חובה להשתמש בה.

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

public class Progression {

	public static void main(String[] args) {
		int a1, n, d;
		Scanner s = new Scanner(System.in);		
		System.out.print("Enter first number: ");
		a1 = s.nextInt();
		System.out.print("Enter difference: ");
		d = s.nextInt();
		System.out.print("Enter length: ");
		n = s.nextInt();
		if(n>0 && n<16) {
			for(int i=0; i<n; i++) {
				System.out.print(a1+d*i+" ");
			}
			System.out.println();
		}
		else {
			System.out.println("Illegal input!");
			System.exit(0);
		}
	}

}


הזדמנות שנייה עריכה

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

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

public class Progression {

    public static void main(String[] args) {
        
        int a1, n, d;
        boolean b=false;
        Scanner s = new Scanner(System.in); 
        
        System.out.print("Enter first number: ");
        a1 = s.nextInt();
        System.out.print("Enter difference: ");
        d = s.nextInt();
        System.out.print("Enter length: ");
        n = s.nextInt();
        if (n>0 && n<16) b=true;
        for (int j=0; j<4 && b==false; j++) {
        	System.out.println("Illegal input, enter a number between 1 and 15");
        	n=s.nextInt();
        	if (n>0 && n<16) b=true;
        }
        
        // if (b) is just like if (b==true)
        if (b) {
        	for(int i=0; i<n; i++) {
                System.out.print(a1+d*i+" ");
            }
        }
        else System.out.print("Illegal input!");

    }
}