实验五
任务一
task1_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 max,min; printf("录入%d个数据:\n",N); input(a,N); printf("数据是:\n"); output(a,N); printf("数据处理...\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:将 p_max和p_min改为最小值和最大值(对实参进行操作)
2:都指向数组元素x[0]
task1_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"); 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 i; int max_index=0; for(i=0;i<n;i++) if(x[i]>x[max_index]) max_index=i; return &x[max_index]; }
运行结果:
问题:
1:找到最大值的地址
2:可以
任务2
task2_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 temp[N]; printf("sizeof(s1)vs strlrn(s1):\n"); printf("sizeof(s1)=%d",sizeof(s1)); printf("strlen(s1)=%d",strlen(s1)); printf("\nbefore swap:\n"); printf("s1:%s\n",s1); printf("s2:%s\n",s2); printf("\nswapping...\n"); strcpy(temp,s1); strcpy(s1,s2); strcpy(s2,temp); printf("\nafter swap:\n"); printf("s1:%s\n",s1); printf("s2:%s\n",s2); return 0; }
运行结果:
问题
1:80 数组s1占多少字节 统计数组s1中的除去\0的具体字符数
2:不可以,字符数组除了初始化时无法直接进行赋值
3:交换的
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 *temp; printf("sizeof(s1) vs strlen(s1):\n"); printf("sizeof(s1)=%d\n",sizeof(s1)); printf("strlen(s1)=%d\n",strlen(s1)); printf("\nbefore:\n"); printf("s1:%s\n",s1); printf("s2:%s\n",s2); printf("\nswapping...\n"); temp=s1; s1=s2; s2=temp; printf("\nafter swap:\n"); printf("s1:%s\n",s1); printf("s2:%s\n",s2); return 0; }
运行结果:
问题:
1:字符串"Learning makes me happy"的字符的首地址,计算的是指针变量s1所占的字节,统计的是从首地址开始一直到\0之前的字符数
2;可以,task2_1的line6是将字符串整个输送到字符数组中,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<2;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; }
运行结果:
任务4
源代码:
#include<stdio.h> #define N 80 void replace(char *str,char old_char,char new_char); int main(){ char text[N]="Programing 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:将旧字符用新字符来代替
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 c) { int i=0; while(*(str+i)!=c) { i++; } *(str+i)='\0'; return str; }
运行结果:
问题:
如果删去,后续就无法输入字符串,起到吞没回车的作用
任务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\tTrue\n", pid[i]); else printf("%s\tFalse\n", pid[i]); return 0; } // 函数定义 // 功能: 检查指针str指向的身份证号码串形式上是否合法 // 形式合法,返回1,否则,返回0 int check_id(char *str) { int i=0; while(*(str+i)) { i++; } if(i!=18) return 0; for(i=0;i<17;i++) { if(!(*(str+i)>='0'&&*(str+i)<='9')) return 0; } if(*(str+i)>='0'&&*(str+i)<='9'||*(str+i)=='X') 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;*(str+i)!=0;i++) { if(*(str+i)>='a'&&*(str+i)<='z'-n||*(str+i)>='A'&&*(str+i)<='Z'-n) *(str+i)+=n; else if(*(str+i)>'z'-n&&*(str+i)<='z'||*(str+i)>'Z'-n&&*(str+i)<='Z') *(str+i)=*(str+i)+n-26; } } void decoder(char *str,int n) { int i; for(i=0;*(str+i)!=0;i++) { if(*(str+i)>='a'+n&&*(str+i)<='z'||*(str+i)>='A'+n&&*(str+i)<='Z') *(str+i)-=n; else if(*(str+i)>='a'&&*(str+i)<'a'+n||*(str+i)>='A'&&*(str+i)<'A'+n) *(str+i)=*(str+i)-n+26; } }
运行结果:
任务8:
源代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, char *argv[]) { int i,j; char *temp=(char*)malloc(10); for(i=0;i<argc-1;i++) for(j=i;j<argc-i-1;j++) if(strcmp(argv[j],argv[j+1])<0) { strcpy(temp,argv[j]); strcpy(argv[j],argv[j+1]); strcpy(argv[j+1],temp); } for(i=1;i<argc;i++) printf("Hellow,%s\n",argv[i]); free(temp); return 0; }
运行结果: