数组指针和函数综合编程二Word格式文档下载.docx
《数组指针和函数综合编程二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数组指针和函数综合编程二Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
【思考题】请读者思考:
①编写一个能计算任意m行n列的二维数组中的最大值,并指出其所在的行列下标值的函数,能否使用二维数组或者指向二维数组的行指针作为函数参数进行编程实现呢?
为什么?
②请读者自己分析动态内存分配方法(题目要求中的程序4)和二维数组(题目要求中的程序3)两种编程方法有什么不同?
使用动态内存分配方法存储学生成绩与用二维数组存储学生成绩相比,其优点是什么?
三:
程序源代码:
程序1:
#include
#defineSTU40
voidFindmax(floatscore[],longnum[],intn,float*pMaxscore,long*pMaxnum;
main(
{
floatscore[STU],Maxscore;
longnum[STU],Maxnum;
inti,n;
printf("
Pleaseenterthetotalnumber:
"
;
scanf("
%d"
&
n;
Pleaseenterthenumberandscore:
\n"
for(i=0;
i
%ld%f"
num[i],&
score[i];
}
Findmax(score,num,n,&
Maxscore,&
Maxnum;
Maxnum=%ld,Maxscore=%.0f\n"
Maxnum,Maxscore;
voidFindmax(floatscore[],longnum[],intn,float*pMaxscore,long*pMaxnum
inti;
*pMaxnum=num[0];
*pMaxscore=score[0];
for(i=1;
if(score[i]>
*pMaxscore
*pMaxscore=score[i];
*pMaxnum=num[i];
题目2:
#defineCLASS3
#defineSTU4
intFindmax(intscore[][STU],intMaxscore,int*prow,int*pcol;
intscore[CLASS][STU],Maxscore;
inti,j,row,col;
Pleaseenterthescoreoftheclass:
%d\n"
i+1;
for(j=0;
j
score[i][j];
Maxscore=Findmax(score,Maxscore,&
row,&
col;
Maxscore=%d,class=%d,number=%d\n"
Maxscore,row+1,col+1;
intFindmax(intscore[][STU],intMaxscore,int*prow,int*pcol
inti,j;
Maxscore=score[0][0];
*prow=0;
*pcol=0;
if(score[i][j]>
Maxscore
Maxscore=score[i][j];
*prow=i;
*pcol=j;
return(Maxscore;
程序3:
intFindmax(int*p,intm,intn,int*prow,int*pcol;
intscore[CLASS][STU],maxscore,i,j,row,col;
maxscore=Findmax(*score,CLASS,STU,&
maxscore,row+1,col+1;
intFindmax(int*p,intm,intn,int*prow,int*pcol
inti,j,max;
max=p[0];
if(*(p+i*n+j>
max
max=*(p+i*n+j;
return(max;
题目4:
intFindMax(int*p,intm,intn,int*pRow,int*pCol;
intmaxScore,row,col,i,j,m,n,*pScore=NULL;
Pleaseenterthearraysizem,n:
%d,%d"
m,&
pScore=(int*calloc(m*n,sizeof(int;
if(pScore==NULL
Noenoughmemory!
exit(0;
pScore+i*n+j;
maxScore=FindMax(pScore,m,n,&
maxScore,row+1,col+1;
intFindMax(int*p,intm,intn,int*pRow,int*pCol
*pRow=0;
*pCol=0;
*pRow=i;
*pCol=j;
}
四:
运行结果、分析与讨论:
5
100056
200086
300078
400065
500089
Maxnum=5000,Maxscore=89
Pressanykeytocontinue...
1
67877687
2
56788798
3
56764599
程序4中我首先编辑如下
intmaxScore,row,col,i,j,m,n;
int*pScore=NULL;
程序不能正常运行,而当我把程序改成main(
}就可以正常运行,这个原因我还没有琢磨清楚。
希望和老师探讨一下
Maxscore=99,class=3,number=4
请按任意键继续...
67786798
67568767
100786776
Maxscore=100,class=3,number=1
3,4
78675687
56877899
677856100
Maxscore=100,class=3,number=4
思考题1:
如果使用二维数组,则无法直接通过return语句返回三个变量的值,只能返回一个变量(即最大值的数值)的值,故无法实现其实验目的。
而如果使用指向二维数组的行指针作为函数参数进行编程,由于未能返回具体列指针变量的值,导致最多只能输出最大值和相应行的数,故无法实现其实验目的。
思考题2:
程序4与程序3间对于内存的分配存在一定差异。
程序4采用动态内存分配的方法,可以根据需要,动态地对内存进行分配与回收。
而程序3只能预先定义内存分配,显得比较局限。
动态内存分配,在程序执行的过程中动态地分配或者回收存储空间的分配内存,它不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
可以知道使用动态内存分配方法存储学生你成绩与用二维数组存储学生成绩相比:
1、不需要预先分配存储空间;
2、分配的空间可以根据程序的需要扩大或缩小。
五:
实验心得与体会:
这次实验内容上比较多,而且对指针变量的要求也有可更高一步的提升。
但是在编程过程中,我们也应该特别注意到二维数组的地址和指针的关系,这很重要。
特别是对二维数组的行地址与列地址的定义上要注意具体的要求。
此外,动态数组的优越性自己也要清楚,特别是它与静态数组的区别,这对提高程序优越性有很大帮助。
在以后的编程中,尽量优化程序。