[ create a new paste ] login | about

Link: http://codepad.org/vQvbB6ZO    [ raw code | output | fork ]

C++, pasted on Nov 21:
#include<iostream>
#include<conio.h>
using namespace std;

class NumberXL
{
private:
	char numberXL[200];			//sâu ký tự
	bool sign;					//dấu, true=dương, false=âm
	int len;					//độ dài của số
public:
	friend istream& operator>>(istream& in, NumberXL& numberXL);
	friend ostream& operator<<(ostream& out, NumberXL& numberXL);
	friend void BackWardsNumberXL(NumberXL& numberXL);
	NumberXL operator+(NumberXL numberXL2);
};

void BackWardsNumberXL(NumberXL& numberXL)
{
	int len = numberXL.len;
	for (int i = 0; i <= (len - 1) / 2; i++)
	{
		char temp = numberXL.numberXL[i];
		numberXL.numberXL[i] = numberXL.numberXL[len - 1 - i];
		numberXL.numberXL[len - 1 - i] = temp;
	}
}

istream& operator>>(istream& in, NumberXL& numberXL)
{
	char temp;
	int i = 0;

	//xét ký tự đầu tiêm, , 
	do
	{
		temp = _getch();
	} while ((temp < '0' || temp > '9') && temp != '-' && temp != '+');
	//nếu là '-'(số âm) thì numberXL.sign=false
	if (temp == '-')
	{
		numberXL.sign = false;
		cout << temp;
	}
	//nếu là '+'(số dương) thì numberXL.sign=true
	else if (temp == '+')
	{
		numberXL.sign = true;
		cout << temp;
	}
	//nếu ký tự đầu tiên không phải '+' hoặc '-' -> số dương numberXL.sign = true
	//gán numberXL.sign = true
	//gán ký tự đầu tiên bằng số vừa nhập
	else
	{
		numberXL.sign = true;
		cout << temp;
		numberXL.numberXL[i++] = temp;
	}

	//nhập số
	do
	{
		do
		{
			temp = _getch();
		} while ((temp < '0' || temp > '9') && temp != 13);
		cout << temp;
		if (temp == 13)
		{
			temp = '\0';
		}
		numberXL.numberXL[i] = temp;
	} while (numberXL.numberXL[i++] != '\0');

	//độ dài của số
	numberXL.len = strlen(numberXL.numberXL);

	cout << endl;
	return in;
}

ostream& operator<<(ostream& out, NumberXL& numberXL)
{
	int len = numberXL.len;

	//nếu số âm thì in ra ký tư '-'
	if (!numberXL.sign)
	{
		out << "-";
	}

	//in số
	for (int i = 0; i < len; i++)
	{
		out << numberXL.numberXL[i];
	}

	return out;
}

NumberXL NumberXL::operator + (NumberXL numberXL2)
{
	NumberXL countXL;
	int len_number1, len_number2, lenMIN, lenMAX;
	char nho = '0';

	//xét dấu của countXL.sign
	//nếu cả 2 số cùng mang dâu dương thì tổng cũng mang dấu dương -> countXL.sign = true
	if (this->sign == true && numberXL2.sign == true)
		countXL.sign = true;
	//nếu cả 2 số cùng mang dấu âm thì tổng cũng mang dấu âm -> countXL.sign = false
	else if (this->sign == false && numberXL2.sign == false)
		countXL.sign = false;
	////số thứ nhất âm và số thứ hai dương -a+b=b-a
	//else if (this->sign == true && numberXL2.sign == false)
	//	return numberXL2 - *this;

	//lấy độ dài 2 
	//lưu trong len_number1, len_number2
	len_number1 = this->len;
	len_number2 = numberXL2.len;

	//tìm độ dài
	lenMIN = len_number1<len_number2 ? len_number1 : len_number2;
	lenMAX = len_number1>len_number2 ? len_number1 : len_number2;

	//đảo ngược hai xâu
	BackWardsNumberXL(*this);
	BackWardsNumberXL(numberXL2);

	//tính tổng
	//vị trí không lệch
	for (int i = 0; i < lenMIN; i++)
	{
		countXL.numberXL[i] = (this->numberXL[i] + numberXL2.numberXL[i] + nho - 3 * 48) % 10 + 48;
		nho = (this->numberXL[i] + numberXL2.numberXL[i] + nho - 3 * 48) / 10 + 48;
	}

	//vị trí lệch
	if (len_number1 > len_number2)
	{
		for (int i = len_number2; i < len_number1; i++)
		{
			countXL.numberXL[i] = (this->numberXL[i] + nho - 2 * 48) % 10 + 48;
			nho = (this->numberXL[i] + nho - 2 * 48) / 10 + 48;
		}
	}
	else
	{
		for (int i = len_number1; i < len_number2; i++)
		{
			countXL.numberXL[i] = (numberXL2.numberXL[i] + nho - 2 * 48) % 10 + 48;
			nho = (numberXL2.numberXL[i] + nho - 2 * 48) / 10 + 48;
		}
	}

	//nếu sau tính tổng mà biến nho != '0' thì nho được lưu vào cuối xâu
	if (nho != '0')
	{
		countXL.numberXL[lenMAX] = nho;

		//chèn ký tự kết thúc xâu
		countXL.numberXL[lenMAX + 1] = '\0';

		//độ đai của countXL
		countXL.len = lenMAX + 1;
	}
	else
	{
		//chèn ký tự kết thúc xâu
		countXL.numberXL[lenMAX] = '\0';

		//độ đai của countXL
		countXL.len = lenMAX;
	}

	//đảo ngược lại xâu rồi return
	BackWardsNumberXL(*this);
	BackWardsNumberXL(numberXL2);
	BackWardsNumberXL(countXL);
	return countXL;
}

void main()
{
	NumberXL a, b;
	cout << "nhap so thu 1: ";
	cin >> a;
	cout << "nhap so thu 2: ";
	cin >> b;
	cout << a << "+" << b << "=" << a + b;
}


Output:
1
2
3
4
Line 17: error: conio.h: No such file or directory
In function 'std::istream& operator>>(std::istream&, NumberXL&)':
Line 37: error: '_getch' was not declared in this scope
compilation terminated due to -Wfatal-errors.


Create a new paste based on this one


Comments: