实验五
task1.1
#include <stdio.h> #define N 4 int main() { int x[N] = {1, 9, 8, 4}; int i; int *p; //方式1:通过数组名和下标遍历输出数组元素 for(i = 0; i < N; ++i) printf("%d", x[i]); printf("\n"); //方式2:通过指针变量遍历输出数组元素(写法1) for(p = x; p < x + N; ++p) printf("%d", *p); printf("\n"); //方式2:通过指针变量遍历输出数组元素(写法2) p = x; for(i = 0; i < N; ++i) printf("%d", *(p + i));//指针变量元素的不同表示方式:1、x[i];2、*(x+i);3、*(p + i);4、p[i] printf("\n"); //方式3; 通过指针变量遍历输出数组元素(写法3) p = x; for(i = 0; i < N; ++i) printf("%d", p[i]); printf("\n"); return 0; } //line15-30 通过指针变量间接访问输出数组元素
task1.2
//使用指针变量间接访问二维数组元素 //注意指针变量q和p间接访问输出二维数组元素的语法形式 #include <stdio.h> int main() { int x[2][4] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; int i,j; int *p;//指针变量,存放int类型数据的地址 int (*q)[4];//指针变量,指向包含4个int型元素的一维数组(后面的括号表示个数) //使用数组名、下标访问二维数组元素 for(i = 0; i < 2; ++i)//x[2][4] ;x[i][j] 所以 i < 2; j < 4; { for(j = 0; j < 4; ++j) printf("%d", x[i][j]); printf("\n"); } //使用指针变量p间接访问二维数组元素 for(p = &x[0][0], i = 0; p < &x[0][0] + 8; ++p, ++i)//地址相差8,所以加8 { printf("%d", *p); if((i + 1) % 4 == 0) printf("\n"); } //使用指针变量q间接访问二维数组元素 for(q = x; q < x + 2; ++q) { for(j = 0; j < 4; ++j) printf("%d", *(*q + j)); printf("\n"); } return 0; }
task2.1
//对比使用字符数组、字符指针变量处理字符串的区别 //使用字符数组 #include <stdio.h> #include <string.h> #define N 80 int main() { char s1[] = "Learning makes me happy"; char s2[] = "Learning makes me sleepy"; char tmp[N]; printf("sizeof(s1) vs. strlen(s1): \n");//将两个进行比较 printf("sizeof(s1) = %d\n", sizeof(s1)); printf("srelen(s1) = %d\n", strlen(s2)); printf("\nbefore swap: \n");//输出交换之前的字符串 printf("s1: %s\n", s1); printf("s2: %s\n", s2); printf("\nswapping...\n");//输出swapping strcpy(tmp, s1); strcpy(s1, s2); strcpy(s2, tmp);//tmp约等于是中间变量 printf("\nafter swap: \n"); //输出交换之后 printf("s1: %s\n", s1); printf("s2: %s\n", s2); return 0; }
数组1大小的24
sizeof(s1)操作数存储大小为24
strlen字符串长度
不可以,没有间接访问的符号
交换了
task2.2
//对比使用字符数组、字符指针变量处理字符串的区别 //使用字符指针变量 #include <stdio.h> #include <string.h> #define N 80 int main() { char *s1 = "Learning makes me happy"; char *s2 = "Learning makes me sleepy"; char *tmp; printf("sizeof(s1) vs. strlen(s1): \n");//将两个进行比较 printf("sizeof(s1) = %d\n", sizeof(s1)); printf("srelen(s1) = %d\n", strlen(s2)); printf("\nbefore swap: \n");//输出交换之前的字符串 printf("s1: %s\n", s1); printf("s2: %s\n", s2); printf("\nswapping...\n");//输出swapping strcpy(tmp, s1); strcpy(s1, s2); strcpy(s2, tmp);//tmp约等于是中间变量 printf("\nafter swap: \n"); //输出交换之后 printf("s1: %s\n", s1); printf("s2: %s\n", s2); return 0;
s1存放的是learning makes me happy
sizeof(s1)存储数
strlen(s1)字符串的长度
可以 *s1间接引用了字符串s1
没有交换
task3
//使用指针变量处理字符串,实现字符串复制(strcpy)、链接(strcat)操作 #include <stdio.h> void str_cpy(char *target, const char *source); void str_cat(char *str1, char *str2); int main() { char s1[80], s2[20] = "1984"; str_cpy(s1, s2); puts(s1); str_cat(s1, "Animal Farm"); puts(s1); return 0; } void str_cpy(char *target, const char *source) { while(*target++ = *source++) ; } void str_cat(char *str1, char *str2) { while(*str1) str1++;//让它加加直至相等 while(*str1++ = *str2++) ;//相等时下一行语句直接用; }
task4
//使用指针变量处理字符串,判断一个字符串是否是回文串 #include<stdio.h> #define N 80 int func(char *); int main() { char str[80]; while(gets(str) != NULL)//多组输入 { if (func(str))//如果是回文串 printf("yes\n"); else printf("no\n"); } return 0; } int func(char *str) { char *begin, *end; begin = end = str; while(*end) end++; end--; while(begin < end) { if(*begin != *end)//从第一个和最后一个进行慢慢判断,判断是否一样;依次到第二个和倒数第二个 else { begin++; end--; } } return 1; }
task5
//使用指针变量处理字符串,去除文本字符中间的*号,保留前导*和末尾*号 #include <stdio.h> #define N 80 void func(char *); int main() { char s[N]; while(scanf("%s", s) != EOF) { func(s); puts(s); } return 0; } void func(char *str) { int i; char *p1, *p2, *p; p1 = str; while(*p1 == '*') p1++; p2 = str; while(*p2) p2++; p2--; while(*p2 == '*') p2--; p = str; i = 0; while(p < p1) { str[i] = *p; p++; i++; } while(p <= p2) { if(*p != '*') { str[i] = *p; i++; } p++; } while(*p != '\0') { str[i] = *p; p++; i++; } str[i] = '\0'; }
task6.1
//使用指针数组对字符串排序 //冒泡排序实现 #include <stdio.h> #include <string.h> void sort(char *name[], int n); int main() { char *course[4] = {"C Program", "C++ Object Oriented Program", "Operating System", "Data Structure and Algorithms"}; int i; sort(course, 4); for(i = 0; i < 4; i++ ) printf("%s\n", course[i]); return 0; } void sort(char *name[], int n) { int i,j ; char *tmp; for( i = 0; i < n - 1; ++i) for( j = 0; j < n - 1; ++j) if (strcmp(name[j], name[j + 1]) > 0 ) { tmp = name[j]; name[j] = name[j + 1]; name[j + 1] = tmp; } }
task6.2
//指数数字对字符串排序 //选择排序算法 #include <stdio.h> #include <string.h> void sort(char *name[], int n); int main() { char *course[4] = {"C Program", "C++ Object Oriented Program", "Operating System", "Data Structure and Algorithms"}; int i; sort(course, 4); for(i = 0; i < 4; i++ ) printf("%s\n", course[i]); return 0; } void sort(char *name[], int n) { int i, j, k; char *tmp; for(i = 0; i < n - 1; i++) { k = i; for(j = i + 1; j < n; j++) if(strcmp(name[j], name[k]) < 0) k = j; if( k != i) { tmp = name[i]; name[i] = name[k]; name[k] = tmp; } } }
task7
/*用指针作为函数参数,编写函数check_id 函数功能: 判断一个身份证号号码在形式上是否合法 合法 1 否则 0 在main函数中调用check_id */ /*合法规则 长度不是18位 不合法 除了数字和大写字符X,还包括其他字符 不合法*/ #include <stdio.h> #include <string.h> #define N 5 int check_id(char *str);//函数声明 int main() { char *pid[N] = {"31010120000721656X", "330106199609213301", "53010220051126571", "510104199211197977", "53010220051126133Y", }; int i; for( i = 0; i < N; ++i) if(check_id(pid[i]))//函数声明 printf("%s\tture\n", pid[i]); else printf("%s\tfalse\n", pid[i]); return 0; } int check_id(char *str) { char *p; if(strlen(str) != 18)//判断长度是不是18位 return 0; else { char *p; p = str; while(*p >= '0' && *p <= '9' && *p != '\0' || *p == 'X')//p为0到9的数字且不是空格,或p是X p++; if(*p == '\0')// return 1; else return 0; } }
task8
//编写程序进行加密和解密 #include <stdio.h> #define N 80 void encoder(char *s); void decoder(char *s); int main() { char words[N]; printf("输入英文文本:"); gets(words); printf("编码后的英文文本:"); encoder(words);//调用 printf("%s\n", words); printf("对编码后的英文文本编码:"); decoder(words);//调用 printf("%s\n", words); return 0; } /*函数定义 功能;对s指向的字符串进行编码处理 规则:a~z A~Z 用其后的字符替换 z用a Z用A 非字母符号,不变 */ void encoder(char *s) { char *p; p = s; while(*p) { if(*p >= 'a' && *p <= 'y' || *p >= 'A' && *p <= 'Y') (*p)++; else if (*p == 'z' || *p == 'Z') *p = *p -25; p++; } } /*函数定义 功能;解码 规则;a~z A~Z 用前面的字符替换 a用z A用Z 非字母符号,不变 */ void decoder(char *s) { char *p; p = s; while(*p) { if(*p >= 'b' && *p <= 'z' || *p >= 'B' && *p <= 'Z') (*p)--; else if (*p == 'z' || *p == 'Z') *p = *p + 25; p++; } }