实验六

task1_1.c

 1 #include <stdio.h>
 2 #define N 4
 3 int main()
 4 {
 5 int x[N] = {1, 9, 8, 4};
 6 int i;
 7 int *p;
 8 for(i=0; i<N; ++i)
 9 printf("%d", x[i]);
10 printf("\n");
11 for(p=x; p<x+N; ++p)
12 printf("%d", *p);
13 printf("\n");
14 p = x;
15 for(i=0; i<N; ++i)
16 printf("%d", *(p+i));
17 printf("\n");
18 p = x;
19 for(i=0; i<N; ++i)
20 printf("%d", p[i]);
21 printf("\n");
22 return 0;
23 }

附图:

task1_2.c

 1 #include <stdio.h>
 2 #define N 4
 3 int main()
 4 {
 5 char x[N] = {'1', '9', '8', '4'};
 6 int i;
 7 char *p;
 8 // 方式1:通过数组名和下标遍历输出数组元素
 9 for(i=0; i<N; ++i)
10 printf("%c", x[i]);
11 printf("\n");
12 // 方式2:通过指针变量遍历输出数组元素 (写法1)
13 for(p=x; p<x+N; ++p)
14 printf("%c", *p);
15 printf("\n");
16 // 方式2:通过指针变量遍历输出数组元素(写法2)
17 p = x;
18 for(i=0; i<N; ++i)
19 printf("%c", *(p+i));
20 printf("\n");
21 // 方式2:通过指针变量遍历输出数组元素(写法3)
22 p = x;
23 for(i=0; i<N; ++i)
24 printf("%c", p[i]);
25 printf("\n");
26 return 0;
27 }

附图:

1.程序task1_1.c中,假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地址值 是多少?

答:p的存放地址为2005

2.程序task1_2.c中,假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地址值 是多少?

答:p的存放地址为2004

 

3.都是对指针变量做++p操作,为什么结果不同?

答:因为给指针赋值的时候所采用的方式不同,第一个用了int定义,第二个用了char定义,在第二个中不会结算截止符

task2_1.c

 1 #include <stdio.h>
 2 int main()
 3 {
 4 int x[2][4] = { {1,9,8,4}, {2,0,2,2}} ;
 5 int i, j;
 6 int *p; // 指针变量,存放int类型数据的地址
 7 int (*q)[4]; // 指针变量,指向包含4个int型元素的一维数组
 8 // 使用数组名、下标访问二维数组元素
 9 for(i=0; i<2; ++i)
10 {
11 for(j=0; j<4; ++j)
12 printf("%d", x[i][j]);
13 printf("\n");
14 }
15 // 使用指针变量p间接访问二维数组元素
16 for(p = &x[0][0], i = 0; p < &x[0][0] + 8; ++p, ++i)
17 {
18 printf("%d", *p);
19 if( (i+1)%4 == 0)
20 printf("\n");
21 }
22 // 使用指针变量q间接访问二维数组元素
23 for(q=x; q<x+2; ++q)
24 {
25 for(j=0; j<4; ++j)
26 printf("%d", *(*q+j));
27 printf("\n");
28 }
29 return 0;
30 }

附图:

task2_2.c

 1 #include <stdio.h>
 2 int main()
 3 {
 4 char x[2][4] = { {'1', '9', '8', '4'}, {'2', '0', '2', '2'} };
 5 int i, j;
 6 char *p; // 指针变量,存放char类型数据的地址
 7 char (*q)[4]; // 指针变量,指向包含4个char型元素的一维数组
 8 // 使用数组名、下标访问二维数组元素
 9 for(i=0; i<2; ++i)
10 {
11 for(j=0; j<4; ++j)
12 printf("%c", x[i][j]);
13 printf("\n");
14 }
15 // 使用指针变量p间接访问二维数组元素
16 for(p = &x[0][0], i = 0; p < &x[0][0] + 8; ++p, ++i)
17 {
18 printf("%c", *p);
19 if( (i+1)%4 == 0)
20 printf("\n");
21 }
22 // 使用指针变量q间接访问二维数组元素
23 for(q=x; q<x+2; ++q)
24 {
25 for(j=0; j<4; ++j)
26 printf("%c", *(*q+j));
27 printf("\n");
28 }
29 return 0;
30 }

附图:

1.程序task2_1.c中:

(1) 假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地址值是多少?

  答:p的存放地址为2009

(2)假设指针变量q初始值是地址2000,则执行++q后,指针变量q中存放的地址值是多少?

  答:q的存放地址为2003

2.程序task1_2.c中:

(1) 假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地址值是多少?

  答:p的存放地址为2008

(2)假设指针变量q初始值是地址2000,则执行++q后,指针变量q中存放的地址值是多少?

  答:q的存放地址为2002

3.都是对指针变量做++操作,为什么结果有差别?

  答:还是因为指针的赋值格式不一样呗

task3_1.c

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 int main()
 5 {
 6 char s1[] = "C, I love u.";
 7 char s2[] = "C, I hate u.";
 8 char tmp[N];
 9 printf("sizeof(s1) vs. strlen(s1): \n");
10 printf("sizeof(s1) = %d\n", sizeof(s1));
11 printf("strlen(s1) = %d\n", strlen(s1));
12 printf("\nbefore swap: \n");
13 printf("s1: %s\n", s1);
14 printf("s2: %s\n", s2);
15 printf("\nswapping...\n");
16 strcpy(tmp, s1);
17 strcpy(s1, s2);
18 strcpy(s2, tmp);
19 printf("\nafter swap: \n");
20 printf("s1: %s\n", s1);
21 printf("s2: %s\n", s2);
22 return 0;
23 }

附图:

问题1:数组s1的大小是多少?sizeof(s1)计算的是什么?strlen(s1)统计的是什么?

答:13;数组s1的大小;/n之前的的s1所含的元素数

问题2:line7代码,能否替换成以下写法? 问题3:line20-22执行后,字符数组s1和s2中的内容是否交换?

答:不能替换;可以交换

task3_2.c

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 int main()
 5 {
 6 char *s1 = "C, I love u.";
 7 char *s2 = "C, I hate u.";
 8 char *tmp;
 9 printf("sizeof(s1) vs. strlen(s1): \n");
10 printf("sizeof(s1) = %d\n", sizeof(s1));
11 printf("strlen(s1) = %d\n", strlen(s1));
12 printf("\nbefore swap: \n");
13 printf("s1: %s\n", s1);
14 printf("s2: %s\n", s2);
15 printf("\nswapping...\n");
16 tmp = s1;
17 s1 = s2;
18 s2 = tmp;
19 printf("\nafter swap: \n");
20 printf("s1: %s\n", s1);
21 printf("s2: %s\n", s2);
22 return 0;
23 }

附图:

问题1:

指针变量s1中存放的是什么?

C,I love u

sizeof(s1)计算的是什么?

s1的地址的位数

strlen(s1)统计的是什么?

s1的终止符之前的位数

问题2:

line7代码能否替换成下面的写法?

答:不能替换

问题3:

line20-line22,交换的是什么?字符串常量"C, I love u."和字符串常量"C, I hate u."在内存 存储单元中有没有交换?

答:交换的是地址

task4.c

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 int check_id(char *str); // 函数声明
 5 int main()
 6 {
 7 char *pid[N] = {"31010120000721656X",
 8 "330106199609203301",
 9 "53010220051126571",
10 "510104199211197977",
11 "53010220051126133Y"};
12 int i;
13 for(i=0; i<N; ++i)
14 if( check_id(pid[i]) ) // 函数调用
15 printf("%s\tTrue\n", pid[i]);
16 else
17 printf("%s\tFalse\n", pid[i]);
18 return 0;
19 }
20 // 函数定义
21 // 功能: 检查指针str指向的身份证号码串形式上是否合法。
22 // 形式合法,返回1,否则,返回0
23 int check_id(char *str)
24 {
25 int i,j;
26 char id[20];
27 for(i=0;i<N;i++)
28 {
29     if(strlen(id)!=18)
30     return 0;
31     for(j=0;j<strlen(id)-1;j++)
32     {
33         switch(id[j]>'0'&&id[j<'9'])
34     {
35         case 1:if(id[17]>'0'&&id[17]<'9'||id[17]=='X')
36         return 1;
37         else
38         return 0;
39         case 0:return 0;}
40     }
41 }
42 }

附图:

ps:有点小问题,但是不知道错在哪里

task5.c

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 int is_palindrome(char *s); // 函数声明
 5 int main()
 6 {
 7 char str[N];
 8 int flag;
 9 printf("Enter a string:\n");
10 gets(str);
11 flag = is_palindrome(str); // 函数调用
12 if (flag)
13 printf("YES\n");
14 else
15 printf("NO\n");
16 return 0;
17 }
18 // 函数定义
19 // 功能:判断s指向的字符串是否是回文串
20 // 如果是,返回1;否则,返回0
21 int is_palindrome(char *s)
22 {
23 int i;
24 for(i=0;i<strlen(s)/2;i++)
25 {
26     if(s[i]!=s[strlen(s)-1-i])
27     {
28         return 0;
29         break;
30     }
31     else
32     return 1;
33 }
34 
35 }

附图*2:

task6.c

 1 #include <stdio.h>
 2 #define N 80
 3 void encoder(char *s); // 函数声明
 4 void decoder(char *s); // 函数声明
 5 int main()
 6 {
 7 char words[N];
 8 printf("输入英文文本: ");
 9 gets(words);
10 printf("编码后的英文文本: ");
11 encoder(words); // 函数调用
12 printf("%s\n", words);
13 printf("对编码后的英文文本解码: ");
14 decoder(words); // 函数调用
15 printf("%s\n", words);
16 return 0;
17 }
18 /*函数定义
19 功能:对s指向的字符串进行编码处理
20 编码规则:
21 对于a~z或A~Z之间的字母字符,用其后的字符替换; 其中,z用a替换,Z用A替换
22 其它非字母字符,保持不变
23 */
24 void encoder(char *s)
25 {
26     int i;
27     for(i=0;s[i]!='\0';i++)
28     {
29         if(s[i]>='a'&&s[i]<'z'||s[i]>='A'&&s[i]<'Z')
30              s[i]=s[i]+1;
31         else if(s[i]='z')
32             s[i]='a';
33         else if(s[i]='Z')
34             s[i]='A';
35     }
36 }
37 /*函数定义
38 功能:对s指向的字符串进行解码处理
39 解码规则:
40 对于a~z或A~Z之间的字母字符,用其前面的字符替换; 其中,a用z替换,A用Z替换
41 其它非字母字符,保持不变
42 */
43 void decoder(char *s)
44 {
45 int i;
46     for(i=0;s[i]!='\0';i++)
47     {
48         if(s[i]>'a'&&s[i]<='z'||s[i]>'A'&&s[i]<='Z')
49              s[i]=s[i]-1;
50         else if(s[i]='a')
51             s[i]='z';
52         else if(s[i]='A')
53             s[i]='Z';
54     }
55 }

附图:

over~

posted @ 2022-06-14 10:06  谢子扬  阅读(29)  评论(4编辑  收藏  举报