1 / 40

Arrays

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.

macon-park
Download Presentation

Arrays

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Arrays Chap 8

  2. 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!

  3. 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!

  4. 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]

  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

  6. 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]

  7. 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]

  8. 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]

  9. 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 */

  10. 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.

  11. Example • Define a 70-element integer array score. • Input the scores of 70 students. • Print out the scores of 70 students.

  12. 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 ] ]

  13. 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}

  14. 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.

  15. 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.

  16. 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; }

  17. 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; }

  18. 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 ??

  19. 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

  20. 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

  21. 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.

  22. Practice • Ask the user to input the scores (-1 for termination) and save them in an array. • Print out all the scores.

  23. 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]++;

  24. 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]++;

  25. 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 人數 • …

  26. Practice • Calculate the statistics of students' scores and graph it with histograms. 範圍 人數 圖表 90~99 5 ***** 80~89 12 ************ 70~79 18 ****************** 60~69 9 ********* …

  27. 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

  28. 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]); 代表學生座號 代表科目 {國文, 英文, 數學} 代表班級 ? ? ?

  29. 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分

  30. 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.

  31. 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;

  32. 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}};

  33. 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

  34. 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

  35. 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

  36. Example • Chinese numbers

  37. Array of Strings • char * subject[3]={ "國文", "英文", "數學"}; • printf("%s", subject[1]); • PS. More about strings will be introduced later in Chapter 8.

  38. 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) );

  39. 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.

  40. 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

More Related