编写程序:检查读入的信息中从左到右的字母和从右到左的字母是否完全一样

5. (a)编写程序,用来读一条消息,然后检查这条消息是否是回文(信息中从左到右的字母和从右到左

的字母完全一样),示例如下 :

Enter a message: He lived as a devil, eh?

Palindrome

Enter a message: Madam, I am Adam.

Not a palindrome

忽略所有不是字母的字符。用整型变量来跟踪数组内的位置。

(b)修改上述程序,使用指针来代替整数跟踪数组的位置。

(a)程序如下所示:

#include <stdio.h>
#define N 100

main(){
    char a[N], b[N];
    int i, j, num = 0, num1 = 0;
    
    printf("Enter a message:");    
    for(i = 0; i < N; i++){
        a[i] = getchar();        
        if(a[i] == '\n') break;
        if(a[i] >= 'a' && a[i] <= 'z')   /* 把小写字母转换为大写以便于判断 */
            a[i] = a[i] - 'a' + 'A';
        num++;
    }    
    
    for(i = 0, j = 0; i < num; i++){    /* 把字母存进另一个数组 */
        if(a[i] >= 'A' && a[i] <= 'Z'){
            b[j++] = a[i];
            num1++;
        }                
    }

    for(j = 0; j < num1; j++) {
        if (b[j] != b[num1 - j - 1]) {
            printf("Not a palindrome");
            return 0;
        }
    }
    printf("Palindrome");    
    
    return 0;    
}

运行结果:

(b)修改后的程序如下所示:

#include <stdio.h>
#define N 100

main(){
    char a[N], b[N], *p, *q, *m, *n;
    
    printf("Enter a message:");    
    for(p = &a[0]; p < &a[N]; p++){
        *p = getchar();        
        if(*p == '\n') break;
        if(*p >= 'a' && *p <= 'z')   /* 把小写字母转换为大写以便于判断 */
            *p = *p - 'a' + 'A';
    }    
    
    for(n = &a[0], q = &b[0]; n < p; n++){    /* 把字母存进另一个数组 */
        if(*n >= 'A' && *n <= 'Z'){
            *q++ = *n;
        }                
    }

    for(m = &b[0], q = q - 1; m <= q; m++, q--) {     /* 用q = q - 1 是为了去掉换行符 */
        if (*m != *q) {
            printf("Not a palindrome");
            return 0;
        }
    }
    printf("Palindrome");    
    
    return 0;    
}

经验证程序无误。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值