トップページ > 記事閲覧
数字ボタンによる、入力数値と合算方法
名前:かみしろ 日時: 2021/11/02 12:31

お世話になっております。 勉強中の初心者です。こういったフォームがあることが心強く感じております。 現在、android用で作成しているのですが、   @数字ボタンを電卓のように並べていて、押されることで、入力されたボタンの数字を出力   AOKボタンを押されることで、入力された数字を並べて、変数に格納    B変数に格納された数字を計算して、算出する という流れで作っています。 ただ、@の部分には0〜9までの数字だけでなく、小数点の「.」があるので、int型では格納できないです。 かといって、char型にした場合、うまくいきません。 色々と調べたのですが、基本をしっかりと理解していないせいか、どうしても分からない状態です。 後、Aの部分に合算するには   for (int t = 0; t < count; t++)    {      all_suuji =+ suuji[count];    } こういった形で入れたいと思ったのですが、できていません。 どうすればいいのでしょうか。 お願い致します。   
メンテ

Page: 1 |

Re: 数字ボタンによる、入力数値と合算方法 ( No.1 )
名前:管理人 日時:2021/11/03 06:12

小数点も含むということはAの『変数に格納』の『変数』は float型か double型となる感じでしょうか? とりあえず小数点『.』も含む必要があるとのことですので、@で値を代入する suuji配列は char型にする必要があると思います char suuji[桁数]; その上で、数字のボタンが押されたら、 『0』〜『9』 のボタンが押された場合 → suuji[桁] に『'0' + 押された数値』を代入 『.』 のボタンが押された場合 → suuji[桁] に『'.'』を代入 します『'0'』は数値の『0』ではなく、文字の 0 です ( C言語や C++言語では、文字をシングルコーテーション『'』で囲うと『文字』となります ( 文章をダブルコーテーション『"』で囲うと『文字列』の扱いになるのと似たようなルールです ) ) 文字の 0 である『'0'』は、数値としては 48 になります( コンピューターは文字も数値で扱うので… ) なので suuji[桁] = '0' + 押された数値; は suuji[桁] = 48 + 押された数値; と記述しても同じ結果が得られます( 因みに文字の . である『'.'』の数値は 78 です ) ( 各文字と数値の対応表は『アスキーコード表』などでウェブ検索すると対応表が載っているウェブサイトが見つかります ) 上記の処理を行うと char suuji[桁数]; の配列には数字の文字列( char型の配列 )が代入された状態となります 例:『2』『8』『5』『.』『8』『9』という順番でボタンを押したら suuji の各要素には以下の内容が格納される  suuji[0] = '0' + 2; // '0' + 2 は文字の '2' になります( 文字の 2 を表す数値は 50 なので )  suuji[1] = '0' + 8; // '0' + 8 は文字の '8' になります( 文字の 8 を表す数値は 56 なので )  suuji[2] = '0' + 5; // '0' + 5 は文字の '5' になります( 文字の 5 を表す数値は 53 なので )  suuji[3] = '.';  suuji[4] = '0' + 8; // '0' + 8 は文字の '8' になります( 文字の 8 を表す数値は 56 なので )  suuji[5] = '0' + 9; // '0' + 9 は文字の '9' になります( 文字の 9 を表す数値は 57 なので )   尚、これを文字列として見た場合は "285.89" になります こうして出来た数字の文字列を atof という『「数値の文字列」を「数値」に変換するC言語の標準関数』に渡せば 戻り値として double型の数値を取得することが出来ます( Aの部分です ) all_suuji = atof( suuji ); ただ、atof に渡す文字列( char型の配列 )の末尾には必ず 0 が代入されている必要がありますので、 count という変数に桁数が格納されているのでしたら、atof に suuji を渡して呼び出す前に suuji[count] = 0; ↑ このような記述を増やして、suuji の文字列の末尾が 0 になるようにしてください
メンテ
Re: 数字ボタンによる、入力数値と合算方法 ( No.2 )
名前:かみしろ 日時:2021/11/03 12:51

 早速の回答ありがとうございます!  丁寧な説明、とてもわかりやすかったです。    教えていただいた内容を自分なりに調べて、ようやく理解しました。  基本的なことだったのに、知らないことが多すぎて恐縮です…。  結果、うまくいきました。 all_suuji に格納されるのを確認できました、ありがとうございます。 ただ、数字ボタンが押された際に、画面に入力された各数字を「%s」で表示しようとするとSegmentation Faultがでてしまいます。  「%d」であれば、アスキーコードが表示されます。      DrawFormatString(300, 1050, Col.Bla, "%s", suuji[0]);  色々と半日ほど調べていたのですが、分からず…。  教えていただけたらありがたいです。 
メンテ
Re: 数字ボタンによる、入力数値と合算方法 ( No.3 )
名前:管理人 日時:2021/11/05 01:40

> ただ、数字ボタンが押された際に、画面に入力された各数字を「%s」で表示しようとするとSegmentation Faultがでてしまいます。 > 「%d」であれば、アスキーコードが表示されます。 %s の場合は『文字列』である必要がありますので、1文字単体でしたら %c を使用すれば正常に1文字だ表示されます よろしければお試しください
メンテ
Re: 数字ボタンによる、入力数値と合算方法 ( No.4 )
名前:usao 日時:2021/11/05 10:34

文字で持たない方法論の話を示しておく. > ただ、@の部分には0〜9までの数字だけでなく、小数点の「.」があるので、int型では格納できないです。 数字だけの場合を考えてみると, --- //=== 変数定義と初期化 === int N=0; //初期値0の数値があって… //=== いずれかの数字ボタンが押された際の処理 === N = N*10 + (押されたボタンに対応する数値); --- という形で値を更新していけるであろう. で,小数点に関しては, さらに追加で「小数点以下が何桁なのか」という形の情報で管理すればよい. 例えば 285.89 という値について言えば {Nの値が 28589 ,小数点以下は2桁である}という2つの情報によって表す形となる. (floatとかdoubleの値が必要なときにはこの情報から 285.89 という値を作り出せばよい.その方法は自明であろう) 以下のようなコードであれば, * いきなり 0ボタン を連打された場合 * 小数点ボタンを複数回おされた場合 にも妥当に動作できると思う. --- //=== 変数定義と初期化 === //前述のとおり.数字ボタン群が押された結果を整数で持つ. int N = 0; //小数点以下の桁数を示す値. //ただし,ここでは「小数点が入力されていない状態」を負の値で表す,というルールを設けることにしよう. int D=-1; //=== いずれかの数字ボタンが押された際の処理 === N = N*10 + (押されたボタンに対応する数値); if( D>=0 )++D; //小数点が入力済みであれば,小数点以下の桁数を増やす ... //=== 小数点ボタンが押されたときの処理 === // 初めて押されたときに小数点以下の桁数を0にする. // 既に小数点入力済みであれば,このボタン操作は単に無視される. if( D<0 )D=0; ---
メンテ
Re: 数字ボタンによる、入力数値と合算方法 ( No.5 )
名前:かみしろ 日時:2021/11/06 17:37

>管理人様、ありがとうございます。  うまくいきました、これで何とか形になりそうです。  業務で使うスマホアプリを作っていました。  三角形の向きを指定して、その角度ないしは辺の長さを入れると、全数値が表示される、三角関数を使ったものです。  パターンを入れるのが大変でしたが、先程完了して、全てのチェックも終わりました。  おかげさまでほぼ完成となります、本当にありがとうございます。 >usao様  小数点に対する、そんな考え方もできるのですね。  具体的に説明していただいて、助かります。  早速、実装してみたいと思います。  まだプログラム自体を数ヶ月前に始めたばかりですが、想像で補えるif文に色々な可能性を感じています。  とりあえず、ここ数日で色々なことを教えていただけたので、メモして、考え方の柔軟さを含め、自分のものにしていきたいと思います。  ありがとうございます。  
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存