运算符与程序结构(下)
1 逗号运算符
逗号运算符将两个表达式连接起来
表达式1, 表达式2
逗号运算符的结合性是“从左至右”:先计算表达式1,后计算表达式2
a = 3;
b = a*2, a+4;
结果: b=7
整个表达式最终的值是表达式2的值
2 条件运算符
条件运算符是通过问号"?“和冒号”:"连接的表达式
表达式1 ? 表达式2 : 表达式3
执行逻辑:
如果表达式1的结果为真,
则整个表达式的结果为表达式2的结果,
否则为表达式3的结果
printf("%d\n", 3>4?3:4);
结果:打印输出4
3 程序结构
C语言支持三种程序运行结构:顺序结构、选择结构、循环结构,概念如下:
顺序结构:按照语句编写的顺序上到下逐句执行。
选择结构:也叫分支结构,依据是否满足条件,有选择的
执行相应功能。
循环结构:依据条件是否满足,重复多次执行某段代码
3.1 选择结构
3.1.1 if语句
语法:
if (表达式)
{
语句
}
执行逻辑:如果表达式的值为真,则执行其后的语句, 否则不执行该语句
案例:
#include <sdtdio.h>
int main()
{
int a;
scanf("%d", &a);
if (a > 10)
{
printf("a > 10 \n");
}
return 0;
}
3.1.2 if…else语句语法
语法:
if (表达式)
{
语句1
}
else
{
语句2
}
执行逻辑:
如果表达式1成立(表达式1的结果为逻辑真),
则执行语句1,否则执行语句2
#include <stdio.h>
int main()
{
int a;
printf("Input a Integer Number: ");
scanf("%d", &a);
if (a > 10)
{
printf("a > 10 \n");
}
else
{
printf("a <= 10 \n");
}
return 0;
}
练习:
//在键盘上输入三个整数,输出最大值
int main()
{
int i,j,k,max;
scanf("%d%d%d",&i,&j,&k);
max=i;
if(max<j)
{
max=j;
}
if(max<k)
{
max=k;
}
printf("%d",max);
}
3.1.3 if…else if …else 语句语法
if (表达式1)
{
语句1
}
else if (表达式2)
{
语句2
}
...
else if(表达式n)
{
语句n-1
}
else
{
语句n
}
执行逻辑:从“表达式1”开始,从上往下判断,直到某个表达式的结果为逻辑真,则执行对应的语句,并且结束整个选择
结构,如果所有的表达式结果为逻辑假,则执行else逻辑对应的“语句n”
案例:
#include <stdio.h>
int main()
{
unsigned int a;
scanf("%u", &a);
if (a < 10)
{
printf("个位\n");
}
else if (a < 100)
{
printf("十位\n");
}
else if (a < 1000)
{
printf("百位\n");
}
else
{
printf("超过了4位数\n");
}
return 0;
}
3.1.4 switch语句
语法:
switch (表达式)
{
case 常量表达式1: 语句1;break;
case 常量表达式2: 语句2;break;
...
case 常量表达式n-1: 语句n-1;break;
default : 语句n
}
执行逻辑:
计算"表达式"的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
注意:每个语句后面都有break
案例:
#include <stdio.h>
int main()
{
int day;
printf("Input weekday number: ");
scanf("%d", &day);
switch (day)
{
case 1:printf("星期一\n"); break;
case 2:printf("星期二\n"); break;
case 3:printf("星期三\n"); break;
case 4:printf("星期四\n"); break;
case 5:printf("星期五\n"); break;
case 6:printf("星期六\n"); break;
case 7:printf("星期日\n"); break;
default:printf("I don't know \n");
}
return 0;
}
总结
- switch结构的表达式必须为“常量表达式”
- switch结构可以用if … else if … else 结构来实现
3.1.5 选择结构的嵌套
语法:
if (表达式1)
{
if (表达式2)
{
语句1
}
else
{
语句2
}
}
else //else if ()
{
if (表达式3)
{
语句3
}
else
{
语句4
}
}
执行逻辑
如果表达式1结果为逻辑真,则判断表达式2的结果,如果结果为真则执行语句1,否则执行语句2
如果表达式1结果为逻辑假,则判断表达式3的结果,如果结果为真则执行语句3,否则执行语句4
案例:
if (体育老师生病了)
{
if (语文老师没课)
{
上语文课
}
else
{
上自习
}
}
else
{
上体育课程
}
3.2 循环结构
3.2.1 while语句
语法:
while (表达式)
{
语句
}
执行逻辑:如果表达式的结果为逻辑假则执行循环体语句,直到表达式的结果为假
案例:
#include <stdio.h>
int main()
{
int x = 10;
while (x != 0)
{
printf("%d\n", x);
x--;
}
return 0;
}
练习:通过while循环计算1~100的和
代码:
#include<stdio.h>
int main()
{
int i=1,sum=0;
while(i<=100)
{
sum+=i;
i++;
}
printf("%d",sum);
return 0;
}
3.2.2 do~while 语句语法
语法
do{
语句
}while (表达式);
执行逻辑:这个循环与 while 循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此, do-while 循环至少要执行一次
循环语句。其执行过程可用下图表示
案例:
#include <stdio.h>
int main()
{
int sum = 0;
int i = 1;
do
{
sum += i;
i++;
}
while (i <= 100);
return 0;
}
总结:do~ while和while的区别在于:do~while至少会执行一次循环体语句
3.2.3 for语句
语法:
for(表达式1; 表达式2; 表达式3)
{
语句
}
执行逻辑
1. 先求解表达式1。
2. 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(O),则结
束循环,转到第5)步。
4. 求解表达式3。
5. 转回上面第2)步继续执行。
6. 循环结束,执行for语句下面的一个语句
案例:
#include <stdio.h>
int main()
{
int sum = 0;
int i;
for (i = 1; i <= 100; i++)
{
sum += i;
}
return 0;
}
练习:
//求5的阶乘
#include<stdio.h>
int main()
{
int i=1,sum=1;
for(i=1;i<=5;i++)
{
sum*=i;
}
printf("%d",sum);
}
//输出100~999之间的所有的水仙花数(水仙花数是一个三
//位数满足如下条件:水仙花数 = 个位的立方+十位的立方
//+百位的立方)
#include<stdio.h>
int main()
{
int i=100,g=0,s=0,b=0;
for(i=100;i<999;i++)
{
b=i/100;
s=i%100/10;
g=i%10;
if(i==g*g*g+s*s*s+b*b*b)
{
printf("%d\n",i);
}
}
}
//在键盘上输入两个数字,分别存储到a和n中,自动计算
//表达式 a + aa + aaa + ...+ a...a(n个a)的结果, 例如,在键盘上
//输入 3 和5 ,表达式为: 3+33+333+3333+33333
#include <stdio.h>
int main() {
int a,n;
int i=0,b=10,c=0;
printf("请输入两个数:");
scanf("%d%d",&a,&n);
for(i=0;i<n;i++)
{
c=c*b+a;
printf("%d\n",c);
}
return 0;
}
3.2.4 循环的嵌套
所谓的循环结构就是“循环逻辑中有循环逻辑”
#include<stdio.h>
int main()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
printf("%d*%d=%d\t",i,j,i*j);
}
printf("\n");
}
return 0;
}
案例:
//求:2~100之间的所有的质数
#include <stdio.h>
int main() {
int i, j;
for (i = 2; i <= 100; i++)
{
int flag = 1; // 假设 i 是质数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0; // 如果能整除,则不是质数
break;
}
}
if (flag)
{
printf("%d\n", i); // 只有在确定是质数的情况下才输出 i
}
}
return 0;
}
3.3 流程控制
3.3.1break语句
break用于switch中时,可使程序跳出switch,如果没有break语句,
则会继续执行下一个case逻辑中的语句(不论case后面的表示
式结果与switch后的表达式结果是否相等),直到遇到break
才会跳出switch
案例:
switch(x)
{
case 1:printf("1\n");break;
case 2:printf("2\n");
case 3:printf("3\n");break;
case 4:printf("4\n");break;
}
结果:当x=2,输出 2 3
练习:
//使用switch语句实现在键盘上输入一个月份,然后
//输出该月份对应的天数
#include<stdio.h>
int main()
{
int month;
scanf(" %d",&month);
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("该月有31天\n");
break;
case 4:
case 6:
case 9:
case 11:
printf("该月有30天\n");
break;
case 2:
printf("该月有28/29天\n");
break;
default:
break;
}
}
break在循环语句中的使用
当break语句用于do-while、for、while循环语句中时,
可使程序终止循环而执行循环后面的语句,
通常break语句总是与if语句联在一起。即满足条件时便跳出循环
案例:
int m, n;
for (m = 0; m < 5; m++)
{
for (n = 0; n < 5; n++)
{
if (n == 3)
break;
printf("%d\n", n);
}
}
3.3.2continue语句
continue语句用于循环结构中,作用是结束本次循环,继续下次循环
案例:
int m, n;
for (m = 0; m < 10; m++)
{
for (n = 0; n < 10; n++)
{
if (n == 3)
continue;
printf("%d\n", n); //if语句成立,该条语句不执行
}
}
当执行到continue语句时,此次循环结构中continue语句后的其他所有语句都不会被执行到。
4 总结
- 输入输出函数,是c语言中为数不多的形参列表可变的函数,在实际工作中尽量不要自己定义形参列表可变的函数。输入函数为阻塞性函数:系统会停留在输入函数处,直到用户输入数据或者程序结束。
- 通过运算符和操作数的结合形成表达式。运算符有不同的优先级决定操作数的计算顺序,同优先级的运算符计算顺序由结合性决定,
- 运算符的优先级不用死记硬背,在实际工作中使用的多了就熟练了。
- 在使用选择结构的程序时注意要把最特殊的判断放在前面,后面的放在else里面就行了。这样可以更加快速的判断,去掉不必要的时间。