开发一个包含你需要的预处理定义的头文件。
test.c
#include
#include"diceroll.h"
int main(void){
printf("%d\n", N);
return 0;
}
diceroll.h
#ifndef DICEROLL_H_
#define DICEROLL_H_
#define N 30
#endif
两个数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数的平均值,最后取计算结果的倒数。使用#define指令定义一个宏函数,,执行该运算。编写一个简单的程序测试该宏。
#include
#define TIAO(x,y) 1.0/((1.0/(x)+1.0/(y))/2)
int main(void){
printf("%.2f\n", TIAO(1,2));
return 0;
}
极坐标向量的模(即向量的长度)和向量相对于X轴逆时针旋转的角度来描述该向量。直角坐标用向量X轴和y轴的做俩来描述向量。编写一个程序,读取向量的模和角度,然后显示x轴坐标和y轴坐标。相关方程如下:
x = r*cos a
y = r *sin a
需要一个函数来完成转换,该函数接受一个包含极坐标的结构,并返回一个包含直角坐标的结构(或返回指向该结构的指针)。
#include
#include
struct xy{
float x;
float y;
};
struct ra{
float r;
float a;
};
struct xy ra2xy(struct ra t){
struct xy m;
m.y = t.r*sin(t.a);
m.x = t.r*cos(t.a);
return m;
}
int main(void){
struct ra r ={1,2};
struct xy m = ra2xy(r);
printf("%.2f %.2f\n", m.x,m.y);
return 0;
}
ANSI库这样描述clock函数的特性:
#include
clock_t clock(void);
这里,clock_t是定义在time.h中的类型。该函数返回处理器时间,其单位取决于实现(如果处理器时间不可用或无法表示,该函数将返回-1)。然而,CLOCKS_PER_SEC(也定义在time.h中)是每秒处理器时间单位的数量。因此,两个clock返回值的差值除以CLOCKS_PER_SEC得到两次调用之间经过的秒数。在进行除法运算之前,把值的类型强制转换成double类型,可以将时间精确到小数点以后。编写一个函数,接受一个double类型的参数表示时间延迟数,然后这段时间运行一个循环。编写一个简单的程序测试该函数。
#include
#include
void delay(double d){
clock_t e = clock()+d*CLOCKS_PER_SEC;
while(clock()<e){
printf("=");
}
}
int main(void){
delay(0.01);
return 0;
}
编写一个函数接受这些参数:内含int类型元素的数组名、数组的带下和一个代表选取次数的值。该函数从数组中随机选择指定数量的元素,并打印它们。每个元素只能选择一次(模拟抽奖数字或挑选陪审团成员)。另外,如果你的实现有time()或类似的函数,可在srand中使用这个函数的输出来初始化随机数生成器rand()。编写一个简单的程序测试该函数。
#include
#include
void delay(const int *num,int len,int times){
int a[len];
int c;
for(int i=0;i<len;++i) a[i]=0;
for(int i=0;i<times;++i){
c = rand()%len;
while(a[c])
c = rand()%len;
a[c]=1;
printf("%d\n", num[c]);
}
}
int main(void){
int num[]={1,2,3,4,5,6,7,8,9,10};
delay(num,10,9);
return 0;
}
修改程序清单16.17,使用struct names元素(在程序清单16.17后面的讨论中定义过),而不是double 类型的数组。使用较少的元素,并用选定的名字显式初始化数组。
#include
#include
#include
#define NUM 10
struct names{
char first[40];
char last[40];
};
void fillarray(struct names ar[],int n){
for(int i=0;i<n;++i){
for(int j=0;j<10;++j)ar[i].first[j] = rand()%26 +'A';
ar[i].first[10] = '\0';
for(int j=0;j<10;++j)ar[i].last[j] = rand()%26 +'A';
ar[i].last[10] = '\0';
printf("%s %s\n", ar[i].last, ar[i].first);
}
}
void showarray(const struct names ar[],int n){
for(int i=0;i<n;++i){
printf("%s %s\n", ar[i].last, ar[i].first);
}
}
int mycomp(const void*p1,const void *p2){
const struct names *ps1 = (const struct names *) p1;
const struct names *ps2 = (const struct names *) p2;
int res = strcmp(ps1->last,ps2->last);
if(res!=0) return res;
else return strcmp(ps1->first,ps2->first);;
}
int main(void){
struct names vals[NUM];
fillarray(vals,NUM);
puts("Random list:");
showarray(vals, NUM);
qsort(vals,NUM,sizeof(struct names),mycomp);
puts("\nSorted list:");
showarray(vals,NUM);
return 0;
}
下面是使用了变参函数的一个程序段:
#include
#include
#include
void show_array(const double ar[],int n){
for(int i=0;i<n;++i){
printf("%.2lf\t", ar[i]);
putchar('\n');
}
}
double *new_d_array(int n,...){
double *num = (double*)malloc(sizeof(double)*n);
va_list ap;
va_start(ap,n);
for(int i=0;i<n;++i)num[i] = va_arg(ap,double);
va_end(ap);
return num;
}
int main(void){
double *p1;
double *p2;
p1 = new_d_array(5,1.2,2.3,3.4,4.5,5.6);
p2 = new_d_array(4,100.0,20.00,8.08,-1890.0);
show_array(p1,5);
show_array(p2,4);
free(p1);
free(p2);
return 0;
}