제12장 메모리 클래스, 링크와 메모리 관리

11301 단어 메모리 관리
미국에서는 보통 갤런당 1마일로 기름 소모량을 계산하고 유럽에서는 100킬로미터당 상승으로 계산한다.다음은 어떤 프로그램의 일부분입니다. 이 프로그램은 사용자가 하나의 패턴 (공제적 또는 미국적) 을 선택한 후에 데이터를 수집하여 기름 소모량을 계산하도록 합니다.
 
//pe12-2b.c#include #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.");
  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 100km.Enter 0 for metric mode, 1 for US mode (-1 to quit): 1Enter distance traveled in miles: 434Enter fuel consumed  in gallons: 12.7Fuel consumption is 34.2 miles per gallon.Enter 0 for metric mode, 1 for US mode (-1 to quit): 3Invalid mode specified. Mode 1(US) used.Enter distance traveled in miles: 388Enter fuel consumed  in gallons: 15.3Fuel consumption is 25.4 miles per gallon.Enter 0 for metric mode, 1 for US mode (-1 to quit): -1Done.
사용자가 잘못된 모드를 입력하면 프로그램은 사용자에게 알림 정보를 주고 가장 가까운 모드를 선택합니다.헤더 파일pe12-2a.h와 소스 코드 파일pe12-2a.c, 프로그램을 실행할 수 있도록 합니다.원본 코드 파일은 파일 역할 영역, 내부 링크를 가진 3개의 변수를 정의해야 한다.하나의 대표 모델, 하나의 대표 거리, 그리고 소모를 대표하는 연료.함수 getinfo () 모드 설정에 따라 해당하는 데이터를 입력하고 사용자의 대답을 파일 역할 영역 변수에 저장합니다.함수 showinfo () 선택한 패턴에 따라 연료 소모치를 계산하고 표시합니다.
 
 
절차는 다음과 같습니다.
 
//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
",distance/fuel_consumed); } if(mod == 1) printf("Fuel consumption is %.2f miles per gallon
",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
"); 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
",cou); } int re_count(void) { return ++count; }

 
5. l에서 10 범위 내의 무작위 수를 100개 생성하는 프로그램을 작성하고 내림차순으로 정렬한다(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("
"); } }

  
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        :
"); for(int i = 0; i < NUM; i++) { printf("%d ",rand_count[i]); if((i+1) % 10 == 0) printf("
"); } }

 
7. 프로그램을 작성한다. 이 프로그램은 우리가 프로그램 목록 12.13의 출력을 표시한 후에 논의한 수정판 프로그램과 같은 표현을 가진다.즉, 출력은 다음과 같이 해야 합니다. Enter the number of sets;enter q to stop.18How many sides and how many dice?6 3Here 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  14How 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.
", number_of_sets, dices, sides); for(int i = 0; i < number_of_sets; i++) { printf("%d ",ptr[i]); if((i+1) %10 == 0) puts("
"); } } // 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.
"); while (scanf("%d", &number_of_sets) == 1 && number_of_sets > 0) { printf("How many sides and how many dices?
"); scanf("%d", &sides); scanf("%d",&dices); get_all_rolls();// printf("
Enter the number of sets, 0 to stop.
"); } printf("GOOD FORTUNE TO YOU!
"); return 0; }
 
 
8. 다음은 프로그램의 일부입니다.//pe12-8.c#include 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.");
  return 0;}
함수 제시makearray () 및 showarray () 의 정의는 프로그램을 완전하게 합니다.함수makearray ()는 두 개의 매개 변수를 받아들인다.첫 번째는 int수 그룹의 원소 개수이고, 두 번째는 모든 원소에 부여할 값입니다.함수는malloc()를 사용하여 적당한 크기의 그룹을 만들고 모든 요소를 지정한 값으로 설정하고 그룹 포인터를 되돌려줍니다.함수 showarray () 는 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("
"); 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("
"); } puts("
"); }

좋은 웹페이지 즐겨찾기