C++第十七次作业(群体类

编程入门 行业动态 更新时间:2024-10-18 22:32:07

C++第十七次<a href=https://www.elefans.com/category/jswz/34/1771149.html style=作业(群体类"/>

C++第十七次作业(群体类

文章目录:

学习一下

1.简介

2.使用方法

3.主要属性与方法

4.C++使用栈和队列实现十进制实数转2、8或16进制

习题1:C++用线性表和栈实现中序表达式转后序表达式并求表达式的值

代码实现

运行结果

习题2:C++创建学生链表并输出

代码实现

运行结果

习题3:C++一元n次多项式PolA和PolB相加得PolC

代码实现

运行结果


学习一下

1.简介

C++中的群体类(属标准模板主库STL的内容)list、stack、queue构造用户线性表、栈和队列更为方便

2.使用方法

(1)list<char> mycharlist;list<int> myintlist;list<用户自定义类型> mylist;(2)stack<char> mycharstack;stack<int> myintstack;stack<自定义类型> mystack(3)queue<基本类型或自定义类型> myqueque;

3.主要属性与方法

1.线性表list主要属性与方法(函数)size(),empty(),push_back(),push_front,begin(),end(),insert();2.栈stack主要属性和方法(函数)empty(),push(),pop(),top(),size();3.队列queue主要属性和方法size(),back(),front(),push(),pop();

4.C++使用栈和队列实现十进制实数转2、8或16进制

#include<stack>
#include<queue>void DecTo2816(double d,unsigned r)
{	stack<char> mystack;int intpart=(int)d,yu;double fraction=d-intpart;if((r!=2)&&(r!=8)&&(r!=16)){	cout<<"数制错误!"<<endl;return;	}while(intpart){	yu=intpart%r;if(yu<=9)mystack.push(yu+'0');else mystack.push(yu%10+'A');intpart=intpart/r;}while(mystack.empty()!=1){	cout<<mystack.top();	mystack.pop();	}if(fraction==0){cout<<endl;return;}queue<char> myqueue;myqueue.push('.');for(int k=1;k<=5;k++){	yu=(int)(fraction*r);if(yu<=9)myqueue.push(yu+'0');else myqueue.push(yu%10+'A');fraction=fraction*r-yu;if(fraction==0)break;}while(myqueue.empty()==0){	cout<<myqueue.front ();myqueue.pop();	}cout<<endl;
}

习题1:C++用线性表和栈实现中序表达式转后序表达式并求表达式的值

代码实现

#include <iostream>
#include<cmath>
#include<stack>
#include<list>
using namespace std;//----------------------------------------
typedef struct    //把读入的表达式的操作数或操作符的每一项处理成此类型的结点
{string opstr;    //操作数或操作符串int is_opt;    //此串是否为操作符
} NODE;//----------------------------------------------------
//判断是否为运算符
int Is_Operator(char opt) {switch (opt) {case '+':case '-':case '*':case '/':case '^':return 1;default:return 0;}
}//-----------------------------------------------------
//判断运算符的优先级别
int Priority(char opt) {switch (opt) {case '+':case '-':return 1;case '*':case '/':return 2;case '^':return 3;default:return 0;}
}//--------------------------------------------
//计算两个操作数按照某种操作符运算的结果
int Cal_Result(char opt, int opd1, int opd2) {switch (opt) {case '+':return (opd2 + opd1);case '-':return (opd2 - opd1);case '*':return (opd2 * opd1);case '/':return (opd2 / opd1);case '^':return (pow((double) opd2, (double) opd1));}
}//----------------------------------------------------------------
int main() {string InStr;                            //输入表达式字符串int LengthInStr;stack<char> s_opt;                //定义运算符栈stack<int> s_opd;                    //定义操作数栈char opt, opdstr[10] = {'\0'};int opd1, opd2;int Read_Num = 0;    //如果刚刚读过数字而未进行加和处理则设置为1,否则为0int opd = 0;int flag=0;list<NODE> postList;    //链表:用于存放操作数(符)结点,以字符串形式存放//正确输入中序表达式字符串(检测是否有无效字符)cout << "输入中序表达式:";cin>>InStr;LengthInStr = InStr.length();//检测无效字符for (int i = 0; i < LengthInStr; i++) {if (!('0' <= InStr[i] && InStr[i] <= '9') && Is_Operator(InStr[i]) != 1 && InStr[i] != '(' && InStr[i] != ')') {cout << "含有无效字符" << endl;return 0;}
//        cout << InStr[i] << " ";}
//    cout << endl;//逐字符扫描InStr,按转换规则构造后序表达式存储到postListfor (int i = 0; i < LengthInStr; i++) {if (('0' <= InStr[i] && InStr[i] <= '9')) {opdstr[opd++] = InStr[i];Read_Num = 1;if (i == (LengthInStr - 1)) {opdstr[opd++] = '\0';Read_Num = 0;opd = 0;NODE p;p.is_opt = 0;p.opstr = opdstr;postList.push_back(p);}} else {if (Read_Num == 1) {opdstr[opd++] = '\0';Read_Num = 0;opd = 0;NODE p;p.is_opt = 0;p.opstr = opdstr;postList.push_back(p);}if(InStr[i] == '('){s_opt.push(InStr[i]);}else if (InStr[i] == ')') {while (s_opt.top() != '(') {NODE p;p.is_opt = 1;p.opstr = s_opt.top();s_opt.pop();postList.push_back(p);}//这里把'('出栈s_opt.pop();}else if(s_opt.empty() || Priority(InStr[i]) > Priority(s_opt.top()) || s_opt.top() == '('){s_opt.push(InStr[i]);} else{flag = 0;while (!s_opt.empty()){if(Priority(InStr[i]) > Priority(s_opt.top())){s_opt.push(InStr[i]);flag = 1;break;} else{NODE p;p.is_opt = 1;p.opstr = s_opt.top();s_opt.pop();postList.push_back(p);}}if(flag == 0){s_opt.push(InStr[i]);}}}}while (!s_opt.empty()) {if (s_opt.top() == '(') {s_opt.pop();continue;}NODE p;p.is_opt = 1;p.opstr = s_opt.top();s_opt.pop();postList.push_back(p);}cout << "后缀表达式为:";for (list<NODE>::iterator it = postList.begin(); it != postList.end(); ++it) {cout << it->opstr << " ";}cout << endl;//计算表达式的值for (list<NODE>::iterator it = postList.begin(); it != postList.end(); ++it) {if (it->is_opt == 0) {s_opd.push(stof(it->opstr));} else {opd1 = s_opd.top();s_opd.pop();opd2 = s_opd.top();s_opd.pop();opt = (*it).opstr.back();s_opd.push(Cal_Result(opt, opd1, opd2));}}cout << "运算结果为:" << s_opd.top() << endl;system("pause");return 0;
}

运行结果

 

习题2:C++创建学生链表并输出

代码实现

#include <iostream>
#include<list>
#include<string>using namespace std;//-------------------------------------------
typedef struct {unsigned ID;string name;float score;
} Student;//----------------------------------------
void CreateList(list<Student> &stulist) {Student *pnew = NULL;cout << "创建学生链表,输入学号为0结束:" << endl;for (;;) {pnew = new Student;cout << "ID: ";cin >> pnew->ID;if (pnew->ID == 0) {delete pnew;break;}cout << "Name: ";fflush(stdin);getline(cin, pnew->name);cout << "Score: ";cin >> pnew->score;if (stulist.empty() || pnew->ID > stulist.back().ID) {stulist.push_back(*pnew);} else if (pnew->ID < stulist.front().ID) {stulist.push_front(*pnew);} else {list<Student>::iterator it_temp = stulist.begin();for (; it_temp != stulist.end(); it_temp++) {if (pnew->ID < it_temp->ID) {stulist.insert(it_temp, *pnew);break;}}}}
}//以上函数功能改进:按学号升序创建链表,输入时学号无序,链表创建完毕有序。
//主要算法:
//	如果链表为空或者pnew->ID>尾部ID,push_back(*pnew)
//	否则如果pnew->ID<首部ID,push_front(*pnew);
//	否则,定义迭代器:list<Student>::iterator it_temp,找到插入点,insert新学生。
//-------------------------------------------------------
void ShowList(list<Student> &stulist) {if (stulist.empty()) {cout << "List is empty!" << endl;return;}cout << "ID\tNAME\tSCORE" << endl;cout << "----------------------------------------------------------" << endl;list<Student>::iterator it_s = stulist.begin();while (it_s != stulist.end()) {cout << it_s->ID << '\t' << it_s->name << '\t' << it_s->score << endl;it_s++;}
}
//添加功能函数DeleteID( list<Student> &stulist)在已有链表中删除指定学号的学生
//基本方法:定义迭代器,查找指定ID学生后erase。注意查无结果的情况。void DeleteID(list<Student> &stulist) {int ID,flag = 0;cout << "请输入要删除学生的ID: ";cin >>ID;list<Student>::iterator it_s = stulist.begin();while (it_s != stulist.end()) {if(ID == it_s->ID){flag == 1;stulist.erase(it_s);cout<<"删除成功"<<endl;break;}it_s++;}if(flag == 0){cout<<"查无结果"<<endl;}
}//----------------------------------------------------------------
int main() {list<Student> stuList;CreateList(stuList);ShowList(stuList);DeleteID(stuList);ShowList(stuList);system("pause");return 0;
}

运行结果

习题3:C++一元n次多项式PolA和PolB相加得PolC

(1)定义多项式结点类型(结构体成员包含系数和指数)Typedef struct{	double xs,zs;}PolNode
(2)按指数升序创建多项式链表的函数CreatePolyn(list<PolNode> &Pol)
(3)多项式相加的函数AddPolyn(list<PolNode> &PolA, list<PolNode> &PolB, list<PolNode> &PolC)
(4)输出多项式的函数ShowPolyn(list<PolNode> &Pol)

代码实现

#include <iostream>
#include<list>using namespace std;//一元n次多项式PolA和PolB相加得PolC
//定义多项式结点类型(结构体成员包含系数和指数)
typedef struct {//系数,指数double xs, zs;
} PolNode;/*** 按指数升序创建多项式链表的函数* @param Pol*/
void CreatePolyn(list<PolNode> &Pol) {PolNode *pnew;int i = 0;cout<<"系数为零退出创建"<<endl;for (;;) {//创建新结点pnew = new PolNode;cout << "请输入第" << (i + 1) << "项的系数:";cin >> pnew->xs;//判断系数是否为0.如果为0,退出创建if (pnew->xs == 0) {delete pnew;break;}cout << "请输入第" << (i + 1) << "项的指数:";cin >> pnew->zs;i++;if (Pol.empty()) {Pol.push_back(*pnew);} else {//头做处理if (pnew->zs <= Pol.front().zs) {if (pnew->zs == Pol.front().zs) {if (pnew->xs + Pol.front().xs == 0) {Pol.pop_front();} else {Pol.front().xs += pnew->xs;}delete pnew;} else {Pol.push_front(*pnew);}continue;}//尾做处理if (pnew->zs >= Pol.back().zs) {if (pnew->zs == Pol.back().zs) {if (pnew->xs + Pol.back().xs == 0) {Pol.pop_back();} else {Pol.back().xs += pnew->xs;}delete pnew;} else {Pol.push_back(*pnew);}continue;}list<PolNode>::iterator it_pol = Pol.begin();while (++it_pol != Pol.end()) {if (it_pol->zs == pnew->zs) {if (it_pol->xs + pnew->xs == 0) {//删除temp节点且不添加pnew节点Pol.erase(it_pol);delete pnew;} else {//系数相加,且删除pnewit_pol->xs += pnew->xs;delete pnew;}break;}if (pnew->zs < it_pol->zs) {Pol.insert(it_pol, *pnew);break;}}}}
}/*** 多项式相加的函数* @param PolA* @param PolB* @param PolC*/
void AddPolyn(list<PolNode> &PolA, list<PolNode> &PolB, list<PolNode> &PolC) {PolNode *pnew = NULL;if (PolA.empty() && PolB.empty()) {cout << "多项式PolA和多项式PolB为空" << endl;return;}if (PolA.empty()) {PolC = PolB;}if (PolB.empty()) {PolC = PolA;}list<PolNode>::iterator it_a = PolA.begin();list<PolNode>::iterator it_b = PolB.begin();while (it_a != PolA.end() && it_b != PolB.end()) {pnew = new PolNode;if (it_a->zs == it_b->zs) {pnew->zs = it_a->zs;pnew->xs = it_a->xs + it_b->xs;it_a++;it_b++;PolC.push_back(*pnew);continue;}if (it_a->zs > it_b->zs) {pnew->zs = it_b->zs;pnew->xs = it_b->xs;it_b++;PolC.push_back(*pnew);continue;}if (it_a->zs < it_b->zs) {pnew->zs = it_a->zs;pnew->xs = it_a->xs;it_a++;PolC.push_back(*pnew);continue;}}if (it_a != PolA.end()) {pnew = new PolNode;pnew->zs = it_a->zs;pnew->xs = it_a->xs;PolC.push_back(*pnew);it_a++;}if (it_b != PolB.end()) {pnew = new PolNode;pnew->zs = it_b->zs;pnew->xs = it_b->xs;PolC.push_back(*pnew);it_b++;}
}/*** 输出多项式的函数* @param Pol*/
void ShowPolyn(list<PolNode> &Pol) {if (Pol.empty()) {cout << "多项式为空" << endl;return;}list<PolNode>::iterator it = Pol.begin();while (it != Pol.end()) {if (it == Pol.begin()) {if (it->zs < 0) {cout << it->xs;cout << "x^(" << it->zs << ")";} else if (it->zs == 0) {cout << it->xs;} else {if (it->zs == 1) {cout << it->xs;cout << "x";} else {cout << it->xs;cout << "x^" << it->zs;}}} else {if (it->xs < 0) {if (it->zs < 0) {cout << it->xs;cout << "x^(" << it->zs << ")";} else if (it->zs == 0) {cout << it->xs;} else {if (it->zs == 1) {cout << it->xs;cout << "x";} else {cout << it->xs;cout << "x^" << it->zs;}}} else {if (it->zs < 0) {cout << "+" << it->xs;cout << "x^(" << it->zs << ")";} else if (it->zs == 0) {cout << "+" << it->xs;} else {if (it->zs == 1) {cout << "+" << it->xs;cout << "x";} else {cout << "+" << it->xs;cout << "x^" << it->zs;}}}}it++;}cout << endl;
}//一元n次多项式PolA和PolB相加得PolC
int main() {list<PolNode> PolA;list<PolNode> PolB;list<PolNode> PolC;cout << "创建PolA" << endl;CreatePolyn(PolA);cout << "PolA(x)=";ShowPolyn(PolA);cout << "创建PolB" << endl;CreatePolyn(PolB);cout << "PolB(x)=";ShowPolyn(PolB);cout << "PolA(x)=";ShowPolyn(PolA);cout<<endl;cout << "PolB(x)=";ShowPolyn(PolB);cout<<endl;cout << "计算PolC(x)=PolA+PolB" << endl;AddPolyn(PolA, PolB, PolC);cout << "PolC(x)=";ShowPolyn(PolC);system("pause");return 0;
}

运行结果

更多推荐

C++第十七次作业(群体类

本文发布于:2024-02-25 14:16:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1699245.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:作业   群体   第十七次

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!