2. Java Dilinin Temelleri
2.1. Giriş
Java'yı öncelikle klasik bir programlama dili olarak ele alacağız. Nesnelere daha sonra değineceğiz.
Bir programda iki şey bulunur
- veriler
- bu verileri işleyen komutlar
Genellikle verileri komutlardan ayırmaya çalışırız:

2.2. Java'daki veriler
Java şu veri türlerini kullanır:
- tamsayılar
- gerçek sayılar
- karakterler ve karakter dizileri
- boole değerleri
- nesneler
2.2.1. Önceden tanımlanmış veri türleri
Tür | Kodlama | Alan |
char | 2 bayt | Unicode karakter |
int | 4 bayt | [-231, 231-1] |
long | 8 bayt | [-263, 263 -1] |
byte | 1 bayt | [-27 , 27 -1] |
short | 2 bayt | [-215, 215-1] |
float | 4 bayt | [3.4 10-38, 3.4 10+38] mutlak değer olarak |
double | 8 bayt | [1.7 10-308 , 1.7 10+308] mutlak değer olarak |
boolean | 1 bit | true, false |
String | nesne referansı | karakter dizisi |
Date | nesne referansı | tarih |
Character | nesne referansı | karakter |
Integer | nesne referansı | int |
Long | nesne referansı | long |
Byte | nesne referansı | bayt |
Float | nesne referansı | float |
Double | nesne referansı | double |
Boolean | nesne referansı | boolean |
2.2.2. Sabit verilerin gösterimi
entier | 145, -7, 0xFF (onaltılık) |
çift hassasiyetli gerçek sayı | 134,789, -45E-18 (-45 × 10⁻¹⁸) |
float türü | 134.789F, -45E-18F (-45 10⁻¹⁸) |
caractère | 'A', 'b' |
karakter dizisi | "bugün" |
booléen | true, false |
date | new Date(13,10,1954) (gün, ay, yıl) |
2.2.3. Verilerin beyanı
2.2.3.1. Bildirimlerin rolü
Bir program, bir ad ve bir tür ile tanımlanan verileri işler. Bu veriler bellekte depolanır. Programın derlenmesi sırasında, derleyici her veriye bir adres ve bir boyut ile tanımlanan bir bellek konumu atar. Bunu, programcı tarafından yapılan bildirimlerden yararlanarak yapar.
Ayrıca bu bildirimler, derleyicinin programlama hatalarını tespit etmesini sağlar. Dolayısıyla şu işlem:
x=x*2;
ifadesi, örneğin x bir karakter dizisiyse hatalı olarak bildirilir.
2.2.3.2. Sabitlerin Bildirilmesi
Bir sabitin tanımlama sözdizimi şöyledir:
final tür isim=değer; //nom=değer sabitini tanımlar
örnek: final float PI=3.141592F;
Not
Neden sabitler tanımlanır?
- Sabitlere anlamlı bir ad verilirse programın okunması daha kolay olur:
örnek: final float taux_tva=0.186F;
- "Sabit" değer değişirse, programı değiştirmek daha kolay olacaktır. Dolayısıyla önceki örnekte, KDV oranı %33'e çıkarsa, yapılması gereken tek değişiklik, değerini tanımlayan komutu değiştirmek olacaktır:
final float taux_tva=0.33F;
Programda 0,186 değeri açıkça kullanılmış olsaydı, o zaman değiştirilmesi gereken çok sayıda komut olurdu.
2.2.3.3. Değişkenlerin Bildirilmesi
Bir değişken bir adla tanımlanır ve bir veri türüne aittir. Bir Java değişkeninin adı n karakterden oluşur; ilk karakter harf, diğerleri ise harf veya rakam olabilir. Java, büyük ve küçük harfleri ayırt eder. Dolayısıyla, FIN ve fin değişkenleri farklıdır.
Değişkenler, tanımlandıkları sırada başlatılabilir. Bir veya daha fazla değişkenin tanımlanma sözdizimi şöyledir:
burada identificateur_de_type, önceden tanımlanmış bir tür veya programcı tarafından tanımlanmış bir nesne türüdür.
2.2.4. Sayılar ve karakter dizeleri arasındaki dönüştürmeler
sayı -> dize | "" + sayı |
dize -> int | Integer.parseInt(dize) |
dize -> long | Long.parseLong(dize) |
dize -> double | Double.valueOf(dize).doubleValue() |
dize -> float | Float.valueOf(dize).floatValue() |
İşte sayılar ve karakter dizeleri arasında dönüştürme işlemlerinin temel tekniklerini gösteren bir program. Karakter dizesi geçerli bir sayı değilse, karakter dizisinden sayıya dönüştürme işlemi başarısız olabilir. Bu durumda Java’da “istisna” olarak adlandırılan ölümcül bir hata oluşur. Bu hata, aşağıdaki try/catch cümlesiyle yönetilebilir:
try{
appel de la fonction susceptible de générer l'exception
} catch (Exception e){
traiter l'exception e
}
instruction suivante
İşlev bir istisna oluşturmazsa bir sonraki komuta geçilir, aksi takdirde catch cümlesinin gövdesine geçilir ve ardından bir sonraki komuta geçilir. İstisna yönetimine daha sonra tekrar değineceğiz.
import java.io.*;
public class conv1{
public static void main(String arg[]){
String S;
final int i=10;
final long l=100000;
final float f=(float)45.78;
double d=-14.98;
// sayı --> dize
S=""+i;
affiche(S);
S=""+l;
affiche(S);
S=""+f;
affiche(S);
S=""+d;
affiche(S);
//boolean --> dize
final boolean b=false;
S=""+new Boolean(b);
affiche(S);
// dize --> int
int i1;
i1=Integer.parseInt("10");
affiche(""+i1);
try{
i1=Integer.parseInt("10.67");
affiche(""+i1);
} catch (Exception e){
affiche("Erreur "+e);
}
// dize --> long
long l1;
l1=Long.parseLong("100");
affiche(""+l1);
try{
l1=Long.parseLong("10.675");
affiche(""+l1);
} catch (Exception e){
affiche("Erreur "+e);
}
// dize --> double
double d1;
d1=Double.valueOf("100.87").doubleValue();
affiche(""+d1);
try{
d1=Double.valueOf("abcd").doubleValue();
affiche(""+d1);
} catch (Exception e){
affiche("Erreur "+e);
}
// dize --> float
float f1;
f1=Float.valueOf("100.87").floatValue();
affiche(""+f1);
try{
d1=Float.valueOf("abcd").floatValue();
affiche(""+f1);
} catch (Exception e){
affiche("Erreur "+e);
}
}// son main
public static void affiche(String S){
System.out.println("S="+S);
}
}// sınıf sonu
Elde edilen sonuçlar şunlardır:
S=10
S=100000
S=45.78
S=-14.98
S=false
S=10
S=Erreur java.lang.NumberFormatException: 10.67
S=100
S=Erreur java.lang.NumberFormatException: 10.675
S=100.87
S=Erreur java.lang.NumberFormatException: abcd
S=100.87
S=Erreur java.lang.NumberFormatException: abcd
2.2.5. Veri tabloları
Bir Java dizisi, aynı türdeki verileri tek bir tanımlayıcı altında bir araya getiren bir nesnedir. Bildirimi şu şekildedir:
Type Tableau[] = new Type[n] veya Type[] Tableau = new Type[n]
Her iki sözdizimi de geçerlidir. n, dizinin içerebileceği veri sayısını belirtir. Tableau[i] sözdizimi, i'nin [0,n-1] aralığına ait olduğu durumda i numaralı veriyi belirtir. i'in [0,n-1] aralığına ait olmadığı Tableau[i] verisine yapılan herhangi bir başvuru bir istisna oluşturacaktır.
İki boyutlu bir dizi şu şekilde tanımlanabilir:
Type Tableau[][] = new Type[n][p] veya Type[][] Tableau = new Type[n][p]
Tableau[i] sözdizimi, i'nin [0,n-1] aralığına ait olduğu durumda, Tableau'teki i numaralı veriyi belirtir. Tableau[i]'in kendisi de bir tablodur: Tableau[i][j], Tableau[i] tablosundaki j'i gösterir; burada j, [0,p-1] aralığına aittir. Tableau'teki bir veriye yanlış indekslerle yapılan her türlü başvuru, ölümcül bir hata oluşturur.
İşte bir örnek:
public class test1{
public static void main(String arg[]){
float[][] taux=new float[2][2];
taux[1][0]=0.24F;
taux[1][1]=0.33F;
System.out.println(taux[1].length);
System.out.println(taux[1][1]);
}
}
ve yürütme sonuçları:
Bir dizi, length özniteliğine sahip bir nesnedir: bu, dizinin boyutudur.
2.3. Java'nın temel komutları
Aşağıdakiler arasında ayrım yapılır
- bilgisayar tarafından yürütülen temel komutlar.
- programın akışını kontrol eden komutlar.
Mikro bilgisayarın ve çevre birimlerinin yapısı incelendiğinde temel komutlar açıkça ortaya çıkar.

-
klavyeden gelen bilgilerin okunması
-
Bilgilerin işlenmesi
-
Ekrana bilgi yazma
-
disk dosyasından bilgi okuma
-
Bilgilerin bir disk dosyasına yazılması
2.3.1. Ekrana yazma
Ekrana yazma komutunun sözdizimi şöyledir:
System.out.println(ifade) veya System.err.println(ifade)
burada expression, ekranda görüntülenmek üzere karakter dizisine dönüştürülebilen herhangi bir veri türüdür. Önceki örnekte iki yazma komutu gördük:
System.out, varsayılan olarak ekran olan bir metin dosyasına yazılır. Aynı durum System.err için de geçerlidir. Bu dosyalar sırasıyla 1 ve 2 numaralıdır (veya descripteur). Klavyeden gelen giriş akışı (System.in) da 0 numaralı tanımlayıcıya sahip bir metin dosyası olarak kabul edilir. Dos ve Unix, komutların boru (pipe) ile aktarılmasını destekler:
commande1'in System.out ile yazdığı her şey, commande2'in System.in girişine borulanır (yönlendirilir). Başka bir deyişle, commande2, System.in aracılığıyla, commande2'in System.out ile ürettiği verileri okur; bu veriler artık ekranda görüntülenmez. Bu sistem Unix altında yaygın olarak kullanılır. Bu komut zincirinde ise System.err akışı yeniden yönlendirilmez: ekrana yazdırır. Bu nedenle hata mesajlarını yazmak için kullanılır (adının err olmasının nedeni budur): komutların borulandırılması sırasında hata mesajlarının ekranda görüntülenmeye devam edeceğinden emin olunur. Bu nedenle, hata mesajlarını ekrana yazarken System.out akışı yerine System.err akışını kullanmaya alışmalıyız.
2.3.2. Klavyeyle girilen verilerin okunması
Klavye kaynaklı veri akışı, InputStream türündeki System.in nesnesiyle belirtilir. Bu tür nesneler, verileri karakter karakter okumaya olanak tanır. Daha sonra bu karakter akışından ilgilendiği bilgileri bulmak programcının görevidir. InputStream türü, bir metin satırını tek seferde okumaya izin vermez. BufferedReader türü ise readLine yöntemi ile bunu mümkün kılar.
Klavyeyle girilen metin satırlarını okuyabilmek için, System.in türündeki giriş akışından InputStream türünde bir akış oluşturarak, bu sefer BufferedReader türünde başka bir giriş akışı oluştururuz:
Nesne oluşturma kavramını içeren bu komutun ayrıntılarını burada açıklamayacağız. Komutu olduğu gibi kullanacağız.
Bir akışın oluşturulması başarısız olabilir: bu durumda Java'da istisna olarak adlandırılan ölümcül bir hata üretilir. Bir yöntemin istisna üretme olasılığı her olduğunda, Java derleyicisi bunun programcı tarafından yönetilmesini zorunlu kılar. Dolayısıyla, önceki giriş akışını oluşturmak için aslında şunu yazmak gerekir:
BufferedReader IN=null;
try{
IN=new BufferedReader(new InputStreamReader(System.in));
} catch (Exception e){
System.err.println("Erreur " +e);
System.exit(1);
}
Yine, burada istisna yönetimini açıklamaya çalışmayacağız. Yukarıdaki IN akışı oluşturulduktan sonra, şu komutla bir metin satırı okunabilir:
Klavyeyle girilen satır, ligne değişkenine kaydedilir ve daha sonra program tarafından kullanılabilir.
2.3.3. Giriş-Çıkış Örneği
Aşağıda, klavye/ekran giriş-çıkış işlemlerini gösteren bir program yer almaktadır:
import java.io.*; // G/Ç akışlarının kullanımı için gereklidir
public class io1{
public static void main (String[] arg){
// akışa yazma System.out
Object obj=new Object();
System.out.println(""+obj);
System.out.println(obj.getClass().getName());
// akışa yazma System.err
int i=10;
System.err.println("i="+i);
// klavyeden girilen bir satırı okuma
String ligne;
BufferedReader IN=null;
try{
IN=new BufferedReader(new InputStreamReader(System.in));
} catch (Exception e){
affiche(e);
System.exit(1);
}
System.out.print("Tapez une ligne : ");
try{
ligne=IN.readLine();
System.out.println("ligne="+ligne);
} catch (Exception e){
affiche(e);
System.exit(2);
}
}//elin sonu
public static void affiche(Exception e){
System.err.println("Erreur : "+e);
}
}//sınıf sonu
ve yürütme sonuçları:
C:\Serge\java\bases\iostream>java io1
java.lang.Object@1ee78b
java.lang.Object
i=10
Tapez une ligne : je suis là
ligne=je suis là
Talimatlar
Herhangi bir nesnenin görüntülenebileceğini göstermek amacıyla verilmiştir. Burada görüntülenenlerin anlamını açıklamaya çalışmayacağız. Ayrıca blokta bir nesnenin değerinin görüntülenmesi de bulunmaktadır:
try{
IN=new BufferedReader(new InputStreamReader(System.in));
} catch (Exception e){
affiche(e);
System.exit(1);
}
e değişkeni, Exception türünde bir nesnedir ve burada affiche(e) çağrısıyla görüntülenmektedir. Daha önce gördüğümüz dönüştürme programında, bir istisna değerinin bu şekilde görüntülenmesiyle karşılaşmıştık, ancak bu konuya değinmemiştik.
2.3.4. Bir ifadenin değerinin bir değişkene atanması
Burada variable=expression; işlemiyle ilgileniyoruz
İfade şu türlerden olabilir: aritmetik, ilişkisel, boole, karakter
2.3.4.1. Atama işleminin yorumlanması
variable=expression; işlemi, kendisi de aşağıdaki şekilde değerlendirilen bir ifadedir:
- Atama işleminin sağ tarafı değerlendirilir: sonuç, V değeridir.
- V değeri değişkene atanır
- V değeri, bu kez bir ifade olarak ele alındığında atama işleminin sonucudur.
Bu nedenle V1=V2=ifade geçerlidir. Öncelik kuralı nedeniyle, en sağdaki = operatörü değerlendirilecektir. Dolayısıyla V1=(V2=ifade) elde edilir. V2=ifade ifadesi değerlendirilir ve değeri V olur. Bu ifadenin değerlendirilmesi, V'ye V2 değerinin atanmasına neden olur. Ardından bir sonraki = operatörü şu şekilde değerlendirilir: V1=V şeklinde değerlendirilir. Bu ifadenin değeri yine V’dir. Değerlendirilmesi sonucunda V, V1’e atanır. Dolayısıyla, V1=V2=ifade, değerlendirilmesi
1: expression'in değerinin V1 ve V2 değişkenlerine atanmasına neden olur
2: expression değerini sonuç olarak verir.
Bu, şu tür bir ifadeye genelleştirilebilir: V1=V2=....=Vn=ifade
2.3.4.2. Aritmetik ifade
Aritmetik ifadelerin işleçleri şunlardır:
-
: toplama
-
: çıkarma
* : çarpma
/ : bölme: en az bir terim gerçek sayı ise sonuç tam bölümdür. Her iki terim de tamsayı ise sonuç tam bölümdür. Dolayısıyla 5/2 -> 2 ve 5,0/2 -> 2,5.
% : bölme: işlenenlerin türü ne olursa olsun sonuç kalıntıdır; bölme sonucu ise tam sayıdır. Dolayısıyla bu, modül işlemidir.
Çeşitli matematiksel fonksiyonlar mevcuttur:
double sqrt(double x) | kare kök |
double cos(double x) | Kosinus |
double sin(double x) | sinüs |
double tan(double x) | Tanjant |
double pow(double x, double y) | x'in y'e yükseltilmesi (x>0) |
double exp(double x) | Üstel |
double log(double x) | Neper logaritması |
double abs(double x) | mutlak değer |
vb...
Tüm bu fonksiyonlar, Math adlı bir Java sınıfında tanımlanmıştır. Bunları kullanırken, tanımlandıkları sınıfın adını ön ek olarak eklemek gerekir. Dolayısıyla şöyle yazılır:
Math sınıfının tanımı şöyledir:
public final class java.lang.Math
extends java.lang.Object (I-§1.12)
{
// Alanlar
public final static double E; §1.10.1
public final static double PI; §1.10.2
// Yöntemler
public static double abs(double a); §1.10.3
public static float abs(float a); §1.10.4
public static int abs(int a); §1.10.5
public static long abs(long a); §1.10.6
public static double acos(double a); §1.10.7
public static double asin(double a); §1.10.8
public static double atan(double a); §1.10.9
public static double atan2(double a, double b); §1.10.10
public static double ceil(double a); §1.10.11
public static double cos(double a); §1.10.12
public static double exp(double a); §1.10.13
public static double floor(double a); §1.10.14
public static double §1.10.15
IEEEremainder(double f1, double f2);
public static double log(double a); §1.10.16
public static double max(double a, double b); §1.10.17
public static float max(float a, float b); §1.10.18
public static int max(int a, int b); §1.10.19
public static long max(long a, long b); §1.10.20
public static double min(double a, double b); §1.10.21
public static float min(float a, float b); §1.10.22
public static int min(int a, int b); §1.10.23
public static long min(long a, long b); §1.10.24
public static double pow(double a, double b); §1.10.25
public static double random(); §1.10.26
public static double rint(double a); §1.10.27
public static long round(double a); §1.10.28
public static int round(float a); §1.10.29
public static double sin(double a); §1.10.30
public static double sqrt(double a); §1.10.31
public static double tan(double a); §1.10.32
}
2.3.4.3. Aritmetik ifadelerin değerlendirilmesinde öncelikler
Bir aritmetik ifadenin değerlendirilmesi sırasında işleçlerin önceliği şu şekildedir (en yüksek öncelikli olandan en düşük öncelikli olana doğru):
[fonctions], [ ( )], [ *, /, %], [+, -]
Aynı bloktaki [ ] operatörleri aynı önceliğe sahiptir.
2.3.4.4. İlişkisel ifadeler
İşlemciler şunlardır: <, <=, ==, !=, >, >=
öncelik sırası
>, >=, <, <=
==, !=
Bir ilişkisel ifadenin sonucu, ifade yanlışsa false, aksi takdirde true Boole değeridir.
Örnek:
İki karakterin karşılaştırılması
C1 ve C2 olmak üzere iki karakter varsayalım. Bunları
<, <=, ==, !=, >, >=
kullanarak karşılaştırmak mümkündür. Bu durumda, sayılar olan ASCII kodları karşılaştırılır. ASCII sıralamasına göre aşağıdaki ilişkilerin geçerli olduğunu hatırlatırız:
boşluk < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' < .. < 'z'
İki karakter dizisinin karşılaştırılması
Dizgiler karakter karakter karşılaştırılır. İki karakter arasında karşılaşılan ilk eşitsizlik, dizgiler üzerinde de aynı yönde bir eşitsizliğe yol açar.
Örnekler:
"Chat" ve "Chien" dizelerini karşılaştıralım
Bu son eşitsizlik, "Chat" < "Chien" olduğunu gösterir.

"Chat" ve "Chaton" dizelerini karşılaştıralım. "Chat" dizesi bitene kadar her zaman eşitlik vardır. Bu durumda, biten dizi "daha küçük" olarak kabul edilir. Dolayısıyla şu ilişki ortaya çıkar:
"Kedi" < "Yavru kedi" ilişkisi ortaya çıkar.
İki dizenin karşılaştırılması işlevleri
Burada <, <=, ==, !=, >, >= gibi ilişki operatörleri kullanılamaz. String sınıfının yöntemleri kullanılmalıdır:
String chaine1, chaine2;
chaine1=…;
chaine2=…;
int i=chaine1.compareTo(chaine2);
boolean egal=chaine1.equals(chaine2)
Yukarıda, i değişkeninin değeri şöyledir:
0: her iki dize de eşitse
1: 1 numaralı dize, 2 numaralı dizeden büyükse
-1: 1 numaralı dize, 2 numaralı dizeden küçükse
İki dize birbirine eşitse, egal değişkeninin değeri true olacaktır.
2.3.4.5. Boole ifadeleri
'deki operatörler & (and) ||(or ve ! (not) şeklindedir. Bir boole ifadesinin sonucu bir boole değeridir.
öncelik sırası ! , &&, ||
örnek:
İlişkisel operatörler, && ve || operatörlerine göre önceliklidir.
2.3.4.6. Bit işlemleri
İşlemciler
i ve j iki tamsayı olsun.
i<<n | i sayısını n bit sola kaydırır. Gelen bitler sıfırdır. |
i>>n | i'yi n bit sağa kaydırır. Eğer i işaretli bir tamsayıysa (signed char, int, long), işaret biti korunur. |
i & j | i ve j'nin bit bazında mantıksal ve işlemini gerçekleştirir. |
i | j | i ve j'nin bit bazında OU mantıksal OR işlemini gerçekleştirir. |
~i | i'yi 1'e tamamlar |
i^j | i ve j'nin OU EXCLUSIF değerini oluşturur |
Yani
işlem | değer |
i<<4 | 0x23F0 |
i>>4 | 0x0123 işaret biti korunur. |
k>>4 | 0xFF12 işaret biti korunur. |
i&j | 0x1023 |
i|j | 0xF33F |
~i | 0xEDC0 |
2.3.4.7. İşlemci kombinasyonu
a=a+b, a+=b şeklinde yazılabilir
a=a-b, a-=b şeklinde yazılabilir
Aynı durum /, %, *, <<, >>, &, |, ^ operatörleri için de geçerlidir
Böylece a=a+2;, a+=2; şeklinde yazılabilir
2.3.4.8. Artırma ve azaltma operatörleri
variable++ notasyonu, variable=variable+1 veya variable+=1 anlamına gelir
variable-- notasyonu, variable=variable-1 veya variable-=1 anlamına gelir.
2.3.4.9. Operatör mü?
expr_cond ? expr1:expr2 ifadesi şu şekilde değerlendirilir:
1: expr_cond ifadesi değerlendirilir. Bu, doğru veya yanlış değerine sahip bir koşullu ifadedir
2: Eğer doğruysa, ifadenin değeri expr1'in değeridir. expr2 değerlendirilmez.
3: İfade yanlışsa, tam tersi gerçekleşir: ifadenin değeri expr2 olur. expr1 değerlendirilmez.
Örnek
i=(j>4 ? j+1:j-1);
i değişkenine atayacağı değer:
j+1 (eğer j>4 ise), aksi takdirde j-1
Bu, if(j>4) i=j+1; else i=j-1; yazmakla aynıdır, ancak daha özlüdür.
2.3.4.10. Operatörlerin genel önceliği
() [] fonksiyon | gd |
! ~ ++ -- | dg |
new (tür) tip dönüştürme operatörleri | dg |
* / % | gd |
+ - | gd |
<< >> | gd |
< <= > >= instanceof | gd |
== != | gd |
& | gd |
^ | gd |
| | gd |
&& | gd |
|| | gd |
? : | dg |
= += -= vb. . | dg |
gd : eşit öncelik durumunda, soldan sağa öncelik kuralının uygulandığını belirtir. Bu, bir ifadede aynı önceliğe sahip operatörler olduğunda, ifadedeki en soldaki operatörün ilk olarak değerlendirildiği anlamına gelir. dg, sağdan sola önceliği belirtir.
2.3.4.11. Tip Değişiklikleri
Bir ifadede, bir değerin kodlamasını geçici olarak değiştirmek mümkündür. Buna verinin türünü değiştirmek veya İngilizce'de "type casting" denir. Bir ifadede bir değerin türünü değiştirmenin sözdizimi şöyledir: (tür) değer. Değer, belirtilen türü alır. Bu, değerin kodlamasında bir değişikliğe yol açar.
Örnek:
Burada i veya j türünü gerçek sayı olarak değiştirmek gerekir; aksi takdirde bölme işlemi tamsayı sonucu verir, gerçek sayı değil.
i, 2 baytlık tam kodlanmış bir değerdir
(float) i ise 4 baytlık bir gerçek sayı olarak yaklaşık olarak kodlanmış aynı değerdir
Dolayısıyla, i değerinde bir kod dönüştürme gerçekleşir. Bu kod dönüştürme yalnızca hesaplama sırasında gerçekleşir; i değişkeni her zaman int türünü korur.
2.4. Programın akışını kontrol eden komutlar
2.4.1. Durdurma
System sınıfında tanımlanan exit yöntemi, bir programın yürütülmesini durdurmaya yarar.
eylem: devam eden işlemi durdurur ve status değerini üst işleme döndürür
exit, devam eden işlemin sonlandırılmasını sağlar ve kontrolü çağıran işleme geri verir. status değeri, bu işlem tarafından kullanılabilir. DOS altında, bu status değişkeni, değeri bir toplu iş dosyasında test edilebilen ERRORLEVEL sistem değişkeni aracılığıyla DOS'e döndürülür. Unix'te, komut yorumlayıcısı Bourne Shell (/bin/sh) ise, status'in değerini $? değişkeni alır.
Örnek:
programı durum değeri 0 olarak durdurmak için.
2.4.2. Basit seçim yapısı
syntaxe : if (condition) {actions_condition_vraie;} else {actions_condition_fausse;}
notlar:
- koşul parantezlerle çevrelenmiştir.
- Her eylem noktalı virgülle biter.
- Küme parantezleri noktalı virgülle bitmez.
- Küme parantezleri, yalnızca birden fazla eylem varsa gereklidir.
- else cümlesi olmayabilir.
- "then" ifadesi yoktur.
Bu yapının algoritmik karşılığı "if ... then ... else" yapısıdır:
örnek
if (x>0) { nx=nx+1;sx=sx+x;} else dx=dx-x;
Seçim yapıları iç içe geçirilebilir:
Bazen şu sorun ortaya çıkar:
public static void main(void){
int n=5;
if(n>1)
if(n>6)
System.out.println(">6");
else System.out.println("<=6");
}
Önceki örnekte, else hangi if ile ilişkilidir? Kural şudur: Bir else her zaman en yakın if'e karşılık gelir; örnekte bu, if(n>6)'tir. Başka bir örnek ele alalım:
public static void main(void)
{ int n=0;
if(n>1)
if(n>6) System.out.println(">6");
else; // if(n>6) ifadesinin else kısmı: yapılacak bir şey yok
else System.out.println("<=1"); // if(n>1) ifadesinin else kısmı
}
Burada, else'i if(n>1)'e yerleştirmek istedik, ancak else'i if(n>6)'e yerleştirmek istemedik. Yukarıdaki açıklamadan dolayı, içinde hiçbir komut bulunmayan if(n>6) için bir else ifadesi eklemek zorunda kaldık.
2.4.3. Case yapısı
Sözdizimi şu şekildedir:
switch(expression) {
case v1:
actions1;
break;
case v2:
actions2;
break;
. .. .. .. .. ..
default: actions_sinon;
}
notlar
- Denetim ifadesinin değeri yalnızca bir tamsayı veya bir karakter olabilir.
- Kontrol ifadesi parantezlerle çevrelenir.
- default cümlesi bulunmayabilir.
- vi değerleri, ifadenin olası değerleridir. İfadenin değeri vi ise, vi case cümlesinin ardındaki eylemler yürütülür.
- break komutu, case yapısından çıkar. vi değerine ait komut bloğunun sonunda bu komut yoksa, yürütme vi+1 değerine ait komutlarla devam eder.
Örnek
Algoritmik programlamada
selon la valeur de choix
cas 0
arrêt
cas 1
exécuter module M1
cas 2
exécuter module M2
sinon
erreur<--vrai
findescas
Java'da
int choix, erreur;
switch(choix){
case 0: System.exit(0);
case 1: M1();break;
case 2: M2();break;
default: erreur=1;
}
2.4.4. Tekrar yapısı
2.4.4.1. Bilinen tekrar sayısı
Sözdizimi
for (i=id;i<=if;i=i+ip){
actions;
}
Notlar
- for'in 3 argümanı parantez içinde yer alır.
- for'in 3 argümanı noktalı virgülle ayrılmıştır.
- for'in her eylemi noktalı virgülle biter.
- Küme parantezi, yalnızca birden fazla eylem varsa gereklidir.
- Küme parantezinin ardından noktalı virgül gelmez.
Bunun algoritmik karşılığı pour yapısıdır:
bu da tantque yapısına çevrilebilir:
2.4.4.2. Tekrar sayısı bilinmiyor
Java'da bu durum için birçok yapı mevcuttur.
While yapısı
while(condition){
actions;
}
Koşul geçerli olduğu sürece döngü devam eder. Döngü hiç çalıştırılmayabilir.
notlar:
- koşul parantezlerle çevrelenmiştir.
- Her eylem noktalı virgülle biter.
- Birden fazla eylem varsa, küme parantezi gereklidir.
- Küme parantezinden sonra noktalı virgül konulmaz.
Buna karşılık gelen algoritmik yapı "tantque" yapısıdır:
(do while) döngüsü
Sözdizimi şu şekildedir:
do{
instructions;
}while(condition);
Koşul yanlış olana kadar veya koşul doğru olduğu sürece döngü devam eder. Burada döngü en az bir kez gerçekleştirilir.
notlar
- koşul parantezlerle çevrelenmiştir.
- Her eylem noktalı virgülle biter.
- Birden fazla eylem varsa, küme parantezi gereklidir.
- Küme parantezinden sonra noktalı virgül konulmaz.
Buna karşılık gelen algoritmik yapı, "…'ye kadar tekrarla" yapısıdır:
Genel döngü (for) yapısı
Sözdizimi şu şekildedir:
for(instructions_départ;condition;instructions_fin_boucle){
instructions;
}
Koşul doğru olduğu sürece döngü devam eder (her döngü turundan önce koşul değerlendirilir). Instructions_départ, döngüye ilk kez girilmeden önce yürütülür. Instructions_fin_boucle, her döngü turundan sonra yürütülür.
notlar
- for komutunun 3 argümanı parantez içinde yer alır.
- for'in 3 argümanı noktalı virgülle ayrılmıştır.
- for döngüsündeki her eylem bir noktalı virgülle biter.
- Birden fazla eylem varsa, küme parantezi gereklidir.
- Küme parantezinden sonra noktalı virgül gelmez.
- instructions_depart ve instructions_fin_boucle'teki çeşitli talimatlar virgülle ayrılmıştır.
Buna karşılık gelen algoritmik yapı şöyledir:
Örnekler
Aşağıdaki programların tümü, ilk n tam sayının toplamını hesaplar.
1 for(i=1, somme=0;i<=n;i=i+1)
somme=somme+a[i];
2 for (i=1, somme=0;i<=n;somme=somme+a[i], i=i+1);
3 i=1;somme=0;
while(i<=n)
{ somme+=i; i++; }
4 i=1; somme=0;
do somme+=i++;
while (i<=n);
Döngü yönetimi talimatları
break | for, while, do ... while döngüsünden çıkar. |
continue | for, while, do ... while döngülerinde bir sonraki yinelemesine geçer |
2.5. Bir Java programının yapısı
Kullanıcı tanımlı sınıflar veya ana işlev main dışındaki işlevler kullanmayan bir Java programı aşağıdaki yapıya sahip olabilir:
public class test1{
public static void main(String arg[]){
… code du programme
}// ana işlev
}// sınıf
main işlevi, diğer adıyla yöntem, bir Java programının çalıştırılması sırasında ilk olarak yürütülür. Bu işlevin mutlaka aşağıdaki imzaya sahip olması gerekir:
public static void main(String arg[]){
veya
public static void main(String[] arg){
arg argümanının adı herhangi bir şey olabilir. Bu, komut satırındaki argümanları temsil eden bir karakter dizisi dizisidir. Buna biraz sonra tekrar döneceğiz.
Ayrıntılı bir şekilde yönetmek istemediğimiz istisnalar oluşturabilecek işlevler kullanılıyorsa, program kodunu bir try/catch bloğu içine alabiliriz:
public class test1{
public static void main(String arg[]){
try{
… code du programme
} catch (Exception e){
// hata yönetimi
}// try
}// ana
}// sınıf
Kaynak kodun başında ve sınıf tanımından önce, sınıf içe aktarma komutlarının bulunması yaygın bir uygulamadır. Örneğin:
import java.io.*;
public class test1{
public static void main(String arg[]){
… code du programme
}// ana
}// sınıf
Bir örnek verelim. Şu yazma komutunu ele alalım:
Bu komut, ekrana java yazdırır. Bu basit komutta birçok unsur bulunmaktadır:
- System, tam adı java.lang.System olan bir sınıftır
- out, bu sınıfın java.io.PrintStream türünde bir özelliğidir; java.io.PrintStream ise başka bir sınıftır
- println, java.io.PrintStream sınıfının bir yöntemidir.
Henüz ele alınmamış olan “sınıf” kavramının anlaşılmasını gerektirdiği için, bu açıklamayı gereksiz yere karmaşıklaştırmayacağız. Bir sınıfı bir kaynağa benzetebiliriz. Burada derleyici, java.lang.System ve java.io.PrintStream adlı iki sınıfa erişebilmelidir. Java’daki yüzlerce sınıf, paket (package) olarak da adlandırılan arşivlere dağıtılmıştır. Programın başına yerleştirilen import komutları, derleyiciye programın hangi harici sınıflara ihtiyaç duyduğunu belirtmeye yarar (derlenecek kaynak dosyada kullanılan ancak tanımlanmayan sınıflar). Dolayısıyla örneğimizde, programımız java.lang.System ve java.io.PrintStream sınıflarına ihtiyaç duymaktadır. Bunu import komutuyla belirtiriz. Programın başına şunu yazabiliriz:
Bir Java programı genellikle onlarca harici sınıf kullandığından, gerekli tüm import işlevlerini yazmak zahmetli olurdu. Sınıflar paketler halinde gruplandırılmıştır ve böylece paketin tamamı içe aktarılabilir. Dolayısıyla, java.lang ve java.io paketlerini içe aktarmak için şunu yazabiliriz:
java.lang paketi, Java'nın tüm temel sınıflarını içerir ve derleyici tarafından otomatik olarak içe aktarılır. Dolayısıyla, sonuç olarak sadece şunu yazacağız:
2.6. İstisna yönetimi
Birçok Java işlevi istisna, yani hata oluşturabilir. Daha önce böyle bir işlevle karşılaşmıştık: readLine işlevi:
String ligne=null;
try{
ligne=IN.readLine();
System.out.println("ligne="+ligne);
} catch (Exception e){
affiche(e);
System.exit(2);
}// try
Bir işlev istisna oluşturma olasılığı varsa, Java derleyicisi, hatalara karşı daha dayanıklı programlar elde etmek amacıyla programcının bu istisnayı yönetmesini zorunlu kılar: Uygulamanın kontrolsüz bir şekilde "çökmesi" her zaman önlenmelidir. Burada, readLine işlevi, örneğin giriş akışı kapatılmış olması nedeniyle okunacak bir şey kalmadığında bir istisna oluşturur. Bir istisnanın yönetimi aşağıdaki şemaya göre gerçekleştirilir:
try{
appel de la fonction susceptible de générer l'exception
} catch (Exception e){
traiter l'exception e
}
instruction suivante
İşlev bir istisna oluşturmazsa, bir sonraki komuta geçilir; aksi takdirde, catch cümlesinin gövdesine geçilir ve ardından bir sonraki komuta geçilir. Aşağıdaki noktalara dikkat edelim:
- e, Exception türünden türetilmiş bir nesnedir. IOException, SecurityException, ArithmeticException vb. türleri kullanarak daha spesifik olunabilir: yaklaşık yirmi farklı istisna türü mevcuttur. catch (Exception e) yazarak, tüm istisna türlerini yönetmek istediğimizi belirtiriz. try cümlesindeki kodun birden fazla istisna türü oluşturma olasılığı varsa, istisnayı birden fazla catch cümlesiyle yöneterek daha kesin bir yaklaşım sergileyebiliriz:
try{
appel de la fonction susceptible de générer l'exception
} catch (IOException e){
traiter l'exception e
}
} catch (ArrayIndexOutOfBoundsException e){
traiter l'exception e
}
} catch (RunTimeException e){
traiter l'exception e
}
instruction suivante
- try/catch maddelerine bir finally maddesi eklenebilir:
try{
appel de la fonction susceptible de générer l'exception
} catch (Exception e){
traiter l'exception e
}
finally{
code exécuté après try ou catch
}
instruction suivante
Burada, istisna olsun ya da olmasın, finally maddesinin kodu her zaman yürütülecektir.
- Exception sınıfında, meydana gelen hatayı ayrıntılı olarak açıklayan bir mesaj döndüren getMessage() yöntemi bulunmaktadır. Dolayısıyla, bu mesajı görüntülemek istersek şunu yazacağız:
catch (Exception ex){
System.err.println("L'erreur suivante s'est produite : "+ex.getMessage());
...
}//yakalama
- Exception sınıfında, istisnanın türünü ve Message özelliğinin değerini belirten bir karakter dizesi döndüren toString() yöntemi bulunur. Böylece şu şekilde yazabiliriz:
catch (Exception ex){
System.err.println ("L'erreur suivante s'est produite : "+ex.toString());
...
}//catch
Şu şekilde de yazılabilir:
Burada, iki karakter dizisini birleştirmek amacıyla derleyici tarafından otomatik olarak string + Exception.toString() biçimine dönüştürülecek bir string + Exception işlemi bulunmaktadır.
Aşağıdaki örnek, mevcut olmayan bir dizi elemanının kullanılması sonucu oluşan bir istisnayı göstermektedir:
// tablolar
// ithalatlar
import java.io.*;
public class tab1{
public static void main(String[] args){
// dizinin tanımlanması ve başlatılması
int[] tab=new int[] {0,1,2,3};
int i;
// for döngüsüyle dizi görüntüleme
for (i=0; i<tab.length; i++)
System.out.println("tab[" + i + "]=" + tab[i]);
// istisna oluşturma
try{
tab[100]=6;
}catch (Exception e){
System.err.println("L'erreur suivante s'est produite : " + e);
}//try-catch
}//main
}//sınıf
Programın çalıştırılması sonucunda şu sonuçlar elde edilir:
tab[0]=0
tab[1]=1
tab[2]=2
tab[3]=3
L'erreur suivante s'est produite : java.lang.ArrayIndexOutOfBoundsException
İşte, bir dize bir sayıya atanırken, dizenin bir sayı olmadığını gösterdiği durumlarda ortaya çıkan istisnayı işleyen başka bir örnek:
// ithalatlar
import java.io.*;
public class console1{
public static void main(String[] args){
// giriş akışının oluşturulması
BufferedReader IN=null;
try{
IN=new BufferedReader(new InputStreamReader(System.in));
}catch(Exception ex){}
// Ad soruluyor
System.out.print("Nom : ");
// yanıt okunuyor
String nom=null;
try{
nom=IN.readLine();
}catch(Exception ex){}
// yaş soruluyor
int age=0;
boolean ageOK=false;
while ( ! ageOK){
// soru
System.out.print("âge : ");
// cevabın okunması ve doğrulanması
try{
age=Integer.parseInt(IN.readLine());
ageOK=true;
}catch(Exception ex) {
System.err.println("Age incorrect, recommencez...");
}//try-catch
}//while
// son çıktı
System.out.println("Vous vous appelez " + nom + " et vous avez " + age + " ans");
}//Ana
}//sınıf
Bazı çalıştırma sonuçları:
E:\data\serge\MSNET\c#\bases\1>console1
Nom : dupont
âge : xx
Age incorrect, recommencez...
âge : 12
Vous vous appelez dupont et vous avez 12 ans
2.7. Bir Java programının derlenmesi ve çalıştırılması
Aşağıdaki programı derleyip çalıştırın:
// sınıfların içe aktarılması
import java.io.*;
// test sınıfı
public class coucou{
// main işlevi
public static void main(String args[]){
// ekran çıktısı
System.out.println("coucou");
}//main
}//sınıf
Yukarıdaki coucou sınıfını içeren kaynak dosyanın adı mutlaka coucou.java olmalıdır:
Bir Java programının derlenmesi ve çalıştırılması, DOS penceresinde gerçekleştirilir. javac.exe (derleyici) ve java.exe (yorumlayıcı) yürütülebilir dosyaları, JDK kurulum dizinindeki bin dizininde bulunur:
E:\data\serge\JAVA\classes\paquetages\personne>dir "e:\program files\jdk14\bin\java?.exe"
07/02/2002 12:52 24 649 java.exe
07/02/2002 12:52 28 766 javac.exe
javac.exe derleyicisi, .java kaynak dosyasını analiz ederek bir .class derlenmiş dosyası oluşturur. Bu dosya, işlemci tarafından hemen çalıştırılamaz. Bu dosyanın çalıştırılması için, sanal makine veya JVM (Java Sanal Makinesi) olarak adlandırılan bir Java yorumlayıcısı (java.exe) gereklidir. Sanal makine, .class dosyasında bulunan ara koddan yola çıkarak, üzerinde çalıştığı makinenin işlemcisine özgü komutlar üretecektir. Farklı işletim sistemi türleri (Windows, Unix, Mac OS, ...) için Java sanal makineleri mevcuttur. Bir .class dosyası, bu sanal makinelerin herhangi biri tarafından, dolayısıyla herhangi bir işletim sisteminde çalıştırılabilir. Bu sistemler arası taşınabilirlik, Java'nın en önemli avantajlarından biridir.
Önceki programı derleyelim:
E:\data\serge\JAVA\ESSAIS\intro1>"e:\program files\jdk14\bin\javac" coucou.java
E:\data\serge\JAVA\ESSAIS\intro1>dir
10/06/2002 08:42 228 coucou.java
10/06/2002 08:48 403 coucou.class
Oluşturulan .class dosyasını çalıştıralım:
Yukarıdaki çalıştırma talebinde, çalıştırılacak coucou.class dosyasının .class sonekinin belirtilmediğine dikkat edilmelidir. Bu sonek zımni olarak kabul edilir. JDK dosyasının bin dizini, DOS makinesindeki PATH dizini içindeyse, javac.exe ve java.exe yürütülebilir dosyalarının tam yolunu belirtmek gerekmez. Bu durumda sadece
2.8. Ana programın argümanları
main ana işlevi, String[] adlı bir dize dizisini parametre olarak kabul eder. Bu dizi, uygulamayı başlatmak için kullanılan komut satırındaki argümanları içerir. Dolayısıyla, P programını şu komutla başlatırsak:
ve main işlevi şu şekilde tanımlanmışsa:
arg[0]="arg0", arg[1]="arg1" … İşte bir örnek:
import java.io.*;
public class param1{
public static void main(String[] arg){
int i;
System.out.println("Nombre d'arguments="+arg.length);
for (i=0;i<arg.length;i++)
System.out.println("arg["+i+"]="+arg[i]);
}
}
Elde edilen sonuçlar şunlardır:
2.9. Bir fonksiyona parametre aktarımı
Önceki örneklerde, yalnızca tek bir işlevi olan Java programları gösterilmiştir; bu işlev, ana işlev olan main'tir. Aşağıdaki örnek, işlevlerin nasıl kullanıldığını ve işlevler arasında bilgi alışverişinin nasıl gerçekleştiğini göstermektedir. Bir işlevin parametreleri her zaman değer olarak aktarılır: yani, gerçek parametrenin değeri, karşılık gelen biçimsel parametreye kopyalanır.
import java.io.*;
public class param2{
public static void main(String[] arg){
String S="papa";
changeString(S);
System.out.println("Paramètre effectif S="+S);
int age=20;
changeInt(age);
System.out.println("Paramètre effectif age="+age);
}
private static void changeString(String S){
S="maman";
System.out.println("Paramètre formel S="+S);
}
private static void changeInt(int a){
a=30;
System.out.println("Paramètre formel a="+a);
}
}
Elde edilen sonuçlar şunlardır:
"papa" ve 20 adlı etkin parametrelerin değerleri, S ve a adlı biçimsel parametrelere kopyalandı. Daha sonra bu parametreler değiştirildi. Etkin parametrelerde ise herhangi bir değişiklik yapılmadı. Burada etkin parametrelerin türüne dikkat edilmelidir:
- S, c.a.d nesnesine bir referanstır. Bellekteki bir nesnenin adresi
- age bir tamsayı değeridir
2.10. Vergi örneği
Bu bölümü, bu belgede çeşitli yerlerde tekrar ele alacağımız bir örnekle sonlandıracağız. Bir vergi mükellefinin vergisini hesaplamaya yarayan bir program yazmayı hedefliyoruz. Beyan edeceği tek geliri maaşı olan bir vergi mükellefinin basitleştirilmiş durumunu ele alacağız:
- evli değilse, çalışanın pay sayısı nbParts=nbEnfants/2 +1 olarak hesaplanır, evliyse nbEnfants/2+2 olarak hesaplanır; burada nbEnfants, çocuk sayısıdır.
- En az üç çocuğu varsa, yarım pay daha ekler
- vergilendirilebilir geliri R=0,72*S olarak hesaplanır; burada S, yıllık maaşıdır
- aile katsayısı QF = R / nbParts olarak hesaplanır
- Vergisi I hesaplanır. Aşağıdaki tabloyu ele alalım:
12620,0 | 0 | 0 |
13190 | 0,05 | 631 |
15640 | 0,1 | 1290,5 |
24.740 | 0,15 | 2072,5 |
31810 | 0,2 | 3309,5 |
39.970 | 0,25 | 4900 |
48360 | 0,3 | 6898,5 |
55790 | 0,35 | 9316,5 |
92970 | 0,4 | 12106 |
127.860 | 0,45 | 16754,5 |
151250 | 0,50 | 23147,5 |
172.040 | 0,55 | 30710 |
195.000 | 0,60 | 39312 |
0 | 0,65 | 49062 |
Her satırda 3 alan vardır. I vergisini hesaplamak için, QF<=alan1 olan ilk satır aranır. Örneğin, QF=23000 ise şu satır bulunur:
bulunur. I vergisi bu durumda 0,15*R - 2072,5*nbParts'e eşittir. Eğer QF, QF<=alan1 ilişkisini hiçbir zaman karşılamıyorsa, o zaman son satırdaki katsayılar kullanılır. Burada:
bu da I=0,65*R - 49062*nbParts vergi tutarını verir.
İlgili Java programı şöyledir:
import java.io.*;
public class impots{
// ------------ ana işlev
public static void main(String arg[]){
// veriler
// vergi dilimlerinin sınırları
double Limites[]={12620, 13190, 15640, 24740, 31810, 39970, 48360,55790, 92970, 127860, 151250, 172040, 195000, 0};
// pay sayısına uygulanan katsayı
double Coeffn[]={0, 631, 1290.5, 2072.5, 3309.5, 4900, 6898.5, 9316.5,12106, 16754.5, 23147.5, 30710, 39312, 49062};
// program
// klavye giriş akışının oluşturulması
BufferedReader IN=null;
try{
IN=new BufferedReader(new InputStreamReader(System.in));
}
catch(Exception e){
erreur("Création du flux d'entrée", e, 1);
}
// medeni durum bilgisi alınır
boolean OK=false;
String reponse=null;
while(! OK){
try{
System.out.print("Etes-vous marié(e) (O/N) ? ");
reponse=IN.readLine();
reponse=reponse.trim().toLowerCase();
if (! reponse.equals("o") && !reponse.equals("n"))
System.out.println("Réponse incorrecte. Recommencez");
else OK=true;
} catch(Exception e){
erreur("Lecture état marital",e,2);
}
}
boolean Marie = reponse.equals("o");
// çocuk sayısı
OK=false;
int NbEnfants=0;
while(! OK){
try{
System.out.print("Nombre d'enfants : ");
reponse=IN.readLine();
try{
NbEnfants=Integer.parseInt(reponse);
if(NbEnfants>=0) OK=true;
else System.err.println("Réponse incorrecte. Recommencez");
} catch(Exception e){
System.err.println("Réponse incorrecte. Recommencez");
}// deneme
} catch(Exception e){
erreur("Lecture état marital",e,2);
}// try
}// while
// maaş
OK=false;
long Salaire=0;
while(! OK){
try{
System.out.print("Salaire annuel : ");
reponse=IN.readLine();
try{
Salaire=Long.parseLong(reponse);
if(Salaire>=0) OK=true;
else System.err.println("Réponse incorrecte. Recommencez");
} catch(Exception e){
System.err.println("Réponse incorrecte. Recommencez");
}// dene
} catch(Exception e){
erreur("Lecture Salaire",e,4);
}// dene
}// while
// pay sayısının hesaplanması
double NbParts;
if(Marie) NbParts=(double)NbEnfants/2+2;
else NbParts=(double)NbEnfants/2+1;
if (NbEnfants>=3) NbParts+=0.5;
// vergilendirilebilir gelir
double Revenu;
Revenu=0.72*Salaire;
// aile katsayısı
double QF;
QF=Revenu/NbParts;
// QF'e karşılık gelen vergi diliminin aranması
int i;
int NbTranches=Limites.length;
Limites[NbTranches-1]=QF;
i=0;
while(QF>Limites[i]) i++;
// vergi
long impots=(long)(i*0.05*Revenu-Coeffn[i]*NbParts);
// sonuç görüntülenir
System.out.println("Impôt à payer : " + impots);
}// ana sayfa
// ------------ hata
private static void erreur(String msg, Exception e, int exitCode){
System.err.println(msg+"("+e+")");
System.exit(exitCode);
}// hata
}// sınıf
Elde edilen sonuçlar şunlardır:
C:\Serge\java\impots\1>java impots
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : 3
Salaire annuel : 200000
Impôt à payer : 16400
C:\Serge\java\impots\1>java impots
Etes-vous marié(e) (O/N) ? n
Nombre d'enfants : 2
Salaire annuel : 200000
Impôt à payer : 33388
C:\Serge\java\impots\1>java impots
Etes-vous marié(e) (O/N) ? w
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? q
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : q
Réponse incorrecte. Recommencez
Nombre d'enfants : 2
Salaire annuel : q
Réponse incorrecte. Recommencez
Salaire annuel : 1
Impôt à payer : 0