C语言程序设计(实验七)

C语言程序实验报告
姓名:邹琼
实验地点:学校
实验时间:2020年6月2日
实验项目:
(1)8.3.1 指针基础及指针运算
(2)8.3.2 数据交换
(3)8.3.3 字符串反转及字符串连接
(4)8.3.4 数组元素奇偶排列

一、实验目的

(1)8.3.1 指针基础及指针运算
①加强对指针数据类型的理解;
②熟悉指针的定义、通过指针间接访问变量的方法;
(2)8.3.2 数据交换
①加强对指针类型作为函数参数传递的理解;
②通常将实参传递给形参时,有两种方式,即按值传递和按地址传递,其中指针类型参数即按地址传递;
(3)8.3.3 字符串反转及字符串连接
①加强对字符指针及将指针作为函数的返回类型的理解;
②通过指针对字符串进行操作;
(4)8.3.4 数组元素奇偶排列
①加强对使用指针对数组进行操作的理解;
②通常数组的名称即整个数组的起始存储地址;

二、实验内容

(1)8.3.1 指针基础及指针运算

1.实验代码

#include<stdio.h> 
int main()
{
	int *p,a,c=3;
	float *q,b;
	p=&a;
	q=&b;
	printf("Please Input the Value of a, b:");
	scanf("%d%f",p,q);//使用指针p和q输入a,b的值// 
	getchar();
	printf("Result:\n");
	printf("%d,%f\n",a,b);
	printf("%d,%f\n",*p,*q);//通过指针p和q间接输出a,b的值// 
	printf("The Adress of a, b:%p,%p\n",&a,&b);
	printf("The Adress of a, b:%p,%p\n",p,q);//输出p和q的值并与上行输出结果进行比较// 
	p=&c;
	printf("c=%d\n",*p);
	printf("The Adress of c:%x,%x\n",p,&c);//输出p的值及c的地址// 
	return 0;
}

2.问题的简单描述
①使用指针变量,调用scanf()函数分别输入a和b的值;
②按十六进制方式输出p、q的值及a、b的地址;
③将p指向c,通过p间接访问c的值并输出;
3.问题分析
①在scanf()函数中,自第二个参数开始,必须使用地址或地址变量;
②使用printf()来输出指针,可以使用%p、%x格式符来输出十六进制的地址;
③p、&c是等价的,都是指向变量c的地址;
4.实验结果
C语言程序设计(实验七)

(2)8.3.2 数据交换

1.实验代码

#include<stdio.h>
void swap1(int x, int y);
void swap2(int *x, int *y);
int main()
{
	int a, b;
	printf("Please Input a=:");
	scanf("%d", &a);
	printf("\nb=:");
	scanf("%d", &b);
	swap1(a, b);
	printf("\nAfter Call swap1: a=%d b=%d\n", a, b);
	swap2(&a,&b);//实参传递// 
	printf("\nAfter Call swap2: a=%d b=%d\n", a, b);
	return 0;
}

void swap1(int x, int y)
{
	int temp;
	temp=x;
	x=y;
	y=temp;
}

void swap2(int *x, int *y)
{
	int temp;
	temp=*x;
	*x=*y;
	*y=temp;//交换x,y地址上的值// 
}

2.问题的简单描述
①定义指针类型函数用于a,b值的交换;
②第二个函数实参的传递;
3.问题分析
①定义swap2(int *x, int *y),形参x、y是整型指针变量;
②在swap2函数内将通过引用地址取值方式,实现对a、b的值的交换;
③当使用指针作为形参时,实参必须是地址,也应是数组名;
4.实验结果
C语言程序设计(实验七)

(3)8.3.3 字符串反转及字符串连接

1.实验代码

#include<stdio.h>
#include<conio.h>
char *reverse(char *str);
char *link(char *str1, char *str2);
int main()
{
	char str[30],str1[30],*str2;
	printf("Input Reversing Character String: ");
	gets(str);
	str2=reverse(str);
	printf("\nOutput Reversed Character String: ");
	puts(str2);
	printf("Input String1: ");
	gets(str);
	printf("\nInput String2: ");
	gets(str1);
	str2=link(str,str1);
	puts(str2);
	return 0;
}

char *reverse(char *str)
{
	char *p,*q,temp;
	p=str,q=str;
	while(*p!=‘\0‘)//判断是否到达最后一个字符//
	p++;
	p--;
	while(q<p)
	{
		temp=*q;
		*q=*p;
		*p=temp;
		q++;p--;//指针做相向移动处理// 
	}
     return str;//返回结果// 
}

char *link(char *str1,char *str2)
{
	char *p=str1,*q=str2;
	while(*p!=‘\0‘)
	p++;
	while(*q!=‘\0‘)
	{
	    *p=*q;//q指向的元素赋值给p所指向的元素//
		p++;q++ ;//指针做相应的移动处理// 
	}
	*p=‘\0‘;//令结束字符为空字符// 
	return str1;
}

2.问题的简单描述
①定义一个函数将字符串反转;
②定义一个函数将两个字符串连接起来;
3.问题分析
①字符串反转,需要使用两个指针,一个指向起始字符,另一个指向结束字符,相向移动指针q++;p--;,并交换相应位置的字符;
②第二个函数,需要一个指针移动到第一个字符串的结束字符‘\0‘上,然后将该指针指向第二个字符串,并依次做赋值处理;
③使用返回指针的函数时,在函数最后需要使用return语句返回一个指针值;
4.实验结果
C语言程序设计(实验七)

(4)8.3.4 数组元素奇偶排列

1.实验代码

#include<stdio.h>
#define N 10
void arrsort(int a[], int n);
int main()
{
	int a[N], i;
	for(i=0; i<N; i++)
	scanf("%d", &a[i]);
	arrsort(a, N);
	for(i=0; i<N; i++)
	printf("%d ", a[i]);
}

void arrsort(int a[], int n)
{
	int *p, *q, temp;
	p=a;
	q=a+n-1;
	while(p<q)
	{
		while(*p%2==1)
		p++;
		while(*q%2==0)
		q--;
		if (p>q)
			break;
		  temp=*p;
		  *p=*q;
		  *q=temp;
		  p++;
		  q--;
	}
}

2.问题的简单描述
①定义一个函数,实现数组元素奇数在左,偶数在右的排列;
②奇偶数的条件判断;
③指针的相向移动;
3.问题分析
①定义arrsort()函数,实现奇左偶右;
②需要用到p、q两个指针,p向后移动直到遇到偶数,q向前移动,直到遇到奇数,然后将p、q所指位置的元素进行交换,继续循环;
③一个指向一维数组的指针加1或减1运算将指向数组的下一个元素或前一个元素;
4.实验结果
C语言程序设计(实验七)

三、实验小结

知识点小结:
(1)运算符
①&运算符成为“取地址运算符”;
运算符称为"指针运算符",也称为"间接运算符";
(2)运用指针,
p、*q间接输出a,b的值;
(3)指针类型作为函数参数传递时,当使用指针作为形参,实参必须是地址,也应是数组名;
(4)输入字符串的最后一个字符为\0;
个人心得:
本章实验内容比较少,需要完成的内容做起来也还行。这次的实验也加深了上理论课时的知识点,发现短处也及时弥补了。个人而言,指针这一章相较于前面几章,理解上有点难度,但多看书多体会就还好吧。

相关推荐