在编程的路上前行,便只顾风雨兼程——C++中段反思
1、编程就像蓝天白云晴空万里突然暴风雨,半个学期一晃即逝,在这个路上有欢乐,有收获,也有痛苦无奈和困惑。在这样的路上,蓝天白云晴空万里虽少,但既然选择了远方,便只顾风雨兼程。
经过半个学期的学习,我发现我在函数方面,尤其是在引用调用、一二维数组做函数参数、指针变量做函数参数三个地方把握不好。比如拿到一道要求用指针变量做函数参数的题总是不知道该如何下手(除了很简单1+1那种题),所以一道编程题我总是尽量避开应用函数,这样代码特别复杂冗长,给自己带来麻烦,并让自己都没有了做下去的欲望,而函数却是不得不熟练掌握的基础。经常是函数的形参和实参不知道该如何定义(在数组、指针方面),函数的返回值也是一种困扰。
2、
(1)题目大意:在主函数中输入n个整数到数组中,调用函数(要求被调参数为⑴数组名 ⑵数组元素的个数)完成将数组中的最小值与第0个元素对调,将数组中的最大值与最后一个元素对调,主函数中输出调换后的数组。要求函数用指针变量作形参。
(2)解题思路:定义一个数组a,输入各个元素,调用函数,用指针变量*p做形参指向数组a,在函数中先找到最大最小值,再让指针p指向的数组a第一个和最后一个元素分别与最小最大值交换(用下标表示即可)
(3)代码思路:1定义n,输入n表示有n个元素 2定义数组a,循环输入各个元素 3调用函数swp(n,a) 4sort函数头:void swp(int x, int *p),定义max,min,赋值为数组第一个元素,分别与各个元素对比,较小的赋值给min,较大的赋值给max,从而得到最大最小值。定义中间变量c,d,先分别储存数组a第一和最后一个元素的值,然后把最大最小值分别赋给数组最后和第一个元素的地址,再把c,d的值赋给min,max的地址 5回到主函数,输出排序结果
(4)核心技术总结:指针变量做形参指向数组a,求数组最大最小值,用数组下标交换值
(5)解题过程中存在的问题,以及解决措施:自己编的的代码只完成了令第一个元素和最后一个元素变为最小最大值,但未完成交换。解决:因为我定义了*max,*min指针来完成函数,找出来最大最小值,也让第一第二个元素变为了最小最大值,但因为max,min为地址,无法完成交换,原来函数部分代码如下:
void swp(int *x, int n, int *maxp, int *minp)
{
int *p,*y,t,k;
y=x+n;
*maxp=*minp=*x;
for(p=x+1;p<y;p++)
{
if(*p>*maxp)
{
*maxp=*p;
}
else if(*p<*minp)
{
*minp=*p;
}
}
t=*x;
k=*(x+n-1);
*x=*minp;
*(x+n-1)=*maxp;
*minp=t;
*maxp=k;
}
经过和结队编程的队友的讨论解决了这个问题,改进函数部分代码如下:
void swp(int x, int *p)
{
int max, min, a=0, b=0;
max=p[0];
min=p[0];
for (int i=0; i<x; i++)
{
if (p[i]>max)
{
max=p[i];
a=i;
}
}
for (int i=0; i<x; i++)
{
if (p[i]<min)
{
min=p[i];
b=i;
}
}
int t, s, c;
c=p[0];
t=p[x-1];
p[x-1]=max;
p[a]=t;
p[0]=min;
p[b]=c;
}