C言語関係掲示板

過去ログ

No.127.ひらがなの入力


No.729

初歩的な質問で恐縮ですが・・
投稿者---サクヤン(2001/12/25 16:28:45)


はじめまして、C言語初心者のサクヤンと申します。
早速質問なんですが、ひらがなをgetcharやscanfで入力してprintfで
出力してみたのですが上手く行きません。
変数の型が悪いのでしょうか?
お答えいただければ幸いです。


No.730

Re:初歩的な質問で恐縮ですが・・
投稿者---ともじ(2001/12/25 17:08:42)


サクヤンさん、こんにちは。

>早速質問なんですが、ひらがなをgetcharやscanfで入力してprintfで
>出力してみたのですが上手く行きません。

ひらがなは、2バイトなので文字列として扱います。
ですから、gets関数かscanf関数の%s書式指定でchar型の配列に格納
するようになります。
なお、gets関数やscanf関数については、過去ログに指摘されている
ように、バッファがあふれるという問題点もありますので、ご注意ください。


No.759

解答ありがとうございます。
投稿者---サクヤン(2002/01/08 15:52:49)


ともじさん、解答ありがとうございます。
今日から学校が開いたので早速試してみます。


No.794

スミマセン また初歩的な質問です。
投稿者---サクヤン(2002/01/11 20:17:20)


先日は解答いただきありがとうございました。
また詰まってしまったので書き込みさせていただきます。
50字以内のひらがなを入力して配列に入力していき、
そのつど表示するプログラムの1文字目の判定の部分なのですが
うまく動きません。
どこがまずいのか、ご指摘いただければ幸いです。

#include<stdio.h>
char hiretu[100];
char h[2];
main()
{
int min,max,n,i;
printf("\n 50字以内のひらがなが入力できます。\n");
do{
printf("\n ひらがなを入力してください=");
scanf("%s",&h);

}while('あ'>h && 'ん'<h);

hiretu[0]=h;
printf("%c\n",hiretu[0]);

No.803

Re:スミマセン また初歩的な質問です。
投稿者---ともじ(2002/01/12 00:35:33)


こんばんは。

>50字以内のひらがなを入力して配列に入力していき、
>そのつど表示するプログラムの1文字目の判定の部分なのですが
>うまく動きません。
>どこがまずいのか、ご指摘いただければ幸いです。

ひらがなはあくまでも「文字列」として扱います。

#include <stdio.h>
#include <string.h> /* 追加 */
/* char hiretu[100];    */
/* char h[2]; */
char hiretu[128] = "";  /* NUL文字列で初期化 */
char h[128];            /* 文字入力用のエリアは大きめに確保 */

void main(void)
{
        int min,max,n,i;
        printf("\n 50字以内のひらがなが入力できます。\n");
        do{
                printf("\n ひらがなを入力してください=");
/*              scanf("%s",&h); */
                scanf("%s",h);  /* 配列に文字列を入力する場合は&は不要 */
                
                strcat(hiretu,h);       /* 文字列の連結 */


/*      }while('あ'>h && 'ん'<h);       */
/*  ひらがなの比較はstrcmpで */
        }while(strcmp(h,"あ")>=0 && strcmp(h,"ん")<=0);

/*      hiretu[0]=h; */
/*      printf("%c\n",hiretu[0]);       */
/* ひらがなはあくまでも文字列   */
        printf("%s\n",hiretu);

}


この例では、ひらがな以外に入力した文字もhiretuにコピーして
しまうので、do〜whileではなくwhileを用いた方がいいですね。



No.825

Re:またまた質問です。
投稿者---サクヤン(2002/01/12 20:19:00)


先日の部分に加え入力した文字を
バイナリーソートで並び替えて表示する部分を
自分なりに考えたのですが例のごとくうまく動きません。
どうか助けてやってください。
もっと勉強しないといけないと痛切に感じました。

#include<stdio.h>
#include<string.h>
char hiretu[128]="";
char h[128];
void main(void)
{
int min,max,n,m=0,i;
h[0]=0;
printf("\n 50字以内のひらがなが入力できます。ファイルの終わりは CTAL+z です。\n");
while(strcmp(h,"あ")<=0 && strcmp(h,"ん")>=0);
{
if(m!=0)
printf("\n入力エラーです。");
printf("\n ひらがなを入力してください=");
scanf("%s",h);
strcat(hiretu,h);
if(strcmp(h,"あ")<=0 && strcmp(h,"ん")>=0);
m=1;
}


n=1;
hiretu[0]=h;
printf("%s\n",hiretu);
while(n<99 && hiretu[n]!=EOF){
m=0;
while(strcmp(h,"あ")<=0 && strcmp(h,"ん")>=0);
{
if(m!=0)
printf("入力エラーです。");
printf("\n ひらがなを入力してください=");
scanf("%s",h);
strcat(hiretu,h);
if(strcmp(h,"あ")<=0 && strcmp(h,"ん")>=0);
m=1;
}

min=0;
max=n-1;
while(min <= max){
i=(min+max)/2;
if(h < hiretu[i])
max = i-1;
else if(h > hiretu[i])
min=i+1;
else
break;
}
if(min > max){
i=n++;
while(i > min){
hiretu[i]=hiretu[i-1];
--i;
}
hiretu[i]=h;
}
else
min=i;
for(i=0;i<n;i++){
if(min==i) printf("%c",hiretu[i]);

else printf("%c",hiretu[i]);
if(i%10+1==10) printf("\n");
}

printf("\n");
}
}



No.828

Re:またまた質問です。
投稿者---ともじ(2002/01/13 00:32:28)


こんばんは。

>先日の部分に加え入力した文字を
>バイナリーソートで並び替えて表示する部分を
>自分なりに考えたのですが例のごとくうまく動きません。
>どうか助けてやってください。

バイナリソートというのはどのようなアルゴリズムですか。
勉強不足でよくわかりません。
プログラム例は2分探索のような処理をしているようですが。

> while(strcmp(h,"あ")<=0 && strcmp(h,"ん")>=0);
> if(strcmp(h,"あ")<=0 && strcmp(h,"ん")>=0);

whileやifの後ろに;があると、;が一文と見なされ、
whileは;だけをループさせ、ifは;だけを実行してしまいます。
それから、この判断では、「"あ"以下、"ん"以上」つまり
「"あ"と"ん"以外のひらがなは不可」になりますが
いいのでしょうか。

サクヤンさんがやりたい処理は、「ひらがなを入力し、昇順に並び替える。」
でよろしいですか。

No.840

Re:またまた質問です。
投稿者---サクヤン(2002/01/15 17:45:59)


お手数掛けて申し訳ございません。

>バイナリソートというのはどのようなアルゴリズムですか。
>プログラム例は2分探索のような処理をしているようですが。
そうです。二分探索です。

>それから、この判断では、「"あ"以下、"ん"以上」つまり
>「"あ"と"ん"以外のひらがなは不可」になりますが
>いいのでしょうか。
ごめんなさい。”あ”から”ん”までの文字か判定したいのです。

>サクヤンさんがやりたい処理は、「ひらがなを入力し、昇順に並び替える。」
>でよろしいですか。
はい、そうです。
もう自分だけではどうにもならなくなってきました。
どうか、ご指導のほどを。



No.842

Re:またまた質問です。
投稿者---ともじ(2002/01/15 23:29:20)


こんばんは。

>>バイナリソートというのはどのようなアルゴリズムですか。
>>プログラム例は2分探索のような処理をしているようですが。
>そうです。二分探索です。

二分探索は「データをサーチ」するアルゴリズムで「ソート」ではありません。

>>サクヤンさんがやりたい処理は、「ひらがなを入力し、昇順に並び替える。」
>>でよろしいですか。
>はい、そうです。

以下に基本選択法というアルゴリズムで入力したひらがなを昇順に並び
替えるプログラムを提示してみます。
なお、ひらがなのシフトJISで一番小さいコードは"ぁ"なので、"ぁ"〜"ん"
まででひらがなを判定しています。それから途中で半角が入力された場合の
動作は保証しません。
サクヤンさんは初心者とのことですので、ポインタはあえて使っていません。


#include <stdio.h>
#include <string.h>
void main(void)
{
        int i,j,len,min,cnt=0;
        char hiragana[128] = "";        
        char work[128];

        /* ひらがなの入力 */
        printf("\n50字以内のひらがなが入力できます。\n");
        printf("ひらがな以外の文字を入力すると終了します。\n");
        while(1) {
                printf("\n ひらがなを入力してください=");
                scanf("%s",work);
                for (i=0; work[i]!='\0'; i+=2) {
                        /* ひらがなを格納 */
                        if (strcmp(&work[i],"ぁ")>=0 && strcmp(&work[i],"ん")<=0) {
                                strncat(&hiragana[cnt],&work[i],2);
                                cnt+=2;
                                /* 50文字以上で入力終了 */
                                if (cnt >= 100)
                                        goto NEXT;
                        }
                        /* ひらがな以外入力で入力終了 */
                        else
                                goto NEXT;
                }
        }

NEXT:
        len = strlen(hiragana);
        printf("%s %d\n",hiragana,len);
        /* 入力文字を昇順に並び替え */
        for (i=0; i<len-3; i+=2) {
                min = i;
                for (j=i+2; j<len-1; j+=2) {
                        if (strncmp(&hiragana[min],&hiragana[j],2)>0) {
                                /* 最大値の添え字を求める */
                                min = j;
                        }

                }
                /* 最大値を前に移動 */
                strncpy(work,&hiragana[i],2);
                strncpy(&hiragana[i],&hiragana[min],2);
                strncpy(&hiragana[min],work,2);
        }
        printf("%s\n",hiragana);
}


No.853

ありがとうございました。
投稿者---サクヤン(2002/01/17 16:54:56)


ともじさん、お世話になりました。
丁寧にご指導いただいてとても助かりました。

また、分からないことがあったら教えてくださいね。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.02.03
Copyright(c) 2000-2002 TOMOJI All Rights Reserved