C语言中<math.h>常用函数与指针详解

需积分: 34 4 下载量 198 浏览量 更新于2024-07-13 收藏 112KB PPT 举报
在C程序设计实践中,理解<math.h>库中的常用函数对于编写高效的代码至关重要。该库包含了一系列数学运算函数,如sqrt()用于计算平方根,sin()和asin()用于正弦和反正弦运算,exp()执行指数函数,log()计算自然对数,pow()则是指数幂运算。其中,地板函数floor()用于取整,通过去掉小数部分实现四舍五入取整,例如`floor(x + 0.5)`。 函数是C语言中处理任务的基本单元,它们接受输入(参数),执行特定操作,然后返回结果。函数的定义包括类型、函数名和参数列表,例如`int add(int x, int y)`,表示这是一个返回整型值的add函数,接受两个整数参数。在C文件中调用函数时,如果函数未在前面声明,就需要提供函数声明,如`int add(int x, int y);`,并且可以省略参数名。 在程序设计中,为了保持代码的组织和模块化,函数的实现通常放在`.c`文件中,而接口声明则放在`.h`文件中。这遵循接口与实现分离的原则,方便其他模块引用和复用。例如,一个功能性的add函数可能被封装为`.h`文件中的`extern int add(int x, int y);`,同时在对应的`.c`文件中有具体实现。 在函数调用中,有两种常见方式:单独调用,如`iSum = add(123, 98);`;以及作为参数传递,如`printf("Sum=%d\n", add(789, -56));`。这里展示了形式参数(形参)和实际参数(实参)的概念,形参是函数内部的局部变量,而实参则是实际传递给函数的值。 值得注意的是,C语言默认的函数参数传递方式是值传递,这意味着函数内部对形参的修改不会影响实参的值。在上述例子中,`void swap(int x, int y)`未能实现交换实参a和b的值,因为它们各自独立存储,互不影响。要实现真正的值交换,可以通过指针来间接访问并修改实参的值,如`void swap(int* x, int* y)`。 总结来说,掌握<math.h>库中的函数,理解函数定义、声明、调用和参数传递机制,以及如何利用指针进行有效的值交换,是编写高效、可维护C程序的关键要素。通过这些概念的运用,可以构建出更加模块化和灵活的代码结构。

定义抽象类 Shape 及其子类 Circle 和 Rectangle, 要求: (1) 抽象类 Shape 具有纯虚函数 Area(), 用于计算其子类的面积; (2) 抽象类 Shape 的子类 Circle、Rectangle, 覆盖父类的 Area() 方法, 用于计算各自的面积; (3) 通过 Shape 类指针分别指向 Circle 对象、Rectagnle 对象, 并调用 Aera() 方法用于输出面积. 示例: #include <string> #include <iostream> #define _USE_MATH_DEFINES #include <math.h> class Shape { public: virtual double Area() = 0; }; class Circle: public Shape { public: Circle(double r); virtual double Area(); protected: double r; }; Circle::Circle(double r) { ... } double Circle::Area() { ... } 1 class Rectangle: public Shape { public: Rectangle(double w, double h); virtual double Area(); protected: double w; double h; }; Rectangle::Rectangle(double w, double h) { ... } double Rectangle::Area() { ... } int main() { std::cout << "-------------" << std::endl; std::cout << "创建Circel对象:" << std::endl; Circle circle(1); std::cout << " 面 积 为 :" << circle.Area() << std::endl; std::cout << "-------------" << std::endl; std::cout << "创建Rectangle对象:" << std::endl; Rectangle rect(2,2); std::cout << " 面 积 为 :" << rect.Area() << std::endl; Shape * pt; std::cout << "-------------" << std::endl; std::cout << "Shape 指 针 引 用 Circle 对 象 :" << std::endl; pt = &circle; std::cout << " 面 积 为 :" << pt->Area() << std::endl; std::cout << "-------------" << std::endl; std::cout << "Shape 指 针 引 用 Rectangle 对 象 :" << std::endl; pt = ▭ std::cout << " 面 积 为 :" << pt->Area() << std::endl; return 0; }

2023-06-08 上传
2023-07-14 上传

画出GraphItem类的UML类图: #ifndef GRAPHITEM_H #define GRAPHITEM_H #include <QGraphicsItem> #include <QVector> #include <QPointF> #include <QtMath> #include <QTimer> #include <QPaintEvent> #include <QPushButton> #include "mainwindow.h" #include <QObject> class MainWindow; // 前向声明 class GraphItem : public QGraphicsItem { public: //构造函数,接受带权无向图临界矩阵adjMatrix和一个parent GraphItem(const QVector<QVector<int>> &adjMatrix, const QVector<int> &shortestPath, QGraphicsItem *parent = nullptr); //纯虚函数,在.cpp中重新编写以实现图形项的边界框绘制 QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; QVector<QPointF> m_nodePositions;//存储节点的位置信息 QVector<int> m_shortestPath; // 最短路径 QVector<int> m_userCity; QVector<int> m_userSchool; bool m_drawArrow; // 是否需要绘制箭头 bool m_draw1; bool m_draw2; bool m_draw3; private: MainWindow * m_mainWindow; // 指向MainWindow对象的指针 QVector<QVector<int>> m_adjMatrix;//存储带权无向图的邻接矩阵 QPointF startPoint; QPointF endPoint; QPainter * m_painter; QPainter * m_drawNodes; void initializeNodePositions();//初始化节点位置信息 void drawEdges(QPainter * painter);//用于绘制边 void drawNodes1(QPainter * painter);//用于绘制节点 void drawNodes2(QPainter * painter);//用于绘制节点 void drawNodes3(QPainter * painter);//用于绘制节点 void paintArrow(QPainter * painter); }; #endif // GRAPHITEM_H

2023-07-14 上传
2023-05-31 上传