实验五

实验任务一

源代码: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");
    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

#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 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.1

image

 1.2

image

 实验问题回答:

1.1

①函数的功能是找到输入的五个数字的最大和最小值

②都指向数组x[0]的地址

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("sizeof(s1) vs. strlen(s1):\n");
    printf("sizeof(s1) = %d\n",sizeof(s1));
    printf("sizeof(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;
}

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("sizeof(s1) vs. strlen(s1):\n");
    printf("sizeof(s1) = %d\n",sizeof(s1));
    printf("sizeof(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;
}

代码运行结果:

2.1

image

 2.2

image

 实验问题回答:

2.1

①大小为80个字节;计算s1所占字节数;统计字符串长度

②不能,定义的s1数组是常量,不能被赋值

③内容交换

2.2

①存放的是“L”的地址;计算的是s1的字节大小;统计的是s1中字符的个数

②可以替换;2.1中使用的是数组的形式,可以存储和读取,2.2里用的是指针,节约内存,只可以读取

③交换的是s1和s2的地址;不交换

实验任务三

源代码:

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

代码运行结果:

image

实验问题回答:

第一个指的是指向有四个元素的一维数组的指针

第二个指的是有四个指针的数组

实验任务四

源代码:

#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 != '\0')
    {
        if(*str == old_char)
        *str = new_char;
        str++;
    }
} 

代码运行结果:

image

 实验问题回答:

①:replace的功能是把文本里的字母“i”换成“*”。

②:可以,对输出没有影响。

实验任务五

源代码:

#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)
{
    char *start = str;
    while(*str != '\0')
    {
        if(*str == x)
        {
                *str = '\0';
                break;
        }
        str++;
    }
    
    return start;
 } 

代码运行结果:

image

实验问题回答:

image

 line18的作用是储存输入的字符串给str

实验任务六

源代码:

#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 length;
    length = strlen(str);
    if(length != 18)
    return 0;
    
    for(int i = 0; i < 17; i++) 
    {
    if(str[i] < '0' || str[i] > '9') 
    return 0;
    }
    
    char end = str[17];
    if(!((end >= '0' && end <= '9') || end == 'X')) 
    return 0; 
    
    return 1;

}

代码运行结果:

image

实验任务七

源代码:

#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)
{
    n = n % 26;
    
    while(*str != '\0')
    {
        if(*str >= 'a'&&*str <= 'z')
        *str = (*str - 'a' + n)%26 + 'a';
        else if(*str >= 'A'&&*str <= 'Z')
        *str = (*str - 'A' + n)%26 + 'A';
        
        str++;
    }
}

void decoder(char *str,int n)
{
    n = n % 26;
    
    while(*str != '\0')
    {
        if(*str >= 'a'&&*str <= 'z')
        *str = (*str - 'a' - n + 26)%26 + 'a';
        else if(*str >= 'A'&&*str <= 'Z')
        *str = (*str - 'A' - n + 26)%26 + 'A';
        
        str++;
    }
}

代码运行结果:

image

 实验任务八

源代码:

#include<stdio.h>
#include <string.h>

void sort(int n,char *s[]);

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 *s[])
{
    int i,j;
    char *tmp;
    
    for(i = 0;i < n-1;++i)
    for(j = 0;j < n-1-i;++j)
    if(strcmp(s[j],s[j+1])>0)
    {
        tmp = s[j];
        s[j] = s[j+1];
        s[j+1] = tmp;
    }
}

代码运行结果:

image

 

posted @ 2025-12-06 15:31  Lantesry  阅读(1)  评论(0)    收藏  举报