分支语句
if_else switch_case
基本结构
if(表达式1)
{
代码段1;
}else
{
代码段2;
}
判断表达式1是否成立,如果成立执行代码段1,不成立执行代码段2;
分层结构
if(表达式1)
{
代码段1;
}else if(表达式2)
{
代码段2;
}else
{
代码段3;
}
练习:输入一个年份,判断:
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
#include <stdio.h>
int main()
{
int year = 0;
printf("输入年份:");
scanf("%d",&year);
if(year%4==0&&year%100!=0)
{
printf("是普通闰年\n");
}
else if(year%400==0)
{
printf("是世纪闰年\n");
}
else
{
printf("不是闰年\n");
}
return 0;
}
嵌套结构
if(表达式1)
{
if(表达式2)
{
}
}
注意:
if后边可以没有else,但是else前边必须有if
当语句块只有一行代码时,{}可以省略
练习:实现大小写转换
输入大写字符,输出小写字符
输入小写字符,输出大写字符
输入其他类型,输出error
#include <stdio.h>
int main(int argc, char const *argv[])
{
char x;
printf("请输入英文字母:");
scanf("%c",&x);
if(x>='a' && x<='z')
{
printf("大写字母是:%c\n",x-32); //小写字母的ASCII码值-32就是
//本身的大写字母的ASCII码值
}
else if(x>='A' && x<='Z')
{
printf("小写字母是:%c\n",x+32);
}
else
{
printf("不是英文字母");
}
return 0;
}
switch
switch (表达式)
{
case 常量1:
/* code1 */
break;
case 常量2:
/* code2 */
break;
default:
break;
}
执行顺序:判断表达式的结果,和case后的常量值进行匹配,匹配成功则执行对应语句块,如果没有匹配成功的则执行default的语句块,遇到break结束。
注意:
表达式的结果不能是小数,case后的常量值不能是浮点数或字符串。
每个对应的case语句后边要加上break,不加会继续向下执行,直到遇到break结束
int day=1;
switch (day)
{
case 1:
printf("1111\n");
break;
case 2:
printf("2222\n");
break;
default:
printf("error\n");
break;
}
练习:
用switch实现等级划分:
A 100-90
B 89-80
C 79-70
补考 <70
#include<stdio.h>
int main(int argc, char const *argv[])
{
int x = 0;
printf("输入成绩:");
scanf("%d",&x);
x = x/10;
switch (x)
{
case 10:
case 9:
{
printf("A\n");
break;
}
case 8:
{
printf("B\n");
break;
}
case 7:
{
printf("C\n");
break;
}
default:
{
printf("补考\n");
break;
}
}
return 0;
}
循环语句
for while do while
for循环
格式
for(表达式1;表达式2;表达式3) { //代码段 }
表达式1:变量赋初值
表达式2:终止条件
表达式3:增值或减值
执行顺序:首先执行表达式1进行赋值,然后判断表达式2是否成立,如果成立就进入循环执行语句块,再执行表达式3进行增值或减值然后继续判断表达式2是否成立,直到表达式2不成立退出循环
死循环:表达式2永远成立 for(;;)
嵌套
for(表达式1;表达式2;表达式3)
{
for(表达式1;表达式2;表达式3)
{
}
}
//外层循环执行一次,内层循环执行一轮
练习:水仙花数,是指一个3位数,其每个位上的数字的3次幂之和等于它本身。例如,153就是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153,找出三位数里所有的水仙花数
#include <stdio.h>
int main(int argc, char const *argv[])
{
int m, n, b = 0;
for (int i = 100; i < 999; i++)
{
m = i / 100;
n = i % 100 / 10;
b = i % 10;
if (m * m * m + n * n * n + b * b * b == i)
printf("%d\n", i);
}
return 0;
}
while循环
格式
while(表达式)
{
//代码段
}
int i=1;
while(i<4)
{
printf("qqqq\n");
i++;
}
执行顺序:首先定义循环变量并赋值,然后判断是否符合终止条件,如果符合就进入循环执行语句块及增值减值语句,然后继续判断,直到不成立退出循环
死循环:while(1)
do...while循环
int a=8;
do
{
printf("qqqqq\n");
a++;
} while (a<5);
while:先判断再执行
do...while:先执行一次程序,再判断
循环控制语句
break continue
continue:结束本次循环,继续下一次
break:终止循环
return 0:结束程序
练习:循环输入一个5位数,判断它是不是回文数。当输入0时循环结束。
比如说12321,从前往后读和从后往前读都是一样的,就叫回文数
练习:
斐波那契数列,从第三个数开始,每一个数都是前两个数的和,如{1,1,2,3,5,8}
请做出有15个数的斐波那契数列
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[15] = {1, 1};
for (int i = 2; i < 15; i++)
{
a[i] = a[i - 1] + a[i - 2];
}
for (int j = 0; j < 15; j++)
{
printf("%d\n", a[j]);
}
return 0;
}
打印以下图案:
要求行数从终端输入。
输入:5
输出:
*
**
***
****
*****
*****
****
***
**
*
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("输入行数:");
int n, i = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int j = 0;
while (j < i)
{
printf("*");
j++;
}
printf("\n");
}
for (i = n; i >= 1; i--)
{
int j = 0;
for (int k = 0; k < n - i; k++)
printf(" ");
while (j < i)
{
printf("*");
j++;
}
printf("\n");
}
return 0;
}