Code dịch chuyển kí tự trong xâu bị sai

Đề bài: nhập vào kí tự c trong khoảng a-z và số n, dịch chuyển kí tự c đi n đơn vị, nếu gặp ‘z’ thì quay lại tại ‘a’.

Mình test thử với ‘y’ và 12 thì nó sai, các cao nhân chỉ giáo

#include<iostream>
using namespace std;
int main(){
    char c, t;
    int k;
    cin >> c >> k;
    t=c;
    t=char(t+k);
    while(t>'z')
        t=char(t-26);
    c=t;
    cout << c;
}

lỗi này hay nè
bạn hãy thêm 2 dòng sau vào code trước vòng while để thử xem

// thử với các cặp, (y, 0) (y, 1) (y, 2), (y, 12)
// xem có đúng như bạn nghĩ hay không
cout<<"is bigger: "<<(t > 'z')<<endl;
cout<<"is smaller: "<<(t < 'z')<<endl;

nếu bạn thấy bất thường (so với phỏng đoán của bạn), bạn hãy thử giá trị char thành kiểu số tương ứng xem có gì hay ho không

2 Likes

Ảnh chụp màn hình 2021-12-29 094022
đề bài đây bạn, mình thử với các kí tự khác thì được nhưng với một số cái nó lại không được, không hiểu tại sao

ý tưởng của bạn đúng, code của bạn đúng với ý tưởng của bạn, nhưng chạy bị sai là do bạn chưa hiểu rõ về kiểu char
mình có gửi bạn mấy dòng code để bạn thêm vô và test, bạn hãy thử

4 Likes

nhưng bạn chỉ cho mình 2 dòng cout thôi mà, ý mình là nếu đúng thì khi mình cho test case là ‘y’ và 12 thì nó sẽ ra là ‘k’ ấy bạn

Bạn cộng như thế thì sẽ bị tràn : D. Bạn nên lưu “giá trị số” của kí tự vào một biến có kích cỡ rộng hơn. Int chẳng hạn.

Biến t của bạn: -123 nên while không thể chạy.

char c;
int k, t_temp;
cin >> c >> k;
t_temp = c;
t_temp = t_temp + k;
while (t_temp > 'z')
{
	t_temp = t_temp - 26;
}
c = (char)t_temp;
cout << c;
4 Likes

cảm ơn bạn nhe, mình quên mất điều đó :Đ

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