You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/*---------------------------------------------------------------------------------------------------------------------- 22.08.2020 for-each döngü deyiminin genel biçimi: for (<tür> <değişken> : <dolaşaılabilir (iterable) bir türe ilişkin referans>) <deyim> Burada dolaşılabilir kavramı uygulama kursunda ele alınacaktır. Diziler dolaşılabilir türler olduğundan for-each döngü deyimi ile kullanılabilir. İleride diziler dışında dolaşılabilir bir sınıflar göreceğiz for-each döngü deyimi kodu kolaylaştırır. Bu durumlarda hep for-each kullanılmalı. Kodu kolaylaştırmadığı durumlarda klasik for döngüsü tercih edilmelidir. for-each döngü deyimi kodun okunabilirliğini de artırır. Yani kodu okuyan kişi for-each döngü deyimi gördüğünde dizinin tüm elemanlarıyla sırasıyla bir işlem yapılıyor olduğunu anlar. Okunabilirlik tersten de düşünülebilir. Yani kodu okuyan kişi bir örneğin bir dizi için klasik for döngüsü görürse, "for-each ile yazılmadığına göre dizinin baştan sona tamamı dolaşılsa bile örneğin index gerekiyor olabilir" anlayabilir.----------------------------------------------------------------------------------------------------------------------*/
for-each döngü deyiminin temsili karşılığı
/*----------------------------------------------------------------------------------------------------------------------
for-eachdöngüdeyiminindiziilekullanımındadöngüdeğişkeninedöngününheradımındaoankielemanındeğeriatanır. Buişlemdizininbaşındansonunakadartekrarlanır. Aşağıdakifor-eachdeyiminintemsilikarşılığışuşekildedir:
{
intval;
for (inti = 0; i < a.length; ++i) {
val = a[i];
System.out.printf("%d ", val);
}
}
----------------------------------------------------------------------------------------------------------------------*/
packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
int [] a = {1, 2, 3, 4, 5};
for (intval : a)
System.out.printf("%d ", val);
System.out.println();
}
}
for-each döngü deyiminde döngü değişkenine atama işlemi dorğudan yapılır.
/*---------------------------------------------------------------------------------------------------------------------- for-each döngü deyiminde döngü değişkenine atama işlemi dorğudan yapılır. Aşağıdaki örnekte int türünden short türüne otomatik tür dönüşümü olmadığından error oluşur----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
int [] a = {1, 2, 3, 4, 5};
for (shortval : a) //errorSystem.out.printf("%d ", val);
System.out.println();
}
}
for-each döngü deyiminde döngü değişkenine atama işlemi dorğudan yapılır. Aşağıdaki örnekte error oluşmaz
/*---------------------------------------------------------------------------------------------------------------------- for-each döngü deyiminde döngü değişkenine atama işlemi dorğudan yapılır. Aşağıdaki örnekte error oluşmaz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
int [] a = {1, 2, 3, 4, 5};
for (doubleval : a)
System.out.printf("%f%n", val);
}
}
for-each döngü deyiminde döngü değişkenini alanı döngü boyunca görülebilirdir
/*---------------------------------------------------------------------------------------------------------------------- for-each döngü deyiminde döngü değişkenini alanı döngü boyunca görülebilirdir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
int [] a = {1, 2, 3, 4, 5};
for (doubleval : a)
System.out.printf("%f%n", val);
System.out.println(val); //error
}
}
for-each döngü deyiminde : den sonraki kısım bir kez yapılır
/*---------------------------------------------------------------------------------------------------------------------- for-each döngü deyiminde : den sonraki kısım bir kez yapılır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
for (intval : Sample.getArray())
System.out.printf("%d ", val);
System.out.println();
}
}
classSample {
publicstaticint[] getArray()
{
System.out.println("getArray");
returnnewint[] {1, 2, 3, 4, 5};
}
}
for-each döngü deyiminde döngü değişkenine atama yapılabilir. Bu çok işe yarar bir işlem değildir.
/*---------------------------------------------------------------------------------------------------------------------- for-each döngü deyiminde döngü değişkenine atama yapılabilir. Bu çok işe yarar bir işlem değildir. Şüphesiz döngü değikenini değiştirmez diz elemanını değiştirmez----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
int [] a = {1, 2, 3, 4};
for (intval : a)
val *= 2;
for (intval : a)
System.out.printf("%d ", val);
System.out.println();
}
}
String sınıfı for-each döngü deyimi ile kullanılamamaktadır
/*---------------------------------------------------------------------------------------------------------------------- String sınıfı for-each döngü deyimi ile kullanılamamaktadır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Strings = "ankara";
for (charc : s) //errorSystem.out.println(c);
}
}
Yukarıdaki işlem toCharArray metodu ile yapılabilir
/*---------------------------------------------------------------------------------------------------------------------- Yukarıdaki işlem toCharArray metodu ile yapılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Strings = "ankara";
for (charc : s.toCharArray())
System.out.println(c);
}
}
for-each döngü deyimi ile dizi dizilerinin dolaşılması
/*---------------------------------------------------------------------------------------------------------------------- for-each döngü deyimi ile dizi dizilerinin dolaşılması----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
int [][] a = {{1, 2}, {3, 4}, {5, 6}};
for (int [] array : a) {
for (intval : array)
System.out.printf("%d ", val);
System.out.println();
}
}
}
for-each döngü deyimi kullanımı kolaylaştırdığı her yerde kullanılmalıdır.
/*---------------------------------------------------------------------------------------------------------------------- for-each döngü deyimi kullanımı kolaylaştırdığı her yerde kullanılmalıdır. Ancak örneğin döngü içerisinde indeks gerekirse for-each döngü deyimi index değerini vermediğinden indeksin ayrıca tanımlanması yerine klasik for döngü deyimi tercih edilebilir. Aşağıdaki örnekte for-each döngü deyimi index ayrıca ayrıca tanımlanarak kullanılmıştır. Örnekte for-each döngü deyiminin döngü değişkeninin kullanılmadığına dikkat ediniz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
int [] a = newint[5];
inti = 0;
for (intval : a) // Bunun yerine klasik for döngüsü kullanılması daha iyidira[i++] = i * 10;
for (intval : a)
System.out.printf("%d ", val);
System.out.println();
}
}
ArrayUtil sınıfı (updated)
/*---------------------------------------------------------------------------------------------------------------------- ArrayUtil sınıfı----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.util;
importjava.util.Random;
publicclassArrayUtil {
publicstaticvoidbubbleSortAscending(int [] a)
{
for (inti = 0; i < a.length - 1; ++i)
for (intk = 0; k < a.length - 1 - i; ++k)
if (a[k + 1] < a[k])
swap(a, k, k + 1);
}
publicstaticvoidbubbleSortDescending(int [] a)
{
for (inti = 0; i < a.length - 1; ++i)
for (intk = 0; k < a.length - 1 - i; ++k)
if (a[k + 1] > a[k])
swap(a, k, k + 1);
}
publicstaticvoidselectionSortAscending(int [] a)
{
intmin, minIndex;
for (inti = 0; i < a.length - 1; ++i) {
min = a[i];
minIndex = i;
for (intk = i + 1; k < a.length; ++k) {
if (a[k] < min) {
min = a[k];
minIndex = k;
}
}
a[minIndex] = a[i];
a[i] = min;
}
}
publicstaticvoidselectionSortDescending(int [] a)
{
intmax, maxIndex;
for (inti = 0; i < a.length - 1; ++i) {
max = a[i];
maxIndex = i;
for (intk = i + 1; k < a.length; ++k) {
if (a[k] > max) {
max = a[k];
maxIndex = k;
}
}
a[maxIndex] = a[i];
a[i] = max;
}
}
publicstaticint [][] addMatrices(int [][] a, int [][] b)
{
if (isNotMatrix(a) || isNotMatrix(b) || a.length != b.length || a[0].length != b[0].length) {
System.out.println("Invalid matrices for add operation");
System.exit(-1); //exception işlemlerine kadar sabredin
}
int [][] total = newint[a.length][a[0].length];
for (inti = 0; i < total.length; ++i)
for (intj = 0; j < total[i].length; ++j)
total[i][j] = a[i][j] + b[i][j];
returntotal;
}
publicstaticvoidbubbleSort(int [] a, booleandescending)
{
if (descending)
bubbleSortDescending(a);
elsebubbleSortAscending(a);
}
publicstaticvoidbubbleSort(int [] a)
{
bubbleSort(a, false);
}
publicstaticvoiddisplay(int [] a)
{
display(1, a);
}
publicstaticvoiddisplay(intk, int [] a)
{
display(k, a.length, a);
}
publicstaticvoiddisplay(intk, intcount, int [] a)
{
Stringfmt = String.format("%%0%dd ", k); //"%02d " -> k = 2for (inti = 0; i < count; ++i)
System.out.printf(fmt, a[i]);
System.out.println();
}
publicstaticvoiddisplay(String [] strings)
{
for (Stringstring : strings)
System.out.println(string);
}
publicstaticvoiddisplay(int [][] a)
{
display(1, a);
}
publicstaticvoiddisplay(intk, int [][] a)
{
for (int [] array : a)
display(k, array);
}
publicstaticvoiddrawHistogram(int [] data, intn, charch)
{
intmaxVal = max(data);
for (intval : data) {
intcount = (int)Math.floor(val * n / (double)maxVal);
while (count-- > 0)
System.out.print(ch);
System.out.println();
}
}
publicstaticvoidfillRandomArray(int [] a, intmin, intmax)
{
fillRandomArray(newRandom(), a, min, max);
}
publicstaticvoidfillRandomArray(Randomr, int [] a, intmin, intmax)
{
for (inti = 0; i < a.length; ++i)
a[i] = r.nextInt(max - min) + min;
}
publicstaticint[] getHistogramData(int [] a, intn) //[0, n]
{
int [] histData = newint[n + 1];
for (intval : a)
++histData[val];
returnhistData;
}
publicstaticint [] getRandomArray(intn, intmin, intmax) //[min, max)
{
returngetRandomArray(newRandom(), n, min, max);
}
publicstaticint [] getRandomArray(Randomr, intn, intmin, intmax) //[min, max)
{
int [] a = newint[n];
fillRandomArray(r, a, min, max);
returna;
}
publicstaticint[][] getRandomMatrix(intm, intn, intmin, intmax) //[min, max)
{
returngetRandomMatrix(newRandom(), m, n, min, max);
}
publicstaticint[][] getRandomMatrix(Randomr, intm, intn, intmin, intmax) //[min, max)
{
int [][] a = newint[m][];
for (inti = 0; i < m; ++i)
a[i] = getRandomArray(r, n, min, max);
returna;
}
publicstaticint [][] getRandomSquareMatrix(intn, intmin, intmax)
{
returngetRandomSquareMatrix(newRandom(), n, min, max);
}
publicstaticint [][] getRandomSquareMatrix(Randomr, intn, intmin, intmax)
{
returngetRandomMatrix(r, n, n, min, max);
}
publicstaticbooleanisMatrix(int [][] a)
{
intcount = a[0].length;
for (inti = 1; i < a.length; ++i)
if (a[i].length != count)
returnfalse;
returntrue;
}
publicstaticbooleanisNotMatrix(int [][]a)
{
return !isMatrix(a);
}
publicstaticbooleanisSquareMatrix(int [][] a)
{
returnisMatrix(a) && a[0].length == a.length;
}
publicstaticbooleanisNotSquareMatrix(int [][] a)
{
return !isSquareMatrix(a);
}
publicstaticStringjoin(String [] strings, chardelimiter)
{
returnjoin(strings, delimiter + "");
}
publicstaticStringjoin(String [] strings, Stringdelimiter)
{
Stringstr = "";
for (Strings : strings)
str += s + delimiter;
returnstr.substring(0, str.length() - delimiter.length());
}
publicstaticintmax(int [] a)
{
intmaxVal = a[0];
for (inti = 1; i < a.length; ++i)
if (a[i] > maxVal)
maxVal = a[i];
returnmaxVal;
}
publicstaticintmin(int [] a)
{
intminVal = a[0];
for (inti = 1; i < a.length; ++i)
if (a[i] < minVal)
minVal = a[i];
returnminVal;
}
publicstaticintpartition(int [] a, intthreshold)
{
intpartitionIndex = 0;
while (partitionIndex != a.length && a[partitionIndex] < threshold)
++partitionIndex;
if (partitionIndex == a.length)
returnpartitionIndex;
for (inti = partitionIndex + 1; i < a.length; ++i)
if (a[i] < threshold)
swap(a, i, partitionIndex++);
returnpartitionIndex;
}
publicstaticvoidreverse(int [] a)
{
inthalfLen = a.length / 2;
for (inti = 0; i < halfLen; ++i)
swap(a, i, a.length - 1 - i);
}
publicstaticvoidreverse(char [] a)
{
inthalfLen = a.length / 2;
for (inti = 0; i < halfLen; ++i)
swap(a, i, a.length - 1 - i);
}
publicstaticvoidselectionSort(int [] a)
{
selectionSort(a, false);
}
publicstaticvoidselectionSort(int [] a, booleandescending)
{
if (descending)
selectionSortDescending(a);
elseselectionSortAscending(a);
}
publicstaticintsum(int [] a)
{
inttotal = 0;
for (intval : a)
total += val;
returntotal;
}
publicstaticintsum(int [][] a)
{
inttotal = 0;
for (inti = 0; i < a.length; ++i)
for (intk = 0; k < a[i].length; ++k)
total += a[i][k];
returntotal;
}
publicstaticintsumDiagonal(int [][] a)
{
inttotal = 0;
for (inti = 0; i < a.length; ++i)
total += a[i][i];
returntotal;
}
publicstaticvoidswap(int [] a, inti, intk)
{
inttemp;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
publicstaticvoidswap(char [] a, inti, intk)
{
chartemp;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
publicstaticint [][] transpose(int [][] a)
{
int [][] t = newint[a[0].length][a.length];
for (inti = 0; i < t.length; ++i)
for (intj = 0; j < t[i].length; ++j)
t[i][j] = a[j][i];
returnt;
}
}
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın elemanlarının erişim belirleyicileri: Sınıf elemanlarının (veri elemanları, metotlar, ctor'lar vb.) erişim belirleyicileri 4 tanedir: public, protected, no-modifier, private Erişim belirleyici anlamında sınıf dört bölüme ayrılmış gibi düşünülmelidir. Yani örneğin sınıfın public bir elemanı sınıfın içerisinde nerede bildirilirse bildirilsin public bölüme eklenmiş olur. Erişim belirleyiciler sınıf dışından erişim için anlamlıdır. Sınıfın dışı başka bir sınıfın içi demektir. Sınıfın içinde erişim belirleyici anlamında bir kısıt yoktur. Yani sınıfın içerisinde her bölüme erişilebilir. Anahtar Notlar: Sınıfın no-modifier elemanı (hiçbir erişim belirleyici yazılmaması) Java' da erişim anlamında diğerlerinden farklıdır. Bazı dillerde olduğu gibi no-modifier diğerlerinden biri anlamına gelmez (default). Bu durumun bir tek enum türünde ctor için istisnası vardır. İleride ele alınacaktır. Sınıfın protected ve no-modifier bölümlerinin anlamları sınıfların aynı pakette veya farklı pakette olmasına göre değişmektedir. Sınıfın private ve public bölümlerinin anlamları aynı pakette veya farklı pakette değişmemektedir----------------------------------------------------------------------------------------------------------------------*/
Sınıfın no-modifier bölümü aynı paketteki diğer sınıflar için public anlamındadır (friendly, internal)
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın no-modifier bölümü aynı paketteki diğer sınıflar için public anlamındadır (friendly, internal)----------------------------------------------------------------------------------------------------------------------*/classA {
inta;
A()
{}
voidfoo()
{}
}
classB {
publicvoidbar()
{
Ax = newA();
x.a = 20;
x.foo();
}
}
Sınıfın no-modifier bölümü farklı paketteki diğer sınıflar için private anlamındadır
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın no-modifier bölümü farklı paketteki diğer sınıflar için private anlamındadır----------------------------------------------------------------------------------------------------------------------*/packagetest;
publicclassA {
inta;
A()
{}
voidfoo()
{}
}
packagemest;
importtest.A;
publicclassB {
publicvoidbar()
{
Ax = newA(); //errorx.a = 20; //errorx.foo(); //error
}
}
Sınıfın protected bölümü aynı paketteki diğer sınıflar için public anlamındadır (friendly, internal)
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın protected bölümü aynı paketteki diğer sınıflar için public anlamındadır (friendly, internal)----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
//...
}
}
classA {
protectedinta;
protectedA()
{}
protectedvoidfoo()
{}
}
classB {
publicvoidbar()
{
Ax = newA();
x.a = 20;
x.foo();
}
}
Sınıfın protected bölümü farklı paketteki diğer sınıflar için türetme (inheritance) söz konusu değilse private anlamdadır. Türetme ve protected bölümün anlamı ileride ele alınacaktır
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın protected bölümü farklı paketteki diğer sınıflar için türetme (inheritance) söz konusu değilse private anlamdadır. Türetme ve protected bölümün anlamı ileride ele alınacaktır----------------------------------------------------------------------------------------------------------------------*/packagetest;
publicclassA {
protectedinta;
protectedA()
{}
protectedvoidfoo()
{}
}
packagemest;
importtest.A;
publicclassB {
publicvoidbar()
{
Ax = newA(); //errorx.a = 20; //errorx.foo(); //error
}
}
/*---------------------------------------------------------------------------------------------------------------------- Erişim Belirleyici Kendisi Aynı Paketteki sınıflar Farklı paketteki sınıflar Türemiş sınıflar public T T T T protected T T F T no-modifier T T F F private T F F F----------------------------------------------------------------------------------------------------------------------*/
Sınıfın özellikle veri elemanlarının gizlenmesine (yani diğer sınıflardan erişilememesine) nesne yönelimli programlama tekniğinde kapsülleme (encapsulation) denir.
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın özellikle veri elemanlarının gizlenmesine (yani diğer sınıflardan erişilememesine) nesne yönelimli programlama tekniğinde kapsülleme (encapsulation) denir. Bu kavramın geneline veri/bilgi gizleme (data/information hiding) denir. Burada temel amaç dışarıyı yani sınıf dışını ilgilendirmeyecek verilerin/bilgilerin dışarıya verilmemesidir. Bu kavram gerçek hayattan nesne yönelimli programlamaya aktarılmıştır. Örneğin araba kullanan bir kişi vites değişim sırasında teknik olarak vites değişiminin nasıl gerçekleştiğini bilmek zorunda değildir. Bilse bile araba kullanırken bunun anlamı yoktur. Bu anlamda sınıfı yazan ve sınıfı kullanan bakış açısı farklıdır. Genel olarak sınıfı kullanan kişiye sınıfn müşterisi (client), sınıfı yazan kişiye ise hizmet veren (server) denir.----------------------------------------------------------------------------------------------------------------------*/
Programlamada bazı önemli isimlendirme teknikleri
/*---------------------------------------------------------------------------------------------------------------------- Anahtar Notlar: Programlamada isimlendirme için bazı teknikler kullanılmaktadır. Bu teknikler dışında da isimlendirme yapılabilir. Bunlar çok kullanılan tekniklerdir: 1. Unix stili (snake case): Bu isimlendirmede karakterlerin tamamı küçük harfle yazılır ve birden fala kelimeden oluşan isimlerde kelimeler arasına alttire karakteri yerleştirilir. Bu isimlendirme Java'da pek tercih edilmez. Örneğin: number_of_invoices, serial_port 2. Camel case (lower camel case): Bu isimlendirmede kelimeler bitişik yazılır. İlk kelimenin baş harfi küçük, diğer kelimelerin baş harfleri büyük olarak yazılır. Geri kalan tüm karakterler de küçük harfle yazılır. Bu isimlendirme Java'da genel olarak yerel değişkenlerde, parametre değişkenlerinde ve metot isimlerinde tercih edilir. Örneğin: parseInt, nextBoolean, isPrime 3. Pascal case (upper camel case): Bu isimlendirmede kelimeler bitişik yazılır. Tüm kelimelerin baş haffleri büyük harf geri kalan karakterler küçük harfle yazılır. Bu isimlerndirme Java' da genelde sınıf ve benzeri türlerde kullanılır. Örneğin: Random, String, LottaryApp İsimlendirmede bunlardan biri ya da birden fazlası kullanılmak zorunda değildir. Örneğin Java' da genel olarak paket isimlerinin tamamı küçük harfle ve bitişik olarak yazılır. Örneğin: org.csystem.util, java.lang, java.io, java.util----------------------------------------------------------------------------------------------------------------------*/
Programlama da private elemanlara yönelik bazı isimlendirme teknikleri
/*---------------------------------------------------------------------------------------------------------------------- Nesne yönelimli programlamada sınıfın özellike gizlene (genel olarak private) veri elemanlarının isimlendirilmesine yönelik bazı teknikler kullanılmaktadır. Örneğin bazı programcılar private veri elemanları isimlendirmesinde (lower) camel case kullanılabilir. Ya da örneğin, private veri elemanları "m_", "d_", "_", "m" gbi önekler alabilir. Biz sınıfın private veri elemanları için "m_" önekini kullanacağız. Eğer sınıfın private veri elemanı aynı zamanda static "ms_" önekini kullanacağız.----------------------------------------------------------------------------------------------------------------------*/
Bir sınıfın veri elemanlarına yönelik set metotları (setters) ve get metotlarının(getters) yazılması
/*---------------------------------------------------------------------------------------------------------------------- Bir veri elemanı gizlendiğinde sınıfın müşteri kodlarının bu elemana değer ataması veya bu elemanın değerini elde etmesi için public metotlar yazılabilir. Veri elenaanlarına erişip değerine elde etmek için yazılan metotlara "get metotları (getters)" denir. Veri elemanına erişip değerini değiştirmeye yarayan metotlara ise "set metotları (setters)" denir. Sınıfın bu şekildeki metotlarına "accessors" denir. Tersine get ve set metotlarının veri elemanlarına erişmesi gerekmez. Bu durumda metotlar mantıksal olarak yazılır. Bu durum ileride ele alınacaktır. Sınıfın set metotlarının isimleri "set" ile başlatılır. get metotları ise "get" ile başlatılır. İstisna olarak sınfın get metodu boolean türden bir değere karşılık geliyor ise genel olarak ismi "is" ile başlatılır. Sınıfı yazan programcı bu isimlendirmeye aksi bir durum olmadıkça dikkat etmelidir. Birtakım işlem yapan ve uygulamada kullanılan ortamlar (framework) veya kütüphaneler (libraries) programcı tarafından yazılmış olan sınıflar için bu şekilde isimlendirilen metotları ararlar ve çağırırlar.----------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki durumlardan en az biri varsa veri elemanı gizlenmelidir: - Sınıfın geliştirilmesinde versiyon değiştikçe (ilerledikçe) bir veri elemanın isminin hatta türünün değişmesine çok sık ratlanır. Bu durumda eski kodların bu değişimden etkilenmemesi için veri elemanı gizlenmelidir. - Bir veri elemanının sınır değerleri olabilir. Bu değerlerin kontrol edilip değiştirilebilmesi için veri elemanı gizlenmelidir - Bir veri elemanı değiştiğinde başka bir veri elemanının değerinin değişen elemana göre hesaplanması gerekebilir. Bu durumda veri elemanları gizlenmelidir - Bir veri elemanı değiştiğinde yeni değere göre bir işlem yapılması gerekiyor olabilir. Örneğin veri elemanı bir uzak veri tabanı yönetyim sistemine ilişkin yer (adres) bilgisi (url) tutuyor olsun. Bu bilgi değiştikçe eski adresten bağlantı kesilip yeni adresteki veritabanı yönetim sistemine bağlanılması gerekiyor olabilir. Bu durumda ilgili veri elemanı gizlenmelidir - Bazen bir veri elemanının gizlenmesi gerekmese de diğer veri elemanları da gizlendiğinden bütünlük açısından gizlenebilir Bu durumlar dışında (%3 ile %5 arası rastlanır) sınıfın veri elemanı puıblic yapılabilir----------------------------------------------------------------------------------------------------------------------*/
veri elemanlarının gizlenmesi ve client kodun bu değişiklikten etkilenmemesi
Getter ile referans olan veri elemanının verilmemsi ve bu durumun veri gizliliğine sakıncası. Aşağıdaki örnekte dizinin elemanlarının değiştirilmesi engellenmemiştir
Tüm sınıfları static olan sınıflarda constructor durumu
/*---------------------------------------------------------------------------------------------------------------------- Tüm elemanları static olarak bildirilmiş sınıflar türünden nesnelerin anlamı olmayacağından public ctor bu tarz sınıflara yazılmaz. Bu durum Java'nın standart sınıfları için de vardır.----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.ArrayUtil;
classApp {
publicstaticvoidmain(String [] args)
{
ArrayUtilarrayUtil = newArrayUtil(); //errorMathmath = newMath(); //error//...
}
}
ArrayUtil sınıfı (güncellendi)
/*---------------------------------------------------------------------------------------------------------------------- ArrayUtil sınıfı----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.util;
importjava.util.Random;
publicclassArrayUtil {
privatestaticvoidbubbleSortAscending(int [] a)
{
for (inti = 0; i < a.length - 1; ++i)
for (intk = 0; k < a.length - 1 - i; ++k)
if (a[k + 1] < a[k])
swap(a, k, k + 1);
}
privatestaticvoidbubbleSortDescending(int [] a)
{
for (inti = 0; i < a.length - 1; ++i)
for (intk = 0; k < a.length - 1 - i; ++k)
if (a[k + 1] > a[k])
swap(a, k, k + 1);
}
privatestaticvoidselectionSortAscending(int [] a)
{
intmin, minIndex;
for (inti = 0; i < a.length - 1; ++i) {
min = a[i];
minIndex = i;
for (intk = i + 1; k < a.length; ++k) {
if (a[k] < min) {
min = a[k];
minIndex = k;
}
}
a[minIndex] = a[i];
a[i] = min;
}
}
privatestaticvoidselectionSortDescending(int [] a)
{
intmax, maxIndex;
for (inti = 0; i < a.length - 1; ++i) {
max = a[i];
maxIndex = i;
for (intk = i + 1; k < a.length; ++k) {
if (a[k] > max) {
max = a[k];
maxIndex = k;
}
}
a[maxIndex] = a[i];
a[i] = max;
}
}
privateArrayUtil()
{
}
publicstaticint [][] addMatrices(int [][] a, int [][] b)
{
if (isNotMatrix(a) || isNotMatrix(b) || a.length != b.length || a[0].length != b[0].length) {
System.out.println("Invalid matrices for add operation");
System.exit(-1); //exception işlemlerine kadar sabredin
}
int [][] total = newint[a.length][a[0].length];
for (inti = 0; i < total.length; ++i)
for (intj = 0; j < total[i].length; ++j)
total[i][j] = a[i][j] + b[i][j];
returntotal;
}
publicstaticvoidbubbleSort(int [] a, booleandescending)
{
if (descending)
bubbleSortDescending(a);
elsebubbleSortAscending(a);
}
publicstaticvoidbubbleSort(int [] a)
{
bubbleSort(a, false);
}
publicstaticvoiddisplay(int [] a)
{
display(1, a);
}
publicstaticvoiddisplay(intk, int [] a)
{
display(k, a.length, a);
}
publicstaticvoiddisplay(intk, intcount, int [] a)
{
Stringfmt = String.format("%%0%dd ", k); //"%02d " -> k = 2for (inti = 0; i < count; ++i)
System.out.printf(fmt, a[i]);
System.out.println();
}
publicstaticvoiddisplay(String [] strings)
{
for (Stringstring : strings)
System.out.println(string);
}
publicstaticvoiddisplay(int [][] a)
{
display(1, a);
}
publicstaticvoiddisplay(intk, int [][] a)
{
for (int [] array : a)
display(k, array);
}
publicstaticvoiddrawHistogram(int [] data, intn, charch)
{
intmaxVal = max(data);
for (intval : data) {
intcount = (int)Math.floor(val * n / (double)maxVal);
while (count-- > 0)
System.out.print(ch);
System.out.println();
}
}
publicstaticvoidfillRandomArray(int [] a, intmin, intmax)
{
fillRandomArray(newRandom(), a, min, max);
}
publicstaticvoidfillRandomArray(Randomr, int [] a, intmin, intmax)
{
for (inti = 0; i < a.length; ++i)
a[i] = r.nextInt(max - min) + min;
}
publicstaticint[] getHistogramData(int [] a, intn) //[0, n]
{
int [] histData = newint[n + 1];
for (intval : a)
++histData[val];
returnhistData;
}
publicstaticint [] getRandomArray(intn, intmin, intmax) //[min, max)
{
returngetRandomArray(newRandom(), n, min, max);
}
publicstaticint [] getRandomArray(Randomr, intn, intmin, intmax) //[min, max)
{
int [] a = newint[n];
fillRandomArray(r, a, min, max);
returna;
}
publicstaticint[][] getRandomMatrix(intm, intn, intmin, intmax) //[min, max)
{
returngetRandomMatrix(newRandom(), m, n, min, max);
}
publicstaticint[][] getRandomMatrix(Randomr, intm, intn, intmin, intmax) //[min, max)
{
int [][] a = newint[m][];
for (inti = 0; i < m; ++i)
a[i] = getRandomArray(r, n, min, max);
returna;
}
publicstaticint [][] getRandomSquareMatrix(intn, intmin, intmax)
{
returngetRandomSquareMatrix(newRandom(), n, min, max);
}
publicstaticint [][] getRandomSquareMatrix(Randomr, intn, intmin, intmax)
{
returngetRandomMatrix(r, n, n, min, max);
}
publicstaticbooleanisMatrix(int [][] a)
{
intcount = a[0].length;
for (inti = 1; i < a.length; ++i)
if (a[i].length != count)
returnfalse;
returntrue;
}
publicstaticbooleanisNotMatrix(int [][]a)
{
return !isMatrix(a);
}
publicstaticbooleanisSquareMatrix(int [][] a)
{
returnisMatrix(a) && a[0].length == a.length;
}
publicstaticbooleanisNotSquareMatrix(int [][] a)
{
return !isSquareMatrix(a);
}
publicstaticStringjoin(String [] strings, chardelimiter)
{
returnjoin(strings, delimiter + "");
}
publicstaticStringjoin(String [] strings, Stringdelimiter)
{
Stringstr = "";
for (Strings : strings)
str += s + delimiter;
returnstr.substring(0, str.length() - delimiter.length());
}
publicstaticintmax(int [] a)
{
intmaxVal = a[0];
for (inti = 1; i < a.length; ++i)
if (a[i] > maxVal)
maxVal = a[i];
returnmaxVal;
}
publicstaticintmin(int [] a)
{
intminVal = a[0];
for (inti = 1; i < a.length; ++i)
if (a[i] < minVal)
minVal = a[i];
returnminVal;
}
publicstaticintpartition(int [] a, intthreshold)
{
intpartitionIndex = 0;
while (partitionIndex != a.length && a[partitionIndex] < threshold)
++partitionIndex;
if (partitionIndex == a.length)
returnpartitionIndex;
for (inti = partitionIndex + 1; i < a.length; ++i)
if (a[i] < threshold)
swap(a, i, partitionIndex++);
returnpartitionIndex;
}
publicstaticvoidreverse(int [] a)
{
inthalfLen = a.length / 2;
for (inti = 0; i < halfLen; ++i)
swap(a, i, a.length - 1 - i);
}
publicstaticvoidreverse(char [] a)
{
inthalfLen = a.length / 2;
for (inti = 0; i < halfLen; ++i)
swap(a, i, a.length - 1 - i);
}
publicstaticvoidselectionSort(int [] a)
{
selectionSort(a, false);
}
publicstaticvoidselectionSort(int [] a, booleandescending)
{
if (descending)
selectionSortDescending(a);
elseselectionSortAscending(a);
}
publicstaticintsum(int [] a)
{
inttotal = 0;
for (intval : a)
total += val;
returntotal;
}
publicstaticintsum(int [][] a)
{
inttotal = 0;
for (inti = 0; i < a.length; ++i)
for (intk = 0; k < a[i].length; ++k)
total += a[i][k];
returntotal;
}
publicstaticintsumDiagonal(int [][] a)
{
inttotal = 0;
for (inti = 0; i < a.length; ++i)
total += a[i][i];
returntotal;
}
publicstaticvoidswap(int [] a, inti, intk)
{
inttemp;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
publicstaticvoidswap(char [] a, inti, intk)
{
chartemp;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
publicstaticint [][] transpose(int [][] a)
{
int [][] t = newint[a[0].length][a.length];
for (inti = 0; i < t.length; ++i)
for (intj = 0; j < t[i].length; ++j)
t[i][j] = a[j][i];
returnt;
}
}
NumberUtil sınıfı (güncellendi)
/*---------------------------------------------------------------------------------------------------------------------- NumberUtil sınıfı----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.util;
importstaticjava.lang.Math.*;
publicclassNumberUtil {
privatestaticString [] ms_onesTR = {"", "bir", "iki", "üç", "dört", "beş", "altı", "yedi", "sekiz", "dokuz"};
privatestaticString [] ms_tensTR = {"", "on", "yirmi", "otuz", "kırk", "elli", "altmış", "yetmiş", "seksen", "doksan"};
privatestaticint[] getDigits(longval, intn)
{
longvalue = Math.abs(val);
intcount = value == 0 ? 1 : (int)Math.log10(value) / n + 1;
int [] digits = newint[count];
intpowerOfTen = (int)Math.pow(10, n);
for (inti = count - 1; i >= 0; digits[i] = (int)(value % powerOfTen), value /= powerOfTen, --i)
;
returndigits;
}
privatestaticStringnumberToText3DigitsTR(intval)
{
if(val == 0)
return"sıfır";
Stringtext = val < 0 ? "eksi" : "";
intvalue = Math.abs(val);
inta = value / 100;
intb = value / 10 % 10;
intc = value % 10;
if (a != 0) {
if (a != 1)
text += ms_onesTR[a];
text += "yüz";
}
if (b != 0)
text += ms_tensTR[b];
if (c != 0)
text += ms_onesTR[c];
returntext;
}
privateNumberUtil()
{
}
publicstaticintfactorial(intn)
{
if (n < 0)
return -1;
intresult = 1;
for (inti = 2; i <= n; ++i)
result *= i;
returnresult;
}
publicstaticint[] getDigits(intval)
{
returngetDigits((long)val);
}
publicstaticint[] getDigits(longval)
{
returngetDigits(val, 1);
}
publicstaticint[] getDigitsInTwos(longval)
{
returngetDigits(val, 2);
}
publicstaticint[] getDigitsInThrees(longval)
{
returngetDigits(val, 3);
}
publicstaticintgetDigitsCount(longval)
{
returnval == 0 ? 1 : (int)log10(abs(val)) + 1;
}
publicstaticintgetDigitsPowSum(intval)
{
intcount = getDigitsCount(val);
intsum = 0;
while (val != 0) {
sum += pow(val % 10, count);
val /= 10;
}
returnsum;
}
publicstaticintgetDigitsSum(intval)
{
val = abs(val);
intsum = 0;
while (val != 0) {
sum += val % 10;
val /= 10;
}
returnsum;
}
publicstaticintgetFibonacciNumber(intn)
{
if (n <= 0)
return -1;
if (n <= 2)
returnn - 1;
intprev1 = 1, prev2 = 0, val = 0;
for (inti = 2; i < n; ++i) {
val = prev1 + prev2;
prev2 = prev1;
prev1 = val;
}
returnval;
}
publicstaticintgetNextFibonacciNumber(intval)
{
if (val < 0)
return0;
intprev1 = 1, prev2 = 0, result;
for (;;) {
result = prev1 + prev2;
if (result > val)
returnresult;
prev2 = prev1;
prev1 = result;
}
}
publicstaticintgetPrime(intn)
{
if (n <= 0)
return -1;
intcount = 0;
intval = 2;
for (inti = 2; count < n; ++i)
if (isPrime(i)) {
++count;
val = i;
}
returnval;
}
publicstaticintgetReverse(intval)
{
intreverse = 0;
while (val != 0) {
reverse = reverse * 10 + val % 10;
val /= 10;
}
returnreverse;
}
publicstaticbooleanisArmstrong(intval)
{
if (val < 0)
returnfalse;
returngetDigitsPowSum(val) == val;
}
publicstaticbooleanisEven(intval)
{
returnval % 2 == 0;
}
publicstaticbooleanisOdd(intval)
{
return !isEven(val);
}
publicstaticbooleanisPrime(intval)
{
if (val <= 1)
returnfalse;
if (val % 2 == 0)
returnval == 2;
if (val % 3 == 0)
returnval == 3;
if (val % 5 == 0)
returnval == 5;
if (val % 7 == 0)
returnval == 7;
intsqrtVal = (int)sqrt(val);
for (inti = 11; i <= sqrtVal; i += 2)
if (val % i == 0)
returnfalse;
returntrue;
}
publicstaticbooleanisNotPrime(intval)
{
return !isPrime(val);
}
publicstaticintmax(inta, intb, intc)
{
returnMath.max(Math.max(a, b), c);
}
publicstaticintmin(inta, intb, intc)
{
returnMath.min(Math.min(a, b), c);
}
publicstaticStringnumberToTextTR(longval)
{
Stringtext;
//TODO: Homework-012-3. sorutext = numberToText3DigitsTR((int)val);
returntext;
}
publicstaticintpow(inta, intb)
{
if (b <= 0)
return1;
intresult = 1;
while (b-- > 0)
result *= a;
returnresult;
}
}
StringUtil sınıfı (güncellendi)
/*---------------------------------------------------------------------------------------------------------------------- StringUtil sınıfı----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.util;
importjava.util.Random;
importstaticjava.lang.Character.*;
publicclassStringUtil {
privateStringUtil()
{
}
publicstaticStringcapitalize(Strings)
{
if (s.isEmpty())
returns;
returntoUpperCase(s.charAt(0)) + s.substring(1).toLowerCase();
}
publicstaticintcountString(Strings1, Strings2)
{
intcount = 0;
for (inti = -1; (i = s1.indexOf(s2, i + 1)) != -1; ++count)
;
returncount;
}
publicstaticStringgetLetters(Strings)
{
Stringstr = "";
intlength = s.length();
for (inti = 0; i < length; ++i) {
charch = s.charAt(i);
if (isLetter(ch))
str += ch;
}
returnstr;
}
publicstaticStringgetLongestPalindrome(Strings)
{
Stringtext = "";
intendIndex = s.length();
while (endIndex != 0) {
intbeginIndex = 0;
while (beginIndex != endIndex) {
Stringstr = s.substring(beginIndex++, endIndex);
if (str.length() > 1 && StringUtil.isPalindrome(str) && str.length() > text.length())
text = str;
}
--endIndex;
}
returntext;
}
publicstaticStringgetRandomText(Randomr, intn, StringmainText)
{
char [] c = newchar[n];
for (inti = 0; i < n; ++i) {
charch = mainText.charAt(r.nextInt(mainText.length()));
if (r.nextBoolean())
ch = toUpperCase(ch);
c[i] = ch;
}
returnString.valueOf(c);
}
publicstaticStringgetRandomTextEN(intn)
{
returngetRandomTextEN(newRandom(), n);
}
publicstaticStringgetRandomTextEN(Randomr, intn)
{
returngetRandomText(r, n, "abcdefghijklmnopqrstuwxvyz");
}
publicstaticStringgetRandomTextTR(intn)
{
returngetRandomTextTR(newRandom(), n);
}
publicstaticStringgetRandomTextTR(Randomr, intn)
{
returngetRandomText(r, n, "abcçdefgğhıijklmnoöprsştuüvyz");
}
publicstaticbooleanisPalindrome(Strings)
{
intleft = 0;
intright = s.length() - 1;
while (left < right) {
charchLeft = toLowerCase(s.charAt(left));
if (!isLetter(chLeft)) {
++left;
continue;
}
charchRight = toLowerCase(s.charAt(right));
if (!isLetter(chRight)) {
--right;
continue;
}
if (chLeft != chRight)
returnfalse;
++left;
--right;
}
returntrue;
}
publicstaticbooleanisPangram(Stringtext, Stringalphabet)
{
intlength = alphabet.length();
for (inti = 0; i < length; ++i)
if (!text.contains(alphabet.charAt(i) + ""))
returnfalse;
returntrue;
}
publicstaticbooleanisPangramEN(Stringtext)
{
returnisPangram(text.toLowerCase(), "abcdefghijklmnopqrstuwxvyz");
}
publicstaticbooleanisPangramTR(Stringtext)
{
returnisPangram(text.toLowerCase(), "abcçdefgğhıijklmnoöprsştuüvyz");
}
publicstaticStringpadLeft(Strings, intlength)
{
returnpadLeft(s, length, ' ');
}
publicstaticStringpadLeft(Strings, intlength, charch)
{
length -= s.length();
if (length <= 0)
returns;
returnrepeat(length, ch) + s;
}
publicstaticStringpadRight(Strings, intlength)
{
returnpadRight(s, length, ' ');
}
publicstaticStringpadRight(Strings, intlength, charch)
{
length -= s.length();
if (length <= 0)
returns;
returns + repeat(length, ch);
}
publicstaticStringremoveWhitespaces(Strings)
{
intlength = s.length();
Stringstr = "";
for (inti = 0; i < length; ++i) {
charch = s.charAt(i);
if (!isWhitespace(ch))
str += ch;
}
returnstr;
}
publicstaticStringrepeat(intn, charch)
{
char [] c = newchar[n];
while (n-- > 0)
c[n] = ch;
returnString.valueOf(c);
}
publicstaticStringreverse(Stringstr)
{
char [] c = str.toCharArray();
ArrayUtil.reverse(c);
returnString.valueOf(c);
}
publicstaticStringtrimLeft(Strings)
{
inti;
intlen = s.length();
for (i = 0; i < len && isWhitespace(s.charAt(i)); ++i)
;
returns.substring(i);
}
publicstaticStringtrimRight(Strings)
{
inti;
for (i = s.length() - 1; i >= 0 && isWhitespace(s.charAt(i)); --i)
;
returns.substring(0, i + 1);
}
}
null referans ve anlamı (detayları ileride ele alınacak)
/*---------------------------------------------------------------------------------------------------------------------- Anahtar Notlar: Programlamada o bölge için hiç bir yer ayrılmayan bir adres numarası vardır. Bu adres Java' da null isimli bir anahtar sözcük ile temsil edilir. Buna null adres/referans de denir. Bir referansın default değer null değeridir. null referans detayları ileride ele alınacaktır.----------------------------------------------------------------------------------------------------------------------*/
Tasarım örüntüleri (Design Patterns): Singleton kalıbı.
/*---------------------------------------------------------------------------------------------------------------------- Singleton kalıbı: Öyle bir sınıf olsun ki bu sınıf türünden program boyunca yalnızca bir tane nesne yaratılabilsin ve her isteyen aynı nesneyi kullanabilsin. Singleton kalıbının bir çok implementasyonu yapılabilir----------------------------------------------------------------------------------------------------------------------*/
Singleton kalıbının bir implementasyonu (lazy implementation)
/*---------------------------------------------------------------------------------------------------------------------- final değişkenler: Bir değişkenin final olarak bildirilmesi o değişkenin bir kez değer alabileceği anlamına gelir. Yani final bir değişene bir kez atama yapılır. İkinci bir atama error oluşturur. final değişkenler sabit ifadesi olarak ele alınır. final yerel değişkenler ve parametre değişkenlerinin Java 8'den itibaren kullanımının anlamı kalmamıştır. Java 8 öncesindeki kodlarda kullanılması zorunlu olan durumlar vardı. Ancak bu durumlar Java 8 ile birlikte değişti. final veri elemanları için genel olarak şu kuraldan bahsedilebilir: Veri elemanının final yapılması algoritmik olarak geçerliyse kesinklikle yapılmalıdır.----------------------------------------------------------------------------------------------------------------------*/
final yerel değişkenlere faaliyet alanı boyunca bir kez atama yapılabilir.
/*---------------------------------------------------------------------------------------------------------------------- final yerel değişkenlere faaliyet alanı boyunca bir kez atama yapılabilir. Genel olarak ilkdeğer verilse de faaliyet boyunca tek atama olması koşuluyla istenildiği yerde atama yapılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
finalinta = 10;
finaldoubleb;
b = 3.4;
//...
}
}
Bir metodun parametre değişkeni final olarak bildirilebilir.
/*---------------------------------------------------------------------------------------------------------------------- Bir metodun parametre değişkeni final olarak bildirilebilir. Bu durumda metodun final olan parametre değişkenine metot içerisinde atama yapılamaz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicstaticvoidfoo(finalinta, intb)
{
++a; //errorb--;
}
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/