《明解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函式執行之前的準備階段被創建出來,在程式結束的時候消失。