前言
整理代码思路,举一反三..
引入
有如下场景:给形参传值,但不是所有的值都能传
例如:有一张表,记录了学校里六个年级中每个年级的学生人数.编写一个查询函数,int findNumber(int grade);因为int的范围很大,而只需要传入1~6这6个数.
变量回顾
变量是一个代号,需要传入变量的地方,可以传入任意一个值(常量).
int findNumber(int grade)
例如这里的变量类型是int,可以给grade传入的值范围在负21亿多到21亿多.
解决思路
1:在调用端限制输入
输入的数字变量限制在grade>=1或者grade<=6之间
int grade;
while(!(cin>>grade)||grade<1||grade>6){
cout<<"请输入1到6的数字"<<endl;
while(cin.get()!='\n'); //吸收回车符
}
2:不需要返回值时,用bool类型做返回值
----类对象函数有个特点:返回值可以直接写入属性.所以函数可以不用返回值.
以模板类栈为例,入栈push和出栈pop
//伪代码
bool push(T& t){
if(t不在范围之内)
return false;
etc;
return true;
}
//伪代码
bool pop(){
if(不能弹出,如数据结构中元素个数为0)
return false;
etc;
return true;
}
3:需要返回值时,返回值类型用指针
思路是指针是可以赋值0(或者nullptr)的.
以查表为例
int * findNumber(int *result,int grade){
if(grade<1||grade>6)
return 0; //返回空指针,函数结束;
//下一行伪代码
*result=根据grade取到的人数; //得到值
return result; //返回指针
}
============以下为调用函数================
int result;
int *p=findNumber(&result,3); //假设查询3年级人数
//执行完以后result存储查询到的人数,p是指向result的指针
4:需要返回值时,把返回值放进形参里,返回值类型用bool
说明:上一种写法的简化形式
bool findNumber(int *result,int grade){
if(grade<1||grade>6)
return false;
//下一行伪代码
*result=根据grade取到的人数;
return true;
}
============以下为调用函数================
int result;
findNumber(&result,3); //假设查询3年级人数
//执行完以后result存储查询到的人数
//返回值可用作判断,这里没使用
注意:这里需要的返回值result是整型,所以传入整型指针(引用也可以)
当需要的返回值类型是指针时,形参类型应为双重指针int **.
几种方法比较
函数是作为"黑盒"存在的,调用函数方不需要明白里面发生了什么.所以给调用函数方增加限制是不太友好的.因此方法3,4比方法1好.方法2因为在类中的方法,灵活度大一些,类作用域的数据可以随便用. 方法3和方法4比较,方法4更简洁易懂,所以推荐方法4
小结
传值受限函数的编写思路