// 12.11-1.c -- 不使用全局变量,重写程序清单12.4中的程序 #include<stdio.h> void critic(void); int main(void) { int units; printf("How many pounds to a firkin of butter?/n"); while(scanf("%d",&units)==1 && units!=56) critic(); printf("You must have looked it up!/n"); return 0; } void critic(void) { printf("No luck, chummy. Try again!/n"); } // 12.11-2.c 在美国通常是以英里每加仑来计算油耗,在欧洲是以升每百公里来计算。 // 该程序让用户选择一个模式(公制的或美制的),然后收集数据来计算油耗。 // pe12-2a.h void set_mode(int mode); void get_info(void); void show_info(void); // pe12-2a.c #include <stdio.h> static int mode1 = 1; static int distance = 0; static double fuel = 0.0; void set_mode(int m) { mode1 = m; if(mode1!=1 && mode1!=0) { printf("Invalid mode specified. Mode 1 (US) used./n"); mode1 = 1; } } void get_info(void) { if(mode1==0) { printf("Enter distance traveled in miles:"); scanf("%d", &distance); getchar(); printf("Enter fuel consumed in liters:"); scanf("%lf", &fuel); } else if(mode1==1) { printf("Enter distance traveled in miles:"); scanf("%d", &distance); getchar(); printf("Enter fuel consumed in gallons:"); scanf("%lf", &fuel); } } void show_info(void) { if(mode1==0) { printf("Fuel consumption is %.2lf liters per 100km./n", fuel/distance * 100); } else if(mode1==1) { printf("Fuel consumption is %.2lf miles per gallon./n", fuel/distance); } } // pe12-2b.c #include <stdio.h> #include "pe12-2a.h" int main(void) { int mode; printf("Enter 0 for metric mode, 1 for US mode: "); scanf("%d", &mode); while(mode >= 0) { set_mode(mode); get_info(); show_info(); printf("Enter 0 for metric mode, 1 for US mode"); printf("(-1 to quit):"); scanf("%d", &mode); } printf("Done./n"); return 0; } // 12.11—3.c -- 重新设计上题,仅使用自动变量 // pe12-3a.h #define METRIC 0 #define US 1 #define USE_RECENT 2 void set_mode(int *pmode); void get_info(int mode, double *pdistance, double *pfuel); void show_info(int mode, double distance, double fuel); // pe12-3a.c #include <stdio.h> #include "pe12-3a.h" void set_mode(int *pmode) { if(*pmode!=METRIC && *pmode!=US) { printf("Invalid mode specified./nPrevious mode will be used./n"); *pmode = USE_RECENT; } } void get_info(int mode, double *pdistance, double *pfuel) { if(mode == METRIC) printf("Enter distance traveled in kilometers: "); else printf("Enter distance traveled in miles: "); scanf("%lf", pdistance); if(mode == METRIC) printf("Enter fuel consumed in liters: "); else printf("Enter fuel consumed in gallons: "); scanf("%lf", pfuel); } void show_info(int mode, double distance, double fuel) { if(mode == METRIC) printf("Fuel consumption is %.2lf liters per 100km./n", fuel/distance * 100); else printf("Fuel consumption is %.2lf miles per gallon./n", distance / fuel); } // pe12-3b.c #include <stdio.h> #include "pe12-3a.h" int main(void) { int mode; int prev_mode = METRIC; double distance, fuel; printf("Enter 0 for metric mode, 1 for US mode: "); scanf("%d", &mode); while(mode >= 0) { set_mode(&mode); if(mode == USE_RECENT) mode = prev_mode; prev_mode = mode; get_info(mode, &distance, &fuel); show_info(mode, distance, fuel); printf("Enter 0 for metric mode, 1 for US mode"); printf("(-1 to quit):"); scanf("%d", &mode); } printf("Done./n"); return 0; } // 12.11-4.c -- 编写一个函数,它返回函数自身被调用的次数 #include <stdio.h> static int loop = 0; int looptime(void) { loop++; return loop-1; } //12.11-4_driver.c #include <stdio.h> int main(void) { int i, loop_t; for(i=0; i<5; i++) looptime(); loop_t = looptime(); printf("函数调用次数:%d", loop_t); return 0; } // 12.11-5.c -- 编写产生100个1到10范围内的随机数的程序,并且以降序排序 #include <stdio.h> #include <stdlib.h> #define SIZE 100 void sort(int array[], int size); int main(void) { int array[SIZE]; int i; int line=1; for(i=0; i<SIZE; i++) array[i] = rand() % 10 + 1; printf("Initial Array: /n"); for(i=0; i<SIZE; i++) { printf("%2d ", array[i]); if(line % 10 == 0) printf("/n"); line++; } sort(array, SIZE); printf("/nSorted Array: /n"); for(i=0; i<SIZE; i++) { printf("%2d ", array[i]); if(line % 10 == 0) printf("/n"); line++; } return 0; } void sort(int array[], int size) { int i; int min; int search; int *temp; for(min=0; min<size; min++) for(search=min+1; search<size; search++) { if(array[min] > array[search]) { *temp = array[min]; array[min] = array[search]; array[search] = *temp; } } } // 12.11-6.c -- 编写一个产生1000个1到10范围内的随机数的程序 // 让程序对10个不同的种子值进行计算 #include <stdio.h> #include <stdlib.h> #define SIZE 1000 int main(void) { int array[11] = {0}; int i, seed, rand_num; for(seed=0; seed<10; seed++) { srand(seed); for(i=0; i<SIZE; i++) { rand_num = rand() % 10 + 1; array[rand_num]++; } for(i=0; i<10; i++) { printf("%d: %d/n", i+1, array[i+1]); } putchar('/n'); } return 0; } //12.11-7.c -- 编写一个程序,改程序与程序清单12.13的输出之后所讨论的修改版程序具有相同表现 //manydice.c -- main #include<stdio.h> #include<stdlib.h> #include<time.h> int rollem(int sides); int main(void) { int sides, dice, roll; int sets, i; int count; srand((unsigned int) time(0)); puts("Enter the number of sets: enter q to stop."); while(scanf("%d", &sets)==1 && sets>0) { puts("How many sides and how many dice?"); scanf("%d %d", &sides, &dice); puts("Here are 18 sets of 3 6-sided throws."); for(i=0; i<sets; i++) { for(roll=0, count=0; count<dice; count++) { roll += rollem(sides); } printf("%2d ", roll); if(i % 10 == 8) printf("/n"); } puts("/nEnter the number of sets: enter q to stop."); } return 0; } int rollem(int sides) { int roll; roll = rand()%sides+1; return roll; } //12.11-8.c -- 给出函数make_array()和show_array()的定义使程序完整 #include<stdio.h> #include<stdlib.h> int * make_array(int elem, int val); void show_array(const int ar[], int n); int main(void) { int * pa; int size; int value; printf("Enter the number of elements: "); scanf("%d", &size); while(size>0 && size!=1) { printf("Enter the initialization value: "); scanf("%d", &value); pa = make_array(size, value); if(pa) { show_array(pa, size); free(pa); } printf("Enter the number of elements(<1 to quit): "); scanf("%d", &size); } printf("Done./n"); return 0; } // make_array()接受两个参数 // 第一个是int数组的元素个数,第二个是要赋给每个元素的值 // 函数使用malloc()来创建一个适当大小的数组 // 把每个元素设为指定的值,并返回一个数组指针 int * make_array(int elem, int val) { int *pti; int i; pti = (int *)malloc(elem * sizeof(int)); for(i=0; i<elem; i++) pti[i] = val; return pti; } // show_array()以8个数一行的格式显示数组内容 void show_array(const int ar[], int n) { int i; for(i=0; i<n; i++) { printf("array[%d]: %d/n", i, ar[i]); if(i % 10 == 8) putchar('/n'); } putchar('/n'); }