【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19390

数字チェックのプログラム
投稿者---こねこ(2005/01/23 01:03:23)


最近C言語を始めたばかりでいきづまってしまいました。
本当に初心者でくだらないことかもしれませんが教えてください。

標準入力より文字列(数字)を入力し、それが整数であるかチェックをする。というプログラムを作りたいのですがどうやったらいいか検討がつきません。少しでも良いので教えてください。

条件として、〃綽瑤10桁以上⊃字以外の文字列小数の場合ち干僂両豺腓魯┘蕁爾箸靴泙后

どうかご指導お願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:数字チェックのプログラム 19391 RAPT 2005/01/23 01:48:17
<子記事> Re:数字チェックのプログラム 19392 chu- 2005/01/23 02:19:23


No.19391

Re:数字チェックのプログラム
投稿者---RAPT(2005/01/23 01:48:17)


fgets(), isdigit(), strlen()あたりを調べてみてください。




この投稿にコメントする

削除パスワード

No.19408

Re:数字チェックのプログラム
投稿者---nop(2005/01/23 16:06:33)


>fgets(), isdigit(), strlen()あたりを調べてみてください。


個人的には、

 ・fgets()
 ・strtol()

の二つで十分かと。(w



この投稿にコメントする

削除パスワード

No.19409

Re:数字チェックのプログラム
投稿者---Blue(2005/01/23 16:13:06)


> ・strtol()
10桁以上の数字が入力されるというのを考えると危ないような。
数値としてその後使うわけではないので、文字チェックだけでいい気がしますが。



この投稿にコメントする

削除パスワード

No.19392

Re:数字チェックのプログラム
投稿者---chu-(2005/01/23 02:19:23)


以下のようにすればできると思います。

> 標準入力より文字列(数字)を入力し、
fgets関数かgets関数かscanf関数を使うことになると思うので、それぞれの使い方を調べ、手ごろなものを使う。

> それが整数であるかチェックをする。
> 〃綽瑤10桁以上
strlen関数を使うことになると思うので、使い方を調べ、if文を活用し、10文字未満であることをチェックする。

> ち干僂両豺
全角文字の判別方法を調べて、入力した文字列の全文字をfor文とif文を活用し、全角文字がないことをチェックする。

> ⊃字以外の文字列
> 小数の場合
入力した文字列の全文字をfor文とif文を活用し、すべて数字文字であることをチェックする。

すべてのチェックがOKならば整数とする。


この投稿にコメントする

削除パスワード

No.19393

Re:数字チェックのプログラム
投稿者---Blue(2005/01/23 02:35:12)


3と4の条件は2に含まれるような気がしますが。。。

単純に文字数と文字コード('0'〜'9')のチェックだけでいいかと。


#,覆匹諒源は使わないほうがいいと思います。
#マシンによってはみえない方がいらっしゃいますから。




この投稿にコメントする

削除パスワード

No.19401

Re:数字チェックのプログラム
投稿者---RAPT(2005/01/23 12:30:02)


STL使うとこんな感じ?
# isdigitを使用しない方法は分かりません(--;

#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>

struct fnDigit{
    bool result;
    fnDigit() : result(true){}
    fnDigit& operator()(const int c){
        result = result && isdigit(c);
        return *this;
    }
};

int main()
{
    string str;
    cin >> str;

    fnDigit f;
    f = for_each(str.begin(), str.end(), f);
    if( str.size() < 10 && f.result ){
        puts("OK");
    }else{
        puts("NG");
    }
    return 0;
}




この投稿にコメントする

削除パスワード

No.19405

Re:数字チェックのプログラム
投稿者---Blue(2005/01/23 14:05:51)


よく考えたら 01 とか 010 とかの先頭に0が来るパターンもチェックする
のか曖昧なような。

#RAPTさんのソースはC++なので丸写しにしないように。
#ロジックを参考に。(といってもCはじめたばっかの方には難しいけど)



この投稿にコメントする

削除パスワード

No.19406

Re:数字チェックのプログラム
投稿者---かずま(2005/01/23 15:19:35)


> STL使うとこんな感じ?
for_each を使うと、文字列の先頭近くで数字でないと分かっても
最後まで数字かどうかを調べ続けるという無駄な処理が行われます。
find_if を使ったほうがよいのでは?

#include <iostream>
#include <string>
#include <algorithm>

bool not_digit(char c) { return c < '0' || c > '9'; }

int main()
{
    using namespace std;
    string str;  cin >> str;

    if (find_if(str.begin(), str.end(), not_digit) == str.end())
        cout << "OK\n";
    else
        cout << "NG\n";
}



この投稿にコメントする

削除パスワード

No.19407

Re:数字チェックのプログラム
投稿者---かずま(2005/01/23 15:36:44)


10文字以上の場合のチェックを忘れていました。

find_if の呼び出しの前に、str.size() <10 &&  を追加してください。

find_if の呼び出しの後に、&& str.size() < 10 を追加してもよいのですが、
それだと、例えば str が 50文字あった場合、find_if の処理が無駄になります。



この投稿にコメントする

削除パスワード

No.19457

Re:数字チェックのプログラム
投稿者---かずま(2005/01/25 02:47:50)


> bool not_digit(char c) { return c < '0' || c > '9'; }

>    if (find_if(str.begin(), str.end(), not_digit) == str.end())

こうすると、find_if の中のループで、常に not_digit の関数呼び出しが
実行されるコードが生成されるようです。

次のように関数オブジェクトを利用すると、operator() が inline 展開され
て、ループの高速化につながるようです。処理系にもよりますが。

struct Not_digit {
    bool operator()(char c) { return c < '0' || c > '9'; }
};

    if (find_if(str.begin(), str.end(), Not_digit()) == str.end())



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧