分支语句和循环语句
if-else语句
语法结构:
(c语言中非0就是真,0是假)
if(表达式1)
{
语句列表1;
}
else if(表达式2)
{
语句列表2;
}
else
{
语句列表3;
}
表达式错误写法:
if(10<=x<100)
修改后:
if(10<=x&&x<100)
else就近原则:
int a=1,b=2;
if(a==0)
if(b==1)
printf("2\n");
else
printf("3\n");
运行结果:
else只和最近的if匹配,上述else与if(b==1)匹配,所以不进行输出
switch语句
语法结构:
switch(整型表达式)
{
语句项;
}
语句项:
case 整型常量表达式:
语句;
例:
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
default:
printf("输入错误\n");
break;
}
如果没有break,则按顺序向下执行,break也遵循就近原则
switch允许嵌套使用
while循环
语法结构:
while(条件)
循环语句;
例:在屏幕上打出1-10
int main()
{
int i = 0;
while(i<10)
{
printf("%d\t", i+1);
i++;
}
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
break:永久终止循环(跳出循环)
int main()
{
int i = 0;
while(i<10)
{
if(i == 5)
break;
printf("%d\t",i+1);
i++;
}
return 0;
}
运行结果:
1 2 3 4 5
continue:跳过本次循环
将break换为continue
int main()
{
int i = 0;
while(i<10)
{
if(i == 5)
continue;
printf("%d\t",i+1);
i++;
}
return 0;
}
运行结果:
1 2 3 4 5
(死循环)
该循环中i=5时跳过continue后面的代码,不运行输出i+1和i++,进行下一次循环
EOF:文件中止标志
int main()
{
int ch = 0;
while((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
运行结果:
a
a
b
b
c
c
(键盘输入:a回车b回车c回车)
for循环
语法结构:
for(表达式1;表达式2;表达式3)
循环语句;
(表达式1、2、3可以省略)
例:
int main()
{
for(int i = 0;i <= 10; i++)
{
printf("%d\t",i);
}
return 0;
}
运行结果:
0 1 2 3 4 5 6 7 8 9 10
do while循环
语法结构:
do
循环语句;
while(表达式);
goto语句
跳回到goto后的位置:
flase:
printf("1");
goto false;
不建议使用,容易代码混乱
适用于跳出多层循环
关机、取消关机
cmd命令
shutdown -s -t 60//60s关机
shutdown -a//取消关机
c语言
system("shutdown -s -t 60");//system()执行系统命令
练习
1.输出1-10
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i < 11);
return 0;
}
2.输出n的阶乘
int main()
{
int n = 0;
scanf("%d", &n);
int sum = 1,i = 1;
do
{
sum = sum * i;
i++;
} while (i <= n);
printf("%d", sum);
return 0;
}
2.输出1-10的阶乘和
int main()
{
int n = 0;
int sum = 0;
int ret = 1;
for(int i = 1; i <= 10; i++)
{
ret *= i;
sum += ret;
}
printf("%d", sum);
return 0;
}
4.在一个有序数组中查找具体的某个数字n
二分查找:
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
int right = sz - 1;
int k;//查找的数
scanf("%d", &k);
while(left <= right)
{
int mid = (left + right) / 2;//中间值
if(arr[mid] < k)
{
left = mid + 1;
}
else if(arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了:%d", mid);
break;
}
}
if(left > right)
{
printf("找不到!\n");
}
return 0;
}
5.演示多个字符从两端移动,向中间汇聚
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
int main()
{
char a[] = {"###############"};
char b[] = {"hello world!!!!"};
int i = strlen(a);
int left = 0;
int right = i-1;
while(left <= right)
{
a[left] = b[left];
a[right] = b[right];
printf("%s\n",a);
Sleep(500);//休眠函数,引入windows.h
system("cls");//清屏
left++;
right--;
}
printf("%s\n",a);
system("pause");
return 0;
}
6.模拟用户登录情景,并且只能登陆三次(输入三次密码,密码正确提示登陆成功,三次均错误,则退出程序)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char a[20] = { 0 };
int i;
for(i = 1; i <=3; i++)
{
printf("请输入密码:");
scanf("%s",a);
if(strcmp(a,"123456") == 0)
{
printf("登陆成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if(i > 3)
{
printf("三次密码均错误,退出程序\n");
}
system("pause");
return 0;
}
tip:比较两个字符串是否完全相等用strcmp()函数,若相等,则等于0
7.猜数字游戏
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void menu()//菜单
{
printf("************\n");
printf("************\n");
printf("***1.game***\n");
printf("************\n");
printf("***2.exit***\n");
printf("************\n");
printf("************\n");
printf("************\n");
}
void game()//游戏
{
int ret = rand() %100 + 1;//定义随机数
int guess = 0;
while (1)
{
printf("请输入数字:");
scanf("%d", &guess);//猜的数字
if (guess < ret)
printf("猜小了\n");
else if (guess > ret)
printf("猜大了\n");
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//随机数生成,通过时间戳
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
}
8.求最大公约数
#include<stdio.h>
int main()
{
int m = 0;
int n = 0;
int max = 0;
int t = 0;
scanf("%d%d", &m, &n);
if (m > n)
max = n;
else
max = m;
//while (1)//普通方法
//{
// if (m % max == 0 && n % max == 0)
// {
// break;
// }
// else
// max--;
//}
while (m % n)//辗转相除
{
t = m % n;
m = n;
n = t;
}
/*printf("%d", max);*/
printf("%d", n);
return 0;
}
9.求1-100的素数
#include<stdio.h>
#include<math.h>//优化代码sqrt所用头文件
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)//可改为for(i = 2; i <= 99; i += 2),偶数不可能是素数,减少数据量
{
int j = 0;
for (j = 2; j < i; j++)//i可以改为sqrt(i),即j不能被根号i内的整除,可使循环次数减少
{
if (i % j == 0)
break;
}
if (i == j)
{
printf("%d\t", i);
}
}
}
10.打印1000-2000的闰年
#include<stdio.h>
int main()
{
int count = 0;
int i = 0;
for (i = 1000; i <= 2000; i++)
{
if (i % 4 == 0)
{
if (i % 100 != 0)
{
count++;
printf("%d ", i);
}
}
if (i % 400 == 0)
{
count++;
printf("%d ", i);
}
}
printf("\ncount = %d\n", count);//count为闰年数
}