复数的加减法
背景
对于复数的加法都有一定的了解的基础下,
本文中主要讨论输入为复数形式的代码
主要是运用到c语言的一个函数sscanf
通过这个函数来快速实现对于输入形如(a+bi)的复数
如何提取出它的实部和虚部
然后计算(a+bi)与(c+di)的和
接下来从这几部分进行讨论
- 了解sscanf函数
- 复数实部虚部的提取及计算
一、了解sscanf函数
在处理字符串的过程中,经常需要截取字符串,将一大段字符串中截取出自己想要的信息。如果是自己手写一个函数,有点麻烦。但了解了 c语言 中的sscanf函数,就显得十分方便了
用法一:截取指定长度的字符串
char str[100];
sscanf("12345678","%4s",str);
printf("用法一\nstr = %s\n",str);
用法二:格式化时间
int year,month,day;
sscanf("2019/02/20","%d/%d/%d",&year,&month,&day);
printf("用法二\ntime = %d年%d月%d日",year,month,day);
用法三:读入字符串
sscanf("12345678","%s",str);
printf("用法三\nstr = %s\n",str);
用法四:取到指定字符为止的字符串。
如在下例中,取遇到’+'为止字符串。
sscanf("12345+acc","%[^+]",str);
printf("用法四\nstr = %s\n",str);
用法五:取到指定字符集为止的字符串。
如在下例中,取遇到小写字母为止的字符串。
sscanf("12345+acc121","%[^a-z]",str);
printf("用法五\nstr = %s\n",str);
完整测试代码
#include <bits/stdc++.h>
int main()
{
char str[100];
//用法一:截取指定长度的字符串
sscanf("12345678","%4s",str);
printf("用法一\nstr = %s\n",str);
//用法二:格式化时间
int year,month,day,hour,minute,second;
sscanf("2019/02/20","%d/%d/%d",&year,&month,&day);
printf("用法二\ntime = %d-%d-%d\n",year,month,day);
//用法三:读入字符串
sscanf("12345678","%s",str);
printf("用法三\nstr = %s\n",str);
//用法四:取到指定字符为止的字符串。
//如在下例中,取遇到'+'为止字符串。
sscanf("12345+acc","%[^+]",str);
printf("用法四\nstr = %s\n",str);
//用法五:取到指定字符集为止的字符串。如在下例中,取遇到小写字母为止的字符串。
sscanf("12345+acc121","%[^a-z]",str);
printf("用法五\nstr = %s\n",str);
//综合测试
char str1[100] ="123568qwerSDDAE";
char lowercase[100];
int num;
sscanf(str1,"%dq%[a-z]", &num, lowercase);
printf("The number is: %d.\n", num);
printf("The lowercase is: %s.", lowercase);
return 0;
}
二、复数实部虚部的提取及计算
题目要求:
输入两个复数,输出他们的和
实例
输入:12+7i 2-i
输出:14+6i
输入:i 4-i
输出:4
解题思路
- 对于一个复数而言,我们先自定义函数get_num,用于获取他的实部虚部
- 先确定字符串num长度L,若没有虚部,直接赋值给实部,返回
- 当复数长度为1时,即i,或者是形如a+i,a-i这类的,我们将他转化成1i,a+1i,a-1i,这样有利于后面提取实部虚部
- 再得出实部数字的位数L,将实部取出,即num+L,此时可提取出虚部,
- 然后令num[L]=’\0’,这样num就只剩下实部了
- 接下来对另一个复数也进行相同操作,至此,我们得到了两个复数相应的实部虚部
- 最后要进行求和,求和很简单,关键在于输出的格式上。对于一些特殊的输出形式要注意,例如7+i,7-i,这类的
详细操作见以下完整代码
#include <bits/stdc++.h>
using namespace std;
int realPart,conjPart;
void get_num(char num[])
{
realPart=0;//初始化实部虚部
conjPart=0;
int L=strlen(num);//确认num字符串的长度
if(num[L-1] != 'i')//如果没有虚部
{
conjPart=0;
sscanf(num,"%d",&realPart);
return ;
}
if(L==1 || num[L-2]=='+' || num[L-2]=='-')
{
//例如 i,-i,1+i这类虚部为正负1的情况
//分别转化为 1i,-1i,1+1i ,有利于后面操作
num[L-1]='1';
num[L]='i';
L++;
num[L]=0;
}
L--;
while(L)//得出实部数字的位数
{
if(num[L]=='+' || num[L]=='-')
break;
L--;
}
//num+L表示num前面L位字符
////printf("%s\n",num+L);
sscanf(num+L,"%di",&conjPart);//取出虚部
num[L]='\0';
sscanf(num,"%d",&realPart); //取出实部
}
void print_sum(int c,int d,int e,int f)
{
int a,b;
a=c+e;
b=d+f;
if(b==0)
printf("%d\n",a);
else if(a==0 && b==1)
printf("i\n");
else if(a==0 && b==-1)
printf("-i\n");
else if(a==0)
printf("%di\n",b);
else if(a!=0 && b==1)
printf("%d+i\n",a);
else if(a!=0 && b==-1)
printf("%d-i\n",a);
else
{
if(b>0)
printf("%d+%di\n",a,b);
else
printf("%d%di\n",a,b);
}
}
int main()
{
char num1[50],num2[50];//定义两个复数
int a,b,c,d;
scanf("%s %s",num1,num2);
get_num(num1);
a=realPart;
b=conjPart;
get_num(num2);
c=realPart;
d=conjPart;
print_sum(a,b,c,d);
return 0;
}