[Çözüldü] C# Asal Fark Bulan Fonksiyon

Başlatan harunbas141, 05 Ekim 2016 - 13:02:37

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

harunbas141


using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int sayi;
            Console.Write("Sayı giriniz: ");
            sayi = Convert.ToInt32(Console.ReadLine());
            if (sayi == 0 || sayi == 1)
            {
                Console.WriteLine("Bu sayı asal bir sayı değildir.");
                Console.ReadLine();
            }
            else
            {
                for (int i = 2; i <= sayi / 2; i++)
                {
                    if (sayi % i == 0)
                    {
                        Console.WriteLine("Bu sayı asal bir sayı değildir.");
                        Console.ReadLine();
                        return;
                    }
                }
                Console.WriteLine("Bu sayı asal bir sayıdır.");
                Console.ReadLine();
            }
        }
    }
}



Yukarıdaki kod asal sayı buluyor. Ben şimdi bunu farklı bir fonksiyona çevirmem lazım.Şöyle anlatıyım.Yapacağım fonksiyon mesala x diye bir sayı aldık klavyeden.X sayısından büyük olup en küçük olan asal sayıyı bulacak ve X sayısından küçük en büyük asal sayıyı bulup bu iki sayıyı birbirinden çıkaracak.


public static int AsalFark(int a)
        {
            int i;
            if (a == 0 || a == 1)
            {

            }
            else
            {
                for (i = 2; i <= a / 2; i++)
                {
                    if (a % i == 0)
                    {

                    }
                }

            }

        }


Yukarıda yapmaya çalıştım ama çıktı olarak ; mesala ben 7 giriyorum beklediğim şey 11 vermesi ama 8 veriyor.Yardımcı olursanız sevinirim.

travego0403

Öncelikle kodları bi yerden alarak hiç programlama bilmeden bir şeyler yapmaya çalışıyorsan gittiğin yol yanlış.

Yukarda yazdığın  kodda ne yapmak istediğini anlamadım. Ya da benim düşündüğüm çözüm yöntemi senin düşüncenden farklı.  Ben sana kod  vermeden mantığını anlatmaya çalışayım. Hazır kod vermeye kesinlikle karşıyım, sen bi şeyler yaparsın olmaz biz düzeltir geri veririz yanlış anlama. Forumlarda ödev çözdürmeye gelenler, sınav sorularını çözdürmeye gelenler ne ararsan oluyor.

Asal sayı aramaya 2 den değilde kullanıcıdan aldığın sayıdan başlayacaksın. Diyelim ki kullanıcı 8 girdi. Sen 8 den başlayacaksın. Hatta bir fonksiyon yaz parametre olarak bir sayı alsın geriye sadece doğru yanlış döndürsün(Asal veya değil)
AsalMi(8 ) değil
AsalMi(9) değil
AsalMi(10) değil
AsalMi(11) asal
BüyükAsal=11
Bide 8 den geriye doğru gideceksin
Asalmi(7) asal
KüçükAsal=7
Fark = BüyükAsal-KüçükAsal  =11-7 = 4

Umarım istediğin şeyi doğru anlamışımdır.

"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

harunbas141

Yardımın için teşekkür ederim; ama bir yerden kod almadım. Kendim yazdım. İkincisi ben kod da istemedim. Yardım istedim. Üçüncüsü ödev değil. Kendi başıma yaptığım şeyler.

gnukarabatak

Öncelikle asalsayı bulmakla ilgili doğru algoritmayı oluşturmak gerekir. Bunun için bilgi sahibi olalım (bende yeni öğrendim :) )

Alıntı https://tr.wikipedia.org/wiki/Asal_say%C4%B1
Alıntı YapAsal sayılar, sadece iki pozitif tam sayı böleni olan doğal sayılardır. Sadece kendisine ve 1 sayısına bölünebilen 1'den büyük pozitif tam sayılardır.
Herhangi bir sayının 1 sayısına yada kendisine tam bölünebilmesi demek bölümden kalanın 0 (sıfır) olması demektir. Alıntıda da belirtildiği gibi bir asal sayı en fazla iki sayıya tam bölünür; 1 ve kendisine.

Yazılması gereken kod 1 den başlayarak sayısının kendisine kadar olan bir döngü  kod bloğunun içine mod işlemi uygulamak. Mod operatörü pascalda mod C# da ise % olmalı bildiğim kadarıyla. Dolayısıyla pascalda bunu ;


sayac:= 0;
for i:=1 to sayi do
begin
   if sayi mod i = 0 then
     Inc(sayac);
end;
if Sayac =2 then
   write('SAYI ASALDIR')
else
   write('SAYI ASAL DEĞİLDİR');


şeklinde okuyabilirsin. Kodu yazarken en can alıcı kısım önce işi anlamaktır. Sonra biraz kafa yorduğunda mantığı ve dahi Algoritmayı çıkarmak çocuk oyuncağı olur. İşin yarısını elimden geldiğince anlattım. Sen kendi koduna uyarlarsın artık.
Linux kullanmak bir farklılık, linux'te kod yazmak ise ayrıcalıktır.

harunbas141

@travego0403 aslında istediğim şeyi anlamışsın. uğraşıyorum şuan ama bakalım.yapınca yazıcam buraya.

@gnukarabatak hocam asal sayının ne demek olduğunu biliyorum zaten. orada bir sıkıntı yok.

travego0403

Hadi bakalım biraz uğraş sonra buraya yaz olmayan yerlerde biz yardımcı oluruz.

Mantık doğrumu diye kontrol etmek için C++ da yazdım ben çözümü bir yanlışlık görmedim, çalışıyor. Büyük problemi parçalara ayırarak daha rahat çözersin.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

harunbas141


using System;

namespace Uygulama
{
class MainClass
{
public static int AsalFark(int a)    /*Uygulama.MainClass.AsalFark(int):not all code paths return a value hatsını veriyor.*/
{
int j;
if (a == 0 || a == 1) {
Console.Write ("Girdiğiniz sayılar asal değil");
}
else
{
for (j = 2; j <= a / 2; j++)
{
if (a % j == 0)
{
Console.Write ("Asal Değil");
Console.ReadLine ();
return a;
}
}
Console.WriteLine ("Bu Bir Asal Sayıdır");
Console.ReadLine ();
}
}
public static double TersToplam(int m,int n)
{
double i, tp = 0;
for (i = m; i <= n; i++)
{
if (i == 0)continue;
tp = tp + (1 / i);
}
return tp;
}
public static void Main (string[] args)
{
int m, n,a;
Console.WriteLine ("Bir değer giriniz: ");
m = Convert.ToInt32 (Console.ReadLine ());
Console.WriteLine ("Bir değer giriniz: ");
n=  Convert.ToInt32 (Console.ReadLine ());
Console.WriteLine ("Ters Toplam= " + TersToplam (m, n));
Console.WriteLine ("Bir değer giriniz: ");
a = Convert.ToInt32 (Console.ReadLine());
Console.WriteLine (AsalFark (a));
Console.ReadLine ();
}
}
}


Verilen hatayı verilen yerin yanında yorum satırı olarak yazdım.

travego0403

Şu an iş yerindeyim kodları derleyemiyorum. Derleme hatası vemesinin nedeni AsalFark fonksiyonu içerisinde return eksikliğinden dolayı. Şöyle ilk if şartı gerçekleşirse herhangi bir değer döndürülmüyor. for döngüsü içinde de if şartı gerçekleşirse return dönüyor ama if şartı gerçekleşmezse yine herhangi bir değer return olmuyor. Derleyici bundan şikayet ediyor sanırım. Eğer derlense bile doğru sonuç verip vermeyeceğine şu an bakamıyorum. Akşam kendi bilgisayarımdan daha ayrıntılı incelerim.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

gnukarabatak

Pardon ben verdiğiniz kodun ikinci kısmına dikkat etmemişim. İlk kısmında mod işlemi yapılmadığını ve sizin de yazılımda yeni olduğunuzu düşünerek bir yol gösterme maksatlı *bir şeyler karaladım. Kodun ikinci kısımda gereken yapılmış zaten. Kolay gelsin.
Linux kullanmak bir farklılık, linux'te kod yazmak ise ayrıcalıktır.

bugra9

Eğer yanlış görmüyorsam mantık hatası yapıyorsun. @travego0403 çok güzel bir şekilde izleyeceğin yolu anlatmış. Senin ilk paylaştığın kodlar bir sayının asal olup olmadığını kontrol ediyor. İkinci paylaştığın kısımda ise bunu fonksiyon haline getirmişsin. Bundan sonra yapman gerekeni zaten @travego0403 anlatmış. Oradaki gibi devam edersen istediğine ulaşırsın.

harunbas141

Yav sabaktan beri düşünüyorum aptalmıyım anlamadım. Bir sürü şey denedim ama bir türlü yapamıyorum.Ama pes etmek yok.  :)

bugra9

Elinde zaten asal olup olmadığını söyleyen yardımcı fonksiyonun var. Bunu düzeltmeye çalışmak yerine ana bir fonksiyon oluştur ve @travego0403'in yazdığı gibi verilen sayıdan aşağıya ve yukarıya gitmek üzere iki farklı döngü oluştur. Bu döngülerdeki her sayıyı asal olup olmadığını döndüren yardımcı fonksiyonuna pasla ve asal ise döngüyü durdur çünkü aradığın sayıları bulmuş oldun.

travego0403

Madem bu kadar isteklisin en baştan başlayalım. Önce bir fonksiyon yaz. Fonksiyon bir parametre alsın. Bu parametrede aldığın sayının asal olup olmadığına göre geriye true veya false döndürsün. Önce bunu bir yaz sonra arkası gelecek zaten.
asalMi(4) -> false
asalMi(10) -> false
asalMi(7) -> true
asalmi(11) -> true
Önce bu fonksiyonu bir yazmaya çalış bakalım. Başka hiç bir şey ekleme sadece bu işlemi yapsın. Yukarıda yazdıklarınıda düzenlemeye çalışma yeni tertemiz bir sayfa aç ordan başla. :)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

harunbas141


using System;

namespace Deneme
{
class MainClass
{
public static void Main (string[] args)
{
bool durum = true;
int sayi = Convert.ToInt32 (Console.ReadLine ());
for (int i=1; i < sayi; i++)
{
if (sayi % 1 == 0 && i != 1)
{
durum = false;
}
if (durum == false)
{
Console.WriteLine ("Asal Sayı Değildir");
}
else
{
Console.WriteLine ("Asal Sayıdır");
}
Console.ReadLine ();
}
}
}
}


böyle bir şey denedim ama çok sağlıklı çalışmıyor.

travego0403

Yanlış anlamayın ama biraz daha temel konularla alıştırmalar yapın. Çarpım tablosunu değişik şekillerde yazdırmaya çalışın, faktöriyel hesapları yapın, değişik seri açılımların hesaplarını yapın. Olabildiğince döngülerle alıştırma yapın.

Bir başka konuda Matematik konularını gözden geçirin. Çünkü temel matematik bilmek yetmiyor programlama yapabilmek için. Temelden bir tık fazla şeyler bilmek gerekiyor.  Örneğin sayi%1 gibi bir işlemi neden yaptırıyorsun. Hangi sayı olursa olsun 1 e göre modu sıfırdır. Yani bütün sayılar 1'e tam bölünür.

Örnek olması açısından asal sayı örneğini aşağıya yazıyorum. Kendi yazdığınız kodla karşılaştırın ama ezberlemeyin. Daha sonra kendiniz yazmaya çalışın. Girilen sayıdan küçük asalları bulun. Girilen sayıdan büyük 3 asal sayıyı bulun bunun gibi örneklerle devam edin.
using System;
class Program
{
static void Main()
{
Console.WriteLine("Bir sayi giriniz.");
int sayi = Int32.Parse(Console.ReadLine());
if(asalMi(sayi))
{
Console.WriteLine("Asal");
}
else
{
Console.WriteLine("Asal değil");
}

}

public static bool asalMi(int sayi)
{
if( sayi==2)
{
return true;
}
else
{
for(int i=2; i<=sayi/2; i++)
{
if(sayi % i == 0)
{
return false;
}
}
return true;
}
}
}
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

harunbas141


        public static int AsalFark(int n)
        {
            int i, a = 0, b = 0;
            if (n < 2)
                return 0;
            for (;;)
            {
                n++;
                for (i = 2; i < n; i++)
                {
                    if (n % i == 0) break;
                    if (n - 1 == i) a = n;
                }
                if (a != 0) break;
            }
            for (;;)
            {
                n--;

                for (i = 2; i < n; i++)
                {
                    if (n % i == 0) break;
                    if (n - 1 == i) b = n;
                }
                if (b != 0) break;
            }


            return a - b;
        }


@travego0403
senin dediklerinden yola çıkarak yapmaya çalıştım.çalışıyor.