一、分支和循环
C语言是结构化的。顺序,循环,选择
;//是语句-空语句
1,分支语句
- if语句(else和最近的if匹配)
a.单分支
if(表达式)//表达式计算结果如果为真(非0),语句则被执行
语句;
int age = 20;
if (age < 18)
printf("未成年\n");
b.双分支
if(表达式) //if语句只能执行一次
语句1;
else
语句2;
int age = 20;
if (age < 18)
printf("未成年\n");
else
printf("成年\n");
c.多分支
if(表达式)
语句1;
else if(表达式2)
语句2;
else
语句3;
int main(void)
{
int age = 188;
if (age < 18)
printf("未成年\n");
else if (age >= 18 && age < 28)
printf("青年\n");
else if (age >= 28 && age < 50)
printf("壮年\n");
else if (age >= 50 && age < 90)
printf("老年\n");
else
printf("老老\n");
return 0;
}
如果条件成立,要执行多条语句,怎样使用代码块?
int main(void)
{
int age = 1;
if (age < 18)
{
printf("未成年\n");
printf("不能练练\n");
}
else
{
printf("老老\n");
}
return 0;
}
d.悬空else
//else和最近的if匹配
int main(void)
{
int a = 0;
int b = 2;
if (a == 1)//先看这里a=0,所有下面语句为假,不输出打印
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这里的{ }就是一个代码块
//加一个代码块就可以实现第一个if和最后的else配对
int main(void)
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
e. if书写语句的对比
问:能否打印出hehe?
int num = 4;
if (num = 5)//=是赋值,==是判断相不相等
{
printf("hehe\n");
}
return 0;
答:可以,因为赋值了num=5
最优解写if ( 5 == num)
- 练习:写一个代码输出1~100之间的奇数
1,for语句循环
int i;
for (i = 1; i < 100; i++)
{
if ( i % 2 ==1)
printf("%d\n", i);
}
2,while语句循环
- int i = 1;
while (i <= 100)
{
if (i % 2 == 1) 或者 if (i % 2 != 0)
printf("%d\n", i);
i++;
}
b. int i = 1;
while (i <= 100)
{
printf("%d\n", i);
i+=2;
}
- switch语句{用来实现多分支
【好习惯:在每个switch语句后加default子句,
甚至在后面加一个break】
Switch(整型表达式)//int
{
语句项;//是case语句
case是 整型常量表达式://冒号
语句;
}
A.#include<stdio.h>
int main(void)
{
int day = 0;
scanf_s("%d", &day);//3
switch(day)
{
case 1:
printf("星期1\n");
break;//中止,跳出switch语句.case后的break不一定要有
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
B.#include<stdio.h>
int main(void)
{
int day = 0;
scanf_s("%d", &day);//3
switch(day)
{
default://默认的意思
printf("输入错误\n"); defaulth和case没有顺序之分
break; //上下都可以放
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default://默认的意思
printf("输入错误\n");
break;
}
return 0;
}
C.case 1:
if (n == 1)
printf("hehe\n");
D.#include<stdio.h> //逐级向下计算
int main(void)
{
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++;
default://默认的意思
break;
}
printf("m=%d,n=%d\n",m,n);//m=5,n=3
return 0;
}
#include<stdio.h>
int main(void)
{
int ch = 0;
int ret = 0;
char password[20] = { 0 };
printf("请输入密码>:");
scanf_s("%s", &password);//输入密码,存放在password数组中
//缓冲区还剩一个'\n'
//读取一下'\n'
while ((ch = getchar()) != '\n')
{
;//输入密码有间隔空格时
}
getchar();
printf("请确认(Y/N)>:");//数组名可看作地址
ret = getchar();//password和getchar是输入函数
if (ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
return 0;
}
2.
练习#2023.4.6
- 求n的阶乘
A.For循环
#include<stdio.h>
int main(void)
{
int i ,n;
int ret = 1;//ret不能为0.因为如果为0,后面的结果都是0了。
scanf_s("%d", &n);//可以自己输入值的意思
for (i = 1; i <= n; i++)
{
ret *= i;
}
printf("ret=%d\n", ret); //在for语句的外面
return 0;
}
B.while循环
#include<stdio.h>
int main(void)
{
int n;
scanf_s("%d", &n);
int ret = 1;
int i = 1;
while (i <= n)
{
ret *= i;
i++;
}
printf("ret=%d\n", ret);
return 0;
}
- 计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!=?
#include<stdio.h>
int main(void)
{
int i = 0;
int n = 0;
scanf_s("%d", &n);
int ret = 1;
int sum = 0;
for(n=1;n<10;n++)
{
ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
}
printf("sum=%d", sum);
return 0;
}
可优化为:
#include<stdio.h>
int main(void)
{
int n = 0;
scanf_s("%d", &n);
int ret = 1;
int sum = 0;
for(n=1;n<=3;n++)
{
ret *= n;
sum = sum + ret;
}
printf("sum=%d", sum);
return 0;
}
个人理解:
n=1时,ret=ret*n=1*1=1
sum=sum+ret=0+1=1
n=2时,ret=ret*n=1*2=2
sum=sum+ret=1+2=3
n=3时,ret=ret*n=2*3=6
sum=sum+ret=3+6=9
所以1!+2!+3!=9
- 在一个有序数组中查找具体的某个数字n。编写int bincearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=……<=v[n-1]的数组中查找x。
#折半查找算法/二分查找算法:找一半去掉一半
#include<stdio.h>
int main(void)
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9,10 };
int k = 7;//可以在这里直接改数值,也可以scanf_s("%d",&k)
//然后在输出项目中输入数字
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;//左下标
int right = sz - 1;//右下标
while (left <= right)
{
int mid = (left + right) / 2;//中间元素
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
- 编写代码,演示多个字符从两端移动,向中间汇聚。
// int right = sizeof(arr1)/sizeof(arr1[0])-2;
Char arr1[]=”abc”;
[a b c \0]
0 1 2 3
要求c的下标是用4-2得到c的下标2
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
int main(void)
{
char arr1[] = "welcome to bit!!!!!!";//是字符串
char arr2[] = "####################";
int left = 0;
//int right = sizeof(arr1)/sizeof(arr1[0])-2;
int right = strlen(arr1)-1;
while (left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//休息1000毫秒 //输出项目时会停留几秒然后输出下一个
//引用sleep函数要加头文件
//#include<windows.h>
system("cls");//system是执行系统命令的一个函数
//要引头文件#include<stdlib.h>
//cls是清空屏幕
right--;
left++;
}
return 0;
}
输出结果为:
w##################!
we################!!
wel##############!!!
welc############!!!!
welco##########!!!!!
welcom########!!!!!!
welcome######t!!!!!!
welcome ####it!!!!!!
welcome t##bit!!!!!!
welcome to bit!!!!!!
- 编写代码实现,模拟用户登录情景,并且只能登陆三次。(只允许输入三次密码,如果密码正确则登录成,如果三次均输入错误,则退出程序。)