パソコン活用研究シリコンバレー(C、C++、の活用研究)

簡単な判定プログラム(初級編)
〜指定文字のサーチ

(準備中)

------------------------------------summery-----------------------------------------------------
This is a very short program with simple judgments using If statements and while statement, etc.
If文やwhile文等による簡単な判定の超ショートプログラムの基礎編です。
-------------------------------------------------------------------------------------------------



 文字列(数値列)の中に指定した文字(キー文字(数値))があるかどうかの判定(初級編)をいろいろなパターン
でやってみます。

@1行目にキー文字(0〜9の数値)が1個入力されます。(変数m)
A2行目に判定用の文字列(数値列)の入力個数が入力されます。(変数n)
B次に判定用文字列(数値列)がn回入力されます。
C判定用文字列(数値列)に@のキー文字(数値)が含まれていれば"NG"と表示し、含まれていなければ
 その判定用文字列をそのまま表示します。
D全ての判定用文字列が"NG"であれば、最後に"none of Number is acceptable." と出力します。


(例)
3 ←キー文字(数値)の入力
4 ←判定用の文字列(数値列)の入力個数
1012 ←以下判定用文字列(数値列)の入力
1012
319
NG
493
NG
2008
2008

(1) 数値で判定する
キー文字(数値)は変数n(Int型)、判定用文字列(数値列)の入力個数は変数m
判定用文字列(数値列)はchar r[5]に保存します。

@ mはint型なので、itoaで文字列に変換しnr[3]に変換します。10進数での変換なのでitoa(n,nr,10) とします。
A 判定用文字列(r[5]) に、キー文字(nr[0])があるか一文字づつ比較して判定します。キー文字と同じ文字があれば
  変数ngに1を加えていきます。変数ngはキー文字と同じ文字が何文字あったかを保存する変数として使用します。

※itoaはMS-C(Visual c/c++)、Turbo-C(Borland c/c++)、LSI C86などには実装されてますが、Cの標準ライブラリにある
関数ではないので、itoaのない処理系も多数あるようです。
標準Cライブラリではsprintfで代用できます。


ngnum.c

#include <stdio.h>
#include <stdlib.h>
int main(void){
    int i,n,l,m,ng,x;
    char r[5], nr[3];
    x=0;
    scanf("%d",&n);
    itoa(n,nr,10);  /* @ */
    scanf("%d",&m);
    for (i=0; i<m;i++) {
        scanf("%s",r);
        ng=0; l=0;
        while(r[l] !='\0'){
            if (r[l]==nr[0]){ng=ng+1;}  /* A */
        l=l+1;
        }
        if(ng==0){printf("%s\n",r); x=x+1;}
        else{printf("NG\n");}
    }
    if(x==0){printf("none of Number is acceptable.\n");}
    return 0;
}

実行例


c:\bcc55\Bin>ngnum
5
3
0505
NG
2341
2341
1998
1998

c:\bcc55\Bin>ngnum
1
3
91
NG
1900
NG
9001
NG
none of Number is acceptable.

c:\bcc55\Bin>

(2) itoaを使わないパターン

@ itoaを使わず、nr=n+48とします。
 C言語の場合、char型の中身は結局文字のasciiコードなので、48を足すとその数値のasciiコードになる
 ことを応用した方法です。

ngnum2.c

#include <stdio.h>
#include <stdlib.h>
int main(void){
    int i,n,l,m,ng,x;
    char r[5], nr;
    x=0;
    scanf("%d",&n);
     nr=n+48;  /*  @  */
    scanf("%d",&m);
    for (i=0; i<m;i++) {
        scanf("%s",r);
        ng=0; l=0;
        while(r[l] !='\0'){
            if (r[l]==nr){ng=ng+1;}
        l=l+1;
        }
        if(ng==0){printf("%s\n",r); x=x+1;}
        else{printf("NG\n");}
    }
    if(x==0){printf("none of Number is acceptable.\n");}
    return 0;
}

実行例


(3) 全て数値型変数で対処したサンプル
char型を使わず全ての変数をint型で処理した例です。

@ 10で割った余りを比較することで、一桁づつキー文字(数値)に該当する数値がないか
 チェックしていきます。

ngnum3.c


#include <stdio.h>
int main(void){
     int i,n,m,r,room,md,ng,x;
    x=0;
    scanf("%d",&n);
    scanf("%d",&m);
    for (i=0; i<m;i++) {
        scanf("%d",&r);
        ng=0; room=r;
        while(r>=1){
         md= r % 10;   /* @ */
            if (n==md){ng=ng+1;}
        r=r/10;
        }
        if(ng==0){printf("%d\n",room); x=x+1;}
        else{printf("NG\n");}
    }
    if(x==0){printf("none of Number is acceptable.\n");}
    return 0;
}

実行例


c:\bcc55\Bin>ngnum
5
3
0505
NG
2341
2341
1998
1998

c:\bcc55\Bin>ngnum
1
3
91
NG
1900
NG
9001
NG
none of Number is acceptable.

c:\bcc55\Bin>



(4) strchr関数を使う

大昔の古いコンパイラによってはstrchr関数は用意されてないものもあったらしいです。
最近のコンパイラには当然実装されているものと思います。(C89の標準ライブラリにもある関数ですから)
MS-C(Visual c/c++)やTurbo-C(Borland c/c++)にはこの関数があります。
LSI C-86にもこの関数は実装されています。
一文字づつ比較していく必要がないので、while文はありません。

ngnum4.c


#include <stdio.h>
#include <string.h>
int main(void){
    int i,m,x;
    char r[5], *n="";
    x=0;
    scanf("%s",n);
    scanf("%d",&m);
    for (i=0; i<m;i++) {
        scanf("%s",r);
            if (strchr(r,n[0]) == NULL) {printf("%s\n",r); x=x+1;}
        else{printf("NG\n");}
    }
    if(x==0){printf("none of Number is acceptable.\n");}
    return 0;
}


この関数を使った場合は、判定できるのは数値に限らないので以下の実行例のように
アlルファベットが混じっても使えます。

実行例



c:\bcc55\Bin>ngnum4
5
4
1298
1298
3325
NG
am5
NG
abcd
abcd

c:\bcc55\Bin>


(5) strcspn関数を使った例
strcspn関数では、サーチのために指定する文字を複数指定できます。
指定した文字が最初に見つかった位置が返されます。(先頭文字が0です)

ngnum6.c


#include <stdio.h>
#include <string.h>
int main(void){
    int i,m,x;
    unsigned p,l;
    char r[5], *n="";
    x=0;
    scanf("%s",n); 
    scanf("%d",&m);
    for (i=0; i<m;i++) {
        scanf("%s",r);
        p = strcspn(r, n); l=strlen(r);
            if (p >= l) {printf("%s\n",r); x=x+1;}
        else{printf("NG:%d\n",p+1);}
    }
    if(x==0){printf("none of Number is acceptable.\n");}
    return 0;
}

実行例
"3","7","a"のどれが該当してもNGになります。NGの発生した文字の位置も表示させています。

c:\bcc55\Bin>ngnum6
37a
5
123
NG:3
abcd
NG:1
5566
5566
def7
NG:4
5586
5586



(6) strstrを使う
strstrはサーチする文字として一文字ではなく、文字列を指定します。

ngnum7.c

#include <stdio.h>
#include <string.h>
int main(void){
    int i,m,x;
    char r[5], *n="";
    x=0;
    scanf("%s",n);
    scanf("%d",&m);
    for (i=0; i<m;i++) {
        scanf("%s",r);
            if (strstr(r,n) == NULL) {printf("%s\n",r); x=x+1;}
        else{printf("NG\n");}
    }
    if(x==0){printf("none of Number is acceptable.\n");}
    return 0;
}

実行例
"86"の文字列が見つかった場合のみNGになります。
"68"や"8","6"はヒットしまえん。

c:\bcc55\Bin>ngnum7
86
5
ab68
ab68
ae86
NG
q86k
NG
8765
8765
8aa6
8aa6

c:\bcc55\Bin>


上記で使用した文字検索関数の説明は文字検査関数2にあります。







TopPage