实验报告5指针及字符串实验

(1)重点掌握一级指针的定义与使用,会利用一级指针进行间接访问等操作。通过调试器观察分析程序的运行情况,理解指针与指针所指向的内容之间的关系,理解指针间接引用的实质。
(2)综合运用函数、数组和指针的知识,理解函数中指针形式参数的意义,数组名形参实质就是指针形参。通过跟踪调试理解传值与传地址的不同,及指针形参如何改变对应的实参变量。
(3)正确使用字符数组及字符指针处理字符串。
(4)进一步熟悉数组中经典算法的实现,并且能运用到字符串的处理中。
二、实验环境(实验设备)

硬件:  微型计算机

软件: Microsoft Visual C++6.0

三、实验原理及内容
实验题目(1)原样输入实验指导书实验六exp6_1.c源代码。要求:
① 编辑、编译、链接并运行程序,观察运行结果。
② 观察4个用于交换的函数,观察对应的形参与实参,注意正确的调用形式。分析为什么有的能实现实参变量的交换而有的不能。
③ 用F10键单步跟踪程序,运行到函数调用语句时改用F11键,进入被调函数内再用F10键观察每一步程序运行时实参与形参的作用域以及值的变化情况。
实验解答:

#include<stdio.h>
void swap1(int a, int b)
{
	int t = a;
	a = b;
	b = t;
}
void swap2(int* a, int b)
{
	int t = *a;
	*a = b;
	b = t;
}
void swap3(int* a, int *b)
{
	int t = *a;
	*a = *b;
	*b = t;
}
void swap4(int* a, int b)
{
	int* t = a;
	a = b;
	b = t;
}
int main()
{
	int x = 3, y = 5;
	swap1(x, y);
	printf("after swap1,x=%d,y=%d\n", x, y);
	x = 3,y = 5;
	swap2(&x, y);
	printf("after swap1,x=%d,y=%d\n", x, y);
	x = 3, y = 5;
	swap3(&x, &y);
	printf("after swap1,x=%d,y=%d\n", x, y);
	x = 3, y = 5;
	swap4(&x, &y);
	printf("after swap1,x=%d,y=%d\n", x, y);
}

①序的运行结果是:
after swap1,x=3,y=5
after swap1,x=5,y=5
after swap1,x=5,y=3
after swap1,x=3,y=5

② 观察4个用于交换的函数,观察对应的形参与实参,注意正确的调用形式。分析为什么有的能实现实参变量的交换而有的不能,填写下表:原

函数原型对应实参是否实现交换原因分析
void swap1( int a, int b );a b传值交换对应的实参不会发生改变
void swap2( int *a, int b );*a b第一个参数对应传地址,第二个参数对应传值,只有第一个参数会改变第二个参数不变
void swap3( int *a, int *b );*a *b标准形式传地址
void swap4(int *a, int *b );*a *b看起来像传地址实质上没有传,函数swap4中是传值变化

你能得出的结论:

③ 利用F10和F11功能键进行单步跟踪,观察各变量的变化情况,填写下表:

跟踪点实参x的值实参y的值跟踪点形参a的值形参b的值
swap1调用前-858993460-858993460swap1调用初-858993460-858993460
swap1调用后35swap1调用止35
swap 2调用后35swap2调用止35
swap 3调用后53swap3调用止53
swap4调用后35swap4调用止35

实验题目(2)定义一维数组和一级指针double array[10],*p,并依次完成如下功能:
①从键盘读入10个实数,保存到array数组中,通过指针p间接引用所有元素。
②打印这10元素及其对应的地址,通过下标法访问所有的元素。
③分别找出这组数的最大最小值,计算平均值并输出,通过指针p间接引用元素。
④对这10个数自选某种方法进行由小到大的排序,通过指针p间接引用所有元素。
⑤打印排序后数组的所有元素,通过指针p间接引用所有元素。
要求:所有的功能均定义函数,在主函数中进行调用实现,注意参数的正确使用。
实验解答:
① 请写出完整的源程序代码并做适当注释:

#include<stdio.h>
void input(double a[], int n)//从键盘读入10个实数,保存到array数组中,通过指针p间接引用所有元素。
{
	double *p;
	for (p = a;p < a + n;p++)
		scanf_s("%lf", p);
}
void output(double a[], int n)//打印这10元素及其对应的地址,通过下标法访问所有的元素
{
	int i;
	for (i = 0;i < n;i++)
		printf("%5.2f\t%p\n", a[i],a+i);
	
}
double ave(double a[], int n, double* pmax, double* pmin)//分别找出这组数的最大最小值,计算平均值并输出,通过指针p间接引用元素。
{
	int i;
	double s = a[0];
	*pmax = *pmin = a[0];
	for (i = 0;i < 0;i++)
	{
		if (a[i] > *pmax)
			*pmax = a[i];
		else if (a[i] < *pmin)
			*pmin = a[i];
		s += a[i];
	}
	return s / n;
}
void sort(double a[], int n)//对这10个数自选某种方法进行由小到大的排序,通过指针p间接引用所有元素
{
	double* p, * q,t;
	for (p = a;p < a + n - 1;p++)
		for(q = p + 1;q < a + n;q++)
	{
		if (*p > *q)
		{
			t = *p;
			*p = *q;
			*q = t;

		}
	}
}

int main()
{
	double array[10], *p,max,min,average;
	p = array;
	input(p, 10);
		output(p, 10);
		average = ave(p, 10, &max, &min);
		printf("max=%f,min=%f,average=%f\n", max, min, average);
		sort(p, 10);
		output(p, 10);
	return 0;
}

② 运行一次程序,写出你输入的数据,记录程序运行的结果:
1 3 5 6 8 4 2 1 3 9
1.00 010FFA34
3.00 010FFA3C
5.00 010FFA44
6.00 010FFA4C
8.00 010FFA54
4.00 010FFA5C
2.00 010FFA64
1.00 010FFA6C
3.00 010FFA74
9.00 010FFA7C
max=1.000000,min=1.000000,average=0.100000
1.00 010FFA34
1.00 010FFA3C
2.00 010FFA44
3.00 010FFA4C
3.00 010FFA54
4.00 010FFA5C
5.00 010FFA64
6.00 010FFA6C
8.00 010FFA74
9.00 010FFA7C

③ 使用调试器,进行单步或断点跟踪,观察数组某一个特定元素或所有元素在程序运行到某一步的值的情况,或随着程序的运行的变化情况,观察用数组名和指针名分别察看元素有何不同。
比如数组名-9.2559631349317831e+61 指针名有地址0x0055fbac {-9.2559631349317831e+61}

实验题目(3)编写程序,从键盘读入10个字符串,将这10个字符串进行由大到小的排序,并输出排序后的各字符串。要求:读入、输出、排序分别用函数实现。
实验解答:
①请写出源程序并作适当注释

#include<stdio.h>
#include<string.h>
#define N 10
#define MAX_LINE 80
char sort(char name[N][MAX_LINE]);
int main()
{
	int i;
	char name[N][MAX_LINE];
	for (i = 0;i < N;i++)
		scanf("%s", &name[i]);
	sort(name);
	printf("After sorted:\n");
	for (i = 0;i < N;i++)
		printf("%s\n", name[i]);
}
char sort(char name[N][MAX_LINE])
{
	int i, j;
	char temp[MAX_LINE];
	for (i = 0;i < N - 1;i++)
	{
		for (j = 0;j < N - i - 1;j++)
		{
			if ((strcmp(name[j], name[j + 1])) > 0)
			{
				strcpy(temp, name[j]);
				strcpy(name[j], name[j + 1]);
				strcpy(name[j+1],temp);
			}
		}
	}

}

实 验 报 告

②你管理多个字符串选用的是__用二维数组处理字符串_____,这样选择的理由是_______题目需要我们输入10个字符串假设输入的字符串的字符数不超过80_那么就当成二维数组来处理____________,优点是_简单______________________,如果该题目串的数量不是确定的10而是运行时任意读入的一个整数值n,要对n个串进行排序,你认为这种情况下可以改用_________插入排序_____________________________管理这些未知的串。

四、实验小结(包括问题和解决方法、心得体会、意见与建议、实验出错信息及解决方案等)
问题:对F10和F11功能键进行单步跟踪,观察各变量的变化情况还不是很熟悉
解决方法:多次实验,找到联系
心得体会;对与数组的应用还有待加强,对于指针变量的灵活性需要加强把握
实验出错信息:关于vs2019中scanf与scanf_s以及strcpy与strcpy_s的错误
解决方法:更改了系统属性中预处理器定义

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
为了方便,把代码放在Word里面了,每次上机实验的题目代码都在。 第一次: 对如下多项式编写类定义: + + +…+ 其中,n为多项式的次数。完成如下功能: (1) 可存储任意大的多项式(提示:可用动态数组实现)。 (2) 定义构造函数、析构函数、拷贝构造函数。 (3) 包含一个static成员存储定义的多项式的数量。 (4) 定义一个成员函数输出多项式。(可参照-x^4-6x^3+5格式输出) (5) 定义一个成员函数计算多项式的值。 (6) 写main函数测试类的功能。 (7) 采用多文件实现。 考虑:哪些成员函数可以声明为const. 第二次: (8) 重载“+”运算符,实现两个多项式相加。 (9) 重载“-”运算符,实现两个多项式相减。 (10) 重载“*”运算符,实现两个多项式相乘。 (11) 重载“=”运算符,实现两个多项式的赋值运算。 考虑:把其中某个运算符重载为友元函数。 第三次: C++的一般编译器都定义和封装了字符串功能,请模仿定义string类的实现,可以实现并支持如下功能: (1)string s = “吉林大学”; (2)string t = s; (3)string m; m = t; (4)m.legnth() 函数测量字符串的长度 (5)m.cat(string const &)连接字符串 第四次: 我公司为仪器生产企业,目前生产摄像机和行车记录仪两种产品,分别销售给用户。 摄像机包含摄像、图像质量设定、编码算法等属性。 将摄像机增加相应芯片(具有操作菜单、自动拍摄、车速传感器、源代码等功能)后,形成一个行车记录仪。 要求: 设计摄像机类,并请根据下列不同的功能要求,采用不同的继承方式,设计行车记录仪类,并添加测试代码,体验不同继承方式下的成员访问属性。(类设计时可根据需要自行添加数据成员和其他成员函数。) (1) 行车记录仪的芯片可以使用摄像机的摄像、图像质量设定功能。 行车记录仪用户可以操作行车记录仪的操作菜单和摄像机的摄像功能。 (2)行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。 行车记录仪用户仅仅可以操作行车记录仪的操作菜单。 (3) 行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。 行车记录仪用户仅仅可以操作行车记录仪的操作菜单 同时其他公司购买行车记录仪,因该公司也用于销售,不得泄露其全部内容 课后: (1)采用组合方式设计行车记录仪类,增加相应测试代码,体验继承和组合的关系。 (2)分别为继承和组合方式下为各类添加构造函数、析构函数,增加相应测试代码,体验对象的初始化和构造顺序。 (3)将摄像机类和行车记录仪类功能相近的函数(如拍摄、编码等功能函数)设为同名函数,增加相应测试代码,体验同名函数覆盖。 (4)为我公司建立一个多态的产品类层次结构,使用抽象类,测试时,创建一个基类指针的容器,通过基类指针调用虚函数,体验多态。
### 回答1: 这个实验要求我们编写一个函数来计算指针字符串的长度。指针字符串是指使用指针来表示的字符串,也就是以字符数组的形式存储在内存中的字符串。 我们可以使用指针来遍历字符串,每遍历一个字符就将计数器加1,直到遍历完整个字符串。最后返回计数器的值即可。 下面是一个示例代码: ```c #include <stdio.h> int str_len(char *str) { int len = ; while (*str != '\') { len++; str++; } return len; } int main() { char str[] = "hello world"; int len = str_len(str); printf("The length of the string is %d\n", len); return ; } ``` 在上面的代码中,我们定义了一个名为`str_len`的函数,它接受一个指向字符数组的指针作为参数。在函数内部,我们使用一个`while`循环来遍历字符串,每遍历一个字符就将计数器`len`加1。当遍历到字符串的结尾时,也就是遇到了空字符`\`,循环就会停止。最后,函数返回计数器的值。 在`main`函数中,我们定义了一个字符串`str`,并调用`str_len`函数来计算它的长度。最后,我们使用`printf`函数来输出字符串的长度。 希望这个回答能够帮助到你。 ### 回答2: 在C语言中,字符串是用字符数组来存储的,可以使用指针来访问字符串。在本实验中,我们需要计算指针字符串的长度,可以使用指针来实现。 指针字符串的长度可以使用两种方法计算:第一种方法是通过遍历字符串来计算字符串的长度,第二种方法是使用指针计算字符串的长度。 第一种方法需要使用循环来遍历字符串,直到遇到字符串的结尾为止,期间计算每个字符的数量。可以使用while或for循环语句来实现。在循环中,需要使用指针来访问字符串中的每个字符,对指针进行自增操作,然后继续循环,直到指针指向字符串的结尾为止。 第二种方法使用指针计算字符串的长度,需要在指针中存储字符串的起始位置,并使用指针的自增操作逐个访问每个字符,直到访问到字符串的结尾位置。在访问每个字符时,需要记录下来访问字符的数量,最后返回字符数量即为字符串的长度。 在实现过程中,需要注意空指针和非法指针的情况,如果指针为空或指向非法内存地址,程序可能会崩溃或出现不可预期的结果。 在本实验中,可以通过编写一个计算字符串长度的函数来实现计算指针字符串长度,并在主函数中调用该函数测试验证,最终输出计算出的字符串长度。 综上所述,计算指针字符串长度可以通过遍历字符串或使用指针计算两种方法实现,需要注意指针的操作和指针的有效性。 ### 回答3: 在C语言中,我们强烈建议使用指针来处理字符串。因为字符串在C语言中本质上是字符数组,而指针有利于我们可以更快速方便地处理这些数组中的元素。本篇文章将讨论如何使用指针来计算字符串的长度。 在C语言中,字符串通常使用NULL结尾。这意味着在字符串后面,使用'\0'作为结束标志。因此,要计算字符串的长度,只需从第一个字符开始沿着字符串逐个字符遍历,直到遇到'\0'字符为止,即可得到字符串的长度。这里的关键是,要使用指针来遍历字符串。例如,假设有一个指针变量str,指向一个字符串的第一个字符。我们可以使用一个循环来遍历字符串,并在每次迭代中将指针向前移动一个位置,直到我们找到NULL终止符。 下面是一个计算字符串长度的例程: ```c #include <stdio.h> int strlen(char *str) { int count = 0;//用于计算字符串长度的变量 // 循环遍历,直到遇到 NULL 终止符 while (*str != '\0') { count++; str++; } return count; } int main() { char my_str[] = "Hello, World!";//测试用的字符串 // 调用strlen()函数 int length = strlen(my_str); // 输出字符串长度 printf("The length of the string '%s' is %d\n", my_str, length); return 0; } ``` 上述程序的输出为: The length of the string 'Hello, World!' is 13 在上面的代码中,我们使用strlen()函数计算了字符串的长度。其中,变量count用于保存字符串的长度。该函数遍历字符串中的每个字符,然后将count值增加1,直到遇到NULL终止符。此外,由于我们在函数中使用了指针,因此输入字符串的长度不受限制。 总之,使用指针计算字符串长度是一个很有用的技能,可以使我们更高效地处理字符串。如果你是刚学C语言的新手,建议多练习使用指针处理字符串,提高自己的编程技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

` starmultiple `

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值