C++第二次上机5-5
2016-06-08 22:01
387 查看
建立一个复数类Complex,实数和虚数是其私有数据成员; 建立复数类的无参和参数化构造函数; 建立一个 *(乘号)的运算符重载,以便于对两个复数直接进行乘法运算; 建立输出函数void display(),对复数进行输出; 主函数里定义三个复数类对象c1、c2、c3. 输入格式: 输入一共一行,每行两个复数,分别为复数类c1和c2。 输出格式: 执行c3=c1*c2运算之后,调用display函数,对c3进行输出。 提示:输入或输出的复数,可能只包含实部或虚部。 输入样例: 1+2i 2+3i 输出样例: -4+7i
这一题上机的时候没想好怎么做,忘记了正负,然后又想到复数的简化形式,判断起来很难,没想清楚就下了手,导致花了一个多小时没做出来,然后今天补救,有了之前的经验,仔细想了想,其实可以前来一次前缀处理,去掉特殊情形,再做成函数,这样就快很多
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; class Complex { private: int imag; int real; public: Complex(int r = 0, int i = 0):real(r),imag(i) {} void display(); Complex operator *(Complex &t); }; Complex Complex::operator *(Complex &t) { return Complex((real*t.real - imag*t.imag),(real*t.imag + imag*t.real)); } void Complex::display() { if (imag && real) { printf("%d",real); if(imag == 1) printf("+i\n"); else if (imag == -1) printf("-i\n"); else if (imag > 0) printf("+%di\n",imag); else printf("%di\n",imag); } else if(real != 0) { printf("%d\n",real); } else if(imag != 0) { if(imag == 1) printf("i\n"); else if (imag == -1) printf("-i\n"); else printf("%di\n",imag); } } int ll; int change(char *s,int l) { int ans = 0; while (s[l]>='0' && s[l] <= '9') { ans = ans*10 + s[l++] - '0'; } ll = l; return ans; } Complex f(char *s) { int n = strlen(s); int real = 0,imag = 0; if(s[n-1] == 'i')//存在虚部 { int flag = -1; int n = strlen(s); int t = 0; if(s[0] == '-') t = 1; for (int i = t; i < n; i++) { if(s[i] == '+' || s[i] == '-') { flag = i;//存在实部; break; } } if(flag != -1)//有实部有虚部 { if(s[0] == '-') real = -1 * change(s,1); else real = change(s,0); if(s[flag] == '-') imag = -1*change(s,flag+1); else imag = change(s,flag+1); } else//只有虚部 { if(s[0] == '-') imag = -1 * change(s,1); else imag = change(s,0); } } else//只有实部; { if(s[0] == '-') real = -1*change(s,1); else real = change(s,0); } return Complex(real,imag); } int main() { char s1[100] = ""; char s2[100] = ""; scanf("%s %s",s1,s2); int n = strlen(s1); if(s1[n-1] == 'i' &&(n == 1 || s1[n-2] == '+'|| s1[n-2] == '-'))//处理特殊情形 { s1[n-1] = '1'; s1 = 'i'; } Complex c1 = f(s1); n = strlen(s2); if(s2[n-1] == 'i' &&(n == 1 || s2[n-2] == '+'|| s2[n-2] == '-')) { s2[n-1] = '1'; s2 = 'i'; } Complex c2 = f(s2); Complex c3 = c1*c2; c3.display(); }
相关文章推荐
- c++ string函数精讲
- 哈夫曼树数据机构的建立及哈夫曼编码与解码的C++实现
- 类的继承与派生(Shape例子派生Rectangle和Circle,Rectangle派生出Square)
- C语言char*字符串数组和unsigned char[]数组的相互转换
- C++符号优先级
- 层序遍历二叉树(C语言+循环队列)
- GDI+ 如何绘制圆角矩形(vc++)
- 【C/C++】枚举类型举例
- error LNK2019
- C++构造函数和析构函数
- C++实现多线程全局内存池(性能优化)
- 264. Ugly Number II
- error LNK2005
- C调用graphviz绘制堆
- C++第15周项目 范型程序设计 【项目2】
- 【C/C++】Sleep函数的用法
- C++第15周项目 范型程序设计 【项目1】
- C++Primer 中文版 第五版 第七章课后习题答案
- c++:类的组合秋圆的周长与面积与球的体积
- TinyXML:一个优秀的C++ XML解析器