实验5

task1.1

task1_1.c

实验5 task1(2)

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];
}
task1_2

实验5 task1(3)

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;
}
task2_1

实验5 task2 (2)

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;
}
task2_2

实验5 task2 (4)

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;
}
task3

实验5 task3

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

实验5 task4

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;
}
task5

实验5 task5

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;
}
taask6

实验5 task6

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';
        }
    }
}
task7

实验5 task7(1)

实验5 task7(2)

实验5 task7(3)

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;
            }
        }
    }
}
task8

实验5 task8.2运行截图

 

posted @ 2025-12-11 19:52  瀮昀  阅读(3)  评论(0)    收藏  举报