/*================================================================*/ /*┌――――――――――――――――――――――――――――――┐*/ /*|文字以外の9桁までの数字を一つ入力・表示し、 |*/ /*|繰り返しを任意に促すプログラム |*/ /*└――――――――――――――――――――――――――――――┘*/ /*================================================================*/ /*================================================================*/ /*┌更新履歴――――――――――――――――――――――――――┐*/ /*|05/08/14 作成 |*/ /*|06/03/06 ヘッダーコメントを豪華に更新 |*/ /*|06/03/08 オーバーフローエラー処理追加 |*/ /*|06/03/09 誤入力時再入力処理追加 |*/ /*|07/10/01 説明コメント追加・表示整理 |*/ /*└――――――――――――――――――――――――――――――┘*/ /*================================================================*/ /*----------------------*/ /* 基本設定 */ /*----------------------*/ /* 外部からの情報を含む */ #include /* STanDard InputOutputを標準ライブラリ関数から取り込む */ #include /* atofで使う */ #include /* memsetで使う */ #define OVER_FLOW 9 /* NG桁以上はエラーになる */ double err_kansu(char *moji); /* ユーザー関数プロトタイプ宣言 */ int loop(int iYes); /*==============================*/ /* */ /* メイン関数 */ /* */ /*==============================*/ int main(void){ /* 引数がある場合int型の値を返すreturn型 関数名(引数型と仮引数名の並び) */ char moji[128]; /* 入力変数 */ double dSuuji; /* 数値変換 */ int iYes; /* プログラムを続けるかどうか */ /* プログラム永久ループ */ while(1){ dSuuji = 0; /* 数字初期化 */ iYes = 0; /* ループ質問初期化 */ memset(moji, NULL, 128); /* moji初期化 */ dSuuji = err_kansu(moji); /*----------------------*/ /* 結果表示 */ /*----------------------*/ dSuuji = atof(moji); /* 入力した文字を無理やりdouble型の数字に変換 */ printf("あなたが打った数字は %.2f です。\n",dSuuji); /*--------------*/ /* ループ? */ /*--------------*/ iYes = loop(iYes); if(iYes == 1); else break; } /*--------------*/ /* 終了 */ /*--------------*/ printf("終わります。\n"); return 0; /* 戻り値0を返し、プログラム(処理)が終わりであることを告げる */ } /*======================================================================================*/ /*==============================*/ /* */ /* エラー処理関数 */ /* */ /*==============================*/ double err_kansu(char *moji){ /*----------------------*/ /* 設定項目 */ /*----------------------*/ int i; /* mojiのi番目から入力 */ int iFlg; /* エラーフラグ */ int iPeriod; /* 小数点 */ int iPm; /* プラスマイナス記号 */ /*----------------------*/ /* 宣言初期化 */ /*----------------------*/ do{ /* 正入力されるまで繰り返し */ i = 0; /* 配列番号初期化 */ iFlg = 0; /* エラーフラグ初期化 */ iPeriod = 0; /* 小数点数初期化 */ iPm = 0; /* +−記号数初期化 */ /*----------------------*/ /* 呼び出し */ /*----------------------*/ printf("%d桁までの数字を入力して下さい。\n",OVER_FLOW); scanf("%s",moji); rewind(stdin); /* スペース以降の文字を強制排除 */ fflush(stdin); /* バッファの開放 */ /*----------------------*/ /* エラー処理 */ /*----------------------*/ /* 入力される文字が終わるまで繰り返し */ for(i = 0; moji[i]!='\0'; i++){ /* もし途中で0以下か9以上のコードがある場合 */ if(moji[i] < '0' || '9' < moji[i]){ /* 途中で小数点が入った場合 */ if(moji[i] == '.'){ /* それまで点が0個なら */ if(iPeriod < 1){ iPeriod++; /* 小数点をカウント */ continue; /* 一番近いループ(for)の最初まで戻る(やりなおす) */ } /* 入れすぎるとアウト */ else{ printf("小数点を確認してください\n"); iFlg = 1; break; } } /*最初に入力されたのが+か−だった時 */ if(moji[0] == '+' || moji[0] == '-'){ /* +か−記号が1個の時は続行 */ if(iPm < 1){ iPm++; continue; } /* 入れすぎるとエラー */ else{ printf("記号が多すぎます\n"); iFlg = 1; break; } } printf("文字が入っています\n"); iFlg = 1; /* エラーフラグを立てる */ break; /* for脱出 これがないと無限ループ */ } /* 数字が9桁以上になると・・・ */ else if( (i+1) > (OVER_FLOW+iPeriod+iPm) ){ printf("桁数が多過ぎます!!\n"); /* 上のdefineのOVER_FLOWの設定より超えると */ iFlg = 1; /* 変換される時、メモリのオーバーフローが起こる */ break; /* forループ脱出 これがないと永久 */ } } }while(iFlg); /* エラーフラグが立ってしまうと戻る(やり直し) */ } /*======================================================================================*/ /*--------------*/ /* ループ関数 */ /*--------------*/ int loop(int iYes){ printf("\nもう一回やりますか?YES=1/NO=他 \n"); scanf("%d",&iYes); /* 入力 */ rewind(stdin); /* スペース以降を強制排除 */ return iYes; }