------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);