1.顺序结构
用static修饰的局部变量的初始化,只在第一次进入时进行,之后保持上一次离开时的值
2.选择结构
分支语句
语句:每条用 “ ; ” 分开的为一条语句,每个语句必须以分号结束
2.1 if语句
允许嵌套使用
语法结构:
//单分支if
if() //满足条件,执行语句
语句;
//不满足,直接跳过
//双分支if
if() //满足条件,执行语句1
语句1;
else //不满足条件,执行语句2
语句2;
案例1:
int main() {
int age = 28;
if (age<18)
printf("未成年\n");
else { //存在多条语句加括号,避免出现 悬空else
if (age >= 18 && age < 28)
printf("青年\n");
else if (age >= 28 && age < 50)
printf("中年\n");
else if (age >= 50 && age < 90)
printf("老年\n");
}
return 0;
}
练习题
1.判断一个数是否为奇数
2.输出1-100的奇数
2.2 switch语句
用于多分支的情况
允许嵌套使用
switch(c)语句中,C --为整型、常量、表达式。
语法结构
案例1:
int main() {
int day = 0;
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("输入错误\n"); break;
}
return 0;
}
Switch未知选项: default: 子句(可以放任何位置)
练习题
3.循环结构
3.1while 循环
语法结构:
while(表达式) //条件为真,进入循环
循环语句;
案例:
int main() {
int a = 0;
while (a < 18)
{
a++;
if (a == 5)
continue; //跳过本次循环
if (a == 10)
break; //永久终止循环
printf("%d\n", a);
}
return 0;
}
int main() {
int ch = 0;
//getchar == 输入 ; putchar == 输出
while ((ch = getchar()) != EOF) //ctrl+Z获取EOF 退出
putchar(ch);
printf("%C\n", ch);
return 0;
}
3.2 for循环
语法结构
for( ; ; )
{
循环体;
}
for 循环内不可修改循环变量
3.2.1 for循环变种1
案例:
错误的省略方式,j 由于没有初始化,所以内层循环后 j =10,不再改变,所以不打印
3.2.1 for循环变种2
。。。。。。。。。
测试:
判断条件 k=0 恒为假,不进入循环,循环0次
3.3 do... while循环
语法结构:
do{
//循环体
}
while( ) //先循环一次,然后再进行判断
至少执行一次,使用场景有限,不是经常用
案例:
4.练习
int main() {
int i,n;
int sum = 1;
int and = 0;
//scanf("%d", &n);
for (n= 1; n < 4; n++)
{
sum = 1;
for (i = 1; i <= n; i++)
{
sum = sum * i;
}
printf("%d", n);
printf("的阶乘%d\n", sum);
and= and +sum;
}
printf("的阶乘和%d\n", and);
return 0;
}
1、2题解
int main() {
int k = 7;//寻找数字7
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//数组
// 0,1,2,3,4,5,6,7,8,9,
int sz = sizeof(arr) / sizeof(arr[0]); //计算元素个数
printf("元素个数:%d\n", sz);
int left = 0; //左下标
int right = sz - 1; //右下标
while (left <= right)
{
int mid = (left + right) / 2; //中间下标
if (arr[mid] > k)
{
right = mid - 1;
printf("左下标,:%d", left);
printf("右下标:%d\n", right);
}
else if (arr[mid] < k)
{
left = mid + 1;
printf("左下标,%d", left);
printf("右下标:%d\n", right);
}
else
{
printf("找到了,下标为:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到:%d\n");
}
3题解
//ajhfklhuehfkauhf
//################
char arr1[] = "ajhfklhuehfkauhf";
char arr2[] = "################";
int left = 0; //左下标
int right = strlen(arr1) - 1; //右下标
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
//停留一秒
Sleep(1000);
//清空再打印
system("cls");
printf("%s\n", arr2);
}
4 题解
int i = 0;
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", password);
if (strcmp(password,"123456")==0)
//if (password == "123456")
//不能用 == 判断字符串相等;使用库函数strcmp
{
printf("密码正确:");
break;
}
else
printf("密码错误:\n");
}
if (i == 3)
{
printf("错3退出");
}
5题解