实验5
task1.1
task1_1.c
ans1:find_min_max的功能是找到所输入的数字中的最大值和最小值
ans2:pmin指向最小值所对应的地址,pmax指向最大值所对应的地址
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"); 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 i; int max_index=0; for(i=0;i<n;++i){ if(x[i]>x[max_index]){ max_index=i; } } return &x[max_index]; }

ans1:find_max的功能是找到所给数字中最大值,返回值为数组中最大值的地址
ans2:可以运行
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 tmp[N]; printf("sizeof(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; }

ans1:数组s1的大小为80;sizeof(s1)计算的是s1所占字节数的大小,strlen(s1)统计的是s1的长度,即到末尾包含空格所含长度。
ans2:不可以,常量的地址无法直接赋值给数组名称
ans3:进行了交换
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("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; }

ans1:s1存放的是Learning makes me happy的地址,sizeof计算s1所占字节数,strlen统计s1到结束前所含字母长度(包含空格)
ans2:可以,此时是将常量地址赋值给了定义为指针的s1,而上一个则是定义为数组。
ans3:指针的值,而没有在内存中进行交换。
task3
#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:使用指针变量pre1(指向元素)间接访问\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; }

task4
#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++; } }

ans1:用某个别的字母或符号替换字符串中某些字母
ans2:可以
task5
#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){ while(*str!='\0'&&*str!=x){ str++; } if(*str==x){ *str='\0'; } return str; }

ans1:此时仅会出现一次字符串的输入
ans2:getchar()用于读取换行符,从而进行下一次代码的运行,而不是一直无法重新输入新的字符串。
task6
#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; } int check_id(char *str){ int i; int last=str[17]; if(strlen(str)!=18){ return 0; } for(i=0;i<18;++i){ if(i==17){ if(!((last>='0'&&last<='9')||last=='X')){ return 0; } } else{ if(!(str[i]>='0'&&str[i]<='9')){ return 0; } } } return 1; }

task7
#include <stdio.h> #include <string.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<strlen(str);++i){ if(str[i]>='a'&&str[i]<='z'){ str[i]=(str[i]-'a'+n)%26+'a'; } else if(str[i]>='A'&&str[i]<='Z'){ str[i]=(str[i]-'A'+n)%26+'A'; } } } void decoder(char *str,int n){ int i; for(i=0;i<strlen(str);++i){ if(str[i]>='a'&&str[i]<='z'){ str[i]=(str[i]-'a'-n+26)%26+'a'; } else if(str[i]>='A'&&str[i]<='Z'){ str[i]=(str[i]-'A'-n+26)%26+'A'; } } }



task8
#include <stdio.h> #include <string.h> void sort(int n,char *t[]); int main(int argc, char *argv[]) { int i; sort(argc-1,argv+1); for(i = 1; i < argc; ++i) printf("hello, %s\n", argv[i]); return 0; } void sort(int n,char *t[]){ int i,j; char *temp; for(i=0;i<n;++i){ for(j=0;j<n-1-i;++j){ if(strcmp(t[j],t[j+1])>0){ temp=t[j]; t[j]=t[j+1]; t[j+1]=temp; } } } }

浙公网安备 33010602011771号