實驗5 C語言指標應用程式設計

青栀%發表於2024-05-24

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 }

相關文章