文章目录
- 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<stdio.h>#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<stdio.h>#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<stdio.h>
#include<math.h>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 <time.h>
clock_t clock(void);
这里,clock_t是定义在time.h中的类型。该函数返回处理器时间,其单位取决于实现(如果处理器时间不可用或无法表示,该函数将返回-1)。然而,CLOCKS_PER_SEC(也定义在time.h中)是每秒处理器时间单位的数量。因此,两个clock返回值的差值除以CLOCKS_PER_SEC得到两次调用之间经过的秒数。在进行除法运算之前,把值的类型强制转换成double类型,可以将时间精确到小数点以后。编写一个函数,接受一个double类型的参数表示时间延迟数,然后这段时间运行一个循环。编写一个简单的程序测试该函数。
4.2 编程源码
#include<stdio.h>
#include<time.h>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<stdio.h>
#include<stdlib.h>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 结果显示
6. 第6题
6.1 题目描述
修改程序清单16.17,使用struct names元素(在程序清单16.17后面的讨论中定义过),而不是double 类型的数组。使用较少的元素,并用选定的名字显式初始化数组。
6.2 编程源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define NUM 10struct 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 结果显示
7. 第7题
7.1 题目描述
下面是使用了变参函数的一个程序段:
7.2 编程源码
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>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;
}