#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 13:49:55 浏览: 33
以下是对代码的一些优化建议:
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 MAX_N 10#define MAX_CARD 5typedef struct { int num; // 编号 int cards[MAX_CARD]; // 抽卡牌情况 int total_score; // 总点数} Student;
好的,这段代码定义了一个结构体 `Student`,其中包含了每个同学的编号、抽卡牌情况和总点数。这段代码本身没有需要优化的地方,但是可以根据实际情况考虑增加一些优化,比如:
1. 定义常量:可以使用 `const` 关键字定义一些常量,比如数字卡牌的点数范围、最大同学数、最大卡牌数等。这样可以提高代码的可读性和可维护性。
2. 使用枚举:可以使用 `enum` 关键字定义一些枚举类型,比如卡牌类型(数字卡牌、D 卡牌),这样可以使代码更加清晰。
3. 使用函数:可以将计算总点数的函数 `calc_score` 定义为一个独立的函数,这样可以提高代码的模块化和可重用性。
4. 减少重复计算:在计算 D 卡牌的时候,可以记录上一次抽到的数字卡牌的点数,避免重复计算。
综上所述,我们可以对代码进行如下优化:
```c
#include <stdio.h>
enum {
NUM_CARD_MIN = 1,
NUM_CARD_MAX = 9,
MAX_N = 10,
MAX_CARD = 5,
};
enum {
CARD_TYPE_NUM = 0,
CARD_TYPE_D = 1,
};
typedef struct {
int num;
int cards[MAX_CARD];
int total_score;
} Student;
int calc_score(const int *cards) {
int last_card_score = 0;
int total_score = 0;
for (int i = 0; i < MAX_CARD; i++) {
if (cards[i] == -1) {
break;
}
if (cards[i] == CARD_TYPE_D) {
total_score += last_card_score * 2;
} else if (cards[i] >= NUM_CARD_MIN && cards[i] <= NUM_CARD_MAX) {
total_score += cards[i];
last_card_score = cards[i];
}
}
return total_score;
}
int main() {
Student students[MAX_N];
int min_score = 10000, min_score_num = -1;
for (int i = 0; i < MAX_N; i++) {
int num;
scanf("%d", &num);
students[i].num = num;
for (int j = 0; j < MAX_CARD; j++) {
char card[3];
scanf("%s", card);
if (card[0] == 'D') {
students[i].cards[j] = CARD_TYPE_D;
} else {
students[i].cards[j] = atoi(card);
}
}
students[i].total_score = calc_score(students[i].cards);
if (students[i].total_score < min_score) {
min_score = students[i].total_score;
min_score_num = students[i].num;
}
}
printf("%d\n", min_score_num);
return 0;
}
```
这样,我们对代码进行了一些常量定义、枚举类型定义、函数封装和重复计算的优化,使得代码更加简洁、可读、可维护和高效。
#include <stdio.h> #include <string.h> #define MAX_STUDENT_NUM 30 // #define MAX_COURSE_NUM 6 // #define NAME_LEN 20 // struct Student { char id[10];//学生学号 char name[NAME_LEN];//姓名 int scores[MAX_COURSE_NUM];//各科分数 int total_score;//总分 float avg_score;//平均分 }; void input_record(struct Student students[], int num);//录入每个学生的学号、姓名和各科考试成绩 void calc_total_avg_course(struct Student students[], int num, int course_num);//计算每门课程的总分和平均分 请用c语言分别补充函数内容
补充input_record函数内容:
```
void input_record(struct Student students[], int num)
{
for (int i = 0; i < num; i++)
{
printf("请输入第%d个学生的学号:", i+1);
scanf("%s", students[i].id);
printf("请输入第%d个学生的姓名:", i+1);
scanf("%s", students[i].name);
for (int j = 0; j < MAX_COURSE_NUM; j++)
{
printf("请输入第%d个学生的第%d门课程成绩:", i+1, j+1);
scanf("%d", &students[i].scores[j]);
}
}
}
```
补充calc_total_avg_course函数内容:
```
void calc_total_avg_course(struct Student students[], int num, int course_num)
{
for (int i = 0; i < course_num; i++)
{
int total_score = 0;
for (int j = 0; j < num; j++)
{
total_score += students[j].scores[i];
}
printf("第%d门课程的总分为:%d,平均分为:%.2f\n", i+1, total_score, (float)total_score/num);
}
}
```
注:这里假设MAX_COURSE_NUM为6,NAME_LEN为20。