2.在美国通常是以英里每加仑来计算油耗,在欧洲是以升每百公里来计算。下面是某程序的一部分该程序让用户选择一个模式(公制的或美制的),然后收集数据来计算油耗。
// 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;
}
下面是一些输出示例:
Enter 0 for metric mode, 1 for US mode: 0
Enter distance traveled in kilometers: 600
Enter fuel consumed in liters: 78.8
Fuel consumption is 13.13 liters per 100 km.
Enter 0 for metric mode, 1 for US mode (-1 to quit): 1
Enter distance traveled in miles: 434
Enter fuel consumed in gallons: 12.7
Fuel consumption is 34.2 miles per gallon.
Enter 0 for metric mode, 1 for US mode (-1 to quit): 3
Invalid mode specified. Mode 1(US) used.
Enter distance traveled in miles: 388
Enter fuel consumed in gallons: 15.3
Fuel consumption is 25.4 miles per gallon.
Enter 0 for metric mode, 1 for US mode (-1 to quit): -1
Done.
如果用户键入了不正确的模式,程序向用户给出提示信息并选取最接近的模式。请提供一个头文件pe12-2a.h和源代码文件pe12-2a.c,来使程序可以运行。源代码文件应定义3个具有文件作用域、内部链接的变量。一个代表模式,一个代表距离,还有一个代表消耗的燃料。函数get_info()根据模式设置提示输入相应的数据,并将用户的回答存入文件作用域变量。函数show_info()根据所选的模式计算并显示燃料消耗值。
程序如下:
//pe12-2a.h extern void set_mode(int mode); extern void get_info(void); extern void show_info();
//pe12-2a.c
#include<stdio.h> int mod = 0; double fuel_consumed; double distance; void set_mode(int mode) { if( mod == -1 ) mod = mode; else if( mode < 0 ) { printf("Ibvalid mode specified.mode 0(us) used"); mod = 0; } else if(mode > 1) { printf("Ibvalid mode specified.mode 1(uk) used"); mod = 1; } else mod = mode; } void get_info(void) { if(mod == 0) { printf("Enter distance traveled in kilometers:"); scanf("%lf",&distance); printf("Enter fuel consumed in liters:"); scanf("%lf",&fuel_consumed); } else { printf("Enter distance traveled in miles:"); scanf("%lf",&distance); printf("Enter fuel consumed in gallons:"); scanf("%lf",&fuel_consumed); } } void show_info() { if(mod == 0) { printf("Fuel consumption is %.2f liters per 100km\n",distance/fuel_consumed); } if(mod == 1) printf("Fuel consumption is %.2f miles per gallon \n",distance/fuel_consumed); }
//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; }
4.编写—个函数,它返回函数自身被调用的次数,并在一个循环中测试之。
#include<stdio.h> int count = 0; int re_count(void); int main(void) { int cou = 0; for(int i = 0; i < 5; i++) cou = re_count(); printf("the count is %d\n",cou); } int re_count(void) { return ++count; }
5.编写产生100个l到10范围内的随机数的程序,并且以降序排序(可以将11章中的排序算法稍加改动来对整数进行排序。这里,对数字本身进行排序即可)
#include<stdio.h> #include<stdlib.h> #include<time.h> #define COUNT 100 int rand_count[COUNT]; //save rand count void get_count(); //get rand count void sort(void); void display(void); int main(void) { get_count(); sort(); display(); return 0; } void get_count(void) { srand(time(NULL)); for(int i = 0; i < 100; i++) rand_count[i] = rand()%10 + 1; } //冒泡排序 void sort(void) { int temp; for(int i = 0; i < COUNT - 1; i++) for(int j = 0; j < COUNT -1; j++ ) { if(rand_count[j] < rand_count[j+1]) { temp = rand_count[j+1]; rand_count[j+1] = rand_count[j]; rand_count[j] = temp; } } } void display(void) { for(int i = 0; i < COUNT; i++) { printf("%d ",rand_count[i]); if((i+1) % 10 == 0) printf("\n"); } }
6.编写一个产生1000个l到10范围内的随机数的程序。不必保存或打印数字,仅打印每个数被产生了多少次。让程序对10个不同的种子值进行计算。数字出现的次数相同吗?可以使用本章中的函数或ANSIC中的函数rand()和srand(),它们与我们的函数具有相同的形式。这是一个测试特定随机数发生器的随机性的方法。
#include<stdio.h> #include<stdlib.h> #include<time.h> #define COUNT 1000 //1000个随机数 #define NUM 10 //1-10随机数 int rand_count[NUM]; //用于随机数计数 void get_count(); //get rand count void display(void); //显示每个随机数产生的个数 int main(void) { for(int i = 0; i < 10; i++) { get_count(); display(); } return 0; } void get_count(void) { for(int j = 0 ; j < NUM; j++) rand_count[j] = 0; srand(time(NULL)); int temp; for(int i = 0; i < 1000; i++) { temp = rand()%10 + 1; rand_count[temp-1]++; } } void display(void) { printf("1-10出现的次数分别是:\n"); for(int i = 0; i < NUM; i++) { printf("%d ",rand_count[i]); if((i+1) % 10 == 0) printf("\n"); } }
7.编写一个程序,该程序与我们在显示程序清单12.13的输出之后所讨论的修改版程序具有相同表现。也就是说,输出应像下面这样:
Enter the number of sets; enter q to stop.
18
How many sides and how many dice?
6 3
Here are 18 sets of 3 6-sided throws.
12 10 6 9 8 14 8 15 9 14 12 17 11 7 10
13 8 14
How many sets? Enter q to stop.
q
//pe12-7a.c #include<stdio.h> #include<time.h> #include<stdlib.h> int number_of_sets ;//掷筛子次数 int sides ;//每个筛子面数 int dices ; //共有几个筛子 //掷一个筛子得到的点数 int rollem(void) { return rand()% sides + 1; } //一次掷dices个筛子得到的点数和 int get_one_rolls(void) { int total = 0; for(int i = 0; i < dices; i++) total += rollem(); return total; } void display(int * ptr) { printf("here are %d sets of %d %d-sided dice.\n", number_of_sets, dices, sides); for(int i = 0; i < number_of_sets; i++) { printf("%d ",ptr[i]); if((i+1) %10 == 0) puts("\n"); } } // void get_all_rolls(void) { int *pointer; pointer = (int *)malloc(number_of_sets * sizeof(int)); for(int i = 0; i < number_of_sets; i++) pointer[i] = get_one_rolls(); display(pointer); free(pointer); } //pe12-7.h extern int number_of_sets; //掷筛子次数 extern int sides;//每个筛子面数 extern int dices; //共有几个筛子 extern int rollem(void); extern void display(int * ptr); extern void get_all_rolls(void); //pe12-7b.c #include<stdio.h> #include "pe12-7.h" #include<stdlib.h> #include <windows.h> //提供GetTickCount()函数 int main(void) { //srand((unsigned int)time(0));//随机化种子 srand((unsigned int)GetTickCount()); printf("Enter the number of sets, 0 to stop.\n"); while (scanf("%d", &number_of_sets) == 1 && number_of_sets > 0) { printf("How many sides and how many dices?\n"); scanf("%d", &sides); scanf("%d",&dices); get_all_rolls();// printf("\nEnter the number of sets, 0 to stop.\n"); } printf("GOOD FORTUNE TO YOU!\n"); return 0; }
8.下面是某程序的一部分:
// pe12-8.c
#include <stdio.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)
{
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()和show_array()的定义以使程序完整。函数make_array()接受两个参数。第一个是int数组的元素个数,第二个是要赋给每个元素的值。函数使用malloc()来创建一个适当大小的数组,把每个元素设定为指定的值,并返回一个数组指针。函数show_array()以8个数一行的格式显示数组内容。
#include<stdio.h> #include<stdlib.h> //为free()提供类库 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) { printf("Enter th initialization vlaue:"); scanf("%d",&value); pa = make_array(size,value); if(pa) { show_array(pa,size); free(pa); } printf("Enter the number of elemnts(<1 to quit):"); scanf("%d",&size); } printf("\n"); return 0; } int * make_array(int elem,int val) { int *ptr; ptr =(int *)malloc(elem * sizeof(int)); for(int i = 0; i < elem ; i++) ptr[i] = val; return ptr; } void show_array(const int ar[],int n) { for(int i = 0; i < n; i++) { printf("%d ",ar[i]); if((i + 1) % 8 == 0)puts("\n"); } puts("\n"); }