• ベストアンサー

???ダメなんです(分からないんです)。 for文内の結果を呼び出す感じのプログラム文???

いつもいつも大変忙しい中失礼します。http://oshiete1.goo.ne.jp/qa3432182.htmlでも質問しましたが、現在そのプログラムをさらに発展させて、下記のようなプログラム文を組もうとしています。<私のプログラム文>から ”123” と入力した場合、偶数桁のみを2倍した後、 ”答え 4” の値を返そうとしていますが、相も変わらず出来ません・・・。どなたか分かる方がいらっしゃいましたらアドバイス等願います。・・・本当にいつもいつも迷惑かけます。 出力結果 数字3桁入力:”123”と入力  (余談:最終的には数字を5桁まで増やします。”12345”→”14385”と出力するつもりです。) ---計算過程---偶数桁”2”を2倍する 答え 4 ←これを導き出すことが出来ません(私の回答: 答え 2147348480 ) といいますか、返したいのですが、出来ないのです。 何故? <参照プログラム文>を真似て、<私のプログラム文>を自分なりに作り、コンパイルは通るのですが、・・・値が期待したものと違い、どこをどういじればいいのかに悩んでいます。 <参照プログラム文>を私なりに解説させていただくと、printf文内の”triple(number)”のnumberはint xを意味しています。int triple(int x)文内のプログラムを返すらしいのです。 <私のプログラム文> #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int valid(int x); int number; int tra; printf("数字3桁入力: "); scanf("%d", &number); printf("答え %d\n", valid(number)); system("PAUSE"); return 0; } int valid(int x) { int i; int inptnum; int tra; for (i=3; i>=1; i--) { if(i%2==0){ inptnum=pow(10,i-1); tra=(x/inptnum)%10; tra=(tra*2)/10+(tra*2)%10; } return tra; } } <参照プログラム文> #include <stdio.h> #include <stdlib.h> int main() { int triple(int x); int number; printf("数字? \n"); scanf("%d", &number); //printf("%d\n", number*3); printf("%d\n", triple(number)); system("PAUSE"); return 0; } int triple(int x) { x *= 3; return x; }

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

どうしてダメなのかを検証するのに希望通りの動作をしているのかチェックしてみましょう 入力された数値が正しいのか ... scanf後 numberをprintfで出力してみる 関数 validで正しく引数を受け取っているのか valid関数の先頭で 引数xをprintfで出力してみる for文の直後で iの値は正しいのかチェック if ( i % 2 == 0 ) の直後で iの値が 偶数なのかチェック inputnumへの代入が正しいかチェック traへの代入が正しいかチェック1 traへの代入が正しいかチェック2 return文の直前でtraのデータをチェック といった具合に printfなどで出力してみましょう ロジック的におかしな部分があるはずです また変数は必ず初期化して使うようにしたほうが良いと思います 代入された後の結果なのか初期化されただけの結果なのか判断が出来ますから valid関数の中なら iはfor文で初期化されますからしなくても良いですが inputnumや traは初期化して使ったほうが良いでしょう 特に 返り値として使用する traは初期化したほうが良いと思います 初期値として計算結果としてありえない数値 -9999などで初期化するといった具合です

jpncndgoo2
質問者

お礼

redfox63さん毎度ながら丁寧なアドバイスありがとうございます。 結果からいうと出来ませんでした。 -9999と初期化してもその値がそのまま”表示(-9999)”されてしまいます。それが’0’でも同じです。 ありがとうございました。 No.3444800にトータル的な質問をしました。そちらで再アドバイスして頂けると幸いです。 お騒がせしてすみません。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★追記。 ・よく読んだら2倍して2桁になったら桁同士を加算するようですね。  ちょっと前回のサンプルを訂正します。  ●サンプル1  n *= 2; // 偶数桁のみを2倍  n = (n / 10) + (n % 10);  ●サンプル2  // 偶数桁のみ2倍  n2 *= 2;  n = (n / 10) + (n % 10);  // 1,2,3桁目を数値に変換 ・以上。

jpncndgoo2
質問者

お礼

どうも親切に私のプログラムを見てもらいありがとうございました!

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★前回の質問も読んで見ました。 ・ソースを見て思ったのですが scanf で『%s』の文字列として  『数字3桁入力』してすべて文字列処理すれば楽だと思います。  今は『%d』で数値として入力するようになっていますよね。  数値の場合で処理するとちょっと複雑になりますよ。 ・下に文字列と数値での処理サンプルを載せておきます。 サンプル1: char num[ 16 ]; int i, n; printf( "数字3桁入力: " ); scanf( "%s", num ); for ( i = 1 ; i < 3 ; i += 2 ){  n = (num[i] - '0'); // 文字→数値に変換  n *= 2; // 偶数桁のみを2倍  n %= 10; // 2倍にした結果が2桁なら1桁に補正  num[ i ] = n + '0'; // 数値→文字に変換 } サンプル2: int num; int n1, n2, n3; printf( "数字3桁入力: " ); scanf( "%d", &num ); // 1,2,3桁目を取り出す n1 = (num / 100) % 10; // 1桁目 n2 = (num / 10) % 10; // 2桁目 n3 = (num / 1) % 10; // 3桁目 // 偶数桁のみ2倍 n2 *= 2; // 1,2,3桁目を数値に変換 num = 0; num += n1 * 100; // 1桁目 num += n2 * 10; // 2桁目 num += n3 * 1; // 3桁目 // 表示 printf( "答え:%d\n", num ); 解説: ・サンプル1は文字列で入力して文字列で処理した場合です。  サンプル2は整数値で入力して整数値で処理した場合です。  見れば分かるとおり文字列での処理が簡単です。  整数値での処理は偶数桁を取り出す処理が複雑になるのです。  上記のは分かりやすくするためにループを使っていません。  でも考え方は同じです。 ・今後いろいろと発展問題として3桁からn桁に代わると上記の  サンプルだけでは対応できなくなります。改良すべきです。 ・以上。

jpncndgoo2
質問者

お礼

Oh-Orangeさん懇切な回答ありがとうございます。 ちょっと私の求めているものと違った回答でした。’数字’を’数字’のまま使い、<参照プログラム文>内にあるint triple(int x)を呼び出して・・・ということを行いたかったのです。 私の文の書き方が悪かったのでしょう。 とはいえありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

valid関数で、iが3のとき、 traに何が入っているかわからない状態で returnしているからです。

jpncndgoo2
質問者

お礼

asucionさんアドバイスありがとうございます。 しかし、 for (i=3; i>=1; i--) { tra=0; if(i%2==0){ 、 int inptnum; int tra=0; for (i=3; i>=1; i--) でtraを初期化しても、 ”答え 0”となってしまい、やはり思うような回答が得られません。 う~ん、どうすればいいのだろう???

関連するQ&A