Bölüm 3 - Java da Programlama Yapılarının Temelleri 5
Input ve Output (Girdi Çıktılar)
Biz Java'da console'ya çıktılarımızı verirken "standart output stream" kullanıyoruz, bunu da sadece
- System.out Input almak istersek eğer bunu da console'dan aldığımız süreci de;
- System.in ile yapıyoruz. Tabi bu console'ya çıktı yazdırmak gibi kolay değildir çünkü Scanner classını oluşturmamız gereklidir.
import java.util.Scanner;
.....
.....
Scanner in = new Scanner(System.in);
Artık şimdi input almak için Scanner classının çeşitli methodlarını kullanabiliriz. Örneğin nextLine ile bir input alabiliriz.
System.out.print("What is your name? ");
String name = in.nextLine();
nextLine kullanmamızdaki sebep girdi birden fazla satıra sahip olabilmesinden dolayıdır;
Eğer ki tek bir kelimeyi okumak isteseydik, next() kullanabilirdik.
String name = in.next();
Eğer ki integer okumak istersek; nextByte,nextShort,nextInt,nextLong kullanabiliriz Eğer ki floating-point okumak istersek; nextFloat yada nextDouble methodlarını kullanabiliriz.
Not : Scanner class'ı bizim input'tan password okumamız için gerekli şartları sağlamaz çünkü plaintext yazar. Bunu çözmek için de Console classını kullanabiliriz.
Console cons = System.console();
String username = cons.readLine("Username : ");
char[] passwd = cons.readPassword("Password : ");
String passwdString = Arrays.toString(passwd);
System.out.println("Username : "+username+"\nPassword : "+passwdString);
java.util.Scanner
| Method | Açıklaması |
|---|---|
| Scanner(InputStream in) | Verilen Input Stream'dan bir Scanner nesnesi üretir. |
| String nextLine() | Input'un satırını okur. |
| String next() | Input'un satırdaki kelimesini okur. |
| byte nextByte() | Input'dan byte alır. |
| short nextShort() | Input'dan short alır. |
| int nextInt() | Input'dan int alır. |
| long nextLong() | Input'dan long alır. |
| float nextFloat() | Input'dan float alır. |
| double nextDouble() | Input'dan double alır. |
| boolean hasNext() | Input'da diğer bir kelime var mı kontrol eder |
| boolean hasNextByte(),hasNextShort(),hasNextInt(), hasNextLong() | Input'da diğer bir byte,short,int,long var mı kontrol eder. |
| boolean hasNextFloat(),hasNextDouble() | Input'da diğer bir float,double var mı kontrol eder. |
Control Flow
Java da diğer çoğu programlama dili gibi conditional statements (şartlı ifadeler) ve loop (döngüleri) içerir çünkü bunlar sayesinde kodumuzun kontrol akışını yürütürüz.
Conditional Statements (Şartlı İfadeler)
Conditional statements JAva'da şöyle bir yapısı vardır:
if (condition) statement
Condition her zaman parantezler ile çevrili olmak zorundadır!
if (yourSales >= target){
performance = "Satisfactory;
bonus = 100;
}
Eğer ki birden fazla conditional ifade yapmak istersek Java'da
if (condition) statement1 else statement2;
if (yourSales >= target){
performance = "Satisfactory";
bonus = 100 + 0.01 * (yourSales - target);
}else {
performance = "Unsatisfactory";
bonus = 0;
}
Eğer ki iki şarttan daha fazla conditional ifadeye ihtiyacımız varsa
if (yourSales >= 2*target){
performance = "Excellent";
bonus = 1000;
}else if (yourSales >= 1.5 * target){
performance = "Fine";
bonus = 500;
}else if (yourSales >= target){
performance = "Satisfactory";
bonus = 100;
}else {
System.out.println("You are fired");
}
Loops (Döngüler)
Java'da döngüleri bir ifadeyi birden fazla tekrar ederek yazmak istersek kullanabiliriz.
while loop syntax;
while (condition) statement
condition doğru olduğu sürece statement çalışacaktır.
while(balance < goal){
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
years++;
}
System.out.println(years+" years.");
while loop'da testler her zaman en başta başlar yani conditionu testini yapar, eğer ki condition false ise kesinlikle döngüye girmez. Eğer ki biz bir kere bile statement'imizin çalışmasını istiyorsak bu sefer do-while döngüsünü kullanmamız gerekir.
do statement while (condition);
do içerisindeki statement bir defa çalışacaktır; condition yanlış olsa bile; daha sonra condition doğru ise statement çaışmaya devam edecektir..
do {
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
years++;
...
}while(input.equals("N"));
Belirli Döngüler
Bazı döngüler örneğin "for döngüsü" her döngüde bir counter (sayaç) tarafından artırılıp azaltılmaya göre kontrol edilir.java
for(int i = 1;i<=10;i++){
System.out.println(i);
}
Ilk ifadesi counter initialization (sayaç başlatıcı bizim için i = 1) olarak ifade edilir ve ikinci ifade (i<=10) ifadesi de condition yani her döngüde şartımız doğru mu yanlış mı onu kontrol ederiz. Üçüncü kısım ise counter'i günceller yani (i++) bir arttırır.
UYARI ! Floating-point sayılar ile döngüler yazma çünkü bu döngü sonsuza kadar devam edebilir. Roundoff hatalar yüzünden condition hiçbir zaman son sayıya ulaşamayabilir
java
for(double x = 0;x!=10;x+=0.1){} // Bu döngü bitmez.
Multiple Selections with switch
if/else yazdığımız ifadeleri istersek switch ile de yazabiliriz.
Scanner in = new Scanner(System.in);
System.out.println("Select an option (1,2,3,4) ");
int choice = in.nextInt();
switch(choice){
case 1 ->
..
case 2 ->
..
default ->
System.out.println("Bad Input");
}
Görüldüğü üzere biz case'nin yanına bir rakam girdik bunlara case label diyoruz yani durum etiketi. Bu case label'lerin alabileceği değerler şunlar olabilir::
- char,byte,short yada int
- Enum sabiti
- String değeri
- Yada bunların birleşiminin virgülle ayrılmış halleri
String input = "yes";
switch(input.toLowerCase()){
case "yes","y" -> System.out.println("yes");
case "no","n" -> System.out.println("no");
default -> System.out.println("Bad Input");
}
Yada switch'in eski form (classic) yazabiliriz.
int choice = 2;
switch(choice){
case 1:...break;
case 2:...break;
default:...break;
}
Eğer ki classic form'da biz bir yere break bırakmayı unutursak bu fallthrough olacak yani mesela case 1'de break'i unutrsak case1 ve case 2 ve default çalışacaktır bunu biz eğer ki compile ederken test ettirmek istersek :
javac -Xlint:fallthrough Test.java
Java 14 ile gelen özelliklerden birisi de switch expression'dur bunlar fallthrough ile birlikte gelirler. Her bir case ifadesi noktalı virgül ile biter (;). Ve break ifadesi gibi yield keywordünü artık kullanırız.
case "Spring" -> {
System.out.println("Spring Time!");
yield 6;
}

Switch ifadelerinde return, break, yada continue ifadeleri yazılamaz.
Tercih edilmesi gereken
numLetters = switch(seasonName){
case "Spring", "Summer" , "Winter" -> 6
case "Fall" -> 4
default -> -1
};
Control Flowu Bozan İfadeler
Diğer C/C++ gibi dillerde kullanılan bir control flow olduğunda bunun akışını bozan yada hemen yerini değiştiren keyword olan goto Java'da reserved keyword olarak ayrılmıştır ama herhangi bir amaçla kullanılmamaktadır. Daha çok break gibi control flowunu bozan ifadeleri kullanabiliriz. Örneğin unlabeled break statemente bakalım.
while(years <= 100){
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
if (balance >= goal){
break;
}
years++;
}
Eğer ki balance >= goal olursa if statementi olan break çalışacaktır ve döngüyü kırıp dışarıya çıkacaktır.
Java'da ayrıca labeled break statementi vardır bu da genelde birden fazla döngü varsa en dışarıda bir label bırakılır ve en içte break ifadesi bırakıldığında artık döngünün kırılacak etiketinin ismini belirterek kod bloğunu artık döngünün dışından devam ettiririz. Müthiş ötesi tanım...
Scanner in = new Scanner(System.in);
int n;
read_data:
while(...){
...
for(...){
System.out.print("Enter a number >= 0: ");
n = in.nextInt();
if (n < 0){
break read_data;
}
}
}
Bu label'leri biz istersek sadece döngülerde değil bir if statementinde de kullanabiliriz örneğin:
label:
{
if (condition){
break label;
}
}
Son olarak continue statement'imiz vardır. break'a istinaden bu da control'un akışını bozar. Continue ifadesi, kontrolü en içteki çevreleyen döngünün en başına aktarır.
Scanner in = new Scanner(System.in);
while(sum < goal){
System.out.print("Enter a number : ");
n = in.nextInt();
if ( n < 0 ){
continue;
}
sum += n;
}
Burda şöyle bir olay gerçekleşir eğer ki n değeri 0'dan küçük olduğu sürece her zaman döngünün başına tekrardan geçer ve hiçbir zaman sum+=n ifadesi çalışmaz.