实验8指针的应用_第1页
实验8指针的应用_第2页
实验8指针的应用_第3页
实验8指针的应用_第4页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5154357.doc(匡珍春制作)实验八指针的应用( 2 学时)实验前必须做的操作 新建文件夹: 1、先在对应的K:盘上建立一个父文件夹(用来存放本人整个学期的作业),格式为:“专业+班级 +学号 +姓名”,如:航海1091 班、学号为05 的匡珍春同学,其父文件夹名称为:航海 109105 匡珍春 ,然后在此父文件夹下建立子文件夹,名称为:实验 8(用来存放实验8 需要上交的文件)。2、在 E:盘上建立一个以本人姓名为名称的文件夹(本次实验的工作文件夹),例如:匡珍春【实验目的】1、 掌握指针的概念、指针变量定义格式;2、 掌握指针的运算;3、 学会用指针对变量进行操作;4、 掌握指针与数

2、组的关系;5、 了解通过指针操作字符串的方法;6、 了解指针与函数的关系;7、 了解指向指针变量的指针。【实验内容】 实验任务一 :补充完整程序,掌握C 语言中与指针有关的算法。程序填空实例8-1:使用指针把从键盘输入的2个数按从大到小的顺序输出(不改变变量的值) ,请补充完整并上机调试。将填空后完整的程序以文件名为blank8_1.c保存在 实验 8 文件夹里。(需要存盘 )第1页共10页5154357.doc(匡珍春制作)程序填空实例8-2 :输入 10 个整数存入一维数组,再按逆序重新调整该数组中元素的顺序然后再输出。下面给出部分程序的内容,请将程序补充完整,然后上机调试。将填空后完整的

3、程序以文件名为nixu_1.c保存在 实验 8 文件夹里。 (需要存盘 )将填空后完整的程序以文件名为nixu_1.c保存在 实验 8 文件夹里。 (需要存盘 )第2页共10页5154357.doc(匡珍春制作)程序填空实例8-3 :用指针访问简单变量。从键盘输入三个整数,要求设三个指针变量p1,p2,p3,使 p1 指向三个数的最大者,p2 指向次大者,p3 指向最小者,然后按由小到大的顺序输出这三个数。将填空后完整的程序以文件名为blank8_3.c保存在 实验 8 文件夹里。(需要存盘)程序填空实例8-4 :用指针来处理一维数组元素。从键盘上输入若干个字符,以符号“”结束。编一个C程序,

4、统计这些符号的个数( 不包括 ) 存入数组元素a0 ,将这些符号依次存入a1 、a2 、a3 、中。接着利用a0 中存放的字符个数,输出这些字符。将填空后完整的程序以文件名为blank8_4.c保存在实验 8 文件夹里。(需要存盘)【待填充的源程序参考清单】#include <stdio.h>void main( )char a100=0,=a, c;scanf ("%c", &c);while();*pa=c;scanf("%c", &c);printf("nnumber of string: %dnstring:

5、n", a0);for(pa=a+1; pa<=;pa+)printf("%c",*pa);printf("n");第3页共10页5154357.doc(匡珍春制作) 实验任务二 :通过调试和补充实例程序,以达到能正确使用指针变量作为函数的参数进行地址传递的目的。编程实例 8-1:编一个函数 int fun(* char ss) ,它的功能是:把ss字符串中的字符按逆序存放。例如:若输入字符串为 ABCDEFG ,则逆置后的字符串为GFEDCBA 。请勿改动主函数main和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干

6、语句。#include <stdio.h>#include <string.h>#defineM81int fun(char *ss) /* 答题开始 */*答题开始 */void main( ) char *a;printf("nPlease enter a string:");gets(a);fun(a);printf("nThe new string is: %sn", a);将编写好的程序以文件名daoxu.c最终保存在 实验 8 文件夹里。 (需要存盘)编程实例8-2:下面程序用来实现a, b 两个数的交换。#inclu

7、de <stdio.h>void main( ) int a, b, *pa, *pb;printf( “please input two integer numbers: n”);scanf( “%d%d ”, &a, &b);printf( “the values of a and b before exchanging are: n”);printf( “a=%db=%dn ”, a, b);pa=&a; pb=&b;swap(pa, pb);printf( “the values of a and b after exchanging are

8、: n”);printf( “a=%db=%dn ”, a, b);swap(int *p1, int *p2) int *p;*p=*p1;*p1=*p2;*p2=*p;第4页共10页5154357.doc(匡珍春制作)【问题】: 上述程序能否完成两个数互换的目地,为什么?如何改正? 若把 swap 函数改写成如下形式:能否达到此目的,为什么?如何改正。将改正好的程序以文件名swap.c保存在 实验 8 文件夹里。 (需要存盘) 实验任务三 :上机调试 C 语言程序设计上机指导与习题选解P80-82 的程序,并分析程序运行结果。将输入的完成程序依次以文件名8_1_1.c 、 8_1_2.c

9、、 8_1_3.c 、8_1_4.c 、 8_2_1.c 、 8_2_2.c 、8_3_1.c和 8_3_2.c共 8 个.c 程序保存在 实验 8 文件夹里。 (需要存盘) 实验任务四 :通过设计一个实际例子掌握数组、指针和函数的综合编程方法。设计程序实例8-1:打印最高分和学号假设每班人数最多不超过40 人,具体人数由键盘输入,试编程打印最高分及其学号。程序 1用一维数组和指针变量作为函数参数,编程打印某班一门课成绩的最高分及其学号。程序 2用二维数组和指针变量作为函数参数,编程打印3 个班学生(假设每班4 个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。

10、程序 3用指向二维数组第0 行第 0 列元素的指针作为函数参数,编写一个能计算任意m 行 n 列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函数计算3 个班学生(假设每班4 个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。程序 4编写一个计算任意m 行 n 列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函数和动态内存分配方法,计算任意m 个班、每班 n 个学生的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。【思考题】请读者思考: 编写一个能计算任意m 行 n 列的二维数组中的最大值,并指出其所在的行

11、列下标值的函数,能否使用二维数组或者指向二维数组的行指针作为函数参数进行编程实现呢?为什么? 请读者自己分析动态内存分配方法(题目要求中的程序4)和二维数组(题目要求中的程序3)两种编程方法有什么不同?使用动态内存分配方法存储学生成绩与用二维数组存储学生成绩相比,其优点是什么?【说明】:初学者通常都会对指针望而生畏,其实只要从原理上掌握了指针的概念,它就会变得如此简单而易用。首先,指针不过是C 语言提供的一种比较特殊的数据类型而已,定义为指针类型的变量与其它类型的变量相比,主要差别在于指针变量的值是一个内存地址。其次,在C 语言中,指针和数组之间有着密不可分的关系,不带下标的数组名就是一个指针

12、,它代表数组元素的首地址,只要让声明为相同基类型的指针变量指向数组元素的首地址,那么对数组元素的引用,既可以用下标法,也可以用指针法,用指第5页共10页5154357.doc(匡珍春制作)针法存取数组比用数组下标存取数组速度快一些。反之,任何指针变量也可以取下标,可以像对待数组一样来使用。虽然多维数组的地址概念稍微麻烦些,但只要知道它的元素在内存中是如何存放的,使用也就不难了,由于 C 语言中的多维数组都是按列存放的,因此,用指针法引用时,必须知道数组的一行有多长(即列的维数) 。在某种意义上,二维数组类似于一个由指向行数组的指针构成的一维指针数组。多于二维的数组可以通过类似方法进行降维处理。

13、指针的一个重要应用是用指针作函数参数,为函数提供修改调用变元的手段。当指针作函数参数使用时,需要将函数外的某个变量的地址传给函数相应的指针变元,这时,函数内的代码可以通过指针变元改变函数外的这个变量的值。指针的另一个重要应用是同动态内存分配函数联用,使得定义动态数组成为可能。本题程序1 中,用到了一维数组作为函数参数,程序2 用到了指向二维数组的行指针作函数参数,程序 3 用到了指向二维数组的列指针作函数参数,程序4 用到了动态内存分配实现动态数组。【设计程序实例8-1 的参考答案】 :程序 1 参考答案:#include <stdio.h>#define ARR_SIZE 40i

14、nt FindMax(int score, long num, int n, long *pMaxNum);void main()intscoreARR_SIZE, maxScore, n, i;long numARR_SIZE, maxNum;printf("Please enter total number:");scanf("%d", &n);/*从键盘输入学生人数n*/printf("Please enter the number and score:n");for(i=0; i<n; i+)/*分别以长整型和整

15、型格式输入学生的学号和成绩*/scanf("%ld%d", &numi, &scorei);maxScore = FindMax(score, num, n, &maxNum); /* 计算最高分及其学号 */ printf("maxScore = %d, maxNum = %ldn", maxScore, maxNum);/*函数功能:计算最高分及最高分学生的学号函数参数:整型数组score,存储学生的成绩长整型数组 num,存储学生的学号长整型指针变量 pMaxNum ,存储求出来的最高分学生的学号函数返回值:最高分*/int

16、 FindMax(int score, long num, int n, long *pMaxNum)inti;intmaxScore;maxScore = score0;*pMaxNum = num0;/*假设 score0为最高分 */for (i=1; i<n; i+)if (scorei > maxScore)第6页共10页5154357.doc(匡珍春制作)maxScore = scorei;/*记录最高分 */*pMaxNum = numi;/*记录最高分学生的学号numi*/return (maxScore);/*返回最高分 maxScore*/程序运行结果如下:Pl

17、ease enter total number:5Please enter the number and score:99011849901283990138899014879901561maxScore = 88, maxNum = 99013程序 2 参考答案:#include <stdio.h>#define CLASS 3#define STU 4int FindMax(int scoreCLASSSTU, int m, int *pRow, int *pCol); void main()int scoreCLASSSTU, i, j, maxScore, row, col

18、;printf("Please enter score:n");for (i=0; i<CLASS; i+)for (j=0; j<STU; j+)s canf("%d", &scoreij);/*输入学生成绩 */* 计算最高分及其所在班号和学号*/maxScore = FindMax(score, CLASS, &row, &col);printf("maxScore = %d, class = %d, number = %dn",maxScore, row+1, col+1);/*函数功能:

19、计算任意 m行 STU列的二维数组中的最大值、并指出其所在行列下标值函数入口参数:二维整型数组 score ,存储学生的成绩整型变量 m,二维整型数组的行数,代表班级数函数出口参数:整型指针变量 pRow ,指向数组最大值所在的行整型指针变量 pCol ,指向数组最大值所在的列函数返回值: 数组元素的最大值*/int FindMax(int scoreSTU, int m, int *pRow, int *pCol)int i, j, maxScore;maxScore = score00;/*置初值,假设第一个元素值最大*/*pRow = 0;*pCol = 0;第7页共10页5154357

20、.doc(匡珍春制作)for (i = 0; i<m; i+)for (j = 0; j<STU; j+)i f (scoreij > maxScore)maxScore = scoreij;/*记录当前最大值*/*pRow = i;/*记录行下标 */*pCol = j;/*记录列下标 */*if结束 */ /*内层 for结束 */ /*外层 for结束 */return (maxScore);/*返回最大值 */程序 3 参考答案:#include <stdio.h>#define CLASS 3#define STU 4int FindMax(int *p

21、, int m, int n, int *pRow, int *pCol);main()int scoreCLASSSTU, i, j, maxScore, row, col;printf("Please enter score:n");for (i=0; i<CLASS; i+)for (j=0; j<STU; j+)s canf("%d", &scoreij);/*输入学生成绩 */*计算最高分及其所在班号和学号*/maxScore = FindMax(*score, CLASS, STU, &row, &col)

22、;printf("maxScore = %d, class = %d, number = %dn",maxScore, row+1, col+1);/*函数功能: 计算任意 m行n 列的二维数组中的最大值、并指出其所在的行列下标值函数入口参数:整型指针变量 p ,指向一个二维整型数组的第 0 行第 0 列整型变量 m,二维整型数组的行数整型变量 n ,二维整型数组的列数函数出口参数:整型指针变量pRow ,指向数组最大值所在的行整型指针变量 pCol ,指向数组最大值所在的列函数返回值: 数组元素的最大值*/int FindMax(int *p, int m, int n,

23、 int *pRow, int *pCol)int i, j, maxScore;maxScore = p0;/*置初值,假设第一个元素值最大*/*pRow = 0;第8页共10页5154357.doc(匡珍春制作)*pCol = 0;for (i = 0; i<m; i+)for (j = 0; j<n; j+)i f (pi*n+j > maxScore)maxScore = pi*n+j;/*记录当前最大值*/*pRow = i;/*记录行下标 */*pCol = j;/*记录列下标 */*if结束 */ /*内层 for结束 */ /*外层 for结束 */retur

24、n (maxScore);/*返回最大值 */程序运行结果如下:Please enter score:817273646586778891908592max = 92, class = 3, number = 4程序 4 参考答案:#include <stdio.h>#include <stdlib.h>int FindMax(int *p, int m, int n, int *pRow, int *pCol);main()int *pScore, i, j, m, n, maxScore, row, col;printf("Please enter arr

25、ay size m,n:");scanf("%d,%d", &m, &n);/*输入班级数 m和学生数 n*/*申请 m*n 个 sizeof(int)字节的存储空间*/pScore = (int *) calloc(m*n, sizeof (int);if (pScore = NULL)printf("No enough memory!n");exit(0);printf("Please enter the score:n");for (i = 0; i<m; i+)for (j = 0; j<n; j+)s canf("%d", &pScore i*n+j);/*输入学生成绩*/maxScore =FindMax(pScore,3,4,&row,&col); /*调用函数 FindMax*/* 输出最高分 max 及其所在的班级和学号*/printf("maxScore = %d, class = %d, number = %dn",第9页共1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论