while()循环        //while的汉译是  当...的时候

    while(条件语句){

        执行的命令块

    }

for语句

for(初始条件;循环继续的条件;循环每轮要做的条件){


}

***for中的每一个表达式都是可以省略的

for(;条件;)==while(条件)

    for循环像一个计数循环:设定一个计数器,初始化它,

    然后在计数器到达某个值之前,重复执行循环体,

    而每执行一轮循环,计数器值以一定步进进行调整,

    比如加1或者减1

for(i=0;i<5;i=i+1){

    printf("%d",i);

}

##########

for  汉译为 “对于”

for(count=10;count>0;count--)

就读成                :    "对于一开始的count=10,当count>0时,重复做循环体,

        每一轮循环在做完循环体内语句后,使得count--"

    //做求和的程序时,记录结果的变量应该初始化为0,而做求

    循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。

    因此,我们可以把变量i的定义写到for语句里面去

####循环次数

for(i=0;i<n;i++)

    则循环的次数是n,而循环结束以后,i的值是n。循环的控制变量i,

    是选择从0开始还是从1开始,是判断i<n还是判断i<=n,

    对循环的次数,循环结束后的变量的值都有影响

因此 for循环等价于while循环

for(int i=1;i<=n;i++){

    fact *= i;

}

等价于

int i=1;

while (i<=n){

    fact *=i;

    i++;

}

do while循环,while循环的区别

do while

是先进行do里面的命令块 再判断

while

是先判断 再进行{内的命令块

*********        如果有固定次数,用for

*********        如果必须执行一次,用do_while

*********        其他情况用while

########################

bool类型

#include<stdbool.h>

之后就可以使用bool和true,flase

##############################################

逻辑运算

//逻辑运算是对逻辑量进行的运算,结果只有0或1

//逻辑量是关系运算或逻辑运算的结果

!    逻辑非    !a    

&&    逻辑与    a&&b    

||    逻辑或    a||b    

优先级

!>&&>||

####短路

逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算

a==6&&b==1

a==6&&b+=1

对于&&,左边是false时就不做右边了

对于||,左边是true时就不做右边了

注意点

不要把赋值,包括复合赋值组合进表达式!即把&&看做*法,把||看成+法

###########

条件运算符

count=(count>20)?count-10:count

条件 ?条件满足时候的值:条件不满足的值

***条件运算符的优先级高于赋值运算符,但是低于其他运算符

条件运算符是自右向左结合的

*************条件运算符 只做了解

逗号运算符

逗号用来连接两个表达式,并以其右边的表达式的表达式的值作为它的结果。逗号的优先级

是所有的运算符中最低的,所以它两边的表达式会先计算;逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果

i=3+4,5+6;    //返回7    =号的优先级比逗号高

i=(3+4,5+6);    //返回11    先运算()内的命令  逗号运算符是以右边的表达式作为它的结果

*****逗号运算符主要运用到逗号运算符

#############################################################

嵌套的判断

当if的条件满足或者不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句

if(){

    if(){

    }else{

    }

}

***else的匹配

当没加大括号的时候

else总是和最近的的if组合

所以在编写if语句的时候

在if或else后面总是用{}

即使只有一条语句的时候

###################################

2级联合嵌套的判断

if(exp1){

    st1;

}else if(){

    st2;

}else if(){

    .....

}else{

}

####在编写代码时 尽量做到 "单一出口"

#########################################################3

多路分支

switch-case语句

switch (控制表达式){        //控制表达式只能是整数型的结果

case 常量:            //常量可以是常数,也可以是常数计算的表达式

    语句

    ......

case 常量:

    语句

    ......

default:

    ......

}

####break

switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。

分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止

######################################################################

循环的例子

int x;

int ret=0;

scanf("%d",&x);

int t=x;        //计算之前先保存原始的值,后面可能有用

while(x>1){

    x/=2;

    ret++;    

}

printf("log2 of %d is %d",t,ret);

计数循环

int count=100;

while(count>=0){

    count--;

    printf("%d\n",count);

}

printf("发射!\n");

这个循环需要执行几次?

循环停下来的时候,有没有输出最后的0?

循环结束后,count的值是多少?

解决方法——可以进行一个模拟

         如果模拟运行一个很大次数的循环,可以模拟较大的循环次数,然后作出判断

################算平均数##################

让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数

变量——>算法——>流程图——>程序

一个记录读到的整数的变量

平均数怎么算?

只需要每读到一个数,就把它加到一个累加的变量里,到全部数据读完,再拿它去除读到的数的个数就可以了

一个变量记录累加的结果,一个变量记录读到的数的个数

算法

初始化变量sum和count为0;


#include <stdio.h>
int main(){
int number;
double sum=0;
int count=0;
scanf("%d",&number);
while (number !=-1){
sum +=number;
count++;
scanf("%d",&number);
}
printf("%lf\n",sum/count);
return 0;
}

#################################################

猜数游戏

让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉它是大了还是小了,直到用户猜中为止,最后还要告诉用户猜了多少次

#include <stdlib.h>

#include <time.h>

srand(time(0));

int round=rand()%100+1;    //round的范围为 [1,100] 

****随机数

    每次召唤rand()就得到一个随机的整数

**%100

    x%n的结果是[0,n-1]的一个整数

    x%100的结果是[0,99]的一个整数

————100以内的猜数 最多用7次 就可以猜出来



#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int number;
int count=1;
srand(time(0));
int round=rand()%100+1; //round的范围为 [1,100]
scanf("%d",&number);
while(number !=round) {
if(number>round) {
printf("猜大了 false 第%d\n",count);
scanf("%d",&number);
count++;
} else {
printf("猜小了 false 第%d\n",count);
scanf("%d",&number);
count++;
}
}
printf("true 是%d\n 一共猜了%d次",number,count);
}

###############################################################

整数的分解

    一个整数是由1至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算

    对一个整数做%10的操作,就得到它的个位数

    对一个整数做/10的操作,就去掉了它的个位数

    然后再对2的结果做%10,就得到原来数的十位数了

    依次类推

####数的逆序

    输入一个正整数,输出逆序的数

    结尾的0的处理

#include <stdio.h>
int main() {
int x;
scanf("%d",&x);
int digit;
int ret=0;
while(x>0) {
digit=x%10; //用于分解
//printf("%d\n",digit);
ret = ret*10+digit; //将分解的digit组合起来
printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);
x/=10;
}
printf("%d\n",ret);
return 0;
}

******当需要累加一些值的时候,用来记录累加结果的变量应该被初始为:0

######################################################################3

        if语句常见的错误

***忘了大括号    ——永远在if和else后面加上大括号,即使后面只有一条语句

***if后面的分号    ——一定不能在if()后面加分号

***错误使用==和=    ——if只要求()里的值是零或非零,=是赋值运算符,==才是比较等于的意思

***使人困惑的else    ——在if和else之后必须加上大括号形成语句块  大括号内的语句缩进一个tab的位置

################################################################################

循环控制

***素数

*****break & continue

break:跳出循环

continue:跳过循环这一轮剩下的语句进入下一轮

#####################################################################

多重循环

100以内的素数

############for循环与while循环可以替换

嵌套的循环

循环里面还是循环

################################################

离开多重循环

break 和 continue 只能对它所在的那层循环做

1.接力break

    对多重循环可以这样子退出循环

    int exit=0;

    给达标的语句加上一条 exit=1;  的命令

    再给外面的循环加上 if(exit == 1) break;

2.goto

    goto out;        //跳到out: 的地方

***其他地方不要使用goto    


####################################################

循环应用

求和


#include<stdio.h>
int main() {
int n;
int i;
double sum=0.0;
double sign=1.0;
scanf("%d",&n);
for(i=1; i<=n; i++) {
sum +=sign/i; //利用分子来改变+-号
sign=-sign;
}
printf("f(%d)=%lf\n",n,sum);
}


############################

求最大公约数

运用 辗转相除法

1.如果b等于0,计算结束,a就是最大公约数;

2.否则,计算a除以b的余数,让a等于b,而b等于那个余数

3.回到第一步


#include<stdio.h>
int main() {
int a,b;
int t;
scanf("%d %d",&a,&b);
while(b!=0) {
t = a%b; //t相当于一个盒子
a=b;
b=t;
}
printf("gcd=%d\n",a);
}

#####################################################################################

正序分解整数


#include <stdio.h>
int main() {
int x;
scanf("%d",&x);
int mask=1;
int t=x;
while (t>9) {
t/=10;
mask *=10;
}
printf("x=%d,mask=%d\n",x,mask);
do {
int d=x/mask;
printf("%d",d);
if (mask>9) {
printf(" ");
}
x %=mask;
mask /=10;
} while(mask>0);
printf("\n");
}


##########################################################