当前位置: 首页> 汽车> 报价 > 苏州开发小程序的公司_最好网站建站公司_福建seo搜索引擎优化_谷歌搜索引擎在线

苏州开发小程序的公司_最好网站建站公司_福建seo搜索引擎优化_谷歌搜索引擎在线

时间:2025/7/10 0:07:15来源:https://blog.csdn.net/2302_78101238/article/details/146921055 浏览次数: 0次
苏州开发小程序的公司_最好网站建站公司_福建seo搜索引擎优化_谷歌搜索引擎在线
#include <stdio.h>
//定义结构体
typedef struct 
{float realpart;float imagpart;
}Complex;
//初始化虚数
//传递值,和指针分开
void assign(const float real,const float imag,Complex* A){A->imagpart=imag;A->realpart=real;
}
//虚数相加
//同样传递值,和指针分开
void add(const Complex A,const Complex B,Complex* C){C->imagpart=A.imagpart+B.imagpart;C->realpart=A.realpart+B.realpart;
}
//虚数相减
void minus(const Complex A,const Complex B,Complex* C){C->imagpart=A.imagpart-B.imagpart;C->realpart=A.realpart-B.realpart;
}//虚数相乘
void multiply(const Complex A,const Complex B,Complex* C){C->realpart = A.realpart * B.realpart - A.imagpart * B.imagpart;C->imagpart = A.realpart * B.imagpart + A.imagpart * B.realpart;
}
//虚数相除
void divide(const Complex A, const Complex B, Complex* C) {Complex conjugate = {B.realpart, -B.imagpart};  // B的共轭Complex numerator;multiply(A, conjugate,&numerator);            // 分子:A * B的共轭float denominator = B.realpart * B.realpart + B.imagpart * B.imagpart;  // 分母C->realpart = numerator.realpart / denominator;C->imagpart = numerator.imagpart / denominator;
}
//主函数
int main(){Complex z1;Complex z2;Complex z3;assign(3.0,4.0,&z1);assign(2.0,5.0,&z2);add(z1,z2,&z3);printf("相加时z3= %.2f + %.2fi\n", z3.realpart, z3.imagpart);minus(z1,z2,&z3);printf("相减时z3= %.2f + %.2fi\n", z3.realpart, z3.imagpart);multiply(z1,z2,&z3);printf("相乘时z3= %.2f + %.2fi\n", z3.realpart, z3.imagpart);divide(z1,z2,&z3);printf("相除时z3= %.2f + %.2fi\n", z3.realpart, z3.imagpart);return 0;
}

一、结构体定义与初始化

1.1 结构体定义
typedef struct {float realpart;float imagpart;
} Complex;
  • 知识点解析

    • typedef的作用:为匿名结构体创建别名Complex,简化变量声明。

      // 无typedef的传统写法
      struct Complex { ... };
      struct Complex z1;  // 必须带struct// 有typedef的现代写法
      typedef struct { ... } Complex;
      Complex z1;         // 直接使用别名
    • 结构体成员realpart(实部)和imagpart(虚部)均为float类型。

    • 内存布局:结构体成员在内存中连续存储,总大小为各成员大小之和(此处为2 * sizeof(float) = 8字节)。

1.2 assign函数:初始化复数
void assign(const float real, const float imag, Complex* A) {A->imagpart = imag;A->realpart = real;
}
  • 知识点解析

    • 指针操作:通过指针A直接修改结构体成员,避免值传递的开销。

    • const关键字:保护输入参数realimag不被意外修改。

    • 操作符->:等价于(*A).imagpart,通过指针访问成员。

    • 初始化示例

      Complex z1;
      assign(3.0, 4.0, &z1);  // z1 = 3.0 + 4.0i

二、复数运算函数

2.1 加法函数add
void add(const Complex A, const Complex B, Complex* C) {C->imagpart = A.imagpart + B.imagpart;C->realpart = A.realpart + B.realpart;
}
  • 知识点解析

    • 值传递与指针传递:输入参数AB为值传递(拷贝),输出参数C为指针传递(直接修改目标内存)。

    • const保护输入参数:确保函数内不会修改AB的值。

    • 示例计算

      Complex z1 = {3, 4}, z2 = {2, 5}, result;
      add(z1, z2, &result);  // result = 5.0 + 9.0i
2.2 减法函数minus
void minus(const Complex A, const Complex B, Complex* C) {C->imagpart = A.imagpart - B.imagpart;C->realpart = A.realpart - B.realpart;
}
  • 知识点扩展

    • 函数命名规范minus是动词,符合“动作+参数”的命名习惯(如calculateDifference)。

2.3 乘法函数multiply
void multiply(const Complex A, const Complex B, Complex* C) {C->realpart = A.realpart * B.realpart - A.imagpart * B.imagpart;C->imagpart = A.realpart * B.imagpart + A.imagpart * B.realpart;
}
  • 数学原理
    复数乘法公式:
    (a+bi)(c+di)=(ac−bd)+(ad+bc)i(a+bi)(c+di)=(ac−bd)+(ad+bc)i

2.4 除法函数divide
void divide(const Complex A, const Complex B, Complex* C) {Complex conjugate = {B.realpart, -B.imagpart};  // 共轭复数Complex numerator;multiply(A, conjugate, &numerator);             // 分子 = A * B的共轭float denominator = B.realpart * B.realpart + B.imagpart * B.imagpart;C->realpart = numerator.realpart / denominator;C->imagpart = numerator.imagpart / denominator;
}
  • 数学原理
    复数除法公式:
    a+bic+di=(a+bi)(c−di)c2+d2c+dia+bi​=c2+d2(a+bi)(c−di)​


三、主函数与代码执行

int main() {Complex z1, z2, z3;assign(3.0, 4.0, &z1);  // z1 = 3.0 + 4.0iassign(2.0, 5.0, &z2);  // z2 = 2.0 + 5.0iadd(z1, z2, &z3);printf("相加结果: %.2f + %.2fi\n", z3.realpart, z3.imagpart);minus(z1, z2, &z3);printf("相减结果: %.2f + %.2fi\n", z3.realpart, z3.imagpart);multiply(z1, z2, &z3);printf("相乘结果: %.2f + %.2fi\n", z3.realpart, z3.imagpart);divide(z1, z2, &z3);printf("相除结果: %.2f + %.2fi\n", z3.realpart, z3.imagpart);return 0;
}
  • 输出示例

    相加结果: 5.00 + 9.00i
    相减结果: 1.00 - 1.00i
    相乘结果: -14.00 + 23.00i
    相除结果: 0.90 - 0.24i

四、结构体高级知识点扩展

4.1 结构体嵌套
typedef struct {int x;int y;
} Point;typedef struct {Point start;Point end;
} Line;
  • 示例用法

    Line line = {{0, 0}, {3, 4}};
    printf("线段长度: %.2f\n", sqrt(pow(line.end.x - line.start.x, 2) + pow(line.end.y - line.start.y, 2)));
4.2 结构体与动态内存
Complex* createComplex(float real, float imag) {Complex* c = (Complex*)malloc(sizeof(Complex));if (c != NULL) {c->realpart = real;c->imagpart = imag;}return c;
}// 使用后需手动释放内存
Complex* z = createComplex(3.0, 4.0);
free(z);
4.3 结构体对齐与填充
  • 对齐规则:结构体成员按最大成员类型的对齐要求排列。

    struct Example {char a;      // 1字节int b;       // 4字节(对齐到4的倍数地址)double c;    // 8字节(对齐到8的倍数地址)
    };
    // 总大小: 1 + 3(填充) + 4 + 8 = 16字节
4.4 结构体位域
typedef struct {unsigned int isReady : 1;  // 1位unsigned int hasError : 1;unsigned int status  : 4;  // 4位
} DeviceStatus;

五、总结

  • 核心知识点

    • 结构体封装数据,函数模拟方法,实现面向对象风格。

    • 指针传递提升效率,const保护数据安全。

    • 复数运算需严格遵循数学公式。

  • 扩展应用

    • 结构体嵌套、动态内存管理、位域操作等高级用法。

    • 结合文件操作、网络通信等场景设计复杂数据结构。

通过结构体和函数的组合,C语言能够有效模拟对象的行为,为底层系统开发和嵌入式编程提供灵活的数据管理能力。

 解释完代码后,下面来介绍一下结构体,在之前,我们简单的介绍过结构体,今天来详细介绍并举例说明:

结构体相关介绍(详细)

1. 什么是结构体?

结构体(struct)是C语言中一种自定义的复合数据类型,它允许你将多个不同类型的数据组合在一起,形成一个新的数据类型。

通俗理解:就像是一个"盒子",里面可以放各种不同类型的东西(数据)。

2. 为什么要用结构体?

想象你要记录一个学生的信息:

  • 姓名(字符串)

  • 年龄(整数)

  • 成绩(浮点数)

如果没有结构体,你需要这样:

char name[20];
int age;
float score;

有了结构体,你可以把它们打包成一个整体:

struct Student {char name[20];int age;float score;
};

3. 结构体的基本语法

3.1 定义结构体

struct 结构体名 {数据类型 成员1;数据类型 成员2;// ...
};

示例

// 定义一个表示点的结构体
struct Point {int x;  // x坐标int y;  // y坐标
};

3.2 使用typedef简化

每次使用结构体都要写struct关键字很麻烦,可以用typedef简化:

typedef struct {int x;int y;
} Point;  // 现在可以直接用Point声明变量

3.3 声明结构体变量

// 方法1:定义时直接声明
struct Student {char name[20];int age;
} stu1, stu2;// 方法2:先定义后声明
struct Student stu3;// 使用typedef后更简单
Point p1, p2;

3.4 初始化结构体

// 方法1:按顺序初始化
struct Student stu1 = {"张三", 18, 90.5};// 方法2:指定成员初始化(C99标准)
struct Student stu2 = {.name = "李四", .age = 19, .score = 88.5};// 使用typedef的初始化
Point p1 = {10, 20};

4. 访问结构体成员

使用点运算符.访问结构体成员:

struct Student stu1 = {"张三", 18, 90.5};
printf("姓名:%s\n", stu1.name);
printf("年龄:%d\n", stu1.age);
printf("成绩:%.1f\n", stu1.score);// 修改成员值
stu1.age = 19;

5. 结构体指针

当结构体很大时,直接传递结构体会产生拷贝开销,这时可以使用指针:

struct Student stu1 = {"张三", 18, 90.5};
struct Student *pStu = &stu1;// 通过指针访问成员
printf("姓名:%s\n", (*pStu).name);  // 方法1
printf("姓名:%s\n", pStu->name);    // 方法2(更常用)

箭头运算符->:专门用于通过指针访问结构体成员。

6. 结构体的大小

结构体的大小不是简单等于各成员大小之和,因为存在内存对齐问题:

struct Example1 {char a;   // 1字节int b;    // 4字节double c; // 8字节
};
// 不是1+4+8=13,实际可能是16字节(取决于对齐规则)

可以使用sizeof运算符查看结构体大小:

printf("结构体大小:%zu字节\n", sizeof(struct Example1));

7. 结构体数组

可以创建结构体类型的数组:

struct Student class[3] = {{"张三", 18, 90.5},{"李四", 19, 88.0},{"王五", 17, 92.5}
};// 访问数组元素
printf("第二个学生的姓名:%s\n", class[1].name);

8. 结构体嵌套

结构体可以包含其他结构体:

typedef struct {int hour;int minute;int second;
} Time;typedef struct {int year;int month;int day;Time time;
} DateTime;// 初始化
DateTime dt = {2023, 10, 15, {14, 30, 0}};// 访问嵌套成员
printf("时间是:%d:%d:%d\n", dt.time.hour, dt.time.minute, dt.time.second);

9. 结构体作为函数参数

结构体可以作为函数参数传递:

// 值传递(会产生拷贝)
void printStudent(struct Student stu) {printf("姓名:%s\n", stu.name);// ...
}// 指针传递(更高效)
void modifyStudent(struct Student *pStu) {pStu->age += 1;
}// 使用
printStudent(stu1);
modifyStudent(&stu1);

10. 结构体应用实例

10.1 学生管理系统

#include <stdio.h>
#include <string.h>typedef struct {char name[20];int age;float score;
} Student;void inputStudent(Student *stu) {printf("请输入姓名:");scanf("%s", stu->name);printf("请输入年龄:");scanf("%d", &stu->age);printf("请输入成绩:");scanf("%f", &stu->score);
}void printStudent(Student stu) {printf("姓名:%s\n", stu.name);printf("年龄:%d\n", stu.age);printf("成绩:%.1f\n", stu.score);
}int main() {Student stu;inputStudent(&stu);printStudent(stu);return 0;
}

10.2 图形计算

#include <stdio.h>
#include <math.h>typedef struct {double x;double y;
} Point;double distance(Point p1, Point p2) {return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}int main() {Point a = {0, 0};Point b = {3, 4};printf("两点距离:%.2f\n", distance(a, b));return 0;
}

11. 常见问题

11.1 结构体赋值

结构体可以直接赋值(C语言支持):

Point p1 = {10, 20};
Point p2;
p2 = p1;  // 合法,会复制所有成员的值

11.2 结构体比较

不能直接用==比较结构体,需要逐个比较成员:

int isEqual(Point p1, Point p2) {return p1.x == p2.x && p1.y == p2.y;
}

11.3 结构体动态分配

可以使用malloc动态创建结构体:

Student *pStu = (Student *)malloc(sizeof(Student));
strcpy(pStu->name, "张三");
pStu->age = 18;
// 使用完后记得释放
free(pStu);

12. 总结

结构体是C语言中非常重要的特性,它允许你将相关的数据组合在一起,使代码更加清晰和易于维护。记住以下几点:

  1. 使用struct定义结构体,可以用typedef简化

  2. .访问成员,用->通过指针访问成员

  3. 结构体可以作为函数参数传递(值传递或指针传递)

  4. 结构体支持嵌套和数组

  5. 理解结构体的内存对齐规则

通过大量练习,你会逐渐掌握结构体的使用技巧。尝试用结构体来解决实际问题,比如学生管理系统、图书管理系统等,这将帮助你更好地理解结构体的强大之处。

学生管理系统:

(C语言)学生信息表(学生管理系统)(基于通讯录改版)(正式版)(C语言项目)-CSDN博客

运算结果如下:

相加时z3= 5.00 + 9.00i
相减时z3= 1.00 + -1.00i
相乘时z3= -14.00 + 23.00i
相除时z3= 0.90 + -0.24i请按任意键继续. . .

关键字:苏州开发小程序的公司_最好网站建站公司_福建seo搜索引擎优化_谷歌搜索引擎在线

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: