1. 程式人生 > >《明解C語言》筆記及課後習題答案 【第六章】

《明解C語言》筆記及課後習題答案 【第六章】

練習6-1

/*---返回兩個int型整數中較小一數的值---*/

#include <stdio.h>

int min2(int a, int b){
	if (a > b)
		return b;
	else
		return a;
}

int main(void)
{
	int a, b;
	
	scanf("%d %d",&a, &b);
	printf("最小值為:%d", min2(a, b));
	
	return 0;
}

練習6-2

/*---建立一個函式,返回三個int型整數中的最小值。---*/

#include <stdio.h>

int min3(int a, int b, int c){
	int min;
	
	min = a;
	
	if(b < min)
		min = b;
	if(c < min) 
		min = c;
		
	return min;
} 

int main (void)
{
	int a, b, c;
	
	scanf("%d%d%d",&a, &b, &c);
	printf("三個數中的最小值為:%d", min3(a, b, c));
	
	return 0;
}

練習6-3

/*---建立一個函式,返回int型整數的立方。---*/

#include <stdio.h>

int cube(int x){
	return x*x*x;
} 

int main(void)
{
	int a;
	
	scanf("%d",&a);
	printf("%d的立方為:%d",a,cube(a));
	
	return 0; 
}

練習6-4

/*---使用sqr函式建立另一個函式,返回Int型整數的四次冪。---*/

#include <stdio.h>

int sqr(int a){
    return a*a;
} 

int pow4(int x){
    return sqr(x)*sqr(x);
}

int main(void)
{
    int a;
    
    scanf("%d",&a);
    printf("%d的四次冪為:%d", a, pow4(a));
    
    return 0;
}

練習6-5

/*--建立一個函式,返回1到n之間所有整數的和。---*/

#include <stdio.h>

int sumup(int n){
	int sum=0;
	
	while (n > 0){
		sum+=n;
		n--;
	}
		
	return sum;
}

int main(void)
{
	int a;
	
	scanf("%d",&a);
	printf("1到%d之間所有整數的和:%d",a,sumup(a));
	
	return 0;
}

練習6-6

/*---建立一個函式,連續發出n次響鈴。---*/

#include <stdio.h>

void alert (int n){
	while (n-- > 0){
		puts("\a");
	}
}

int main(void)
{
	int n;
	
	scanf("%d",&n);
	alert(n);
	
	return 0;
}

練習6-7

/*---建立一個函式,在螢幕上顯示出“你好。”並換行。---*/

#include <stdio.h>

void hello(void){
	printf("你好。\n");
}

int main(void)
{
	hello();
	
	return 0;
}

練習6-8

/*---建立一個函式,返回元素個數為n的int型陣列v中的最小值。---*/

#include <stdio.h>

int min_of(const int v[], int n){
	int min = v[0];
	
	while(n-- > 0){
		if(v[n] < min)
			min = v[n];
	}
	return min;
}

int main(void)
{
	int n, v[n], i;
	
	printf("請輸入陣列的元素個數:");
	scanf("%d",&n);
	
	printf("請輸入陣列各元素的值。");
	for(i = 0; i < n; i++){
		scanf("%d",&v[i]);
	}
	
	printf("陣列中最小元素的值為%d",min_of(v,n));
	
	return 0;
	
 } 

練習6-9

/*---建立一個函式,對元素個數為n的int型陣列v進行倒序排列。---*/

#include <stdio.h>

void rev_intary(int v[], int n){
	int temp, i;
	
	for(i = 0;i < n/2; i++){
		temp = v[i];
		v[i] = v[n-i-1];
		v[n-i-1] = temp;
	}
} 

int main(void)
{
	int n, v[n], i;
	
	printf("請輸入陣列的元素個數:");
	scanf("%d",&n);
	
	printf("請輸入陣列各元素的值。");
	for(i = 0; i < n; i++){
		scanf("%d",&v[i]);
	}
	
	rev_intary(v, n);
	
	puts("輸入陣列各元素的值。");
	for(i = 0; i < n; i++){
		printf("%d ",v[i]);
	} 
	
	return 0;
}

練習6-10

/*---建立一個函式,對元素個數為n的int型陣列v2進行倒序排列,並將其結果儲存在
陣列v1中。---*/

#include <stdio.h>

void intary_rcpy (int v1[], const int v2[], int n){
	int temp, i;
	temp = n - 1;
	
	for(i = 0; i < n; i++){
		v1[temp--] = v2[i];
	}
}

int main(void) 
{
	int n, v1[n], v2[n], i;
	
	printf("請輸入陣列的元素個數:");
	scanf("%d",&n);
	
	printf("請輸入陣列各元素的值。");
	for(i = 0; i < n; i++){
		scanf("%d",&v2[i]);
	}
	
	intary_rcpy(v1,v2,n);
	
	for(i = 0; i < n; i++){
		printf("%d ",v1[i]);
	}
	
	return 0; 
}

練習6-11

/*---建立一個函式search_idx,將和有n個元素的陣列v中的key相等的所有
元素的下標儲存在陣列idx中,返回和key相等的元素的個數。---*/

#include <stdio.h>
 
#define MAX_SIZE    10

int search_idx(const int v[], int idx[], int key, int n){
    int i, num = 0;
 
    //key = v[n];
    for (i = 0; i < n; i++){
        if (v[i] == key)
            idx[num++] = i;
    }
 
    return num;
}
 
int main(void)
{
    int n, v[MAX_SIZE], idx[MAX_SIZE], key, i, num;
 
    printf("請輸入v陣列的元素個數(< %d):", MAX_SIZE);
    scanf("%d", &n);
 
    printf("請輸入v陣列的元素:");
    for(i = 0; i < n; i++){
        //printf("請輸入v陣列的元素:");
        scanf("%d",&v[i]);
    }
 
    printf("請輸入要查詢的key值: ");
    scanf("%d", &key);
 
    num = search_idx(v, idx, key, n);
 
    printf("key為%d,它在v陣列中的個數和下標為:%d\n", key, num);
    for(i = 0; i < num; i++){
        printf("%d ",idx[i]);
    }
    putchar(10);
 
    return 0;
}

練習6-14

/*為double型陣列的所有元素分配靜態儲存期,並確認它們都被初始化為0.0。*/

#include <stdio.h>

int main(void)
{
	int a;
	static double i[5];
	
	for (a = 0; a < 5; a++)
		printf("i[%d] = %d\n", a, i[a]);
	
	return 0;
 } 

練習6-15

/*---顯示被呼叫的次數,顯示的是呼叫3次函式put_count的執行結果。---*/

#include <stdio.h> 

void put_count(){
	static int a;
	
	a++;
	
	printf("put_coubt:第%d次\n",a);
}

int main(void)
{
	int a;
	
	for(a = 0; a < 3; a++)
		put_count();
	
	return 0;
}

作用域:

賦給變數的識別符號,它的名稱都有一個通用的範圍,稱為作用域

            在程式塊(複合語句)中宣告的變數的名稱,只在該程式塊中通用,在其他區域都無效。

檔案作用域:

在函式外宣告的變數識別符號,其名稱從宣告的位置開始,到該程式的結尾都是通用的。

函式原型宣告:

明確記述了函式的返回型別,以及形參的型別和個數等的宣告稱為函式原型宣告。

函式原型宣告只聲明瞭函式的返回值和形參等相關資訊並沒有定義函式的實體。

標頭檔案和檔案包含指令:

包含庫函式的函式原型宣告的<stdio.h>稱為標頭檔案,而取得標頭檔案內容的#include指令

       稱為檔案包含指令

函式的傳遞和const型別的修飾符:

在宣告形參時加上被稱為const 的型別修飾符就可以禁止在函式內修改接收到的陣列內容。

線性查詢:

從陣列的開頭出發順次搜尋,找出與目標相同的元素的一系列操作,稱為線性查詢或順序查詢。

哨兵查詢法:

在陣列末尾追加的資料稱為哨兵,使用哨兵進行查詢的方法稱為哨兵查詢法

儲存期:

                  自動儲存期:在函式中不使用儲存類說明符static而定義出的物件(變數),被賦予了自動儲存期

           程式執行到物件宣告的時候就建立除了相應的物件,而執行到包含該宣告的程式塊的結尾的時候,該物件就會消失。

                  靜態儲存期:在函式中使用static定義出來的物件,或者在函式外宣告定義出來的物件都被賦予了靜態儲存期。

           在程式開始執行的時候,具體地說是在main函式執行之前的準備階段被創建出來,在程式結束的時候消失。