Hỏi về bài toán decipher chuyển chuỗi thập phân thành chuỗi kí tự tương ứng

Em đang tự luyện tập trong mùa Tết nên đây không phải là hỏi bài tập đâu ạ.
Em muốn hỏi xem thuật toán của mình có gì sai, vì sao chương trình không chạy được ạ?

Đề bài như sau: Cho một chuỗi đã được mã hóa (viết dưới dạng số thập phân), hãy trả về chuỗi ban đầu nếu biết rằng nó chỉ bao gồm các chữ cái thường. Dùng theo bảng mã ASCII
Ví dụ: chuỗi số “10197115121” thì sẽ tương ứng với “easy”.

Đoạn code của em:

string decipher(string cipher) {
    int j=0;
    size_t i=0;
    string res;
    while (i<cipher.size()) {
        string s;
        if (cipher[i]=='9'){
            s[0]=cipher[i];
            s[1]=cipher[i+1];
            i+=2;
            stringstream k(s);
            int x;
            k >> x;
            res[j]=(char)(x);
        } else if (cipher[i]=='1') {
            s[0]=cipher[i];
            s[1]=cipher[i+1];
            s[2]=cipher[i+2];
            i+=3;
            stringstream k(s);
            int x;
            k >> x;
            res[j]=(char)(x);
        }
        j++;
    }
    return res;
}
2 Likes

Theo bạn, thuật toán là gì

5 Likes

Mình thấy bạn làm đúng hướng rồi.

“Chương trình không chạy được”.
Câu bao quát và đầy đủ… nghĩa.

6 Likes

Nói dễ hiểu là: ví dụ với chuỗi “10197115121” thì mình đang cố tách chúng nó ra và đưa về mảng các số nguyên gồm các phần từ {101, 97, 115, 121} á.

1 Like

…vô nghĩa là sao bạn

1 Like

Code không chạy được thì thuật với chả toán
Đúng là câu hỏi vô nghĩa còn gì
Bạn nên xem lại cách học khi đặt câu hỏi như vậy
Code không chạy được thì xem báo lỗi gì, search lỗi đó. Search Google cũng là 1 kĩ năng học tập
Làm được bao nhiêu bài tập không quan trọng, quan trọng là trải nghiệm và học cách giải quyết những vấn đề gặp phải trong lúc làm bài

7 Likes

Vô nghĩa vì bạn chỉ nói chung chung là không chạy. Thế thì có bất kìa điều gì để bạn biết nó không chạy?

  • Lúc biên dịch thì có thông báo đỏ? Hãy đưa chi tiết thông báo đó cho bọn mình.
  • Biên dịch thành công nhưng không thấy cửa sổ Console hiện lên.
  • Biên dịch và cửa sổ hiện lên, nhưng:
    • Không hiện thông báo nhập liệu.
    • Nhập được nhưng kết quả không hiển thị.
    • Nhập được nhưng kết quả sai.
  • Và có thể còn nhiều nữa.

Câu “chương trình không chạy được” bao quát vậy đấy.
Hãy chỉ rõ và chi tiết nhất có thể về vấn đề mà bạn gặp phải.

7 Likes

Hm, cái này khó đấy cậu. Sao cậu biết 11111111111 là {111, 11, 111, 111} hay {11, 111, 111, 111}? :smile:

Thuật toán của cậu đưa ra là:

  • Nếu chữ số tiếp theo là 9, cậu sẽ tách 2 chữ số để lấy thành số
  • Nếu chữ số tiếp theo là 1, cậu sẽ tách 3 chữ số để lấy thành số

Tớ không thấy thuyết phục lắm đâu. ASCII 65 cũng là ký tự valid mà?

Ngoài ra:

stringstream k(s);
int x;
k >> x;
res[j]=(char)(x);

Tớ không rõ CPP lắm, cơ mà k(s) có vẻ không phải cách để cậu convert chuỗi ký tự sang stringstream, và k >> x có nghĩa là cậu dịch k (vốn là stringstream?) sang trái x bit (với x chưa được xác định giá trị).
Tớ không nghĩ method này compile được đâu.

Cậu thử kiểm tra lại xem. Nhớ đọc kỹ góp ý của các bạn ở trên nhé! “Chương trình không chạy được” không phải là câu hợp lệ để mô tả lỗi khi cậu đi làm đâu :smile:

4 Likes

Từ các chữ số thành 1 con số thập phân thì làm ntn :smiley: kì thực char cũng là số thôi.

1 Like

oh mình cảm ơn bạn nhé, mình sẽ rút kinh nghiệm

1 Like

hic, cảm ơn góp ý của cậu nhé, mình sẽ rút kinh nghiệm

Các chữ cái thường là từ 97 tới 122, nên không có exception với nhiều case đâu. Có 2 trường hợp thôi: nếu chữ tiếp theo là 9 thì lấy 2 char, nếu là 1 thì lấy 3 char.
Xong convert qua string thôi.

5 Likes

Oh, tớ miss đoạn chữ cái thường :sweat_smile:
Vậy thì thuật toán đó nên đúng rồi.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?