标签:
看完C prime plus(第五版)第十二章,随带完成了后面的习题。
1.不使用全局变量,重写程序清单12.4的程序。
先贴出12.4的程序,方便对照;
1 /* global.c --- 使用外部变量 */ 2 #include <stdio.h> 3 int units = 0; //一个外部变量 4 void critic(void); 5 int main(void) 6 { 7 extern int units; 8 9 printf ("How many pounds to a firkin of butter?\n"); 10 scanf("%d", &units); 11 while(units != 56) 12 critic(); 13 14 printf("You must have looked it up!\n"); 15 return 0; 16 } 17 18 void critic(void){ 19 printf("No luck, chummy, Try again in.\n"); 20 scanf("%d", &units); 21 }
以下是我的答案:
1 #include "stdio.h" 2 3 void critic(void); 4 5 int main(void){ 6 int num; 7 printf("How many pounds to a firkin of butter?\n"); 8 while(scanf("%d", &num) == 1 && num != 56){ 9 critic(); 10 } 11 12 printf("You must have looked it up!\n"); 13 14 return 0; 15 } 16 17 void critic(void){ 18 puts("Not lucky, Try again!"); 19 }
2.在美国通常以英里每加仑来计算油耗,在欧洲是以升每百公里来计算。下面是某程序的一部分,该程序让用户选择一个模式(公制的或美制的),然后收集数据来计算油耗。
1 #include "stdio.h" 2 3 void set_mode(int get); //设置模式 4 void get_info(void); //获取行驶公里、消耗油量,计算 5 void show_info(void); //展示计算结果 6 7 static int mode; 8 static double loss = 0.0, 9 distance = 0.0; 10 11 void set_mode(int get){ 12 switch(get){ 13 case 0: 14 mode = 0; 15 break; 16 case 1: 17 default: 18 mode = 1; 19 break; 20 } 21 } 22 23 void get_info(void){ 24 extern double loss, distance; 25 switch(mode){ 26 case 0: 27 puts("输入你所形式的公里数:"); 28 scanf("%lf", &distance); 29 puts("损耗的油(单位:加仑):"); 30 scanf("%lf", &loss); 31 break; 32 case 1: 33 puts("输入你所形式的英里数:"); 34 scanf("%lf", &distance); 35 puts("损耗的油(单位:加仑):"); 36 scanf("%lf", &loss); 37 break; 38 default: 39 puts("你选择的模式不正确!默认使用英里模式!"); 40 puts("输入你所形式的英里数:"); 41 scanf("%lf", &distance); 42 puts("损耗的油(单位:加仑):"); 43 scanf("%lf", &loss); 44 break; 45 } 46 } 47 48 void show_info(void){ 49 switch(mode){ 50 case 0: 51 printf("平均每公里损耗%0.2lf加仑油!\n", distance / loss); 52 break; 53 case 1: 54 default: 55 printf("平均每英里损耗%0.2lf加仑油!\n", distance / loss); 56 break; 57 } 58 }
1 #include "stdio.h" 2 #include "pe12-2a.h" //函数要求写在pe12-2a.h中 3 4 int main(void){ 5 int mode; 6 printf("Enter 0 for metric mode, 1 for US mode:"); 7 scanf("%d", &mode); 8 while(mode >= 0){ 9 set_mode(mode); 10 get_info(); 11 show_info(); 12 printf("Enter 0 for metric mode, 1 for US mode."); 13 printf("(-1 to quit)"); 14 scnaf("%d", &mode); 15 } 16 printf("Done \n"); 17 18 return 0; 19 }
3.重新设计习题2中的程序,使它仅使用自动变量。(使用不同的函数)
1 //pe12-3a.h 2 #include "stdio.h" 3 #define MET 0 4 #define US 1 5 6 void set_mode(int *); //获取用户输入的信息,设置模式 7 void get_info(const int mode, double *distance, double *loss); //获取用户的信息 8 void show_info(const int mode, const double distance, const double loss); //计算平均油耗,输出结果 9 10 void set_mode(int *get){ 11 if((*get != US) && (*get > US)){ 12 *get = US; 13 } 14 } 15 16 void get_info(const int mode, double *distance, double *loss){ 17 switch(mode){ 18 case 0: 19 puts("输入你所形式的公里数:"); 20 scanf("%lf", distance); 21 puts("损耗的油(单位:加仑):"); 22 scanf("%lf", loss); 23 break; 24 case 1: 25 puts("输入你所形式的英里数:"); 26 scanf("%lf", distance); 27 puts("损耗的油(单位:加仑):"); 28 scanf("%lf", loss); 29 break; 30 default: 31 puts("你选择的模式不正确!默认使用英里模式!"); 32 puts("输入你所形式的英里数:"); 33 scanf("%lf", distance); 34 puts("损耗的油(单位:加仑):"); 35 scanf("%lf", loss); 36 break; 37 } 38 } 39 40 void show_info(const int mode, const double distance, const double loss){ 41 switch(mode){ 42 case 0: 43 printf("平均每公里损耗%0.2lf加仑油!\n", distance / loss); 44 break; 45 case 1: 46 default: 47 printf("平均每英里损耗%0.2lf加仑油!\n", distance / loss); 48 break; 49 } 50 }
1 //12-3b.c 2 #include "stdio.h" 3 #include "12-3a.h" 4 5 int main(){ 6 int mode; 7 double distance = 0.0, 8 loss = 0.0; 9 printf("输入0选择公尺单位,输入1选择英尺单位"); 10 scanf("%d", &mode); 11 while(mode >= 0){ 12 set_mode(&mode); 13 get_info(mode, &distance, &loss); 14 show_info(mode, distance, loss); 15 printf("输入0选择公尺单位,输入1选择英尺单位"); 16 scanf("%d", &mode); 17 } 18 19 puts("Done"); 20 return 0; 21 }
4.编写一个函数,返回函数自身被调用的次数;
1 #include "stdio.h" 2 3 int test_call(void); 4 5 int main(void){ 6 int temp, num; 7 while(scanf("%d", &temp) == 1){ 8 for(; temp > 0; temp--){ 9 num = test_call(); 10 } 11 printf("这次一共调用了%d次函数\n", num); 12 printf("输入调用次数:"); 13 } 14 15 return 0; 16 } 17 18 int test_call(void){ 19 static int num = 0; 20 return ++num; 21 }
5.编写产生100个1到10范围内的随机数的程序,并且以降序排序;
1 #include "stdio.h" 2 #include "stdlib.h" 3 #define LEN 100 4 5 void set_num(int *); //产生随机数 6 void show_num(int *); //排序后输出 7 8 int main(void){ 9 int arr[LEN], 10 temp = 0; 11 12 set_num(arr); 13 show_num(arr); 14 15 return 0; 16 } 17 18 void set_num(int *arr){ 19 int temp = 0; 20 for(; temp < LEN; temp++){ 21 arr[temp] = rand() % 10 + 1; //rand() % 10 产生一个个位数,为了避免是0,所以加1. 22 } 23 } 24 25 void show_num(int *arr){ 26 int temp = 0, 27 loop1 = 0, //用于循环而创建的变量 28 loop2 = 0; 29 30 //进行排序 31 for(; loop1 < LEN; loop1++){ 32 for(loop2 = loop1; loop2 < LEN; loop2++){ 33 if(arr[loop1] < arr[loop2]){ //注意降序排列 34 temp = arr[loop1]; 35 arr[loop1] = arr[loop2]; 36 arr[loop2] = temp; 37 } 38 } 39 } 40 41 42 for(temp = 0; temp < LEN; temp++){ 43 printf("%3d", arr[temp]); 44 if((temp + 1) % 10 == 0) 45 putchar(‘\n‘); 46 } 47 }
6.编写一个程序,产生1000个范围在1到10的数字,不必存储他们,只需要计算每个数出现的次数;
1 #include "stdio.h" 2 #include "stdlib.h" 3 #define LEN 1000 4 5 static number[10]; 6 //计算数字出现的次数 7 void get_thousand(int ); 8 //输出每个数字出现的次数 9 void show_thousand(void); 10 11 int main(void){ 12 int temp = 0, 13 arr[LEN]; 14 for(; temp < LEN; temp++){ 15 //生成一个随机数 16 get_thousand(arr[temp] = rand() % 10 + 1); 17 } 18 19 show_thousand(); 20 21 return 0; 22 } 23 24 void get_thousand(int num){ 25 static temp = 0; 26 switch(num){ 27 case 1: 28 number[--num]++; 29 break; 30 case 2: 31 number[--num]++; 32 break; 33 case 3: 34 number[--num]++; 35 break; 36 case 4: 37 number[--num]++; 38 break; 39 case 5: 40 number[--num]++; 41 break; 42 case 6: 43 number[--num]++; 44 break; 45 case 7: 46 number[--num]++; 47 break; 48 case 8: 49 number[--num]++; 50 break; 51 case 9: 52 number[--num]++; 53 break; 54 case 10: 55 number[--num]++; 56 break; 57 default: 58 puts("产生了一个不在1-10范围内的数字!"); 59 break; 60 } 61 ++temp; 62 } 63 64 void show_thousand(void){ 65 int temp = 0, 66 sum = 0; 67 for(; temp < 10; temp++){ 68 printf("%d出现了%d次!\n", temp + 1, number[temp]); 69 sum += number[temp]; 70 } 71 printf("一共产生了%d个数!\n", sum); 72 }
7.编程程序,与程序清单12.13的输出之后所讨论的修改版程序具有相同的表现;
//这题空缺
8.给出函数make_array(),show_array().其中ma接受两个参数,第一个是int数组的元素个数,第二个是赋给每个元素的值。函数使用malloc()创建一个适当大小得数组,将每个元素设定为指定的值并且返回一个指针,函数sh以8个数一行的格式显示数组内容;
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 5 int * make_array(int elem, int val); 6 void show_array(const int ar[], int n); 7 8 int main(void){ 9 int *pa, 10 size, 11 value; 12 13 printf("输入数字:"); 14 scanf("%d", &size); 15 16 while(size > 0){ 17 printf("输入初始值:"); 18 scanf("%d", &value); 19 pa = make_array(size, value); 20 if(pa){ 21 show_array(pa, size); 22 free(pa); 23 } 24 printf("输入数字:"); 25 scanf("%d", &size); 26 } 27 28 puts("Done"); 29 return 0; 30 } 31 32 int * make_array(int elem, int val){ 33 int *ptr = (int *) malloc(elem * sizeof(int)), 34 temp; 35 for(temp = 0; temp < elem; temp++) 36 ptr[temp] = val; 37 38 return ptr; 39 } 40 41 void show_array(const int ar[], int n){ 42 int temp = 0; 43 for(; temp < n; temp++){ 44 printf("%5d", ar[temp]); 45 if((temp + 1) % 8 == 0) 46 putchar(‘\n‘); 47 } 48 if(n % 8 != 0) 49 putchar(‘\n‘); 50 }
标签:
原文地址:http://www.cnblogs.com/UncleXiang/p/5510596.html