こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

???ダメなんです(分からないんです)。 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;
}

投稿日時 - 2007-10-19 19:33:19

QNo.3443571

困ってます

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

どうしてダメなのかを検証するのに希望通りの動作をしているのかチェックしてみましょう

入力された数値が正しいのか ... 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などで初期化するといった具合です

投稿日時 - 2007-10-19 20:51:55

お礼

redfox63さん毎度ながら丁寧なアドバイスありがとうございます。
結果からいうと出来ませんでした。
-9999と初期化してもその値がそのまま”表示(-9999)”されてしまいます。それが’0’でも同じです。

ありがとうございました。

No.3444800にトータル的な質問をしました。そちらで再アドバイスして頂けると幸いです。
お騒がせしてすみません。

投稿日時 - 2007-10-20 05:13:43

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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

投稿日時 - 2007-10-19 23:12:48

お礼

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

投稿日時 - 2007-10-20 05:21:48

ANo.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桁に代わると上記の
 サンプルだけでは対応できなくなります。改良すべきです。
・以上。

投稿日時 - 2007-10-19 21:53:28

お礼

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

投稿日時 - 2007-10-20 05:20:20

ANo.1

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

投稿日時 - 2007-10-19 20:43:50

お礼

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”となってしまい、やはり思うような回答が得られません。
う~ん、どうすればいいのだろう???

投稿日時 - 2007-10-20 05:01:53

あなたにオススメの質問