C++ C++;十六进制乘法计算器
我遇到的问题是,我的乘法方法只处理一行,目前无法前进到下一行。add函数工作正常,我可以更新当前的十六进制数,但由于某些原因,我只能得到一行乘法C++ C++;十六进制乘法计算器,c++,calculator,multiplication,C++,Calculator,Multiplication,我遇到的问题是,我的乘法方法只处理一行,目前无法前进到下一行。add函数工作正常,我可以更新当前的十六进制数,但由于某些原因,我只能得到一行乘法 Example input: 111# * 333# = 333 123# * 123# = 369 以下是相关代码: LList* Calculator::multiply(LList& left, LList& right) { int product, carry = 0, lval = 0, rval = 0,
Example input:
111# * 333# = 333
123# * 123# = 369
以下是相关代码:
LList* Calculator::multiply(LList& left, LList& right) {
int product, carry = 0, lval = 0, rval = 0, zeros = 0;
bool calculating = true;
listnode *leftNode;
vector <LList*> addList;
listnode *rightNode;
LList* newHex;
while(calculating) {
leftNode = left.next();
if(leftNode == NULL) {
break;
}
else {
lval = leftNode->data;
}
//leftNode = left.next();
right.reset();
if(leftNode == NULL) {
calculating = false;
if(carry != 0) {
//newHex->insertTail(carry);
}
lval = 0;
break;
}
LList* curList = new LList;
addList.push_back(curList);
while(rightNode != NULL) {
// Add however zeros we need for
// each entry based on the zero counter
for(int i = 0; i < zeros; i++) {
curList->insertTail(0);
}
rightNode = right.next();
if(rightNode == NULL) {
}
else {
rval = rightNode->data;
product = lval * rval + carry;
carry = 0;
if(product >= 16) {
carry = (product / 16);
product = (product % 16);
}
curList->insertTail(product);
}
}
zeros++;
}
Calculator calc;
LList* temp;
// Add up everything in the addList
for(int i = 0; i < addList.size() - 1; i++) {
if(temp == NULL)
temp = calc.add(*addList[i], *addList[i+1]);
else
temp = calc.add(*addList[i+1], *temp);
}
newHex = temp;
// Delete it
for(int i = 0; i < addList.size(); i++) {
}
return newHex;
};
完整程序:
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
using namespace std;
#undef NULL
const int NULL = 0;
const char SENTINEL = '#';
typedef int element;
class listnode {
public:
element data;
listnode * next;
};
class LList {
private:
listnode * head;
listnode * tail;
listnode * view;
public:
LList();
~LList();
void read();
listnode* next();
void reset();
void print();
void insertTail(element val);
void clean();
element deleteHead();
};
class Calculator {
public:
Calculator();
inline LList* add(LList& left, LList& right);
inline LList* multiply(LList& left, LList& right);
};
Calculator::Calculator() {
};
LList* Calculator::add(LList& left, LList& right) {
int sum, carry = 0, lval = 0, rval = 0;
bool calculating = true;
listnode *leftNode;
listnode *rightNode;
LList* newHex = new LList;
while(calculating) {
leftNode = left.next();
rightNode = right.next();
if(leftNode == NULL) {
lval = 0;
}
else
lval = leftNode->data;
if(rightNode == NULL) {
rval = 0;
}
else
rval = rightNode->data;
if(leftNode == NULL && rightNode == NULL) {
calculating = false;
if(carry != 0) {
newHex->insertTail(carry);
}
break;
}
sum = lval + rval + carry;
carry = 0;
if(sum >= 16) {
carry = 1;
sum -= 16;
}
newHex->insertTail(sum);
}
return newHex;
};
LList* Calculator::multiply(LList& left, LList& right) {
int product, carry = 0, lval = 0, rval = 0, zeros = 0;
bool calculating = true;
listnode *leftNode;
vector <LList*> addList;
listnode *rightNode;
LList* newHex;
while(calculating) {
leftNode = left.next();
if(leftNode == NULL) {
break;
}
else {
lval = leftNode->data;
}
//leftNode = left.next();
right.reset();
if(leftNode == NULL) {
calculating = false;
if(carry != 0) {
//newHex->insertTail(carry);
}
lval = 0;
break;
}
LList* curList = new LList;
addList.push_back(curList);
while(rightNode != NULL) {
// Add however zeros we need for
// each entry based on the zero counter
for(int i = 0; i < zeros; i++) {
curList->insertTail(0);
}
rightNode = right.next();
if(rightNode == NULL) {
}
else {
rval = rightNode->data;
product = lval * rval + carry;
carry = 0;
if(product >= 16) {
carry = (product / 16);
product = (product % 16);
}
curList->insertTail(product);
}
}
zeros++;
}
Calculator calc;
LList* temp;
// Add up everything in the addList
for(int i = 0; i < addList.size() - 1; i++) {
if(temp == NULL)
temp = calc.add(*addList[i], *addList[i+1]);
else
temp = calc.add(*addList[i+1], *temp);
}
newHex = temp;
// Delete it
for(int i = 0; i < addList.size(); i++) {
}
return newHex;
};
listnode* LList::next() {
listnode* temp = view;
if(temp != NULL)
view = view->next;
if(view == NULL) {
}
return temp;
};
void LList::reset() {
view = head;
}
LList::LList(){
/*
next:
This is used to set the linked
list to NULL.
*/
head = NULL;
view = NULL;
};
void LList::print() {
listnode * temp;
int i = 0;
string printValues;
temp = head;
while(temp != NULL) {
int var = temp -> data;
char character = ' ';
if(i % 3 == 0 && i != 0)
printValues += ',';
i++;
if(var > 9 && var < 16) {
character = static_cast <char>(var + 65 - 10);
};
if (var <= 9 && var >= 0) {
character = static_cast <char>(var + 48);
};
if (var > 96 && var < 103) {
character = static_cast <char>(var + 97 + 10);
};
printValues += character;
temp = temp -> next;
}
string tempValues;
for(int i = printValues.length() - 1; i >= 0; i--)
tempValues += printValues[i];
cout << tempValues;
cout << endl;
};
void LList::read() {
string userval;
int i;
bool parsing = true;
char curval;
vector <int> values;
clean();
while(parsing) {
cin >> userval;
for(unsigned int i = 0; i < userval.length(); i++) {
curval = userval[i];
if(curval >= 48 && curval <= 57)
values.push_back(static_cast <int>(curval -
48));
if(curval >= 65 && curval <= 70)
values.push_back(static_cast <int>(curval -
65 + 10));
if(curval >= 97 && curval <= 102)
values.push_back(static_cast <int>(curval -
97 + 10));
if(curval == ' ')
break;
if(curval == SENTINEL) {
parsing = false;
break;
}
}
}
for(int i = values.size() -1; i >= 0; i--) {
insertTail(values[i]);
}
};
void LList::insertTail(element val) {
listnode * temp;
temp = new listnode;
temp -> data = val;
temp -> next = NULL;
if(head == NULL) {
head = temp;
view = head;
}
else
tail -> next = temp;
tail = temp;
};
void LList::clean() {
while(head != NULL)
deleteHead();
};
void validCommands() {
cout << "Valid commands are:" << endl;
cout << " e enter enter the current ";
cout << "hexadecimal ";
cout << "number from the keyboard" << endl;
cout << " a add add a new hexadecimal ";
cout << "number to the current hex. number" << endl;
cout << " m multiply ";
cout << "multiply a new hexadecimal number ";
cout << "by the current hex. number" << endl;
cout << " h help show this help menu" << endl;
cout << " q quit quit the program" << endl << endl;
};
element LList::deleteHead() {
listnode * temp;
temp = head;
head = head -> next;
delete temp;
return temp -> data;
};
LList::~LList(){
delete head;
};
int main() {
LList L, add,multiply;
Calculator calc;
L.insertTail(0);
char option;
bool run;
cout << "Hexadecimal Calculator, Ver 1.0.0 \n";
do {
/*
This do while is used to continuosly run the
program until the user decides to end.
*/
cout << "Current Hexadecimal number is: ";
L.print();
cout << endl;
cout << "Command (h for help): ";
cin >> option;
cout << endl << endl;
switch(option) {
case 'e' :
cout << "Enter a hexadecimal number ";
cout << "followed by #: ";
L.read();
cout << endl << "Entering completed.";
cout << endl << endl;
break;
case 'a' :
cout << "Adding a new hexadecimal number ";
cout << "to the current hex. number" << endl;
cout << endl;
cout << "Enter a hexadecimal ";
cout << "number, follow by #: ";
add.read();
cout << endl << "Addition completed.";
cout << endl;
L = *calc.add(L, add);
cout << endl;
break;
case 'm' :
cout << "Multiplying a new hexadecimal ";
cout << "number ";
cout << "to the current hex. number" << endl;
cout << endl;
cout << "Enter a hexadecimal ";
cout << "number, follow by #: ";
multiply.read();
cout << endl << "Multiplication completed.";
cout << endl;
L = *calc.multiply(L, multiply);
cout << endl;
break;
case 'h' : validCommands();
break;
case 'q' : run = false;
break;
};
} while (run);
exit(0);
}
#包括
#包括
#包括
#包括
使用名称空间std;
#未定义空值
常数int NULL=0;
const char SENTINEL='#';
typedef int元素;
类listnode{
公众:
元素数据;
listnode*下一步;
};
类利斯特{
私人:
listnode*头;
listnode*尾部;
listnode*视图;
公众:
李斯特();
~LList();
无效读取();
listnode*next();
无效重置();
作废打印();
void insertTail(元素val);
无效清除();
元素deleteHead();
};
类计算器{
公众:
计算器();
内联LList*添加(LList和左、LList和右);
内联LList*乘法(LList和左、LList和右);
};
计算器::计算器(){
};
LList*计算器::添加(LList&左、LList&右){
整数和,进位=0,lval=0,rval=0;
布尔计算=真;
listnode*leftNode;
listnode*rightNode;
LList*newHex=新的LList;
同时(计算){
leftNode=left.next();
rightNode=right.next();
if(leftNode==NULL){
lval=0;
}
其他的
lval=leftNode->data;
if(rightNode==NULL){
rval=0;
}
其他的
rval=右节点->数据;
if(leftNode==NULL&&rightNode==NULL){
计算=假;
如果(进位!=0){
newHex->insertTail(进位);
}
打破
}
总和=左心室+右心室+进位;
进位=0;
如果(总和>=16){
进位=1;
总和-=16;
}
newHex->insertTail(总和);
}
返回newHex;
};
LList*计算器::乘法(LList&左、LList&右){
整数乘积,进位=0,lval=0,rval=0,零=0;
布尔计算=真;
listnode*leftNode;
矢量地址表;
listnode*rightNode;
利斯特*newHex;
同时(计算){
leftNode=left.next();
if(leftNode==NULL){
打破
}
否则{
lval=leftNode->data;
}
//leftNode=left.next();
对。重置();
if(leftNode==NULL){
计算=假;
如果(进位!=0){
//newHex->insertTail(进位);
}
lval=0;
打破
}
LList*卷发器=新的LList;
addList.push_back(卷发器);
while(rightNode!=NULL){
//加上我们需要的零
//每个条目都基于零计数器
对于(int i=0;i<0;i++){
卷发器->插入尾巴(0);
}
rightNode=right.next();
if(rightNode==NULL){
}
否则{
rval=右节点->数据;
产品=lval*rval+进货;
进位=0;
如果(产品>=16){
进位=(产品/16);
产品=(产品%16);
}
卷发器->插入尾巴(产品);
}
}
零++;
}
计算器计算器;
利斯特*温度;
//把地址列表中的所有内容都加起来
对于(int i=0;i下一步;
如果(视图==NULL){
}
返回温度;
};
void LList::reset(){
视图=头部;
}
LList::LList(){
/*
下一步:
这用于设置链接的
将列表设置为空。
*/
head=NULL;
视图=空;
};
void LList::print(){
listnode*temp;
int i=0;
字符串打印值;
温度=水头;
while(temp!=NULL){
int var=temp->data;
字符='';
如果(i%3==0&&i!=0)
打印值+=',';
i++;
如果(var>9&&var<16){
字符=静态施法(var+65-10);
};
如果(var=0){
字符=static_cast(var+48);
};
如果(var>96&&var<103){
字符=静态施法(var+97+10);
};
打印值+=字符;
温度=温度->下一步;
}
字符串值;
对于(int i=printValues.length()-1;i>=0;i--)
tempValues+=打印值[i];
coutuserval;
for(无符号int i=0;i=48&&curval=65&&curval=97&&curval=0;i--){
插入尾(值[i]);
}
};
void LList::insertTail(元素val){
listnode*temp;
temp=新的列表节点;
温度->数据=val;
temp->next=NULL;
if(head==NULL){
压头=温度;
视图=头部;
}
其他的
尾部->下一步=温度;
尾=温度;
};
void-LList::clean(){
while(head!=NULL)
deleteHead();
};
无效有效命令(){
coutwhile(rightNode!=NULL)
的第一次求值使用了rightNode
的未初始化值,当您运行程序时,该值恰好为非NULL。在该检查之后,在解除引用之前,rightNode
被设置为right.next()中的有效节点指针值
。但是对于下一个左数字,rightnode仍然是上一个循环中的NULL,因为它在right.reset()之后不会更新,因此对于f之后的每个数字
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
using namespace std;
#undef NULL
const int NULL = 0;
const char SENTINEL = '#';
typedef int element;
class listnode {
public:
element data;
listnode * next;
};
class LList {
private:
listnode * head;
listnode * tail;
listnode * view;
public:
LList();
~LList();
void read();
listnode* next();
void reset();
void print();
void insertTail(element val);
void clean();
element deleteHead();
};
class Calculator {
public:
Calculator();
inline LList* add(LList& left, LList& right);
inline LList* multiply(LList& left, LList& right);
};
Calculator::Calculator() {
};
LList* Calculator::add(LList& left, LList& right) {
int sum, carry = 0, lval = 0, rval = 0;
bool calculating = true;
listnode *leftNode;
listnode *rightNode;
LList* newHex = new LList;
while(calculating) {
leftNode = left.next();
rightNode = right.next();
if(leftNode == NULL) {
lval = 0;
}
else
lval = leftNode->data;
if(rightNode == NULL) {
rval = 0;
}
else
rval = rightNode->data;
if(leftNode == NULL && rightNode == NULL) {
calculating = false;
if(carry != 0) {
newHex->insertTail(carry);
}
break;
}
sum = lval + rval + carry;
carry = 0;
if(sum >= 16) {
carry = 1;
sum -= 16;
}
newHex->insertTail(sum);
}
return newHex;
};
LList* Calculator::multiply(LList& left, LList& right) {
int product, carry = 0, lval = 0, rval = 0, zeros = 0;
bool calculating = true;
listnode *leftNode;
vector <LList*> addList;
listnode *rightNode;
LList* newHex;
while(calculating) {
leftNode = left.next();
if(leftNode == NULL) {
break;
}
else {
lval = leftNode->data;
}
//leftNode = left.next();
right.reset();
if(leftNode == NULL) {
calculating = false;
if(carry != 0) {
//newHex->insertTail(carry);
}
lval = 0;
break;
}
LList* curList = new LList;
addList.push_back(curList);
while(rightNode != NULL) {
// Add however zeros we need for
// each entry based on the zero counter
for(int i = 0; i < zeros; i++) {
curList->insertTail(0);
}
rightNode = right.next();
if(rightNode == NULL) {
}
else {
rval = rightNode->data;
product = lval * rval + carry;
carry = 0;
if(product >= 16) {
carry = (product / 16);
product = (product % 16);
}
curList->insertTail(product);
}
}
zeros++;
}
Calculator calc;
LList* temp;
// Add up everything in the addList
for(int i = 0; i < addList.size() - 1; i++) {
if(temp == NULL)
temp = calc.add(*addList[i], *addList[i+1]);
else
temp = calc.add(*addList[i+1], *temp);
}
newHex = temp;
// Delete it
for(int i = 0; i < addList.size(); i++) {
}
return newHex;
};
listnode* LList::next() {
listnode* temp = view;
if(temp != NULL)
view = view->next;
if(view == NULL) {
}
return temp;
};
void LList::reset() {
view = head;
}
LList::LList(){
/*
next:
This is used to set the linked
list to NULL.
*/
head = NULL;
view = NULL;
};
void LList::print() {
listnode * temp;
int i = 0;
string printValues;
temp = head;
while(temp != NULL) {
int var = temp -> data;
char character = ' ';
if(i % 3 == 0 && i != 0)
printValues += ',';
i++;
if(var > 9 && var < 16) {
character = static_cast <char>(var + 65 - 10);
};
if (var <= 9 && var >= 0) {
character = static_cast <char>(var + 48);
};
if (var > 96 && var < 103) {
character = static_cast <char>(var + 97 + 10);
};
printValues += character;
temp = temp -> next;
}
string tempValues;
for(int i = printValues.length() - 1; i >= 0; i--)
tempValues += printValues[i];
cout << tempValues;
cout << endl;
};
void LList::read() {
string userval;
int i;
bool parsing = true;
char curval;
vector <int> values;
clean();
while(parsing) {
cin >> userval;
for(unsigned int i = 0; i < userval.length(); i++) {
curval = userval[i];
if(curval >= 48 && curval <= 57)
values.push_back(static_cast <int>(curval -
48));
if(curval >= 65 && curval <= 70)
values.push_back(static_cast <int>(curval -
65 + 10));
if(curval >= 97 && curval <= 102)
values.push_back(static_cast <int>(curval -
97 + 10));
if(curval == ' ')
break;
if(curval == SENTINEL) {
parsing = false;
break;
}
}
}
for(int i = values.size() -1; i >= 0; i--) {
insertTail(values[i]);
}
};
void LList::insertTail(element val) {
listnode * temp;
temp = new listnode;
temp -> data = val;
temp -> next = NULL;
if(head == NULL) {
head = temp;
view = head;
}
else
tail -> next = temp;
tail = temp;
};
void LList::clean() {
while(head != NULL)
deleteHead();
};
void validCommands() {
cout << "Valid commands are:" << endl;
cout << " e enter enter the current ";
cout << "hexadecimal ";
cout << "number from the keyboard" << endl;
cout << " a add add a new hexadecimal ";
cout << "number to the current hex. number" << endl;
cout << " m multiply ";
cout << "multiply a new hexadecimal number ";
cout << "by the current hex. number" << endl;
cout << " h help show this help menu" << endl;
cout << " q quit quit the program" << endl << endl;
};
element LList::deleteHead() {
listnode * temp;
temp = head;
head = head -> next;
delete temp;
return temp -> data;
};
LList::~LList(){
delete head;
};
int main() {
LList L, add,multiply;
Calculator calc;
L.insertTail(0);
char option;
bool run;
cout << "Hexadecimal Calculator, Ver 1.0.0 \n";
do {
/*
This do while is used to continuosly run the
program until the user decides to end.
*/
cout << "Current Hexadecimal number is: ";
L.print();
cout << endl;
cout << "Command (h for help): ";
cin >> option;
cout << endl << endl;
switch(option) {
case 'e' :
cout << "Enter a hexadecimal number ";
cout << "followed by #: ";
L.read();
cout << endl << "Entering completed.";
cout << endl << endl;
break;
case 'a' :
cout << "Adding a new hexadecimal number ";
cout << "to the current hex. number" << endl;
cout << endl;
cout << "Enter a hexadecimal ";
cout << "number, follow by #: ";
add.read();
cout << endl << "Addition completed.";
cout << endl;
L = *calc.add(L, add);
cout << endl;
break;
case 'm' :
cout << "Multiplying a new hexadecimal ";
cout << "number ";
cout << "to the current hex. number" << endl;
cout << endl;
cout << "Enter a hexadecimal ";
cout << "number, follow by #: ";
multiply.read();
cout << endl << "Multiplication completed.";
cout << endl;
L = *calc.multiply(L, multiply);
cout << endl;
break;
case 'h' : validCommands();
break;
case 'q' : run = false;
break;
};
} while (run);
exit(0);
}
#include <iostream>
#include <string>
#include <vector>
struct listnode {
int data;
listnode *next;
listnode(int data=0) : data(data), next(0) {}
};
class LList {
listnode *head, *tail; // head is least significant end
void delNodes() {
listnode* node = head;
while(node) {
listnode* todel = node;
node = node->next;
delete todel;
}
head = tail = 0;
}
public:
LList() : head(0), tail(0) {}
LList(std::string digits) : head(0), tail(0) {
for(auto it = digits.rbegin(); it != digits.rend(); ++it) {
if(*it >= '0' && *it <= '9') insertTail(*it - '0');
else if(*it >= 'a' && *it <= 'f') insertTail(*it - 'a' + 10);
else if(*it >= 'A' && *it <= 'F') insertTail(*it - 'A' + 10);
} }
LList(const LList& src) : head(0), tail(0) {
for(int data : src) { insertTail(data); }
}
~LList() { delNodes(); }
LList& operator = (const LList& src) {
delNodes();
for(int data : src) { insertTail(data); }
return *this;
}
void insertTail(int value) {
listnode *newnode = new listnode(value);
if(!head) {
head = tail = newnode;
} else {
tail->next = newnode;
tail = newnode;
} }
class iterator {
friend LList;
const listnode* node;
iterator(const listnode* node) : node(node) {}
public:
iterator& operator ++ () { if(node) node = node->next; return *this; }
int operator * () const { return node ? node->data : 0; }
bool operator != (iterator iter) const { return iter.node != node; }
bool operator == (iterator iter) const { return iter.node == node; }
};
iterator begin() const { return iterator(head); }
iterator end() const { return iterator(0); }
std::string get_digits() const {
static const char da[] = "0123456789abcdef";
std::string digits;
for(int d : *this) {
digits = da[d] + digits;
}
return digits;
}
};
LList add(const LList& left, const LList& right) {
LList sum;
auto liter = left.begin();
auto riter = right.begin();
int carry = 0;
while(liter != left.end() || riter != right.end()) {
int s = *liter + *riter + carry;
carry = s / 16;
sum.insertTail(s % 16);
++liter;
++riter;
}
if(carry) sum.insertTail(carry);
return sum;
}
LList multiply(const LList& left, const LList& right) {
LList prodSum;
auto leftNode = left.begin();
int zeros = 0;
for(;;) {
if(leftNode == left.end()) break;
int lval = *leftNode;
LList curList;
for(int i = 0; i < zeros; i++) {
curList.insertTail(0);
}
auto rightNode = right.begin();
int carry = 0;
while(rightNode != right.end()) {
int rval = *rightNode;
int product = lval * rval + carry;
carry = product / 16;
product %= 16;
curList.insertTail(product);
++rightNode;
}
while(carry) {
curList.insertTail(carry % 16);
carry /= 16;
}
prodSum = add(prodSum, curList);
++leftNode;
++zeros;
}
return prodSum;
}
int main() {
LList a("111");
LList b("333");
LList c = multiply(a, b); // 36963
std::cout << c.get_digits() << '\n';
}