while迴圈和do迴圈、緩衝區、一維陣列

GQH1000發表於2024-10-18

緩衝區

輸入緩衝區

從鍵盤得到資料的時候使用者輸入的資料首先進入輸入緩衝區,然後程式從輸入緩衝區裡獲得數字,先進入輸入緩衝區的資料必須先處理(類似排隊),如果先進入輸入緩衝區的資料無法處理,程式就得不到後進入輸入緩衝區的資料。使用以下兩條固定語句可以刪除輸入緩衝區裡的無效資料:

scanf("%*[^\n]");	//刪除輸入緩衝區裡第一個'\n'符前面的所有內容
scanf("%*c");		//刪除輸入緩衝區裡第一個字元

輸出緩衝區

printf標準函式把要顯示的內容放在輸出緩衝區裡,計算機在合適的時候把輸出緩衝區裡的內容顯示在螢幕上,以下四種情況下輸出緩衝區裡的內容會顯示在螢幕上:

1.如果輸出緩衝區裡包含換行字元則換行字元前面的部分會顯示在螢幕上

2.如果程式結束了則它放在輸出緩衝區裡的內容會顯示在螢幕上

3.如果輸出緩衝區被充滿了則它裡面的內容會顯示在螢幕上

4.在程式裡使用一條固定語句 fflush(stdout);可以強制把輸出緩衝區裡的內容顯示在螢幕上(scanf函式也有這樣的作用)

陣列

陣列可以用來代表記憶體裡一組連續的同型別的儲存區,這些儲存區叫做陣列的元素,陣列也需要先宣告然後才能使用,宣告陣列的時候除了需要提供型別名稱和陣列名稱以外還需要提供一個整數表示陣列裡的儲存區個數。

陣列一旦存在它裡面包含的儲存區個數就不可以改變了,陣列通常不可以作為整體使用,一般一次只使用其中的某個儲存區,陣列裡每個儲存區的編號不同,這個編號叫做陣列的下標,陣列裡第一個儲存區的下標是0,向後依次遞增,最大下標是儲存區個數減一,超過範圍的下標不可以使用(類似闖紅燈)

陣列名稱和下標一起可以用來表示陣列裡的儲存區,可以在for迴圈裡依次處理陣列裡的所有儲存區 ,這個迴圈的迴圈變數應該依次代表陣列裡的所有有效下標,初始化陣列的時候可以提供多個資料,他們應該寫在一對大括號中間,相鄰初始化資料之間用括號分開,初始化陣列的時候如果初始化資料的個數比儲存區的個數多就把多餘的初始化資料忽略。

初始化陣列的時候如果初始化資料的個數比儲存區的個數少就把後面的儲存區初始化成0,初始化陣列的時候如果初始化資料的個數和陣列裡儲存區的個數一樣多就可以省略陣列宣告裡的儲存區個數。

練習:編寫程式從鍵盤得到多個數字(數字個數不超過5個,由使用者實現給定),把這些數字按照倒序顯示在螢幕上,然後計算這些數字的和並把結果顯示在螢幕上。

練習:編寫程式得到一張彩票(彩票由7個1到36之間的整數構成),然後把彩票裡的所有數字顯示在螢幕上。

陣列名稱不可以代表儲存區,陣列名稱可以用來代表第一個儲存區的地址,陣列名稱不可以被賦值,可以對陣列名稱進行sizeof計算,結果是陣列裡所有儲存區的總大小。C99規範裡允許使用變長陣列,宣告變長陣列的時候使用變數表示陣列裡的儲存區個數。

變長陣列

如果多次執行這個程式則每次變長陣列裡包含的儲存區個數都可能不同。在某一次執行程式的過程中變長陣列裡包含的儲存區個數不會改變,變長陣列不可以初始化

一維陣列

宣告一維陣列時只需要用一個整數表示陣列裡的儲存區個數

多維陣列

多維陣列不僅可以表示多個儲存區,還可以對他們進行分組(分組可以多次進行)。

二維陣列

二維陣列是最常見的多維陣列,他只能表示儲存區的一次分組情況,宣告二維陣列的時候需要提供兩個整數,第一個整數表示分組個數,第二個整數表示分組裡的儲存區個數。二維陣列通常也不能作為整體 使用,一般一次只使用其中某個儲存區,表示二維陣列裡儲存區的時候需要提供兩個下標,前一個下標表示分組編號(組下標),後一個下標表示分組裡的儲存區編號(組內下標),組下標的有效範圍從0開始到分組個數減一為止;組內下標的有效範圍從0開始到分組裡儲存區個數減一為止。

可以把二維陣列當作一維陣列進行初始化,也可以在初始化二維陣列的時候對初始化資料進行分組,每組初始化資料用來初始化一組儲存區。如果可以根據初始化資料個數計算出分組個數就可以省略二維陣列宣告裡的分組個數。

點選檢視程式碼
/*
 *
 *
 *輸入緩衝區管理
 *
 *
 * */
#if 0
#include<stdio.h>
int main (){
	int num = 0;
	printf("請輸入一個數字:\n");
	scanf("%d",&num);
	scanf("%*[^\n]");
	scanf("%*c");
	printf("num=%d\n",num);
	printf("請輸入一個數字:\n");
	scanf("%d",&num);
	printf("num=%d\n",num);
	return 0;	
}

#elif 0
/*
 *
 *輸出緩衝區
 *
 *
 * */
#include<stdio.h>
int main (){
	printf("1");
	fflush(stdout);
	while (1){
	}
	return 0;
}


#elif 0

/*
 *
 *陣列演示
 *
 * */
#include<stdio.h>
int main (){
	int arr[5]; 	//陣列宣告語句
	int num = 0;
	arr[2] = 10;
	for (num = 0;num <= 4;num ++){
		arr[num] = num;
	}
	for (num = 4;num >= 0;num --){
		printf(" %d ",arr[num]);
		}
	     printf("\n");
	return 0;
}

#elif 0
/*
 *
 *陣列練習
 *
 *
 * */
#include<stdio.h>
int main (){
	int arr[5] = {0};
	int qty = 0,num = 0,sum = 0; 			//使用者輸入的數字個數qty <5
	printf("請輸入數字個數:\n");
	scanf("%d",&qty);
	for (num = 4;num >= 0;num--){
		printf("請輸入一個數字:\n");
		scanf("%d",&arr[num]);
		if (num == 5 - qty){
			//檢查陣列是否被填滿
			break;
		}
	}
	for (num = 5 - qty;num <= 4;num++){
		printf("%d",arr[num]); 		//倒序顯示使用者輸入的數字
	}
	printf("\n");
	for (num = 5 - qty;num <= 4;num++){
		sum += arr[num];
	}
	printf("求和結果是: %d  \n",sum);
	return 0;
}

#elif 0
/*
 *
 *得到7個1到36之間的隨機數
 *將數字顯示出來
 *
 * */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main (){
	int num = 0,tmp = 0,cnt = 0,num1 = 0; 			//cnt 用於記錄已經得到有效數字
	int arr[7] = {0},arr1[7] = {0};
	srand(time(0));
	/*for (num = 0;num <= 6;num++){
		arr[num] = rand() % 36 + 1;
		}//含有重複的數字
		*/
	do {
			tmp = rand() % 36 + 1;
			for (num = 0;num <= cnt - 1;num++){ 		//把新數字和以前得到的所有數字依次作對比
				if (tmp == arr[num]){
					break;
				}
			}
			if (num == cnt){
				arr[cnt] = tmp;
				cnt++;
			}
	}while(cnt < 7);
	for (num = 0;num <= 6;num++){
		printf(" %d",arr[num]);
	}
	printf("\n");
	for (num = 0;num <= 6;num++){
		printf("請輸入一個數字:\n");
		scanf("%d",&arr1[num]);
	}
	cnt = 0;
	for (num = 0;num <= 6;num++){
		for (num1 = 0;num1 <= 6;num1++){
			if (arr[num] == arr1[num1]){
				cnt++;
				break;
			}
		}
	}
	printf("買對的數字個數%d\n",cnt);
	return 0;
}


#elif 0

#include<stdio.h>
int main (){
	int arr[5] = {0};
	printf("arr是%p\n",arr);
	printf("arr[0]是%p\n",&arr[0]);
	printf("sizeof(arr)=%ld\n",sizeof(arr));
	return 0;
}

#elif 0
#include<stdio.h>
int main (){
	int size = 0;
	printf("請輸入一個數字:");
	scanf("%d",&size);
	int arr[size]; 		//變長陣列
	printf("sizeof(arr)=%ld\n",sizeof(arr));
	return 0;
}


#elif 1
/*
 *
 *
 *二維陣列
 *
 * */
#include<stdio.h>
int main (){
	int arr[3][2],cnt = 0;
   //	arr[1][0] = 0;
	int row = 0, col = 0;
	for (row = 0;row <= 2;row++){
		for (col = 0;col <= 1;col++){
			arr[row][col] = cnt;
			cnt++;
		}
	}
	for (row = 0;row <= 2;row++){
		for (col = 0;col <= 1;col++){
			printf(" %d ",arr[row][col]);
		}
		printf("\n");
	}
	return 0;
}
#endif 

相關文章