复数的加法

本文探讨了在C语言中利用sscanf函数处理复数加法的问题。通过sscanf函数,可以方便地提取复数的实部和虚部,并进行计算。文章详细介绍了sscanf函数的多种用法,并提供了提取复数实部和虚部的解题思路及完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复数的加减法

背景

对于复数的加法都有一定的了解的基础下,
本文中主要讨论输入为复数形式的代码
主要是运用到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

解题思路
  1. 对于一个复数而言,我们先自定义函数get_num,用于获取他的实部虚部
  2. 先确定字符串num长度L,若没有虚部,直接赋值给实部,返回
  3. 当复数长度为1时,即i,或者是形如a+i,a-i这类的,我们将他转化成1i,a+1i,a-1i,这样有利于后面提取实部虚部
  4. 再得出实部数字的位数L,将实部取出,即num+L,此时可提取出虚部,
  5. 然后令num[L]=’\0’,这样num就只剩下实部了
  6. 接下来对另一个复数也进行相同操作,至此,我们得到了两个复数相应的实部虚部
  7. 最后要进行求和,求和很简单,关键在于输出的格式上。对于一些特殊的输出形式要注意,例如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;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值