Forum: Ders Arası RSS
İlk programcığım (hesap makinesi)
hkntrt #1
Üye Nis 2012 tarihinden beri · 18 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: İlk programcığım (hesap makinesi)
Aslında daha az yeteneği olan birşey tasarlamıştım sonradan ne kadar öğrenmişim kendimi test edeyim diye kullanıcı isteği doğrultusunda tekrardan çalışabilmesi gibi özellikler ekledim bir ara iyice karıştı if'ler hangisi nerede başlıyor nerede bitiyor iyi ki scite yol gösteriyor :)

import std.stdio;
 
void main()
{
    int x;
    int y;
    int t;
    char z;
    int a = 1 ;
    
    while (a < 2 ) {
    
        writeln("1 = Toplama" );
        writeln("2 = Çıkarma" );
        writeln("3 = Çarpma" );
        writeln("4 = Bölme" );
        writeln("5 = Çık" );
        write("Yapmak istediğiniz işlemin numarasını giriniz : ");
        readf(" %s" , &t);
        
        if ( t == 5 ) {
            break ;
        }
        else if (t > 5) {
            writeln("Tanlımlı numaralar dışında giriş yaptınız.Tekrar denemek ister misiniz ?  (e / h)");
            readf(" %s" , &z);
            if (z == 'e') {
            continue;
            }
            else {
                break;
            }
        }
    
        if (t > 0 || t <= 4) {
    
            write("Işlem yapmak için ilk sayıyı giriniz : ");
            readf(" %s" , &x);
    
            write("Işlem yapmak için ikinci sayıyı giriniz : ");
            readf(" %s" , &y);
    
            if ( t == 1 ) {
                writeln( x , " + " , y , " = " , x+y );
            }
            else if (t == 2 ) {
                writeln( x , " - " , y , " = " , x-y );
            }
            else if ( t == 3 ) {
                writeln( x , " * " , y , " = " , x*y );
            }
            else if ( t == 4) {
                writeln( x , " / " , y , " = " , x/y );
            }
        } 
        writeln("Başka işlem yapmak isityor musunuz ? (e / h)");
        readf(" %s" , &z);
        if ( z == 'e') {
            continue ;
        } else {
        break;
        }
    }
}
Bu mesaj hkntrt tarafından değiştirildi; zaman: 2012-04-22, 10:38.
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Neden sadece tek harften oluşan değişken isimleri kullanıyorsun? Belki bu geçici ve sık kullanılan sayılar için daha iyidir ama bir çok değişkeni daha çok harften oluşan sözcükler, üstelik Türkçe harfleri olanlar ile birlikte yazabilirsin. Bu şekilde kullanım, kendi başına daha çok açıklayıcı olacağı için her yere bilgi satırı (// ...) koyman gerekmez. Örneğin: girilenSeçim

Bu arada a değişkeni gördüğüm kadarıyla döngü dışında hiç bir yerde kullanmamışsın. Bunun yerine sadece while(true) yazabilirsin çünkü bu şekilde sonsuz döngü yapmanın bir sakıncası yok. Program içinde döngüden çıkma ve dolayısıyla sonlanma var. Ayrıca değişkenler başlangıçta ilklendiği için eğer eşitlediğin değeri kullanmıyorsan tanımlaman yeterli. Zaten dediğim gibi değişkene ihtiyaç yok gibi görünüyor ya, neyse...:)

Son olarak if()'leri çok daha az kullanabileceğini düşünüyorum ama şunu if (t > 0 || t <= 4) özellikle daha basitleştirip başka bir mantık işleçini (operator) öğrenme fırsatın olabilir. Çünkü yukarısında 5 ve 5'den yukarısını sorguluyorsun. Öyleyse sadece 0'a eşit değilse demek yeterli olacak yani şöyle:
if (t)
Bir anda ne kadar basitleşti öyle değil mi...:)

Dip Not: Sanırım artık switch() case'e geçme zamanın gelmiş, özellikle seçilen işleme göre yönlenen satırlarda...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
hkntrt #3
Üye Nis 2012 tarihinden beri · 18 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Program zaten kısa ve az değişkeni olduğu için tek harf yeterli oluyor sanki :) Aslında o while meselesini düşünmedim değil ama bu seferlik böyle olsun biraz bilgisizlikten biraz tembellikten galiba fazla düşünmüyorum yazarken , ama alışkanlık olmaması açısından biraz daha özensem iyi olacak , Teşekkür ederim :)
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
Her ne kadar şu satırları sadeleştirmek mümkün olsa da içerdiği break ve continue deyimlerini öğrenmen için kesinlikle fazlalık değiller ama aynı işlemi fazladan tekrar etmek yerine işlev (function) oluşturmayı denemelisin:
: : :
"... ister misiniz ?  (e / h)");
            readf(" %s" , &z);
            if (z == 'e') {
            continue;
            }
            else {
                break;
            }
Farkettiysen yukarısı döngünün sonunda da tekrar ediyor. Bu tür durumlarda işlev oluşturmak gerekir. Eminim Ali hocam bunu yazacaktı ve benim ona yazacak bir şeyler bırakmalıydım. Ama sanırım ekleyecek çok bildiği olduğu için ben ne kadar yazsam da nafile...:)

Mesela şu GOTO olayları var galiba? Ben hiç kullanmıyorum ama işe yarar olduğu kesin. Eski BASIC gibi basit dillerde olan bu özelliğin böyle gelişmiş bir dilde olması şaşırtıcı değil mi? Belki işlev yerine yukarıda bahsettiğimi bu şekilde yapabilirsin. Değil mi Ali hocam?

Bir de ana işlevimiz olan main() işlevi içinde de işlev meydana getirebiliyorsun. C'de gerektiği gibi öncesinde oluşturman veya tanımlayıp sonrasında oluşturman gerekmiyor. Ali hocam daha iyi açıklayacaktır; D aşağıdan itibaren kodlara adres tanımladığı için istediğin yerde işlev oluşturabiliyorsun.

Yine Ali hocam daha iyi bilecektir; işlev içinde meydana getirilen işlevlerde (sanırım) bir öncelik söz konusu. Yani yukarıda yazdığım gibi aşağı/yukarı mevzusunda bir hassasiyet var. Bir kere başıma gelmişti ama unutmuşum...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
hkntrt #5
Üye Nis 2012 tarihinden beri · 18 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Daha öğreneceğimiz çok şey var :) Fonksiyon olayını öğrensem işime çok yarayacak ama kitabın sırasını da bozmak istemiyorum :)
Kadir Can #6
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu tarz seçimli işlemler için enum, final switch yapısı çok avantajlı oluyor.Bu ilk programınız, kodlarınız gayet iyi ama bundan sonraki programlarda dikkate almanızı tavsiye ederim.
@Salih;
goto kullanımı çok tavsiye edilen bir şey değil.Nedeni de dallanmaların belirli bir zaman sonra kodu spagetti haline getirmesi. break continue kullanmaya çalışmak en azından daha sistemli gibi görünüyor.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
hkntrt, öncelikle program çok güzel olmuş. Özellikle yeni olduğun için aslında söylenecek hiçbir şey yok ama hep daha iyisini soruşturuyoruz.

goto programın işleyişini kopuk noktalara atlattığı için önerilmez. Buna rağmen, C'de kaynak yönetimi için bilinen en iyi yöntemdir. Öte yandan, nesnelerin kurulma satırlarını atlayabildiği için C++'ta hatalara neden olur; aynı nedenden D'de bu tür hatalara izin verilmez.

Bütün bu uyarılara rağmen, D, C ve C++'taki bir sıkıntıyı döngü etiketleri ve switch etiketleri ile giderir. Üstelik goto'yu bir de case'ten case'e atlamak için kullanmaya başladılar. O da C ve C++'ın case'lerle ilgili hatalarını giderir ama bir yandan da goto'yu daha bir bir yasallaştırır. :)

Hatırlatmak için:

  http://ddili.org/ders/d/etiketler.html

Bütün bunların yanında, break ve continue'yu da ne yazık ki goto'nun zararlı kabul edilen kullanımlarıyla aynı kefeye koymanızı öneririm çünkü break ve continue'da program işleyişini kopuk noktalara götürür.

Çoğu durumda break yerine anlamlı bool değişkenler tanımlanabilir. while(birDurum) gibi kullanılır ve birDurum döngü içinde false yapıldığında break gibi olur.

continue için de döngünün en sonunda bir if denetimi kullanılabilir. if(birDurum)'a girilmemişse döngü zaten continue gibi devam eder.

Buna rağmen break ve continue'yu kullanıyoruz ama bazı programcıların olabildiğince azaltmaya çalıştıklarını söylemek istedim. :)

Ali
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Parmaklarına sağlık Ali hocam...

Özetle nesne yönelimli programlama (OOP)'da;
  • break
  • continue
  • goto

Belki bu listenin en başına asm{..} kümesini de eklemeliyiz? Gönlüm sık sık assembly komutları ile pratik çözümleri kullanmayı arzulasa da işletim sistemi farklılıklarından dolayı ve henüz o kapasiteye erişemediğim için satır arası assembly kullanmayı erteliyorum...:)

Hocam peki bizim gibi yeni yetişmekte olan programcılara bol bol ne kullanmayı önerirsiniz?

Örneğin try{..} catch{..} kümelerini mi?

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
hkntrt #9
Üye Nis 2012 tarihinden beri · 18 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
@acehreli böyle bir kitap ve böyle bir ortam oluşturduğunuz için teşekkürü bir borç bilirim.Dersler çok güzel hazırlanmış belki de ingilizceden sonra D Dili'nin en iyi anlatıldığı dil türkçedir. Derslere ve foruma emeği geçen herkese teşekkür ederim :)
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #8
Salih Dinçer:
Gönlüm sık sık assembly komutları ile pratik çözümleri kullanmayı arzulasa da işletim sistemi farklılıklarından dolayı ve henüz o kapasiteye erişemediğim için satır arası assembly kullanmayı erteliyorum...:)

Hiç olmazsa D assembly komutlarını standartlaştırmıştır. C ve C++'ta derleyiciye bağlıdır.

Hocam peki bizim gibi yeni yetişmekte olan programcılara bol bol ne kullanmayı önerirsiniz?

Öyle sorunca aklıma gelmiyor. Herhalde "yapmayın" gibi ilkeler "yapın" gibi ilkelerden daha fazla. :)


Örneğin try{..} catch{..} kümelerini mi?

try-catch'i hiç öyle genelleyemeyiz. Zaten fazla kullanılsa yarardan çok dert getirir. Şu bölümde şöyle demişim:

  http://ddili.org/ders/d/hatalar.html

"try-catch deyimini ancak ve ancak atılan bir hata ile ilgili özel işlemler yapmanız gereken veya yapabildiğiniz durumlarda kullanın. Başka durumlarda hatalara karışmayın. Hataları, onları yakalamaya çalışan işlevlere bırakın."

Ali
acehreli (Moderatör) #11
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #9
hkntrt:
belki de ingilizceden sonra D Dili'nin en iyi anlatıldığı dil türkçedir.


Teşekkürler hkntrt. Programcılığa yeni başlayanlara yönelik olarak ilk D kitabı Türkçe ama genel olarak Japonlar'ın D'ye katkıları ve ilgileri çok fazla. TDPL'in çevrildiği ilk dil de Rusça oldu.

Derslere ve foruma emeği geçen herkese teşekkür ederim :)

En önemlisi o: forumdaki arkadaşlar olmasa hiçbir şey olmaz.

Ali
zafer #12
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
TDPL'in çevrildiği ilk dil de Rusça oldu.

Şu TDPL'nin Türkçeye çevrilmesi için yapılabilecek bir şeyler olmalı diye düşünüyorum. Ne yapsak acaba?
https://github.com/zafer06 - depo
acehreli (Moderatör) #13
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zafer:
Şu TDPL'nin Türkçeye çevrilmesi için yapılabilecek bir şeyler olmalı diye düşünüyorum. Ne yapsak acaba?

Addison Wesley'den son duyduğuma göre bu talep Türkiye'deki yayınevlerinden gelirmiş. Yani önce Türkiye isteyecekmiş ondan sonra çeviriye izin verilirmiş.

Ali
Avatar
Salih Dinçer #14
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sizce neden böyle?

import std.stdio;
 
void main()
{
    char oku;
    bool yaz = true;
 
    do {
        if (yaz) {
            write("=:");
            yaz = false;
        }
        readf("%s", &oku);
        yaz = true;
    } while (yaz);
}/* ÇIKTISI:
=:deneme
=:=:=:=:=:=:=:de
=:=:=:
*/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #15
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Neyse yazmadım farz edin; readln() çalışmasını kavramadığımı fark ettim. Şimdi tamam...:)
    while (yaz) {
       write("=: ");
       do readf("%s", &oku); while (oku!=10);
    }
Çıktısı:
salih@salih-NB:~/d.ders$ d.sh hesapMakinesi
=: fsdkfldsf
=: dsflksdşfs
=: dskflsdk
=: dsflkşisdf
=: fsdklf
=: sdfsdklo
=: ^C
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 00:22:11 (UTC -08:00)