![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
5桁の10進数文字を16進数に変換するコードを作成したのですが、コード上の「商と余りを配列に代入」の箇所をfor文で作成したいのですが、うまくいかず1文1文のコードになってしまいました。「商と余りを配列に代入」する箇所に、当てはまるfor文のコードの所だけ、書き換えたいので教えていただけないでしょうか?
//10進数文字を数字の16進数で表示//
#include "stdafx.h"
#define HEX 5
//「function」:入力文字された文字の処理//
char ToInt( char cInt)
{
int mal=0;
switch (cInt){
case '0':mal=0;break;
case '1':mal=1;break;
case '2':mal=2;break;
case '3':mal=3;break;
case '4':mal=4;break;
case '5':mal=5;break;
case '6':mal=6;break;
case '7':mal=7;break;
case '8':mal=8;break;
case '9':mal=9;break;
}
return (mal);
}
//「function」:入力文字された文字数//
char HexInt( char eInt)
{
char mul=0;
switch (eInt){
case 0:mul='0';break;
case 1:mul='1';break;
case 2:mul='2';break;
case 3:mul='3';break;
case 4:mul='4';break;
case 5:mul='5';break;
case 6:mul='6';break;
case 7:mul='7';break;
case 8:mul='8';break;
case 9:mul='9';break;
case 10: mul='A';break;
case 11: mul='B';break;
case 12: mul='C';break;
case 13: mul='D';break;
case 14: mul='E';break;
case 15: mul='F';break;
}
return (mul);
}
//「function」:桁数の計算(10×指数を計算)//
int HexAcc( int n )
{
int i;
int ans=1;
for( i=0; i<n; i++ ){
ans *= 10;
}
return (ans);
}
int _tmain(int argc, _TCHAR* argv[])
{
int i=0,n=0,j=0,k=0,s=0,m=0;
char decimal[255], ditto[255],sub[255],temp[255],flip[255],na[255];
int u=0,odd=0;
int a=0,b=0;
int sam1=0,sam2=0,sam3=0,sam4=0,sam5=0;
int mas1=0,mas2=0,mas3=0,mas4=0,mas5=0;
if( argc > 1 ){
decimal[s] = argv[1][i];
}
else{
printf("10進数を入力してください。\n");
return 1;
}
for( k=0; k<=HEX; k++ ){
sub[k] = '0';
}
for( k=0; k<=HEX; k++ ){
temp[k] = '0';
}
for( k=0; k<=HEX; k++ ){
flip[k] = '0';
}
for( k=0; k<=HEX; k++ ){
na[k] = '0';
}
for( i=0; argv[1][i] != '\0'; i++ ){
decimal[i] = argv[1][i];
}
decimal[i] = '\0';
for( i=0; decimal[i] != '\0'; i++ ){
if( decimal[i] != ' ' ){
ditto[n] = decimal[i];
n++;
}
}
ditto[n]='\0';
for( n=0; ditto[n] != '\0'; n++ ){
if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' )
|| ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' )
|| ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){
}else{
printf("エラー\n 10進数を入力してください。\n");
return 0;
}
}
for( n=0; ditto[n] != '\0'; n++ ){
m = m + 1 ;
}
if( m <= HEX ){
}else{
printf("エラー\n入力文字数は、%d文字以内にしてください。\n",HEX);
return 0;
}
for( n=0; ditto[n] != '\0'; n++){
sub[HEX-m+n] = ditto[n];
}
sub[HEX] = '\0';
int ans=0, add=0;
for( n=0; sub[n] != '\0'; n++){
ans = ToInt(sub[n]);
add += ans * HexAcc(HEX-n-1);
}
//商と余りを配列に代入//
sam1 = add / 16;
mas1 = add - sam1 *16;
temp[0] = mas1;
sam2 = sam1 / 16;
mas2 = sam1 - sam2 * 16;
temp[1] = mas2;
sam3 = sam2 / 16;
mas3 = sam2 - sam3 * 16;
temp[2] = mas3;
sam4 = sam3 / 16;
mas4 = sam3 - sam4 * 16;
temp[3] = mas4;
sam5 = sam4 / 16;
mas5 = sam4 - sam5 * 16;
temp[4] = mas5;
//商と余りを配列に代入・ここまでfor文に変更したいです//
temp[5]='\0';
for( a=0; a<2; a++ ){
b = temp[a];
temp[a] = temp[4-a];
temp[4-a] = b;
}
temp[n]='\0';
for( n=0; sub[n] != '\0'; n++){
na[n] = HexInt(temp[n]);
}
na[5]='\0';
printf("\n10進数文字を16進数で変換した値は %s \n",na);
}
No.3ベストアンサー
- 回答日時:
★繰り返し文(for,while,do-while)を復習しなおしましょう。
・過去に幾つかのソースを見ましたが上から順に処理するやり方なら理解できるようですね。
繰り返し文は変化する場所を変数に置き換えてしまえば良いだけなんですが…。
そんなに難しく考えずに最初は上から下へ処理するソースを書きましょう。
その後に変化する場所を変数に置き換えて for 文などで書き直せば分かりやすいです。
//商と余りを配列に代入//
sam1 = add / 16;
mas1 = add - sam1 *16;
temp[0] = mas1;
sam2 = sam1 / 16;
mas2 = sam1 - sam2 * 16;
temp[1] = mas2;
sam3 = sam2 / 16;
mas3 = sam2 - sam3 * 16;
temp[2] = mas3;
sam4 = sam3 / 16;
mas4 = sam3 - sam4 * 16;
temp[3] = mas4;
sam5 = sam4 / 16;
mas5 = sam4 - sam5 * 16;
temp[4] = mas5;
↓
商と余りに『/』と『%』演算子を使って書き直してみる。
↓
sam1 = add / 16; ←商
mas1 = add % 16; ←余り
temp[0] = mas1;
sam2 = sam1 / 16;
mas2 = sam1 % 16;
temp[1] = mas2;
sam3 = sam2 / 16;
mas3 = sam2 % 16;
temp[2] = mas3;
sam4 = sam3 / 16;
mas4 = sam3 % 16;
temp[3] = mas4;
sam5 = sam4 / 16;
mas5 = sam4 % 16;
temp[4] = mas5;
↓
『mas1』~『mas5』を直接 temp[n] に代入。
『商』より『余り』を先に計算するように順番を変える。
↓
temp[0] = add % 16; sam1 = add / 16;
temp[1] = sam1 % 16; sam2 = sam1 / 16;
temp[2] = sam2 % 16; sam3 = sam2 / 16;
temp[3] = sam3 % 16; sam4 = sam3 / 16;
temp[4] = sam4 % 16; sam5 = sam4 / 16;
↓
『sam1』~『sam5』を『add』の1つに代入する。
『sam1』を『add』にその次の行の『sam2』を『add』…と変換。
↓
temp[0] = add % 16; add = add / 16;
temp[1] = add % 16; add = add / 16;
temp[2] = add % 16; add = add / 16;
temp[3] = add % 16; add = add / 16;
temp[4] = add % 16; add = add / 16;
↓
temp[0]~temp[4]の添え字を変数iで置き換える
↓
i=0;
temp[i++] = add % 16; add = add / 16;
temp[i++] = add % 16; add = add / 16;
temp[i++] = add % 16; add = add / 16;
temp[i++] = add % 16; add = add / 16;
temp[i++] = add % 16; add = add / 16;
↓
さぁ。for文に書き換えてみて下さい。
これでfor文を使って配列に余りを格納できます。
出来上がったソースは補足に貼り付けてみて下さい。
それでゎ。
この回答への補足
Oh-Orangeさま
いつも解り易い、ご説明をいただき本当に感謝しております。
私の理解度まで把握していただき、丁寧な回答に満足です。以下に、アドバイスを頂いた内容でfor文を作成しました。
for( n=0; sub[n] !='\0'; n++){
temp[n] = add %16;
add = add / 16;
}
今度は、10進数を2進数に変換するプログラムを作成しているのですが解らず煮詰まってます。お暇な時に、ご教授いただければ幸いです。
http://oshiete1.goo.ne.jp/qa3766282.html
No.4
- 回答日時:
>5桁の10進数文字を16進数に変換する
★「10進数5桁の文字列を16進数で『表記』する」だよね。
そのつもりで、ソースを見ると・・。
★ ToInt() 関数
・関数名・戻り値の型と、関数の型が・・、(少し経つと自分でも・・)。
・10行ほどの switch 文と return 文は、1行の return( cInt - 0x30 ); と同じ。
・メモリの中は、どうなっているか把握する(参考URL)
★ HexInt() 関数
・関数名が・・、DecChr2HexChr() 位の工夫も・・(名は体を表す?)。
・case 文で 0-15 の「整数」を用いてるけど、まっ、127 を超えないことが判ってのことか。
・視認性をよくするなら、呼び出すおおもとの配列 temp[] は、整数がいいのでは・・。
・ソースは、if 文を使って、
if( 10 > eInt ) return( eInt + 0x30 );
if( 10 == eInt ) return( 'A' );
if( 11 == eInt ) return( 'B' );
if( 12 == eInt ) return( 'C' );
if( 13 == eInt ) return( 'D' );
if( 14 == eInt ) return( 'E' );
if( 15 == eInt ) return( 'F' );
return( '@' );
少しスッキリするかな。
★下の引用、ちょっと工夫の余地が・・。
for( n=0; ditto[n] != '\0'; n++ ){
if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' )
|| ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' )
|| ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){
}else{
printf("エラー\n 10進数を入力してください。\n");
return 0;
}
要は、数字以外を判定だよね、
for( n = 0; ditto[n] != '\0'; n++ ){
if( ! isdigit( ditto[n] ){
printf( "エラー\n 10進数を入力してください。\n" );
return 0;
}
}
または、if 文部分を
if( ( '0' > ditto[n] ) || ( '9' < ditto[n] ) ){
printf( "エラー\n 10進数を入力してください。\n" );
return 0;
}
の方が、スッキリしている。
◆ヒント
・したいことの関数はないか、if 文で連続するものを判定する場合、簡略化出来ないか。
・質問者様のですと、却って '0' から '9' までの間に《除外するもの》があるのか、と別のことを考えてしまう。
●と、つらつらと書きましたが、プログラムが書けるようになって、自分の「思っていること」が、ほぼ実現できるようになって、じゃあ今度はそれを「スマート」に、と《非常に良い》プログラミングの発展状況が伝わってきます。
●ともかく、たくさん書きましょう。
●その中で、いろんな工夫(バグを潜ませない自分なりの工夫記述等)がなされることでしょう。
年寄りのソースを示します(参考にはなりません、「文字」は?、「数」は?が学習できない)。
でも「機能」的には質問者様の目的にかなっていると思います。
なお、入力した数字列も表示しているため、「数字でない」、「桁あふれ」のチェックはしていません。
(入力した人が、自分の入力ミスを一番よく判る。また、int の限界も・・)
#include <stdio.h>
#include <stdlib.h>
void main( int iArgc, char *cArgv[] )
{
int iVal;
if( 2 != iArgc ){
printf( ">hoge.exe 12345\n" );
exit( 0 );
}
iVal = atoi( cArgv[1] );
printf( "in=%s Dec=%d Hex=%X\n", cArgv[1], iVal, iVal );
}
注:インデントに全角空白を用いています。
参考URL:http://e-words.jp/p/r-ascii.html
No.2
- 回答日時:
あくまで骨組みとしてなのですが、
以下ではどうですか?
:
:
for (i=0;add&240&&(i<HEX-1);i++)
{
sam=add/16;
mas=add-sam*16;
add=mas;
temp[i]=sam;
} temp[i]=add%16;
for( a=0; a<2; a++ ){
b = temp[a];
temp[a] = temp[4-a];
temp[4-a] = b;
}
temp[++i]='\0';
:
:
No.1
- 回答日時:
あえて答えは書きません.
例えば
sam2 = sam1 / 16;
mas2 = sam1 - sam2 * 16;
temp[1] = mas2;
sam3 = sam2 / 16;
mas3 = sam2 - sam3 * 16;
temp[2] = mas3;
の部分は, 前半が「前段から sam1 を受け取り次段に sam2 を送る」, 後半が「前段から sam2 を受け取り次段に sam3 を送る」という形です. これでは都合がわるいので, まず「前段から受け取る変数と次段に送る変数を同じにする」ことをしてみてください. また, mas2 や mas3 はそれぞれの部分でしか使われていませんから, 実際には 1つの変数にまとめることができます.
このようにして, 「配列の添字以外は同じ」という形にしておけば, 簡単に for ループに変更できるはずです.
この回答への補足
Tacosanさま
mai-07_maiと申します。
ご返答、誠にありがとうございます。
アドバイスされた内容でコードを考え記述しましたが、商の値しか代入されず正確な変換が行えませんでした。C言語を習い始めたばかりで、どのようなロジックを組んでいいかが解りません。出来ましたらfor文のコードを教えていただければ大変、助かります。宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使って魔方陣
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
構文エラー";"が型の前にあり...
-
VHDLで、case文とwhen文のどち...
-
SIGALRMでプロセス終了
-
プログラム
-
初心者です。for文、if文を使っ...
-
for文を使用して値を代入したい...
-
scanfが実行されません
-
#if 1 #elseの意味について
-
5×5行列、固有値、固有ベクトル
-
独立係数について教えて下さい。
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語について。
-
「Aに対するBの割合」と「Aに対...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
C言語 数字以外を入力させない...
-
c言語のwhile文を使った計算で...
-
C言語プログラムが理解できなくて…
-
C言語で電卓を作成する。
-
配列を関数に渡す方法
-
C言語の二分法のプログラムにつ...
-
c言語for文
-
scanf関数を用いての加減乗除%...
-
階乗のプログラム!!
-
計算結果がlong型以上になる場...
-
c言語プログラミングで1から100...
-
初心者です。for文、if文を使っ...
おすすめ情報