目錄
?數組的復制
輸入數組元素的值
對數組的元素進行倒序排列
?使用數組進行成績處理
對象式宏
數組元素的最大值和最小值
賦值表達式的判斷
數組的元素個數
?結語
?數組的復制
我們把數組中的元素全部復制到另一個數組中。
#include<stdio.h>int main()
{int i;int a[5] = {1, 2, 3};int b[5];for(i = 0; i < 5; i++){b[i] = a[i] ;}puts(" a b");puts(" -------");for(i = 0; i < 5; i++){printf("%4d%4d\n", a[i], b[i]);}return 0;
}
程序中的第一個for語句,作用是把a中的全部元素一次賦值給b中的元素
同時遍歷兩個數組,從b[0] = a[0]到b[4] = a[4]
C語言不支持基本賦值運算符,下面語句是錯誤的?
b = a;//不能為數組賦值
?注意
不能使用基本賦值運算符對數組進行賦值。數組的賦值必須通過使用循環語句對所有元素進行一一賦值。
第二個for語句時同時遍歷兩個數組,并且顯示它們的值。
輸入數組元素的值
從鍵盤中輸入數組元素的值,并且一一顯示它們。
#include<stdio.h>int main()
{int i;int x[5];for(i = 0; i < 5; i++){printf("x[%d]:", i);//輸入元素的值scanf("%d", &x[i]);}puts("……………………");for(i = 0; i < 5; i++){printf("x[%d]=%d \n", i, x[i]);//顯示元素的值}return 0;
}
對數組的元素進行倒序排列
如果僅僅是按照順序對數組內的元素賦值沒有什么難度,接下來我們對數組的元素進行倒序排列。
我們創建5個元素的int類型的數組進行下列倒序排列
a[0]和a[4]交換;a[1]和a[3]交換;a[3]處在中間位置,順序不發生改變
#include<stdio.h>int main()
{int i;int a[5];for(i = 0; i < 5; i++)//為數組元素賦值{printf("a[%d]:", i);scanf("%d", &a[i]);}for(i = 0; i < 2; i++)//進行倒序排列{int temp = a[i];a[i] = a[4 - i];//交換a[i] 和a[4 - i]的數值a[4 - i] = temp;}puts("進行倒序排列");for(i = 0; i < 5; i++){printf("[%d]=%d\n", i, a[i]);}return 0;
}
想要交換兩個變量的值就必須引入一個中間變量來進行交換。
1.把a的值保存在temp中。
2.把b的值賦值給a。
3.把temp保存的值賦值給b。
不可以像下面一樣進行賦值:
?a = b; b = a;這樣a和b的值都會變為b的初始值。
?使用數組進行成績處理
#include<stdio.h>int main()
{int i;int sum;//5名學生分數的總和int tensu[5];//5名學生的分數for(i = 0; i < 5; i++){printf("%2d號:", i + 1);scanf("%d", &tensu[i]);sum += tensu[i];}printf("總分:%5d\n", sum);printf("平均分:%5.1f\n", double(sum) / 5);return 0;
}
在這里我們僅僅是對5人的成績進行運算,但是編寫完程序后人數增加到8人呢?80人呢?800人呢?
在這里我們需要進行選擇性替換(只替換需要替換的部分)
對象式宏
我們可以用對象式宏來解決上述問題
#include<stdio.h>#define NUMBER 10//學生人數int main()
{int i;int sum;//10名學生分數的總和int tensu[NUMBER];//10名學生的分數printf("請輸入%d個學生的分數\n", NUMBER);for(i = 0; i < NUMBER; i++){printf("%2d號:", i + 1);scanf("%d", &tensu[i]);sum += tensu[i];}printf("總分:%5d\n", sum);printf("平均分:%5.1f\n", double(sum) / NUMBER);return 0;
}
該程序的關鍵部分是#define指令
#define a b? ?將該指令的a替換為b
在這里,a稱為宏名。為了易于與變量名區分我們通常用大寫字母來表示。
在本程序中,宏名為NUMBER,被替換為10.?
在程序中使用宏,不僅能在一個地方進行統一管理,而且通過為常量定義名稱還可以使程序更加易讀,如果再加上注釋,效果更明顯。
程序中的10等常量被稱為幻數(不清楚具體表示什么值),引入對象式宏后就可以消除程序中的幻數了。另外使用宏可以提高程序的質量。
?注意
不要在程序中直接使用數值,最好通過宏的形式定義出它們的名稱。定義宏的時候不要忘記加上注釋!
數組元素的最大值和最小值
我們來求出分數大最大值和最小值,即數組元素的最大和最小值
#include<stdio.h>#define NUMBER 10//學生人數int main()
{int i;int tensu[NUMBER];//5名學生的分數int max, min;printf("請輸入%d個學生的分數\n", NUMBER);for(i = 0; i < NUMBER; i++){printf("%2d號:", i + 1);scanf("%d", &tensu[i]);}min = max = tensu[0];for(i = 0; i < NUMBER; i++){if(tensu[i] > max) max = tensu[i];if(tensu[i] < min) min = tensu[i];}printf("最高分:%d", max);printf("最低分:%d", min);return 0;
}
賦值表達式的判斷
對于數值類型的判斷我們在前面的數據類型講到過,現在我們來看看什么是賦值表達式的判斷?
在賦值時的判斷結果中,與賦值后做操作數的類型和值相同,例如int n=2.22判斷結果為n=2.
對于上面求最大值、最小值中由于賦值運算符=,具有結合性,所以可以看為
min = (max = tensu[0])
例如tensu[0]=20,那么min和max和值都為20.
C語言經常使用這樣的賦值方法,如a = b =0就可以把0同時賦值給a和b,但是對于初始值的聲明并不適用。
比如,int a = b = 0;不可這樣進行初始化
應該這樣,int a = 0, b = 0;當然也可以分開聲明。
?我們把上面求求最大值的流程來寫出來:
求tensu[0]—tensu[4]的最大值:
max = tensu[0];
if(tensu[1] > max) max = tensu[1];
if(tensu[2] > max) max = tensu[2];
if(tensu[3] > max) max = tensu[3];
if(tensu[4] > max) max = tensu[4];
?對與求最小值的流程也是一樣這里我們便不再贅述了。
數組的元素個數
雖然通過定義宏來變更數組元素個數十分簡單,但是每次都需要進行更改重新編譯后執行,因此我們可以定義出一個較大的數組,從開頭取出我們需要的部分。我們來對求學生分數進行下更改
#include<stdio.h>#define NUMBER 80//人數上限int mian()
{int i, j;int sum;//學生人數int tensu[NUMBER];//學生分數int bunpu[11] = {0};printf("請輸入學生人數");do{scanf("%d", &sum); //選擇學生的人數在復合的規定內if(sum < 1 || sum > NUMBER){printf("請輸入1—%d的數", NUMBER);}}while(sum < 1 || sum > NUMBER);printf("請輸入學生的人數:%d\n", sum);for(i = 0; i < sum; i++){printf("%2d號:", i + 1);do{scanf("%d", &tensu[sum]); //輸入學生成績在1—100內if(tensu[sum] < 0 || tensu[sum] > 100){printf("\a請輸入1—100內的數值:\n");}}while(tensu[sum] < 0 || tensu[sum] > 100);bunpu[tensu[i] / 10]++;}puts("-----分布圖-----");printf(" 100:");for(j = 0; j < bunpu[10]; j++)//100分的分布圖{putchar('*');putchar('\n');}for(i = 9; i >= 0; i--){printf("%3d - %3d:", i * 10, i * 10 + 9);for(j = 0; j < bunpu[i]; j++)//不到100分的分布圖{putchar('*');putchar('\n');}}return 0;
}
在本程序中,我們使用了int[11]數組bunpu來存放分數的分布。
求分布的表達式較為復雜,利用整數/整數舍去小數部分來進行遞增的,如下
tensu[i] 為0—9時,bunpu[0]遞增
tensu[i] 為10—19時,bunpu[1]遞增
……………………………………
tensu[i] 為80—89時,bunpu[8]遞增
tensu[i] 為90—99時,bunpu[9]遞增
tensu[i] 為100時,bunpu[10]遞增
通過上述循環,tensu[i]的分數就保存在數組bunpu中了。
?結語
數組就是我們向內存訪問請求存放數據內存的地方,然后我們通過數組的聲明為其確定類型、名稱,再通過初始化后,通過進行下表運算符就可以對數組進行訪問使用了,當然我們還可以不進行初始化,通過使用for循環對數組進行挨個賦值,再進行數組的遍歷就可以使用了。
創建好數組后一般不能更改數組元素的個數,但是我們可以通過對象式宏來進行任意的對數組元素進行更改。
最后,天氣漸冷,大家一定要做好保暖措施,鍛煉身體,預防流感!