C语言是结构化的程序设计语言,分为:顺序结构、选择结构、循环结构。
switch语句也是一种分支语句,常常用于多分支的情况。
比如:输入1,打印星期一;输入2,打印星期二……输入7,打印星期天。这种如果用if...else if...else的形式就过于复杂了,这种类型就适用于switch语句。
switch语句的形式 语句项
switch(整形表达式) 语句项一般是case语句
{ 语句项; case (整形常量表达式):
} 语句
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{ int day = 0;
scanf("%d", &day);
switch (day)
{case 1:
printf("星期一\n");
break; //在switch语句中,没办法直接实现分支,搭配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;
}
return 0;
}
下面展示一个switch语句的练习:
输出结果为:m=5,n=3
需要说明的是break跳出的是自己所在的switch
在屏幕上打印1-10的数字 在while循环中,break用于永久的终止循环
在while循环中,continue的作用是跳过本次循环continue后边的的代码
include<stdio.h>
int main()
{
int a = 1;
while (a <= 10)
{
if (a == 5)
continue; //经过监视操作发现,当a值为5时,代码陷入死循环,12344……
printf("%d",a);
a++;
};
return 0;
下面来介绍getchar(获取一个字符)和putchar(输出一个字符)的相关操作
如果读取正确的话,getchar返回的是读取字符的ASCII值,读取错误的话会返回EOF(end-of-file)-文件结束标志
#include<stdio.h>
int main()
{ char ch=0;
while((ch=getchar())!=EOF)
putchar(ch);
return 0;
}
注:当输入ctrl+z时程序结束
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{ char password[20] = { 0 };
printf("请输入密码\n");
scanf("%s", password);
printf("请确认密码(Y/N)\n");
int tmp = 0 ;
while((tmp=getchar())!='\n')//此处应用循环是为了清理缓冲区,避免读取\n,直接导致程序结束
{ //另:用循环来处理也可以处理空格
;
}
int ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
这是getchar的应用场景。
while循环由初始部分、判断部分、调整部分三部分组成,在后期程序修改时较难查找,因此引入if循环。
//在屏幕上打印1-10
#include<stdio.h>
int main()
{ int i = 0 ;
if(i=1 ; i<=10 ; i++)
{
printf("%d",i);
};
return 0;
}
for语句的注意事项:1.不可在for循环体内修改循环变量,防止for循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
下面来一个for循环嵌套的试题:
最终运行结果为9
do语句的特点:循环至少执行一次,使用的场景有限,所以不适合经常使用。
下面介绍do...while循环的使用方法:
#include<stdio.h>
int main()
{ int a = 0;
do
{
printf("开心\n");
a++;
} while (a <= 10);
return 0;
}
整体思路:在数据明确时,运用for循环比较简单
//计算n的阶乘
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int n = 0;
scanf("%d", &n);
int mul = 1;
for (a = 1; a <= n; a++)
{
mul *= a;
};
printf("%d\n", mul);
return 0;
}
在C语言中,"*="是一个复合赋值运算符,用于将左操作数乘以右操作数,并将结果赋值给左操作数。例如,"a *= 6"的意思是将a乘以6,并将结果赋值给a。
如左图,1!+2!+3!=1+2+6=9!=15,由此可以看出程序不正确,经过分析得出:mul在计算完2的阶乘后,并没有把保留下来的返回值2重置为1,导致3!的算法变成了2*1*2*3=12,所以导致最终运行结果出错。解决方法如右图:在一次循环完成后让mul重置为1。
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 1;
int right = sz - 1;
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\n", mid);
break;
}
}
if (left > right)//当left>right时,数组内所有数据搜索完毕
{
printf("找不到\n");
}
return 0;
}
以打印”welcome to world “为例:
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = "welcome to world!!!" ;
char arr2[] = "##################\0" ;
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//休眠一秒
system("cls");//清空屏幕
left++;
right--;
}
printf("%s\n",arr2);
return 0;
}
为了加强动画效果,可以加入Sleep函数,该函数需要引用头文件#include<windows.h>
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int a = 0;
char password[20] = { 0 };
for (a = 0; a < 3; a++)
{
printf("请输入密码:>");
scanf("%s", password);//数组名不用取地址,数组名本身就是地址
if (strcmp(password, "123456") == 0)
{
printf("密码正确\n");
break;
}
else
{
printf("密码错误,请重新输入\n");
}
}
if (a == 3)
{
printf("密码三次输入错误,已锁定\n");
}
return 0;
}
输入数字,从大到小依次排列
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
if (a < b)
{ int tmp = a;
a = b;
b = tmp;
}
if (a < c)
{
int tmp = a;
a = c;
c = tmp;
}
if (b < c)
{ int tmp = b;
b = c;
c = tmp;
}
printf("%d %d %d\n", a, b, c);
return 0;
//输入两个数,求这两个数的最大公约数
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = 0;
if (a > b)
{
max = b;
}
else
{
max = a;
}
for (max ; max <= 100; max--)
{
if (a % max == 0 && b % max == 0)
{
printf("最大公约数是:%d\n", max);
break;
}
}//最小公倍数是m*n/最大公约数
return 0;
}
goto语句可用于循环,但是多个goto语句连用会造成程序混乱。
代码陷入死循环
用goto语句写一个关机程序
goto 语句只能在一个函数范围内跳转,不能跨函数。如下图: