プロが教える店舗&オフィスのセキュリティ対策術

忙しい中失礼します。

今以下のようなプログラミングを組もうとしています。
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>

A 回答 (6件)

プログラム的にはほぼ合っていますが、ループ化するには向きません。


間違いは、ケタが1ketame~3ketameと書いてあるが逆。

ループ化する布石として、
・なるべく数値を直接使わないで変数から求めるようにする。
1ketameとかは、%dketameで変数からケタを表示する。
/100なら、/ pow(10,変数)で計算する。
両方とも、変数ketaから求められますよね。
keta=3;を初期値として、keta--;で減算しながら書いてみてください。
ketanumも3つでは無く1つの変数で処理します。毎ケタ毎残す必要が無ければ同じ変数を使って良いんです。

できあがったプログラムを見てください。同じような処理の繰り返しでループ化できそうになりませんでしたか?

この回答への補足

度々失礼します。
ANo.5に補足回答を付け加えました。

補足日時:2007/10/14 18:22
    • good
    • 0

powはfloat型ですからね。

本当はintにcastしてやらないとだめです。
ketanum = (int)pow(10,keta);
と書くのが正しいです。

で、プログラムですが、
ketanum = (int)pow(10,keta-1);
q = (num/ketanum)%10;
でpが不要になります。
    • good
    • 0
この回答へのお礼

成る程、成る程最後まで的確なアドバイスありがとうございます。
貴重な時間を削っての書き込み等色々と本当にありがとうございました。

お礼日時:2007/10/14 18:58

補足。


>間違いは、ケタが1ketame~3ketameと書いてあるが逆。
間違いは言いすぎでしたね。上位1ケタ目と書けば正解です。
私は、下位から数えて何桁目か表示する方がプログラム的に都合が良いので、そう表現してほしかったんです。
あるいは、100の位と表示したほうが分かりやすいかも知れません。

この回答への補足

忙しい中のアドバイスありがとうございます。

”間違いは言いすぎでしたね。”→気にはしないで下さい。それよりも何よりも非常に助かるアドバイスありがとうございました。
多分解決した!と思います。
プログラミングは以下です。
”968”と入力すると
3ketame 9
2ketame 6
1ketame 8
と表示されるようになりました。

※ketanumだけで”ketanum = (num / (pow(10,keta)/10))%10;”という式1を立てましたが、
”invalid operands `double' and `int' to binary `operator %”
というエラーが必ず出るので(%を式1に入れるのがいけないようなのですが、抜くわけにもいかず・・・)、変数’p’’q’を追加して、式1をばらすことによって、期待していた値(3ketame 9等)を求めることにしました。
そういう意味では期待に沿えず申し訳ありませんでした。
9桁→3桁に下げる=難易度を下げる、成る程名刀な考えですね。
zwiさんの記述を通して、少しプログラムの知識を成長させることが出来た、と思います。
本当に適切なアドバイスありがとうございました!


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int num,p,q;
int keta=3;
int ketanum;

printf("Enter 3 number; ");
scanf("%d", &num);

for(keta ; keta >=1 ; keta--)
{
ketanum = pow(10,keta);

p = ketanum /10;

q = (num/p)%10;
printf("%dketame %d\n",keta,q);
}
system("pause");

return 0;
}

補足日時:2007/10/14 18:02
    • good
    • 0

混乱しているようですので、プログラムの難度を下げてから考えて見ましょう。

まず3桁の処理に減らします。
それと変数が多すぎますので、次の変数だけに減らしてください。
int keta; //今処理中の桁を示す。3から1にカウントダウン処理。
int num; //3桁の値が入る。
int ketanum; //求めた各桁の値が入る。2倍するのもこの変数で。直ちにprintfで出力してこの変数は次の桁にも使いまわす。

これを今の書き方で書いてみてください。変数は増やしてはいけません。
それをループにする方法をこれが出来たら教えます。

この回答への補足

忙しい中の指導ありがとうございます。
1.”int keta; //今処理中の桁を示す。3’桁’から1’桁’にカウントダウン処理。”と解釈させてもらいました。
とはいえこの変数を以下のプログラムでは使いませんでした・・・。
2.”これを今の書き方で書いてみてください。”は私の書いた上記のプログラムを真似る、と解釈し、自分なりに少しスマートにして記入しました。そして、numには”968”という数値を記入してみました。

プログラミングは以下です。多分方向性は間違っているのだろうなぁ・・・と思いつつもこれ以上の考えが出ませんでした。申し訳ありません。
ご指導お願いします。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int num;
int keta;
int ketanum1,ketanum2,ketanum3;

printf("Enter 3 number; ");
scanf("%d", &num);

ketanum1 = (num / 100) % 10;
printf("1ketame %d\n", ketanum1);
ketanum2 = (num / 10) % 10;
printf("2ketame %d\n", ketanum2);
ketanum3 = num %10 ;
printf("3ketame %d\n", ketanum3);

system("pause");

return 0;
}

補足日時:2007/10/14 14:59
    • good
    • 0

結果を出力してる部分がないからプログラム見てもどんな結果が欲しいのかよく分からない。


(もっともプログラムのほうはあまり読んでないけど。)
なので
>  2桁目:4x2=8
>  4桁目:9x2=18
>  6桁目:8x2=16
>  8桁目:9x2=18
こんな感じの結果が欲しいのだと解釈してコードを書いてみました。
※インデントに全角空白を使っているのでコピーして使う場合は削除してください。

> while for/ if else/do while文などを用いて、下記のプログラムを書き直すことは可能なのでしょうか?
せめて桁の分解は配列とループ使ってこんな感じで書くべきじゃない?
 for(i=0;i<9;i++){
   figure[i] = num%10; /*i+1桁目の数値*/
   num = num/10;
 }

あと、変数が多いだけならともかく、命名規則が無くてただの連番だから分かりにくい。
> int num1,num2,num3,num4; /*8 9桁目*/
こんなコメント書くくらいなら変数名見ただけで何桁目か分かるようにするべき。
自分で書いてて分かりにくいとか思わなかった?

あと、変数が多くなりそうなら配列使えないか考えようよ。
配列使った方が添え字が使えてループにしやすいし。


----source----
#include <stdio.h>
#include <string.h> /* for strlen */
#include <ctype.h> /* for isdigit */
int main(){
 char buf[256]; /*文字列バッファ*/
 int i,len;
 int num;

 printf("Input Number: ");
 scanf ("%s", buf);

 len = strlen(buf);
 for(i=1;i<=len;i++){
  printf("%d桁目: ", i);

  if(!isdigit(buf[len-i])){
   printf("not digit\n");
   continue;
  }

  num = buf[len-i] - '0'; /* 数字を数値に変換 */

  if(i%2 == 0){ /*偶数桁*/
   printf("%d x 2 = %d\n",num,num*2);
  }
  else{ /*奇数桁*/
   printf("%d x 1 = %d\n",num,num);
  }
 }
 return 0;
}

----実行結果----
Input Number: 1234567890
1桁目: 0 x 1 = 0
2桁目: 9 x 2 = 18
3桁目: 8 x 1 = 8
4桁目: 7 x 2 = 14
5桁目: 6 x 1 = 6
6桁目: 5 x 2 = 10
7桁目: 4 x 1 = 4
8桁目: 3 x 2 = 6
9桁目: 2 x 1 = 2
10桁目: 1 x 2 = 2
    • good
    • 0
この回答へのお礼

忙しい中の回答ありがとうございます。
こんなに直ぐ回答が出せるWernerさんが羨ましくてなりません。
たかがこんなこと、と思われるかもしれませんが、私にとってはかなりのことなのです。本当にありがとうございました。
”結果を出力してる部分がないからプログラム見てもどんな結果が欲しいのかよく分からない。”そうですね。その通りです。
ぐぅの音も出ません。次回からは気をつけたいと思います。

・・・これは余談ですが、私の求めたい出力結果は以下なのです。
1.”640968592”といった9桁の数字を入力
2.偶数桁を2倍にして表示”680186165182”
3.偶数桁の数値を18=1+8⇒9, 6⇒6, 16=1+6⇒7
4.”680967592”という出力結果を得る。

1と2が組むことが出来れば、3と4はどうにかなるかな、と思っています。
お粗末さまでした。

お礼日時:2007/10/14 15:31

入力用1個、桁分解用4個、組み上げように8個あれば事足りそうです



// 入力用
int num;
// 桁分解用
int bunkai1,bunkai3,bunkai5;
int bunkai7,bunkai9;
// 組み上げ用
int kumiage20, kumiage21, kumiage40, kumiage41;
int kumiage60, kumiage61, kumiage80, kumiage81;

// 変更しない桁の抽出
bunkai1 = num % 10;
bunkai3 = ( num / 100 ) % 10;
bunkai5 = ( num / 10000 ) % 10;
bunkai7 = ( num / 1000000 ) % 10;
bunkai9 = ( num / 100000000 ) % 10;

// 変更する桁の抽出
kumiage20 = ( num / 10 ) % 10;
kumiage40 = ( num / 1000 ) % 10;
kumiage60 = ( num / 100000 ) % 10;
kumiage80 = ( num / 10000000 ) % 10;

// 2桁目
kumiage20 *= 2;
kumiage21 = kumiage20 / 10;
kumiage20 %= 10;

// 4桁目
kumiage40 *= 2;
kumiage41 = kumiage40 / 10;
kumiage40 %= 10;

// 6桁目
kumiage60 *= 2;
kumiage61 = kumiage60 / 10;
kumiage60 %= 10;

// 8桁目
kumiage80 *= 2;
kumiage81 = kumiage80 / 10;
kumiage80 %= 10;

といった具合にして
bunkai9 kumiage81 kumiage80 bunkai7 kumiage61 kumiage60
bunkai5 kumiage41 kumiage40 bunkai3 kumiage21 kumiage20
bunkai1
の順に出力すればいいかと
この際 kumiageX1が0かどうか確認して桁を増やすかどうか決めましょう

配列を使って組んだほうがすっきりしますよ
    • good
    • 0
この回答へのお礼

忙しい中にもかかわらずの回答ありがとうございました。
( num / 100 ) % 10・・・そうですよね。そうすれば変数の省略も可能ですよね。
また、”bunkai9・・・bunkai1の順に出力すればいいかと”のところですが、私の分かりにくい説明文ではなく、プログラミングを細かく見て頂いたことがしれます。
アドバイスありがとうございました。

お礼日時:2007/10/14 15:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!