0021. 回文の判定(C言語)

戻る

palin.cのソースコード】


/*
 * 回文を判定するプログラム
 * palin.c(palindrome)
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* strlen() */

#define BUF_SIZE 256





/*
 * 自作のbool型の定義
 */
typedef enum {
    false, /* 0 */
    true   /* 1 */
} bool;





/*
 * ユーザー定義関数の関数原型宣言
 */
void print_title(void);
void select_je(void);
void input_str(void);
void judge(void);
bool is_palin_j(char s[]);
bool is_palin_e(char s[]);
bool retry(void);





/*
 * グローバル変数
 */
char je, str0[BUF_SIZE];




/*
 * メイン関数
 */
int main(void)
{
    while (1) {
        /* 表題の表示 */
        print_title();
        
        /* 和文か英文かの選択 */
        select_je();
        
        /* 文(文字列)の入力 */
        input_str();
        
        /* 回文かどうかの判定および表示 */
        judge();
        
        /* 操作を続けるかどうかの選択 */
        if (!retry())
            break;
    }
    
    return EXIT_SUCCESS;
}



/*
 * 表題を表示する関数
 */
void print_title(void)
{
    printf("【回文の判定】\n");
    printf("入力された文字列(和文または英文)が");
    printf("回文かどうかを判定します。\n\n");
}



/*
 * 和文か英文かを選択する関数
 */
void select_je(void)
{
    char buf[BUF_SIZE], zz;
    
    while (1) {
        printf("和文(全角文字の列)か英文(半角文字の列)かを入力してください。\n");
        printf("和文(全角文字の列)ならj、英文(半角文字の列)ならe: ");
        
        fgets(buf, sizeof buf, stdin);
        sscanf(buf, "%c%c", &je, &zz);
        
        if (((je != 'j') && (je != 'J') &&
         (je != 'e') && (je != 'E')) || (zz != '\n')) {
            printf("無効な入力です。\n");
            printf("jまたはeを入力してください。\n");
            continue;
        } else
            break;
    }
}



/*
 * 文字列を入力する関数
 */
void input_str(void)
{
    switch (je) {
    case 'j':
    case 'J':
        printf("\n和文(全角文字の列)を入力してください。\n");
        
        fgets(str0, sizeof str0, stdin);
        str0[strlen(str0) - 1] = '\0';
        break;
    case 'e':
    case 'E':
        printf("\n英文(半角文字の列)を入力してください。\n");
        
        fgets(str0, sizeof str0, stdin);
        str0[strlen(str0) - 1] = '\0';
        break;
    default:
        break;
    }
}



/*
 * 回文かどうかを判定し、表示する関数
 * is_palin_j()関数またはis_palin_e()関数を使用する。
 */
void judge(void)
{
    switch (je) {
    case 'j':
    case 'J':
        if (is_palin_j(str0))
            printf("「%s」は回文です。\n", str0);
        else
            printf("「%s」は回文ではありません。\n", str0);
        break;
    case 'e':
    case 'E':
        if (is_palin_e(str0))
            printf("\"%s\"は回文です。\n", str0);
        else
            printf("\"%s\"は回文ではありません。\n", str0);
        break;
    default:
        break;
    }
}



/*
 * 和文(全角文字の列)が回文かどうかを判定する関数
 */
bool is_palin_j(char s[])
{
    int i, j;
    
    i = 0; j = strlen(s) - 2;
    while (i < j && s[i] == s[j] && s[i + 1] == s[j + 1]) {
        i += 2; j -= 2;
    }
    return i >= j;
}



/*
 * 英文(半角文字の列)が回文かどうかを判定する関数
 */
bool is_palin_e(char s[])
{
    int i, j;
    
    i = 0; j = strlen(s) - 1;
    while (i < j && s[i] == s[j]) {
        i++; j--;
    }
    return i >= j;
}



/*
 * 操作を続けるかどうかを選択する関数
 * true: 繰り返す、false: 終了する。
 */
bool retry(void)
{
    bool ret;
    char buf[BUF_SIZE], ch, zz;
    
    while (1) {
        printf("\n続けますか?(Yes・・・y/No・・・n) ");
        
        fgets(buf, sizeof buf, stdin);
        sscanf(buf, "%c%c", &ch, &zz);
        
        if (((ch == 'y') || (ch == 'Y')) && (zz == '\n')) {
            printf("\n+++++\n\n");
            ret = true;
            break;
        } else {
            ret = false;
            break;
        }
        printf("無効な入力です。\n");
        printf("yまたはnを入力してください。\n");
    }
    
    return ret;
}


palinの実行結果】赤字はユーザによる入力を表す。

C:\Users\skonishiDocuments>palin
【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
なまはげはまな
「なまはげはまな」は回文です。          ←「ナマハゲはマナ」は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
なかはかな
「なかはかな」は回文です。              ←「中はカナ」は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
かとりとか
「かとりとか」は回文です。              ←「香取とか」は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
なかいかな
「なかいかな」は回文です。              ←「中居かな」は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
いながきにきがない
「いながきにきがない」は回文です。      ←「稲垣に気がない」は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
いなもとをともない
「いなもとをともない」は回文です。      ←「稲本を伴い」は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
どうなろうとだとうろなうど
「どうなろうとだとうろなうど」は回文です。   ←「どうなろうと打倒ロナウド」は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: e

英文(半角文字の列)を入力してください。
madamimadam
"madamimadam"は回文です。               ←"Madam, I'm Adam"は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: e

英文(半角文字の列)を入力してください。
madam
"madam"は回文です。                     ←"Madam"は回文。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: j

和文(全角文字の列)を入力してください。
かとり
「かとり」は回文ではありません。        ←「香取」は回文ではない。

続けますか?(Yes・・・y/No・・・n) y

+++++

【回文の判定】
入力された文字列(和文または英文)が回文かどうかを判定します。

和文(全角文字の列)か英文(半角文字の列)かを入力してください。
和文(全角文字の列)ならj、英文(半角文字の列)ならe: e

英文(半角文字の列)を入力してください。
hello
"hello"は回文ではありません。           ←"Hello"は回文ではない。

続けますか?(Yes・・・y/No・・・n) n


【参考文献】
・玉井浩、「新・演習と応用 プログラミング言語=1 演習と応用C」、(株)サイエンス社・1999年発行。
戻る