JavaScript | Day 3 #30DaysOfJavaScript

#3rdDayOf30DaysJavaScript

Bir JavaScript dizisi,içerisinde aynı anda farklı veri tipine sahip değişkenleri içerebilir.

var myArray = ["Rumeysa", 21];

Bir JavaScript dizisi, dizi elamanı olarak içerisinde farklı diziler içerebilir. Bunlara çok boyutlu dizeler denir. (bkz. matrisler) (multi-dimensional array) İç içe geçmiş dizeler (nested array) şu şekilde oluşturulur:

var myArray = [["Rumeysa","Aydogdu",21],["JavaScript", "HTML", "CSS", 2020]];

var arr = [
  [1,2,3],
  [4,5,6],
  [7,8,9],
  [[10,11,12], 13, 14]
];
arr[3]; // equals [[10,11,12], 13, 14]
arr[3][0]; // equals [10,11,12]
arr[3][0][1]; // equals 11

C# – Algorithm Examples | 2

Detaylar

  • Kullanıcı tarafından belirlenen dersler ve haftalık saatlerine göre yine kullanıcı tarafından girilen öğrencinin ders notlarından ağırlıklı ortalamanın bulunması ve öğrencinin teşekkür, takdir belgesi alıp almadığının tespit edilmesi.

Kodumuz

  • Öncelikle Main metodunu açıklayalım. Main metodu burada 35. satırda başlıyor ve programımız çalışmaya başladığında ilk olarak çalışacak metoddur. Diğer motodlar, Main içerisinde çağrılır.
  • Koşul sağlandığı sürece (yani bu örnekte kullanıcının devam edip etmeme isteğine göre) bu işlemin yapılmasını istediğimiz için kodlarımızı do-while döngüsü içerisine yazıyoruz. while() parantezindeki kodun, koşulu sağlayıp sağlamamasına göre do içerisindeki kod tekrar çalışıp çalışmayabilir.
  • İsteyeceğimiz not ve ders saatleri de yine kullanıcıya bağlıdır. Kulanıcının gireceği değerlere göre değişiklik göstereceğinden öndelikle for döngüsü dışında kaç adet ders bilgilerinin girileceğini öğrenmek amacıyla ders sayısı kullanıcıdan alınır.
  • Alınan ders sayısı adedince yeni ders bilgileri girileceğinden ve biz bunu bilmediğimizden dolayı i değerli bir integer dizisi oluşturulur.
  • Burada i, her bir dersi temsil eder. Örneğin, 3 adet ders bilgisi girlecekse, dizi indexi 0 dan başladığı için i = 2 dir.
  • Oluşturulan bu dizi 2 boyutludur bunun sebebi ise her bir ders için yani her bir ders[i,] için, ilgili dersin dersin saat ve not bilgisi tutulur. ders[i,0] da, dersin saat bilgisi tutulurken, ders[i,1] de, dersin not bilgisi tutulmaktadır.
  • Girilen ders sayısında saat ve not bilgisi sırayla dizilere depolandıktan sonra buradaki not ve saat bilgisi ortHesapla isimli bizim yazdığımız fonksiyona gönderilir. (7. satırda)
  • ortHesapla fonsiyonunun parametresi int[,] dersler dir. Ayrıca değerler sonucunda bir ortalama hesaplayıp bunu döndüreceği için void değildir. double değer döndürür, return kullanılır.
  • ortHesapla içerisinde yine for döngüsü kullanılarak her i için (yani her ders için) olan saat ve not bilgileri toplanır. Sonuçta toplam bir saat değeri ve not değeri olmuş olur.
  • Buradaki for döngüsü dersler isimli integer dizinin ilk elamanının uzunluğu kadar yani i nin uzunluğu kadar döner.
  • Normalde uzunluğa erişmek için .Length kullanılırken dizilerin herhnagi bir elemanı sayısınca uzunluğa ulaşmak için .GetLength() kullanılır. GetLength parametre alır. Örneğin, burada dizi i (yani ders adedi) uzunluğunda dönmesi için int[i,] ders dizisini ilk elemanı olan i nin index i kullanılır. Bu da 0 dır. Bu nedenle bu programda .GetLength(0) şeklinde kullanılmıştır.
  • Not/saat return ile döndürülerek bir ortalama oluşturmuş olur.
  • Main içerisinde ortHesapla() fonksiyonu çağrılarak onun döndürdüğü değer ort değişkenine atanır.
  • Bir alt satırda ise bu ort değişkenini parametre olarak alan bir belgeYazdir() fonksiyonu çağrılmıştır.
  • belgeYazdir fonksiyonu (19. satırda) içerisinde Console.WriteLine() ile ekrana yazı yazdırır. Bu nedenle değer döndürmez, void dir. İçerisindeki if ve else ler ile, hesaplanan ortalam değerinin hangi belgeye eşdeğer olduğunu bulur ve bunu Main metodunda çağırıldığı zaman ekrana yazdırır.
  • Devam etmek istendiğinde aynı işlemler devam eder.

Kodun Çıktısı

Devam etmek istendiğinde bu şekilde devam ediyor.

Kaynak Kodu (Source Code)

using System;

namespace DenemeBirKi
{
    class Program
    {
        static double ortHesapla(int[,] dersler)
        {
            double toplamSaat=0, toplamNot=0;
            for(int i=0; i<dersler.GetLength(0); i++)
            {
                toplamSaat += dersler[i, 0];
                toplamNot += dersler[i, 0] * dersler[i, 1];
            }

            return toplamNot / toplamSaat;
        }

        static void belgeYazdir(double ort)
        {
            if(ort >= 85)
            {
                Console.WriteLine("{0} ortlamanız ile Taktir Belgesi aldınız.", ort);
            }
            else if(ort >= 75)
            {
                Console.WriteLine("{0} ortlamanız ile Teşekkür Belgesi aldınız.", ort);
            }
            else
            {
                Console.WriteLine("{0} ortlamanız belge almaya yetmedi.", ort);
            }

        }
        static void Main(string[] args)
        {
            int dersSayisi;
            char devam;
            double ort;

            do
            {
                Console.Write("Ders sayısı:");
                dersSayisi = Convert.ToInt32(Console.ReadLine());

                int[,] ders =  new int[dersSayisi, 2];

                for(int i = 0; i < dersSayisi; i++)
                {
                    Console.Write("{0}. dersin haftalık saati:", i + 1);
                    ders[i, 0] = Convert.ToInt32(Console.ReadLine());

                    Console.Write("{0}. dersin puanı:", i + 1);
                    ders[i, 1] = Convert.ToInt32(Console.ReadLine());
                }

                ort = ortHesapla(ders);
                belgeYazdir(ort);

                Console.Write("Devam etmek istiyor musunuz? (e/h)");
                devam = Convert.ToChar(Console.ReadLine());

            } while (devam == 'e' || devam == 'E');

        }
    }
}

Kaynaklar

  • Örneklerle Algoritma ve C# Programlama – Erhan Arı

C# – Challenges | Longest Word

Merhaba, bugün bahsedeceğim örnek kod, konularına tam anlamıyla hakim olduğum bir kod değil fakat bazı araştırmalar ve okumalar yaparak belli bir yere kadar ilerleme kaydettim ve bu kodu yazabildim. Bir sıkıntımız daha var ki, bu kodu yazmayı ve araştırmalarımı 8 Aralık 2019 Pazar günü tamamlamama rağmen yazısını bugün yani 26 Ocak 2020 Pazar günü yazabiliyorum. Açıkçası kodun ayrıntılarını maalesef unutmuşum. Şimdi sizlere anladığım ve hatırladığım kadarını aktarmaya çalışacağım.

Challenge Türü: Easy

Detaylar

Kodumuz

  • 2. satırda System.Linq kütüphanesi kullanılmalı. Kullanılmazsa 13. satırdaki, dizi elemanlarının büyükten küçüğe doğru sıralanması için kullandığımız OrderByDescending kodu çalışmaz. LINQ sorgusu hafızadaki (veya bir veri kaynağındaki) veri kümesinden program içinde SQL gibi sorgulama yaparak, seçilen verilerden oluşan yeni bir liste elde etmemizi sağlar. Linq hakkında daha fazla detay için bakabilirdiniz -> http://yazilim.cevapsitesi.com/Makaleler/5/linq-language-integrated-query-dile-entegre-edilmis-sorgu-nedir
  • 9. satırda kullandığım ayrac dizisini, yani bölmek istediğim cümledeki sözcükleri birbirinden ayıracak olan sembolleri ve boşluklarları tek tek kendim yazmak durumundayım. Buna maalesef alternatif bir çözüm bulamadım. Sıkıntı şu ki, benim orada tüm karakterleri yazmam mümküd değil ve benim yazmadığım bir sembol ile karşılaşılırsa kelimeleri ayrıması mümkün olmayacak. Örneğin kod ekrandan merhaba%okuyucu şeklinde bir girdi alsın. Bu yadığım kodda % sembolü bir ayraç olarak ifade edilmediği için buradaki merhaba ve okuyucu kelimeleri seçilemeyecek. Bunun yerine merhaba%okuyucu yu tek bir kelime olarak alacak. Bu satırdaki kod hatalı değil fakat eksiktir.
  • 10. satırda bir önceki yazımda da bahsettiğim .Split ifadesi yer alıyor. .Split() ifadesinde parantez içine yazdığımız şeyler bizim ayraçlarımız/bölücülerimiz oluyor. Kodumuz parantez içinde ne varsa, istenileni o ifadeyi gördüğü zamanlarda bölerek bir dizi haline getiriyor.
  • 13. satırda OrderByDescerding kodu sayesinde dizimizin elemanlarını büyükten küçüğe sıralayabiliyoruz. (Bu arada büyükten küçüğe, uzundan kısaya için Descending; küçükten büyüğe, kısadan uzuna için Ascending kullanılır.)

Kodun Çıktısı

Hatalar

  • Hatalı kodda 10. satır, ana kodda 13. satırda olan First() ifadesinin neden yazıldığına tam olarak hakim değilim fakat ortadan kaldırdığımızda aşağıdaki gibi bir hata veriyor. Anladığım kadarıyla En büyükten en küçüğe(en uzundan en kısaya) doğru sıraladığımız sözcük dizimizde tek bir elemanı seçip döndürmemiz geremiyor, bu da en uzun sözcük olan dizinin ilk eleman olduğu için First() ifadesi kullanılıyor. (asaba Last() gibi (dizinin son elemanı) ifadeler de var mı, kullanılıyor mu?)
hatalı kodun çıktısı böyle

C# – .Split fonksiyonu kullanımı

string.Split yöntemi, veri tabanında belirli işaretlere göre tek bir alanda tutmak istediğimiz kayıtları, bir veya daha fazla sınırlayıcı temelinde bölerek bir alt dizeler dizisi oluşturur. Genellikle bir dizeyi sözcük sınırlarında ayırmanın en kolay yoluymuş. Ayrıca, diğer belirli karakter veya dizelerde dizeleri ayırmak için de kullanılıyormuş

Split metodunun temel çalışma şekli şöyledir. Bir dizgeyi (karakter dizisi) belirli bir ayraç ile parçalayıp, parçalardan bir dizi döndürür.

Kullanım 1: C# string nesneleri ile kullanılır.  Aşırı yüklenmiş bir metottur fakat en sık kullanım şekli ayırıcı olarak bir karakter(char) girilmesi ile yapılır.

Kullanım 1.1
Kullanım 1.2
Kullanım 1 Çıktısı

Kullanım 2: C# split metodunun aşırı yüklenmiş bir metot olduğunu yazmıştım. Karakterlerden oluşan bir dizi ile birden fazla karakter ile de parçalamak mümkündür.

Örnek: 2019/12/07 18:06 şeklindeki tarihi parçalara ayırma

Kullanım 2
Kullanım 2 Çıktısı

Hatalar

  • Saati 18.06 şeklinde yazdığım ve ayrac dizisine . (nokta) elemanını eklemediğim için kodu yazdıramadım. Hata verdi. Aslında kod yazmayı bitirip derlendiğinde bir hata görünüyor fakat çalıştırmak istediğimizde özel bir hata oluşuyor. Syntax hatası olmamamsı kodun doğru olduğunu göstermez. Bu özel hata ile ilgili daha fazla detay isterseniz şu linkteki yazıyı inceleyebilirsiniz: https://docs.microsoft.com/tr-tr/dotnet/api/system.indexoutofrangeexception?view=netframework-4.8

Bu yazıyı yazarken yararlandığım kaynaklar: