【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;
}
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