• ベストアンサー

簡単なようで分からない?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; }

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.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の様に、文字列中の各文字を取り出す形でもできる。 (分かりにくくなるかもしれないので今回は除算と剰余算で取り出しました。)

jpncndgoo2
質問者

お礼

返事が遅れてしまい申し訳ありません。 Wernerさんわざわざ私の為に、私の考えに基づいたプログラムを作成してくださり、本当にありがとうございます。 しかも動作確認までしてくれたみたいで・・・。 正直驚き!です。しかも別のアドバイスも加えて、なんて・・・う~ん、羨ましくて仕方ありません。 私はこの問題を1日~2日考えても’思った通り’の出力結果を表示することが出来ませんでした。 これは私の気のせいかもしれませんが、私のプログラムを1度見ただけで、上記のプログラムを’ささっ’とこなしてしまったような気がします。 しかも片手間で・・・。 私もいつの日か、そんなプログラマーを目指したいと思います。 ’参考意見’?とんでもない!本当に素晴らしい回答ありがとうございました。

その他の回答 (3)

noname#119918
noname#119918
回答No.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; }

jpncndgoo2
質問者

お礼

返事が遅れてしまい申し訳ありません。 忙しい中の回答ありがとうございます。 何故こんなにも簡単にプログラムが組めるのか・・・羨ましい限りです。 丁寧に見ず知らずの私の為に時間を割いてまで、プログラムをわざわざ記述して頂きありがとうございます。 プログラムの記述から察するに、’たいしたことない’みたいな感じを受けますが、私にとっては’すごい!すごい!どうやったらそういう考えが生まれるの???’と不思議でなりません。恐れ入ります。 本当にありがとうございました。

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

traに各桁取得できているのですからこれを加算して合計すればいいのですが forループに入る前に合計用の変数sumを0で初期化 forループの }の直前で sum += tra; forループ抜けてから printf( "%d", sum ); といった具合ですよ

jpncndgoo2
質問者

お礼

アドバイスありがとうございます。 このアドバイスをどうにかしてモノにしようとしたのですが、最終的に出来ませんでした。 文章から、本当に文章を’なぞるだけ’みたいな感じを受け、文章を分かろうとしたんですけどね・・・。 アドバイスありがとうございました。

jpncndgoo2
質問者

補足

忙しい中のアドバイスありがとうございます。 出来たら再アドバイス願います。 上記の回答についてですが、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)
回答No.1

動作確認はしていませんが //valに67532が入っているとする sum=0; for(;;)// while(ture)のほうが好きですが { sum+=val%10; val/=10; if(val<=0) { break; } } こんな感じ

jpncndgoo2
質問者

お礼

アドバイスありがとうございます。 上記のプログラムに倣って、プログラムを組んだりしたのですが、ダメでした。 私の為に案を出して頂きありがとうございました。

jpncndgoo2
質問者

補足

 早速のアドバイスありがとうございます。  ですが、67532は桁’有’の数値ではなく、67532は桁’無’の数値で、各自独立した('6' '7'・・・というように)数値としてディスプレイ上に表示されています。それを上記の[1]プログラムから、どうすれば桁’有’の数値として認識されるのでしょうか?  宜しければ再アドバイス願います。  

関連するQ&A

  • for文を別のint内で定義し、初めのint文内で呼び出す??? 何という名のプログラム名?ですか???

    毎度毎度忙しい中失礼します。現在<私のプログラム>を基に<参照プログラム>のようにプログラムを作り変えようとしていますが、正直お手上げ状態です。 どうしても<参照プログラム>に基づいてプログラムを組まなければならないのです。 どこがお手上げ状態かといえば、<参照プログラム>を参考にすると、int multInts(int x, int y)内の条件の組み方が<私のプログラム>内でどのようにして組めばいいのかが全くもって分かりません。かなり考えても分からないレベルです・・・私にとっては。 int multInts(int x, int y)の定義の仕方を真似て<私のプログラム>でも真似てみるのですが・・・出来ないのです。何をどう直せば良いのでしょうか???初期化でtra=0;とすると、表示は"0"になったりするし・・・。簡単かと思われるかもしれませんが・・・私にとってはかなり難しいのです。 ”丸投げ”みたいな感じで恥ずかしいのですが、どうかアドバイスだけでも下さい。お願いします。 出力結果 1.5桁数字入力:"12345"と入力 (これは出来ます) 2.偶数桁のみ抽出して2倍にする→"14385" (最不明部: <参照プログラム>内のmultInts内の条件を<私のプログラム>内でどのようにして組むのかが分かりません) 3.各桁の数値を足し合わせる→1+4+3+8+5=21(不明部: 2.が出来ないので出来ません) 4.その数値が”妥当”か”不当”かをDOS?画面に表示(不明部:2.と3.が出来ないので出来ません) <私のプログラム> #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int num,tra; int inpt=5; int inptnum; int sum=0; //#define 0 printf("5桁入力; "); scanf("%d", &num); if (num==0){ printf("その値は0です。 \n"); } else{ for(inpt ; inpt >=1 ; inpt--) { if(inpt%2 == 0) { inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; //printf("%d",tra*2); tra=(tra*2)/10+(tra*2)%10; printf("%d",tra); } else{ inptnum = pow(10,inpt-1); tra = (num/inptnum)%10; printf("%d",tra); } sum += tra; } printf("\n %d\n",sum); sum= sum%10; if(sum==0) { printf("妥当な数値です。\n"); } else { printf("不当な数値です。\n"); } } system("pause"); return 0; } <参照プログラム> #include <stdio.h> #include <stdlib.h> int main(){ int multInts(int x, int y); int num1,num2,answer; printf("間にスペース設けて2つの値入力: "); scanf("%d%d", &num1, &num2); answer = multInts( num1, num2); printf("%d * %d=%d\n", num1, num2, answer); system("pause"); return 0; } int multInts(int x, int y) { int result = 0; int i; for (i=1 ;i<=y ;i++) { result=result + x; } return result; }

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • for文

    整数を読み込んで、その値を0までカウントダウンしながら表示するプログラム作りたいのですが、 while文ではできたのですが、for文ではうまくいきません。 どこが間違っているのでしょうか? OS:Windows XP C++Builder X パーソナル #include <stdio.h> int main(void) { int i; int num; printf("整数を入力してください:"); scanf("%d", &num); for(i = num; i <= 0; --i) { printf("%d", i); } return 0; } 宜しくお願いします。

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

  • while for/ if else/do while文を使い”640968592”の各数字を独立させて取り出すことは可能でしょうか?

    忙しい中失礼します。 今以下のようなプログラミングを組もうとしています。 1.”640968592”といった9桁の数字を入力→scanfで入力(これは出来ます) 2.各桁の数字を独立させて取り出す:”6” ”4” ”0” ”9” ”6”・・・といった具合に(これも一応出来ます) 3.偶数桁は2倍する   2桁目:4x2=8   4桁目:9x2=18   6桁目:8x2=16   8桁目:9x2=18 そして、私の場合、以下のようなプログラムになるのですが、これがなんとも不細工な感じがし、スマートにプログラムを変更したいと思っています。 抱えている問題:while for/ if else/do while文などを用いて、下記のプログラムを書き直すことは可能なのでしょうか?例え出来たとしても、文int=num1~num35までの定義も減らすことは可能なのでしょうか? 手も足も出ない・・・ プログラム内容 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int num1,num2,num3,num4; /*8 9桁目*/ int num5,num6; /*7桁目*/ ・ ・ ・ int num15,num16; /*2桁目*/ int num17; /*1桁目*/ int num19,num20,num21,num22,num23,num24,num25; int num26,num27,num28,num29,num30,num31,num32; int num33,num34,num35; printf("Write the SIN: "); scanf ("%d", &num1); num2=num1 / pow(10, 8); //9桁目 num3=num1 / pow(10, 7); //8桁目 num4=num3 % 10; num5=num1 / pow(10, 6); //7桁目 num6=num5 % 10; ・ ・ ・ num15=num1/pow(10, 1); //2桁目 num16=num15%10; num17=num1%10; //1桁目 num19=num4*2; //8桁目計算 num20=num19/10; num21=num19%10; num22=num20+num21; ・ ・ ・ num31=num16*2; //2桁目計算 num32=num31/10; num33=num31%10; num34=num32+num33; system("pause"); return 0; } こんなのが直ぐにプログラムとして早く組めるようになりたい・・・ どうしても頭に浮かばないのです。アドバイス等あればお願いします。 <使用環境:フリーソフト(Borland?)C ANSI C>

  • for文のループがされません

    #include <stdio.h> main() { int n, count, c; int d = 50000; printf("整数を入力:"); scanf("%d",&n); for(count = 1; count <= n; count++){ c = d * (16 / 100); d += c; } printf("%d回目の数はは%dです\n",n,d); } というプログラムを作ったのですが、for文のところが実行されずに、 1回目ならば58000となるはずなのに初期値のまま50000と表示されてしまいます。 どなたかご指摘お願いします。

  • ループ

    #include<stdio.h> int main(void) { int i=1,sum=0; int num=1; while(num>0) { printf("整数を入力してください。(マイナスの値で終了)\n"); scanf("%d",&num); printf("%dが入力されました。(%d番目の繰り返しです)\n",num,i); sum+=i; printf("1から%dまでをたすと%dです。\n",i,sum); i++; } printf("繰り返しが終わりました。\n"); printf("加算値は%dです。\n",sum); printf("%d回繰り返しました。\n",i); return 0; } このプログラムで101以上の数値は加算しないようにするにはどうすればいいですか。

  • 文字列をint型へ変換するには?

    c言語初心者です。 こちらのプログラムだとうまく表示されません何故でしょう? わかる方是非教えていただきたいと思います。 #include<stdio.h> #include <stdlib.h> int main() { int  num ;     char sum1[4]; printf("数字 str1 =>"); scanf("%d",&num); num= atoi(sum11); printf("sum1= [%d]\n",num); } コマンドに数字を入力したあとintに変換してnumに表示させたいのですが、、、、

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

専門家に質問してみよう