C程序设计实验报告(八)
•实验项目:
8.3.1 指针基础及指针运算
8.3.2 数据交换
8.3.3 字符串反转及字符串连接
8.3.4 数组元素奇偶排序
•姓名:聂石燕
•实验地点:学校宿舍
•实验时间:2020.06.02
一、实验目的与要求
1、掌握指针的概念和定义方法。
2、掌握指针的操作符和指针的运算。
3、掌握指针与数组的关系。
4、掌握指针与字符串的关系。
5、熟悉指针作为函数的参数及返回指针的函数。
6、了解函数指针。
二、实验内容
♥1、实验练习:8.3.1 指针基础及指针运算
1问题的简单描述:定义整型指针变量p,使之指向整型变量a;定义浮点型指针q,使之指向浮点变量b,同时定义另外一个整型变量c并赋初值3。使用指针p,q输入a,b表达值;通过指针p,q间接输出a,b的值;输出p,q的值及c的地址。
2实验代码:
/*8.3.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的值
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问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
问题:打印结果:输入a、b的值后按回车后无法继续编译运行。
分析:此程序中输入a, b的值时要用逗号隔开。
2、实验练习:8.3.2 数据交换
1问题的简单描述:从主函数中调用swap1和swap2函数,并打印输出交换后a、b的结果。’
2实验代码:
/*8.3.2 数据交换*/
#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地址上的值*/
}
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
问题:无法实现数据的交换。
分析:对swap 1的定义未调用,在主函数中将swap 1 打成了swap l 了。打代码时要仔细一点。
3、实验练习:8.3.3 字符串反转及字符串连接
1问题的简单描述:定义两个字符指针,通过指针移动方式将字符串反转以及将两个字符串连接起来。
2实验代码:
/*8.3.3 字符串反转及字符串连接*/
#include<stdio.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("\nInput string1: ");
gets(str);
printf("Input string2: ");
gets(str1);
str2=link(str,str1);
printf("Link string1 and string2: ");
puts(str2);
return 0;
}
char *reverse(char *str)
{
char *p,*q,temp;
p=str,q=str;
while(*p!='\0') /*判断是否到达最后一个字符*/
p++; /*p++指到最后一个元素*/
p--; /*p--指向倒数第二个字符,'\0'的前一位*/
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所指向的元素*/
q++;
p++;
}
*p='\0'; /*令结束字符为空字符*/
return str1;
}
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
问题:如何实现字符串的反转及两个字符串的连接。
分析:编写函数 *reverse(char *str) 时,p++指到最后一个元素 ;p--指向倒数第二个字符,'\0'的前一位,保证 p 指向有效内容。两个字符串连接的关键是将一个指针移动到第一个字符串的结束字符 ‘\0’ 上,然后将该指针指向第二个字符串,并进行依次赋值处理。
4、实验练习:8.3.4 数组元素奇偶排序
1问题的简单描述:定义一个函数,实现数组元素奇数在左、偶数在右。
2实验代码:
/*8.3.4 数组元素奇偶排序*/
#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问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
问题:1. 无法判断是否为奇偶数 2.打印输出的结果排序后元素的个数与输入的个数不符。
分析:1.判断奇偶数,应该是用 *p%2!=0(奇数)而不是 *p\2!=0 。
2.程序中指针相向移动由 p- -; q++;改为 p++;q- -;
注意:注意用空格来控制输出。
三、实验小结(在本次实验中收获与不足)
本次实验是第8章 指针实验。第八章指针部分相对较难,这章内容与前面数组部分联系起来了,上理论课时有一些地方不太明白。通过此次实验中老师重点给我们讲解了实验8.3.3和8.3.4
加深了我对字符指针和指针数组的掌握。我们写代码的时候一定要仔细,定义的函数与调用时的要一致,不要犯一些低级的错误。