程序设计的结构:
- 顺序结构
程序按照代码的编写方向,从左到右,从上到下执行所有的代码 - 选择结构
程序根据选择结构关键词进行选择执行代码内容。eg:
if(istrue){
}else{
};
switch(char a){
case "1":
break;
default:
break;
}
- 循环结构
- 程序根据循环结构关键词进行选择执行代码内容。eg:
while(istrue){
//先判断是否执行,执行后回到while处重新判断,无循环次数限定
};
do{
//先运行一次后判断是否执行下一次,无循环次数限定
}while(istrue);
for(int i = 0;i<Math.random;i++){
//定义循环标记i,定义循环结束表达式,定义每次循环时标记的增量
//程序的循环内容,该循环有确定的循环次数
}
程序数据存储:
- 单独变量
各种数据类型的变量。eg:int i = 0; char a = A; - 数组
有确定长度的确定类型的单独变量的集合体,数组的内容通过数组的下标来确定,下标从0开始,从左到右顺序增加1,到数组的长度减1为止,假设数组的长度是10,下标则是0-9 - 多维数组
可以理解为多维坐标系,一维的数组根据唯一下标确定值,二维的数组根据两个下标确定一个唯一的值,多维以此类推 - 字符数组
字符串类型的数据存储是用一维字符数组来存储的,所以字符串可以得到长度,可以根据下标获取某个字符
函数:
- 定义函数
嗯,,,,,,就这样吧 - 函数的嵌套调用和递归调用
函数的嵌套调用就是在一个函数中调取了其他的函数,其他的函数又在自身的函数中调取了其他的函数。
函数的递归调用不是很好解释,具体的思想是函数不停地对自身发起调用,在这个过程中, 函数的结果依赖于下一次的调用,直到满足某个条件时,自身的调用停止,获取了结果,然后开始逆推,将结果沿着调用过程一步一步的传递回去,传递到最外层得到最终结果。嗯。。。果然还是举个例子吧。
举个栗子:有a,b,c,d四个人,a比b大2岁,b比c大2岁,c比d大2岁,d今年10岁,问a几岁?
解 答: a = b+2;a的年龄等于b的年龄加2。但是我们不知道b的年龄,所以我们要先求出b的年龄才能知道a的年龄
b = c+2;b的年龄又等于c的年龄加2,但c的年龄我们又不知道,那又得求c的年龄
c = d+10;OK,c的年龄等于d的年龄加2,现在我们知道d的年龄是10,得到c的年龄是12
有了c的年龄,得到b的年龄是14
有了b的年龄,a的年龄我们就得到了,是16
在这个过程中,我们要求a的年龄,要一步一步的求出中间量,在中间量没有求出之前,整个函数都是没有结果的。等我们获得最终的中间量时,我们又一步一步的反着把结果导出去,累积成我们的最终结果,就像走了一个山谷,这种类型的函数,称之为递归函数。这个例子表现在代码中是这样的
int getAge(int i){
int age ; //定义年龄变量
if(i==1){//递归结束标记
age =10;//给年龄赋值
}else{
age = getAge(i-1)+2;//当前年龄等于前一位年龄加2(如第4位的年龄是第三位加2)
}
return age;//返回当前年龄
}
int main(){
int getAge(int i);
getAge(4);
return 0;
}
嗯,可以自己尝试一下结果,我没有写输出语句,自己尝试时记得添加输出语句。递归方法解题的经典例子:Hanoi(汉诺)塔问题,大家可以自行搜索了解。
变量的存储方式和生存期
静态存储:程序运行时不会被销毁(包括静态局部,静态全局)
动态存储:只用被调用时才会被分配存储空间, 调用结束即会销毁(动态局部,寄存器存储)关于寄存器存储,是为了性能提出的,我们把数据存储在内存中,当CPU要使用数据时,需要先去内存中把数据读出来,进行运算, 再把数据写入到内存中。但是如果一个数据在短时间被大量的使用, 内存中的该数据就会被反复的读出写入读出写入,这样会占用一定的时间,为了节省这些时间,我们可以把该数据存储在CPU的寄存器中,这样就免去了反复的读写时间,关键词是register,不过现在的高级语言都会主动去判断某个数据是否被大量使用而自动将该数据定义为寄存器存储,所以现在的高级语言中已经没有了寄存器存储的语法(至少我没见到过),这个概念仅做了解即可。