zoukankan      html  css  js  c++  java
  • C++第二次上机5-5

    建立一个复数类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
    ");
    		else if (imag == -1) printf("-i
    ");
    		else if (imag > 0) printf("+%di
    ",imag);
    		else printf("%di
    ",imag);
    	}
    	else if(real != 0)
    	{
    		printf("%d
    ",real);
    	}
    	else if(imag != 0)
    	{
    		if(imag == 1) printf("i
    ");
    		else if (imag == -1) printf("-i
    ");
    		else  printf("%di
    ",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[n] = '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[n] = 'i';
    	}
    	Complex c2 = f(s2);
    	
    	Complex c3 = c1*c2;
    	
    	c3.display();
    }
    
  • 相关阅读:
    解决pip3的ImportError: cannot import name 'main'
    linux 安装Python3.6
    Linux安装redis和部署
    redis密码管理
    CentOS7使用firewalld打开关闭防火墙与端口
    scrapy 从Windwos平台移植到 Linux平台之实操
    Linux 环境下安装Maven
    解决:安装Jenkins时web界面出现该jenkins实例似乎已离线
    持续集成工具Jenkins结合SVN的安装和使用
    Linux下的SVN服务器搭建
  • 原文地址:https://www.cnblogs.com/Anani-leaf/p/5571400.html
Copyright © 2011-2022 走看看