Coder Test-II by neoturk [27/05/2004]
Herkese merhaba,
Sizler için 2.kuşak coder test sınavını hazırladım, cevaplarınızı bekliyorum...
Sınavı geçenlere yardımcı olacağım, başlangıç seviyesinde olan arkadaşların maillerini alıyorum, ama hepinize birden mail atmak zor oluyor
inanın... ve çok zaman alıcı.. bu yüzden diğer arkadaşlardan büyük özür diliyorum..
Önceki hazırladığım Testi geçenler ile frekanslarımız uyuşuyor demektir.. yani birbirimizin dilinden anlayabiliriz :]
Çünkü beginner seviyesindeki bir arkadaşıma ben nasıl yardımcı olabilirim??... üzgünüm bu konuda................
Pekala, sınav başlıyor....
Aşağıdaki soruları yorumlayınız ve uygun gördüğünüz şekilde cevaplandırınız:
SORU 1: ( 50 puan )
-----------------------------
Formunuzun üzerine 30 tane button yerleştiriniz. Hangi butona tıklandıysa bana hangi butona tıkladığımı söylesin.
Örneğin, 5 nolu butona tıkladıysam "5 nolu butona tıkladınız", 10 nolu butona tıkladıysam "10 nolu butona tıkladınız" mesajını versin.
(amaç: bazı işlem tekrarlarından sizi arındırmak! )
Aşağıdaki şekilde kodlama yapıyorsanız büyük projelerde çekeceğiniz var demektir...
button1.onclick(sender)
begin
showmessage("1 nolu butona tıkladınız!");
end;
button2.onclick(sender)
begin
showmessage("2 nolu butona tıkladınız!");
end;
button3.onclick(sender)
begin
showmessage("3 nolu butona tıkladınız!");
end;
....
og ooo.... nayn!... this is nayn!...
SORU 2: ( 100 puan )
-------------------------------
Formunuzun üzerine 20 tane edit yerleştiriniz. Ve bu editlerin içerisine sadece rakamlar girilmesi isteniyor...
Bu sorunu çözebilen genel bir çözüm yolu geliştiriniz...
(amaç: gereksiz işlem tekrarından kaçınmak! )
Aşağıdaki şekilde kodlama yapıyorsanız yine başınız belada demektir...
edit1.onkeypress(sender);
begin
if key in [....] then ............
end;
edit2.onkeypress(sender);
begin
if key in [....] then ............
end;
.............
ops yani........ nayn!....
SORU 3: ( 500 puan )
--------------------------------
formunuza 1 adet listbox yerleştiriniz. Bu listbox üzerine random olarak 8 haneli sayılar üretiniz. üretilen sayılar farketmez..
bu konuda herhangi bir sınırlama yok... 8 haneli sayı olsun yeterli...
Sizden istenen şu: Bu sayılar içersinde tekrar eden sayıların listesini başka bir listbox içerisine çıkarınız....
(amaç: Tekrar edilmiş kayıtların listesini çıkarmak! )
Bu konuda bir çoğunuzun aklına şöyle bir kod gelecektir;
listbox2.clear;
n:=listbox1.items.count-1;
for m:=0 to n do
begin
x1:=listbox1.items[m];
for m2:=1 to n-1 do
begin
x2:=listbox1.items[m];
if x1=x2 then
begin
listbox2.items.add(x1);//tekrar edilmiş kaydı listbox2 ye ekledik..
end;
end;//m2
end;//m
oldu mu ?............
evet oldu....... ama nayn!... iştiraze nayn!...
why?..
Çünkü yukardaki kod zaman alıcı gereksiz bir sorgulama işlemi...
çünkü tüm listeyi baştan sona tüm listeyle kıyaslama yapıyor... sonuçta tekrar eden kayıtları bulur... ama naynnn!....
çok zaman alır bu... 1000 tane kaydınızın olduğunu düşünün, 1000x998 kere işlem yapacak yani 998,000 kere sorgu yapacak..
bu da pcnizin 1milyona kadar sayı saymasıyla eşdeğer bir süreye eşit... ( benim pcde bu nerden baksanız 10dk filan alıyor...)
çünkü gereksiz sorgulamalar var... 1.kayıt ile 100.üncü kaydı kıyaslamış ise, 100.üncü kaydı 1.kayıtla tekrar sorguluyor..
gerek var mı buna? he?....
o halde kodu biraz daha düzeltelim!...
listbox2.clear;
n:=listbox1.items.count-1;
for m:=0 to n do
begin
x1:=listbox1.items[m];
for m2:=m+1 to n-1 do
begin
x2:=listbox1.items[m];
if x1=x2 then
begin
listbox2.items.add(x1);//tekrar edilmiş kaydı listbox2 ye ekledik..
end;
end;//m2
end;//m
işte kodu biraz daha düzelltik!... for m2:=m+1 to n-1 do........ kıyaslanmış kaydı bi daha kıyaslama kardeşim!.. adamı da hasta etme diyoz!...
böylece sürekli hızlanan bir sorgulama algoritması oldu... bir nevi buble-shorta benzedi.. ( benzedi diyom, aynısı diil! )
ama yine nayn!!..........
bunu şunun için sordum arkadaşlar,
geçenlerde elime baya popüler bir program geçmişti.. IDtagReader diye bi program.. Güya duplicate MP3leri buluyor.. nerdeee!.. ulan 150 tane mp3
içersinde bile aynı olanları sorgulaması nerden baksanız 15-20 dk sürüyor... bunu da öküz program(afedersiniz) dediğim gibi yukardaki algoritmaya
göre yapmış... baştan sona gereksiz sorgulamalarla vakit harcamış amcam.. bi de professionalmış program! register kodu filan istiyo.. de get
dedim!.. oturdum adam gibi mp3ayıklayıcı programımı yazdım.. elimde bulunan 18.000 adet mp3 içersinden aynı olanları 30sn gibi bir sürede
analizleyip aynı olanların listesini çıkarıyor... bu değirmenin(hızın) suyu nerden geliyor?...
evet soru bu arkadaşlar...
daha hızlı olarak nasıl aynı olan verileri ayıklayabiliriz?...........
SORU 4: ( 50 puan )
--------------------------------
Formunuzun üzerine bir adet listview nesnesi yerleştirip içlerini kod ile doldurunuz. kolonları ve itemleri önemli değil. elinizde report tarzında
bir liste olsun. dbNavigator gibi yani....
Bu itemler üzerinde neye tıkladıysam, ilgili satırdaki verileri ben memo kutusu içersine gelmesini istiyorum. Hani şu klasik veri tabanlarında
olan işlem tarzlarından... yani satırlar üzerinde dolaşırken aktif satırdaki verileri ben memo kutusu içinde görmek istiyorum...
bana bunu programlayın!... :]
tecrübe sahibi arkadaşlar burada gülümseyeceklerdir :]
çünkü ilk etapda programlanabilir bir şey olarak görünüyor.. ama kullandığınızda bir problemle karşılaşacaksınız, daha doğrusu güzel bir eksik
olacak programınızda!.. bana bu eksiği de bulup söyleyin lütfen..!
(ipucu: nerde benim klavyedeki ok tuşlarım?.. bunları da kullanmak istiyorum!.. armut piş ağzıma düş olmuyo işte!.. )
SORU 5: ( 100 puan )
----------------------------------
formunuzda bir adet Treeview olduğunu varsayın... ve bu treeview'in içeriği de aşağıdaki gibi olsun;
...
hayvanlar
etciller
aslan
kaplan
otcullar
koyun
inek
bitkiler
yenebilirler
domates
biber
yenilemeyenler
ot
kavakağacı
...
bu şekilde bir treeviewimizin olduğunu varsayalım... bunlara collapse de verebiliriz. yani (+) simgesini kullandırabiliriz, hani otomatik açılıp
kapanan özellik... eywallah...
yanlız burada şöyle ilginç bir nüans var....
ben tıkladığım itemin tam olarak pathini istiyorum, şöyle;
ben "koyun" itemine tıkladıysam, bana;
"hayvanlar\otcullar\koyun" stringini vermesini istiyorum...
yani işin işine "node" nokta ve düğüm algoritması giriyor...
bana bunu programlayın!.......
bunu yaparsanız sizin de çok işinize yarayan bir özellik olacak!...
okey..........
SORU 6: ( 50 puan )
--------------------------------
Bana rakamları birbirinden farklı 4 basamaklı sayılar üretiniz...
öyle bir function yazınız ki her defasında 4 basamaklı sayılar üretsin ama rakamları birbirinden farklı olsun..
(tercihe göre bu 4 basamak esnek de olabilir.. 6 basamaklı da isteyebilirim.... ona göre kodunuzu yazın... )
SORU 7: ( 200 puan )
---------------------------------------
Geçenlerde bir sipariş üzerine AT yarışı takip programı yazdım.. programı kullanan amcam her gün atlarını düzenli olarak girip kaydediyor.. ve
sorgu yaptığında da bilgisayarın bu atları otomatik puanlandırmasını istiyor.. ( ne alaka diye sorabilirsiniz, dergilerdeki verilere programı
kullanan amcam pek beğenmiyor.. atın koştuğu sürelere ilişkin bir formülle puanlama istiyor.. )
şöyle;
pinokyo = 1.18.35 ( 1 dakika 18 saniye 35 salise )
küheylan = 1.05.25
karaşimşek = 1.15.32
simsar = 1.08.32
olsun...
Bana bu atları kendi formülünüze göre puanlama yaptırın, şu şekilde sonuçlar isteniyor;
küheylan = 100 puan
simsar = 78 puan ( atıyorum )
karaşimşek = 64 puan ( atıyorum )
pinokyo = 35 puan ( atıyorum )
sadece süre verilerini kullanarak bunları puan sıralamasına koyun........
okey..........
SORU 8: ( 700 puan )
----------------------------
Sorunun puanını hak eden bir soru sorayım bari...
Bir network programı yazdınız diyelim.. birsürü terminal pcyi yöneten bir ana programınız var. yani bunun illegal adı "trojan" programcılığı
oluyor.. bu yüzden trojan programcılığını da abartmaya gerek yok...
soruya geçelim,
terminal pc sayınız 50 olsun... yani 50 tane pc ile kontakt kurabilirsiniz.... programınızı bu şekilde yazdığınızı varsayalım...
bazı pcler kendiliğinden restart edilmiş olsun, bazılarında problem çıkmış olsun.. bu durumda sizin ana program ekranınızda hangi pclerin
bağlantılarının kopuk olduğunu görmeniz gerekiyor....
istemsiz bağlantı kopmaları bu tür programlarda hep problem oluşturur...
Ve diyelim ki siz tüm ağa bir mesaj göndermek istiyorsunuz,
bunu yaparken de bir döngü kullanabiliriz.. örneğin;
for m:=1 to terminal sayısı
if ilgili_client_socket_aktif_ise then o_pc_ye_mesajı_gonder ....
gibi...
ama dediğim gibi bazen bu clientsocketler yanılabiliyor... ve bağlantının kopmuş olup olmadığını nasıl anlarız?...
sorumu tam olarak soramadım.. çünkü soruyu sorarken değişik cevapları düşündüğüm için biraz karışık gelmiş olabilir :]
neyse... bu soruyu kendinize göre cevaplayın :] asıl vurgulamak istediğim soruyu tekrar soruyorum toparlanmış olarak!
kardeşim, ben tüm ağdaki terminallerin hangileri ile bağlantılarımın olduğunu anında(en hızlı olarak) görmek istiyorum! olay bu!
(netstat -a filan değil..... kendi programımla bağlantı olanların listesini istiyorum o kadar! )
SORU 9: ( 300 puan )
-----------------------------------
Şöyle bir mantık isteniyor bizden...
Herhangi bir klasörde bulunan 50 adet metin belgesinin içeriğini görmek/değiştirmek/düzenlemek vs. gibi işlemi tek bir form üzerinde yaptırtmak
isteniyor..
yani program açıldığında bu 50 tane metin dosyasını hafızasına alacak, ben hangisini seçersem memo içersinde bana gösterecek
(seçili olan itemdeki text dosyasını o anda loadfromfile yaptırtmak istemiyoruz!.. istenen bu değil.. her tıklanışta tekrar tekrar loadfromfile mi
diyeceğiz?...... nayn!.. bunların hepsini program ilk açıldığında hafızasına alacak! istenen bu! )
(amaç: büyük bloklu işlemler bütünlüğünü sağlamlaştırmak ve pekiştirmek )
SORU 10: ( 500 puan )
------------------------------------------
Yine bir program yazdığınızı düşünelim... ve bu program da bir trojan programı olsun.. ya da olmasın farketmez..
bizden istenen şu, ilgili pc üzerindeki(remote pcdeki) dosyaları bulmak ve listelemek, ve sonucu kendi pcmizde göstermek..
Şimdi bunda ne var? diye soracaksınız doğal olarak... soruma devam ediyorum,
örneğin c:\windows\*.jpg dosyalarını bulduralım... eheh... şu anda kafanızda şimşeklerin çakması gerekiyor!.. soruma devam ediyorum,
dosyaları bulduğumuzda şöyle bir liste olacak;
....
c:\windows\bilmemne.jpg
c:\windows\bilmemne2.jpg
c:\windows\vsvs.jpg
c:\windows\system32\bilmemne3.jpg
........
eywallah.. bulduk... bu liste böyle... ve bu listeyi karşı tarafa gönderecez.. karşı tarafta da bunlar görünecek.. eywallah...
şimşekler çaktı mı kafanızda?...
bu listenin toplam boyutunun 100Kb olduğunu düşünelim... 100Kb veriyi gönderdik ve 3 sn sürdü diyelim.. eywallah...
peki bunu daha da hızlandıramaz mıyız?... he ?....
hemen şu cevap gelecektir deneyimli olanlardan: "e sıkıştırarak gönderirim?".. evet.. sıkıştırarak göndereceksiniz tabii ki !
ama neden x2 katı daha hızlı olmasın ?... hem sıkıştırın, hem de hızlandırın?.. ama nasıl?...
şimşekler çaktı mı kafanızda?.....
ben bu listeyi başka bir formata dönüştüremez miyim?... ve bunu gerçekten de 10Kb'ye düşüremez miyim ? sıkıştırılmış olup da kendi formatıma
çevirdiğim zaman?..
soru bu... bana bunu çözün arkadaşlar........
SINAV SÜRESİ 100 DAKİKADIR...... HER SORUYA 10 DAKİKA YETER............
Toplam puan = 2550 dir.
Geçme notu en az 2000 isteniyor.. Ben istiyorum!
cevaplarınızı ve yorumlarınızı bekliyorum... sınavı geçenlerle soru-cevap kritiklerinde bulunacağım.. dediğim gibi beginner seviyesinde olan
arkadaşlardan özür diliyorum... yardımcı olamıyorum kusura bakmayın...
cevapları ben yazacağım belli bir zaman sonra, önce bi yorumlarınızı okiyim....
ne kadar ekmek, o kadar köfte....
laf kalabalığından ziyade, RealTime problem çözümleri her zaman (+) dır benim için...
kızıyorum hep aynı şeylerin dönüp dolaşıp sağda solda yayınlanmasına... belki bu programda da (kodbankda) nerden baksanız 10 tane CD-rom kapağını
açma kapatma kodu var kardeşim yaw... sanki bulunmayacak bir kod.. veya ne biliyim windowsu restart etme kodları.. baydı artık yani........
neyse, fazla sinirlenmeyeyim....
dediğim gibi, ne kadar ekmek, o kadar köfte.........
kalın sağlıcakla, umarım yardımcı olabiliyorumdur bilgim dahilinde..
saygılarımla_
neoturk_
xxnt03@lycos.co.uk