实验5

实验任务1:
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 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];
	}
}
Q1:功能是找出这一系列数的最大最小值; Q2:line45时同时指向数组起始位置的地址,即第一个数据x[0]

屏幕截图 2025-12-11 161217
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[N],int n)
{
	int i;
	
	for(i = 0;i<n;i++)
	{
		scanf("%d",&x[i]);
	}
}

void output(int x[N],int n)
{
	int i;
	for(i = 0;i<n;i++)
	{
		printf("%d",x[i]);
	}
	printf("\n");
}

int *find_max(int x[N],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];
}

Q1:功能是找到最大值,返回的是最大值所存放的地址; Q2:可以

实验任务2:
task2.1:

点击查看代码
#include <stdio.h>
#define N 80
#include <string.h>
int main()
{
	char s1[N] = "Learning makes me happy";
	char s2[N] = "Learning makes me sleepy";
	char tmp[N];
	
	printf("sizeof(s1) vx. 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;
 } 

屏幕截图 2025-12-11 165135
Q1:大小80;sizeof为占用的字节数;strlen为字符长度;
Q2:不能,这样写不符合语法规则。s1为数组名,在这里他是一个数组的起始地址,并不是变量,初始化没有意义,因此不能;
Q3:执行后就交换了;

task2.2:

点击查看代码
#include <stdio.h>
#define N 80
#include <string.h>
int main()
{
	char *s1 = "Learning makes me happy";
	char *s2 = "Learning makes me sleepy";
	char *tmp;
	
	printf("sizeof(s1) vx. 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;
 } 

屏幕截图 2025-12-11 170047
Q1:s1存放的是字符串在内存中的首地址,sizeof计算s1本身作为字符型指针变量所占用的字节,strlen计算占用的长度;
Q2:可以的。2.1是指定义了一个存放字符串的s1数组;2.2是定义了一个指针s1,并且指向了字符串的首地址;
Q3: 交换的是指针指向的地址,但字符串本身在内存的地址不变。

试验任务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;
}

image

实验任务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++;
	}
}

屏幕截图 2025-12-11 192540
Q1:replace作用是及那个一串字符中所有的old_char替换成new_char,其余不变;
Q2:我认为可以。

实验任务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 i;
	for(i = 0;i<N;i++)
	{
		if(*str == x)
		{
			*str = 0;
			return str;
		}
		else
		*str++;
		
	}
}

屏幕截图 2025-12-11 195321
Q1:去掉line18会导致错误,原因是没有用getchar()吃多余的回车

实验任务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;
}

int check_id(char *str)
{
	int i;
	if(strlen(str) != 18)
	return 0;
	for(i = 0;i < 17;i++)
	{
		if(str[i] < '0' || str[i] > '9')
		    return 0;
	}
	if(!((str[17] >= '0' && str[17]<='9' ) || str[17] == 'X'))
	    return 0;
	    
	return 1;
}

屏幕截图 2025-12-11 204213

实验任务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] = (str[i] -'a' + n)%26 + 'a';
		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 < N;i++)
	{
		if(str[i] >= 'a' && str[i] <= 'z')
	        str[i] = (str[i] - 'a'- n + 26)%26 + 'a';
	    if(str[i] >= 'A' && str[i] <= 'Z')
	        str[i] = (str[i] - 'A' - n + 26)%26 + 'A';
	}
	 

	
}

屏幕截图 2025-12-11 211641

试验任务8:

屏幕截图 2025-12-11 214846

posted @ 2025-12-11 21:49  hhqdream  阅读(8)  评论(0)    收藏  举报