黑马程序员——ios开发基础之C语言程序结构分类与函数
来源:互联网 发布:mac上的svn管理工具 编辑:程序博客网 时间:2024/05/20 20:46
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
第一讲 程序结构分类
一、顺序结构
最简单的C语言程序,从上到下依次执行语句,程序默认的也是顺序结构。简单顺序机构设计举例:
//从键盘接收一个大写字母,输出其小写形式 #include<stdio.h> int main(){ char c1,c2; printf("请输入要转换的大写字母\n"); c1 = getchar(); printf("%c,%d\n",c1,c1);//打印大写字母和ASCII值 c2 = c1 +32;//ASCII值加32,转换成小写字母ASCII值 printf("%c,%d\n",c2,c2);//输出小写字符形式和ASCII值 return 0; }
二、分支结构
1)if语句分支结构
1.1 if语句的三种形式
第一种:if(表达式)语句
例如 if(x>y)printf("%d",x);
第二种:if(表达式)语句1 else 语句2
例如 if(x>y)
printf("%d",x);
else
printf("%d",y);
第三种:if(表达式1)语句1 例如 if(num>500) cost = 0.15;
else if(表达式2)语句2 else if(num>300) cost = 0.10;
else if (表达式3)语句3 else if(num>100) cost = 0.075;
┇ else if(num>50) cost = 0.05;
else if (表达式n)语句n else cost=0;
else 语句m
1.2 if语句的嵌套
在if语句中包含一个或多个if语句称为if语句的嵌套
if(){
if()语句1
else 语句2
}else{
if()语句1
else 语句2
}
if程序应用举例:
//输入三个数,按由小到大输出 #include<stdio.h> int main(){ float a, b ,c ,t; printf("请输入三个实数:\n"); scanf("%f,%f,%f",&a,&b,&c); if(a>b){ t = a; a = b; /*如果a>b将a和b对换,a是a、b中的小者*/ b = t; } if(a>c){ t = a; a = c; /*如果a>c将a和c互换,a是a、c中的小者,现在也是三者中的最小者*/ c = t; } if(b>c){ t = b; b = c; /*如果b>c将b和c对换,b是b、c中的小者,也是三者中的次小者*/ c = t; } printf("%5.2f,%5.2f,%5.2f\n",a,b,c); return 0; }
1.3 if 注意点
(1) if(1)、 if(-1)、 if(a=5) 永真式 if(0) 永假
(2) if(表达式); 表示判断完了什么都不做
(3) if(表达式) return 0; //程序退出,代码不会再往下执行了
(4) if(表达式){int num=10;} printf("%d",num);(错误的)
(5) if(表达式) int num=10; (作用域紊乱)
2)switch语句分支结构
2.1 用于条件判断,当表达是的结果有多种情况,用switch比较方便一些
格式:
switch(表达式){
case 整型常量或者字符常量: 语句;
.....
default:
//如果上面的条件都不满足,执行default
}
计算表达式的值,用这个值和case后的常量进行比较,如果这个值等于了某个常量值,会执行case对应的分支语句,遇到break;才结束,如 果没有遇到break,程序一直会往下执行,直到switch语句结束
格式:
switch(表达式){
case 整型常量或者字符常量: 语句;
.....
default:
//如果上面的条件都不满足,执行default
}
计算表达式的值,用这个值和case后的常量进行比较,如果这个值等于了某个常量值,会执行case对应的分支语句,遇到break;才结束,如 果没有遇到break,程序一直会往下执行,直到switch语句结束
2.2 switch的注意点
1) switch(表达式) 表达式:返回值是整型
2) case 常量 常量:必须是整型的 ,不能是flaoat cast 2.3:可以放常量表达式,但是不允许: a+3
3) 作用域的问题
case 3: {
int num=-1;
}
case 4:printf("%d\n",num); 不允许的
4) case分之语句可以有多句,可以使用大括号,也可以不使用
5)作用域紊乱的问题: case 4:int a=4; (错误的)
1) switch(表达式) 表达式:返回值是整型
2) case 常量 常量:必须是整型的 ,不能是flaoat cast 2.3:可以放常量表达式,但是不允许: a+3
3) 作用域的问题
case 3: {
int num=-1;
}
case 4:printf("%d\n",num); 不允许的
4) case分之语句可以有多句,可以使用大括号,也可以不使用
5)作用域紊乱的问题: case 4:int a=4; (错误的)
2.3 应用举例
//使用Switch实现简单计算器 #include<stdio.h> int main(){ int num1,num2,op,result; printf("请输入第一个数\n"); scanf("%d",&num1); printf("请输入要进行的运算:1 加法 2 减法 3 乘法 4 除法\n"); scanf("%d",&op); printf("请输入第二个数:\n"); scanf("%d",&num2); switch(op){ case 1 : result = num1+num2; break; case 2 : result = num1-num2; break; case 3 : result = num1*num2; break; case 4 : result = num1/num2; break; default : printf("error\n"); break; } printf("计算结果:%d\n",result); return 0;}2.4 case语句穿透问题:判断季节
#include<stdio.h> int main(){ int m; printf("请输入一个月份:\n"); scanf("%d",&m); switch(m){ case 12: case 1 : //case12和case1都被合理的穿透了,余下情况类似 case 2 : printf("冬季\n"); break; case 3 : case 4 : case 5 : printf("春季\n"); break; case 6 : case 7 : case 8 : printf("夏季\n"); break; case 9 : case 10: case 11: printf("秋季\n"); break; default : break; } return 0; }
三、循环结构
1、循环控制
循环是程序语句的一种结构,当条件满足的时候,一直重复执行某一段代码,当条件不满足的时候,需要退出循环。正常情况下,够成循环结构三个要素:
1)循环结束的条件
2)得有循环体
3) 有一个操作可以让循环条件为假
2、 while循环(当型循环: 当 .....满足时候,然后....)
格式:while(表达式){
语句块;
}
计算机首先计算表达式的值,如果表达式的值非0(也就是真),会去执行语句块,执行完语句块以后,继续计算表达式的值,如果表达式的 值非0(也就是真),再继续执行语句块....... 当表达式的值为0(也就是假)的时候,循环结束。
注意:
1)死循环的问题
while(1);
int i=1;
while(i++&&i<=100)sum+=i;
2)作用域
while(a<10){
int num=10;
}
printf("%d",num);(错误的)
3)作用域的紊乱的问题
while(i<10) int num=10; (错误的)
4) 当循环体只有一句语句的时候,是可以省略大括号的
while循环应用:疯狂猜数
#include<stdio.h>int main(){ int inputNum=-1,randomNum=-1,oldNum=0,m=1,n=1000; int flag=1; int count=1;//定义计数变量 int totalCount=10;//定义总的竞猜次数 randomNum=arc4random_uniform(n-m)+m; //随机产生一个m到n之间的随机数 printf("%d\n",randomNum); while(flag){ if(count<totalCount){ printf("请竞猜[%d,%d]之间的一个数,%d次机会:\n",m,n,totalCount); scanf("%d",&inputNum); if(inputNum>randomNum){ printf("上次竞猜:%d本次竞猜:%d\n竞猜结果:猜大了!\n剩余次数:%d\n",oldNum,inputNum,totalCount-count); }else if(inputNum<randomNum){ printf("上次竞猜:%d本次竞猜:%d\n竞猜结果:猜小了!\n剩余次数:%d\n",oldNum,inputNum,totalCount-count); }else{ printf("上次竞猜:%d本次竞猜:%d\n竞猜结果:猜对了!\n",oldNum,inputNum); printf("本次竞猜结束\n"); flag=0; } oldNum=inputNum;//把上一次的竞猜结果保存到oldNum中 count++;//每猜一次计数器+1 }else{ printf("%d次都没有猜中,你的智商不适合玩这个游戏!\n",totalCount); } } return 0;}
3、 do...while循环(直到型循环: .......直到条件为假)
格式:do{
语句块;
}while(表达式);
表述:程序先执行语句块,然后再计算表达式的值,如果表达式的值非0(真) ,再去执行语句块,执行完语句块以后再计算表达式的值,如果 表达式的值非0(真) ........... 直到执行完了以后,发现表达式的值为0,退出循环
注意:
1)当首次执行表达式为真的时候,执行的结果和while一样
2)当首次执行表达式为假的时候, while执行循环体0次,但是dowhile会执行一次
4、 for循环(当型循环)
格式:for(int i=0;i<100;i++){
语句块;
}
注意:
1)int i=0;只会被执行1次
2)当循环体语句只有一句代码,可以省略大括号
3)OC的格式: for(NSString *name in arr){NSLog(@"%@",name);}
4)形式一: int i=0; for(;i<100;i++){}
5)形式二: int i=0; for(;i<100;){ i++;}
6)形式三: int i=0; for(;;){ if(i<100){ break;} i++;}
7)for的死循环 for(;;){ } 这是for的死循环
for循环的嵌套:
for(int k=0;k<5;k++){
for(int i=0;i<5;i++){ //一行 *
printf("* ");
}
}
注意:
1) k的值每变化一次, i从0开始到4循环5次
2)双重循环:外层控制行数,里层控制列数,打印形状
for(int k=0;k<5;k++){
for(int i=0;i<5;i++){ //一行 *
printf("* ");
}
}
注意:
1) k的值每变化一次, i从0开始到4循环5次
2)双重循环:外层控制行数,里层控制列数,打印形状
<pre name="code" class="objc"> //应用举例:for循环打印九九乘法表 #include<stdio.h> int main(){ for(int i=1;i<=9;i++){ //外层循环控制行数 for(int j=1;j<=i;j++){ //里层循环控制列数 printf("%d*%d=%d\n",j,i,j*i); } printf("\n"); } return 0; }
5、 break和continue的使用
1) break和continue都是关键字 2) break用在两个地方:
(1)用在switch中
switch(n){
case 1: printf("xxxx"); break;//表示结束switch语句
}
(2)用在循环中
while(1){
if(i==5){
break; //结束循环
}
}
(3)如果不在循环中 if语句中使用break是没有作用的
3)continue 表示结束本次循环,继续下一次循环
假如循环要执行100次,如果第5次循环的时候遇到了continue,第5次的余下部分不执行了,循环从第6次继续执行
//continue关键字应用举例:输出100~200之间不能被3整除的数 #include<stdio.h> int main(){ for(int i=100;i<200;i++){ if(i%3==0) continue; printf("%d\n",i); } return 0; }
第二讲 函 数
1、函数的概念
完成特定功能的代码段,他也是组成我们C语言源程序的基本单位优点:
1)提高程序的可读性,
2)可以提高开发的效率
3)提高代码重用性
2、函数的定义
格式:返回值 函数名(形参列表){
函数体;
//return
}
4种:
有参无返回值:void test(int x,float y){ }
无参无返回值:void test1(){ }
有参有返回值: int max(int x,int y){ return x>y?x:y; }
无参有返回值: int test2(){ return 10;}
3、函数的参数
1)形参和实参形参: 在定义函数的时候, 函数名后面小括号中的参数 。格式: 数据类型 变量 如:int x;
形参的作用域:只能在本函数中使用
实参:调用函数的时候传递的参数
2)参数的传递的过程
实参的值拷贝一份放到函数形参中
4、函数的返回值
主调函数:A B两个函数 ,如果在A中调用了B,A叫主调函数,B被调函数返回值是被调函数返回给主调函数的值
函数的返回值使用return 关键字进行返回
1) return 0; return (0);
2) return a+b; return a>b?a:b;
3) 如果函数的返回值是 void return ;(程序返回了,不再向下执行)
4) 函数中可以有多个return ,但是只有一个起作用
5、函数的调用
1)函数的声明:类似于变量的使用,我们要使用函数,就应该先定义函数,编译器不知道我们是否已经定义了某个函数,为了防止编译 器编译的时候报错(即函数调用)所以,要告诉编译器,我已经定义了哪些函数
原则:
在调用函数之前,进行该函数的声明
声明的方法:
技巧:复制函数的头部,加上分号,写在调用调用方法之前
int max(int x,int y); //声明
max(56,78); //调用
2)函数的调用
函数名(实参列表);
3)函数的嵌套调用
C语言中函数的定义是平行、独立的,也就是说不能嵌套定义函数,但可以嵌套调用函数,即在调用一个函数的过程中又调用另一函数。
能够进行递归的有两个条件:
1)能够找到让问题的规模缩小的规律
2)能够让递归结束的条件
递归函数的执行有两个阶段:
1)递推阶段:问题规模缩小的过程
2)回归迭代:迭代计算值得过程
递归的优点和缺点:
优点是:遇到问题规模能够缩小,而且有规律的问题的时候,代码比较简洁
缺点:消耗内存
建议:在程序中不能用太多
6、递归函数
在函数中自己调用函数自己能够进行递归的有两个条件:
1)能够找到让问题的规模缩小的规律
2)能够让递归结束的条件
递归函数的执行有两个阶段:
1)递推阶段:问题规模缩小的过程
2)回归迭代:迭代计算值得过程
递归的优点和缺点:
优点是:遇到问题规模能够缩小,而且有规律的问题的时候,代码比较简洁
缺点:消耗内存
建议:在程序中不能用太多
递归函数举例:有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人,他说是10岁。请问第5个人多大?
#include<stdio.h> int main(){ int a; int age(int n); //函数的声明 a=age(5); //函数的调用 printf("%d",a); return 0; } int age(int n){ //求年龄递归的函数 int c; //用c作存放年龄的变量 if(n==1) c=10; //当n=1的时候,年龄为10 else c=age(n-1)+2; //当n>1的时候,这人年龄比前一个大2 return c; //将所求年龄值返回 }
7、static 和 extern关键字使用
1、static 和 extern使用
static : 把一个变量声明为静态变量(内部)
extern : 把一个变量声明为外部变量
1)static 和 extern 对局部变量的作用
static 局部变量:延长局部变量的生命周期
void sum(){
static int a=10;
a++;
}
extern 局部变量:(不能这么用)
2)static 和 extern 对全局变量的作用
main.c 包含了 test.h
test.c static int a = 10;
表示a只能在test.c中使用,表示是一个内部的变量
main.c static int a = 15;
printf("%d\n",a); // 15
test.c int b = 100;
main.c 使用b
(1) 在main.c中声明一个同名的全局变量
int b; 等价于 extern int b;
(2) 在main.c中需要使用 b的之前
extern int b;
3)static 和 extern 对函数的作用
static 修饰函数:内部函数,不能在其他文件中访问
extern 修饰函数:函数定义的时候,默认就是extern 的
test.c extern int sum(int a,int b){ }
main.c extern int sum(int a,int b);
sum(1,2);
static : 把一个变量声明为静态变量(内部)
extern : 把一个变量声明为外部变量
1)static 和 extern 对局部变量的作用
static 局部变量:延长局部变量的生命周期
void sum(){
static int a=10;
a++;
}
extern 局部变量:(不能这么用)
2)static 和 extern 对全局变量的作用
main.c 包含了 test.h
test.c static int a = 10;
表示a只能在test.c中使用,表示是一个内部的变量
main.c static int a = 15;
printf("%d\n",a); // 15
test.c int b = 100;
main.c 使用b
(1) 在main.c中声明一个同名的全局变量
int b; 等价于 extern int b;
(2) 在main.c中需要使用 b的之前
extern int b;
3)static 和 extern 对函数的作用
static 修饰函数:内部函数,不能在其他文件中访问
extern 修饰函数:函数定义的时候,默认就是extern 的
test.c extern int sum(int a,int b){ }
main.c extern int sum(int a,int b);
sum(1,2);
0 0
- 黑马程序员——ios开发基础之C语言程序结构分类与函数
- 黑马程序员——ios开发基础之C语言数据类型、运算符与输入输出
- 黑马程序员——ios开发基础之C语言数组、指针与结构体
- 黑马程序员——ios开发基础之C语言预处理命令与文件操作
- 黑马程序员--iOS--C基础(程序结构)
- 黑马程序员——ios开发基础之C语言之进制转换、位运算与内存管理
- 黑马程序员——IOS基础---C语言学习之函数
- 黑马程序员IOS基础---C语言学习之函数
- 黑马程序员——ios开发基础之C语言概述
- 黑马程序员-IOS开发之--C语言基础一函数,字符串,指针,数组,
- 黑马程序员_iOS开发C语言基础之函数
- 黑马程序员—IOS之C语言基础—循环结构与分支结构
- 黑马程序员—IOS基础之C语言—数组与指针
- 黑马程序员IOS基础---C语言学习之变量与内存及重要的scanf函数
- iOS基础(c)—程序结构的分类
- 黑马程序员——C语言——程序结构
- 黑马程序员——零基础学习iOS开发——04 c语言:基本运算、流程控制、函数
- 黑马程序员——IOS基础之C语言---C语言基础知识介绍
- 软件常用语
- Adapter适配器模式
- C/C++重要知识点总结
- 项目11.5 坐标转换
- 如何选择一个适合自己的开源项目来阅读
- 黑马程序员——ios开发基础之C语言程序结构分类与函数
- AngularJs 表单提交数据不能以key-value 形式传到后台的解决方案
- 软件测试面试题集
- windows mobile 6.5.3 如何精简系统,删除系统内置的电话、Marketplace Messenger、Windows Live等软件[OS开发者]
- [CodeForces 577B]Modulo Sum[实现][数学]
- Linux 的Run level介绍
- uva 12821 Double Shortest Paths
- 每个 Linux 用户都应该知道的命令行技巧
- 高明鑫《最新Android入门课程》课堂笔记一