您的位置:首页 > 编程语言 > C语言/C++

c语言基础语法二——循环控制条件语句(完节)

2016-12-09 12:27 519 查看
前面那篇博客介绍了c语言的一些基本语法,那些可能不能 打出有意思的程序,但是学好这节,那就是很有成就的哦,并且也会激情你对c语言的兴趣的。但是这章还是比较麻烦的,我用我自认为很好的方法介绍这节;

第一篇c语言基础语法博客链接;

http://blog.csdn.net/zw1996/article/details/53314096

这节的两个关键就是;
1;看懂循环,就是看懂是怎么运行的,运行的步骤是怎么的顺序,我下面的程序都会标记出来的;
2;懂得设计,懂得利用控制语句完成一些简单的功能,例如打乘法表,用*打三角形


直接进入主题吧;

ps;下面,

语句的意思就是表达式等有值的;并且后面不需要分号的;

代码块;就是很多c语句(由分号结束的)组成;

这里先说一个小知识点;
就是if,。。。。等下面结束的所以关键词都是默认包含他自己的下一条语句,如果要这个关键词包含多个语句就要使用{
//将这些语句包含起来;
//等下还是举个例子,这个在国二里面还是比较重要的;
}


1;条件语句

//注意条件语句都是执行一次的,不是循环语句,是不是去循环的,执行完一次之后就没了;


缺else的if语句



if else



没有花括号的if else语句,

说明了,if默认包含语句只有一条;

说明else要紧接着if默认语句后(或者是其花括号后)





突然发现有的知识点我到现在为止就写了很多遍了,不过我在后面可能还会继续写,让仔细看的一次就记住这个知识点,这个方法应该不错,毕竟多看几次就熟悉了吗;

if elseif else



来个嵌套的if elseif等等的组合吧;

有分层的;



无分层的;



关于条件语句就到这了,

敲个代码吧;

题目;

y = x 当x<1时;

= 2*x-1 当1=< x < 10时

= 3*x - 11 当x>=10时;

用scanf输入x的值求出y的值;

题目应该看懂了吧,就是x在不同的范围内利用不同的表达式求出y;



#include<stdio.h>
int main()
{
int x,y;
scanf("%d",&x);//输入x ;
if(x<1){
y = x;
printf("%d\n",y);//输出y;
}
else if(x >= 1 && x < 10){//注意这里用到了之前的逻辑运算符 ;
y = 2*x-1;//这里用到了之前的算术运算符;
printf("%d\n",y);
}
else{
y = 3*x-11;
printf("%d\n",y);
}

}


尴尬;写了将近2个小时了;只写完条件语句,不说话了、、、太耗时间了;

2;开关语句;

在条件语句中的if elseif…….else就是实现多路选择的情况,但是在c语言中它特意提供了专门的switch开关语句来处理多路分之的情形;但是在实际应用中尽量还是选择if吧,因为switch有点小麻烦,怕出语法错误,等哈就介绍;

2.1;switch语句的一般格式;

switch(表达式)

{

case 常量表达式 1: 语句组1;break;

case 常量表达式 2: 语句组2;break;

case 常量表达式 3: 语句组3;break;

.

.

.

.

.

case 常量表达式n:语句组n;break;

default:语句组n+1;

}

先介绍一下怎么实现多分支语句吧;

switch里面的表达式的值;

这程序就会跳到那个有相同值的case语句那里去,

——并且在顺序执行;则是执行相应的语句组,

——然后再可能遇到break,则跳出switch语句了,程序运行跳到switch花括号后面;继续执行其他语句;

——但是如果没有遇到break则会继续顺序执行case语句,知道遇到break或者执行到switch的花括号处,则跳出switch,跳到switch后的花括号处执行其他语句了;

但是若没有相同的case语句,则跳到default语句处,执行语句组n+1;

break的作用
break的功能就是是程序控制退出到该结构的花括号之外,


语法需注意地方;

1;一般情况下还是在每条case语句后加上break;

2;注意cese后面接的表达式一定要是常量;(注意)

3;case后面是冒号:

4,default是表示其他情况,当没有case语句想匹配的时候就执行这个语句,注意他可以省略;

练手编程题;

输入一个等级,将其转换成对应的一个百分制的成绩范围,具体转换规则如下:

A为90~100;

B为80~89;

C为70~79;

D为60~69;

E为0~59;

直接利用switch语句做吧?

没有加break时;



没有加default时;



case也是默认一条语句,但是执行完后仍然是顺序执行,因此是否加花括号是一样的道理;



switch就到这了,下面就是进入真正的主题循环语句了;吃早中饭去了。睡到10点多不解释;花了半个小时左右敲完 switch吧;

3;循环语句;

循环结构就是在给定的条件成立时,反复执行的某个程序段。

给定的条件称为循环条件,反复执行的程序段称为循环体;

c语言有三种循环流程控制语句;while语句,do-while语句,for语句;

他们的循环体可以是复合语句,也可以是单一语句;

同样与之前的if…等一样的默认包含一条语句,如果要包括多条,那么则要使用花括号括起来;

3.1;while语句;

while语句 的一般格式;

while(表达式){

循环体;//注意,多条则必须打花括号,因为while只默认包含一条语句;

}

执行过程;
先计算表达式的值,
若表达式为真则进入while循环执行循环体;执行完后再次返回执行表达式;
再计算表达式,如果为真则继续执行循环体;
之后又返回计算表达式的值,若为真则又执行循环体,直达表达式的值为假(也就是0)时才不进入while循环,执行while循环后面的其他语句;
意思就是,只要表达式为真则不断进入while循环执行循环体,直达表达式的值为假才不执行循环体,执行while后面的其他语句,程序运行指针直接到结束花括号后面,




while语句的特点就是,先判断后执行;

因此若当表达式的初值为0时,则表示循环体将一次也不执行;

又强调一遍,若循环体包含一条以上的语句时,必须用{}花括号括起来;否则只默认while后的第一条为循环体,而其余的都是while以后的其他语句了;

//**小程序;编写1到100的和;使用while语句编写;**
#include<stdio.h>
int main()
{
int i = 1;//i初始化为1;则sum先加i,之后i再自增;
int sum = 0;
//注意这里一定要记得初始化;因为后面直接使用的是sum=sum+i;
//直接使用sum,若是没有赋初值的话,则程序会出现混乱,这个再第一篇博客里面说过,
//c语言对于变量的使用一定要先赋值再使用;若是没有赋值直接使用则程序没有完成任务,因为初始值是随机的;

while(i <= 100){//while的表达式;在这里就是控制循环的结束,当i大于100时就结束;
sum += i;//累加;
i++;//i自增,达到1到100的过程
}
//当表达式的值为假后程序才会执行while以后的其他语句;
printf("1+2+3+.......+100 = %d\n", sum);//输出和;

return 0;
}
这样的小程序最好自己可以敲一遍的;


/*
程序功能;输入int型变量n;计算从1的阶乘到n的阶乘之和;
sum  = 1! + 2! + ......  + n!;这就是从1的阶乘到n的阶乘之和;并将其输出;
因为阶乘数可能比较到20几的阶乘就不能再使用int存储了,因此我们的输入不能很大,否则将出现超出存储数据类型的情况;
如果你没有敲过单个n的阶乘;那么可以先敲出n的阶乘,再看看这个例子;
*/
#include<stdio.h>
int main()
{
int n, t, tt, cj;
int sum;
scanf("%d",&n);//输入变量n;
t = 1;//因为要从1的阶乘到n的阶乘;因此将t初始化为1;
sum = 0;//这里是与之前例子同样的道理,计算和,并且要先赋值再使用,则赋值为0;
while(t <= n){
tt = 1;//计算阶乘,阶乘是从1累乘到n因此将tt初始化为1;
cj = 1;//这里与sum初始化一样,因为是累乘,因此要赋初始值为1;
while(tt <= t){//这个while循环的作用就是计算t的阶乘;
cj *= tt;
tt++;
}
sum += cj;//进行累加;
t++;
}
printf("计算从1的阶乘到n的阶乘和 = %d",sum);

return 0;
}


3.2;do-while循环语句;(这种循环语句相对使用得是比较少的,介绍完你就会感觉的,个人认为这个用得比较少,但是国二选择题还是比较喜欢出的;因此还是要掌握;)

do-while循环语句的一般格式;

do{

循环体;

}while(表达式);

//**do-while语句的执行过程;**
首先先执行一遍循环体,然后到达while表达式,
再判断表达式的值,若为真则返回上面继续执行循环体;然后再计算表达式的值;若为真则继续返回执行循环体;直到表达式的值为假,才不返回执行循环体而是跳出do-while循环,执行下面的语句;


同样在这里仍然要注意do后面默认的循环体仍然是默认一条语句,因此要包含多条则要使用花括号,并且最好使用花括号;



其特点;

do-while语句,先是执行一遍循环体,然后在计算表达式的值,因此至少会执行一次循环体的;

说明;
1;do-while语句由do开始,用while结束,并且while语句后面的分号不能缺少;
2;do-while语句和while语句都能实现循环控制的功能的,do-while结构的程序都可以转化为while结构程序,但                 是while结构程序就不一定可以转化为do-while结构;
3;循环语句只能是一条,若是要使用多条则必须使用花括号;


//do-while和while;
1;两者都是只有将循环条件为真时才执行循环体;
2;do-while一定会执行一次循环体,
3;do-while是先执行循环体再判断;
while是先判断再看是否执行循环体;


/*
程序目的;完成逆序输出;
输入一个整形数n,然后逆序输出来来
例如;输出n等于1234;则需输出4321;

*/
#include<stdio.h>
int main()
{
int s, n;
s = 0;//这个初始化为0,与之前一样;因为是累加,并且要先初始化再使用;
scanf("%d",&n);
do{
s = s*10+n%10; //这两个步骤看不懂可以在纸上模拟一遍;
//注意这个是需要知道的,国二的时候是需要编写这两步的因此需要知道
n /= 10;
}while(n);//判断条件,当n等于0时则跳出来;
printf("其逆序数为 = %d\n",s);

return 0;
}
/*
注意do-while编程可以不需要了解,但是需要看懂,知道程序是怎么运行的;
但是这个程序中的循环体一定需要知道的,因为这个经常使用到,
你可以使用while编写一下这个程序;

*/


3.3;for循环语句;(注意这个是最常使用的一种循环语句)其余两种循环结构都可以使用这种来完成

for语句是c语言所提供的功能更强,使用更广泛的一种循环语句;

for语句的一般格式;

for(表达式1;表达式2;表达式3){

循环体;//同样注意for语句默认包含一条语句;若是循环体是多条则必须使用花括号;

}



注意for循环等效为while结构就是;

表达式1;

while(表达式2){

循环体;

表达式3;

}

是不是也是刚刚好;先执行表示1;判断表达式2,再执行表达式3;再判断表达式2;。。。。。。。

执行过程;
先执行表达式1;然后在判断表达式2;若为真则执行循环体;
循环体执行完后,则返回到执行表达式3;之后再判断表达式2;若为真则进行执行循环体,再执行表达式3再判断表达式2;知道表达式2为假的时候才结束for循环,执行for循环之后的其他语句;
因此可以看出表达式2;其实就是一个条件语句,判断是否再次进入循环执行循环体或者是跳出for循环;


注意;

1;for里面的循环体可以为空语句,则就是一个;什么都不管,或者不接东西也是正确的哦;刚测试了一下;

2;for语句里面的表达式可以省略,可以部分或者全部省略但是两个分号不能省略;

for(;;)//这也是可以执行的;


3;for后面圆括号的中的表达式可以是任意有效的c语言表达式;

for(i=1,sum=0; i <= 10; sum+=i,i++);//后面直接一个分号表示空语句;不执行任何东西;
表达式1和表达式3都是逗号表达式;


/*
程序完成了;输入整数n,输出n的阶乘;

*/
#include<stdio.h>
int main()
{
int i, n,jc;
scanf("%d",&n);
jc = 1;//同样只是一个初始化;因为是累乘则初始化为1;

for(i = 1; i <= n; i++){//for表达式;
jc *= i;
}

printf("n的阶乘为 = %d\n",jc);

return 0;
}
具体流程如下图;主要看程序执行的走向;我都标记的顺序号的;刚开始做循环语句的时候最好都是这样标记好顺序号,这样就不会出现错误了;




4;两个在循环控制中常见的关键字;continue和break;

这两个称为循环辅助手段;

一般来说,进入循环体以后在下次循环判断之前程序执行循环体中的所有语句;

但是continue和break语句是您可以根据循环体内进行的判断结果来忽略以后的循环体或者终止它;

4.1;continue;

该语句可以用于三种循环形式,当运行到该语句的时,它将导致剩余的循环体被忽略,不执行,直接跳到下个表达式(for则跳到表达式3,while,dowhile则跳到条件判断语句;)

意思总的就是跳过这次循环剩余的循环体,开始下次循环;
continue的功能是
中断循环体的本次执行(及跳过循环体中尚未执行的语句),立即开始执行下次循环,
注意;
while和do-while循环的情况下,continue语句把程序控制转到表达式计算处,即判断是否开始下次循环;
for循环中则是转至表达式3的计算,然后再判断表达式2,判断是否开始下次循环;


看事列;



对于这个应该有了了解吧,

/*
设计程序,输出从1到整数n的奇数和;
输入数n;
输出sum= 1+3+5+.....n(n为奇数时)
=1+3+5+.....n-1(n为偶数时)

*/
#include<stdio.h>
int main()
{
int sum, n, i;
sum = 0;//与之前程序一样初始化,因为累加,则sum=0;
scanf("%d",&n);
for(i = 1; i <= n; i++){//从1遍历到n;
if(i%2 == 0)//若为偶数则进入if条件语句;
continue;//若执行continue则下面循环体不执行,直接跳到i++;
sum += i;
}
printf("从1到n的奇数和为; %d\n",sum);

return 0;
}


4.2;break语句;

循环中break语句导致程序终止包含它的循环,并进行这个循环后面的其他语句;类似于条件不满足跳出循环一样,只是这里是,只要遇到break就跳出循环;

意思就是,只要遇到break,就要跳出循环;


看事列;



注意一下,break除了用在循环之外,

1;还用在switch开关语句中;这个之前说过;
break的功能就是是程序控制退出到该结构的花括号之外,
2;用在循环的条件分支中,其功能是当做某个条件成立时,是程序控制从循环中退出,从而结束循环的过程,转而执行循环语句后的其他语句;


/*
设计一个程序,判断一个整数n是否是素数;
素数的概念;除开1和到本身之外不被其他任何数整除;
输入整数n;
输出ture,or  false;
暂时先了解这种设计方法,还有很多好的方法;
思路;
根据素数的概念来; 从2到n-1循环一遍,如果都不能被n整除则n为素数;

*/
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
for(i = 2; i < n; i++){// 循环,从2到n-1;
if(n%i == 0){//判断是否可以被n整除;
break;
}
}
//因为上面是如果存在不可被整除的那么则会跳出for循环,
//那么则不是正常不满足for循环退出的,
//则可以说明如果不是素数则不是正常退出,则i!=n;
//若为素数则正常退出,则i=n的;
if(i == n){
printf("ture\n");
}
else{
printf("false\n");
}

return 0;
}


5;嵌套的循环以及continue和break的使用;

嵌套循环就是for里面嵌套while,for ,dowhile……..的;

while里面也可以嵌套fwhile,for ,dowhile……..语句;

这里都是可以的;

5.1;利用嵌套循环来处理数据


/*
程序设计;利用嵌套循环,编写从1的阶乘到n的阶乘之和;
输入 ;整数n;
输出;sum,sum=1!+2!+......+n!;
*/
#include<stdio.h>
int main()
{
int n, i, j, sum,jc;
scanf("%d",&n);
sum = 0;//初始化,因为累加则初始化为0;

for(i = 1; i <= n; i++){//从1循环到n,达到从1到n的目的

jc = 1;//初始化,因为累乘则初始化为1;注意要放到里面,因为每次继续i的阶乘都要初始化1;

for(j = 1; j <= i; j++){//从1循环到i;并且里面是累乘,达到计算i的阶乘的目的;
jc *= j;
}

sum += jc;//将每次i的阶乘的和累加起来;最后的结果就是1到n的阶乘的和;
}
printf("从1的阶乘到n的阶乘和为;%d\n",sum);

return 0;
}




5.2;利用嵌套循环来直接输出的;


/*
设计程序;输出乘法表;
1*1=1
1*2=2 2*2 = 4;
........
......
等等;
输出利用嵌套循环直接输出的,而不是数据处理了
*/
#include<stdio.h>
int main()
{
int i, j;
for(i = 1; i <= 9; i++){//从1依次循环到9;表示要循环9次;
//在这里表示 要输出9行,第i次循环表示在第i一行里面要做什么 ;也就是循环体做的事情
//9行;
for(j = 1; j <= i; j++){// 从1到i,表示循环i次,表示执行i次循环体,又因为里面是printf输出;
//则在这里表示第i行输出i次,就是d第i行进行i次这个循环体;

printf("%d*%d=%2d  ",j, i, i*j); //注意这里是先输出j再i;因为第二个for中的j表示列数,i表示行数;
//第i行输出i个乘法表达式
}
printf("\n");
//可以看出i表示行数;
//j表示列数;
}
//不知道这个注释看不看得懂;尴尬;

return 0;
}




6;应用;都是简单常见的编程题;最好独立完成;并且我也写出了思路;

6.1;打印n行的平行四边形;
例如输入3;
***
*****
*******
输出这个样子的;
思路;
这个输入嵌套循环里面的输入;
1。n行;则要最外层的循环是从1到n;
2。看每行里面做了什么,首先要打印空格个数是n-i个打印*,个数是2*i+1个,这个就要找规律的;
3;直接输出就ok了;关键再循环的初末和循环体;


6.2;输出100到1000的水仙花数;
水仙花数是;水仙花数是指一个3位数 ,它的每个位上的数字的 3次幂之和等于它本身。
(例如:153 = 1^3 + 5^3+ 3^3 = 153);
思路;
这个输出数据处理类的嵌套循环;
1;第一个循环肯定是从100循环到1000;(不包括1000);然后循环体要做什么呢?
————完成将数字的每位分开进行三次幂并且进行相加如果相等则应该输出这个数,否则进行下次循环
2;第一个循环循环体的编写
——先完成将数字的每位分开;%10;/10%10;/100;这就分别得到每位的数(这个瓜分要知道的)
——然后在进行三次幂相加sum
——判断sum是否与这个数相等,如果相等则输出,否则进行下次循环;


6.3;打印菱形;
输入n;
输出
(当n=3;)
*
***
*****
***
*
这就是n=3时候的输出;
思路;
这是嵌套循环的输出;
这个与之前的平行四边形差不多;主要难点应该是不知道怎么控制输出;然后就独立编吧;
提示;先输出3行,再输出2行;分上下两部份就思路清晰一点;


6.4;记得我学循环就是去年圣诞之前,因此我也还用嵌套循环的输出打印圣诞树;
输入n;
输出(假设n=2;)表示上面有两个三角形;并且也表示树根的长宽;
*
***
*
***
*****
***
***
***


6.5;求输入的两个正整数a和b的最大公约数(即最大公因子)和最小公倍数;
可以利用辗转相除法;
即当b!=0时;r=a%b;a=b;b=r;
直到b=0时,a即为最大公约数;
最小公倍数;k/a;(k为刚开始a*b)


这5个列子的代码下次补上;

哈哈,基本上完成了,要断网了,刚刚好;

下篇博客可能要跳跃一下,先打结构体部分;因为要打数据结构的代码,因此这几天把结构体重新看了一下,因此趁热打铁,先把结构体打完再说,也就块期末了;该复习了,因此关于c语言基础的其他知识就寒假在补上了;

从7点敲到现在,中间和一个大四的学长聊了会天;总结出一句话就是

趁着现在大学时间多,多学点东西;现在的牛人太多了;

所以现在只能加油了,ok,睡觉了;

下午没课,趁着中午睡觉之前的时间八上面代码的码一下吧;

6.1;



6.2;



6.3;



6.4;

/*
程序设计;打印圣诞树;
输入n;
输出(假设n=2;)表示上面有两个三角形;并且也表示树根的长宽;
*
***
*
***
*****
***
***
***
其中n代表;树根上面有n个三角形;并且树根的长宽是2*n-1;
注意这里 这个与之前说的有点小的不同;下面都标有注释了;
具体思路;
1;先打印n个三角形;就是第一个循环从1到n;具体在里面实现输出三角形;第i次循环就打印第i个三角形;
2;在第一个循环所属的循环体里面打印三角形;
2.1;与之前打印的三角形一下,先考虑行数,从1循环到i+1,
这个循环体里面打印打印每行应该做什么,
使得这个循环完毕后输出一个三角形 、
3;打印完三角形之后;再另起循环输出树根;
*/
#include<stdio.h>
int main()
{
int n, i, j, k;
scanf("%d",&n);//输入的n代表是树根上面有n个三角形;
for(i = 1; i <= n; i++){// 循环n次表示输出n个三角形;
//在循环体里面输出三角形,达到每次循环就输出一个三角形;
for(j = 1; j <= i+1; j++){//三角形的输出,还是回归到每行要输出什么,但这个循环结束就要打印一个完整的三角形;
//在循环体里面,输出第i个三角形的第j行应该做什么;
for(k = 1; k <= n-j+1; k++)//先打印空格
printf(" ");

for(k = 1; k <= 2*j-1; k++)//打印*;
printf("*");

printf("\n");//每行做的事,则应该输出换行;
}
}
for(i = 1; i <= 2*n; i++){//输出树根,有2*n行;
printf(" ");//打印一个空格,从第二列开始打印;
for(j = 1; j <= 2*n-1; j++){//在每行输出2*n-1个*;
printf("*");
}
printf("\n");
}

return 0;
}




6.5;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐