1、不使用全局变量,重写程序清单12.4中的程序。
#include <stdio.h>
void critic(int *);
int main(void)
{
int units; /* units now local */
printf("How many pounds to a firkin of butter?\n");
scanf("%d",&units);
while(units!=56)
critic(&units);
printf("You must have looked it up!\n");
return 0;
}
void cretic(int * u)
{
printf("No luck,chummy.Try again.\n");
scanf("%d",u);
}
/*
下面是一些输出示例:
How many pounds to a firkin of butter?
14
No luck,chummy.Try again.
56
You must have looked it up!
*/
2、在美国通常以英里每加仑来计算油耗,在欧洲以升每百公里来计算。下面是某程序的一部分,该程序让用户选择一个模式(公制或美制),然后收集数据来计算油耗。
//pel2-2b.c
#include<stdio.h>
#include"pel2-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.
*/
如果用户键入了不正确的模式,程序向用户提示信息并选取最接近的模式。请提供一个头文件pel2-2a.h和源代码pel2-2a.c,来使程序可以运行。源代码文件应该定义3个具有文件作用域、内部链接的变量。一个代表模式,一个代表距离,还有一个代表油耗的燃料。函数ger_info()根据模式设置提示输入相应的数据,并将用户的回答存入文件作用域变量。函数show_info()根据所选的模式计算并显示燃料消耗值。
******pel2-2a.h
#define METRIC 0
#define US 1
void set_mode(int);
void get_info(void);
void show_info(void);
******pel2-2a.c
#include<stdio.h>
#include"pel2-2a.h"
static int present_mode = METRIC;
static double distance;
static double fuel;
void set_mode(int mode)
{
if(mode==METRIC || mode==US)
present_mode=mode;
else
printf("Invalid mode specified.Mode %s used.\n",present_mode == METRIC?"0(METRIC)":"1(US)");
}
void get_info(void)
{
if(present_mode==METRIC)
{
printf("Enter distance traveled in kilometers: ");
scanf("%lf",&distance);
printf("Enter fuel consumed in liter: ");
scanf("%lf",&fuel);
}
else
{
printf("Enter distance traveled in miles: ");
scanf("%lf",&distance);
printf("Enter fuel consumed in gallons: ");
scanf("%lf",&fuel);
}
}
void show_info(void)
{
if(present_mode == METRIC)
printf("Fuel consumption is %g liters per 100 km.\n",fuel / (distance/100));
else
printf("Fuel consumption is %g miles per gallon.\n",distance / fuel);
}
******pel2-2b.c
#include <stdio.h>
#include"pel2-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;
}
3、重新设计练习2中的程序,使它仅使用自动变量。程序提供相同的用户界面,出就是说要提示用户输入模式等等。然而,您还必须给出一组不同的函数调用。
//******pel2-3b.c
#include <stdio.h>
#include "pel2-3a.h"
int main(void)
{
int mode,present_mode = METRIC;
double distance,fuel;
printf ("Enter 0 for metric mode.1 for US mode: ");
scanf ("%d",&mode);
while (mode >= 0)
{
set_mode (mode,&present_mode);
get_info (present_mode, &distance, &fuel);
show_info (present_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;
}
//******pel2-3a.c
#include <stdio.h>
#include "pel2-3a.h"
void set_mode(int mode, int *p_present_mode)
{
if (mode==METRIC || mode==US)
*p_present_mode = mode;
else
printf("Invalid mode specified. Mode %s used.\n", *p_present_mode == METRIC? "0(METRIC)" : "1(US)");
}
void get_info(int present_mode, double *p_disance, double *p_fuel)
{
if (present_mode==METRIC)
{
printf ("Enter distance traveled in kilometers:");
scanf ("%lf",p_disance);
printf ("Enter fuel consumed in liters:");
scanf ("%lf",p_fuel);
}
else
{
printf ("Enter distance traveled in miles:");
scanf ("%lf",p_disance);
printf ("Enter fuel consumed in gallons:");
scanf ("%lf",p_fuel);
}
}
void show_info(int present_mode, double distance, double fuel)
{
if (present_mode==METRIC)
printf ("Fuel consumption is %g liters per 100 km.\n", fuel / (distance/100) );
else
printf ("Fuel consumption is %g miles per gallon.\n", distance / fuel );
}
//******pel2-3a.h
#define METRIC 0
#define US 1
void set_mode(int mode, int *present_mode);
void get_info(int present_mode, double *p_disance, double *p_fuel);
void show_info(int present_mode, double distance, double fuel);
4、编写一个函数,它返回自身被调用的次数,并在一个循环中测试之。
#include <stdio.h>
int Fibonacci(int n);
int count;
int main(void)
{
int n;
printf("Input the max term of Fibonacci: ");
while(scanf("%d",&n)==1)
{
count=0;
Fibonacci(n);
printf("The function of Fibonacci has called %d times.\n",count);
printf("Input the max term of Fibonacci: ");
}
puts("Quit");
return 0;
}
int Fibonacci(int n)
{
count++;
if(n>2)
return Fibonacci(n-1)+Fibonacci(n-2);
else
return 1;
}
5、编写产生100个1到10范围内随机数的程序,并且以降序排序(可以将11章中的排序算法稍加改动来对整数进行排序。这里对数字本身进行排序即可)。
#include <stdio.h>
#include <stdlib.h> //包含rand()函数
#define WIDTH 100 //定义数组大小
int main(void)
{
char num[WIDTH],i,j,temp;
/*产生随机数,赋给数组num[],并打印它们*/
for(i=0;i<WIDTH;i++)
num[i]=rand()%10+1;/*随机数个位上的数+1后赋给数组元素*/
printf("Original\n");
for(i=0;i<WIDTH;i++)
{
printf("%d\t",num[i]);
if(i%10==9) printf("\n");
}
printf("Sort:\n");
/*对数组进行降序排序,并打印它们*/
for(i=0;i<WIDTH-1;i++)
for(j=0;j<WIDTH-1-i;j++)
if(num[j]<num[j+1])
{
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
for(i=0;i<WIDTH;i++)
{
printf("%d\t",num[i]);
if(i%10 == 9) printf("\n");
}
return 0;
}
6、编写一个产生1000个1到10范围内的随机数的程序。不必保存或打印数字,仅打印每个数被产生了多少次。让程序对10个不同的种子值进行计算。数字出现的次数相同吗?可以使用本章中的函数或ANSI C中的函数rand()和srand(),它们与我们的函数具有相同的形式。这是一个测试特定随机数发生器的随机性的方法。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char i,seed[10]={0,1,2,3,4,5,6,7,8,9};
int j,count[10]; //存放1-10的10个统计量
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
count[j]=0;
srand(seed[i]); //初始化rand()函数的种子
for (j=0;j<1000;j++)
count[rand()%10]++;
printf("seed = %d:\n",seed[i]);
for(j=0;j<10;j++)
printf("%d: %d times:\t",j+1,count[j]);
printf("\n");
}
return 0;
}
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>>
int main()
{
char set,side,dice,i,sum;
puts("Enter the number of sets: Enter q to stop");
while(scanf("%d",&set) == 1)
{
srand(time(0));
puts("How many sides and how many dice?");
while(scanf("%d%d",&side,&dice) != 2)
{
scanf("%*s"); //滤除非法输入
printf("input error!input again:");
}
printf("Here are %d sets of %d %d-sides throws.\n",set,dice,side);
while(set--)
{
for(i=0,sum=0;i<dice;i++)
sum+=rand()%side + 1;
printf("\t%d",sum);
}
puts("\nHow many sets? enter q to stop");
}
return 0;
}
8、下面是某程序的一部分:
//pel2-8.c
#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)
{
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>
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("\nEnter the number of elements (<1 to quit):");
scanf("%d", &size);
}
printf("Done.\n");
return 0;
}
int * make_array (int elem, int val)
{
int *p;
p = (int *)malloc( elem * sizeof(int) );
while(elem--)
*(p + elem) = val;
return p;
}
void show_array (const int ar[], int n)
{
int i;
for (i=0;i<n;i++)
{
printf("%d\t",ar[i]);
if(i%8==7) printf("\n");
}
}