实验5
任务1.1
源代码
#include<stdio.h> #define N 5 void input(int x[],int n); void output(int x[],int n); void find_min_max(int x[],int n,int *pmin,int *pmax); int main(){ int a[N]; int min,max; printf("录入%d个数据:\n",N); input(a,N); printf("数据是:\n"); output(a,N); printf("数据处理...\n",N); find_min_max(a,N,&min,&max); printf("输出结果:\n"); printf("min=%d,max=%d\n",min,max); return 0; } void input(int x[],int n){ int i; for(i=0;i<n;i++) scanf("%d",&x[i]); } void output(int x[],int n){ int i; for(i=0;i<n;i++) printf("%d ",x[i]); printf("\n"); } void find_min_max(int x[],int n,int *pmin,int *pmax){ int i; *pmin=*pmax=x[0]; for(i=0;i<n;i++) if(x[i]<*pmin) *pmin=x[i]; else if(x[i]>*pmax) *pmax=x[i]; }
运行结果
回答问题
问题1:找到输入数据的最大值和最小值
问题2:都指向数组第一个元素
任务1.2
源代码
#include <stdio.h> #define N 5 void input(int x[],int n); void output(int x[],int n); int *find_max(int x[],int n); int main(){ int a[N]; int *pmax; printf("录入%d个数据:\n",N); input(a,N); printf("数据是:\n"); output(a,N); printf("数据处理...\n"); pmax=find_max(a,N); printf("输出结果:\n"); printf("max=%d\n",*pmax); return 0; } void input(int x[],int n){ int i; for(i=0;i<n;i++) scanf("%d",&x[i]); } void output(int x[],int n){ int i; for(i=0;i<n;i++) printf("%d ",x[i]); printf("\n"); } int *find_max(int x[],int n,int *pmin,int *pmax){ int max_index=0; int i; for(i=0;i<n;i++) if(x[i]>x[max_index]) max_index=i; return &x[max_index]; }
运行结果
回答问题
问题1:返回数组中最大值的地址
问题2:可以
任务2.1
源代码
#include<stdio.h> #include<string.h> #define N 80 int main(){ char s1[N]="Learning makes me happy"; char s2[N]="Learning makes me sleepy"; char tmp[N]; printf("sizeo(s1)vs.strlen(s1):\n"); printf("sizeof(s1)=%d\n",sizeof(s1)); printf("strlen(s1)=%d\n",strlen(s1)); printf("\nbefore swap: \n"); printf("s1: %s\n", s1); printf("s2: %s\n", s2); printf("\nswapping...\n"); strcpy(tmp,s1); strcpy(s1,s2); strcpy(s2,tmp); printf("\nafter swap: \n"); printf("s1: %s\n", s1); printf("s2: %s\n", s2); return 0; }
运行结果
回答问题
问题1:80,sizeof(s1) 计算的是数组s1占用的内存,strlen(s1) 统计的是字符串s1的长度
问题2:不能,s1是一个常量指针不能被重新赋值
问题3:是
任务2.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("sizeo(s1)vs.strlen(s1):\n"); printf("sizeof(s1)=%d\n",sizeof(s1)); printf("strlen(s1)=%d\n",strlen(s1)); printf("\nbefore swap: \n"); printf("s1: %s\n", s1); printf("s2: %s\n", s2); printf("\nswapping...\n"); tmp=s1; s1=s2; s2=tmp; printf("\nafter swap: \n"); printf("s1: %s\n", s1); printf("s2: %s\n", s2); return 0; }
运行结果
回答问题
问题1:指针变量s1中存放的是字符串的起始地址,sizeof(s1) 计算的是指针变量本身占用的内存,strlen(s1) 统计的是指针指向的字符串的长度
问题2:能,task2.1中s1是地址常量,不能再次赋值,task2.2中s1是指针变量,指向字符串的起始地址,可以直接赋值
问题3:交换的是地址,字符串在内存中没有交换
任务3
源代码
#include<stdio.h> int main (){ int x[2][4]={{1,9,8,4},{2,0,4,9}}; int i,j; int *ptr1; int(*ptr2)[4]; printf("输出1:使用数组名、下标直接访问二维数组元素\n"); for(i=0;i<2;i++){ for(j=0;j<4;j++) printf("%d ",x[i][j]); printf("\n"); } printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n"); for(ptr1=&x[0][0],i=0;ptr1<&x[0][0]+8;++ptr1,i++){ printf("%d ",*ptr1); if((i+1)%4==0) printf("\n"); } printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n"); for(ptr2=x;ptr2<x+2;++ptr2){ for(j=0;j<4;j++) printf("%d ",*(*ptr2+j)); printf("\n"); } return 0; }
运行结果
回答问题
int (*ptr)[4]; 中,标识符ptr是一个指向包含四个int型元素的数组的指针
int *ptr[4]; 中,标识符ptr是一个数组这个数组包含四个指向int型数据的指针
任务4
源代码
#include<stdio.h> #define N 80 void replace(char *str,char old_char,char new_char); int main(){ char text[N]="Programming is difficult or not,it is a question."; printf("原始文本:\n"); printf("%s\n",text); replace(text,'i','*'); printf("处理后文本:\n"); printf("%s\n",text); return 0; } void replace(char *str,char old_char,char new_char){ int i; while(*str){ if(*str==old_char) *str=new_char; str++; } }
运行结果
回答问题
问题1:将text字符串中的i全部换成*
问题2:可以
任务5
源代码
#include<stdio.h> #define N 80 char *str_trunc(char *str,char x); int main(){ char str[N]; char ch; while(printf("输入字符串:"),gets(str)!=NULL){ printf("输入一个字符:"); ch=getchar(); printf("截断处理...\n"); str_trunc(str,ch); printf("截断处理后的字符串:%s\n\n",str); getchar(); } return 0; } char *str_trunc(char *str,char x){ int t=0; for(str;*str!='\0';str++){ if(*str==x){ *str='\0'; t=1; } if(t==1){ *str='\0'; } } }
运行结果
回答问题
从第二次循环开始还未读取字符串便输出,
用于读取回车键
任务6
源代码
#include<stdio.h> #include<string.h> #define N 5 int check_id(char *str); int main(){ char *pid[N]={"31010120000721656X", "3301061996x0203301", "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){ int i,t=0; if(strlen(str)!=18) return 0; else{ for(i=0;i<17;i++){ if(str[i]>='0'&&str[i]<='9') t++; } if((str[i]>='0'&&str[i]<='9')||str[i]=='X') t++; if(t==18) return 1; else return 0; } }
运行结果
任务7
源代码
#include<stdio.h> #define N 80 void encoder(char *str,int n); void decoder(char *str,int n); int main(){ char words[N]; int n; printf("输入英文文本:"); gets(words); printf("输入n:"); scanf("%d",&n); printf("编码后的英文文本:"); encoder(words,n); printf("%s\n",words); printf("对编码后的英文文本解码:"); decoder(words,n); printf("%s\n",words); return 0; } void encoder(char *str,int n){ int i; for(i=0;i<N;i++){ if(((str[i]>='a')&&(str[i]<='z'))||(str[i]>='A')&&(str[i]<='Z')){ str[i]+=n; if((str[i]>'z')&&(str[i]-n)<='z') str[i]=str[i]-'z'+'a'-1; else if((str[i]>'Z')&&(str[i]-n)<='Z') str[i]=str[i]-'Z'+'A'-1; } } } void decoder(char *str,int n){ int i; for(i=0;i<N;i++){ if(((str[i]>='a')&&(str[i]<='z'))||(str[i]>='A')&&(str[i]<='Z')){ str[i]-=n; if((str[i]<'A')&&(str[i]+n)>='A') str[i]=-'A'+str[i]+'Z'+1; else if((str[i]<'a')&&(str[i]+n)>='a') str[i]=-'a'+str[i]+'z'+1; } } }
运行结果
任务8
源代码
#include <stdio.h> #include<string.h> int main(int argc, char *argv[]) { int i,j; char *t; for(i=1;i<argc;i++) for(j=1;j<argc-i;j++) { if(strcmp(argv[j],argv[j+1])>0) { t=argv[j]; argv[j]=argv[j+1]; argv[j+1]=t; } } for(i=1;i<argc;++i) printf("hello, %s\n", argv[i]); return 0; }
运行结果