C:\Users\云岚\Desktop\148\一元稀疏多项式的计算系统.cpp In function 'void SubPolyn(PNode*&, PNode*&)':
107 1 C:\Users\云岚\Desktop\148\一元稀疏多项式的计算系统.cpp [Error] a function-definition is not allowed here before '{' token
165 1 C:\Users\云岚\Desktop\148\一元稀疏多项式的计算系统.cpp [Error] expected '}' at end of input
你可以把代码段发出来帮你改
有没有大哥啊
编译报错啊
给你一个写好了的吧
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <unordered_map>
#include <sstream>
#include <math.h>
#include <unordered_set>
using namespace std;
//保存所有的多项式:map保存数据,string提前存进数组里,以后每次query会比较快
vector<map<float, float>> multi_;
vector<string> str_multi_;
//创建一个多项式
void amulti(map<float, float>& oneofmulti) {
string p;
string e;
cout << "请输入系数和幂";
//当输入#的时候跳出
//key为幂数,value为系数,采用map因为map自动排序,不采用ordered_map,因为遍历哈希表在显示多项式中不美观(次序没有排序),复杂度为O(logN)
//当然哈希表的效率会高很多,这里采用map,如果想加快速度,可以采用哈希表,这样在合并多项式的时候,查找的时间复杂度为O(1),
while (1) {
//atoi(input.c_str())
cin >> p;
if (p == "#" || e == "#") return;
cin >> e;
if (p == "#" || e == "#") return;
//将p和e转换成float,这里没有考虑数据大小导致超过float的范围,可以使用更高精度的类型,但是本次实验数据较小,不用考虑
float p_ = atof(p.c_str());
float e_ = atof(e.c_str());
//if(oneofmulti.count(e_))
//幂数相同,系数相加
oneofmulti[e_] += p_;
}
}
//显示多项式
string showmulti(map<float, float> oneofmulti) {
string res = "";
for (auto one : oneofmulti)
{
//系数为0直接跳过
if (one.second == 0) continue;
//运用输出流将int类型转换成string
stringstream p;
stringstream e;
p << one.second;
e << one.first;
//如果res为空串或者系数小于0,直接将string相加
if (res == "" || one.second < 0)
{
if (one.first != 0) {
res += p.str() + "x^" + e.str();
}
else {
res += p.str();
}
}
//系数为正的话,需要加上加号
else
{
if (one.first != 0) {
res += "+" + p.str() + "x^" + e.str();
}
else {
res += "+" + p.str();
}
}
//res+=itoa(one.second)+"x^"+itoa(one.first);
}
//返回结果
return res;
}
//多项式求和
map<float, float> add2multi(map<float, float> thefirst, map<float, float> thesecond) {
//分别遍历thefirst和thesecond,并且将其信息记录在ans_multiply
map<float, float> ans_multiply;
//遍历thefirst
for (auto one : thefirst)
{
const float e1 = one.first;
const float p1 = one.second;
ans_multiply[e1] += p1;
}
//遍历thesecond
for (auto two : thesecond)
{
const float e2 = two.first;
const float p2 = two.second;
ans_multiply[e2] += p2;
}
return ans_multiply;
}
//微分
map<float, float> differential(map<float, float> oneofmulti) {
map<float, float> differential_it;
for (auto one : oneofmulti)
{
float e = one.first;
float p = one.second;
//由于在创建多项式的时候已经考虑了合并多项式的问题,这里仅仅考虑指数为1和0的情况
if (e == 0) continue;
differential_it[e - 1] = p * e;
//这里采用在新的空间上保存微分的结果,如果原有结构上进行微分,最好按照指数的从小到大,以免发生数据的覆盖
}
return differential_it;
}
//不定积分
map<float, float> integral(map<float, float> oneofmulti) {
map<float, float> integral_it;
for (auto one : oneofmulti)
{
float e = one.first;
float p = one.second;
integral_it[e + 1] += p / (e + 1);//!!!!!这要考虑p/(e+1)为小数,所以采用float类型的map更加好
}
//这里采用在新的空间上保存积分的结果,如果原有结构上进行积分,最好按照指数的从大到小,以免发生数据的覆盖
//return showmulti(integral_it)+"+contant";
return integral_it;
}
//定积分
float definite_integral(map<float, float> oneofmulti, float low, float high) {
//直接调用定积分的函数,并且将系数p和指数e分别用low和high求解
//float ans_high = 0;
//float ans_low = 0;
float sum = 0;
map<float, float> oneofmulti_;
oneofmulti_ = integral(oneofmulti);
for (auto one : oneofmulti_) {
float e = one.first;
float p = one.second;
//这里使用sum可以一定成都上避免数据精度不够导致溢出,但是不能完全解决这个问题
sum += p * (pow(high, e) - pow(low, e));
//ans_high += p * pow(high, e);
//cout << p*pow(high,e) << endl;
//ans_low += p * pow(low, e);
}
return sum;
//return ans_high - ans_low;
}
//乘法
map<float, float> multiply(map<float, float> thefirst, map<float, float> thesecond) {
//用thefirst中的每一个元素遍历thesecond的中每一个元素,系数相乘,指数相加。
map<float, float> ans_multiply;
for (auto one : thefirst)
{
const float e1 = one.first;
const float p1 = one.second;
for (auto two : thesecond)
{
const float e2 = two.first;
const float p2 = two.second;
ans_multiply[e1 + e2] += p1 * p2;
}
}
return ans_multiply;
}
//乘方
//乘方可以用牛顿二项式来简化整个运算过程,具体过程为:先将组合数用杨辉三角(动态规划)做出来,然后每次调用的时候减少时间复杂度;
//python下有自己的组合数的库,并且在大部分oj是不会被卡时间的...c++就需要自己写..这个东西就是体力活...哎....对不起,太懒了..
//下面的方法调用multiply简单写出该函数,但是时间复杂度较高,达到了n*n*m,哎.....
map<float, float> Nth_power(int m, map<float, float>oneofmulti) {
//直接用temp作为结果,不停的调用乘法,自己乘以自己
map<float, float> temp = oneofmulti;
while (--m) {
temp = multiply(temp, oneofmulti);
}
return temp;
}
//显示当前所有的多项式
void show_all_multi() {
//直接遍历全局变量str_multi_,并且输出
cout << "当前存储的所有多项式为:" << endl;
int i = 0;
for (auto s : str_multi_)
{
cout << i << ": " << s << endl;
++i;
}
}
//保存
void savethemulti(map<float, float> oneofmulti) {
//将新的多项式直接加载str_multi_和multi_中
multi_.push_back(oneofmulti);
str_multi_.push_back(showmulti(oneofmulti));
return;
}
//删除
void deletemulti() {
int index = 1;
//考虑性能,使用哈希set,时间复杂度为O(1)
unordered_set <int> deletelist;
//记录所有被删除多项式的index
while (index >= 0) {
cin >> index;
//如果删除的index超过数组长度,则不做处理。
if (index >= (int)multi_.size())
continue;
else
deletelist.insert(index);
}
//创建新的vector保存未删除的多项式
vector<map<float, float>> tmp;
vector<string> tmp1;
for (int i = 0; i < (int)multi_.size(); ++i)
{
if (deletelist.count(i))
continue;
else
{
tmp.push_back(multi_[i]);
tmp1.push_back(str_multi_[i]);
}
}
multi_.clear();
multi_ = tmp;
str_multi_.clear();
str_multi_ = tmp1;
return;
}
//复制
void copymulti(int n){
//调用保存函数
savethemulti(multi_[n]);
return;
}
//展示主界面
void showthemeau() {
system("clear");
cout << "功能:" << endl;
cout << "a:创建新的多项式:" << endl;
cout << "b:显示当前所有的多项式" << endl;
cout << "c:删除多项式" << endl;
cout << "d:显示第n个多项式" << endl;
cout << "e:微分" << endl;
cout << "f:定积分" << endl;
cout << "g:不定积分" << endl;
cout << "h:乘方" << endl;
cout << "i:求和" << endl;
cout << "j:乘法" << endl;
cout << "l: 复制" <<endl;
cout << "z:退出计算器" << endl;
}
//复制界面
void show_copy(){
system("clear");
show_all_multi();
cout << "请输入你要保存的index:" << endl;
int num=-1;
cin >> num;
int str_multi_len=str_multi_.size();
if(num < 0 || num >= str_multi_len ){
cout <<"你要保存的多项式并不存在,输入任意键按回车回到主菜单:"<<endl;
string ss;
cin >> ss;
return showthemeau();
}
copymulti(num);
cout << "复制完结果为:" << endl;
show_all_multi();
cout << "按下任意键再按回车回到主页面" << endl;
string ss;
cin >> ss;
return showthemeau();
}
//创建多项式的界面
void show_amulti() {
system("clear");
cout << "请输入输入多项式的个数(返回主界面按0以后敲回车):" << endl;
int num = 0;
cin >> num;
if (num <= 0)
return showthemeau();
cout << "请输入多项式(以'#'结束):" << endl;
cout << "示例:3x^4 - 0.5x^0.6 + 7" << endl;
cout << "输入:3 4 -0.5 0.6 7 0 #" << endl;
//调用创建多项式的函数
for (int i = 0; i < num; ++i) {
map<float, float> tmp;
amulti(tmp);
savethemulti(tmp);
}
return showthemeau();
}
//删除多项式的界面
void show_delete_multi() {
system("clear");
show_all_multi();
cout << "请输入你要删除的多项式的序号(以-1结束,示例:0 -1敲回车):" << endl;
deletemulti();
cout << "删除以后的多项式为:" << endl;
show_all_multi();
cout << "按任何键返回主界面" << endl;
char keyboard_in;
cin >> keyboard_in;
return showthemeau();
}
//显示特定的多项式界面
void show_n_multi() {
system("clear");
cout << "请输入显示多项式的index:" << endl;
int len = str_multi_.size() - 1;
cout << "index的范围为0~" << len << endl;
int n = -1;
cin >> n;
cout << str_multi_[n] << endl;
cout << "输入任何键敲回车返回主界面" << endl;
char ss;
cin >> ss;
return showthemeau();
}
//显示微分界面
void show_diff() {
system("clear");
int len = str_multi_.size() - 1;
cout << "请输入你要进行微分的多项式的index(0~" << len << "):" << endl;
int index = -1;
cin >> index;
//sta
int times=1;
cout << "请输入求导次数:" <<endl;
cin >> times;
//用另外一个变量diffone来表达结果
map<float, float> diffone= (multi_[index]);
while(times--)
diffone= differential(diffone);
cout << "微分结果为:" << endl;
string tmp=showmulti(diffone);
if(tmp == "")
cout << "0" <<endl;
else
cout << tmp <<endl;
cout << "请问您需要该结果么?" << endl;
cout << "保存按1,不保存按0" << endl;
int keyborad_in = -1;
cin >> keyborad_in;
if (keyborad_in == 1)
savethemulti(diffone);
//else
return showthemeau();
}
//显示不定积分界面
void show_inte() {
system("clear");
int len = str_multi_.size() - 1;
cout << "请输入你要进行不定积分的多项式的index(0~" << len << "):" << endl;
int index = -1;
cin >> index;
cout << "积分结果为:" << endl;
map<float, float> inteone = integral(multi_[index]);
cout << showmulti(inteone) + "+Constant" << endl;
cout << "请问您需要该结果么?" << endl;
cout << "保存按1,不保存按0" << endl;
int keyborad_in = -1;
cin >> keyborad_in;
if (keyborad_in == 1)
savethemulti(inteone);
//else
return showthemeau();
}
//显示定积分的界面
void show_definite_integral() {
system("clear");
int len = str_multi_.size() - 1;
cout << "请输入你要进行定积分的多项式的index(0~" << len << "):" << endl;
int index = -1;
cin >> index;
float up, down;
cout << "输入上限、下限:" << endl;
cin >> up;
cin >> down;
cout << "定积分结果为:" << endl;
cout << definite_integral(multi_[index], down, up) << endl;
cout << "输入任意键敲回车返回主界面" << endl;
char keyborad_in = -1;
cin >> keyborad_in;
return showthemeau();
}
//显示乘方界面
void show_Nth_power() {
system("clear");
int len = str_multi_.size() - 1;
cout << "请输入你要进行乘方的多项式的index(0~" << len << "):" << endl;
int index = -1;
cin >> index;
cout << "输入乘方数:" << endl;
int N;
cin >> N;
if (N==0)
{
cout << "结果为:1" << endl;
cout << "输入任意键按回车返回主菜单" << endl;
char ss;
cin >> ss;
return showthemeau();
}
map<float, float> powone = Nth_power(N, multi_[index]);
cout << showmulti(powone) << endl;
cout << "请问您需要该结果么?" << endl;
cout << "保存按1,不保存按0" << endl;
int keyborad_in = -1;
cin >> keyborad_in;
if (keyborad_in == 1)
savethemulti(powone);
//else
return showthemeau();
}
//显示乘法界面
void show_multiply() {
system("clear");
vector<int> index;
int len = str_multi_.size() - 1;
cout << "示例:0 1 0 -1回车" << endl;
cout << "请选择进行乘法的多项式的index(以-1结尾,0~" << len << "):" << endl;
int idx;
while (1)
{
cin >> idx;
if (idx == -1) break;
index.push_back(idx);
}
map<float, float> res = multi_[index[0]];
for (int i = 1; i < (int)index.size(); ++i)
{
res = multiply(res, multi_[index[i]]);
}
cout << "结果为:" << endl;
cout << showmulti(res) << endl;
cout << "请问您需要该结果么?" << endl;
cout << "保存按1,不保存按0" << endl;
int keyborad_in = -1;
cin >> keyborad_in;
if (keyborad_in == 1)
savethemulti(res);
//else
return showthemeau();
}
//显示求和界面add2multi
void show_add2multi() {
system("clear");
vector<int> index;
int len = str_multi_.size() - 1;
cout << "示例:0 1 0 -1回车" << endl;
cout << "请选择进行求和的多项式的index(以-1结尾,0~" << len << "):" << endl;
int idx;
while (1)
{
cin >> idx;
if (idx == -1) break;
index.push_back(idx);
}
map<float, float> res = multi_[index[0]];
for (int i = 1; i < (int)index.size(); ++i)
{
res = add2multi(res, multi_[index[i]]);
}
cout << "结果为:" << endl;
cout << showmulti(res) << endl;
cout << "请问您需要该结果么?" << endl;
cout << "保存按1,不保存按0" << endl;
int keyborad_in = -1;
cin >> keyborad_in;
if (keyborad_in == 1)
savethemulti(res);
//else
return showthemeau();
}
//控制菜单
void switchit(char keyboard_in) {
switch (keyboard_in) {
case 'a'://a:创建新的多项式
show_amulti();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'b'://b:显示当前所有的多项式
system("clear");
show_all_multi();
cout << "输入任意键敲回车返回主界面" << endl;
cin >> keyboard_in;
showthemeau();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'c'://c:删除多项式
show_delete_multi();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'd'://d:显示第n个多项式
show_n_multi();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'e'://e:微分
show_diff();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'f'://f:定积分
show_definite_integral();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'g'://g:不定积分
show_inte();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'h'://h:乘方
show_Nth_power();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'i'://i:求和
show_add2multi();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'j'://j:乘法
show_multiply();
cin >> keyboard_in;
switchit(keyboard_in);
break;
case 'z'://z:退出计算器
cout << "谢谢使用" << endl;
system("clear");
return;
break;
case 'l'://l:复制
show_copy();
cin >> keyboard_in;
switchit(keyboard_in);
break;
default:
system("clear");
cout << "输入错误,并且输入任意键按回车返回主界面" << endl;
cin >> keyboard_in;
showthemeau();
cin >> keyboard_in;
switchit(keyboard_in);
break;
}
}
int main() {
//调试
multi_.clear();
showthemeau();
cout << "输入功能字母" << endl;
char keyboard_in;
cin >> keyboard_in;
switchit(keyboard_in);
//show_amulti();
//show_delete_multi();
//show_n_multi();
//show_diff();
//show_inte();
//show_Nth_power();
//show_add2multi();
//show_all_multi();
//definite_integral();
/*
vector<map<float,float>> multi_;
map<float,float>tmp;
amulti(tmp);
map<float,float>tmp2;
amulti(tmp2);
multi_.push_back(tmp);
multi_.push_back(tmp2);
cout << "第一个多项式为"<<showmulti(multi_[0])<<endl;
cout << "第二个多项式为"<<showmulti(multi_[1])<<endl;
*/
//cout << "两个多项式的乘法为"<<showmulti(multiply(multi_[0],multi_[1]))<<endl;
//cout << "乘方"<< showmulti(Nth_power(2,multi_[0]))<<endl;
//cout << "微分"<< showmulti(differential(multi_[0]))<<endl;
//cout << "不定积分"<< showmulti(integral(multi_[0]))+"+contant"<<endl;
//cout << "定积分"<<definite_integral(multi_[0],1,2)<<endl;
}
1、运行前说明 由于本代码对于选项的选择的设计是char类型,并不是string,所以尽量输入单键,如果要在windows下编译该代码,要将程序中system(“clear”)改为system(“cls”),OS X则不用,则是因为在linux/类unix的系统下terminal指令和windows下cmd的指令不一样,但是不影响程序的功能性实现,但是会影响人机交互界面的友好性。基于的c++版本是c++11,可以往最新版本兼容,旧版本没有进行测试。
2、在linux下的运行 在terminal找到a.cpp(我的代码)所在的路径,我放在桌面上的cpp文件里,由于我自己的电脑上是clang,所以用的是clang++,而在远程平台上,用 g++ a.cpp -o a.o -std=c++11, 并且在编译无误以后,运行a.o ./a.o
3、主界面的进入 键入功能字母按回车进入对应功能
4、创建多项式的输入 按照系数和幂次的顺序输入每一项,并且以#结尾。例如:X3+3X2+2X+6,我们输入1 3 3 2 2 1 6 0 #
5、保存与否 保存键入1,后回车。不保存键入0,后回车。
6、求和、乘法的index输入 以-1为结尾,比如求index为0、1、2、0这四项的和和乘法结果: 键入0 1 2 0 -1后回车
7、删除的index输入 以-1结尾,一个一个删除,比如要删除的index为2,则: 键入0 -1后回车
8、返回主界面 键入任意单个键按回车,比如: 键入b后回车。
应该是括号多了或是少了,建议按一下ctrl+shift+a,这样可以自动缩进