忙しい中失礼します。
今以下のようなプログラミングを組もうとしています。
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>
No.4ベストアンサー
- 回答日時:
プログラム的にはほぼ合っていますが、ループ化するには向きません。
間違いは、ケタが1ketame~3ketameと書いてあるが逆。
ループ化する布石として、
・なるべく数値を直接使わないで変数から求めるようにする。
1ketameとかは、%dketameで変数からケタを表示する。
/100なら、/ pow(10,変数)で計算する。
両方とも、変数ketaから求められますよね。
keta=3;を初期値として、keta--;で減算しながら書いてみてください。
ketanumも3つでは無く1つの変数で処理します。毎ケタ毎残す必要が無ければ同じ変数を使って良いんです。
できあがったプログラムを見てください。同じような処理の繰り返しでループ化できそうになりませんでしたか?
No.5
- 回答日時:
補足。
>間違いは、ケタが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;
}
No.3
- 回答日時:
混乱しているようですので、プログラムの難度を下げてから考えて見ましょう。
まず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;
}
No.2
- 回答日時:
結果を出力してる部分がないからプログラム見てもどんな結果が欲しいのかよく分からない。
(もっともプログラムのほうはあまり読んでないけど。)
なので
> 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
忙しい中の回答ありがとうございます。
こんなに直ぐ回答が出せるWernerさんが羨ましくてなりません。
たかがこんなこと、と思われるかもしれませんが、私にとってはかなりのことなのです。本当にありがとうございました。
”結果を出力してる部分がないからプログラム見てもどんな結果が欲しいのかよく分からない。”そうですね。その通りです。
ぐぅの音も出ません。次回からは気をつけたいと思います。
・・・これは余談ですが、私の求めたい出力結果は以下なのです。
1.”640968592”といった9桁の数字を入力
2.偶数桁を2倍にして表示”680186165182”
3.偶数桁の数値を18=1+8⇒9, 6⇒6, 16=1+6⇒7
4.”680967592”という出力結果を得る。
1と2が組むことが出来れば、3と4はどうにかなるかな、と思っています。
お粗末さまでした。
No.1
- 回答日時:
入力用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かどうか確認して桁を増やすかどうか決めましょう
配列を使って組んだほうがすっきりしますよ
忙しい中にもかかわらずの回答ありがとうございました。
( num / 100 ) % 10・・・そうですよね。そうすれば変数の省略も可能ですよね。
また、”bunkai9・・・bunkai1の順に出力すればいいかと”のところですが、私の分かりにくい説明文ではなく、プログラミングを細かく見て頂いたことがしれます。
アドバイスありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
c言語プログラミングで1から100...
-
for文の中にswitch文はいれられ...
-
C言語の二分法のプログラムにつ...
-
while文について、c言語...
-
C言語プログラムが理解できなくて…
-
初心者です。for文、if文を使っ...
-
C言語 数字以外を入力させない...
-
1からnまでの和を求めるプログ...
-
配列を使って魔方陣
-
プログラムの勉強でわからない...
-
xのy乗を求める問題で…(ただし...
-
c言語の問題
-
switch文をif文に変換
-
C言語でfor文を用いたプログラ...
-
c言語のwhile文を使った計算で...
-
全角文字の判定
-
分散を求めるプログラム
-
c言語のプログラムで
-
VHDLで、case文とwhen文のどち...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
計算結果がlong型以上になる場...
-
プログラミングで二番目に大き...
-
scanf関数を用いての加減乗除%...
-
getcの改行判定
-
C言語で電卓を作成する。
-
配列を使って魔方陣
-
C言語で勉強中(max,min)の出し方
-
C言語階乗の総和を求める
-
VHDLで、case文とwhen文のどち...
-
C言語でのトランプシャッフルに...
-
プログラム
-
while文について、c言語...
-
OpenCVを用いて任意の時間で静...
-
scanfが実行されません
-
C言語 数字以外を入力させない...
-
C言語です
おすすめ情報