C++ 表示が思う通りにいかない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JJJuto
記事: 29
登録日時: 3年前

C++ 表示が思う通りにいかない

#1

投稿記事 by JJJuto » 2年前

やりたいこと
筆算(足し算)をしたい

実行イメージ

入力>123

     0
    123
----------------
    123

現在のコード

コード:

int main()
{
	const int n = 50;
	string input;
	int num[n] = {0};
	int value[n] ;
	int sum[n];

	cout << "入力>";
	cin >> input;
	cout << "\n";

	for (int i = 0; i < input.length(); i++) 
	{
		value[i] = input[input.length() - 1 - i] - '0';
		sum[i] = num[i] + value[i];		
	}
	
	for (int i = 0; i < input.length(); i++) {
		cout << setw(50) << num[i] << "\n";
		cout << setw(50) << input << "\n";
		cout << "---------------------------------------------------\n";
		cout << setw(50) << sum[input.length()-i-1] <<"\n\n";
	}
}
各要素に格納する数字を、筆算がしやすいよう逆向きにしたあと、足して表示するというイメージです。

現在の実行結果

入力>123

    0
   123
------------
    1

    0
   123
-------------
    2

    0
   123
------------
    3

各要素を表示しちゃう形になっていて、イメージとは少し違った感じになってます。
色々試したり、調べたのですが、同じような結果になったり、範囲外メモリにアクセスしちゃったりで上手くいかず詰まってます。
どう直せば、イメージ通りに行くか知りたいです。よろしくお願いします。
実行イメージのようにするには、

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C++ 表示が思う通りにいかない

#2

投稿記事 by みけCAT » 2年前

・それぞれの配列を出力しきるまで別の配列を出力しないようにする
・初期化していない部分の値を使わないようにする
などに注意して、出力がイメージ通りになるように直せばいいと思います。

コード:

#include <iostream>
#include <iomanip>
#include <string>
using std::cin;
using std::cout;
using std::setw;
using std::string;

// 表示を開始するべき桁 (0でない最初の桁、または(全部0の場合)最後の桁) の位置を返す
int getDisplayStartPoint(const int num[], int n)
{
	for (int i = n - 1; i > 0; i--)
	{
		if (num[i] != 0)
		{
			return i;
		}
	}
	return 0;
}

// 値が逆順に格納された配列を1行で出力する
void printArray(const int num[], int n, int width)
{
	int start = getDisplayStartPoint(num, n);
	for (int i = width - 1; i >= 0; i--)
	{
		if (i > start)
		{
			cout << ' ';
		}
		else
		{
			cout << num[i];
		}
	}
	cout << '\n';
}

int main()
{
	const int n = 50;
	string input;
	int num[n] = {0};
	int value[n] ;
	int sum[n];

	cout << "入力>";
	cin >> input;
	cout << "\n";

	for (int i = 0; static_cast<unsigned int>(i) < input.length(); i++) 
	{
		value[i] = input[input.length() - 1 - i] - '0';
		sum[i] = num[i] + value[i];
	}

	printArray(num, n, n);
	cout << setw(n) << input << "\n";
	cout << "---------------------------------------------------\n";
	printArray(sum, input.length(), n);
}
実行結果

コード:

入力>
                                                 0
                                               123
---------------------------------------------------
                                               123
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C++ 表示が思う通りにいかない

#3

投稿記事 by あたっしゅ » 2年前

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21295&sid=deb6dff8a55063bf6c3cb017628cda94
// C++ 表示が思う通りにいかない - ミクプラ(ja)
//
// for VS2021 Preview on Windows Insider Preview
//
#include <cstdlib>

#include <string>
#include <iostream>
#include <iomanip>


const int n = 4;


void output(int* v)
{
	for (unsigned int i = 0; i < n; i++) {
		std::cout << std::setw(1) << v[ n - i - 1 ];
	}
}


int main() try
{
	std::string input;
	int num[n] = { 7, 8, 9, 0 };  // 987
	//int value[n];
	int sum[n];

	while (true) {
		std::cout << "3 桁までの数字を入力>";
		std::cin >> input;
		std::cout << std::endl;
		std::cout << input.length() << std::endl;

		if (input.length() < 4) {
			break;
		}
	}

	output( num );

	for (unsigned int i = 0; i < n; i++)
	{
		sum[i] = 0;
	}

	for (unsigned int i = 0; i < n; i++)
		{
			int value;

		if ( i < ( input.length() ) ) {
			value = input[input.length() - i - 1 ] - '0';
		}
		else {
			value = 0;
		}
		//std::cout << "value[" << i << "]"<< value << std::endl;
		sum[i] += num[i] + value;
		//std::cout << "sum[" << i << "]"<< sum[ i ] << std::endl;
		if (sum[i] > 9) {
			sum[ i ] -= 10;
			sum[i + 1] += 1;
		}
	}
	std::cout << std::endl;

	std::cout << std::setw(n) << input << std::endl;
	std::cout << "---------------------------------------------------\n";
	output( sum );
	std::cout << std::endl << std::endl;

	return EXIT_SUCCESS;
}
catch (...)
{
	std::cout << "例外発生" << std::endl;

	return EXIT_FAILURE;
}


// end.
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

JJJuto
記事: 29
登録日時: 3年前

Re: C++ 表示が思う通りにいかない

#4

投稿記事 by JJJuto » 2年前

ありがとうございます!とても参考になりました!

box
記事: 2002
登録日時: 13年前

Re: C++ 表示が思う通りにいかない

#5

投稿記事 by box » 2年前

筆算(足し算)をしたい
のに、
入力>123
1個だけの入力でホントにいいんですか?
足される数と足す数の2個の入力をしなくてホントにいいんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る