实验五
TASK 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]); printf("\n"); //2.3 p=x; for(i=0;i<N;++i) printf("%d",*(p+i)); printf("\n"); return 0; }

TASK 2
//使用指针变量访问二维数组元素 #include<stdio.h> int main(){ int x[2][4]={{1,9,8,4},{2,0,4,9}}; int i,j; int *p; int (*q)[4];//指针变量,指向包含4个int型元素的一维数组 //使用数组名和下标访问二维数组元素 for(i=0;i<2;i++){ 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++){//p在数组的起始位置,按内存中的存储形式,输出一个就加一,输出四个就换行 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; }

TASK 3
//对比使用字符数组,字符指针变量处理字符串的区别 //使用字符数组处理字符串 #include<stdio.h> #include<string.h> #define N 80 int main() { char s1[]="xixixixi"; //char s1[]; s1="ixixixi" 不能使用这种写法,因为这是数组,数组名是常量,是不能被改变的,但可以用指针变量 char s2[]="ahahhahaha"; char tmp[N]; printf("sizeof(s1)vs.strlen(s1):\n"); printf("sizeof(s1)=%d\n",sizeof(s1)); printf("strlen(s1)=%d\n",strlen(s1)); //sizeof计算了包括"\0"这个结束标志符,但是strlen只计算了除"\0"以外的有效字符长度 strcpy(tmp,s1); strcpy(s1,s2); strcpy(s2,tmp);//利用函数交换了数组中元素 printf("%s\n%s\n",s1,s2); return 0; }

TASK 4
//用指针变量处理字符串,判断一个字符串是否是回文串 #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)//如果不相同,就是两边开始向中间变 return 0;//提前返回return 0; else{ begin++; end--; } } return 1; }

TASK 5
//使用指针变量处理字符串,去除文本字符中间*号,保留前导*和末尾* #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)//定位到'\0'位置 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';//最后没有'\0',手动加上 }

TASK 6
//使用指针数组对字符串排序 //1.1冒泡排序法 #include<stdio.h> #include<string.h> void sort(char *name[],int n);//函数声明 int main(){ char *course[4]={"haha","xixilahaha","heihei","hohohoho"};//先用指针数组储存字符串 int i; sort(coure,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++){//冒泡排序法,需要排(循环)n-1次,每次需要比较n-1-i[需要减去之前已经比较过的次数,因为前面已经排好了] for(j=0;j<n-1-i;j++)//用j记录的是每次开始比较的,从后往前排,向前移动 if(strcmp(name[j],name[j+1])>0){//用函数来比较字符串的大小,从小到大排序 tmp = name[j]; name[j]=name[j+1]; name[j+1]=tmp; } } }


TASK 7
#include <stdio.h> #include <string.h> #define N 5 int check_id(char *str); // 函数声明 int main() { char *pid[N] = {"31010120000721656X", "330106199609203301", "53010220051126571", "510104199211197977", "53010220051126133Y"}; int i; for (i = 0; i < N; ++i) if (check_id(pid[i])) // 函数调用 printf("%s\tTrue\n", pid[i]); else printf("%s\tFalse\n", pid[i]); return 0; } // 函数定义 // 功能: 检查指针str指向的身份证号码串形式上是否合法。 // 形式合法,返回1,否则,返回0 int check_id(char *str) { int n,i; n=strlen(str); if(n!=18) return 0; while(*str!='\0'){ if(*str<48||(*str>58&&*str!='X')) return 0; *str++; } return 1; }

TASK 8
#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; } void encoder(char *s) { while(*s){ if(*s>=65&&*s<=90||*s>=97&&*s<=122){ *s=*s+1; s++;continue; } else if(*s==90||*s==122){ *s=*s-25; s++;continue; } s++; } return; } void decoder(char *s) { while(*s){ if(*s>=66&&*s<=90||*s>=98&&*s<=122){ *s=*s-1; s++;continue; } else if(*s==65||*s==97){ *s=*s+25; s++;continue; } s++; } return; }


浙公网安备 33010602011771号