1. 實驗任務1
task1_1.c
1 #include<stdio.h> 2 #define N 5 3 4 void input(int x[],int n); 5 void output(int x[],int n); 6 void find_min_max(int x[],int n,int *pmin,int *pmax); 7 8 int main() 9 { 10 int a[N]; 11 int min,max; 12 13 printf("錄入%d個資料:\n",N); 14 input(a,N); 15 16 printf("資料是:\n"); 17 output(a,N); 18 19 printf("資料處理...\n"); 20 find_min_max(a,N,&min,&max); 21 22 printf("輸出結果:\n"); 23 printf("min=%d,max=%d\n",min,max); 24 25 return 0; 26 } 27 void input(int x[],int n) 28 { 29 int i; 30 31 for(i=0;i<n;++i) 32 scanf("%d", &x[i]); 33 } 34 35 void output(int x[], int n) { 36 int i; 37 38 for(i = 0; i < n; ++i) 39 printf("%d ", x[i]); 40 printf("\n"); 41 } 42 void find_min_max(int x[],int n,int *pmin,int *pmax) 43 { 44 int i; 45 46 *pmin=*pmax=x[0]; 47 48 for(i=1;i<n;++i) 49 if(x[i]<*pmin) 50 *pmin=x[i]; 51 else if(x[i]>*pmax) 52 *pmax=x[i]; 53 }
1. 函式 find_min_max 實現的功能是查詢陣列元素的最小值和最大值,並將其透過指標變數放到main函式的min max 中
2. "指標變數在使用之前必須指向確定的地址"。執行到line45時,指標變數pmin、pmax 都指向x[0]
task1_2.c
1 #include<stdio.h> 2 #define N 5 3 4 void input(int x[], int n); 5 void output(int x[], int n); 6 int *find_max(int x[],int n); 7 8 int main() 9 { 10 int a[N]; 11 int *pmax; 12 13 printf("錄入%d個資料:\n", N); 14 input(a, N); 15 16 printf("資料是: \n"); 17 output(a, N); 18 19 printf("資料處理...\n"); 20 pmax=find_max(a,N); 21 22 printf("輸出結果:\n"); 23 printf("max= %d\n",*pmax); 24 25 return 0; 26 27 } 28 void input(int x[], int n) { 29 int i; 30 31 for(i = 0; i < n; ++i) 32 scanf("%d", &x[i]); 33 } 34 35 void output(int x[], int n) { 36 int i; 37 38 for(i = 0; i < n; ++i) 39 printf("%d ", x[i]); 40 printf("\n"); 41 } 42 int *find_max(int x[], int n) 43 { 44 int max_index = 0; 45 int i; 46 47 for(i = 1; i < n; ++i) 48 if(x[i] > x[max_index]) 49 max_index = i; 50 51 return &x[max_index]; 52 }
1. 函式 find_max 的功能是找出陣列元素的最大值,並返回最大值所在地址
2. 把函式 find_max 的實現寫成以下程式碼,可以,透過返回指標變數的值,返回最大值地址
2. 實驗任務2
task2_1.c
1 #include<stdio.h> 2 #include<string.h> 3 #define N 80 4 5 int main() 6 { 7 char s1[]="Learning makes me happy"; 8 char s2[]="Learning makes me sleepy"; 9 char tmp[N]; 10 11 printf("sizeof(s1)vs.strlen(s1):\n"); 12 printf("sizeof(s1)=%d\n",sizeof(s1)); 13 printf("strlen(s1)=%d\n",strlen(s1)); 14 15 printf("\nbefore swap:\n"); 16 printf("s1:%s\n",s1); 17 printf("s2:%s\n",s2); 18 19 printf("\nswaping...\n"); 20 strcpy(tmp,s1); 21 strcpy(s1,s2); 22 strcpy(s2,tmp); 23 24 printf("\nafter swap:\n"); 25 printf("s1:%s\n",s1); 26 printf("s2:%s\n",s2); 27 28 return 0; 29 }
問題1:陣列s1的大小是4, sizeof(s1) 計算的是字串所佔用的位元組數, strlen(s1) 統計的是有效字元數,不包括'\0'
問題2:line6程式碼,不能替換成以下寫法,s1 是字串陣列的起始地址常量
task2_2.c
1 #include<stdio.h> 2 #include<string.h> 3 #define N 80 4 5 int main() 6 { 7 char *s1="Learning makes me happy"; 8 char *s2="Learning makes me sleepy"; 9 char *tmp; 10 11 printf("sizeof(s1)vs.strlen(s1):\n"); 12 printf("sizeof(s1)=%d\n",sizeof(s1)); 13 printf("strlen(s1)=%d\n",strlen(s1)); 14 15 printf("\nbefore swap:\n"); 16 printf("s1:%s\n",s1); 17 printf("s2:%s\n",s2); 18 19 printf("\nswaping...\n"); 20 tmp=s1; 21 s1=s2; 22 s2=tmp; 23 24 printf("\nafter swap:\n"); 25 printf("s1:%s\n",s1); 26 printf("s2:%s\n",s2); 27 28 return 0; 29 }
問題1:指標變數s1中存放的是字串的初始地址 , sizeof(s1) 計算的是指標變數s1所佔用的位元組數, strlen(s1) 統計的是s1所指向的字串所佔用的有效位元組數
問題2:line6程式碼能替換成下面的寫法,對比task2_1.c中的line7, task2_1中s1是地址常量,不能複製,task2_2中s1是指標變數,該語義是把字串的初始地址賦值給s1
問題3:line19-line21,交換的是地址,s1 和s2所指向的字串改變,字串常量"Learning makes me happy"和字串常 量"Learning makes me sleepy"在記憶體儲存單元中沒有交換
3. 實驗任務3
1 #include<stdio.h> 2 int main() 3 { 4 int x[2][4]={{1,9,8,4},{2,0,4,9}}; 5 int i,j; 6 int *ptr1; 7 int(*ptr2)[4];//指向int型一維陣列 8 9 printf("輸出1:使用陣列名、下標直接訪問二維陣列元素\n"); 10 for(i=0;i<2;++i) 11 { 12 for(j=0;j<4;++j) 13 printf("%d",x[i][j]); 14 printf("\n"); 15 } 16 17 printf("\n輸出2:使用指向元素的指標變數ptr1間接訪問二維陣列元素\n"); 18 for(ptr1=&x[0][0],i=0;ptr1<&x[0][0]+8;++ptr1,++i) 19 { 20 printf("%d",*ptr1); 21 22 if((i+1)%4==0) 23 printf("\n"); 24 } 25 26 printf("\n輸出3:使用指向一維陣列的指標變數ptr2間接訪問二維陣列元素\n"); 27 for(i=0,ptr2=x;i<2;++i,++ptr2) 28 { 29 for(j=0;j<4;++j) 30 printf("%d",*(*ptr2+j)); 31 printf("\n"); 32 } 33 34 return 0; 35 }
int (*ptr)[4]; 中,識別符號ptr表示的語義是ptr指向一維陣列,相當於x[],
int *ptr[4];中,識別符號ptr表示的語義是指標陣列ptr[4]的起始地址
4. 實驗任務4
task4-1.c
1 #include<stdio.h> 2 #define N 80 3 4 void replace(char *str,char old_char,char new_char); 5 6 int main() 7 { 8 char text[N]="c programming is difficult or not,it is a question."; 9 10 11 printf("原始文字:\n"); 12 printf("%s",text); 13 14 replace(text,'i','*');//函式呼叫,注意字元形參寫法,單引號不能少 15 16 printf("處理後文字:\n"); 17 printf("%s\n",text); 18 19 return 0; 20 } 21 void replace(char *str,char old_char,char new_char) 22 { 23 while(*str) 24 { 25 if(*str==old_char) 26 *str=new_char; 27 *str++; 28 } 29 }
1. 函式 replace 的功能是把字串中出現的old_char 替換為new_char
2. line24, 圓括號裡迴圈條件可以改寫成 *str != '\0','\0'存放的編碼值即為0;
task4-2.c
1 #include<stdio.h> 2 #define N 80 3 4 void str_trunc(char *str,char x); 5 6 int main() 7 { 8 char str[N]; 9 char ch; 10 11 printf("輸入字串:"); 12 gets(str); 13 14 printf("輸入一個字元:"); 15 ch=getchar(); 16 17 printf("截斷處理...\n"); 18 str_trunc(str,ch); 19 20 printf("截斷處理後的字串:%s\n",str); 21 22 return 0; 23 } 24 void str_trunc(char *str,char x) 25 { 26 while(*str) 27 { 28 if(*str==x) 29 *str='\0';//blank 1 30 str++;//blank 2 31 } 32 }
5. 實驗任務5
task5-1.c
1 #include<stdio.h> 2 #include<string.h> 3 void sort(char *name[],int n); 4 5 int main() 6 { 7 char *course[4]={"C Program", 8 "C++ Object Oriented Program", 9 "Operating System", 10 "Data Structure and Algorithms"}; 11 int i; 12 13 sort(course,4); 14 15 for(i=0;i<4;++i) 16 printf("%s\n",course[i]); 17 18 return 0; 19 } 20 void sort(char *name[],int n) 21 { 22 int i,j; 23 char *tmp; 24 25 for(i=0;i<n-1;++i) 26 for(j=0;j<n-1-i;++j) 27 if(strcmp(name[j],name[j+1])>0) 28 { 29 tmp=name[j]; 30 name[j]=name[j+1]; 31 name[j+1]=tmp; 32 } 33 }
task5-2.c
1 #include<stdio.h> 2 #include<string.h> 3 void sort(char *name[],int n); 4 5 int main() 6 { 7 char *course[4]={"C Program", 8 "C++ Object Oriented Program", 9 "Operating System", 10 "Data Structure and Algorithms"}; 11 int i; 12 13 sort(course,4); 14 15 for(i=0;i<4;++i) 16 printf("%s\n",course[i]); 17 18 return 0; 19 } 20 void sort(char *name[],int n) 21 { 22 int i,j,k; 23 char *tmp; 24 25 for(i=0;i<n-1;++i) 26 { 27 for(j=i+1,k=i,tmp=name[k];j<n;++j) 28 if(strcmp(name[j],name[k])<0) 29 k=j; 30 31 if(k!=i) 32 { 33 name[i]=name[k]; 34 name[k]=tmp; 35 } 36 } 37 }
這兩種演算法實現中,交換的是指標變數的值
6. 實驗任務6
1 #include<stdio.h> 2 #include<string.h> 3 #define N 5 4 5 int check_id(char *str); 6 7 int main() 8 { 9 char *pid[N]={"31010120000721656X", 10 "330106199609203301", 11 "53010220051126571", 12 "510104199X11197977", 13 "53010220051126133Y"}; 14 int i; 15 16 for(i=0;i<N;++i) 17 if(check_id(pid[i])) 18 printf("%s\tTrue\n",pid[i]); 19 else 20 printf("%s\tFalse\n",pid[i]); 21 22 return 0; 23 } 24 int check_id(char *str) 25 { 26 int k=0; 27 28 while(*str) 29 { 30 str++; 31 k++; 32 } 33 34 if(k!=18) 35 return 0; 36 37 str=str-k; 38 39 for(k=0;k<18;k++) 40 { 41 if(k==17) 42 { 43 if(*(str+k)!='X'&&(*(str+k)<'0'||*(str+k)>'9')) 44 return 0; 45 } 46 else if(*(str+k)<'0'||*(str+k)>'9') 47 return 0; 48 } 49 50 }
7. 實驗任務7
1 #include<stdio.h> 2 #define N 80 3 void encoder(char *str); 4 void decoder(char *str); 5 6 int main() 7 { 8 char words[N]; 9 10 printf("輸入英文文字:"); 11 gets(words); 12 13 printf("編譯後的英文文字:"); 14 encoder(words); 15 printf("%s\n",words); 16 17 printf("對編譯後的英文文字解碼:"); 18 decoder(words); 19 printf("%s\n",words); 20 21 return 0; 22 } 23 void encoder(char *str) 24 { 25 while(*str) 26 { 27 if((*str>='a'&&*str<'z')||(*str>='A'&&*str<'Z')) 28 (*str)++; 29 30 else if(*str=='z') 31 *str='a'; 32 else if(*str=='Z') 33 *str='A'; 34 35 str++; 36 } 37 } 38 void decoder(char *str) 39 { 40 while(*str) 41 { 42 if((*str>'a'&&*str<='z')||(*str>'A'&&*str<='Z')) 43 (*str)--; 44 45 else if(*str=='a') 46 *str='z'; 47 else if(*str=='A') 48 *str='Z'; 49 50 str++; 51 } 52 }
8. 實驗任務8
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int main(int argc,char *argv[]) 5 { 6 int i,j,k; 7 char *tmp; 8 9 for(i=1;i<argc;++i) 10 { 11 for(j=i+1,k=i,tmp=argv[k];j<argc;++j) 12 if(strcmp(argv[j],tmp)<0) 13 k=j; 14 if(k!=i) 15 { 16 argv[i]=argv[k]; 17 argv[k]=tmp; 18 } 19 } 20 21 for(i=1;i<argc;++i) 22 printf("hello,%s\n",argv[i]); 23 24 system("pause"); 25 return 0; 26 }