400 likes | 572 Views
Arrays. Chap 8. Without Array. If you want to create Lottery winning numbers… You need 7 variables (6 for winning numbers and 1 for the special number) Every time you choose a winning number, you have to check if it has been chosen. Um… Program becomes ugly!. Without Array.
E N D
Arrays Chap 8
Without Array • If you want to create Lottery winning numbers… • You need 7 variables (6 for winning numbers and 1 for the special number) • Every time you choose a winning number, you have to check if it has been chosen. • Um… Program becomes ugly!
Without Array • Same things happen when you want to… • Store grades of the whole class • Store data of members • … • We need to define a group of variables with the same meaning ALL AT ONCE!
The Idea of Using an Array a[ ] a1 a2 a3 a4 a5 a6 a[0] a[1] a[2] a[3] a[4] a[5]
Array (陣列) • To define a group of variables with the same meaning at once • Syntax to define an array: dataType arrayName[arraySize]; Ex: int students[6]; //班級學生人數 students 6 classes 32 35 31 34 32 33 6 rooms for this array Each element in this array is of type int
Accessing Array (存取陣列資料) students • Its subscript starts from 0. • Referring to an element Ex: students[4] • The element 4 of the array students • The 5th element of the array students students[0] students[2] students[4] students[1] students[3] students[5]
Accessing Array (存取陣列資料) students • Every students[i] is of type int • students[0]=32; // assign value • students[2]=students[0]-1;// read value 怪 32 怪 怪 31 怪 怪 怪 students[0] students[2] students[4] students[1] students[3] students[5]
Accessing Array (存取陣列資料) students • printf("%d", students[2]);// It prints out 31 • scanf("%d", &(students[5]));// If 33 is given • students[5]++; 怪 32 怪 怪 31 怪 怪 34 33 怪 students[0] students[2] students[4] students[1] students[3] students[5]
Typical Array Operations • Idioms of typical operations on an array a of length N: for (i = 0; i < N; i++) a[i] = 0; /* clears a */ for (i = 0; i < N; i++) /* reads data */ scanf("%d", &a[i]); /* into a */ for (i = 0; i < N; i++) sum += a[i]; /* sums the elements of a */
Example • Define an integer array of size 100 andset every element as 0. • Set the value of each element as its subscript. • Set the value of each element as the square of its subscript.
Example • Define a 70-element integer array score. • Input the scores of 70 students. • Print out the scores of 70 students.
Subscripts • A subscript can be an integer,or an integer expression. • students[ 3 ] • students[ i ] • students[ i+1 ] • students[ i+j ] • students[ myFunc( ) ] • students[ sorted[ i ] ]
Array Initialization • You can give initial values when defining. int days[6]={31,28,31,30,31,30}; • If no sufficient values are given, the values of rest elements will be set to be 0. int days[6]={31,28}; // initial value of days is {31,28,0,0,0,0} • So, if you want an all-0 array: int days[6]={0}; // initial value of days is {0,0,0,0,0,0}
Array Initialization • If the array size is not given, its size will be the number of elements in the initializer list. int days[]={31,28,31,30,31,30}; will create a 6-element array.
Program: Checking a Number for Repeated Digits • After the user enters a number, the program prints either "Repeated digit" or "No repeated digit": Enter a number: 28212 Repeated digit • The number 28212 has a repeated digit (2); a number like 9357 doesn’t.
repdigit.c int main() { int digit_seen[10] = {0}; int n; int digit; printf("Enter a number: "); scanf("%d", &n); while (n > 0) { digit = n % 10; if (digit_seen[digit]) break; digit_seen[digit] = 1; n /= 10; } if (n > 0) printf("Repeated digit\n"); else printf("No repeated digit\n"); return 0; }
repdigit.c int main(void) { bool digit_seen[10] = {false}; long n; int digit; printf("Enter a number: "); scanf("%ld", &n); while (n > 0) { digit = n % 10; if (digit_seen[digit]) break; digit_seen[digit] = true; n /= 10; } if (n > 0) printf("Repeated digit\n"); else printf("No repeated digit\n"); return 0; }
Example • Check if a date month月day日is valid. int month; int days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; printf("請以 月/日的格式輸入日期:"); scanf("%d/%d", &month, &day); if ( month < 1 || month > 12 ) printf("不合法的日期。\n"); else if ( day < 1 || day > days[month-1] ) printf("不合法的日期。\n"); month ?? day ??
Operator sizeof() • sizeof(z) returns the memory size (in bytes) required for this variable z. • int a;char b; • sizeof(a) → 4 • sizeof(b) → 1 • Or, of data types • sizeof(unsigned short int) → 2 • sizeof(bool) → 1
Operator sizeof() • So, for an array a, sizeof(a) returns the memory size (in bytes) required for this array a. • int a[10]; sizeof(a) → 40 • char b[10]; sizeof(b) → 10 • sizeof(arrayName)/sizeof(array_element0):gives the number of elements in an array • int a[10]; • sizeof(a)/sizeof(a[0]) → 10
Array Size vs. Number of Data Ex: int scores[100]; // 學生成績 • It defines a 100-element array in advance to store scores of students. • But in fact, the actual number of students is still unknown. • You need to define an integer variable to store the number of students.
Practice • Ask the user to input the scores (-1 for termination) and save them in an array. • Print out all the scores.
More about Array Index • Example: to calculate the statistics of students' scores • 90~99 ###人 • 80~89 ###人 • 70~79 ###人 • 60~69 ###人 • … • Given score[i] → number[??]++; • int score[100]; • int number[10]; • number[0]: 0~9 人數 • number[1]: 10~19 人數 • number[2]: 20~29 人數… number[score[i]/10]++;
More about Array Index • Example: to calculate the statistics of students' scores • 91~100 ###人 • 81~90 ###人 • 71~80 ###人 • 61~70 ###人 • … • Given score[i] → number[??]++; • int score[100]; • int number[10]; • number[0]: 1~10 人數 • number[1]: 11~20 人數 • number[2]: 21~30 人數… number[(score[i]-1)/10]++;
Practice in Array Index • 計算成績分布 • 0~14 ###人 • 15~29 ###人 • 30~44 ###人 • 45~59 ###人 • … • score[i]: ?? → number[??]++; • int score[100]; • int number[10]; • number[0]: 0~14 人數 • number[1]: 15~29 人數 • …
Practice • Calculate the statistics of students' scores and graph it with histograms. 範圍 人數 圖表 90~99 5 ***** 80~89 12 ************ 70~79 18 ****************** 60~69 9 ********* …
2-Dimensional Array dataType arrayName[size1][size2]; Ex. int grade[6][40]; // 各班級所有學生的成績 grade grade[3][1]=73; grade[0][38]=98; 代表學生座號 代表班級 → → → → row 98 73 ↓ ↓ ↓ ↓ ↓ column
N-Dimensional Array dataType arrayName[size1][size2]…[sizeN]; Ex. int grade[6][3][40];// 成績[班級][科目][座號] • To save the English score of the 23th student in the 1st class, you should do scanf("%d",&score[0][1][22]); 代表學生座號 代表科目 {國文, 英文, 數學} 代表班級 ? ? ?
Practice • 印出所有學生各科成績: 1年1班1號同學國文98分 1年1班1號同學英文95分 1年1班1號同學數學92分 1年1班2號同學國文89分 1年1班2號同學英文78分 … 2年3班5號同學數學97分
Practice • Calculate the average Math scores among the 1st year students. • Calculate the mean of total scores in 二年一班. • Calculate the average English scores of each 3rd-year class.
Ex: Prepare an Identity Matrix • A pair of nested for loops is perfect: #define N 10 double ident[N][N]; int row, col; for (row = 0; row < N; row++) for (col = 0; col < N; col++) if (row == col) ident[row][col] = 1.0; else ident[row][col] = 0.0;
Array Initialization • Example: int m[5][9] = {{1, 1, 1, 1, 1, 0, 1, 1, 1}, {0, 1, 0, 1, 0, 1, 0, 1, 0}, {0, 1, 0, 1, 1, 0, 0, 1, 0}, {1, 1, 0, 1, 0, 0, 0, 1, 0}, {1, 1, 0, 1, 0, 0, 1, 1, 1}};
Array Initialization • If an initializer isn’t large enough to fill a multidimensional array, the remaining elements are given the value 0. int m[5][9] = {{1, 1, 1, 1, 1, 0, 1, 1, 1}, {0, 1, 0, 1, 0, 1, 0, 1, 0}, {0, 1, 0, 1, 1, 0, 0, 1, 0}}; // the last two rows will contain zeros
Array Initialization • If an initializer isn’t large enough to fill a multidimensional array, the remaining elements are given the value 0. int m[5][9] = {{1, 1, 1, 1, 1, 0, 1, 1, 1}, {0, 1, 0, 1, 0, 1, 0, 1}, {0, 1, 0, 1, 1, 0, 0, 1}, {1, 1, 0, 1, 0, 0, 0, 1}, {1, 1, 0, 1, 0, 0, 1, 1, 1}}; // m[1][8], m[2][8], and m[3][8] will contain zeros
Array Initialization • We can even omit the inner braces : int m[5][9] = {1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1}; • It is risky, since an extra element (or even worse, a missing element) will affect the rest of the initializer
Example • Chinese numbers
Array of Strings • char * subject[3]={ "國文", "英文", "數學"}; • printf("%s", subject[1]); • PS. More about strings will be introduced later in Chapter 8.
Random Number Generator To get a random number (亂數): • Add#include<stdlib.h> • Add #include<time.h> • Add a line in the beginning of main(): srand( (unsigned)time(NULL) );
Random Number Generator To get a random number (亂數): • Use rand() to get a random number. • The value is between 0 and RAND_MAX. • For a random number between 0~7, use rand()%8 • For a random number between 1~8, use rand()%8+1, and so on.
Practice • Write a program to simulate rolling a dice for 1000 times. Print out how many times each value has occurred. 1 occurs 169 times2 occurs 143 times3 occurs 179 times4 occurs 167 times5 occurs 180 times6 occurs 162 times