Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Java - Array


sigisMoNd

Öne çıkan mesajlar

yarim saattir bakiyorum hatami bulamadim. array den beynim sulandi bugun

verilen serideki eksi sayilarin miktari sonuc olarak verilecek

edit: hatam da ekrana herhangi bir output cikmamasi. bos satir cikiyor.

edit2: mal yanlisimi buldum. bold ile yazdim ama programda bir hata varmis sonucu gorunce farkettim.

said:

import java.util.*;

class Array7 {

static int[] readArray () {
Scanner sc = new Scanner (System.in);
int n = sc.nextInt();
int[]a = new int[n];
for (int x : a) {
x = sc.nextInt();
} return a;
}

static int negativeValues (int[]a) {
int counter = 0;
for (int x : a) {
if (x<0) counter++;
} return counter;
}

public static void main (String[]args) {
int[]a = readArray();
System.out.println(negativeValues(a));
}
}

Link to comment
Sosyal ağlarda paylaş

Mirage said:
For-each sadece okuma amaçlı kullanılıyor. Index kullanarak array'e atama yaptığın için uymuyor bu duruma.


Array'deki elemanları doldurmak için for-each kullanamazsın. Dolayısıyla ilk yazdığın for-each döngüsü yanlış seçim olmuş, for kullanman lazım orda. İkinci for-each doğru yerde kullanılmış.

YANLIŞ - burda normal for döngüsü kullan said:

for (int x : a) {
x = sc.nextInt();
}


DOĞRU said:

for (int x : a) {
if (x < 0)
counter++;
}
Link to comment
Sosyal ağlarda paylaş

arraylerle ilgisi yok ama yeni baslik acmiyim dedim. asagidaki programda input olarak string giriliyor. daha sonra caesar encoding yapilacak yine onceden girilecek olan integer ile.

baya soru sordum. cok sıkmamisimdir umarim :/

said:

import java.util.*;

class Zeichen1 {

static char encoded (char ch, int dist) {
char encodedch = (char)(ch+dist%26);
if (ch>'z' && Character.isLowerCase(ch) ||
ch>'Z' && Character.isUpperCase(ch)) {
encodedch = (char)(encodedch-26);
}
return encodedch;
}

public static void main (String[]args) {
Scanner sc = new Scanner (System.in);
int dist = sc.nextInt();
while (sc.hasNext()) {
String text = sc.next(); //bu kisimlarda
char ch = '?'; //birseylik var
ch = text.charAt(ch); //sanki
if (Character.isLetter(ch)) {
System.out.println(encoded(ch, dist));
} else {System.out.print(ch);}
}
}
}

Link to comment
Sosyal ağlarda paylaş

String#charAt(int i) metodu bir string içindeki i. karakteri verir. İlk karakterin index'i 0'dan başlar. Örnek:


String str = "Hello World";
str.charAt(0) -> 'H'
str.charAt(6) -> 'W'


'?' bir char. Char'ı int'e cast edersen sana ascii kodunu verir. '?' karakterinin ascii kodu 63'müş. Yani sen girilen string'deki 63. karakteri istiyorsun. Yapmak istediğin şey bu değil herhalde?

Metodların ne işe yaradığına bakmak için API kullanmayı alışkanlık haline getirmeni tavsiye ederim. http://java.sun.com/javase/6/docs/api/
Link to comment
Sosyal ağlarda paylaş

Scanner#next() hatırladığım kadarıyla sana bir sonraki token'i String olarak veriyor. Mesela input "23 die Sonne scheint." olsun. next metodu sırasıyla şu string'leri vericek: "23", "die", "Sonne", "scheint.". Yani kelime kelime okuyacak.

Anladığım kadarıyla sen işlemi tek tek her harf için yapmak istiyorsun. Dolayısıyla da verilen kelime içindeki harfleri dolaşman lazım.

While döngüsü içinde text değişkeni kelimeyi temsil ediyor yani. Onun tüm harflerinde işlem yapmak için yine for-each kullanabilirsin.

for (char ch : text.toCharArray()) {
do something with ch
}


Kelime kelime okumak yerine harf harf okumanın da yolu da vardır bu arada.
Link to comment
Sosyal ağlarda paylaş

for-each ile duzgun calisti.

String.toCharArray() --> bunu ilk defa gordum sahsen.

kitap uzerinden gidiyorum. kitap baya iyi aslinda "Sprechen Sie Java?" diye. bu kismin anlatimini kisa tutmuslar nedense. bir de 2005 yilinin kitabi. simdiki javadan farkli bazi yerleri. mesela System.out.print yerine Out.print kullanilmis. In.open, In.done var farkli. bir de sc.nextInt() yerine mesela In.readInt() kullanilmis scanner atamadan.

tekrar saol bu arada Mirage
Link to comment
Sosyal ağlarda paylaş

Sana verilen bu egzersizlerin amacı döngü, array, string gibi temel programlama öğelerini öğretmek. Bunlar ilerde hangi dili kullanırsan olmazsa olmaz şeyler.

Scanner, System.out vb ise Java'ya özel. Bunların hangi mantıkta çalıştığını anlamak yararlı olur, ama tam olarak nasıl çalıştığını bilip ezberlemek çok da gerekli değil. Zaten aldığın dersin amacı da Java öğretmek değil, Java kullanarak programlama temeli öğretmektir muhtemelen.

Scanner vb dile özel öğeleri kullanmazsan unutursun. Java'da program geliştirecek olursun, staj yaparsın ya da işe girersin falan... kullandıkça öğrenirsin bunları. Java'ya başladığımda zamanımın çoğu API ve google ile arama yapmakla geçiyordu. Şimdi çoğu şeyi ezbere yapıyorum. Mesela C# ile işim olunca devamlı API kurcalamam gerekiyor. Ama o kadar yani, nasıl yapacağını biliyorsun çünkü. Sadece aradığım metodun nerde olduğuna ve parametrelerine falan bakmam gerekiyor.

Edit: Almanya'dasın madem, bu programlama temellerini oturttuktan sonra ilk işin bunları kullanabileceğin bir HiWi-Job aramak olsun. Üniversiteler HiWi bulmak için bin bir takla atıyorlar. Hem proje içinde takım çalışmasını öğreniyorsun, hem kendini geliştirmen hızlı oluyor, hem de dünyanın parasını alıyorsun.
Link to comment
Sosyal ağlarda paylaş

Mirage said:

Edit: Almanya'dasın madem, bu programlama temellerini oturttuktan sonra ilk işin bunları kullanabileceğin bir HiWi-Job aramak olsun. Üniversiteler HiWi bulmak için bin bir takla atıyorlar. Hem proje içinde takım çalışmasını öğreniyorsun, hem kendini geliştirmen hızlı oluyor, hem de dünyanın parasını alıyorsun.


Viyanda'yim :) daha 2. semesterim unide. HiWi Jobs Avusturya'da da var midir? google dan baktim biraz ogrenciler icin diye yaziyor. seneye hangi dili ogrenirim unide bilmiyorum ama yazin icin dusunebilirim ogrenciler icinse. tabi uni sonrasi icinse senin bahsettigin daha 2-3 yilim var :)
Link to comment
Sosyal ağlarda paylaş

HiWi = wissenschaftliche Hilfskraft (neden ters diye sorma :p). Üniversitede çalışan öğrencilere deniyor. Orda da vardır, belki ismi farklıdır. AG'leri bir gez, panolara asılıyor genelde ilanlar ya da AG sitelerinde oluyor falan. Benim bir çok arkadaşım 3. sömestırda başladı. Ben 4. sömestırda başlamıştım. Daha önceden tecrübesi olanlar 2. hatta 1. sömestırda bile başlıyor. Bir araştır yani çok faydası olur.
Link to comment
Sosyal ağlarda paylaş


int set = 0;
...
void exclude(int x) {
if (x >= 0 && x < 32) set &= ~(1 << x);
}

boolean contains(int x) {
return x >= 0 && x < 32 && ((1 << x) & set) != 0;
}
...


su iki yerdeki yazim seklinin ne anlama geldigini anlayamadim.

set &= ~(1 << x);

return x >= 0 && x < 32 && ((1 << x) & set) != 0;

2.sinde aslinda returnde operatorler nasil kullanilir o kismini anlayamadim :S
Link to comment
Sosyal ağlarda paylaş

Bitwise operator deniyor onlara. << ve >> bitleri kaydırmaya, ~ ise tersine çevirmeye yarıyor. Bitwise operator / operations gibi ararsan detaylı bilgi bulursun.

http://leepoint.net/notes-java/data/expressions/bitops.html http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html mesela ilk çıkan arama sonuçlarından

Edik:

&= ise bir kısaltma sadece.
[X] binary bir operator olsun, şu iki satır aynı anlamda:

a [X]= b;
a = a [X] b;


Genelde + için kullanılıyor. a'yı iki arttırmak için a += 2; gibi. Senin örneğinde set &= ~(1 << x) şunun kısaltması:

set = set & ~(1 << x);
Link to comment
Sosyal ağlarda paylaş

onceki aciklama icin tesekkurler Mirage

yeni bir sorum var. mesela en basitinden bolme islemi yapicaz. 6/5 diyelim ki. sonucta virgulden sonra 3 basamak gormek istiyorum. 1.200 yani. printf ile yapildigini gormustum bir yerde ama sonraki parantez icinde yazilanlari bilmiyorum. % falan birseyler yaziliyordu sanki.
Link to comment
Sosyal ağlarda paylaş

tekrar slm

Stringlerle ilgili bir sorum olucakti. amac diyelim ki


a b c f
b d s


seklinde 2 kume giriliyor input olarak. aralarda 1 bosluk olacak tek chardan olusan elemanlarin.

cardinality() metodu kumedeki eleman sayisini veriyor. union() da birlesim kumesini vericek. ama ayni elemanlar bir kez yazilacak.

bu ayni elemani ve sonraki boslugu silme isini beceremedim. hata aliyorum cmdde.

toString metodu da elemanlari arada bosluk olarak geri verecek.




said:

import java.util.*;

public class Set {
static void cardinality (int len) {
String set = "";
len = (set.length()+1)/2;
}

static String union (String set) {
for (int i=0; i<set.length(); i=i+2) {
for (int j=i+1; j<set.length(); j=j+2) {
if (set.charAt(i) == set.charAt(j)) {
set.charAt(i) = "";
set.charAt(i+1) = "";
}
}
} return set;
}

public String toString () {
String set = "";
for (int i=0; i<set.length(); i=i+2) {
return set.charAt(i) + " ";
}
}

public static void main (String[]args) {
Scanner sc = new Scanner (System.in);
while (sc.hasNextLine()) {
String input = sc.nextLine();
union(input);
input.toString();
}
}
}

Link to comment
Sosyal ağlarda paylaş

(onceki postumla ilgili) union metodunu bu hale getirdim.


a b c d
b c f g


girdigimde d g yi aliyorum output olarak. oncekilerin hepsi siliniyor. for loop larda mi yoksa ayni karakteri sadece 1 kere yazmada mi yoksa genel bir sorun mu var bulamadim.


said:

static String union (String menge1, String menge2) {
String s = "";
for (int i=0; i<menge1.length(); i=i+2) {
for (int j=i; j<menge2.length();j=j+2) {
if (menge1.charAt(i) == menge2.charAt(j)) {
s += menge1.charAt(j);
} else {
s = menge1.charAt(i) + " " + menge2.charAt(j);// + " " + menge2.charAt(j);
}
}
} return s;
}

Link to comment
Sosyal ağlarda paylaş


public static void main (String[]args) {
Scanner sc = new Scanner (System.in);
while (sc.hasNextLine()) {
String input = sc.nextLine();
union(input); <---- ?
input.toString();
}
}

union(input) satırı hiç bir işe yaramıyor. Son mesajında union metodunu iki string alacak şekilde değiştirmişsin. Ama union metodu yeni bir string döndürüyor, o string'i hiç bir yerde kullanmıyosun ki.

cardinality metodu eleman sayısını verecek demişsin, ama metod hiç bir şey döndürmüyor. "int len" lokal bir değişken. Metod bittiğinde len değişkeninin ömrü bitiyor. Yani metod hiç bir işe yaramıyor.

Bir de, Collections kütüphanesini kullanmayacağını düşünmüşler sanırım bu alıştırmada di mi? Java'da Set var zaten.

Ayrıca yapmaya çalıştığın şey baştan yanlış. Bu metodların static olmaması lazım. OOP kullanman gereklidir diye tahmin ediyorum. Sen (Almanca da olsa) soruyu buraya koy bence. Tahminimce interface şu şekilde olmalı:

public interface Set {
public int cardinality();
public Set union(Set set);
}


Yani metodları string üzerinden değil, kümeler üzerinden kullanmalısın. Kümeyi oluştururken constructor'a string vererek oluşturcaksın büyük ihtimalle.
Link to comment
Sosyal ağlarda paylaş

oncekinin toptan yanlis oldugunu anladim sadece union metodunu halletmeye calistim sonradan. son hali su yani:
said:

import java.util.*;

//input : a b c d
// b c f g
//output: a b c d f g

public class Set {
/*
static int cardinality () { //liefert die Anzahl der Elemente der Menge zurueck
String text = "";
int counter = 0;
for (char ch : text.toCharArray()) {
if (Character.isLetter(ch)) {
counter++;
}
} return counter;
}
*/
static String union (String menge1, String menge2) {//liefert die Vereinigungsmenge mit einer weiteren Menge, die als Argument uebergeben wird
String s = "";
for (int i=0; i<menge1.length(); i=i+2) {
for (int j=i; j<menge2.length();j=j+2) {
if (menge1.charAt(i) == menge2.charAt(j)) {
s += menge1.charAt(j);
} else {
s = menge1.charAt(i) + " " + menge2.charAt(j);// + " " + menge2.charAt(j);
}
}
} return s;
}

//intersection () {//liefert die Durchschnittsmenge mit einer weiteren Menge

//}
/*
public String toString () {//liefert eine Zeichenkettenrepresentation der Menge in der Form "a b c"
String set = "";
for (int i=0; i<set.length(); i=i+2) {
return set.charAt(i) + " ";
} return set;
}
*/
public static void main (String[]args) {
Scanner sc = new Scanner (System.in);
String menge1 = sc.nextLine();
String menge2 = sc.nextLine();
String x = union(menge1, menge2);
System.out.println(x);
}
}




bu da Angabe:


Die Klasse Set repraesentiert Mengen. Dem Konstruktor kann ein String mit den Elementen der Menge als Lexikale (Symbole) geterennt durch ein Leerzeichen in einen String uebergeben werden. Eine Menge {a, b, c} wird z.B. durch den String " a b c" erzeugt. Dabei ist zu beschreiben, dass jedes Element nur einmal vorkommen darf. Die Menge, die mit dem String "a b c b c d" erzeugt, ist also die Menge {a, b, c, d}

metodlar da cardinality(), union(Set), intersection() ve toString() olarak verilmis. bunlarla ilgili aciklamalar da programda yazili hepsinin yaninda.



dun tutora da gittim. kiz da bakti hmmm mmm yapti cozum bulamadi nasil tutor olduysa. sonra benim aklima geldi. stringbufferla yapilir mi dedim. hani string.delete() falan var daha kolay olur diye. evet oyle olabilir diyip basindan savdi. sonra onunla yapmayi denedim evde. ama main methodda stringbufferi nasil okucam onu bulamadim. sc.next() ya da sc.nextLine() stringi okumak icin oldugu icin hata aldim cmdde.
Link to comment
Sosyal ağlarda paylaş

Tamam işte tahmin ettiğim gibi verilmiş açıklama. O metodlar static olmayacak. Union'a da argüman olarak String vermeyeceksin, Set vereceksin.

Nesne yönelimli çözmen lazım bunu. Sen C tipi yapmışsın, her şey static.

Set class'ı bir kümeyi temsil ediyor. Constructor kullanarak bir küme nesnesi üreteceksin. Şimdi bunun tamamını çözmek yerine sana metodların nasıl olması gerektiğini vereyim. Main metodunda da testi yazayım. Doldurması sana kalmış. Anlamadığın yeri sorarsın.


public class Set {

/**
* Verılen string'i kullanarak bir küme üretir.
*
* @param input
* her biri bir boşluk ile ayrılmış karakter dizisi, örnek
* "a b c b c d"
*/
public Set(String input) {

}

/**
* @return kümedeki eleman sayısı
*/
public int cardinality() {

}

/**
* Bu küme ile hedef kümenin birleşiminden oluşan yeni bir küme yaratır.
*
* @param target
* birleştirilecek küme
* @return birleşim kümesi
*/
public Set union(Set target) {

}

/**
* Bu küme ile hedef kümenin kesişiminden oluşan yeni bir küme yaratır.
*
* @param target
* kesişimi alınacak küme
* @return kesişim kümesi
*/
public Set intersection(Set target) {

}

/**
* @return kümedeki harfleri temsil eden String
*/
@Override
public String toString() {

}

public static void main(String[] args) {
Set testSet1 = new Set("a b c d");
Set testSet2 = new Set("b c f g");
Set unionSet = testSet1.union(testSet2);
System.out.println(unionSet);
}

}
Link to comment
Sosyal ağlarda paylaş

yok abi unionu yapamiyorum kafam basmiyor. anlamadim nasil kullanacagimi yeni yaratilan Set ile. bakiyorum deminden beri mal mal.

konstruktor amacli bunu yaptim:

public Set(String input) {
for (char ch : input.toCharArray()) {
input = ch + " ";
}
}


cardinality() metodu icin bunu:

public int cardinality() {
int counter = 0;
for (int i=0; i<input.length(); i++) {
if (Character.isLetter(input.charAt(i))) {
counter++;
}
} return counter;
}


toString() icin de bunu:

public String toString() {
String str = "";
for (int i=0; i<input.length(); i++) {
if (Character.isLetter(input.charAt(i))) {
return str += input.charAt(i) + " ";
}
} return str;
}



bunlar dogru mu?

edit: en basta da


public class Set {
private String input;
...


var. testlerde main metodu ayri yazdiklari icin private dedim. burda private olmasina gerek yok sanirim. zaten main metod da ayni yerde. tabi ona hic gerek olmayabilir de. yanlis yapmis oldugum icin sacmaliyor olabilirim.
Link to comment
Sosyal ağlarda paylaş

:) Yanlış yaptığın yerler var yine ama doğru yoldasın. En azından en baştaki "private String input" fikir olarak doğru. Nesne nedir, class nedir tam oturmamış daha, o yüzden zorlanıyorsundur, normal bi şey.

Constructor, yani public Set(String input) {..} metodu nesneni oluşturmaya yarıyor. Bu constructor'u çağırdığında yeni bir Set nesnesi oluşturuyorsun ve bu nesnenin içinde -bir şekilde- kümedeki harfleri kaydetmen lazım. Bunu da attribute kullanarak yapıyorsun. İlk satırda "private String input" yazmışsın. Kafa karıştırmasın, ona "private X content" diyelim. Burdaki content bir attribute.

Şimdi constructor'u öyle yazcaksın ki, input string'ini alıp, nesneye özel content attribute'unu doldurcak. Bu content private olacak, yani dışardan gözükmeyecek. Dolayısıyla content'i hangi tipten yapacağına keyfine göre karar verebilirsin. En uygun iki seçenek char array ya da String olacaktır. Örnek olarak String diyelim.


public class Set {

/*
* Her ürettiğin küme için yeni bir content üretilecek
*/
private String content;

public Set(String input) {
/*
* Input'taki her harf'i, content içinde sadece bir kere
* bulunacak şekilde content'e koyacaksın.
* Content içinde boşluk bulunmayacak.
*
* Örnek: input = " a b c a"
* Constructor sonrasında üretilen kümedeki content = "abc"
*
* Yani bu content kümendeki harfleri temsil ediyor
*/
}

public int cardinality() {
return content.length(); // evet bu kadar basit
}

public String getContent() {
/*
* Getter metodu
*
* content attribute'u private olduğu için erişim için
* bu şekilde getter metodları kullanılıyor
*/
return content;
}

public Set union(Set target) {
String unionSetInput;
String targetContent = target.getContent();
/*
* Birleşirmek istediğin iki kümenin içeriği elinde:
* biri target değişkeniyle verilen nesneden aldığın targetContent,
* diğeri bu metodun çağrıldığı nesnede bulunan content
*
* Amacın bu iki content string'lerini kullanarak
* bunların birleşiminden oluşmuş yeni bir string yaratmak,
* sonra bu string ile yeni bir küme oluşturup geri vermek.
*
* Constructor boşluklarla ayrılmış bir string beklediği için
* o boşlukları eklemen lazım.
*
* Örnek: this.content = "abc", targetContent = "caj"
* unionSetInput = "a b c j"
*
* Sonra da bu ürettiğin string'i ile
* constructor'u çağırarak yeni bir küme
* oluşturup return ile döndürüyorsun.
*/
return new Set(unionSetInput);
}


}
Link to comment
Sosyal ağlarda paylaş

simdi konstruktorda dedigin gibi contente ayni olanlardan sadece bir tanesini ve bosluklar haricindeki elemanlari eklemeye calistim. once nasil dusundugumu anlatayim sonra o kadar aciklamana ragmen hala yanlis yaptiysam kufredebilirsin.

simdi i ve j iki index. i inputun en basindan aramaya basliyor sirasiyla 1er 1er giderek. j de i den basliyor. yani


- - - - - -
^
|

i

^ ^ ^ ^ ^ ^
| | | | | |
j j j j j j


^
| yukari ok isareti anlaminda. ilk i icin olan indexi j sirasi ile kontrol ediyor. kontrol ederkenki okunan karakter harfken eger i indexindeki harf ile j indexindeki harf farkli ise hem i hem de j indexindeki karakter content e ekleniyor. farkli ise sadece i indexindeki harf contente ekleniyor.

oyle dusununce sunu cikarttim ortaya:

public Set(String input) {
for (int i=0; i<input.length(); i++) {
for (int j=i; j<input.length(); j++) {
while (Character.isLetter(input.charAt(i))) {
if (input.charAt(i) != input.charAt(j)) {
content += input.charAt(i) + input.charAt(j);
} else {
content += input.charAt(i);
}
}
}
}
}


yanlissa kufrettikten sonra nerede yanlis dusundugumu soylersen sevinirim.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...