/* 10進数の値を指定されて基数に変換するプログラムを作りたい
* 1つ、変換元の値と変換したい基数をコマンドラインで指定する。
* 2つ、再帰関数を使用すること
* 3つ、変換方法は整数部には乗算、小数部には除算を用いるものを採用する
*/
#include
#include
// 整数部を処理する関数
void Integer_recures(int i);
// 小数部を処理する関数
void float_recures(double f, unsigned *);
// 出力結果が[9]を上回る場合の処理
void over_10(int i);
int E;
int main(int argc, char *argv[])
{
double base, d;
int i;
char float_count[30];
unsigned int count;
if (argc != 3) {
fputs("プログラムの使用方法:<プログラム名><10進数値><変換したい基数>\n", stdout);
exit(1);
}
// コマンドラインの指定が正しいかチェックする、且つ文字列から値に変換する。
if (!(base = atof(argv[1]))) {
fputs("<10進数値>の入力が正しくありません\n", stdout);
exit(1);
}
if (!(E = atoi(argv[2]))) {
fputs("<変換したい基数>の入力が正しくありません\n", stdout);
exit(1);
}
// [i]には baseの整数部を、[d]には baseの小数部を代入する
i = (int)base;
d = base - (double)i;
// 変換後の小数部を何桁まで表示するかを問い、入力を指示する
do {
fputs("変換後の小数部を何桁まで表示しますか?:", stdout);
fgets(float_count, 30, stdin);
} while (!(count = atoi(float_count)));
// 整数部を表示する
Integer_recures(i);
fputc('.', stdout);
// 小数部を表示する
float_recures(d, &count);
fputc('\n', stdout);
return 0;
}
void over_10(int i)
{
switch (i) {
case 10:
fputc('a', stdout);
break;
case 11:
fputc('b', stdout);
break;
case 12:
fputc('c', stdout);
break;
case 13:
fputc('d', stdout);
break;
case 14:
fputc('e', stdout);
break;
case 15:
fputc('f', stdout);
break;
}
}
void Integer_recures(int i)
{
// a / b == [商]...[剰余]
int quotient = 0; // [商]
while (i >= E) {
i = i - E;
quotient++;
}
// ここで、[i]が剰余となる
// 再帰関数をさらに呼び出すかどうか判定している
if (quotient) Integer_recures(quotient);
if (i
int main(void)
{
unsigned char count, i = 0;
for (count = 1; count
#include
void String_Pack(char *);
void String_Pack(char*str)
{
while (*str)
*str++ = *(str + 1);
}
int main(void)
{
char *c_p, str[30], ch, count;
// charポインタ[c_p]にchar配列[str]の先頭アドレスを代入する
c_p = str;
fputs("20文字以内の文字列を入力してください:", stdout);
// 文字列を入力する
fgets(str, 30, stdin);
/* 参照記述 『例9.4.0_3』 */
// 入力した文字列の中に『改行文字』が含まれているか調べる
while (*c_p) {
/* 参照記述 『例6.2.0_1』 */
/* 『演算子の種類と結合』については Excelにて記述済み */
if (*c_p == '\n') {
*c_p = '\0';
break;
}
c_p++;
}
// 数えたい文字を指定させる
fputs("先程入力した文字列の中から特定の文字をカウントします\n", stdout);
fputs("1文字入力してください:", stdout);
ch = fgetc(stdin);
/* 参考資料 『例9.2.0_5』 */
// ①指定された文字を数える
c_p = str;
count = 0;
while (*c_p) {
if (*c_p++ == ch)
count++;
}
// 表示する
fprintf(stdout, "文字列中の[%c]の個数は %d個です\n", ch, count);
// ②指定された文字を詰める
c_p = str;
count = 0;
while (*c_p) {
if (*c_p == ch)
String_Pack(c_p);
c_p++;
}
// 表示する
fprintf(stdout, "文字列から%cを削除して詰めた結果:%s\n", ch, str);
return 0;
}
学んだ事をとにかく試したかったんだな っと回想されます。
// 指定された2乗値を求めるプログラム
// 「インド式乗算」を用いる。
// ここでは、変数 X は整数変数かつ三桁値とします。
#include
#include
#include
int get_no(const char *, const int);
int main(void)
{
char str[80];
int A[5],
i,
j,
X;
fputs("3桁の整数値を入力したください\n", stdout);
do {
X = atoi(fgets(str, 80, stdin));
} while ((999 < X) || (X < 100));
// Xの値が3桁値 (100 <= X <= 999) となるまで、入力をさせる
i = get_no(str, 3);
A[0] = i * i;
A[1] = get_no(str, 3);
A[1] *= get_no(str, 2);
A[1] *= 2;
A[2] = get_no(str, 3);
A[2] *= get_no(str, 1);
A[2] *= 2;
i = get_no(str, 2);
A[2] += i * i;
A[3] = get_no(str, 2);
A[3] *= get_no(str, 1);
A[3] *= 2;
i = get_no(str, 1);
A[4] = i * i;
i = 0;
j = A[i];
while (++i < 5){
j *= 10;
j += A[i];
}
fprintf(stdout, "%d * %d == %d\n変数 jの値 %d\n", X, X, X*X, j);
for (i = 0; i < 5; i++)
fprintf(stdout, "配列 Aの%d番目の値:%3d\n", i, A[i]);
return 0;
}
int get_no(const char *cp, const int a) {
// 機能説明、与えられた数字列から任意の数字を、整数値として返す。
// 第一引数、数値を表す数字列
// 第二引数、取り出したい値の桁数
char st[2];
int i;
*(st + 1) = '\0'; // 文字列 stの最後尾に'\0'を代入
if (a == 1) i = 2;
else if (a== 2) i = 1;
else i = 0;
*st = *(cp + i);
return atoi(st);
}
という 驚きを隠せない記事を見つけて...しばらく実演したんですが...
これ、やっている処理は日本の小学校で教わる『筆算』と同じだと気がついたときは落胆しました。
たとえば、「12 * 34」を『インド式掛け算法』で計算するとして、文章でその過程を表現すると...
演算子「*」のオペランドを「A」「B」とそれぞれ表現します。
A == 12 B == 34 ...
ここで更に Aの一桁目を「A_1b」...二桁目を「A_2b」と表すとします。
B も同様に...
... A_2b * B_2b * 100 // 3桁目の重み「100」を掛ける
... (A_2b * B_1b + A_1b * B_2b) * 10 // 2桁目...
... A_1b * B_1b
.......上記の式の総和が「12 * 34」と等しくなります。
...これを違う表現にすると....変数a, b, c, d はいずれも 0~9 の値とする
(10a + b)(10c + d) = 100ac + 10ab + 10cb + bd
...となります。
ここで、同じ数値の積を求める場合は どうなるのか...
(10a + b)(10a + b) == (10a * b)^2 == 100*a^2 + 20ab + b^2
...となる。
....最後に 三桁の2乗値を求めると
(100a + 10b + c)^2 == a^2 * 100^2 + 2ab * 1000 + 2ac * 100 + b^2 * 100 + 2bc * 10 + c^2
10,000の位の値をA[0]に代入、1.000の位をA[1]に....略....1の位の値をA[4]に代入 . . .
ここで 次のcodeに続きます... さて、jの値はどうなるでしょう!!