• 05-03-2020, 10:07:21
    #1
    Merhaba yapmak istediğim şey elimdeki sayi kümesinin tekrarına göre sonraki sayının %sini hesaplamak.Yani dizide 1,1,5,4 arka arkaya 3 defa tekrar ettiyse kullanıcı konsola 1,1,5 girdiğinde 3 kez 4 geldi gibi bir şey yapmaya çalışıyorum.
     class Program
    {
    
    
    
    static void Main(string[] args)
    {
    int[] sayilar = { 5, 2, 2, 5, 1, 2, 1, 1, 2, 1, 1, 5, 10, 2,
    5, 1, 2, 1, 10, 10, 2, 2, 1, 10, 1, 5, 1, 10, 1, 2, 1, 1,
    5, 1, 1, 1, 40, 1, 1, 5, 40, 2, 20, 1, 5, 2, 10, 10, 2, 1, 1, 5, 2, 1, 2,
    10, 40, 2, 1, 10, 20 };
    string[] result = sayilar.Select(x => x.ToString()).ToArray();
    int uzunluk = result.Length;
    ArrayList liste = new ArrayList();
    for (int i = 0; i < uzunluk; i++)
    {
    liste.Add(result[i].Split(','));
    
    
    }
    
    
    String sayi1,sayi2,sayi3;
    int i1, i2, i3,sayac1=0,sayac2=0;
    sayi1 = Console.ReadLine();
    sayi2 = Console.ReadLine();
    sayi3 = Console.ReadLine();
    
    if(liste.Contains(sayi1) && liste.Contains(sayi2) && liste.Contains(sayi3))
    {
    i1= liste.IndexOf(sayi1);
    i2= liste.IndexOf(sayi2);
    i3= liste.IndexOf(sayi3);
    
    if (i1 + 1 == i2)
    {
    sayac1++;
    
    
    Console.WriteLine("Gelme durumu ikiliye göre", sayac1);
    Console.WriteLine("Sonraki sayi", liste.IndexOf(i2 + 1));
    Console.ReadLine();
    
    }
    else
    {
    sayac2++;
    Console.WriteLine("Gelmeme durumu ikiliye göre ",sayac2);
    Console.ReadLine();
    }
    
    
    
    }
    
    
    
    
    }
        }
    Sayiyi önce stringe çevirip arrayliste aldım.Sonrasında kullanıcının girdiği sayının indexini buldum.Index değerini 1 artırıp sonraki sayiyi aldım fakat programı çalıştırdığımda konsola hiç bir şey basmıyor.



    Tahminimce sıkıntı indexOf da çünkü tek değer döndürüyor listede birden fazla olduğunda sapıtıyor olabilir fakat indexOf un bir array fonksiyonunu bulamadım.
  • 05-03-2020, 12:15:24
    #2
    Yanlış anlamadıysam aşağıdaki gibi bir kod işinizi görür. Sizin kodun çıktı vermeme sebebi split sonucu olarak ArrayList'e eklemeniz. Split string[] dönüyor, siz Contains kısmında string arıyorsunuz haliyle if içine hiç girmiyor.
    Kodun çıktısı: https://prnt.sc/rbw47m

    class Program
    {
    static void Main(string[] args)
    {
    int[] sayilar = { 5, 2, 2, 5, 1, 2, 1, 1, 2, 1, 1, 5, 10, 2,
    5, 1, 2, 1, 10, 10, 2, 2, 1, 10, 1, 5, 1, 10, 1, 2, 1, 1,
    5, 1, 1, 1, 40, 1, 1, 5, 40, 2, 20, 1, 5, 2, 10, 10, 2, 1, 1, 5, 10, 1, 2,
    10, 40, 2, 1, 10, 20 };
    
    int sayi1, sayi2, sayi3;
    int sayac1 = 0;
    
    sayi1 = Convert.ToInt32(Console.ReadLine());
    sayi2 = Convert.ToInt32(Console.ReadLine());
    sayi3 = Convert.ToInt32(Console.ReadLine());
    
    int[] pattern = { sayi1, sayi2, sayi3 };
    
    List<Result> results = new List<Result>();
    if (sayilar.Contains(sayi1) && sayilar.Contains(sayi2) && sayilar.Contains(sayi3))
    {
    int index = 0;
    do
    {
    index = SearchPattern<int>(sayilar, pattern, index);
    sayac1++;
    if (index > 0)
    {
    var result = results.FirstOrDefault(x => x.Value == sayilar[index]);
    if (result != null)
    result.Count++;
    else
    results.Add(new Result(sayilar[index]));
    }
    } while (index != -1);
    
    foreach (var result in results)
    {
    Console.WriteLine($"{result.Count} kez {result.Value} geldi");
    }
    
    }
    Console.ReadKey();
    }
    
    public static int SearchPattern<T>(T[] source, T[] pattern, int startIndex = 0) 
    {
    for (int i = startIndex; i < source.Length - pattern.Length; i++)
    {
    for (int j = 0; j < pattern.Length; j++)
    {
    if (!EqualityComparer<T>.Default.Equals(pattern[j], source[i + j]))
    {
    goto jmp;
    }
    }
    return i + pattern.Length;
    jmp:;
    }
    return -1;
    }
    class Result
    {
    public int Value;
    public int Count;
    public Result(int value)
    {
    Value = value;
    Count = 1;
    }
    }
    }
  • 05-03-2020, 17:38:15
    #3
    pr1d3 adlı üyeden alıntı: mesajı görüntüle
    Yanlış anlamadıysam aşağıdaki gibi bir kod işinizi görür. Sizin kodun çıktı vermeme sebebi split sonucu olarak ArrayList'e eklemeniz. Split string[] dönüyor, siz Contains kısmında string arıyorsunuz haliyle if içine hiç girmiyor.
    Kodun çıktısı: https://prnt.sc/rbw47m

    class Program
    {
    static void Main(string[] args)
    {
    int[] sayilar = { 5, 2, 2, 5, 1, 2, 1, 1, 2, 1, 1, 5, 10, 2,
    5, 1, 2, 1, 10, 10, 2, 2, 1, 10, 1, 5, 1, 10, 1, 2, 1, 1,
    5, 1, 1, 1, 40, 1, 1, 5, 40, 2, 20, 1, 5, 2, 10, 10, 2, 1, 1, 5, 10, 1, 2,
    10, 40, 2, 1, 10, 20 };
    
    int sayi1, sayi2, sayi3;
    int sayac1 = 0;
    
    sayi1 = Convert.ToInt32(Console.ReadLine());
    sayi2 = Convert.ToInt32(Console.ReadLine());
    sayi3 = Convert.ToInt32(Console.ReadLine());
    
    int[] pattern = { sayi1, sayi2, sayi3 };
    
    List<Result> results = new List<Result>();
    if (sayilar.Contains(sayi1) && sayilar.Contains(sayi2) && sayilar.Contains(sayi3))
    {
    int index = 0;
    do
    {
    index = SearchPattern<int>(sayilar, pattern, index);
    sayac1++;
    if (index > 0)
    {
    var result = results.FirstOrDefault(x => x.Value == sayilar[index]);
    if (result != null)
    result.Count++;
    else
    results.Add(new Result(sayilar[index]));
    }
    } while (index != -1);
    
    foreach (var result in results)
    {
    Console.WriteLine($"{result.Count} kez {result.Value} geldi");
    }
    
    }
    Console.ReadKey();
    }
    
    public static int SearchPattern<T>(T[] source, T[] pattern, int startIndex = 0)
    {
    for (int i = startIndex; i < source.Length - pattern.Length; i++)
    {
    for (int j = 0; j < pattern.Length; j++)
    {
    if (!EqualityComparer<T>.Default.Equals(pattern[j], source[i + j]))
    {
    goto jmp;
    }
    }
    return i + pattern.Length;
    jmp:;
    }
    return -1;
    }
    class Result
    {
    public int Value;
    public int Count;
    public Result(int value)
    {
    Value = value;
    Count = 1;
    }
    }
    }
    kodu henüz inceleyemedim ama output tam istediğimi veriyor çok teşekkür ederim hocam adamsın.



    pr1d3 adlı üyeden alıntı: mesajı görüntüle
    Yanlış anlamadıysam aşağıdaki gibi bir kod işinizi görür. Sizin kodun çıktı vermeme sebebi split sonucu olarak ArrayList'e eklemeniz. Split string[] dönüyor, siz Contains kısmında string arıyorsunuz haliyle if içine hiç girmiyor.
    Kodun çıktısı: https://prnt.sc/rbw47m

    class Program
    {
    static void Main(string[] args)
    {
    int[] sayilar = { 5, 2, 2, 5, 1, 2, 1, 1, 2, 1, 1, 5, 10, 2,
    5, 1, 2, 1, 10, 10, 2, 2, 1, 10, 1, 5, 1, 10, 1, 2, 1, 1,
    5, 1, 1, 1, 40, 1, 1, 5, 40, 2, 20, 1, 5, 2, 10, 10, 2, 1, 1, 5, 10, 1, 2,
    10, 40, 2, 1, 10, 20 };
    
    int sayi1, sayi2, sayi3;
    int sayac1 = 0;
    
    sayi1 = Convert.ToInt32(Console.ReadLine());
    sayi2 = Convert.ToInt32(Console.ReadLine());
    sayi3 = Convert.ToInt32(Console.ReadLine());
    
    int[] pattern = { sayi1, sayi2, sayi3 };
    
    List<Result> results = new List<Result>();
    if (sayilar.Contains(sayi1) && sayilar.Contains(sayi2) && sayilar.Contains(sayi3))
    {
    int index = 0;
    do
    {
    index = SearchPattern<int>(sayilar, pattern, index);
    sayac1++;
    if (index > 0)
    {
    var result = results.FirstOrDefault(x => x.Value == sayilar[index]);
    if (result != null)
    result.Count++;
    else
    results.Add(new Result(sayilar[index]));
    }
    } while (index != -1);
    
    foreach (var result in results)
    {
    Console.WriteLine($"{result.Count} kez {result.Value} geldi");
    }
    
    }
    Console.ReadKey();
    }
    
    public static int SearchPattern<T>(T[] source, T[] pattern, int startIndex = 0)
    {
    for (int i = startIndex; i < source.Length - pattern.Length; i++)
    {
    for (int j = 0; j < pattern.Length; j++)
    {
    if (!EqualityComparer<T>.Default.Equals(pattern[j], source[i + j]))
    {
    goto jmp;
    }
    }
    return i + pattern.Length;
    jmp:;
    }
    return -1;
    }
    class Result
    {
    public int Value;
    public int Count;
    public Result(int value)
    {
    Value = value;
    Count = 1;
    }
    }
    }
    hocam bir şey daha sorabilir miyim sayılari belli bölgelere bölsek asal sayılar, 5 in katları sayılar gibi 2 bölge olsa.if (sayilar.Contains(sayi1) && sayilar.Contains(sayi2) && sayilar.Contains(sayi3)) bu if e bir else yazsak bize bölgesini verse.
     public static int asalolanlar(int sayi)
    {
    int[] asalBolge= { 2,5,7,11};
    int asalBolgesi= 0;
    for(int i=0; i<asalBolge.Length; i++)
    {
    if(sayi==asalBolge[i])
    {
    asalBolgesi++;
    }
    }
    return asalBolgesi;
    }
    aynı şeyi 5 için yapsak

     public static int BesBolgesi(int sayi)
    {
    int[] besBolge= { 10,15,20,25,30,35,40};
    int besBolgesi= 0;
    for(int i=0; i<besBolge.Length; i++)
    {
    if(sayi==besBolge[i])
    {
    besBolgesi++;
    }
    }
    return besBolgesi;
    }
    bu değerleri döndürsek else kısmında fonksiyonları sayıyı göndersem

     int asalSayac=0, besSayac=0;
    int birinciSayiBolgesi = asalolanlar(sayi1);
    int birinciSayiBolgesi2 = BesBolgesi(sayi1);
    
    if(asalolanlar>0)
    {
    asalSayac++;
    }
    else if(birinciSayiBolgesi2>0)
    {
    besSayac++;
    }
    bu şekilde sayıların bölgesini tespit edebiliyorum fakat bir sonraki sayının bölgesini bulamıyorum.Bunun için sizin yazdığınız SearchPattern<T> fonksiyonunu kullanayım dedim fakat T[] source, T[] pattern bu 2 parametreyi ne karşılar bulamadım.Tabi birde bunun kaç kere tekrar ettiğini de bulmam gerekiyor.Bu ilk yazdığınız sıradaki sayı bulmayı bir fonksiyon haline getirebilir miyiz ?
  • 06-03-2020, 12:00:58
    #4
    algoritmik adlı üyeden alıntı: mesajı görüntüle
    kodu henüz inceleyemedim ama output tam istediğimi veriyor çok teşekkür ederim hocam adamsın.





    hocam bir şey daha sorabilir miyim sayılari belli bölgelere bölsek asal sayılar, 5 in katları sayılar gibi 2 bölge olsa.if (sayilar.Contains(sayi1) && sayilar.Contains(sayi2) && sayilar.Contains(sayi3)) bu if e bir else yazsak bize bölgesini verse.
     public static int asalolanlar(int sayi)
    {
    int[] asalBolge= { 2,5,7,11};
    int asalBolgesi= 0;
    for(int i=0; i<asalBolge.Length; i++)
    {
    if(sayi==asalBolge[i])
    {
    asalBolgesi++;
    }
    }
    return asalBolgesi;
    }
    aynı şeyi 5 için yapsak

     public static int BesBolgesi(int sayi)
    {
    int[] besBolge= { 10,15,20,25,30,35,40};
    int besBolgesi= 0;
    for(int i=0; i<besBolge.Length; i++)
    {
    if(sayi==besBolge[i])
    {
    besBolgesi++;
    }
    }
    return besBolgesi;
    }
    bu değerleri döndürsek else kısmında fonksiyonları sayıyı göndersem

     int asalSayac=0, besSayac=0;
    int birinciSayiBolgesi = asalolanlar(sayi1);
    int birinciSayiBolgesi2 = BesBolgesi(sayi1);
    
    if(asalolanlar>0)
    {
    asalSayac++;
    }
    else if(birinciSayiBolgesi2>0)
    {
    besSayac++;
    }
    bu şekilde sayıların bölgesini tespit edebiliyorum fakat bir sonraki sayının bölgesini bulamıyorum.Bunun için sizin yazdığınız SearchPattern<T> fonksiyonunu kullanayım dedim fakat T[] source, T[] pattern bu 2 parametreyi ne karşılar bulamadım.Tabi birde bunun kaç kere tekrar ettiğini de bulmam gerekiyor.Bu ilk yazdığınız sıradaki sayı bulmayı bir fonksiyon haline getirebilir miyiz ?
    Benim yaptığım gibi arayan fonksiyona startIndex göndermeyi deneyin hocam.Başlangıçta 0 dan başlasın sonra en son bulunan indexi göndersin böylece bir sonrakini bulabilirsiniz. Asal ve 5 katı için böyle arraydan kontrol yerine asallık kontrolü (hız için miller rabin öneririm) ve 5 ile mod işleminin kalanının 0 olmasını kontrol ettirmeniz daha güzel olur. Benim yazdığım SearchPattern fonksiyonu generic hocam, yani hangi tip ile çağırırsanız o tipin arrayına göre çalışır. Kullanımı SearchPattern<Tip>(kaynak, desen, baslangicSirasi); şeklinde. Karmaşık geldiyse generic konusunu biraz araştırmanızı öneririm.