C Primer Plus 第6版 编程练习 chapter 16

文章目录

  • 1. 第1题
    • 1.1 题目描述
    • 1.2 编程源码
    • 1.3 结果显示
  • 2. 第2题
    • 2.1 题目描述
    • 2.2 编程源码
    • 2.3 结果显示
  • 3. 第3题
    • 3.1 题目描述
    • 3.2 编程源码
    • 3.3 结果显示
  • 4. 第4题
    • 4.1 题目描述
    • 4.2 编程源码
    • 4.3 结果显示
  • 5. 第5题
    • 5.1 题目描述
    • 5.2 编程源码
    • 5.3 结果显示
  • 6. 第6题
    • 6.1 题目描述
    • 6.2 编程源码
    • 6.3 结果显示
  • 7. 第7题
    • 7.1 题目描述
    • 7.2 编程源码
    • 7.3 结果显示

1. 第1题

1.1 题目描述

开发一个包含你需要的预处理定义的头文件。

1.2 编程源码

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

1.3 结果显示

结果显示


2. 第2题

2.1 题目描述

两个数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数的平均值,最后取计算结果的倒数。使用#define指令定义一个宏函数,,执行该运算。编写一个简单的程序测试该宏。

2.2 编程源码

#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;
}

2.3 结果显示

结果显示


3. 第3题

3.1 题目描述

极坐标向量的模(即向量的长度)和向量相对于X轴逆时针旋转的角度来描述该向量。直角坐标用向量X轴和y轴的做俩来描述向量。编写一个程序,读取向量的模和角度,然后显示x轴坐标和y轴坐标。相关方程如下:
x = r*cos a
y = r *sin a
需要一个函数来完成转换,该函数接受一个包含极坐标的结构,并返回一个包含直角坐标的结构(或返回指向该结构的指针)。

3.2 编程源码

#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;
}

3.3 结果显示

结果显示


4. 第4题

4.1 题目描述

ANSI库这样描述clock函数的特性:
#include
clock_t clock(void);
这里,clock_t是定义在time.h中的类型。该函数返回处理器时间,其单位取决于实现(如果处理器时间不可用或无法表示,该函数将返回-1)。然而,CLOCKS_PER_SEC(也定义在time.h中)是每秒处理器时间单位的数量。因此,两个clock返回值的差值除以CLOCKS_PER_SEC得到两次调用之间经过的秒数。在进行除法运算之前,把值的类型强制转换成double类型,可以将时间精确到小数点以后。编写一个函数,接受一个double类型的参数表示时间延迟数,然后这段时间运行一个循环。编写一个简单的程序测试该函数。

4.2 编程源码

#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;
}

4.3 结果显示

结果显示


5. 第5题

5.1 题目描述

编写一个函数接受这些参数:内含int类型元素的数组名、数组的带下和一个代表选取次数的值。该函数从数组中随机选择指定数量的元素,并打印它们。每个元素只能选择一次(模拟抽奖数字或挑选陪审团成员)。另外,如果你的实现有time()或类似的函数,可在srand中使用这个函数的输出来初始化随机数生成器rand()。编写一个简单的程序测试该函数。

5.2 编程源码

#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;
}

5.3 结果显示

C Primer Plus 第6版 编程练习 chapter 16_第1张图片


6. 第6题

6.1 题目描述

修改程序清单16.17,使用struct names元素(在程序清单16.17后面的讨论中定义过),而不是double 类型的数组。使用较少的元素,并用选定的名字显式初始化数组。

6.2 编程源码

#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;
}

6.3 结果显示

C Primer Plus 第6版 编程练习 chapter 16_第2张图片


7. 第7题

7.1 题目描述

下面是使用了变参函数的一个程序段:

7.2 编程源码

#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;
}

7.3 结果显示

C Primer Plus 第6版 编程练习 chapter 16_第3张图片


你可能感兴趣的:(C,Primer,Plus,第六版,编程练习,c语言,算法,开发语言)