【C语言】超详解,让你C语言成功入门(二)——三大结构

C语句

C语句分成五大类:

(1)控制语句

用于完成一定的控制功能。C语言只有9种控制语句:

(一)条件判断语句也叫分支语句
if()…else… (条件语句)

if(x>y) max=x;
else max=y;

x>y是判别条件,“ max=x;max=y; ” 是C语句,这两个语句是内嵌在 if…else语句中的。作用是:先判别“ x>y ”是否成立,成立执行语句“max=x;” ,否则就执行语句“max=y;”。

注意:if 语句内含有多条语句时,应用花括号括起来(else同理):

if(x>y)
{
     max=x;
     printf("%d\n",max);
}
else
{
    max=y;
    printf("%d\n",max);
}

switch (多分支选择语句)

(二)循环执行语句
while()… (循环语句)
do…while() (循环语句)
for()… (循环语句)

(三)转向语句
continue (结束本次循环语句)
break (中止执行switch或循环语句)
return (从函数返回语句)
goto (转向语句,在结构化程序中基本不用goto语句)

(2)函数调用语句

函数调用语句由一个函数调用加一个分号构成,例如:
printf(“Hello World!\n”);
其中printf(“Hello World!\n”);是一个函数调用,外加一个分号构成的一条语句。

(3)表达式语句

表达式语句由一个表达式加一个分号构成,最典型的是由一个赋值表达式构成一个赋值语句。
例:x=3 是一个赋值表达式,而
x=3; 是一条赋值语句。

一个表达式的最后加上一个分号就变成了一条语句。

(4)空语句

一般形式:
;
即只有一个分号。

(5)复合语句

用 {} 括起来的所有语句,叫做复合语句。

if(x>y)
{
     max=x;
     printf("%d\n",max);
}

复合语句中可包含声明部分。

三大结构

在这里插入图片描述

顺序结构

顺序结构是程序设计语言最基本的结构,其包含的语句按照书写的顺序执行,且每条语句都将被执行。其他的结构可以包含顺序结构,也可以作为顺序结构的组成部分。

上题目,让我们来感受一下顺序结构。

【例1. 0】输入圆的半径,求圆的周长和面积。

#include<stdio.h>
#define PI 3.14159
int main()
{
    float r,C,S;
    printf("请输入圆的半径:");//提示作用
    scanf("%f",&r);//输入圆的半径
    C = 2 * PI * r;//计算周长
    S = PI * r * r;//计算面积
    printf("C = %.4f\n",C);//输出,并保留四位小数
    printf("S = %.4f\n",S);//输出,并保留四位小数
    return 0;
}

运行结果:
请输入圆的半径:4
C = 25.1327
S = 50.2654

【例1. 2】输入三个字符,将它们反向输出。

#include<stdio.h>
int main()
{
    char ch1,ch2,ch3;
    printf("请输入三个字符:");//提示作用
    ch1 = getchar();
    ch2 = getchar();
    ch3 = getchar();//依次输入三个字符
    putchar(ch3);
    putchar(ch2);
    putchar(ch1);//反向输出三个字符
    return 0;
}

运行结果:
请输入三个字符:ABC
CBA

注:输入三个字符时,要连续输入,不要插入空格。

【例1. 3】输入任意三个整数,求它们的和与平均值。

#include<stdio.h>
int main()
{
    //声明变量,并初始化为 0
    int a = 0,b = 0,c = 0,sum = 0;
    float average=0;
    printf("请输入三个整数:");
    scanf("%d%d%d",&a,&b,&c);//输入三个整数,可用空格或回车分开
    sum = a + b + c; //求和
    average = sum / 3.0;//求平均值
    printf("sum = %d,average = %f\n",sum,average);//输出和与平均值,且平均值保留两位小数。
    return 0;
}

运行结果:
请输入三个整数:10 20 30
sum = 60,average = 20.00

思考:
average = sum / 3.0 是否可以写成 average = sum / 3

答案是:不可以。
因为a, b, c 均为整数,且3也是整数,求商出来的结果也是整数。

另外一种方法就是强制转换
average = (float)sum / 3;
把整型sum强制转换为浮点型。

选择结构

分支语句,即有多个选择方向。

Created with Raphaël 2.3.0 开始 进入 x≥0 输出x 结束 输出y yes no

C语言有两种选择语句:

(1)if语句

if语句,用来实现两个分支的选择结构。

语法结构:

if(表达式)
   语句;

if(表达式) 
   语句1;
else
   语句2;

//多分支
if(表达式1) 
   语句1;
else if(表达式2)
   语句2;
else
   语句3;

看代码:

#include<stdio.h>
int main()
{
    if(3==5)
        printf("hehe\n");
    return 0;
}

运行结果:
在这里插入图片描述

运行的结果为空,为什么呢?
让我们思考一下。

因为if语句的表达式(3==5)为假,就不输出。

如果表达式改为3==3,那结果输出hehe。

表达式只要为真,就输出打印。

我们再来看看,下面的这段代码的运行结果是多少呢?

(嵌套的 if 语句)

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

运行结果:在这里插入图片描述

注意:else是和最近的且未匹配的 if 相匹配。

所以这段代码其实应该是这样:

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
        else
            printf("haha\n");
    return 0;
}

输出结果为空,原因依然是表达式(a==1)为假,后面的代码没有执行。

所以,写代码时要规范,既方便别人阅读,也方便自己。

条件运算符

条件运算符的一般形式为:
表达式1 ?表达式2 :表达式3

条件运算符 ?:的功能是:在计算表达式1后,如果值为真(非0),则计算表达式2,并将表达式2的值作为整个表达式的结果;如果表达式1的值为假(0),则计算表达式3,并将表达式3的结果作为整个表达式的值。
例:

x=10;
if(x > 8)
   y=20;
else
   y=10;

那我们可以用条件表达式来处理:


y = (x > 8) ? 20 : 10;

因x=10,比8大。故y的值为20,如果x所赋的值小于等于8,y的值赋为10

(2)switch语句

用来实现多分支的选择结构。
switch语句的一般形式为:

switch(整型表达式)
{
case 常量1 : 语句1;
case 常量2 : 语句2;
case 常量3 : 语句3;
case 常量4 : 语句4;

case 常量n : 语句n;
default :语句n+1;
}

【例2 - 2 .1】输出一个整数day,取值范围为1~7,输出对应的英文翻译。

#include<stdio.h>
int main()
{
	int day = 0;//声明变量,并初始化为0
	scanf("%d", &day);
	switch (day)
	{
	case 1:printf("Monday!\n");
	case 2:printf("Tuesday!\n");
	case 3:printf("Wednesday!\n");
	case 4:printf("Thursday!\n");
	case 5:printf("Friday!\n");
	case 6:printf("Saturday!\n");
	case 7:printf("Sunday!\n");
	default:printf("输入错误!\n");//其他输出
	}
	return 0;
}

运行结果:
3
Wednesday!
Thursday!
Friday!
Saturday!
Sunday!
输入错误!

这是为什么呢?我们的目标是只输出该天的英文翻译,为何后面几天的结果均被输出呢?

case标签起的是语句标号的作用,程序并不在此进行判断。当程序跳转至某个标签行,就会按顺序执行标签以后的所有语句。

故,当我们输入3时,跳转到case 5相匹配,程序跳转至该行,执行此后所有语句。
而为了不输出其后续的case语句,就要在每个case语句后面加上break语句,以执行完语句后跳出流程。

#include<stdio.h>
int main()
{
	int day = 0;//声明变量,并初始化为0
	scanf("%d", &day);
	switch (day)
	{
	case 1:printf("Monday!\n");break;
	case 2:printf("Tuesday!\n");break;
	case 3:printf("Wednesday!\n");break;
	case 4:printf("Thursday!\n");break;
	case 5:printf("Friday!\n");break;
	case 6:printf("Saturday!\n");break;
	case 7:printf("Sunday!\n");break;
	default:printf("输入错误!\n");break;//其他输出
	}
	return 0;
}

运行结果:
3
Wednesday!

我们来看看下面这段代码,你们觉得结果是什么?

#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch (n)
    {
    case 1:
        m++;
    case 2:
        n++;
    case 3:
        switch (n)
        {
        //switch允许嵌套使用
        case 1:
            n++;
        case 2:
            m++;
            n++;
            break;
        }
    case 4:
        m++;
        break;
    default:
        break;
    }
    printf("m = %d, n = %d\n", m, n);
    return 0;
}

运行结果:
m = 5, n = 3

循环结构

while循环

一般形式:

while(表达式)
    语句

我们已经掌握了,if语句:

if(表达式)
    语句

在这里插入图片描述
当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次。

那我们应该怎么做才能将一件事,同时做很多遍呢?

我们只需将 if 改为 while即可
在这里插入图片描述
该程序陷入了一个死循环。

【例3. 1】 在屏幕上打印1-10的数字。

#include <stdio.h>
int main()
{
    int i = 1;
    while(i<=10)
    {
        printf("%d ", i);
        i = i+1;// i++;
    }
    return 0;
}

运行结果:
在这里插入图片描述

上面的代码已经帮我们了解了 while 语句的基本语法,那我们再来了解一下:

while语句中的break和continue
(1)break

在这里插入图片描述

这里代码输出的结果是什么?

1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10

运行结果:
1 2 3 4

通过以上代码我们可知break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

所以:while中的break是用于永久终止循环的。

(2)continue
#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;//i++;
	}
	return 0;
}

这里代码输出的结果又是什么呢?

1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10

运行结果:
1 2 3 4

通过以上代码我们可知continue在while循环中的作用就是:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

如果我们将i++;的位置放到选择语句的前面,那结果又变成了这样:
在这里插入图片描述

do while循环

一般形式:

do
 循环语句;
while(表达式);

注意:do while 循环以分号结尾。

do while语句的流程图为:

Created with Raphaël 2.3.0 进入 循环体语句 表达式 结束 yes no

先执行循环体,然后再检查条件是否成立,若成立,再执行循环体,直到条件不成立。

循环至少执行一次。

【例3. 2】 在屏幕上打印1-10的数字。

#include <stdio.h>
int main()
{
    int i = 10;
    do
    {
    printf("%d\n", i);
    }while(i<10);
    return 0;
}

运行结果:
10

do while语句中的break和continue,意义与while一样。

for循环

for循环的一般形式为:

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

表达式1
表达式1为初始化部分,用于初始化循环变量的。

表达式2
表达式2为条件判断部分,用于判断循环时候终止。

表达式3
表达式3为调整部分,用于循环条件的调整。

【例3. 3】 在屏幕上打印1-10的数字。

#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1; i<=10; i++)
    {
        printf("%d ", i);
    }
    return 0;
}

for ( i=1(初始化); i<=10(判断部分); i++(调整部分) )

运行结果:
1 2 3 4 5 6 7 8 9 10

让我们来对比一下while循环和for循环。

    int i = 0;
    i = 1;
//while循环
    while(i<=10)
    {
        printf("%d ", i);
        i = i+1;// i++;
    }
//for循环
   for(i=1; i<=10; i++)
    {
        printf("%d ", i);
    }

while循环中依然存在循环的三个条件,但是却分布较为分散,而 for循环就将这个问题解决了,条件集中,方便查找和修改。

所以,for循环的风格更胜一筹;for循环使用的频率也最高。

break和continue

for循环中的break和continue,意义与while一样。

但也有些许差别,你们自行体会体会。

// break
#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1; i<=10; i++)
    {
       if(i == 5)
       break;
       printf("%d ",i);
    }
   return 0;
}

//continue
#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1; i<=10; i++)
    {
       if(i == 5)
       continue;
       printf("%d ",i);
    }
    return 0;
}
for语句的循环控制变量

建议:
1.不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

//前闭后开
for(i = 0; i < 10; i++)
//两边都是闭区间
for(i = 0; i <= 9; i++)
一些for循环的变种
1.条件为空
   for(;;)
  {
      printf("hehe\n");
  }
2.for循环的嵌套使用
   for(; i<10; i++)
   {
        for(; j<10; j++)
       {
            printf("hehe\n");
       }
   }
3.多变量控制
   for (x = 0, y = 0; x<2 && y<5; ++x, y++)
   {
        printf("hehe\n");
   }
问题来了!!!

下面代码循环多少次?

#include <stdio.h>
int main()
{
    int i = 0;
    int k = 0;
    for(i =0,k=0; k=0; i++,k++)
        k++;
    return 0;
}

1次?
0次?
还是不输出?
还是陷入了死循环?

正确答案是0次,因为条件表达式 k = 0,是赋值表达式,k=0 时,条件表达式为假,该循环不执行。

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Audery867

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值