Çözüldü C++'ta ASCII değeri düzelmiyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

RSK06

Hectopat
Katılım
29 Aralık 2020
Mesajlar
2.285
Çözümler
4
Daha fazla  
Cinsiyet
Erkek
C++:
for (int j = digits; j >= 0; j-=2){

 int h = card_number.at(j) - '0';
 sum2 += h % 10 + ( h / 10 );
 }
 cout << endl;
 cout << "Sum2 = " << sum2 - 48 << endl;
}

Burada normalde - '0' olunca düzelmesini bekliyordum fakat - 48 yapmadan düzgün bir değer alamadım bunun sebebi nedir?
@Vavien.
 
Son düzenleme:
Çözüm
Visual Studio bu kodu çalıştırınca ne yapıyor biliyor musun? İlklendirmediğin değişkeni yazdırıyorsun diyor. Kaç kere dedim değişkenleri ilklendir diye. İlk değeri sıfır olmayan toplamı toplasan ne yazar?
İlk değerlerini sıfır verip senin meşhur -48'ini silince düzgünce çalışıyor bence.

C++ tavsiyeleri:
  • = ile değişken tanımlama çünkü özellikle nesnelerde kopyalama yapıyor ve bunu çoğu zaman aslında istemiyorsun. Uniform initialization dediğimiz, "{}" ile atama bu yüzden geldi. Hem bir standart, hem de birçok karışıklığın önüne geçiyor.
  • Döngü içinde değişken tanımlama çünkü döngüler scope'tur. Compiler muhtemelen onu her dönüşte silip tekrar oluşturmayacak kadar akıllıdır ama yazdığın kod öyle yapmasını söylüyor.
  • .at kullanma diye demiştim.
  • Bazı yerlerde sadece boşa endl kullanmışsın. Çıktıya bakınca onlarsız da gayet güzel bence.
Bunlar benim tavsiyelerim. Uyup uymamak sana kalmış.
Kodun tamamını at. car_number'ın ne olduğunu ben mi tahminedeceğim?

Öncelikle o programı ben böyle yazardım. Duruma göre stringin tersini alman gerekebilir. Azaltmaktansa artırmayı tercih ederim.
Kod:
#include <iostream>
#include <string>

int main() {
    std::string input{"4003600000000014"};
    auto result{ 0 };

    for (auto i{ 1 }; i < input.size(); i += 2) {
        result += input[i] - '0';
    }

    result *= 2;

    std::cout << "result: " << result << std::endl;

    return 0;
}

.at metodu okunurluğu zorlaştırıyor bence. Programında hata olmadığından emin isen kullanma. Index değerinden emin değilsen hata tespiti için kullanabilirsin.

Tüm kodu görmeden bir şey diyemem.
Ve bu kaçıncı söyleyişim. Kod paylaşırken yazım denetimi kullanma. Ya da kodu onu kullandıktan sonra ekle. Bir daha girintisi düzgün olmayan kod gördüğümde uğraşmayacağım.
Bence bu kod çalışıyor.
Kod:
#include <iostream>
#include <string>

int main() {
    std::string card_number{"4003600000000014"};
    int sum2 = 0;

    for (int j = card_number.size() - 1; j >= 0; j -= 2) {

        int h = card_number.at(j) - '0';
        sum2 += h % 10 + (h / 10);
    }
    std::cout << std::endl;
    std::cout << "Sum2 = " << sum2 << std::endl;

    return 0;
}
 
Son düzenleme:
Kodun tamamını at. car_number'ın ne olduğunu ben mi tahminedeceğim?

Öncelikle o programı ben böyle yazardım. Duruma göre stringin tersini alman gerekebilir. Azaltmaktansa artırmayı tercih ederim.
Kod:
#include <iostream>
#include <string>

int main() {
    std::string input{"4003600000000014"};
    auto result{ 0 };

    for (auto i{ 1 }; i < input.size(); i += 2) {
        result += input[i] - '0';
    }

    result *= 2;

    std::cout << "result: " << result << std::endl;

    return 0;
}

.at metodu okunurluğu zorlaştırıyor bence. Programında hata olmadığından emin isen kullanma. Index değerinden emin değilsen hata tespiti için kullanabilirsin.

Tüm kodu görmeden bir şey diyemem.
Ve bu kaçıncı söyleyişim. Kod paylaşırken yazım denetimi kullanma. Ya da kodu onu kullandıktan sonra ekle. Bir daha girintisi düzgün olmayan kod gördüğümde uğraşmayacağım.
Bence bu kod çalışıyor.
Kod:
#include <iostream>
#include <string>

int main() {
    std::string card_number{"4003600000000014"};
    int sum2 = 0;

    for (int j = card_number.size() - 1; j >= 0; j -= 2) {

        int h = card_number.at(j) - '0';
        sum2 += h % 10 + (h / 10);
    }
    std::cout << std::endl;
    std::cout << "Sum2 = " << sum2 << std::endl;

    return 0;
}
C++:
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string card_number;
    cin >> card_number;
    int digits = card_number.length() - 1;
    int sum1;
    int sum2;
    /*Multiply every other digit by 2, starting with the number’s
second-to-last digit and then add those products’ digits together. */
    for (int i = digits - 1; i >= 0; i -= 2 ) {
 
        int d = card_number.at(i) - '0';
        sum1 += d * 2 % 10 + ( d * 2 / 10);
    }
    cout << endl;
    cout << "Sum1 = " << sum1 << endl;
    cout << endl;
    // Add the sum to the sum of the digits that weren’t multiplied by 2.
    for (int j = digits; j >= 0; j-=2){

        int h = card_number.at(j) - '0';
        sum2 += h % 10 + ( h / 10 );
    }
    cout << endl;
    cout << "Sum2 = " << sum2 - 48 << endl;
}
Bu şekilde yapınca çalışıyor fakat burada cout << "sum2 = " << sum2 - 48 << endl; - 48 yapmadan düzgün değer vermiyor sebebini anlamadım.
Kodun tamamını at. Car_number'ın ne olduğunu ben mi tahminedeceğim?

Öncelikle o programı ben böyle yazardım. Duruma göre stringin tersini alman gerekebilir. Azaltmaktansa artırmayı tercih ederim.
Kod:
#include <iostream>
#include <string>

int main() {
 std::string input{"4003600000000014"};
 auto result{ 0 };

 for (auto i{ 1 }; i < input.size(); i += 2) {
 result += input[i] - '0';
 }

 result *= 2;

 std::cout << "result: " << result << std::endl;

 return 0;
}

At metodu okunurluğu zorlaştırıyor bence. Programında hata olmadığından emin isen kullanma. Index değerinden emin değilsen hata tespiti için kullanabilirsin.

Tüm kodu görmeden bir şey diyemem.
Ve bu kaçıncı söyleyişim. Kod paylaşırken yazım denetimi kullanma. Ya da kodu onu kullandıktan sonra ekle. Bir daha girintisi düzgün olmayan kod gördüğümde uğraşmayacağım.
Bence bu kod çalışıyor.
Kod:
#include <iostream>
#include <string>

int main() {
 std::string card_number{"4003600000000014"};
 int sum2 = 0;

 for (int j = card_number.size() - 1; j >= 0; j -= 2) {

 int h = card_number.at(j) - '0';
 sum2 += h % 10 + (h / 10);
 }
 std::cout << std::endl;
 std::cout << "Sum2 = " << sum2 << std::endl;

 return 0;
}

Problemi soran kişi sondan 2. yerden başla dediği için o şekilde yaptım.
 
Visual Studio bu kodu çalıştırınca ne yapıyor biliyor musun? İlklendirmediğin değişkeni yazdırıyorsun diyor. Kaç kere dedim değişkenleri ilklendir diye. İlk değeri sıfır olmayan toplamı toplasan ne yazar?
İlk değerlerini sıfır verip senin meşhur -48'ini silince düzgünce çalışıyor bence.

C++ tavsiyeleri:
  • = ile değişken tanımlama çünkü özellikle nesnelerde kopyalama yapıyor ve bunu çoğu zaman aslında istemiyorsun. Uniform initialization dediğimiz, "{}" ile atama bu yüzden geldi. Hem bir standart, hem de birçok karışıklığın önüne geçiyor.
  • Döngü içinde değişken tanımlama çünkü döngüler scope'tur. Compiler muhtemelen onu her dönüşte silip tekrar oluşturmayacak kadar akıllıdır ama yazdığın kod öyle yapmasını söylüyor.
  • .at kullanma diye demiştim.
  • Bazı yerlerde sadece boşa endl kullanmışsın. Çıktıya bakınca onlarsız da gayet güzel bence.
Bunlar benim tavsiyelerim. Uyup uymamak sana kalmış.
 
Çözüm
İlk 0 değerini verince düzeldi, tavsiyeleriniz için teşekkür ederim. Bu ilklendirmede dediğiniz aklıma gelse boşa zaman kaybetmezdim. Neyse, artık unutmam herhalde. Yine çok yardımcı oldunuz, teşekkürler.
 

Geri
Yukarı