Şimdi Ara

C# stringlerle ilgili bir soru

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
16
Cevap
0
Favori
1.370
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Ben integerden büyük sayılarla işlem yapmaya çalışıyorum. Bu sayıları basamak basamak integer a dönüştürüp işlemi mi yapıp daha sonra tekrardan stringe dönüştürmek istiyorum. örn; asdf*zxcv gibi bir sayımız olsun. Şuan asdf*v işlemini yapıp bir stringe atmış durumdayım. Fakat asdf*c , asdf*x, asdf*z sayılarınıda aynı şekilde stringe atıp onları toplamam lazım. Ama her basamak için ayrı ayrı string dizisi oluşturmak istemiyorum. Bunları genel olarak bir diziye atıp sonra ihtiyacım olduğunda diziden dizi olarak olmamın bir imkanı var mı? ( Baya karışık oldu )



    Edit: Yeni bir sıkıntım var. Örn; str diye tanımladığım bir stringin 10. elemanındaki değeri başka birşeyle değiştirmek istiyorum. Ama derleyici it's only read diye hata veriyor. Ben bunu nasıl yazılabilir yapabilirim?



    < Bu mesaj bu kişi tarafından değiştirildi TeaTone -- 1 Nisan 2013; 13:21:47 >



  • Koleksiyon diziler işine yarayabilir. Tam anlaşılmıyor ne yapmak istediğin ama..
  • quote:

    Orijinalden alıntı: Kod_Dünyası

    Koleksiyon diziler işine yarayabilir. Tam anlaşılmıyor ne yapmak istediğin ama..

    1234* 1234 ün sonucunu yazdırmak istiyorum ama bu sayıları 1234 değilde atıyorum 15 basamaklı sayılar gibi düşün. Bu işlemi integerla yapamam. Bigint kütüphanesi kullanmamda yasak. String dizileriyle işlem yapıyorum bende. sayıları insan gibi tek tek hesaplatıyorum.
    (1234*4)+10*(1234*3)+100*(1234*2)+1000*(1234*1) şeklinde. kırmızı ile gösterdiğimi bir string dizisine attım. geriye kalan adımlarıda atmak istiyorum ama hepsi için ayrı değişken kullanmak istemiyorum neticede 15 basamak olduğunda 15 değişken kullanmam gerekecek. Bunun yerine ilk oluşturduğum stringi başka bir stringe eleman olarak atıp sonra yine aynı string ile işlem yapıp bunu tekrarlamak istiyorum.




  • List<string> icListe = new List<string>(); // String listesi
    List<List<string>> liste = new List<List<string>>(); // String listesi içeren başka bir liste
    .
    .
    liste.Add(icListe); // String listesini string listesi içeren başka bir listeye ekleme
    .
    .
    List<string> herhangiBirListe = liste[0]; // string listesine ulaşma

    Sanırım yukarıdaki gibi bir çözüm arıyorsun.
  • İlkokulda öğrendiğin o klasik toplama işlemini bu sayılarla yapacak bir algoritma kur ve yap. bir programlama yarışmasında benzer bir soru bu şekilde çözülmüştü ;)
  • quote:

    Orijinalden alıntı: wqlky

    İlkokulda öğrendiğin o klasik toplama işlemini bu sayılarla yapacak bir algoritma kur ve yap. bir programlama yarışmasında benzer bir soru bu şekilde çözülmüştü ;)

    şuan o şekilde yapıyorum ama bunu 100000000!(ödev faktoriyel alma) şeklinde düşün. 100000000*99999999 u bir string 99999999*99999998 i aynı string bide bu stringlerin değerlerini tutan başka bir string. Ama bide şu sayıların değerini bir azaltacak başka bir fonksiyon yazmam lazım. stringi bir azaltmak biraz sıkıntılı. sonra genel string dizisinden elemanları tek tek alıp tersine çevirip birleriyle toplamam lazım sonrada kısmetse sonucu bulmuş olacam ama kodun yarısını falan yazabildim henüz.



    < Bu mesaj bu kişi tarafından değiştirildi TeaTone -- 1 Nisan 2013; 12:59:35 >




  • Yeni bir sıkıntım var. Örn; str diye tanımladığım bir stringin 10. elemanındaki değeri başka birşeyle değiştirmek istiyorum. Ama derleyici it's only read diye hata veriyor. Ben bunu nasıl yazılabilir yapabilirim?
  • Yapay Zeka’dan İlgili Konular
    Sistem 4 ile ilgili soru?
    14 yıl önce açıldı
    Daha Fazla Göster
  • Selam kardeşim, senin demek istediğini ben anladım. Bilgisayarda insanlar gibi işlem yapdırtmak istiyorsun, elde olayı falan.

    Bunun için konsolda zamanında yazdığım ( alıntıdır ) bir program vardı. Bunun mantığını kullanarak yapabilirsin. Program şöyle.

     
    while(true)
    {
    Console.Title = "Klasik Toplama Programı";
    Console.Write("Birinci Sayı : ");
    string sayi1 = Console.ReadLine();
    Console.Write("İkinci Sayı : ");
    string sayi2 = Console.ReadLine();
    byte elde = 0;
    string sonuc = "";
    for (int i = sayi1.Length - 1; i >= 0; i--)
    {
    int aratoplam = (Convert.ToInt32(sayi1[i].ToString()) + Convert.ToInt32(sayi2[i].ToString()) + elde);
    if (aratoplam >= 10)
    {
    sonuc = Convert.ToString(aratoplam % 10) + sonuc;
    elde = 1;
    }
    else
    {
    sonuc = aratoplam.ToString()+sonuc;
    elde = 0;
    }
    }
    if (elde != 0)
    sonuc = elde.ToString() + sonuc;
    Console.WriteLine("{0}\n{1}\n{2}\n", sayi1, sayi2, sonuc);
    }




  • quote:

    Orijinalden alıntı: livan3li

    Selam kardeşim, senin demek istediğini ben anladım. Bilgisayarda insanlar gibi işlem yapdırtmak istiyorsun, elde olayı falan.

    Bunun için konsolda zamanında yazdığım ( alıntıdır ) bir program vardı. Bunun mantığını kullanarak yapabilirsin. Program şöyle.

     
    while(true)
    {
    Console.Title = "Klasik Toplama Programı";
    Console.Write("Birinci Sayı : ");
    string sayi1 = Console.ReadLine();
    Console.Write("İkinci Sayı : ");
    string sayi2 = Console.ReadLine();
    byte elde = 0;
    string sonuc = "";
    for (int i = sayi1.Length - 1; i >= 0; i--)
    {
    int aratoplam = (Convert.ToInt32(sayi1[i].ToString()) + Convert.ToInt32(sayi2[i].ToString()) + elde);
    if (aratoplam >= 10)
    {
    sonuc = Convert.ToString(aratoplam % 10) + sonuc;
    elde = 1;
    }
    else
    {
    sonuc = aratoplam.ToString()+sonuc;
    elde = 0;
    }
    }
    if (elde != 0)
    sonuc = elde.ToString() + sonuc;
    Console.WriteLine("{0}\n{1}\n{2}\n", sayi1, sayi2, sonuc);
    }


    Hocam aslında yeni sorunum stringin ara değerlerinden birini veya bir kaçını değiştirmek. Yukarda yazmıştım. Onu stringi bir eksiltme fonksiyonunda kullanıcam. Ancak daha parametre olarak gönderdiğim stringin değerlerini değiştiremiyorum ancak yeni değer falan ekleyebiliyorum.




  • String i istediğin karaktere kadar parçala, sonra istediğin karakter ve geri kalanları ekleyip yeni bir string oluştur.

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: KillForYou!

    String i istediğin karaktere kadar parçala, sonra istediğin karakter ve geri kalanları ekleyip yeni bir string oluştur.

    Hocam aklımdan geçeni söyledin. Başka bir çözüm vardır umuduyla yazmıştım ama mecbur o şekilde yapacam galiba. Teşekkürler.
  • quote:

    Orijinalden alıntı: TeaTone

    quote:

    Orijinalden alıntı: KillForYou!

    String i istediğin karaktere kadar parçala, sonra istediğin karakter ve geri kalanları ekleyip yeni bir string oluştur.

    Hocam aklımdan geçeni söyledin. Başka bir çözüm vardır umuduyla yazmıştım ama mecbur o şekilde yapacam galiba. Teşekkürler.

    Manuel yol, çoğu zaman an garanti yol oluyor

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • önce insert edip sonra remove yapıcaksın ekleme işi için mesela 10. karaktere mi yapıcaksın

    string text = "999999999";
    int index = 9;

    text = text.Insert(index, "5"); //9. indexden sonrasına 5'i ekle
    text = text.Remove(index, 1);// 9. indexdekini sil

    tabi bu işlem soldan saga için geçerli sen sağdan sola yapmak istersen indexi reverse ediceksin.

    edit: kodu denemedim ama mantığı bu şekilde olucak, diziye atıp orda tutmaya gerek yok .net'in fonksiyonları bu işleri yapıyor zaten



    < Bu mesaj bu kişi tarafından değiştirildi alm.oz -- 2 Nisan 2013; 9:19:46 >
  • quote:

    Orijinalden alıntı: aLiM KaFKeF

    önce insert edip sonra remove yapıcaksın ekleme işi için mesela 10. karaktere mi yapıcaksın

    string text = "999999999";
    int index = 9;

    text = text.Insert(index, "5"); //9. indexden sonrasına 5'i ekle
    text = text.Remove(index, 1);// 9. indexdekini sil

    tabi bu işlem soldan saga için geçerli sen sağdan sola yapmak istersen indexi reverse ediceksin.

    edit: kodu denemedim ama mantığı bu şekilde olucak, diziye atıp orda tutmaya gerek yok .net'in fonksiyonları bu işleri yapıyor zaten

    Çok teşekkürler. Kodum tam olarak çalışıp çalışmadığını bilmiyorum ama derleyici hata vermedi. Umarım derlediğimde program düzgün çalışır.
  • Ödev ne alemde bitirdin mi? Benim de ilgimi çekti uğraştım karaladım bişeyler. Elle yapılan hesap tekniğinde + - * işlemleri yapıyor. Negatif sayıları da alıyor. Bölme yok ama o fazla karmaşık.
    Dil c++ ama algoritma konusunda takıldıysan yardımcı olabilir.

     
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <vector>
    using namespace std;

    class Bignum
    {
    public:
    Bignum() { }
    Bignum(string &str)
    {
    mnum = str;
    }

    Bignum(long num)
    {
    stringstream sstr;
    sstr << num;
    mnum = sstr.str();
    }

    Bignum operator +(const Bignum &_other)
    {
    string num = mnum, other = _other.mnum;
    bool num_pos, other_pos;
    removeSign(num, other, num_pos, other_pos);

    string result;
    if(num_pos && other_pos)
    result = strAdd(num, other);

    else if(!num_pos && !other_pos)
    result = strAdd(num, other, true);

    else if(num_pos)
    result = strSubtract(num, other);
    else
    result = strSubtract(other, num);

    return Bignum(result);
    }

    Bignum operator -(const Bignum &_other)
    {
    string num = mnum, other = _other.mnum;
    bool num_pos, other_pos;
    removeSign(num, other, num_pos, other_pos);

    string result;
    if(num_pos && other_pos)
    result = strSubtract(num, other);

    else if(!num_pos && !other_pos)
    result = strSubtract(other, num);

    else if(num_pos)
    result = strAdd(num, other);
    else
    result = strAdd(num, other, true);

    return Bignum(result);
    }

    Bignum operator *(const Bignum &_other)
    {
    string num = mnum, other = _other.mnum;
    bool num_pos, other_pos;
    removeSign(num, other, num_pos, other_pos);

    string min, max;
    if(num.length() < other.length()) {
    min = num;
    max = other;
    }
    else {
    max = num;
    min = other;
    }
    vector<string> strarray;
    int biggest = 0;

    int length = min.length() - 1;
    for(int i = length; i >= 0; --i) {
    string res = strMultiply(max, min[i]).append(length - i, '0');

    if(res.length() > biggest)
    biggest = res.length();
    strarray.push_back(res);
    }
    for(int i = 0; i < strarray.size(); ++i)
    strarray[i].insert(0, biggest - strarray[i].length(), '0');

    string result = strarray[0];
    for(int i = 1; i < strarray.size(); ++i) {
    result = strAdd(result, strarray[i]);
    }
    if(num_pos != other_pos)
    result.insert(0, 1, '-');

    return Bignum(result);
    }

    string& getNum()
    {
    return mnum;
    }

    const string& getNum() const
    {
    return mnum;
    }

    private:
    string mnum;

    void removeSign(string &str1, string &str2, bool &b1, bool &b2)
    {
    b1 = b2 = true;
    if(str1[0] == '-') {
    str1.erase(0, 1);
    b1 = false;
    }
    if(str2[0] == '-') {
    str2.erase(0, 1);
    b2 = false;
    }
    }

    void equalize(string &num1, string &num2)
    {
    int n1l = num1.length();
    int n2l = num2.length();
    if(n1l < n2l)
    num1.insert(0, n2l - n1l, '0');
    if(n1l > n2l)
    num2.insert(0, n1l - n2l, '0');
    }

    string strAdd(string &num1, string &num2, bool neg = false)
    {
    const char dif = 48;
    char sum, carry = 0;
    string result;
    equalize(num1, num2);

    for(int i = num1.length() - 1; i >= 0; --i) {
    sum = (num1[i] - dif) + (num2[i] - dif) + carry;
    carry = 0;
    if(sum > 9) {
    sum -= 10;
    carry = 1;
    }
    result.insert(0, 1, sum + dif);
    }
    if(carry != 0)
    result.insert(0, 1, '1');
    if(neg)
    result.insert(0, 1, '-');
    return result;
    }

    string strSubtract(string &num1, string &num2)
    {
    bool neg = false;
    string min, max;
    equalize(num1, num2);

    if(num1 < num2) {
    min = num1;
    max = num2;
    neg = true;
    }
    else {
    max = num1;
    min = num2;
    }
    const char dif = 48;
    string result;
    int i;

    for(i = max.length() - 1; i >= 0; --i) {
    char x = max[i] - dif;
    char n = min[i] - dif;
    if(x < n) {
    x += 10;
    --max[i - 1];
    }
    result.insert(0, 1, x - n + dif);
    }
    for(i = 0; i < result.length() - 1 && result[i] == '0'; ++i);
    result.erase(0, i);

    if(neg)
    result.insert(0, 1, '-');
    return result;
    }

    string strMultiply(string &num, char mul)
    {
    const char dif = 48;
    int carry = 0;
    string result;
    mul -= dif;

    for(int i = num.length() - 1; i >= 0; --i) {
    int res = mul * (num[i] - dif) + carry;
    carry = res / 10;
    result.insert(0, 1, res % 10 + dif);
    }
    if(carry != 0)
    result.insert(0, 1, carry + dif);
    return result;
    }
    };

    istream& operator >>(istream &stream, Bignum &bnum)
    {
    stream >> bnum.getNum();
    return stream;
    }

    ostream& operator <<(ostream &stream, const Bignum &bnum)
    {
    stream << bnum.getNum();
    return stream;
    }

    int main()
    {
    Bignum num1, num2, num3, num4;
    cin >> num1 >> num2;

    cout << "Toplamı: " << num1 + num2 << endl;
    cout << "Farkı: " << num1 - num2 << endl;
    cout << "Çarpımı: " << num1 * num2 << endl;

    cout << "2 tane daha!" << endl;
    cin >> num3 >> num4;
    cout << "Karışık: " << num1 - num2 * num3 + num4 << endl;

    // Faktoryel----------------------------
    int sayi, i = 0;
    cout << "Faktoryeli alınacak sayı: ";
    cin >> sayi;

    Bignum fakt = 1;
    while(++i < sayi)
    fakt = fakt * Bignum(i + 1);

    cout << "Sonuç: " << fakt << endl;

    return 0;
    }

    Faktoryel çıktısı: 100!
    Sonuç: 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286
    253697920827223758251185210916864000000000000000000000000



    < Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 2 Nisan 2013; 22:17:44 >




  • quote:

    Orijinalden alıntı: elektro_gadget

    Ödev ne alemde bitirdin mi? Benim de ilgimi çekti uğraştım karaladım bişeyler. Elle yapılan hesap tekniğinde + - * işlemleri yapıyor. Negatif sayıları da alıyor. Bölme yok ama o fazla karmaşık.
    Dil c++ ama algoritma konusunda takıldıysan yardımcı olabilir.

     
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <vector>
    using namespace std;

    class Bignum
    {
    public:
    Bignum() { }
    Bignum(string &str)
    {
    mnum = str;
    }

    Bignum(long num)
    {
    stringstream sstr;
    sstr << num;
    mnum = sstr.str();
    }

    Bignum operator +(const Bignum &_other)
    {
    string num = mnum, other = _other.mnum;
    bool num_pos, other_pos;
    removeSign(num, other, num_pos, other_pos);

    string result;
    if(num_pos && other_pos)
    result = strAdd(num, other);

    else if(!num_pos && !other_pos)
    result = strAdd(num, other, true);

    else if(num_pos)
    result = strSubtract(num, other);
    else
    result = strSubtract(other, num);

    return Bignum(result);
    }

    Bignum operator -(const Bignum &_other)
    {
    string num = mnum, other = _other.mnum;
    bool num_pos, other_pos;
    removeSign(num, other, num_pos, other_pos);

    string result;
    if(num_pos && other_pos)
    result = strSubtract(num, other);

    else if(!num_pos && !other_pos)
    result = strSubtract(other, num);

    else if(num_pos)
    result = strAdd(num, other);
    else
    result = strAdd(num, other, true);

    return Bignum(result);
    }

    Bignum operator *(const Bignum &_other)
    {
    string num = mnum, other = _other.mnum;
    bool num_pos, other_pos;
    removeSign(num, other, num_pos, other_pos);

    string min, max;
    if(num.length() < other.length()) {
    min = num;
    max = other;
    }
    else {
    max = num;
    min = other;
    }
    vector<string> strarray;
    int biggest = 0;

    int length = min.length() - 1;
    for(int i = length; i >= 0; --i) {
    string res = strMultiply(max, min[i]).append(length - i, '0');

    if(res.length() > biggest)
    biggest = res.length();
    strarray.push_back(res);
    }
    for(int i = 0; i < strarray.size(); ++i)
    strarray[i].insert(0, biggest - strarray[i].length(), '0');

    string result = strarray[0];
    for(int i = 1; i < strarray.size(); ++i) {
    result = strAdd(result, strarray[i]);
    }
    if(num_pos != other_pos)
    result.insert(0, 1, '-');

    return Bignum(result);
    }

    string& getNum()
    {
    return mnum;
    }

    const string& getNum() const
    {
    return mnum;
    }

    private:
    string mnum;

    void removeSign(string &str1, string &str2, bool &b1, bool &b2)
    {
    b1 = b2 = true;
    if(str1[0] == '-') {
    str1.erase(0, 1);
    b1 = false;
    }
    if(str2[0] == '-') {
    str2.erase(0, 1);
    b2 = false;
    }
    }

    void equalize(string &num1, string &num2)
    {
    int n1l = num1.length();
    int n2l = num2.length();
    if(n1l < n2l)
    num1.insert(0, n2l - n1l, '0');
    if(n1l > n2l)
    num2.insert(0, n1l - n2l, '0');
    }

    string strAdd(string &num1, string &num2, bool neg = false)
    {
    const char dif = 48;
    char sum, carry = 0;
    string result;
    equalize(num1, num2);

    for(int i = num1.length() - 1; i >= 0; --i) {
    sum = (num1[i] - dif) + (num2[i] - dif) + carry;
    carry = 0;
    if(sum > 9) {
    sum -= 10;
    carry = 1;
    }
    result.insert(0, 1, sum + dif);
    }
    if(carry != 0)
    result.insert(0, 1, '1');
    if(neg)
    result.insert(0, 1, '-');
    return result;
    }

    string strSubtract(string &num1, string &num2)
    {
    bool neg = false;
    string min, max;
    equalize(num1, num2);

    if(num1 < num2) {
    min = num1;
    max = num2;
    neg = true;
    }
    else {
    max = num1;
    min = num2;
    }
    const char dif = 48;
    string result;
    int i;

    for(i = max.length() - 1; i >= 0; --i) {
    char x = max[i] - dif;
    char n = min[i] - dif;
    if(x < n) {
    x += 10;
    --max[i - 1];
    }
    result.insert(0, 1, x - n + dif);
    }
    for(i = 0; i < result.length() - 1 && result[i] == '0'; ++i);
    result.erase(0, i);

    if(neg)
    result.insert(0, 1, '-');
    return result;
    }

    string strMultiply(string &num, char mul)
    {
    const char dif = 48;
    int carry = 0;
    string result;
    mul -= dif;

    for(int i = num.length() - 1; i >= 0; --i) {
    int res = mul * (num[i] - dif) + carry;
    carry = res / 10;
    result.insert(0, 1, res % 10 + dif);
    }
    if(carry != 0)
    result.insert(0, 1, carry + dif);
    return result;
    }
    };

    istream& operator >>(istream &stream, Bignum &bnum)
    {
    stream >> bnum.getNum();
    return stream;
    }

    ostream& operator <<(ostream &stream, const Bignum &bnum)
    {
    stream << bnum.getNum();
    return stream;
    }

    int main()
    {
    Bignum num1, num2, num3, num4;
    cin >> num1 >> num2;

    cout << "Toplamı: " << num1 + num2 << endl;
    cout << "Farkı: " << num1 - num2 << endl;
    cout << "Çarpımı: " << num1 * num2 << endl;

    cout << "2 tane daha!" << endl;
    cin >> num3 >> num4;
    cout << "Karışık: " << num1 - num2 * num3 + num4 << endl;

    // Faktoryel----------------------------
    int sayi, i = 0;
    cout << "Faktoryeli alınacak sayı: ";
    cin >> sayi;

    Bignum fakt = 1;
    while(++i < sayi)
    fakt = fakt * Bignum(i + 1);

    cout << "Sonuç: " << fakt << endl;

    return 0;
    }

    Faktoryel çıktısı: 100!
    Sonuç: 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286
    253697920827223758251185210916864000000000000000000000000

    Hocam eyvallah ödev tam bitmedi bir iki rötuşu kaldı. Bu koda bakarak umarım o ufak hatalarıda halledebilirim . Ufak bir sorum daha vardı. Bigint kullanarak küsüratlı bir bölme nasıl yapabilirim? Yani mesela işlem 5/2. Ama sonuç 2 geliyor. Bu arada sayılar yine sınırsız o yüzden önce çevirip sonra işlem yap taktiği yemez.




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.