C语言程序设计第七次实验报告

fengjing81 2020-06-02

实验项目:8.3.1、8.3.2、8.3.3、8.3.4

姓名:李爽

实验地点:学校

实验时间:2020.6.2


一、实验目的与要求

1、掌握指针的概念和定义方法。
2、掌握指针的操作符和指针的运算。
3、掌握指针与数组的关系。
4、掌握指针与字符串的关系。
5、熟悉指针作为函数的参数及返回指针的函数。
6、了解函数指针。

二、实验内容

实验8.3.1指针基础及指针运算

1、问题的简单描述:分别输出整型变量a,浮点型变量b,初值c=3的值及地址。
2、实验代码:

#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的值*/
	printf("Result:\n");
	printf("%d,%f\n",a,b);
	printf("%d,%f\n",*p,*q);  /*通过指针p和q间接输出a,b的值*/
	printf("The address of a,b:%p,%p\n",&a,&b);
	printf("The address of a,b:%p,%p\n",p,q);   /*输出p和q的值并与上行输出结果进行比较*/
	p=&c;
	printf("c=%d\n",*p);
	printf("The address of c: %x,%x\n",p,&c);  /*输出p的值及c的地址*/
	return 0; 
}

3、问题分析:在输入的时候,数值之间要用空格,否则只能输出第一个数且是浮点型。

实验8.3.2数据交换

1、问题的简单描述:从主函数中分别调用交换函数,打印输出交换后的结果。
2、实验代码:

#include<stdio.h>
void swap1(int x,int y);
void swap2(int *x,int *y);
int main()
{
	int a,b,*t1=&a,*t2=&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(t1,t2);
	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;
 }

3、问题分析:通过理论课学习,我了解了指针交换的方法,但是忘记了指针一定要有指向。在引用swap2()时,其中应填&a,&b 或者定义变量t1,t2,在开头将p=&a,q=&b。

实验8.3.3字符串反转及字符串连接。

1、问题的简单描述:定义函数char *reserve(char *str),通过指针移动的方式将字符串反转。定义函数char *link(char *str1,char *str2),通过指针移动的方式将字符串连接起来。
2、实验代码:

#include<stdio.h>
char *reverse(char *str);
char *link(char *str1,char *str2); 
int main()
{
	char str[30],str1[30],*str2;
	printf("Input reversing charater string:");
	gets(str);
	str2=reverse(str);
	printf("\nOutput reversed character string:");
	puts(str2);
	printf("Input string1:");
	gets(str);
	printf("Input 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; 
}

3、问题描述:通过老师的讲解,还有一些细节问题。在char *link()函数中漏写了*,且函数定义时末尾不加‘;’。

实验8.3.4数组元素奇偶排列

1、问题的简单描述:定义一个整型一维数组,输入任意奇偶数,再定义一个函数,实现数组元素奇数在左,偶数在右的排列。
2、实验代码:

#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!=0)   /*判断*p是否为奇数*/ 
 		     p++;       /*指针向后移动*/ 
 		while(*q%2==0)   /*判断*q是否为偶数*/ 
 		    q--;         /*指针向前移动*/ 
 		if(p>q)
 		    break;
 		temp=*p;
 		*p=*q;
 		*q=temp;
 		p++;q--;       /*指针相向移动*/ 
	 }
 }

3、问题分析:运行时没有结果,在判断奇偶数时,将取余符号%写成了除号/。

三、实验小结

这次实验,老师将8.3.3和8.3.4讲得很细,我又学到了字符串反转和连接,了解了其中的运行轨迹。‘*’在指针中很重要,稍不注意,程序就会出错。本次4个实验有提前预习,所以进行还比较顺利。指针还是很难的,我会多看书复习,理解清楚其中的含义用法。

相关推荐