C Program Design C Arrays 主講人:虞台文. Content Basics Defining Arrays Array Initialization...
-
Upload
eugene-joseph -
Category
Documents
-
view
234 -
download
1
Transcript of C Program Design C Arrays 主講人:虞台文. Content Basics Defining Arrays Array Initialization...
C Program DesignC Arrays
主講人:虞台文
Content Basics Defining Arrays Array Initialization Static Arrays Passing Arrays to Functions Array Examples
– Find Minimum and Maximum– Bubble Sort– Binary Search
Strings and String Functions Multi-dimensional Arrays
C Program DesignC Arrays
Basics
陣列 (Arrays)
Array is a data structure that stores contiguous data elements of the same type.
Examples:int score[50];char address[50];double distance[50];
記
憶
體
score
address
distance
200
byte
s50
byte
s400
byte
s
陣列 (Arrays)Examples:int score[50];char address[50];double distance[50];
score
address
distance
...
score[0]
score[1]
score[49]
陣列 (Arrays)
score
address
distance
address[0]address[1]address[2]
address[49]
...
Examples:int score[50];char address[50];double distance[50];
陣列 (Arrays)
score
address
distance ...
distance[0]
distance[49]
Examples:int score[50];char address[50];double distance[50];
陣列之使用Examples:int score[50];char address[50];double distance[50];
Array elements are like normal variablesscore[ 0 ] = 90;
printf( "%d", score[ 0 ] );
Perform operations in subscript. – If x equals 3
c[ 5 - 2 ] c[ 3 ] c[ x ]
陣列使用注意事項 陣列之索引 (index) 由 0開始
– 一陣列若含 n元素,其索引由 0至 n-1
C Compiler 對陣列索引不做 out of range 檢查– 易產生程式錯誤,甚或系統失敗– 寫程式時程式設計師應保證陣列索引不超出範圍
C Program DesignC Arrays
Defining Arrays
Defining Arrays
arrayType arrayName[numberOfElements];
Examples:
int c[10];
float myArray[3284];
int c[10];
float myArray[3284];
Defining Multiple Arrays of Same Type
arrayType arrayName[numberOfElements];
Examples:
int age[10], score[50];
double distance[50], average[100];
int age[10], score[50];
double distance[50], average[100];
C Program DesignC Arrays
Array Initialization
Initializers
int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n2[10]={1, 2, 3, 4, 5};
int n3[10]={0};
int n4[10];
int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n2[10]={1, 2, 3, 4, 5};
int n3[10]={0};
int n4[10];
int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
範例: Initializers
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
範例: Initializers
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
Debug Mode
範例: Initializers
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
Release Mode
對未定義初值之陣列元素值勿做臆測對未定義初值之陣列元素值勿做臆測
C Program DesignC Arrays
Static Arrays
Automatic Arrays
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
#include <stdio.h>
main(){ int n1[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // all elements are initialized int n2[10]={1, 2, 3, 4, 5}; // rightmost elements become 0 int n3[10]={0}; // rightmost elements become 0 int n4[10]; // defined an array of size 10; don’t guess their values int n5[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // initializer detetermines the size int i;
for(i = 0; i<10; i++) printf("n1[%d]=%2d n2[%d]=%2d n3[%d]=%2d n4[%d]=%2d n5[%d]=%2d\n", i, n1[i], i, n2[i], i, n3[i], i, n4[i], i, n5[i]); }
Automatic arrays are created and, hence, initialized each time the corresponding function is called.Making arrays static “may” resolve the problem.
範例:
繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖
// histogram.c#include <ctype.h>
#define FALSE 0#define TRUE (!FALSE)
#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c){ static int first = TRUE; // enter first time static int freq['z' - 'a' + 1], total=0;
if(first){ // initialization needed int i; for(i = 0 ; i <'z'-'a' + 1; i++) freq[i]=0; first = FALSE; // initialized }
switch(action){ case HTG_SUBMIT_CHAR: if(!isalpha(c)) return 0; total++; return ++freq[toupper(c) - 'A']; case HTG_GET_CHAR_FREQ: if(!isalpha(c)) return 0; return freq[toupper(c) - 'A']; default: return total; }}
// histogram.c#include <ctype.h>
#define FALSE 0#define TRUE (!FALSE)
#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c){ static int first = TRUE; // enter first time static int freq['z' - 'a' + 1], total=0;
if(first){ // initialization needed int i; for(i = 0 ; i <'z'-'a' + 1; i++) freq[i]=0; first = FALSE; // initialized }
switch(action){ case HTG_SUBMIT_CHAR: if(!isalpha(c)) return 0; total++; return ++freq[toupper(c) - 'A']; case HTG_GET_CHAR_FREQ: if(!isalpha(c)) return 0; return freq[toupper(c) - 'A']; default: return total; }}
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
範例:
繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖
// histogram.c#include <ctype.h>
#define FALSE 0#define TRUE (!FALSE)
#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c){ static int first = TRUE; // enter first time static int freq['z' - 'a' + 1], total=0;
if(first){ // initialization needed int i; for(i = 0 ; i <'z'-'a' + 1; i++) freq[i]=0; first = FALSE; // initialized }
switch(action){ case HTG_SUBMIT_CHAR: if(!isalpha(c)) return 0; total++; return ++freq[toupper(c) - 'A']; case HTG_GET_CHAR_FREQ: if(!isalpha(c)) return 0; return freq[toupper(c) - 'A']; default: return total; }}
// histogram.c#include <ctype.h>
#define FALSE 0#define TRUE (!FALSE)
#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c){ static int first = TRUE; // enter first time static int freq['z' - 'a' + 1], total=0;
if(first){ // initialization needed int i; for(i = 0 ; i <'z'-'a' + 1; i++) freq[i]=0; first = FALSE; // initialized }
switch(action){ case HTG_SUBMIT_CHAR: if(!isalpha(c)) return 0; total++; return ++freq[toupper(c) - 'A']; case HTG_GET_CHAR_FREQ: if(!isalpha(c)) return 0; return freq[toupper(c) - 'A']; default: return total; }}
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int);
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int);
How about if static is missing?
How about if static is missing?
範例:繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
範例:繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
範例:繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
範例:繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖繪製一檔案中各字母(不區分大小寫)出現頻率之直方圖
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// main.c#include <stdio.h>#include "histogram.h"
main(){ int c, total, i;
do{ c = getchar(); histogram(HTG_SUBMIT_CHAR, c); } while(c != EOF);
total = histogram(HTG_GET_TOTAL); if(total==0) return 0;
for(i = 0; i < 26; i++){ int stars, j; printf("%c ", i+'A'); stars = 200.0 * histogram(HTG_GET_CHAR_FREQ, i+'A') / total; for(j=0; j<stars; j++) putchar('*'); putchar('\n'); } return 0;}
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
// histogram.h#define HTG_SUBMIT_CHAR 0#define HTG_GET_CHAR_FREQ 1#define HTG_GET_TOTAL 2
int histogram(int action, int c);
C Program DesignC Arrays
Passing Arrays to
Functions
Passing Arrays to Functions
To pass an array argument to a function, specify the name of the array without any brackets
Array size usually passed to function, e.g.,int myArray[ 24 ];
myFunction( myArray, 24 ); In C, array’s name denotes the starting address (reference)
of the array Hence, the above function call is equivalent to
myFunction( &myArray[0], 24 ); Modifying the array element in the function, the original ele
ment is modified
Passing Arrays to Functions
Passing the array’s reference to functions makes sense for performance reasons
– Remark: call this as call-by-reference is, in fact, improper since this is not done by compiler
If arrays were passed by value, a copy of each element would be passed. For large, frequently passed arrays, this would be time consuming and would consume considerable storage for the copies of the arrays.
Function Prototypes with Arrays
void myFunction( int array[], int arraySize );
void myFunction( int[], int );
範例#include <stdio.h>
void listElements(int[], int);void RemoveFactor5(int[], int);
main(){ int data[]={12, 55, 6, 21, 35, 90, 91};
printf("Original elements in data[] are: \n"); listElements(data, sizeof(data)/sizeof(int));
RemoveFactor5(data, sizeof(data)/sizeof(int));
printf("\n\nRemoving factor 5, elements in data[] become:\n"); listElements(data, sizeof(data)/sizeof(int)); printf("\n");}
void listElements(int vals[], int size){ int i;
for(i=0; i<size; i++) printf("%d ", vals[i]);}
void RemoveFactor5(int vals[], int size){ int i;
for(i=0; i<size; i++) while(vals[i] % 5 == 0 && vals[i] > 0) vals[i] /= 5;}
#include <stdio.h>
void listElements(int[], int);void RemoveFactor5(int[], int);
main(){ int data[]={12, 55, 6, 21, 35, 90, 91};
printf("Original elements in data[] are: \n"); listElements(data, sizeof(data)/sizeof(int));
RemoveFactor5(data, sizeof(data)/sizeof(int));
printf("\n\nRemoving factor 5, elements in data[] become:\n"); listElements(data, sizeof(data)/sizeof(int)); printf("\n");}
void listElements(int vals[], int size){ int i;
for(i=0; i<size; i++) printf("%d ", vals[i]);}
void RemoveFactor5(int vals[], int size){ int i;
for(i=0; i<size; i++) while(vals[i] % 5 == 0 && vals[i] > 0) vals[i] /= 5;}
將一正整數陣列中之各元素移除因子 5
將一正整數陣列中之各元素移除因子 5
範例#include <stdio.h>
void listElements(int[], int);void RemoveFactor5(int[], int);
main(){ int data[]={12, 55, 6, 21, 35, 90, 91};
printf("Original elements in data[] are: \n"); listElements(data, sizeof(data)/sizeof(int));
RemoveFactor5(data, sizeof(data)/sizeof(int));
printf("\n\nRemoving factor 5, elements in data[] become:\n"); listElements(data, sizeof(data)/sizeof(int)); printf("\n");}
void listElements(int vals[], int size){ int i;
for(i=0; i<size; i++) printf("%d ", vals[i]);}
void RemoveFactor5(int vals[], int size){ int i;
for(i=0; i<size; i++) while(vals[i] % 5 == 0 && vals[i] > 0) vals[i] /= 5;}
#include <stdio.h>
void listElements(int[], int);void RemoveFactor5(int[], int);
main(){ int data[]={12, 55, 6, 21, 35, 90, 91};
printf("Original elements in data[] are: \n"); listElements(data, sizeof(data)/sizeof(int));
RemoveFactor5(data, sizeof(data)/sizeof(int));
printf("\n\nRemoving factor 5, elements in data[] become:\n"); listElements(data, sizeof(data)/sizeof(int)); printf("\n");}
void listElements(int vals[], int size){ int i;
for(i=0; i<size; i++) printf("%d ", vals[i]);}
void RemoveFactor5(int vals[], int size){ int i;
for(i=0; i<size; i++) while(vals[i] % 5 == 0 && vals[i] > 0) vals[i] /= 5;}
將一正整數陣列中之各元素移除因子 5
將一正整數陣列中之各元素移除因子 5
C Program DesignC Arrays
Array Examples
範例:// MinMax.c#include <stdio.h>#include <limits.h>
#define MAX_NUM_ELEMENTS 50
int ReadData(int[], int);
main(){ int data[MAX_NUM_ELEMENTS]; int i, count; int min = INT_MAX, max = INT_MIN;
count = ReadData(data, MAX_NUM_ELEMENTS);
for(i = 0; i < count; i++){ if(min > data[i]) min = data[i]; if(max < data[i]) max = data[i]; }
printf("min=%d and max=%d\n", min, max);}
int ReadData(int data[], int size){ int count=0;
while(count < size && scanf("%d", &data[count]) != EOF) count++;
return count;}
// MinMax.c#include <stdio.h>#include <limits.h>
#define MAX_NUM_ELEMENTS 50
int ReadData(int[], int);
main(){ int data[MAX_NUM_ELEMENTS]; int i, count; int min = INT_MAX, max = INT_MIN;
count = ReadData(data, MAX_NUM_ELEMENTS);
for(i = 0; i < count; i++){ if(min > data[i]) min = data[i]; if(max < data[i]) max = data[i]; }
printf("min=%d and max=%d\n", min, max);}
int ReadData(int data[], int size){ int count=0;
while(count < size && scanf("%d", &data[count]) != EOF) count++;
return count;}
搜尋最大值與最小值搜尋最大值與最小值
範例:// MinMax.c#include <stdio.h>#include <limits.h>
#define MAX_NUM_ELEMENTS 50
int ReadData(int[], int);
main(){ int data[MAX_NUM_ELEMENTS]; int i, count; int min = INT_MAX, max = INT_MIN;
count = ReadData(data, MAX_NUM_ELEMENTS);
for(i = 0; i < count; i++){ if(min > data[i]) min = data[i]; if(max < data[i]) max = data[i]; }
printf("min=%d and max=%d\n", min, max);}
int ReadData(int data[], int size){ int count=0;
while(count < size && scanf("%d", &data[count]) != EOF) count++;
return count;}
// MinMax.c#include <stdio.h>#include <limits.h>
#define MAX_NUM_ELEMENTS 50
int ReadData(int[], int);
main(){ int data[MAX_NUM_ELEMENTS]; int i, count; int min = INT_MAX, max = INT_MIN;
count = ReadData(data, MAX_NUM_ELEMENTS);
for(i = 0; i < count; i++){ if(min > data[i]) min = data[i]; if(max < data[i]) max = data[i]; }
printf("min=%d and max=%d\n", min, max);}
int ReadData(int data[], int size){ int count=0;
while(count < size && scanf("%d", &data[count]) != EOF) count++;
return count;}
搜尋最大值與最小值搜尋最大值與最小值
Bubble Sort
Bubble Sort
void BubbleSort(int data[], int n)
{
int tmp, i, j;
for(i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if(data[j] > data[j+1]){
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
}
void BubbleSort(int data[], int n)
{
int tmp, i, j;
for(i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if(data[j] > data[j+1]){
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
}
範例 : Bubble Sort (I)
void BubbleSort(int data[], int n)
{
int tmp, i, j;
for(i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if(data[j] > data[j+1]){
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
}
void BubbleSort(int data[], int n)
{
int tmp, i, j;
for(i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if(data[j] > data[j+1]){
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
}
void BubbleSort(int data[], int n)
{
int tmp, i, j, sorted;
for(i=0, sorted=FALSE; !sorted && i<n-1; i++)
for(j=0, sorted=TRUE; j<n-i-1; j++)
if(data[j] > data[j+1]){
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
sorted = FALSE;
}
}
void BubbleSort(int data[], int n)
{
int tmp, i, j, sorted;
for(i=0, sorted=FALSE; !sorted && i<n-1; i++)
for(j=0, sorted=TRUE; j<n-i-1; j++)
if(data[j] > data[j+1]){
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
sorted = FALSE;
}
}
範例 : Bubble Sort (II)
Binary Search
Binary Search
int binSearch(int x, int v[], int n);
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
binSearch(137, v, 11)
binSearch(201, v, 11)
binSearch(45, v, 11)
6
9
-1
Binary Search
low =
high =
low <= high
mid = (low + high) / 2 = 5
binSearch(25, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
mid =
v[mid] = 125 > 25
Binary Search
low =
binSearch(25, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
mid =
v[mid] = 125 > 25
high =high = mid - 1
Binary Search
low =
binSearch(25, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
v[mid] = 9 < 25
high =
low <= high
mid = (low + high) / 2 = 2
mid =
Binary Search
low =
binSearch(25, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
v[mid] = 9 < 25
high =
mid =
low = mid + 1
Binary Search
low =
binSearch(25, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
high =mid =
v[mid] = 25 == 25
low <= high
mid = (low + high) / 2 = 3
3
Binary Search
low =
high =
low <= high
mid = (low + high) / 2 = 5
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
mid =
v[mid] = 125 > 25
Binary Search
low =
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
mid =
v[mid] = 125 > 45
high =high = mid - 1
Binary Search
low =
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
v[mid] = 9 < 45
high =
low <= high
mid = (low + high) / 2 = 2
mid =
Binary Search
low =
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
v[mid] = 9 < 45
high =
mid =
low = mid + 1
Binary Search
low =
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
high =mid =
v[mid] = 25 < 45
low <= high
mid = (low + high) / 2 = 3
Binary Search
low=
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
high =mid =
v[mid] = 25 < 45
low = mid + 1
Binary Search
low=
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
high =
mid =
v[mid] = 80 > 45
low <= high
mid = (low + high) / 2 = 4
Binary Search
low=
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
high =
mid =
v[mid] = 80 > 45
high = mid - 1
Binary Search
low=
binSearch(45, v, 11)
11
55
99
2525
8080
125125
137137
140140
180180
201201
400400
012345678910
v[]
high =
mid =
low <= high
-1
範例 : Binary Search/* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */int binSearch(int x, const int v[], int n){ int low, high, mid;
low = 0; high = n - 1; while (low <= high) { mid = (low+high)/2; if (x < v[mid]) high = mid - 1; else if (x > v[mid]) low = mid + 1; else /* found match */ return mid; } return -1; /* no match */}
/* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */int binSearch(int x, const int v[], int n){ int low, high, mid;
low = 0; high = n - 1; while (low <= high) { mid = (low+high)/2; if (x < v[mid]) high = mid - 1; else if (x > v[mid]) low = mid + 1; else /* found match */ return mid; } return -1; /* no match */}
範例 : Binary Search
C Program DesignC Arrays
Strings and
String Functions
Strings in C Null-terminated string In C, a string is a character array t
erminated with a '\0' to mark the end.
char str[]="hello\n";
Example: h (68)
e (65)
l (6C)
l (6C)
o (6F)
\n (0A)
\0 (00)
str str[0]
str[1]
str[2]
str[3]
str[4]
str[5]
str[6]
sizeof(str) = 7
char str[]={'h', 'e', 'l', 'l', 'o', '\n', '\0'};
Reading Strings
char string[BUF_SIZE]; // ensure buffer large enough
scanf("%s", string); // not &string
or
scanf("%s", &string[0]);
Reads characters until white character encountered.
Be careful not to write past end of array, as it is possible to do so.
範例: Reading Strings#include <stdio.h>
main(){ char string1[ 20 ]; /* reserves 20 characters */ char string2[] = "string literal"; /* reserves 15 characters */ int i; /* counter */
/* read string from user into array string1 */ printf( "Enter a string: " ); scanf( "%s", string1 ); /* input ended by whitespace character */
/* output string1 and string2 */ printf( "string1 is: %s\nstring2 is: %s\n", string1, string2 );
/* output space separated string for string1 */ printf( "string1 with spaces between characters is:\n" ); for ( i = 0; string1[ i ] != '\0'; i++ ) printf( "%c ", string1[ i ] );
printf( "\n" );}
#include <stdio.h>
main(){ char string1[ 20 ]; /* reserves 20 characters */ char string2[] = "string literal"; /* reserves 15 characters */ int i; /* counter */
/* read string from user into array string1 */ printf( "Enter a string: " ); scanf( "%s", string1 ); /* input ended by whitespace character */
/* output string1 and string2 */ printf( "string1 is: %s\nstring2 is: %s\n", string1, string2 );
/* output space separated string for string1 */ printf( "string1 with spaces between characters is:\n" ); for ( i = 0; string1[ i ] != '\0'; i++ ) printf( "%c ", string1[ i ] );
printf( "\n" );}
範例: Reading Strings#include <stdio.h>
main(){ char string1[ 20 ]; /* reserves 20 characters */ char string2[] = "string literal"; /* reserves 15 characters */ int i; /* counter */
/* read string from user into array string1 */ printf( "Enter a string: " ); scanf( "%s", string1 ); /* input ended by whitespace character */
/* output string1 and string2 */ printf( "string1 is: %s\nstring2 is: %s\n", string1, string2 );
/* output space separated string for string1 */ printf( "string1 with spaces between characters is:\n" ); for ( i = 0; string1[ i ] != '\0'; i++ ) printf( "%c ", string1[ i ] );
printf( "\n" );}
#include <stdio.h>
main(){ char string1[ 20 ]; /* reserves 20 characters */ char string2[] = "string literal"; /* reserves 15 characters */ int i; /* counter */
/* read string from user into array string1 */ printf( "Enter a string: " ); scanf( "%s", string1 ); /* input ended by whitespace character */
/* output string1 and string2 */ printf( "string1 is: %s\nstring2 is: %s\n", string1, string2 );
/* output space separated string for string1 */ printf( "string1 with spaces between characters is:\n" ); for ( i = 0; string1[ i ] != '\0'; i++ ) printf( "%c ", string1[ i ] );
printf( "\n" );}
atoi and itoa
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
atoi
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
char str[]="10759";int val;
val = atoi(str);
str '1'
'0'
'7'
'5'
'9''\0'
val
1075910 = 2A071600
00
2A
07
atoi
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
char str[]="10759";int val;
val = atoi(str);
str '1'
'0'
'7'
'5'
'9''\0'
val
1075910 = 2A071600
00
2A
07
Byte order: Big-Endian & Little-Endian
itoa
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
int atoi( const char[] ); // ascii to integer
int itoa( int, char[] ); // integer to ascii
char str[6];int val=10759;int len;
len=itoa(val, str);
str
val
1075910 = 2A071600
00
2A
07
'1'
'0'
'7'
'5'
'9''\0'
// >> 5
範例 :atoi
/* atoi: convert decimal string s to integer */
int atoi(const char s[])
{
int i=0, val=0, sign;
sign = s[i] == '-' ? -1 : 1; /* record sign */
if(s[i] == '+' || s[i] == '-') i++; /* skip sign if existent */
while(s[i] >= '0' && s[i] <= '9') /* non-numeric terminated */
val = 10 * val + (s[i++] - '0');
return val * sign;
}
/* atoi: convert decimal string s to integer */
int atoi(const char s[])
{
int i=0, val=0, sign;
sign = s[i] == '-' ? -1 : 1; /* record sign */
if(s[i] == '+' || s[i] == '-') i++; /* skip sign if existent */
while(s[i] >= '0' && s[i] <= '9') /* non-numeric terminated */
val = 10 * val + (s[i++] - '0');
return val * sign;
}
範例 :itoa/* itoa: convert n to characters in s and return length */int itoa(int n, char s[]){ int i, negative; n = (negative = (n < 0)) ? –n : n; /* record sign */
/* make n positive */ i = 0; do { /* generate digits in reverse order */ s[i++] = n % 10 + '0'; /* get next digit */ } while ((n /= 10) > 0); /* delete it */ if (negative) s[i++] = '-'; s[i] = '\0'; reverse(s); return i;}
/* itoa: convert n to characters in s and return length */int itoa(int n, char s[]){ int i, negative; n = (negative = (n < 0)) ? –n : n; /* record sign */
/* make n positive */ i = 0; do { /* generate digits in reverse order */ s[i++] = n % 10 + '0'; /* get next digit */ } while ((n /= 10) > 0); /* delete it */ if (negative) s[i++] = '-'; s[i] = '\0'; reverse(s); return i;}
範例 :strlen, reverse/* strlen: return the string length of s */int strlen(const char s[]){ int i=0; while(s[i]) i++; return i;}
/* reverse: reverse sting s */void reverse(char s[]){ int i, j, temp;
i = 0; j = strlen(s) - 1;
while(i < j){ temp = s[i]; s[i] = s[j]; s[j] = temp; i++; j--; }}
/* strlen: return the string length of s */int strlen(const char s[]){ int i=0; while(s[i]) i++; return i;}
/* reverse: reverse sting s */void reverse(char s[]){ int i, j, temp;
i = 0; j = strlen(s) - 1;
while(i < j){ temp = s[i]; s[i] = s[j]; s[j] = temp; i++; j--; }}
範例 :atoi(recurive version)
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
start=3
'1' '2' '5' '9' '3' '0' '1' '9' '\0'str
val=125
範例 :atoi(recurive version)
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
start=0
'1' '2' '5' '9' '3' '0' '1' '9' '\0'str
val=0
範例 :atoi(recurive version)
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
start=8
'1' '2' '5' '9' '3' '0' '1' '9' '\0'str
val=12593019 answer
範例 :atoi(recurive version)
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
start=8start=8
'1' '2' '5' '9' '3' '0' '1' '9' '\0'str
val=12593019 answer
start=3start=3
'1' '2' '5' '9' '3' '0' '1' '9' '\0'str '1' '2' '5' '9' '3' '0' '1' '9' '\0'str
val=125
範例 :atoi(recurive version)
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
範例 :atoi(recurive version)
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
// RecursiveAtoi.c
// recursive_atoi: convert a decimal string (str) from index (start)// into an integer with heading value (val)int recursive_atoi(const char str[], int val, int start){ if(str[start] == '-') return -recursive_atoi(str, val, start+1); else if(str[start] == '+') return recursive_atoi(str, val, start+1); else if(str[start]=='\0') return val; else return recursive_atoi(str, val * 10 + (str[start] - '0'), start+1);}
// atoi: convert a decimal string str into an integer// assume str is error freeint atoi(const char str[]){ return recursive_atoi(str, 0, 0);}
// main.c#include <stdio.h>
int atoi(char[]);
main(){ char str[20]; printf("Enter a numeric string:"); scanf("%s", str);
printf("The value you type is:%d\n", atoi(str));}
// main.c#include <stdio.h>
int atoi(char[]);
main(){ char str[20]; printf("Enter a numeric string:"); scanf("%s", str);
printf("The value you type is:%d\n", atoi(str));}
範例 :itoa(recurive version)
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
start
x x x x x x x x xs
範例 :itoa(recurive version)
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
start
x x x x x x x x xs n=1024‘1’ ‘0’ ‘2’ ‘4’
Return 4
範例 :itoa(recurive version)
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
start
x x x x x x x x xs
範例 :itoa(recurive version)
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
// RecursiveItoa.c
// recursive_itoa: itoa之輔助函式// 將 n值轉為十進制字串,將結果從 s矩陣之 start處開始擺放// 傳回值為轉換後之字串長度int recursive_itoa(int n, char s[], int start){ int len = 0; if(n/10) len = recursive_itoa(n/10, s, start); s[start+len] = n % 10 + '0'; return len+1;}
// itoa: convert integer (n) into string (s) and return lengthint itoa(int n, char s[]){ int i=0; if(n<0){ s[i++]='-'; n = -n; } i += recursive_itoa(n, s, i); s[i]='\0'; return i;}
String Functions
<stdlib.h>
<string.h>
C Program DesignC Arrays
Multi-dimensional
Arrays
Two-Dimensional Arrays
A collection of a fixed number of components arranged in two dimensions– all components are of the same type– also called matrices
Syntax:dataType arrayName[intexp1][intexp2];
where intexp1 and intexp2 are expressions yielding positive integer values
範例 :#define MONTHS 12#define YEARS 5
int main(void){ float rainFall[YEARS][MONTHS]; int i, j;
for ( i = 0; i < YEARS; i++ ) { for ( j = 0; j < MONTHS; j++ ) { printf( "Rain fall for year %d, month %d: ", i, j ); scanf( "%f", &rainFall[i][j] ); } } // . . .}
#define MONTHS 12#define YEARS 5
int main(void){ float rainFall[YEARS][MONTHS]; int i, j;
for ( i = 0; i < YEARS; i++ ) { for ( j = 0; j < MONTHS; j++ ) { printf( "Rain fall for year %d, month %d: ", i, j ); scanf( "%f", &rainFall[i][j] ); } } // . . .}
2D-Arrays in Memory
#define YEARS 5#define MONTHS 12
float rainFall[YEARS][MONTHS];
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[0][2]rainFall[0][2]
rainFall[1][2]rainFall[1][2]
rainFall[2][2]rainFall[2][2]
rainFall[3][2]rainFall[3][2]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
. . .. . .
rainFall[1][11]rainFall[1][11]
. . .. . .
rainFall[2][11]rainFall[2][11]
. . .. . .
rainFall[3][11]rainFall[3][11]
. . .. . .
rainFall[4][11]rainFall[4][11]
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[0][2]rainFall[0][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[1][2]rainFall[1][2]
. . .. . .
rainFall[1][11]rainFall[1][11]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[2][2]rainFall[2][2]
. . .. . .
rainFall[2][11]rainFall[2][11]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[3][2]rainFall[3][2]
. . .. . .
rainFall[3][11]rainFall[3][11]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[4][11]rainFall[4][11]
Logical View
Physical ViewrainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall,
rainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall
2D-Arrays in Memory
#define YEARS 5#define MONTHS 12
float rainFall[YEARS][MONTHS];
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[0][2]rainFall[0][2]
rainFall[1][2]rainFall[1][2]
rainFall[2][2]rainFall[2][2]
rainFall[3][2]rainFall[3][2]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
. . .. . .
rainFall[1][11]rainFall[1][11]
. . .. . .
rainFall[2][11]rainFall[2][11]
. . .. . .
rainFall[3][11]rainFall[3][11]
. . .. . .
rainFall[4][11]rainFall[4][11]
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[0][2]rainFall[0][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[1][2]rainFall[1][2]
. . .. . .
rainFall[1][11]rainFall[1][11]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[2][2]rainFall[2][2]
. . .. . .
rainFall[2][11]rainFall[2][11]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[3][2]rainFall[3][2]
. . .. . .
rainFall[3][11]rainFall[3][11]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[4][11]rainFall[4][11]
Logical View
Physical ViewrainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall,
rainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall
sizeof(rainFall)=?sizeof(rainFall)=?
sizeof(rainFall[i])=
?, i=0, …, 4
sizeof(rainFall[i])=
?, i=0, …, 4sizeof(rai
nFall[i][j])=?, i=0,
…, 4, j=0, …, 11
sizeof(rainFall[i][j
])=?, i=0, …, 4, j=0
, …, 11
2D-Arrays in Memory
#define YEARS 5#define MONTHS 12
float rainFall[YEARS][MONTHS];
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[0][2]rainFall[0][2]
rainFall[1][2]rainFall[1][2]
rainFall[2][2]rainFall[2][2]
rainFall[3][2]rainFall[3][2]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
. . .. . .
rainFall[1][11]rainFall[1][11]
. . .. . .
rainFall[2][11]rainFall[2][11]
. . .. . .
rainFall[3][11]rainFall[3][11]
. . .. . .
rainFall[4][11]rainFall[4][11]
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[0][2]rainFall[0][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[1][2]rainFall[1][2]
. . .. . .
rainFall[1][11]rainFall[1][11]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[2][2]rainFall[2][2]
. . .. . .
rainFall[2][11]rainFall[2][11]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[3][2]rainFall[3][2]
. . .. . .
rainFall[3][11]rainFall[3][11]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[4][11]rainFall[4][11]
Logical View
Physical ViewrainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall,
rainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall
C compiler doesn’t perform out-of-bound
checking. C compiler doesn’t perform out-of-bound
checking.
Accessing, e.g., rainFall[0][14] is not invalid. Accessing, e.g., rainFall[0][14] is not invalid.
2D-Arrays in Memory
#define YEARS 5#define MONTHS 12
float rainFall[YEARS][MONTHS];
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[0][2]rainFall[0][2]
rainFall[1][2]rainFall[1][2]
rainFall[2][2]rainFall[2][2]
rainFall[3][2]rainFall[3][2]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
. . .. . .
rainFall[1][11]rainFall[1][11]
. . .. . .
rainFall[2][11]rainFall[2][11]
. . .. . .
rainFall[3][11]rainFall[3][11]
. . .. . .
rainFall[4][11]rainFall[4][11]
rainFall[0][0]rainFall[0][0]
rainFall[0][1]rainFall[0][1]
rainFall[0][2]rainFall[0][2]
. . .. . .
rainFall[0][11]rainFall[0][11]
rainFall[1][0]rainFall[1][0]
rainFall[1][1]rainFall[1][1]
rainFall[1][2]rainFall[1][2]
. . .. . .
rainFall[1][11]rainFall[1][11]
rainFall[2][0]rainFall[2][0]
rainFall[2][1]rainFall[2][1]
rainFall[2][2]rainFall[2][2]
. . .. . .
rainFall[2][11]rainFall[2][11]
rainFall[3][0]rainFall[3][0]
rainFall[3][1]rainFall[3][1]
rainFall[3][2]rainFall[3][2]
. . .. . .
rainFall[3][11]rainFall[3][11]
rainFall[4][0]rainFall[4][0]
rainFall[4][1]rainFall[4][1]
rainFall[4][2]rainFall[4][2]
. . .. . .
rainFall[4][11]rainFall[4][11]
Logical View
Physical ViewrainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall,
rainFall[0]
rainFall[1]
rainFall[2]
rainFall[3]
rainFall[4]
rainFall
Can you figure out, though improper, the
addresses of rainfall[5], rainfall[6], …
?
Can you figure out, though improper, the
addresses of rainfall[5], rainfall[6], …
? How?
MONTHS
MONTHS 12
2D-Array Initialization
#include <stdio.h>
main(){ int array1[2][3] = {{1, 2, 3}, {4, 5, 6}}; int array2[2][3] = {{1, 2, 3}, {4}}; int array3[2][3] = {{1, 2, 3}};
int array4[][3] = {1, 2, 3, 4, 5, 6}; int array5[][3] = {1, 2, 3, 4}; int array6[][3] = {1, 2, 3};
int array7[][3] = {{1, 2}, {4}}; int array8[][3] = {1, 2}; int array9[][3] = {1};
printf("Size of array1 to array9 are:\n" "%d %d %d %d %d %d %d %d %d\n", sizeof(array1), sizeof(array2), sizeof(array3), sizeof(array4), sizeof(array5), sizeof(array6), sizeof(array7), sizeof(array8), sizeof(array9));}
#include <stdio.h>
main(){ int array1[2][3] = {{1, 2, 3}, {4, 5, 6}}; int array2[2][3] = {{1, 2, 3}, {4}}; int array3[2][3] = {{1, 2, 3}};
int array4[][3] = {1, 2, 3, 4, 5, 6}; int array5[][3] = {1, 2, 3, 4}; int array6[][3] = {1, 2, 3};
int array7[][3] = {{1, 2}, {4}}; int array8[][3] = {1, 2}; int array9[][3] = {1};
printf("Size of array1 to array9 are:\n" "%d %d %d %d %d %d %d %d %d\n", sizeof(array1), sizeof(array2), sizeof(array3), sizeof(array4), sizeof(array5), sizeof(array6), sizeof(array7), sizeof(array8), sizeof(array9));}
2D-Array as Function’s Argument
#include <stdio.h>
void listElements(char heading[], int array[2][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
#include <stdio.h>
void listElements(char heading[], int array[2][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
2D-Array as Function’s Argument
#include <stdio.h>
void listElements(char heading[], int array[2][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
#include <stdio.h>
void listElements(char heading[], int array[2][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
Provide no information to the compiler for locating array’s
elements.
Provide no information to the compiler for locating array’s
elements.
2D-Array as Function’s Argument
#include <stdio.h>
void listElements(char heading[], int array[2][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
#include <stdio.h>
void listElements(char heading[], int array[2][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
void listElements(char heading[], int array[][3])
2D-Array as Function’s Argument
#include <stdio.h>
void listElements(char heading[], int array[][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
#include <stdio.h>
void listElements(char heading[], int array[][3]){ int i, j;
printf(heading);
for(i=0; i<2; i++) for(j=0; j<3; j++) printf("%d ", array[i][j]);
printf("\n"); }
#include <stdio.h>
void listElements(char[], int[][3]);
main(){ int array1[2][3] = {{1, 2, 3}, {4, 5, 6}}; int array2[2][3] = {{1, 2, 3}, {4}}; int array3[2][3] = {{1, 2, 3}};
int array4[][3] = {1, 2, 3, 4, 5, 6}; int array5[][3] = {1, 2, 3, 4}; int array6[][3] = {1, 2, 3};
int array7[][3] = {{1, 2}, {4}}; int array8[][3] = {1, 2}; int array9[][3] = {1};
printf("Size of array1 to array9 are:\n" "%d %d %d %d %d %d %d %d %d\n", sizeof(array1), sizeof(array2), sizeof(array3), sizeof(array4), sizeof(array5), sizeof(array6), sizeof(array7), sizeof(array8), sizeof(array9) );
listElements("array1: ", array1); listElements("array2: ", array2); listElements("array3: ", array3); listElements("array4: ", array4); listElements("array5: ", array5); listElements("array6: ", array6); listElements("array7: ", array7); listElements("array8: ", array8); listElements("array9: ", array9);}
#include <stdio.h>
void listElements(char[], int[][3]);
main(){ int array1[2][3] = {{1, 2, 3}, {4, 5, 6}}; int array2[2][3] = {{1, 2, 3}, {4}}; int array3[2][3] = {{1, 2, 3}};
int array4[][3] = {1, 2, 3, 4, 5, 6}; int array5[][3] = {1, 2, 3, 4}; int array6[][3] = {1, 2, 3};
int array7[][3] = {{1, 2}, {4}}; int array8[][3] = {1, 2}; int array9[][3] = {1};
printf("Size of array1 to array9 are:\n" "%d %d %d %d %d %d %d %d %d\n", sizeof(array1), sizeof(array2), sizeof(array3), sizeof(array4), sizeof(array5), sizeof(array6), sizeof(array7), sizeof(array8), sizeof(array9) );
listElements("array1: ", array1); listElements("array2: ", array2); listElements("array3: ", array3); listElements("array4: ", array4); listElements("array5: ", array5); listElements("array6: ", array6); listElements("array7: ", array7); listElements("array8: ", array8); listElements("array9: ", array9);}
Multidimensional Arrays
A collection of a fixed number of components arranged in n ( 1) dimensions– all components are of the same type– also called n-dimensional arrays
Syntax:dataType arrayName[intexp1][intexp2]…[intexpn];
where intexp1, intexp2, … are expressions yielding positive integer values
範例 :#define YEARS 5#define TOTALSALES 10#define PRODUCTS 5
int main(void){ int sales[YEARS][TOTALSALES][PRODUCTS]; int i, j, k;
for ( i = 0; i < YEARS; i++ ) for ( j = 0; j < TOTALSALES; j++ ) for ( k = 0; k < PRODUCTS; k++ ) { printf("In year %d, the number of items sold by "sales %d for product is", i, j, k); scanf( "%d", &sales[i][j][k] ); } // . . .}
#define YEARS 5#define TOTALSALES 10#define PRODUCTS 5
int main(void){ int sales[YEARS][TOTALSALES][PRODUCTS]; int i, j, k;
for ( i = 0; i < YEARS; i++ ) for ( j = 0; j < TOTALSALES; j++ ) for ( k = 0; k < PRODUCTS; k++ ) { printf("In year %d, the number of items sold by "sales %d for product is", i, j, k); scanf( "%d", &sales[i][j][k] ); } // . . .}
N-Dim Array as Function’s Argument
When declaring a multi-dimensional array as a formal parameter in a function– can omit size of first dimension but not other
dimensions– there is no check if the array indices are within
bounds
Passing an array to the function by writing its name. – An array’s name represents its address (reference)
練習 :1. Write a C program which output an NN magic
square, where N is an odd integer. An NN magic square has N2 cells that are filled with integers from 1 to N2 , and all of its column sums, row sums and the two diagonal sums have the same value.
Reference:
練習 :Knight’s Tour
2. Problem 6.19 of the textbook3. Problem 6.20 of the textbook