#include <stdio.h> #define CALC_S(a, b, c) ((a + b + c) / 2.0) #define CALC_AREA(a, b, c) (CALC_S(a, b, c) * (CALC_S(a, b, c) - a) * (CALC_S(a, b, c) - b) * (CALC_S(a, b, c) - c)) int main() { double a = 3.0, b = 4.0, c = 5.0; // 假设三边分别为 3、4、5 double s = CALC_S(a, b, c); double area = CALC_AREA(a, b, c); printf("三角形的面积为: %f\n", area); return 0; }优化
时间: 2023-11-27 19:49:55 浏览: 59
以下是对代码的一些优化建议:
1. 宏定义可以改为内联函数,这样可以避免宏定义带来的一些问题,比如参数多次计算等。
2. 可以将变量的声明和初始化合并到一行,减少代码行数。
3. 由于三角形面积的计算中需要用到三边长度的平方,可以将这个计算提前,避免重复计算。
4. 输出浮点数时可以使用 "%.2f" 的格式化字符串,保留两位小数。
综上,可以优化为以下代码:
```c
#include <stdio.h>
#include <math.h>
static inline double calc_s(double a, double b, double c) {
return (a + b + c) / 2.0;
}
static inline double calc_area(double a, double b, double c) {
double s = calc_s(a, b, c);
return sqrt(s * (s - a) * (s - b) * (s - c));
}
int main() {
double a = 3.0, b = 4.0, c = 5.0; // 假设三边分别为 3、4、5
double area = calc_area(a, b, c);
printf("三角形的面积为:%.2f\n", area);
return 0;
}
```
相关问题
优化一下这个代码#include<stdio.h> #include<stdlib.h> #define N 3 struct student_type//结构体 { char name [10]; int num; double ave; double score[3]; }stud[N]; void save()//存入磁盘函数 { FILE * fp; int i; if((fp=fopen("stud_dat","wb"))==NULL) { printf("无法打开此文件\n"); exit(0); } for(i=0;i<N;i++) if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) printf("文件存入失败!\n"); fclose(fp); } void arry()//平均函数 { int i,k; double sum=0; for(k=0;k<N;k++) { for(i=0;i<3;i++) { sum=sum+stud[k].score[i]; } stud[k].ave=sum/3.0;//求平均值 } } void main() { int i; for(i=0;i<N;i++) { printf("请输入第%d名学生的信息(姓名,学号,3门成绩)\n",i+1);//输入数据 scanf("%s%d%lf%lf%lf",stud[i].name,&stud[i].num,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]); arry();//调用函数 printf("平均成绩:%f\n",stud[i].ave); } for(i=0;i<N;i++) { printf("姓名:%s\n学号:%d\n平均成绩:%lf\n",stud[i].name,stud[i].num,stud[i].ave);//输出数据 save();//调用函数将数据存入磁盘 } }
以下是对代码的优化建议:
1. 将常量N定义为宏,可以提高代码的可读性和可维护性。
2. 将结构体的定义放在函数外面,可以增加代码的可读性。
3. 将存入磁盘和求平均分数的操作分别独立成两个函数,可以提高代码的可读性和可维护性。
4. 将读取学生信息和输出学生信息的操作分别放在两个循环中,可以提高代码的可读性。
5. 在输出学生信息之前,先调用求平均分数的函数,可以保证输出的平均分数是正确的。
6. 在读取学生信息时,可以使用循环结构,避免代码重复。
7. 在存入磁盘时,可以使用二进制模式打开文件,可以提高存取的效率。
下面是优化后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 3
struct student_type {
char name[10];
int num;
double ave;
double score[3];
} stud[N];
// 存入磁盘函数
void save() {
FILE* fp;
int i;
if ((fp = fopen("stud_dat", "wb")) == NULL) {
printf("无法打开此文件\n");
exit(0);
}
for (i = 0; i < N; i++) {
if (fwrite(&stud[i], sizeof(struct student_type), 1, fp) != 1) {
printf("文件存入失败!\n");
}
}
fclose(fp);
}
// 求平均分数函数
void calc_average() {
int i, k;
double sum;
for (k = 0; k < N; k++) {
sum = 0;
for (i = 0; i < 3; i++) {
sum += stud[k].score[i];
}
stud[k].ave = sum / 3.0; // 求平均值
}
}
int main() {
int i, j;
for (i = 0; i < N; i++) {
printf("请输入第%d名学生的信息(姓名,学号,3门成绩)\n", i + 1);
scanf("%s%d", stud[i].name, &stud[i].num);
for (j = 0; j < 3; j++) {
scanf("%lf", &stud[i].score[j]);
}
}
calc_average(); // 计算平均分数
for (i = 0; i < N; i++) {
printf("姓名:%s\n学号:%d\n平均成绩:%lf\n", stud[i].name, stud[i].num, stud[i].ave);
save(); // 存入磁盘
}
return 0;
}
```
#ifndef Node_hpp #define Node_hpp #include <stdio.h> class Node { public: virtual double Calc() const =0; virtual ~Node(){}; }; class NumberNode:public Node { public: double Calc() const; NumberNode(double number):number_(number){}; private: const double number_; }; class BinaryNode:public Node { public: BinaryNode(Node* left,Node* right):left_(left),right_(right){} ~BinaryNode(); protected: Node* const left_; Node* const right_; }; class UnaryNode:public Node { public: double Calc() const; UnaryNode(Node* child):child_(child){} ~UnaryNode(); protected: Node* const child_; }; class AddNode:public BinaryNode { public: AddNode(Node* left,Node* right):BinaryNode(left,right){} double Calc() const; }; class SubNode:public BinaryNode { public: SubNode(Node* left,Node* right):BinaryNode(left,right){} double Calc() const; }; class MultiplyNode:public BinaryNode { public: MultiplyNode(Node* left,Node* right):BinaryNode(left,right){} double Calc() const; }; class DivideNode:public BinaryNode { public: DivideNode(Node* left,Node* right):BinaryNode(left,right){} double Calc() const; }; class UMinusNode:public UnaryNode { public: UMinusNode(Node* child):UnaryNode(child){} double Calc() const; }; #endif#include "Node.hpp" #include <iostream> using namespace std; #include <cmath> double NumberNode:: Calc() const{ return number_; } BinaryNode::~BinaryNode(){ delete left_; delete right_; } UnaryNode::~UnaryNode(){ delete child_; } double AddNode:: Calc() const{ return left_->Calc()+right_->Calc(); } double SubNode:: Calc() const{ return left_->Calc()-right_->Calc(); } double MultiplyNode::Calc() const{ return left_->Calc()*right_->Calc(); } double DivideNode:: Calc() const{ double divisor=right_->Calc(); if (divisor!=0.0) { return left_->Calc()/divisor; } else { cout<<"Error:divisor by zreo"<<endl; return HUGE_VAL; } return left_->Calc()+right_->Calc(); } double UMinusNode::Calc() const{ return - child_->Calc(); }
这段代码看起来是一个数学表达式的节点类的实现,但是缺少了一些关键的头文件,可能会导致编译错误。建议添加以下头文件:
```
#include <iostream>
#include <cmath>
```
另外,如果您的问题是关于编译错误,可以提供具体的错误信息以便更好地定位问题。
阅读全文