首页 > 编程语言 >c++结构体解决复数辐角问题

c++结构体解决复数辐角问题

时间:2024-05-30 20:03:36浏览次数:10  
标签:辐角 real 函数 double imag c++ CNStrt 复数 include

 结构体相关知识及运行代码(来自发发老师)


/*
  ch10_structs.cc
 
  介绍:
  这里解释了结构体的使用方法。包括:
  (1)定义和初始化。
  (2)赋值。
  (3)结构体和数组一起使用。注意数据成员和函数成员的访问。
  (4)结构体和向量一起使用。
  (5)结构体和函数。
*/

#include<iostream>
#include<iomanip>

#include<cmath>
#include<vector>

using namespace std;

//定义复数的结构体(struct),包括:
//(1)数据成员:实数部分real、虚数部分imag;
//(2)构造函数/初始化函数:默认初始化函数CNStrt()、给定值的初始化函数CNStrt(double,double);
//(3)成员函数:求复数的模Mode(),并返回结果;
struct CNStrt {
// public:
  //(1)数据成员;
  double real;
  double imag;

  //(2)构造函数;
  CNStrt();//默认构造函数;
  CNStrt(double);//real;
  CNStrt(double, double);//real,imag;

  //(3)成员函数;
  double Mode();

  void   Doubled();
};

CNStrt::CNStrt() {
  real = 0;
  imag = 0;
};

CNStrt::CNStrt(double r) {
  real = r;
  imag = 0;
};

CNStrt::CNStrt(double r, double i) {
  real = r;
  imag = i;
};

double CNStrt::Mode() {
  return sqrt(real * real + imag * imag);
};

void CNStrt::Doubled() {
  real *= 2;
  imag *= 2;
};

//定义函数;
void OutputCNStrt(CNStrt);

int main()
{
  //(1)结构体变量的定义;
  cout<<"@(2)结构体的赋值:"<<endl;
  
  CNStrt cn1;//赋值数据成员;
  cn1.real = 0;
  cn1.imag = 2;

  cout<<"cn1: real = "<<cn1.real<<", imag = "<<cn1.imag<<endl;
  
  CNStrt cn2 = CNStrt();//使用构造函数;
  
  cout<<"cn2: real = "<<cn2.real<<", imag = "<<cn2.imag<<endl;

  double real = 4;//可任意取值;
  double imag = 3;

  CNStrt cn3 = CNStrt(real, imag);

  cout
   <<"cn3: real = "
   <<cn3.real
   <<", imag = "
   <<cn3.imag
   <<"; mode = "
   <<cn3.Mode()
   <<endl;
  
  CNStrt cn4 = cn2;//使用同类型变量赋值;

  cout<<"cn4: real = "<<cn4.real<<", imag = "<<cn4.imag<<endl;
	
  //(3)结构体和数组结合使用;
  cout<<endl<<"@(3)结构体和数组: "<<endl;
  
  const int array_size = 5;
  CNStrt CNArray[array_size];

  for (int ind = 0; ind < array_size; ind++) {
    CNArray[ind] = CNStrt(ind, ind + 1);
  }

  CNStrt* pcn = &(CNArray[0]);
  for (int ind = 0; ind < array_size; ind++, pcn++) {
    cout
     <<" ind = "
     <<setw(3)
     <<ind
     <<": real = "
     <<setw(3)
     <<(*pcn).real//指针:解引用+数据成员;
     <<" or "
     <<setw(3)
     <<pcn->real//指针:使用箭头运算符来读取数据成员;
     <<", imag = "
     <<setw(3)
     <<(*pcn).imag
     <<" or "
     <<setw(3)
     <<pcn->imag
     <<endl;
  }
  
  //(4)结构体和向量结合使用;
  cout<<endl<<"@(4)结构体和向量: "<<endl;
  
  vector<CNStrt> CN;
  
  //复数结构体的初始化;
  int size = 10;
  for (int ind = 0; ind < size; ind++) {
    CN.push_back( CNStrt(ind, ind * 2) );
  }

  //使用迭代器来删除矢量的前n个元素:使用函数erase();
  cout<<"  删除前CN的大小:"<<CN.size()<<endl;

  vector<CNStrt>::iterator pvc;

//  CN.insert( pvc, CNStrt() );
  
  int remove_size = 2;

  while (remove_size-- > 0) {
    pvc = CN.begin();
    
    CN.erase(pvc);
  }

  cout
   <<"  删除后CN的大小: size() = "
   <<CN.size()
   <<", or end() - begin() = "
   <<CN.end() - CN.begin()
   <<endl;

  //使用迭代器来输出结构体的数据;
  for (pvc = CN.begin(); pvc != CN.end(); pvc++) {
    cout
     <<" real = "
     <<setw(3)
     <<(*pvc).real//迭代器:解引用+数据成员;
     <<" or "
     <<setw(3)
     <<pvc->real//迭代器:使用箭头运算符来读取数据成员;
     <<", imag = "
     <<setw(3)
     <<(*pvc).imag
     <<" or "
     <<setw(3)
     <<pvc->imag
     <<"; mode = "
     <<setw(8)
     <<(*pvc).Mode()
     <<" or "
     <<setw(8)
     <<pvc->Mode()//通过箭头运算符来读取函数成员;
     <<endl;
  }

  //(5)结构体和函数的使用;
  cout<<endl<<"@(5)结构体和函数:"<<endl;
  
  for (pvc = CN.begin(); pvc != CN.end(); pvc++) {
    pvc->Doubled();

    OutputCNStrt(*pvc);//CNStrt;
  }
  
  return 1;
};

void OutputCNStrt(CNStrt cn)
{
  cout
   <<" real = "
   <<setw(3)
   <<cn.real
   <<", imag = "
   <<setw(3)
   <<cn.imag
   <<endl;
};

/*
double Tripled(double c)
{
	
};

CNStrt Tripled(CNStrt cn)
{




};
*/

题目要求:

以下为实际代码计算复数: 

#include<iostream>
#include<cmath>
#include<iomanip>
#include<vector>
using namespace std;
struct CNStrt{
	double real;
	double imag;
	CNStrt();
	CNStrt(double);
	CNStrt(double,double);
	double ArguAngle();
};
CNStrt::CNStrt(){
	real = 0;
	imag = 0;
}
CNStrt::CNStrt(double r,double i){
	real = r;
	imag = i;
}
double CNStrt::ArguAngle(){
	return atan2(imag,real);
}
int main(){
	CNStrt cn1;
	cn1.real = 3;
	cn1.imag = 4;
	cout<<cn1.ArguAngle()<<" "<<cn1.ArguAngle()/M_PI<<"π"<<endl;
	
	cn1.real = -3;
	cn1.imag = -3;
	cout<<cn1.ArguAngle()<<" "<<cn1.ArguAngle()/M_PI<<"π"<<endl;
	
	cn1.real = sqrt(3.0);
	cn1.imag = 1.0;
	cout<<cn1.ArguAngle()<<" "<<cn1.ArguAngle()/M_PI<<"π"<<endl;
	
	return 0;
}

结构体是体现c++面向对象编程很有用的一个表现,将所有函数用法集成在结构体中,能够大大提高代码效率,可以在这个小例子中体悟一下。

也可以用数组来存储复数对象。

标签:辐角,real,函数,double,imag,c++,CNStrt,复数,include
From: https://blog.csdn.net/weixin_67037227/article/details/139333217

相关文章

  • 【c++基础(五)】内存管理--new
    1.前言在C语言中,有四个内存管理函数:malloc,calloc,realloc和free但是使用起来他们却是非常的不方便:int*p1=(int*)malloc(sizeof(int)*n);int*p2=(int*)calloc(4,sizeof(int));int*p3=(int*)realloc(p2,sizeof(int)*10);同时这里也会出现一个问题,malloc不会进......
  • 【c++基础(四)】类和对象下--初始化列表等概念
    1.前言类和对象到这里基本已经接近尾声,本篇文章主要介绍一些与类和对象有关的相关细节,在后续使用类和对象中也有可能用的到。本章重点:本篇文章重点讲解初始化列表,友元,匿名对象和类中的static成员,以及类中的内部类的概念。 2.初始化列表 在谈论初始化列表之前就要再次......
  • 区间和(C++)
    题目描述】给定一个全部为零的数列,规定有两种操作,一是修改某个元素,二是求区间的连续和。【输入】输入数据第一行包含两个正整数n,m(n≤100000,m≤500000) ,以下是m 行,每行有三个正整数k,a,b (k=0 或1,a,b≤n ).k=0 时表示将a 处数字加上b ,k=1 时表示询问区间[a,b......
  • 一文搞懂C++继承、多继承、菱形继承、虚继承
    继承目录继承继承继承的访问权限子类赋值给父类赋值兼容规则“天然”的行为验证:1.其他权限继承能否支持赋值兼容规则2.是否"天然",有没有产生临时变量继承中的作用域继承的构造函数继承的拷贝构造继承的operator=继承的析构函数析构顺序析构的特殊处理继承中的static成员设计一......
  • C++结构体使用
    文章目录原文链接一、结构体基本概念二、使用及定义三、结构体数组四、结构体指针六、结构体做函数参数值传递和地址传递的区别七、结构体中const的使用场景原文链接c++中的结构体一、结构体基本概念结构体属于用户自定义的数据类型,允许用户存储不同的数据类型......
  • c++ 模板 元编程
    模板是门新语言C++元编程是一种使用模板元编程技术实现的编程方式,它允许程序员在编译期进行计算和代码生成。相比于传统的运行时编程,C++元编程可以提高程序的执行效率,减少资源开销,使得编译器能够优化代码,从而在一些对性能要求较高的场景中有着广泛的应用。   来自:https:/......
  • C++ Primer Plus(第6版):程序的创建过程
    一个C++程序是如何一步步创建的呢?一般来说主要分为三个过程:使用文本编辑器编写程序,并将其保存至文件中,这个文件就是程序的源代码。编译源代码。这是指将源代码翻译为主机使用的内部语言--机器语言,将翻译后的代码称之为目标代码(objectcode)。将目标代码与其它代码链接起来。链......
  • c++ 模板
     来自:https://sg-first.gitbooks.io/cpp-template-tutorial/content/T_ji_ben_yu_fa.html 1.Template的基本语法1.1TemplateClass基本语法1.1.1TemplateClass的与成员变量定义我们来回顾一下最基本的TemplateClass声明和定义形式:TemplateClass声明:template<type......
  • 复数滤波器
    在数字信号处理(DSP)中进行复数卷积是一项计算密集型任务,尤其是在资源有限的嵌入式系统中。因此,设计一个高效的复数卷积算法对于节省DSP资源至关重要。以下是一些优化复数卷积以节省DSP资源的策略:1.使用FFT进行卷积利用快速傅里叶变换(FFT)可以将卷积操作转换为频域中的乘法操作,从......
  • C++入门 类(构造函数 & 析构函数 & 显式调用)
    目录类的6个默认成员函数 构造函数特性函数名与类名相同无返回值(不需要写void) 无参构造函数和带参构造函数 构造函数可以重载编译器自动生成构造函数 默认构造函数 实践总结析构函数 显式调用隐式调用 特性 析构函数名是在类名前加字符~ 无参数无返......