void main(void) int a=3,b=4; printf"main函数中,变量a的地址:%d变量b的地址:%dn",&a,&b; printf("调用swap函数交换前:a=%d,b=%dn",a,b); swap(&a,&b): printf"调用swap函数交换后:a=%d,b=%dn",a,b)方 } 【实验任务】 一、程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误。针对指针的概念及基本运算这一部分,主 要有如下问题: 1)不能正确使用&及*运算符: 2)指针作为函数参数时,不能正确地定义形式参数,调用时也不能正确给出实在参数。 针对上面的问题,查找下面程序中存在的问题,并改正调试。 1.打开c:lc-programming\9pg9101.cpp,该程序使用指针变量输入并输出一个整数。程序 中有一个错误,请修改,使程序能正确运行。修改后的程序以pg9101ok.cpp保存。该源程序 内容如下: #include<stdio.h> void main(void) { int i,*p; p=&i; printf("请输入一个整数:")方 scanf("%d",p), printf("你输入的整数为:%dn",p; -172-
void main(void) { int a=3,b=4; printf("main 函数中,变量 a 的地址:%d; 变量 b 的地址:%d\n",&a,&b); printf("调用 swap 函数交换前:a=%d,b=%d\n",a,b); swap(&a,&b); printf("调用 swap 函数交换后:a=%d,b=%d\n",a,b); } 【实验任务】 一、程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误。针对指针的概念及基本运算这一部分,主 要有如下问题: 1) 不能正确使用&及*运算符; 2) 指针作为函数参数时,不能正确地定义形式参数,调用时也不能正确给出实在参数。 针对上面的问题,查找下面程序中存在的问题,并改正调试。 1.打开 c:\c-programming\9\pg9101.cpp,该程序使用指针变量输入并输出一个整数。程序 中有一个错误,请修改,使程序能正确运行。修改后的程序以 pg9101_ok.cpp 保存。该源程序 内容如下: #include<stdio.h> void main(void) { int i,*p; p=&i; printf("请输入一个整数:"); scanf("%d",p); printf("你输入的整数为: %d\n",p); - 172 -
了提示:如何发现问题? 编译、链接该程序,没有错误,可以直接运行。运行时,输入一个数字,例如99,但是 输出的结果却是1245052(不同的电脑上运行时该数字可能有所不同)。从前面的示例程序可 以看到,1245052这样的数字,其实是某个变量的地址(此处为变量i的地址)。而该程序的 目的是要输出刚输入的数字,并非要输出地址。所以在输出时应该使用间接访问运算符*来取 得指针变量p所指向的存储单元的值。 改正程序后的运行结果示例如图9.1.1所示 四"C:\e-programming\9\Debug\pg9I0lok.exe"-回☒ 请输入一个整数:99 你输入的整数为:99 Press any key to continue 图9.1.1pg9101_ok.cpp的运行结果 2.打开c.c-programming\9列pg9102.cpp,该程序定义了一个swap函数,其功能是实现两 个数的交换。在main函数中,输入两个数,然后调用swap函数,再依次输出交换后的这两 个数。程序中有一处错误,请修改,使程序能正确运行。修改后的程序以pg9102ok.cpp保存。 该源程序内容如下: #include <stdio.h> void main(void) int a,b; void swap(int *pl,int *p2); printf("请输入两个整数:")方 scanf("%d%d",&a,&b); swap(a,b); printf("这两个数交换后的值是:%d%dn",a,b), } void swap(int *pl,int *p2) -173-
} 提示:如何发现问题? 编译、链接该程序,没有错误,可以直接运行。运行时,输入一个数字,例如 99,但是 输出的结果却是 1245052(不同的电脑上运行时该数字可能有所不同)。从前面的示例程序可 以看到,1245052 这样的数字,其实是某个变量的地址(此处为变量 i 的地址)。而该程序的 目的是要输出刚输入的数字,并非要输出地址。所以在输出时应该使用间接访问运算符*来取 得指针变量 p 所指向的存储单元的值。 改正程序后的运行结果示例如图 9.1.1 所示 图 9.1.1 pg9101_ok.cpp 的运行结果 2.打开 c:\c-programming\9\pg9102.cpp,该程序定义了一个 swap 函数,其功能是实现两 个数的交换。在 main 函数中,输入两个数,然后调用 swap 函数,再依次输出交换后的这两 个数。程序中有一处错误,请修改,使程序能正确运行。修改后的程序以 pg9102_ok.cpp 保存。 该源程序内容如下: #include <stdio.h> void main(void) { int a,b; void swap(int *p1,int *p2); printf("请输入两个整数:"); scanf("%d%d",&a,&b); swap(a,b); printf("这两个数交换后的值是:%d %d\n",a,b); } void swap(int *p1,int *p2) { - 173 -
int temp; temp=*pl; *pl=*p2; *p2 temp; 了提示:如何发现问题? 编译该程序后,发现有一个错误: error C2664:'swap':cannot convert parameter 1 from'int'to 'int 错误发生在调用swap函数的那一行。 从错误信息可知,swp函数的形式参数是指针,但是调用的时候却用了整数变量作为实 在参数,系统的出错信息指出不能将整数转换为指针。改正的方法是将实在参数改成变量、 b的地址。 改正程序后的运行结果示例如图9.1.2所示。 "C:\c-programming\9叭Debug1pg9102k.exe”-回☒ 输入两个整数:,34 这两个数交换后的值是:43 Press any key to continue 图9.1.2pg9102_ok.cpp的运行结果 二、程序扩展 1.打开c:lc-programming\9pg201.cpp,该程序对输入的2个整数按从大到小的顺序输出。 该源程序内容如下: #include <stdio.h> void main(void) int a.b; void swap(int *pl,int *p2); printf"请输入两个整数:")方 scanf("%d%d",&a,&b); if(a<b)swap(&a,&b)月 -174-
int temp; temp = *p1; *p1 = *p2; *p2 = temp; } 提示:如何发现问题? 编译该程序后,发现有一个错误: error C2664: 'swap' : cannot convert parameter 1 from 'int' to 'int *' 错误发生在调用 swap 函数的那一行。 从错误信息可知,swap 函数的形式参数是指针,但是调用的时候却用了整数变量作为实 在参数,系统的出错信息指出不能将整数转换为指针。改正的方法是将实在参数改成变量 a、 b 的地址。 改正程序后的运行结果示例如图 9.1.2 所示。 图 9.1.2 pg9102_ok.cpp 的运行结果 二、程序扩展 1.打开 c:\c-programming\9\pg9201.cpp,该程序对输入的 2 个整数按从大到小的顺序输出。 该源程序内容如下: #include <stdio.h> void main(void) { int a,b; void swap(int *p1,int *p2); printf("请输入两个整数:"); scanf("%d%d",&a,&b); if (a<b) swap(&a,&b); - 174 -
printf"这两个数从大到小的顺序是:%d%dn",a,b: void swap(int *pl,int *p2) int temp; temp=*pl店 *pl=*p2; *p2 temp; } 要求:修改上面的程序,要求输入3个数,实现从大到小输出这3个数。修改结果源程 序以pg9201la.cpp保存。注意,只需要修改main函数,swap函数不能修改,并要求在main 函数中仍然要调用swap函数。并且,假定3个数输入时的顺序是分别赋值给变量a、b、c, 打印输出时的顺序依然是变量a、b、c。 训练要点:理解并掌握指针作为函数的参数,在此基础上,能够按照修改要求,实现多 次函数调用。 修改后程序的运行结果如图9.1.3所示。 x "C:\c-programming\9\Debug\pg9201a.exe" 回 请输入3个整数:,231 这3个数从大到小的顺序是:321 Press any key to continue 图9.1.3pg9201a.cpp的运行结果 三、程序编写 1.设计一个程序计算输入的两个数的和与差,要求自定义一个函数sum diff(float opl,foat op2,foat*psum,float*pdif),其中opl和op2是输入的两个数,*psum和*pdif是计算得出的 和与差。编写的源程序以pg9301.cpp做文件名保存。 训练要点:使用指针做函数的参数进行编程。 程序运行结果参考示例如图9.1.4所示。 -175-
printf("这两个数从大到小的顺序是:%d %d\n",a,b); } void swap(int *p1,int *p2) { int temp; temp = *p1; *p1 = *p2; *p2 = temp; } 要求:修改上面的程序,要求输入 3 个数,实现从大到小输出这 3 个数。修改结果源程 序以 pg9201a.cpp 保存。注意,只需要修改 main 函数,swap 函数不能修改,并要求在 main 函数中仍然要调用 swap 函数。并且,假定 3 个数输入时的顺序是分别赋值给变量 a、b、c, 打印输出时的顺序依然是变量 a、b、c。 训练要点:理解并掌握指针作为函数的参数,在此基础上,能够按照修改要求,实现多 次函数调用。 修改后程序的运行结果如图 9.1.3 所示。 图 9.1.3 pg9201a.cpp 的运行结果 三、程序编写 1.设计一个程序计算输入的两个数的和与差,要求自定义一个函数 sum_diff(float op1,float op2, float *psum, float *pdiff),其中 op1 和 op2 是输入的两个数,*psum 和*pdiff 是计算得出的 和与差。编写的源程序以 pg9301.cpp 做文件名保存。 训练要点:使用指针做函数的参数进行编程。 程序运行结果参考示例如图 9.1.4 所示。 - 175 -
可"C:\c-progranming\9叭Debug\pgs9301.exe”-曰☒ 请输入两个数:98.662.4 这两个数的和是:161.0;差是:36.28 Press any key to continue 图9.1.4pg9301.cpp的运行结果 2.设计一个程序,输入年份和天数,输出对应的年、月、日。要求设计和调用函数 month day(int year,,int yearday,,int*pmonth,int*pday),其中year是年,yearday是天数,*pmonth 和*pday是计算得出的月和日。例如输入2008和65,输出2008-3-5,即2008年的第65天是 3月5日。编写的源程序以pg9302.cpp做文件名保存。 训练要点:使用指针做函数的参数进行编程。 程序运行结果参考示例如图9.1.5所示。 的"C:\e-programming\9八Debug\pg9302.exe 回☒ 请输人年份和天数:200865 对应的年月白为:28-3-5 Press any key to continue 图9.1.5pg9302.cpp的运行结果 9.2指针与数组 【实验目的】 1.理解指针、地址和数组间的关系: 2.掌握通过指针操作数组元素的方法: 3.掌握数组名作为函数参数的编程方式: 4.掌握通过指针操作字符串的方法: 5.理解指针数组的概念,掌握指针数组的基本应用和编程方法: 6.理解结构指针的概念,掌握结构指针的基本应用和编程方法。 7.理解和掌握指针作为函数返回值的基本应用和编程方法。 【相关知识点】 1.指针、地址和数组间的关系 在定义数组时,编译器必须为数组分配基地址和足够的存储空间,以存储数组的所有元 -176-
图 9.1.4 pg9301.cpp 的运行结果 2.设计一个程序,输入年份和天数,输出对应的年、月、日。要求设计和调用函数 month_day(int year, int yearday, int *pmonth, int *pday),其中 year 是年,yearday 是天数,*pmonth 和*pday 是计算得出的月和日。例如输入 2008 和 65,输出 2008-3-5,即 2008 年的第 65 天是 3 月 5 日。编写的源程序以 pg9302.cpp 做文件名保存。 训练要点:使用指针做函数的参数进行编程。 程序运行结果参考示例如图 9.1.5 所示。 图 9.1.5 pg9302.cpp 的运行结果 9.2 指针与数组 【实验目的】 1. 理解指针、地址和数组间的关系; 2. 掌握通过指针操作数组元素的方法; 3. 掌握数组名作为函数参数的编程方式; 4. 掌握通过指针操作字符串的方法; 5. 理解指针数组的概念,掌握指针数组的基本应用和编程方法; 6. 理解结构指针的概念,掌握结构指针的基本应用和编程方法。 7. 理解和掌握指针作为函数返回值的基本应用和编程方法。 【相关知识点】 1. 指针、地址和数组间的关系 在定义数组时,编译器必须为数组分配基地址和足够的存储空间,以存储数组的所有元 - 176 -