R64 0,30 動作しない
考察
これは問題から何がやりたいのかイメージできない。
問題
(1)処理概要
数字(最大9桁)を入力し、3桁ごとにカンマを挿入し表示する。編集を行う関数名を
henshuとする。
(2)表示例
数字(最大9桁)を入力してください------->-1234
編集された数字------------------------>-1,234
(3)考え方 (-1234を入力したときの例)
①-1234<0なので正の数1234を求める。
②数字を10で割って行き、余りを順次文字列に格納する。
3桁ごとにカンマを挿入する。
1234÷10=123 余り 4、 4を文字列(0)へ。文字列は「4」
123 ÷10=12 余り 3、 3を文字列(1)へ。〃「43」
12 ÷10=1 余り 2、 2を文字列(2)へ。〃「432」
3桁格納したので ,を文字列(3)へ。〃「432,」
1 ÷10=0 余り 1、 1を文字列(4)へ。〃「432,1」
③商が0になったので符号(マイナス) -を文字列(5)へ。〃「432,1-」
④最後に文字の終わりを表す \0を文字列(6)へ。〃「432,1-\0」
④文字列は[432,1-\0]となっているので
これを逆に変換[-1,234\0]とする。
※最後に文字列の最後を表す'\0'を挿入する。
(4)メイン処理
①数字(suuji)を入力する。
②編集関数(henshu)を実行する。
・編集関数にて数字(suuji)の3桁ごとにカンマを挿入し、文字(moji)に格納して
受け取る。
・文字(moji)は'\0'を含めて13文字とする。
・引数は数字(suuji)を値渡し、文字(moji)をアドレス渡しとする。
henshu(suuji,moji);
③編集された文字を表示する。
(5)編集関数 「 void henshu(int suuji, char *moji) 」
①受け取った数字(suuji)が0以上ならそのまま数字0(suuji0)へ、
suuji0 = suuji;
0未満(マイナス)ならプラスにして数字0(suuji0)に格納する。
suuji0 = 0 - suuji;
②カウンタiが13未満で、数字0(suuji0)が0でない間は、次の③~⑥を繰り返す。
このとき初期値としてi=0,j=0とし、それぞれ繰り返すごとに+1する。
for (i=0,j=0;i<13 suuji0="" 0="" i="" j="" div="">
(注)iは数字の右側からの桁数(カウンタ)、jは文字列の左側からの添え字。
④数字0を10で割り、商を数字0(suuji0)へ、余りを数字1(suuji1)へ格納する。
suuji1 = suuji0 % 10;
suuji0 = suuji0 / 10;
⑤数字1(suuji1)を文字に変換し文字列(mojiretu)へ格納する。
char suuji_t="0123456789"; → 宣言文
char mojiretu[13]=" "; → 宣言文
mojiretu[j] = suuji_t[suuji1]; → 数字を文字に変換
⑥数字0(suuji0)が0でないときは、3桁ごと「(i+1)%3==0」に
添え字jを+1し、カンマを文字列へ格納する。
if((i+1)%3 == 0 && suuji0 != 0{
j++;
mojiretu[j]=',';
}
⑦数字(suuji)がマイナスのときはマイナス符号を文字列へ格納する。
if(suuji < 0){
mojiretu[j] = '-';
j++;
}
⑧文字列(mojiretu)の最後に'\0'を格納する。
mojiretu[j] = '\0';
⑨文字列(mojiretu)を最終結果の文字(moji)に変換する。
このときmojiretuの添え字をiとしmojiの添え字をkとする。
文字列(mojiretu) 文字(moji)
432,1-\0 → -1,234\0
k = j - 1;
for (i = 0 ; mojiretu[i] != '\0' ; i++){
j = k - i;
*(moji+j) = mojiretu[i];
}
*(moji+i)='\0';
動作しない
#include
int main()
{
int suuji, henshu;
char moji[13];
printf("数字(最大9桁)を入力してください。");
scanf("%d", &suuji);
henshu(suuji, moji);
printf("編集された数字 %s\n", moji);
return 0;
}
void henshu(int suuji, char *moji)
{
int i,j,k,suuji0,suuji1;
char suuji_t = "0123456789";
char mojiretu[13] = " ";
if (suuji<0)
{
suuji0 = 0 - suuji;
}
else
{
suuji0 = suuji;
}
for (i=0, j=0; i<13 && suuji0 !=0; i++,j++)
{
suuji1 = suuji0 % 10;
suuji0 = suuji / 10;
mojiretu[j] = suuji_t[suuji1];
if ((i+1)%3 == 0 && suuji0 !=0)
{
j++;
mojiretu[j] = ',';
}
}
if (suuji<0)
{
mojiretu[j] = '-';
j++;
}
mojiretu[j] = '\0';
k = j - 1;
for (i=0; mojiretu[i] !='\0'; i++) {
j = k - i;
*(moji+j) = mojiretu[i];
}
*(moji+i)='\0';
}
int main()
{
int suuji, henshu;
char moji[13];
printf("数字(最大9桁)を入力してください。");
scanf("%d", &suuji);
henshu(suuji, moji);
printf("編集された数字 %s\n", moji);
return 0;
}
void henshu(int suuji, char *moji)
{
int i,j,k,suuji0,suuji1;
char suuji_t = "0123456789";
char mojiretu[13] = " ";
if (suuji<0)
{
suuji0 = 0 - suuji;
}
else
{
suuji0 = suuji;
}
for (i=0, j=0; i<13 && suuji0 !=0; i++,j++)
{
suuji1 = suuji0 % 10;
suuji0 = suuji / 10;
mojiretu[j] = suuji_t[suuji1];
if ((i+1)%3 == 0 && suuji0 !=0)
{
j++;
mojiretu[j] = ',';
}
}
if (suuji<0)
{
mojiretu[j] = '-';
j++;
}
mojiretu[j] = '\0';
k = j - 1;
for (i=0; mojiretu[i] !='\0'; i++) {
j = k - i;
*(moji+j) = mojiretu[i];
}
*(moji+i)='\0';
}