目录
7.do...while循环中的break和continue
5.模拟用户登录场景,只能登录三次,允许输入三次密码,密码正确则提示登录成功, 三次均错误,退出程序
分支循环语句::
分支语句:
1.if...else语句
C语言有九种控制语句,可分成以下三类:
1.条件判断语句也叫分支语句:if语句、switch语句;
2.循环执行语句:do...while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句;
if...else语句的执行结构
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
if(a>b)
{
printf("%d\n",a);
}
else
{
printf("%d\n",b);
}
return 0;
}
if...else if...else语句
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else if (age >= 18 && age < 30)
{
printf("青年\n");
}
else if (age >= 30 && age < 50)
{
printf("中年\n");
}
else if (age >= 50 && age < 80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
return 0;
}
2.悬空else
else的匹配:else是和它离得最近的if匹配的。
代码1和代码2比较:会发现适当的使用{}可以使代码的逻辑更加清楚,代码风格很重要。
//代码1
int main()
{
int a = 0;
int b = 2;
if (1 == a)
if (2 == b)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
//代码2
int main()
{
int a = 0;
int b = 2;
if (1 == a)
{
if (2 == b)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
3.if书写形式的对比及练习
if书写形式的对比
代码2和代码4风格更好一些,逻辑更加清晰,不容易出错。
//代码1
if (condition){
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
//代码3
int num = 1;
if(num == 5)
{
printf("haha\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("haha\n");
}
练习1:判断一个数是否为奇数
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
{
printf("奇数\n");
}
else
{
printf("No\n");
}
return 0;
}
练习2:输出1-100之间的奇数
#include<stdio.h>
//方法一:
int main()
{
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
i++;
}
return 0;
}
//方法二:
int main()
{
int i = 1;
while (i <= 100)
{
printf("%d ", i);
i += 2;
}
return 0;
}
4.switch语句
switch语句也是一种分支语句,常常用于多分支的情况.switch后跟整型表达式,case后跟整型常量表达式。
#include<stdio.h>
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;
}
5.switch语句中的break
在switch语句条件语句中时,作用是终止某个case并跳出switch结构,同时,多个case语句可以匹配一个表达式。
编程好习惯:在最后一个case的语句的后面加上一条break语句。
#include<stdio.h>
//输入1-5 输出的是weekday
//输入6-7 输出的是weekend
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
default:
printf("输入错误\n");
break;
}
return 0;
}
6.default子句
如果表达的值与所有的case标签的值都不匹配,可以在列表中加上default子句。当switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。所以每个switch语句只能出现一条default子句。
编程好习惯:在每个switch语句中都放一条default子句是个好习惯,甚至可以在后面再加上一个break。
#include<stdio.h>
//程序的输出结果是什么
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;//m=3
case 2:
n++;//n=2
case 3:
switch (n)
{
//switch允许嵌套使用
case 1:
n++;
case 2:
m++;//m=4
n++;//n=3
break;
}
case 4:
m++;//m=5
break;
default:
break;
}
printf("m=%d,n = %d\n", m, n);
return 0;
}
//输出结果是 m = 5 n = 3
循环语句:
1.while循环
while语句
#include<stdio.h>
//实例1:
//打印1-10的数字
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
//实例2:
int main()
{
int a = 20;
while (a > 10)
{
scanf("%d", &a);
printf("a = %d\n", a);
}
return 0;
}
2.while循环中的break和continue
break介绍:
break当它出现在循环语句中,作用是跳出当前内循环语句,执行后面的代码。当它出现在嵌套循环语句中时,跳出最近的内循环语句,执行后面的代码。
break在while循环中的作用:其实在while循环中,只要碰到break,就停止后期的所有循环,终止循环。所以,while中的break是用于永久终止循环的。
continue介绍:
在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句。
continue在while循环中的作用是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环入口的判断。
#include<stdio.h>
//程序的执行结果是什么
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
break;
printf("%d ", i);
i++;
}
return 0;
}
//输出结果是:1,2,3,4
#include<stdio.h>
//示例一:
//这个程序的运行结果是是什么
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
continue;
printf("%d ", i);
i++;
}
return 0;
}
//程序输出结果为:1,2,3,4...死循环
//示例二:
//这个程序的运行结果是是什么
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
//程序输出结果为:2,3,4,5,6,7,8,9,10,11
下面三段代码的功能分别是:
#include<stdio.h>
//获取键盘上的字符并将其输出 功能:自动换行
//代码1
int main()
{
int ch = 0;
while((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
//只打印数字字符,跳过其他字符
//代码2
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
continue;
putchar(ch);
}
return 0;
}
//清理缓冲区
//代码3中将代码1进行适当修改有清理输入缓冲区的作用
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
int ch = 0;
while ((ch = getchar()) != '\n')
{
;
}
printf("请确认密码(Y/N):>");
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/273293ae989e42ed83bef167a5c80c38.png)
3.for循环
for循环的语法结构:for(表达式1;表达式2;表达式3) 循环语句;
表达式1:
表达式1为初始化部分,用于初始化循环变量的。
表达式2:
表达式2为条件判断部分,用于判断循环是否终止。
表达式3:
表达式3为调整部分,用于循环条件的调整。
for循环相对于while循环的优点:
在while循环中依然存在着三个必须条件。但是由于代码风格的问题使得三个部分可能偏离较远,这样查找修改就不够集中和方便。所以for循环的风格更好,使用频率也最高。
#include<stdio.h>
//代码1
//在屏幕上打印1-10的数字
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
//代码2
//计算1+2+...+100
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
sum += i;
}
printf("sum = %d\n", sum);
return 0;
}
4.for循环中的break和continue
for循环中的break和continue的意义和在while循环中一样。
#include<stdio.h>
//代码1
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
break;
printf("%d ", i);
}
return 0;
}
//输出结果是1,2,3,4
//代码2
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
//输出结果是1,2,3,4,6,7,8,9,10
5.for循环的变种及一道笔试题
for循环的变种
#include<stdio.h>
int main()
{
//代码1
for (;;)
{
printf("haha\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议省略
//运行结果为死循环打印haha
//代码2
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("haha\n");
count++;
}
}
printf("%d\n", count);
//运行结果为打印100个haha
//代码3
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("haha\n");
}
}
//i=0时,进入内循环,j=0满足条件,执行10次,第一次内循环结束,此时j=10,第二次外循环,i=1
//j依然为10,不满足循环条件,不进入内循环
//运行结果为打印10个haha
//代码4
//使用多个变量控制循环
int x = 0;
int y = 0;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("haha\n");
}
return 0;
//运行结果为打印2个haha
}
一道笔试题
#include<stdio.h>
//问程序循环多少次
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
{
k++;
}
return 0;
//判断语句为k=0,注意该操作符为赋值操作符,又因为k被赋值为0,0为假,不进入循环,执行0次
//答案:0次
6.do...while循环
do...while循环至少执行一次,使用场景有限,所以不经常使用。
#include<stdio.h>
int main()
{
int a = 1;
do
{
a++;
printf("a=%d\n", a);
} while (a < 10);
return 0;
}
//程序输出结果为2,3,4,5,6,7,8,9,10
7.do...while循环中的break和continue
#include<stdio.h>
//代码1
int main()
{
int i = 0;
do
{
if (5 == i)
break;
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
//程序输出结果为0,1,2,3,4
//代码2
int main()
{
int i = 0;
do
{
if (5 == i)
continue;
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
//程序输出结果为0,1,2,3,4死循环
8.goto语句
C语言中提供了可以随意滥用的goto语句和标记跳转的符号,理论上goto语句没有必要存在,没有goto语句也可以很容易的写出代码,某些场合下goto语句还是用得着的,例如:跳出深度嵌套的循环。但是goto语句不能跨函数跳转。
注:一个工程中可以有多个.c,但是多个.c只能有一个main函数
#include<stdio.h>
int main()
{
for(...)
{
for(...)
{
for(...)
{
if(diaster)
goto error;
}
}
}
error:
if(diaster)
return 0;
}
分支循环语句代码训练:
1.计算n的阶乘
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i < n; i++)
{
ret = ret * i;
}
printf("%d\n", ret);
return 0;
}
2.计算1!+2!+3!+......+10!
#include<stdio.h>
//代码1
int main()
{
int i = 0;
int ret = 1;
int sum = 0;
int j = 0;
for (i = 1; i <= 10; i++)
{
ret = 1;
for (j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("sum = %d\n", sum);
return 0;
}
//优化代码1
int main()
{
int i = 0;
int ret = 1;
int sum = 0;
for (i = 1; i <= 10; i++)
{
ret *= i;
sum += ret;
}
printf("sum = %d\n", sum);
return 0;
}
3.在一个有序数组中查找具体的某个数字n(折半查找算法)
#include<stdio.h>
//遍历查找
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]) ;
int k = 7;
for (i = 0; i < sz; i++)
{
if (arr[i] = k)
{
printf("找到了,下标为:%d\n",i);
break;
}
}
if (i == sz)
{
printf("找不到\n");
}
return 0;
}
//二分查找
//二分查找算法的时间复杂度是log以2为底的n次方
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int k = 7;
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)
{
printf("找不到\n");
}
return 0;
}
//优化:防止数值溢出
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int k = 7;
while (left <= right)
{
int mid = left + (right - left) / 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)
{
printf("找不到\n");
}
return 0;
}
4.演示多个字符从两端移动,向中间汇聚
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
char arr1[] = "Happy Sister weiwei";
char arr2[] = "###################";
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;
}
5.模拟用户登录场景,只能登录三次,允许输入三次密码,密码 正确则提示登录成功,三次均错误,退出程序
#include<stdio.h>
//比较两个字符串是否相等,不能使用==而应该使用字符串函数strcmp
int main()
{
int i = 0;
//假设密码是字符串 abcdef
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:->");
scanf("%s", password);
if (strcmp(password, "abcdef") == 0)
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
{
printf("三次密码均输入错误,退出程序\n");
}
return 0;
}
6.猜数字游戏(函数形式)
时间戳:现在的时间相对于计算机起始时间的差值,单位是秒,time函数返回的就是时间戳。虽然要求在rand函数调用之前调用srand,但不是要求每次调用rand函数都调用srand,而是在整个工程中设置一次就可以了。
注:rand函数生成随机数的范围是0—32767
#include<stdio.h>
void menu()
{
printf("***************************\n");
printf("********** 1.play *******\n");
printf("********** 0.exit *******\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()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
7.关机小程序
//电脑运行起来后 1分钟内关机
//如果输入我是猪 就取消关机
//方法一
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
again:
printf("请注意你的电脑将在60秒内关机,如果输入我是猪,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
//方法二
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("请注意你的电脑将在60秒内关机,如果输入我是猪,就取消关机");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
break;
}
}
return 0;
}
C语言编程训练(牛客网):
1.BC9——printf函数的返回值
#include <stdio.h>
int main()
{
int n = printf("Hello world!");
puts("");
printf("%d\n",n);
return 0;
}
2.BC11——学生基本信息输入输出
#include <stdio.h>
int main()
{
int id = 0;
float c = 0.0f;
float math = 0.0f;
float Eng = 0.0f;
//输入
scanf("%d;%f,%f,%f",&id,&c,&math,&Eng);
//输出
printf("The each subject score of No. %d is %.2f, %.2f, %.2f.\n",id,c,math,Eng);
return 0;
}
3.BC13——ASCII码
#include <stdio.h>
int main()
{
int arr[]={73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33};
int i = 0;
while(i < sizeof(arr)/sizeof(arr[0]))
{
printf("%c",arr[i]);
i++;
}
return 0;
}
4.BC14——出生日期输入输出
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int date = 0;
scanf("%4d%2d%2d",&year,&month,&date);
printf("year=%d\n",year);
printf("month=%02d\n",month);
printf("date=%02d\n",date);
return 0;
}
5.BC25——计算体重指数
#include <stdio.h>
int main()
{
int weight = 0;
int high = 0;
scanf("%d %d",&weight,&high);
float BMI = weight/(high/100.0)/(high/100.0);
printf("%.2f\n",BMI);
return 0;
}
6.BC27——计算球体的体积
#include <stdio.h>
int main()
{
double r = 0.0;
double v = 0.0;
scanf("%lf",&r);
v = 4/3.0 * 3.1415926 * r * r * r;
printf("%.3lf",v);
return 0;
}
7.BC123——小乐乐找最大数
#include <stdio.h>
int main()
{
int arr[4]={0};
int i = 0;
while(i < 4)
{
scanf("%d",&arr[i]);
i++;
}
int max = arr[0];
i = 1;
while(i<4)
{
if(arr[i]>max)
{
max = arr[i];
};
i++;
}
printf("%d\n",max);
return 0;
}
8.BC131——KIKI学程序设计基础
#include <stdio.h>
int main()
{
printf("printf(\"Hello world!\\n\");\n");
printf("cout << \"Hello world!\" << endl;\n");
return 0;
}