C语言程序设计第七次实验报告
实验项目: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个实验有提前预习,所以进行还比较顺利。指针还是很难的,我会多看书复习,理解清楚其中的含义用法。