放置codeの公開

double-clutch.
記事: 21
登録日時: 8年前
住所: 近畿

放置codeの公開

投稿記事 by double-clutch. » 8年前

CODE:

/*  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;
}
はい こちらは、仕様を満たしていませんでした。
学んだ事をとにかく試したかったんだな っと回想されます。

CODE:

// 指定された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に続きます...

CODE:

	i = 0;
	j = A[i];
	while (++i < 5){
		j *= 10;
		j += A[i];
	}
さて、jの値はどうなるでしょう!!
最後に編集したユーザー double-clutch. on 2016年5月27日(金) 21:11 [ 編集 2 回目 ]

コメントはまだありません。