- ベストアンサー
簡単なようで分からない?for文での加算処理方法及び出力表示方法
忙しい中失礼します。 ・・・???分からないので質問させていただきます。 プログラム過程 1.5桁の数値入力: 68562 2.偶数桁のみ2倍する: 8x2=16 6x2=12 3.68592→6165122という処理を行う。 4.6165182→処理:6 1+6 5 1+2 2→再度5桁表示:67532 (※2桁目と4桁目の数字が1.とは異なります) 5.67532各桁の加算処理を行い(6+7+5+3+2=23)、”23”をディスプレイ上に表示させる。 希望出力結果: 5桁入力 68592 67532 合計 23 ←加算処理方法及び出力表示方法(ここが分からないのです) を望んでいます。 分からないところ:どうやって67532の加算処理を行い、どうやってそれをディスプレイ上に表示させれば良いのかが分かりません??? 以下のプログラム[1]、[2]から、[2]を[1]に組み込もうとしています。ですが、[2]for文のカッコ内()の条件???、及び[2]を[1]のどこに組み込めば”合計23”が表示されるのかも分かりません。 そもそもfor文で行うこと自体が無理?そんなことはない、と思っているのですが・・・。それとも[2]を[1]に組み込もうとしてること自体が間違っている?のですかね??? 大変忙しいとは思いますが、アドバイス等ありましたらお願いします。 <使用環境: Borland?? C> [1] 1~4までのプログラミング(完成済) #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int num,tra; int inpt=5; int inptnum; int s; printf("5桁入力; "); scanf("%d", &num); for(inpt ; inpt >=1 ; inpt--) { if(inpt%2 == 0) { inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; s=(tra*2)/10+(tra*2)%10; printf("%d",s); } else {inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; printf("%d",tra);} } system("pause"); return 0; } [2]単独での加算処理プログラム(完成済) #include <stdio.h> #include <stdlib.h> int main() { int count; int Sum; Sum=0; for (count = 1; count <= 6; count++) {printf("%d ",count); Sum = Sum + count; } printf("\nSum%d\n", Sum); system("pause"); return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
あなたのコードをベースにするならこうでしょうか。 (ANo.2の回答と同じです。) ----source1----------------------------- #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int num,tra; int inpt=5; int inptnum; int sum=0; /* 追加 */ printf("5桁入力; "); scanf("%d", &num); for(inpt ; inpt >=1 ; inpt--) { if(inpt%2 == 0) { inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; tra=(tra*2)/10+(tra*2)%10; /* traに結果が入っていて欲しいので書き換え */ printf("%d",tra); } else { inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; printf("%d",tra); } sum += tra; /* 追加 */ } printf("\nSum %d\n", sum); /* 追加 */ return 0; } ---------------------------------------- 「6+7+5+3+2=23」をやりたいのだから、 6、7、5、3、2が出現する場所を考えれば悩むところはないと思います。 (例えば、何も考えずに2カ所のprintf("%d",tra);の直前にsum += tra;を挿入しても結果は得られる。) あと、 > inptnum = pow(10,inpt-1); > tra = (num/inptnum)%10; この2行は(inpt%2 == 0)が真でも偽でも必ず実行されるので ifの外に出せば2回も書く必要はありません。 2つのprintfも、上のコードのように出力する変数を同じにしておけば、外に出して1つだけですみます。 (ここまでやるとelseブロックが空になり、elseは不必要なことが分かります。) なお私なら、 ・5桁限定にしたくない ・powは必要ない(下の桁から処理すれば、pow使わなくても10で割り続けるだけで良い) ので以下のように書きます。 (各桁の分解はANo.1と基本的に同じ。) ----source2----------------------------- #include <stdio.h> int main(){ int nums[20] = {0}; int i; int num, val; int sum = 0; printf("Input Number: "); scanf ("%d", &val); i=0; while(val!=0) { i++; num =val%10; val /= 10; if(i%2 == 0){ /*偶数桁*/ num = (num*2)/10+(num*2)%10; } nums[i-1] = num; /* あとで表示するために保存 */ sum += num; /* 各桁の加算 */ } for(;i>=1;i--){ printf("%d",nums[i-1]); } printf("\nSum: %d",sum); return 0; } ---------------------------------------- 入力が数値でなくて(数字のみからなる)文字列で良いなら、 桁の分解は http://okwave.jp/qa3427592.html のANo.2の様に、文字列中の各文字を取り出す形でもできる。 (分かりにくくなるかもしれないので今回は除算と剰余算で取り出しました。)
その他の回答 (3)
数値の受け渡しに配列を用いる様に書き換えました。 (生の数値でやると面倒そうなので) また、各機能を関数に切り分けました。 #include <stdio.h> #include <stdlib.h> #include <math.h> void convert(int , int*); void disparray(int* , int); int sumofarray(int* , int); #define SIZE 5 int main(void) { int num; int nums[SIZE]; // 変換結果格納用配列 printf("5桁入力; "); scanf("%d", &num); printf("num = %d\n" , num); convert(num , nums); // 数字の変換 disparray(nums , SIZE); // 変換後の数字の表示 printf("sum = %d\n" , sumofarray(nums , SIZE)); // 各桁の数字の和を表示 return 0; } // 数字の変換を行う void convert(int num , int* nums) { int inpt; int inptnum; int s; int tra; for(inpt=5 ; inpt>=1 ; inpt--) { if(inpt%2 == 0) { inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; s=(tra*2)/10+(tra*2)%10; nums[inpt-1] = s; } else { inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; nums[inpt-1] = tra; } } } // 配列の数字を表示(配列後方から順に) void disparray(int* array , int size) { int i; for(i=size-1 ; i>=0 ; i--) { printf("%d" , array[i]); } printf("\n"); } // 配列の数字の和を求める int sumofarray(int* array , int size) { int i; int sum = 0; for(i=0 ; i<size ; i++) { sum += array[i]; } return sum; }
お礼
返事が遅れてしまい申し訳ありません。 忙しい中の回答ありがとうございます。 何故こんなにも簡単にプログラムが組めるのか・・・羨ましい限りです。 丁寧に見ず知らずの私の為に時間を割いてまで、プログラムをわざわざ記述して頂きありがとうございます。 プログラムの記述から察するに、’たいしたことない’みたいな感じを受けますが、私にとっては’すごい!すごい!どうやったらそういう考えが生まれるの???’と不思議でなりません。恐れ入ります。 本当にありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
traに各桁取得できているのですからこれを加算して合計すればいいのですが forループに入る前に合計用の変数sumを0で初期化 forループの }の直前で sum += tra; forループ抜けてから printf( "%d", sum ); といった具合ですよ
お礼
アドバイスありがとうございます。 このアドバイスをどうにかしてモノにしようとしたのですが、最終的に出来ませんでした。 文章から、本当に文章を’なぞるだけ’みたいな感じを受け、文章を分かろうとしたんですけどね・・・。 アドバイスありがとうございました。
補足
忙しい中のアドバイスありがとうございます。 出来たら再アドバイス願います。 上記の回答についてですが、forループのforは[1]内のforでしょうか?それとも[2]内のforでしょうか? そして、for文を作成した場合のfor(・・・)のカッコ内の条件は何になるのでしょうか? 私なりに上記の内容に沿ってプログラムを組んだところ、 sum=0; for(inpt ; inpt >=1 ; inpt--) { if(inpt%2 == 0) { inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; s=(tra*2)/10+(tra*2)%10; printf("%d",s); sum+=s;} printf("\nsum %d",sum); となるのですが、コンパイル後エラー(parse error before 'else')が発生しています。で、else文の前に { または } を入れるのですが、エラーはまだ発生してしまいます。 で、また、[1]のプログラム下に[2]を組み合わせようにもfor(・・・)のカッコ内の条件が不明なので、プログラムを組むことも出来ないのです。 ・・・本当に出来ましたら再アドバイス願います。
- alphion
- ベストアンサー率19% (27/136)
動作確認はしていませんが //valに67532が入っているとする sum=0; for(;;)// while(ture)のほうが好きですが { sum+=val%10; val/=10; if(val<=0) { break; } } こんな感じ
お礼
アドバイスありがとうございます。 上記のプログラムに倣って、プログラムを組んだりしたのですが、ダメでした。 私の為に案を出して頂きありがとうございました。
補足
早速のアドバイスありがとうございます。 ですが、67532は桁’有’の数値ではなく、67532は桁’無’の数値で、各自独立した('6' '7'・・・というように)数値としてディスプレイ上に表示されています。それを上記の[1]プログラムから、どうすれば桁’有’の数値として認識されるのでしょうか? 宜しければ再アドバイス願います。
お礼
返事が遅れてしまい申し訳ありません。 Wernerさんわざわざ私の為に、私の考えに基づいたプログラムを作成してくださり、本当にありがとうございます。 しかも動作確認までしてくれたみたいで・・・。 正直驚き!です。しかも別のアドバイスも加えて、なんて・・・う~ん、羨ましくて仕方ありません。 私はこの問題を1日~2日考えても’思った通り’の出力結果を表示することが出来ませんでした。 これは私の気のせいかもしれませんが、私のプログラムを1度見ただけで、上記のプログラムを’ささっ’とこなしてしまったような気がします。 しかも片手間で・・・。 私もいつの日か、そんなプログラマーを目指したいと思います。 ’参考意見’?とんでもない!本当に素晴らしい回答ありがとうございました。