C# TC Kimlik No Kontrol Programı

C# TC Kimlik No Kontrol Programı

10 Ocak 2020 0 Yazar: Mustafa BÜKÜLMEZ
Toplam Görüntülenme : 19
Yaklaşık okuma süresi : 15 DK
C# ArgumentNullException – Nedenleri ve Kullanımı
C# ArgumentException - Nedenleri ve Kullanımı

Merhaba, C# TC Kimlik No Kontrol Programı dersim ile C# eğitim setime devam ediyorum. Bu dersi eklememe bir instagram sayfasında gördüğüm post neden oldu. Kontrol algoritmasını paylaşmışlardı ve bende hemen bunun dersini eklemeliyim diye düşündüm. (Zaten artık aklıma konu gelmez oldu. 😀 )

C# TC Kimlik No Kontrol Programı

Öncelikle TC Kimlik No nedir ona bakalım..

TC Kimlik No Nedir? TC Kimlik No Nasıl Hazırlanır?

TC Kimlik No, Nüfus ve Vatandaşlık İşleri Genel Müdürlüğü tarafından Türk Vatandaşlarına verilen 11 karakterli benzersiz bir sayıdır. Verilen bu sayı tabi öyle rastgele veya sıradan verilen bir numara değildir. Bir algoritma ile hazırlanır. En basit doğruluk kontrolü ilk 10 basamağın toplamının birler basamağı  11. karakteri vermelidir.

TC Kimlik No iki aşamalı bir işlem sonucu ortaya çıkmaktadır. Öncelikle ilk 9 basamağı belirlenir. Bir algoritma ile 10. basamağı ve başka bir algoritma ile de 11. basamağı bulunur. Yani 10. ve 11. basamaklar ilk 9 basamağın sağlamasıdır diyebiliriz. son iki hanenin matematiksel olarak tek sayı olması da mümkün değildir.

C# TC Kimlik No Algoritması

Öncelikle TC Kimlik No ‘nun doğru olup olmadığını kontrol eden algoritmayı vereyim.

  1. TC Kimlik No 11 karakter olmalıdır.
  2. Her hanesi bir rakam olmalıdır.
  3. İlk hane 0 (Sıfır) olamaz
  4. 1. 3. 5. 7. 9. basamaklarının toplamının 7 katından, 2. 4. 6. 8. basamaklarının toplamını çıkardığımızda elde ettiğimiz sonucun 10’a bölümünden kalan sayı (MOD 10), 10. basamaktaki sayı ile aynı olmalıdır.
  5. İlk 10 hanenin toplamından elde edilen sonucun 10’a bölümünden kalan sayı (MOD 10), 11. basamak ile aynı olmalıdır.

Gördüğünüz gibi bir TC Kimlik Numarasının doğru bir TC No olup olmadığını belirlemek için 5 koşulu sağlaması gerekiyor. Bu dersimizde bir yukarıdaki kontrolleri yapan bir class hazırlayıp kullanacağız.

İlgili İçerik  C# Asal Sayılar Nasıl Bulunur? - En Gereksiz Mülakat Sorusu

Kodları güzel bir şekilde anlatabilmek için önce parça parça vereceğim. En sonda tam hali ile vereceğim ve tabi Github Projemde de yer alan bir ders olacak.

Öncelikle bize lazım olan değişkenleri tanımlıyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace mustafabukulmez_com_dersler._000_Classlar
{
    public static class TCKimlikNoKontrol
    {
        public static string Kontrol(string TCno)
        {
            int Algoritma_Adim_Kontrol = 0, TekBasamaklarToplami = 0, CiftBasamaklarToplami = 0, TumBasamaklarToplami = 0, Basamak_10 = 0, Basamak_11 = 0;
  • Algoritma_Adim_Kontrol değişkeni, algoritma koşullarına sağlamasına göre değer alacak. Sonunda bu değişkenimiz 5 değeri almış ise tüm kontrolleri geçmiştir diyeceğiz.
  • TekBasamaklarToplami değişkeni, 1. 3. 5. 7. ve 9. yani tek basamakları toplayacağımız değişken olacak.
  • CiftBasamaklarToplami değişkeni, 2. 4. 6. 8. yani çift basamakları toplayacağımız değişken olacak.
  • TumBasamaklarToplami değişkeni, ilk 10 basamağı toplayacağımız değişken olacak.
  • Basamak_10 değişkeni, 10. basamaktaki sayıyı alacak.
  • Basamak_11 değişkeni, 11. basamaktaki sayıyı alacak.

NOT: Fazla değişken kullanmadan da işlerimizi halledebilirdik ancak çok karışık hale gelecektir. Daha anlaşılabilir olması için bazı yerleri bilerek uzattım.

1 – TC Kimlik No 11 karakter olmalıdır.

 
 if (TCno.Length == 11) Algoritma_Adim_Kontrol = 1;

İlk koşulumuz olan 11 karakter olup olmadığını kontrol ettik. Algoritma_Adim_Kontrol değişkeni 1 oldu.

2 – Her hanesi bir rakam olmalıdır.

foreach (char chr in TCno) 
{
    if (Char.IsNumber(chr)) 
        Algoritma_Adim_Kontrol = 2; 
}

Foreach döngüsü ile sıra sıra tüm karakterleri kontrol ediyoruz. Eğer rakam olmayan bir karakter varsa  Algoritma_Adim_Kontrol  değişkeni 1 kalacak ve sonuç başarısız olacak. Rakam olmayan bir karakter yok ise Algoritma_Adim_Kontrol değişkeni 2 olacak ve ikinci kontrolümüzde başarı ile tamamlanmış olacak.

3 – İlk hane 0 (Sıfır) olamaz

if (TCno.Substring(0, 1) != "0") 
    Algoritma_Adim_Kontrol = 3;

SubString metodu ile ilk karakteri kontrol ediyoruz. İlk karakter eğer 0 değil ise Algoritma_Adim_Kontrol  değişkeni 3 olacak.

 

4 – 1. 3. 5. 7. 9. basamaklarının toplamının 7 katından, 2. 4. 6. 8. basamaklarının toplamını çıkardığımızda elde ettiğimiz sonucun 10’a bölümünden kalan sayı (MOD 10), 10. basamaktaki sayı ile aynı olmalıdır.

Bu kısım en uzun bölümü olduğundan bu kısmı da parça parça atacağım.

İlk olarak TC Numarasındaki rakamlar bir ArrayList’e almamız gerekiyor.

            int[] arrTC = System.Text.RegularExpressions.Regex.Replace(TCno, "[^0-9]", "").Select(x => (int)Char.GetNumericValue(x)).ToArray();

Buradaki ikinci satır, bulabildiğim en kısa koddu. Kendi yazdığım kodlar uzundu ve o kadar uzun olmasını istemedim bu sebeple internetten araştırma yaparak buldum.

Regex Sınıfını kullanarak karakterlerin rakam olmasını kontrol ettik. LING kullanarak bir fonksiyon hazırladık ve TC No’daki karakterlerin Char türünden sayısal değerlerini elde ettik. ToArray() sınıfı ile elde ettiğimiz değerleri ArrayList’imize yükledik.

for (int i = 0; i < TCno.Length; i++)
            {
                TumBasamaklarToplami += Convert.ToInt32(arrTC[i]);
                if (((i + 1) % 2) == 0)
                {
                    if (i + 1 != 10) CiftBasamaklarToplami += Convert.ToInt32(arrTC[i]);
                    else Basamak_10 = Convert.ToInt32(arrTC[i]);
                }
                else
                {
                    if (i + 1 != 11) TekBasamaklarToplami += Convert.ToInt32(arrTC[i]);
                    else
                    {
                        Basamak_11 = Convert.ToInt32(arrTC[i]);
                        TumBasamaklarToplami = TumBasamaklarToplami - Basamak_11;
                    }
                }
            }

TC No karakter sayısı kadar dönecek bir döngü hazırladık. Burada elle 10 da yazabilirsiniz.

İlgili İçerik  C# FileNotFoundException – Nedenleri

İlk olarak, döngünün her dönüşünde, TumBasamaklarToplami değişkenine, hazırladığımız ArrayList’ten for döngüsünden gelen index numarası ile ilk karakterimizi alıp topluyoruz. Bu şekilde tüm basamakların toplamını alacağız.

İşlemde yanlışlık olmaması için (i, 0 ‘dan başladığından tek mi çift mi bulamayız) döngüden gelen index numarasından gelen sayıya +1 ekleyip modunu alarak, tek mi çift mi onu buluyoruz.

Eğer index yani i+1 çift sayı ise if bloğuna girecek; eğer i+1 = 10 değil ise (yani 10.basamağa gelmediysek) CiftBasamaklarToplami değişkenine ArrayList’ten gelen değeri ekleyeceğiz. Eğer 10. basamağa geldiysek ArrayList’ten gelen değeri Basamak_10 değişkenine atıyoruz. Burada bize  2. 4. 6. 8. basamaktaki rakamlar gerektiğinden dolayı böyle bir ayrım yaptık. 10. basamaktaki değeri ise kontrol için kullanacağımızdan ayrıca gereklidir. Elbette burada bir değişkene atamasını yapmak zorunda değildik. SubString metodu ile direk değeri alabilirdik.

Eğer index yani i +1 tek sayı ise else bloğuna girecek; eğer i+1 = 11 değil ise (yani 11. basamağa gelmediysek) TekBasamaklarToplami değişkenine ArrayList’ten gelen değeri ekleyeceğiz. Eğer 11. basamağa geldiysek ArrayList’ten gelen değeri Basamak_11 değişkenine atıyoruz.  Burada bize  1. 2. 5. 7. 9. basamaktaki rakamlar gerektiğinden dolayı böyle bir ayrım yaptık. 11. basamaktaki değeri ise kontrol için kullanacağımızdan ayrıca gereklidir. Elbette burada da bir değişkene atamasını yapmak zorunda değildik. SubString metodu ile direk değeri alabilirdik.

Eğer 11. basamağa geldiysek,  for döngsünde tüm değerler toplandığı için ve bize de ilk 10 basamağın toplamı gerektiğinden dolayı, 11. basamaktaki değeri TumBasamaklarToplami değişkeninden çıkarıyoruz.

int ilkDeger = (TekBasamaklarToplami * 7) - CiftBasamaklarToplami;
            int ilkDeger_mod10 = ilkDeger % 10;
            if (Basamak_10 == ilkDeger_mod10) Algoritma_Adim_Kontrol = 4;

Burada İşlemleri net olarak görebilmek için değişkenler ile işlem yaptık.

ilkDeger değişkenimize, TekBasamaklarToplami değişkenini 7 ile çarptık ve CiftBasamaklarToplami değişkenini çarpımdan çıkarıp atamasını yaptık. Daha sonra ilkDeger_mod10 değişkenimize, ilkDeger değişkeninin MOD 10’unu alarak atamasını yaptık. Son olarak eğer 10. basamaktaki sayı ile bulduğumuz sonuç eşit ise 4. koşul sağlanmış oldu.

5 – İlk 10 hanenin toplamından elde edilen sonucun 10’a bölümünden kalan sayı (MOD 10), 11. basamak ile aynı olmalıdır.

int ikinciDeger_mod10 = TumBasamaklarToplami % 10;
            if (Basamak_11 == ikinciDeger_mod10) Algoritma_Adim_Kontrol = 5;

Son koşul için ikinciDeger_mod10 değişkeni tanımladık ve TumBasamaklarToplami değişkeninin MOD 10’unu aldık. Eğer sonuç, 11. basamak ile eşit ise Algoritma_Adim_Kontrol değişkenimizi 5 olarak ayarlıyoruz.

İlgili İçerik  C# Fibonacci Dizisi Yapımı

Sonuç

if (Algoritma_Adim_Kontrol == 5)
return "TC No Doğru";
else
return "TC No Yanlış";

En son olarak Algoritma_Adim_Kontrol değişkeninn değeri 5 ise tüm koşullar sağlanmış demektir ve TC No Doğru şeklinde geri dönüş veriyoruz. Eğer 5 değil ise bir yada daha fazla koşul sağlanamamıştır demektir.

Aşağıdak Class’ın tam halini bulabilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace mustafabukulmez_com_dersler._000_Classlar
{
    public static class TCKimlikNoKontrol
    {
        public static string Kontrol(string TCno)
        {
            int Algoritma_Adim_Kontrol = 0, TekBasamaklarToplami = 0, CiftBasamaklarToplami = 0, TumBasamaklarToplami = 0, Basamak_10 = 0, Basamak_11 = 0;

            if (TCno.Length == 11) Algoritma_Adim_Kontrol = 1;

            foreach (char chr in TCno) { if (Char.IsNumber(chr)) Algoritma_Adim_Kontrol = 2;  }

            if (TCno.Substring(0, 1) != "0") Algoritma_Adim_Kontrol = 3;

            int[] arrTC = System.Text.RegularExpressions.Regex.Replace(TCno, "[^0-9]", "").Select(x => (int)Char.GetNumericValue(x)).ToArray();

            for (int i = 0; i < TCno.Length; i++)
            {
                TumBasamaklarToplami += Convert.ToInt32(arrTC[i]);
                if (((i + 1) % 2) == 0)
                {
                    if (i + 1 != 10) CiftBasamaklarToplami += Convert.ToInt32(arrTC[i]);
                    else Basamak_10 = Convert.ToInt32(arrTC[i]);
                }
                else
                {
                    if (i + 1 != 11) TekBasamaklarToplami += Convert.ToInt32(arrTC[i]);
                    else
                    {
                        Basamak_11 = Convert.ToInt32(arrTC[i]);
                        TumBasamaklarToplami = TumBasamaklarToplami - Basamak_11;
                    }
                }
            }

            int ilkDeger = (TekBasamaklarToplami * 7) - CiftBasamaklarToplami;
            int ilkDeger_mod10 = ilkDeger % 10;
            if (Basamak_10 == ilkDeger_mod10) Algoritma_Adim_Kontrol = 4;

            int ikinciDeger_mod10 = TumBasamaklarToplami % 10;
            if (Basamak_11 == ikinciDeger_mod10) Algoritma_Adim_Kontrol = 5;

            if (Algoritma_Adim_Kontrol == 5)
                return "TC No Doğru";
            else
                return "TC No Yanlış";
        }
    }
}

Yazımı bitirmeden önce, Github projesinden bu class’a ulaştığınızda karışık olup olmamasına bakılmadan olabildiğince kısa halini de bulacaksınız. Kodlar yukarıdaki hali 9 int değişkeni ile 43 satırdır. Kısaltılmış hali ise 3 int değişkeni ile 26 satırdır.  Yani 6 tane değişkeni sildik.


C# TC Kimlik No Kontrol Programı dersimiz de bu kadardı arkadaşlar.

C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.

Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz…

Sağlıcakla ve takipte kalın. 😉

C# ArgumentNullException – Nedenleri ve Kullanımı
C# ArgumentException - Nedenleri ve Kullanımı