for(k = 1; k < p->month; k++) p->day = p->day + tab[leap][k]; return p->day; }
6.(选作) 通讯录排序。通讯录的结构记录包括:姓名、生日、电话号码,其中生日又包 括三项:年、月、日。定义一个嵌套的结构类型,输入n(n<10)个联系人的信息,再按他们 的年龄从大到小的顺序依次输出其信息。 输入输出示例 n=3
zhang 1985 04 03 13912345678 wang 1982 10 20 0571-88018448 qian 1984 06 19 13609876543 wang 1982/10/20 0571-88018448 qian 1984/6/19 13609876543 zhang 1985/4/3 13912345678 解答:
#include
struct date{ /* 日期结构 */ int y, m ,d ; };
struct friends_list{
char name[10]; /* 姓名 */ struct date birthday; /* 生日 */ char phone[15]; /* 电话号码 */ };
void sort(struct friends_list s[], int n) /*按生日日期从小到大排序*/ { int i, j, b1, b2;
struct friends_list temp; for(i=1; i b1 = (s[j].birthday.y*100+ s[j].birthday.m)*100+ s[j].birthday.d; b2 = (s[j+1].birthday.y*100+ s[j+1].birthday.m)*100+ s[j+1].birthday.d; if( b1 > b2) {temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; } } } int main(void) { int i, n; struct friends_list friends[10]; printf(“n=”); scanf(“%d”, &n); for(i=0; i scanf(\&friends[i].birthday.d, friends[i].phone); /*按年龄从大到小排序*/ sort(friends, n); for(i=0;i printf(\friends[i].birthday.m, friends[i].birthday.d, friends[i].phone); return 0; } 10 1 练习参考答案 10-1 若要用递归函数计算sum=1+2+3+…+n(n 为正整数),请写出该递归函数的递归式子 及递归出口。 解答: 递归式子: sum(i) = sum(i-1) + i; i>0 递归出口: sum(i) = 0; i = 0 10-2 请完成下列宏定义: ① MIN(a,b) 求a,b 的最小值 ② ISLOWER(c) 判断c 是否为小写字母 ③ ISLEAP(y) 判断y 是否为闰年 ④ CIRFER(r) 计算半径为r 的圆周长 解答: ① MIN(a, b):求a, b 的最小值。 #define MIN(a, b) (a) < (b) ? (a): (b) ② ISLOWER(c):判断c 是否为小写字母。 #define ISLOWER(c) (((c) >= 'a') && ((c) <= 'z') ) ③ ISLEAP(y):判断y 是否为闰年。 #define ISLEAP(y) ((y) % 4 == 0 && (y) % 100 != 0) || ((y) % 400 = = 0) ④ CIRFER(r):计算半径为r 的圆周长。 #define PI 3.14159 #define CIRFER(r) 2*PI*(r) 10-3 分别用函数和带参宏实现从3 个数中找出最大数,请比较两者在形式上和使用上的区 别。 解答: 1) 函数实现 int max( int x, int y, int z ) { int t; if(x>=y) if (x>=z) t=x; else t=z; else if (y>=z) t=y; else t=z; return t; } 2) 宏实现 #define MAX( x, y, z ) x>=y? (x>=z? x:z) : (y>=z? y:z) 两者在定义形式上完全不同。使用上函数是在执行时,从主调函数转到函数max(),然 后再返回到主调函数,函数体始终存在;而宏是在编译预处理时,用条件表达式去替换 MAX(int x, int y, int z ),等程序执行时,执行的是条件表达式,而不再存在MAX(int x, int y, int z )的式子。 2 习题参考答案 一、选择题 1.要调用数学函数时,在#include 命令行中应包含 C 。 A.”stdio.h” B.”string.h” C.”math.h” D.”ctype.h” 2.对于以下递归函数f,调用f(4),其返回值为 A 。 int f(int n) { if (n) return f(n - 1) + n; else return n; } A.10 B.4 C.0 D.以上均不是 3.执行下列程序: #define MA(x, y) ( x*y ) i = 5; i = MA(i, i + 1) – 7; 后变量i 的值应为 B 。 A.30 B.19 C.23 D.1 4.宏定义“#define DIV(a, b) a/b”,经DIV(x + 5, y - 5) 引用,替换展开后是 A 。 A.x + 5 / y - 5 B.x + 5 / y – 5 C.(x + 5) / (y - 5) D.(x + 5) / (y - 5); 5.定义带参数的宏“#define JH(a,b,t) t = a; a = b; b = t”,对两个参数a、b 的值进行交换,下 列表述中哪个是正确的 C 。 A.不定义参数a 和b 将导致编译错误 B.不定义参数a、b、t 将导致编译错误 C.不定义参数t 将导致运行错误 D.不需要定义参数a、b、t 类型 6.执行下面程序,正确的输出是 A 。 int x = 5, y = 7; void swap ( ) { int z ; z = x ; x = y ; y = z ; } int main(void) { int x = 3, y = 8; swap ( ) ; printf ( \return 0 ; } A.3, 8 B.8, 3 C.5, 7 D.7, 5 7.下面说法中正确的是 A 。 A.若全局变量仅在单个C 文件中访问,则可以将这个变量修改为静态全局变量,以降低模 块间的耦合度 B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低 模块间的耦合度 C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量 生命周期问题 D.静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出 二、填空题 1.执行完下列语句段后, i 值为 2 。 int i; int f(int x) { static int k = 0; x += k++; return x; } i=f(f(1)); 2.执行完下列语句段后, i 的值为 5 。 int i; int f(int x) { return ((x>0)? f(x-1)+f(x-2):1); } i=f(3); 3.下列程序段A 与B 功能等价,请填写程序段B 中相应语句。 程序段A: int f( int n ) { if(n<=1) return n; else return f(n-1)+f(n-2); } 程序B: int f( int n ) { int t, t0, t1 ; t0=0; t1=1; t=n; while ( n>1 ) { t = t0+t1 ; t0 = t1; t1 = t; n - -; } return t ; } 4.下面程序用于计算 f(k , n)=1k+2k+…+nk ,其中power(m , n )求mn。请填写程序中相应 语句。 # include for( i=1 ; i<=n ; i++) p = p * m ; return p ; } int f(int k , int n) { int i ; int s=0 ; for( i=1 ; i<=n ; i++) s = s + power(i, k) ; return s ; } int main(void) { int k , n ; scanf(“%d%d”, &k, &n ) ; printf(“f(%d, %d)=%ld” , k, n, f(k, n)) ; return 0; } 5.下列递归程序的输出结果为 g=4,g=3,k=6 。 #include case 2: return 2; } printf(\ return fib(g-1) + fib(g-2); } int main(void) { int k; k = fib(4); printf(\return 0; } 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C语言程序设计及实验指导练习及习题参考答案(8--10)(8)在线全文阅读。
相关推荐: