第十二章 存储类、链接和内存管理

 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");
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值