Yazılım | Programlama C# sınıflara ve methodlara ayrılma konusunda zorlanıyorum

selim bayac

Yeni üye
19 Nis 2021
28
2
21
Merhabalar sınıf ve metholara ayırırken zorlanıyorum bu attığım kod üzerinden örnek yapabilciek varmı






using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Numerics;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Schema;

namespace materis
{

class program
{

static void Main(string[] args)
{
string str1 = " ";
string str2 = " ";
string str3 = " ";



int satir, stun;
Console.Write("Satır sayısını girin: ");
satir = Convert.ToInt16(Console.ReadLine());
Console.Write("Sütun sayısını girin: ");
stun = Convert.ToInt16(Console.ReadLine());

int[,] matris = new int[satir, stun];
int[,] matris2 = new int[satir, stun];
int[,] sonuc = new int[satir, stun];
int[,] toplama = new int[satir, stun];

Console.WriteLine(string.Format("{0,15} {1,-14} ", "-----Birinci Matris-----", "-----İkinci matris-----"));
//Console.Write("<---İlk Matris--->");
//Console.WriteLine("<---İkinci Matris--->");
for (int x = 0; x < satir; x++)
{
Random rdn = new Random();

str1 = string.Empty;
str2 = string.Empty;

for (int y = 0; y < stun; y++)

{
// ikisi aynı değeri alıyo
matris[x, y] = rdn.Next(0, 4);
matris2[x, y] = rdn.Next(0, 4);


str1 += string.Format("{0,3}", matris[x, y]);
str2 += string.Format("{0,3}", matris2[x, y]);








}


Console.WriteLine(string.Format("{0,15} {1,14} ", str1,str2));



}
Console.WriteLine();
for (int i = 0; i < satir; i++)
{
for (int k = 0; k <satir; k++)
{
for (int j = 0; j < stun; j++)
{
sonuc[i, k] +=matris[i, j] * matris2[j, k];
}
}
}

Console.WriteLine(string.Format( "{0,15} " ," <---Matrislerin Çarpımlarının Sonucu--->"));
for (int i = 0; i < satir; i++)
{
for (int k = 0; k < satir ; k++)
{
Console.Write(sonuc[i, k]);
Console.Write(" ");
}
Console.WriteLine();
}





Console.Read();

}
}
}
 
Çözüm
C#:
static void Main(string[] args)
{

    Console.WriteLine("Matrix Çarpımları");

    var matrix1 = CreateMatrix(5, 5);
    var matrix2 = CreateMatrix(5, 5);
    var result = MultiplyMatrix(matrix1, matrix2);
    PrintMatrixToConsole(matrix1);
    Console.WriteLine("**************************");
    PrintMatrixToConsole(matrix2);
    Console.WriteLine("**************************");
    Console.WriteLine("ÇARPIM SONUÇLARI");
    PrintMatrixToConsole(result);

 
    Console.ReadKey();
}

public static void PrintMatrixToConsole(int[,] matrix)
{
    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int k = 0; k < matrix.GetLength(1); k++)
        {
            Console.Write(matrix[i, k])...

BeoWulf007

Kıdemli Üye
19 Haz 2013
2,763
20
508
24
Praise The Fool
düzenli değil mi zaten
Hayır değil. Görmüyor musun? ne parantezler doğru yerlerinde ne boşluklar bunları kafandan yerleştiremezsin ki? Ayrıca RENKSİZ! Gerçekten konuna dönüp baktığın zaman attığın kodun okunabilir, düzenli ve anlaşılır olduğuna mı inanıyorsun? Neyse, kısaca kodu düzgünce kod blokları arasında buraya koysan ayrıca gereksiz kodları silsen çok daha hoş olur. Using ile eklenen namespace'ler neden orada mesela çok ihtiyacımız yok sadece main methodunun içindeki yazdığın kod önemli bizim için. Örnek temiz kod böyle olur;

C#:
string str1 = " ";
string str2 = " ";

int satir, stun;
Console.Write("Satır sayısını girin: ");
satir = Convert.ToInt16(Console.ReadLine());
Console.Write("Sütun sayısını girin: ");
stun = Convert.ToInt16(Console.ReadLine());

int[,] matris = new int[satir, stun];
int[,] matris2 = new int[satir, stun];
int[,] sonuc = new int[satir, stun];
int[,] toplama = new int[satir, stun];


Console.WriteLine(string.Format("{0,15} {1,-14} ", "-----Birinci Matris-----", "-----İkinci matris-----"));

for (int x = 0; x < satir; x++)
{
    Random rdn = new Random();
    str1 = string.Empty;
    str2 = string.Empty;

    for (int y = 0; y < stun; y++)
    {
        matris[x, y] = rdn.Next(0, 4);
        matris2[x, y] = rdn.Next(0, 4);
        str1 += string.Format("{0,3}", matris[x, y]);
        str2 += string.Format("{0,3}", matris2[x, y]);
    }
    Console.WriteLine(string.Format("{0,15} {1,14} ", str1, str2));
}

Console.WriteLine();

for (int i = 0; i < satir; i++)
{
    for (int k = 0; k < satir; k++)
    {
        for (int j = 0; j < stun; j++)
        {
            sonuc[i, k] += matris[i, j] * matris2[j, k];
        }
    }
}

Console.WriteLine(string.Format("{0,15} ", " <---Matrislerin Çarpımlarının Sonucu--->"));
for (int i = 0; i < satir; i++)
{
    for (int k = 0; k < satir; k++)
    {

        Console.Write(sonuc[i, k]);
        Console.Write(" ");
    }
    Console.WriteLine();
}
Console.ReadKey();

Ayrıca bu kodu sınıflara zaten bölemezsin çünkü böyle bir ihtiyaç yok methodlara bölmek için de daha iyi bir algoritma kurmalısın. Mesela koduna şöyle bakıyorum ama bazı problemler görüyorum. Mesela matris1 ile matris2'nin sütün ve satır değerlerini kontrol etmiyorsun yani kısaca dinamik bir yapı kurmamışsın programın çalışabilmesi için iki matrisin de eşit olması lazım yoksa dizi dizi sınırlarının dışına çıkıyor ya da kullanıcı hatalı bir matris tanımlar ikisi çarpılamaz zaten.

Method mu kullanmak istiyorsun, öncelikle matrisleri doldurma yönteminden vazgeç, neden tüm stünlar aynı değeri alıyor? Bunu düzeltmek ile başla ve bunu bir method içinde yap. Öyle bir method yaz ki sana parametre ile belirtilen matris boyutunu random bir şekilde doldurulmuş bir şekilde dönsün. Ancak daha iyi bir rastgele sayı üretme yöntemi bul çünkü işlem o kadar hızlı gerçekleşiyor ki rastgele sayı üretme yöntemi aslında saati baz aldığından tüm sütunların sayısı aynı oluyor. Bunu çöz, sana 2 farklı matris dönsün ve her değeri farklı olsun. Kodun sonunda şu şekilde gözükecek;


C#:
var matris1 = GenerateNewMatrix(6,3);
var matris2 = GenerateNewMatris(3,5);

Çarpım kısmını da bir method ile yap! Matrislerin çarpımını dinamik bir şekilde yapan ve sana geriye sonuç matrisi döndüren bir method yaz. Matris1 ve Matris2 parametlerini alsın ve geriye bir matris döndürsün. Sonunda o da şu şekilde bir şey olacak;

C#:
var matrisCarpimSonucu =  MultiplyMatrix(matris1,matris2);

ve en sonunda bir tane de ekrana yazdırma işlemi yapan bir method yaz. Bu içine aldığı çok boyutlu diziyi matrislere uygun şekilde satır ve sütun düzeninde yazdırma görevi görsün. Böylece aynı kod tekrarlanmadan Matris1 * Matris2 = Sonuc matrislerini tek bir method kullanarak yazdırmış olursun

Umarım aydınlatıcı olmuştur senin için.

 
Son düzenleme:

selim bayac

Yeni üye
19 Nis 2021
28
2
21
Hayır değil. Görmüyor musun? ne parantezler doğru yerlerinde ne boşluklar bunları kafandan yerleştiremezsin ki? Ayrıca RENKSİZ! Gerçekten konuna dönüp baktığın zaman attığın kodun okunabilir, düzenli ve anlaşılır olduğuna mı inanıyorsun? Neyse, kısaca kodu düzgünce kod blokları arasında buraya koysan ayrıca gereksiz kodları silsen çok daha hoş olur. Using ile eklenen namespace'ler neden orada mesela çok ihtiyacımız yok sadece main methodunun içindeki yazdığın kod önemli bizim için. Örnek temiz kod böyle olur;

C#:
string str1 = " ";
string str2 = " ";

int satir, stun;
Console.Write("Satır sayısını girin: ");
satir = Convert.ToInt16(Console.ReadLine());
Console.Write("Sütun sayısını girin: ");
stun = Convert.ToInt16(Console.ReadLine());

int[,] matris = new int[satir, stun];
int[,] matris2 = new int[satir, stun];
int[,] sonuc = new int[satir, stun];
int[,] toplama = new int[satir, stun];


Console.WriteLine(string.Format("{0,15} {1,-14} ", "-----Birinci Matris-----", "-----İkinci matris-----"));

for (int x = 0; x < satir; x++)
{
    Random rdn = new Random();
    str1 = string.Empty;
    str2 = string.Empty;

    for (int y = 0; y < stun; y++)
    {
        matris[x, y] = rdn.Next(0, 4);
        matris2[x, y] = rdn.Next(0, 4);
        str1 += string.Format("{0,3}", matris[x, y]);
        str2 += string.Format("{0,3}", matris2[x, y]);
    }
    Console.WriteLine(string.Format("{0,15} {1,14} ", str1, str2));
}

Console.WriteLine();

for (int i = 0; i < satir; i++)
{
    for (int k = 0; k < satir; k++)
    {
        for (int j = 0; j < stun; j++)
        {
            sonuc[i, k] += matris[i, j] * matris2[j, k];
        }
    }
}

Console.WriteLine(string.Format("{0,15} ", " <---Matrislerin Çarpımlarının Sonucu--->"));
for (int i = 0; i < satir; i++)
{
    for (int k = 0; k < satir; k++)
    {

        Console.Write(sonuc[i, k]);
        Console.Write(" ");
    }
    Console.WriteLine();
}
Console.ReadKey();

Ayrıca bu kodu sınıflara zaten bölemezsin çünkü böyle bir ihtiyaç yok methodlara bölmek için de daha iyi bir algoritma kurmalısın. Mesela koduna şöyle bakıyorum ama bazı problemler görüyorum. Mesela matris1 ile matris2'nin sütün ve satır değerlerini kontrol etmiyorsun yani kısaca dinamik bir yapı kurmamışsın programın çalışabilmesi için iki matrisin de eşit olması lazım yoksa dizi dizi sınırlarının dışına çıkıyor ya da kullanıcı hatalı bir matris tanımlar ikisi çarpılamaz zaten.

Method mu kullanmak istiyorsun, öncelikle matrisleri doldurma yönteminden vazgeç, neden tüm stünlar aynı değeri alıyor? Bunu düzeltmek ile başla ve bunu bir method içinde yap. Öyle bir method yaz ki sana parametre ile belirtilen matris boyutunu random bir şekilde doldurulmuş bir şekilde dönsün. Ancak daha iyi bir rastgele sayı üretme yöntemi bul çünkü işlem o kadar hızlı gerçekleşiyor ki rastgele sayı üretme yöntemi aslında saati baz aldığından tüm sütunların sayısı aynı oluyor. Bunu çöz, sana 2 farklı matris dönsün ve her değeri farklı olsun. Kodun sonunda şu şekilde gözükecek;

C#:
var matris1 = GenerateNewMatrix(6,3);
var matris2 = GenerateNewMatris(3,5);

Çarpım kısmını da bir method ile yap! Matrislerin çarpımını dinamik bir şekilde yapan ve sana geriye sonuç matrisi döndüren bir method yaz. Matris1 ve Matris2 parametlerini alsın ve geriye bir matris döndürsün. Sonunda o da şu şekilde bir şey olacak;

C#:
var matrisCarpimSonucu =  MultiplyMatrix(matris1,matris2);

ve en sonunda bir tane de ekrana yazdırma işlemi yapan bir method yaz. Bu içine aldığı çok boyutlu diziyi matrislere uygun şekilde satır ve sütun düzeninde yazdırma görevi görsün. Böylece aynı kod tekrarlanmadan Matris1 * Matris2 = Sonuc matrislerini tek bir method kullanarak yazdırmış olursun

Umarım aydınlatıcı olmuştur senin için.
Teşekkürler
 

BeoWulf007

Kıdemli Üye
19 Haz 2013
2,763
20
508
24
Praise The Fool
C#:
static void Main(string[] args)
{

    Console.WriteLine("Matrix Çarpımları");

    var matrix1 = CreateMatrix(5, 5);
    var matrix2 = CreateMatrix(5, 5);
    var result = MultiplyMatrix(matrix1, matrix2);
    PrintMatrixToConsole(matrix1);
    Console.WriteLine("**************************");
    PrintMatrixToConsole(matrix2);
    Console.WriteLine("**************************");
    Console.WriteLine("ÇARPIM SONUÇLARI");
    PrintMatrixToConsole(result);

 
    Console.ReadKey();
}

public static void PrintMatrixToConsole(int[,] matrix)
{
    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int k = 0; k < matrix.GetLength(1); k++)
        {
            Console.Write(matrix[i, k]);
            Console.Write(" ");
        }
        Console.WriteLine();
    }
}

public static int[,] CreateMatrix(int line, int column)
{
    int[,] matrix = new int[line, column];

    for (int x = 0; x < line; x++)
    {
        Random random = new Random();
        for (int y = 0; y < column; y++)
        {
            matrix[x, y] = random.Next(0, 10);
            Thread.Sleep(5);
        }
    }
    return matrix;
}

public static string GetMatrixTable(int[,] matrix)
{
    string matrixTable = String.Empty;

    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            matrixTable += string.Format("{0,3}", matrix[i, j]);
        }
    }
    return matrixTable;
}

public static int[,] MultiplyMatrix(int[,] matrix1, int[,] matrix2)
{
    int line = matrix1.GetLength(0);
    int column = matrix2.GetLength(1);

    if (matrix1.GetLength(1) != matrix2.GetLength(0))
    {
        Console.WriteLine("Bu iki matrix çarpılamaz! Birinci matrix'in sütün sayısı ile ikinci matrix'in satır sayısı uyuşmuyor.");
        throw new Exception("Uyumsuz Matrixler");
    }
    int[,] result = new int[line, column];

    for (int i = 0; i < line; i++)
    {
        for (int k = 0; k < line; k++)
        {
            for (int j = 0; j < column; j++)
            {
                result[i, k] += matrix1[i, j] * matrix2[j, k];
            }
        }
    }
    return result;
}
Buyur, kodunu methodlara bölüştürdüm. Yalnız matrix çarpımı üzerine pek kafa yormadım, hatta algoritmalarını hiç değiştirmedim sadece düzenledim, direk senin kodunu kopyaladım. Bu yüzden çarpılabilmesi gereken 6.3 * 3.5 gibi matrixlerde dizi sınır dışı hatası veriyor. Açıkçası bunun döngüsü üzerine kafa yormaya üşendim. O da istersen sana kalsın, istemezsen böyle kalsın. Kolay gelsin.
 
Son düzenleme:
Çözüm

alexandre20

Katılımcı Üye
13 Tem 2022
908
11
716
adından önce "class" olanlara sınıf deniyor
adından önce "void" olanlara metod deniyor

bazı metodların adından önce "void" olmaz, "string, int" veya başka tipler (type) olabilir. Bu durumda adından sonra parantez () ve sonrasında { var mı ona bakılır. Metodlar çağırılabilir ('call edilebilir'). Yani kod içerisinde () kullanılarak çağırılan bir isim görüyorsan o bir metoddur
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.