目录
《C Primer Plus》编程练习
第16章
1.exercise1.c
开发一个包含你需要的预处理器定义的头文件。
//exercise16.1
#ifndef LEN //避免重复包含
#define LEN 10
#define SIZE 20 //常量
struct names_st {
//结构声明
char fname[SIZE];
char lname[SIZE];
};
typedef struct names_st names; //类型定义
char * s_gets(char * st, int n); //函数原型
#endif
2.exercise2.c
两数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数的平均值,最后取计算结果的倒数。使用#define指令定义一个宏“函数”,执行该运算。编写一个简单的程序测试该宏。
//exercise16.2
#include <stdio.h>
#define HAVAR(X, Y) (1 / (((1 / X) + (1 / Y)) / 2)) //函数宏
int main(void)
{
double x = 5, y = 7, z;
puts("请输入两个数:(输入q退出程序)");
while (scanf("%lf %lf", &x, &y) == 2)
{
z = HAVAR(x, y);
printf("%g和%g的调和平均数是:%g。\n", x, y, z);
puts("请输入两个数:(输入q退出程序)");
}
puts("程序结束。");
return 0;
}
输出示例:
请输入两个数:(输入q退出程序)
5 7
5和7的调和平均数是:5.83333。
请输入两个数:(输入q退出程序)
3 6
3和6的调和平均数是:4。
请输入两个数:(输入q退出程序)
q
程序结束。
3.exercise3.c
极坐标用向量的模(即向量的长度)和向量相对x轴逆时针旋转的角度来描述该向量。直角坐标用向量的x轴和y轴的坐标来描述该向量(见图16.3)。编写一个程序,读取向量的模和角度(单位:度),然后显示x轴和y轴的坐标。相关方程如下:
x = r * cosA y = r * sinA
需要一个函数来完成转换,该函数接受一个包含极坐标的结构,并返回一个包含直角坐标的结构(或返回指向该结构的指针)。
//exercise16.3
#include <stdio.h>
#include <math.h>
struct pcoordinates {
//极坐标
double length;//模
double angle;//角度(直角坐标)
};
struct ccoordinates {
//直角坐标
double x;
double y;
};
struct ccoordinates transfer(struct pcoordinates pcoordinate);//极坐标转直角坐标
int main(void)
{
struct pcoordinates pcoordinate;//初始化结构
struct ccoordinates ccoordinate;
puts("请输入向量的模和角度:(输入q退出)");
while (scanf("%lf %lf", &pcoordinate.length, &pcoordinate.angle) == 2)//输入模和角度
{
ccoordinate = transfer(pcoordinate);
printf("该向量x = %g,y = %g。\n", ccoordinate.x, ccoordinate.y);
puts("请输入向量的模和角度:(输入q退出)");
}
puts("程序结束。");
return 0;
}
struct ccoordinates transfer(struct pcoordinates pcoordinate)
{
struct ccoordinates ccoordinate;
double degree_rad = 3.1515926 / 180;//直角坐标角度1度等于的弧度
ccoordinate.x = pcoordinate.length * cos(pcoordinate.angle * degree_rad);
ccoordinate.y = pcoordinate.length * sin(pcoordinate