C语言是一门结构化的程序设计语言
1. 顺序结构
2. 选择结构
3. 循环结构
这三种结构就是生活中存在的三种结构。
顺序结构就是一句一句的向下执行
选择结构 --> 分支语句
- if
- switch
循环结构 --> 循环语句
- while
- do while
- for
分支语句
if
// 种类一
if (条件){
语句;
}
// 种类二
if (条件){
语句;
}else{
语句;
}
// 种类三
if (条件)
语句;
else if(条件)
语句;
else
语句;
// 如果执行的语句比较多需要加上{}
可以嵌套使用 { }表示一个代码块–为了可读性比较强,一般建议加上 { }
悬空的else
#include <stdio.h>
int main(){
int a = 0;
int b = 0;
if (a==1)
if(b == 2)
print("hehe");
else
print("haha");
return 0;
}
结果为空 ;else的就近原则,所以(a==1)不正确代码就结束了。这个悬空的else和(b==2)是一组的。
switch----常用于多分支
switch(整型表达式){
语句项;
}
//语句项是一些case语句
case 整型常量表达式:语句;
int main(){
int nowDay=0;
scanf("%d",&nowDay);
switch(nowDay){ // nowDay必须是整型常量表达式float 1.0等都是不可以的
case 1: // case后面也必须是整型常量表达式 float 1.0等都是不可以的
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;
}
}
int main(){
int nowDay=0;
scanf("%d",&nowDay);
switch(nowDay){
case 1:
case 2:
case 3:
case 4:
case 5:
printf("现在是工作日\n");
break;
case 6:
case 7:
printf("现在是休息日\n");
break; // 编程的好习惯最好是加上,之后的可塑性会很好
default: //不满足所有的条件时执行可以写在switch中的任何地方
printf("输入错误\n");
break;
}
}
case只管进入 离开是由break管理的。在最后一个case语句后面加上break语句。
default可有可无,如果存在一般是处理非法的情况。
switch语句中只要没有break就一直向下执行。
循环语句
while
while(表达式为真){
执行语句;
}
//在想要跳出去的情况可以使用break
插曲
int main(){
int ch = 0;
while((ch=getchar()) != EOF){ //getchar()在键盘中获取值,输入函数
putchar(ch); //putchar()在显示器打印值,输出函数
} //EOF是文件结束标志end of file -> -1
return 0;
}
break
结束循环,终止循环中的所有的内容。
continue
本次循环结束,直接进入下一次循环。也就是本次循环中continue后面的代码不再执行,而是直接跳转到while语句的判断部分。进入下一次循环的入口的判断。
for
// 在使用while的时候如果代码量比较大那么整体就比较乱
初始化内容
...
while(条件判断){
执行语句
...
调整语句
...
}
// for循环就诞生了
for(表达式1;表达式2;表达式3){
循环语句;
}
表达式1为初始化部分,用于初始化循环变量,表达式2条件判断部分,用于判断循环什么时候终止。表达式3为调整部分,用于循环条件的调整。
for循环使用建议
不可以在for循环内修改循环变量,防止for循环失去控制。 可以写在表达式3中。
建议for语句的循环控制变量的取值采用“前闭后开区间”的写法。
for循环的变化
for循环的三个表达式都可以省略,但是判断部分如果被省略,恒为真。
do while
do{
循环语句;
}while(表达式);
特点:先执行一遍循环语句。
练习
- 计算n的阶乘
int main(){
int n;
int res=1;//阶乘
scanf("%d",&n);
for(int i=1;i<=n;i++){
res = res*i;
}
printf("res = %d",res);
}
- 计算1!+2!+3!+…+10!
int main(){
int sum = 0;
//控制10次和
for(int n=1;n<=3;n++){
//计算阶乘 每次算的时候应该res从0开始
int res=1;//阶乘
for(int i=1;i<=n;i++){
res = res*i;
}
sum+=res;
}
printf("sum = %d",sum);
}
- 在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=…<=v[n-1]的数组中查找x。
//可以遍历 但是没有进步性 这里使用的是二分查找
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int find = 7;
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] > find) {
right = mid - 1;
} else if (arr[mid] < find) {
left = mid + 1;
} else {
printf("找到了,下标是:%d", mid);
break;
}
}
if (left>right){ // 如果因为没有跳出来的情况是这样的
printf("找不到啊!\n");
}
return 0;
}
- 编写代码,演示多个字符从两端移动,并向中间汇聚。
//举例打印hello
//#####
//h###o
//he#lo
//hello
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main() {
char arr1[] = "hello world!"; //后期可以改成键盘输入
char arr2[] = "************"; //后期可以通过计算arr1的长度然后生成一个这样的字符串
int left = 0;
int right = sizeof(arr1) / sizeof(arr1[0]) - 2; // 因为获取到的是长度而且最后还有一个“\0”的结束标志,所以在这里要减2
// int right = strlen(arr1)-1; //使用函数获取长度 这时仅仅需要-1就可以了
while (left <= right) {
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s \n", arr2);
Sleep(500); //休息一秒
system("cls"); //#include <stdlib.h>中的函数,执行系统命令"cls"
left++;
right--;
}
return 0;
}
- 编写代码实现,模拟登录情景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录,如果三次输入错误,则退出程序)
#include <string.h>
int main() {
int i = 3;
char password[20] = {0};
for (i = 0; i < 3; i++) {
printf("请输入密码:");
scanf("%s", password);
if (strcmp(password, "123456") == 0) {
//双等号不能用来比较两个字符串相等,应该使用库函数-strcmp 如果相同返回值是0
//如果左边大于右边返回大于0的数,小于返回小于0的数,等于返回0
printf("登录成功\n");
break;
} else{
printf("密码错误!\n");
}
}
if (i == 3) {
printf("三次密码输入错误,退出程序");
}
return 0;
goto语句
int main(){
printf("hhh");
goto A;
printf("hhh123");
A:
printf("xxx");
return 0;
}
goto语句一般用于跳出深层循环
一个关机程序
#include <stdlib.h>
#include <string.h>
int main() {
char input[20] = {0};
//shutdown -s -t 60
//system()- 执行系统命令的函数
system("shutdown -s -t 60"); //需要#include <stdlib.h>
again:
printf("请注意,你的电脑在1分钟内关机。在这输入\"I'm a pig.\"我可以取消关机\nplease input:");
scanf("%s", input);
//C语言不能直接进行等于,需要借助函数
if (strcmp(input, "I'm a pig.")) {//需要#include <string.h>
system("shutdown -a");
} else {
goto again;
}
return 0;
}
//可以不适用goto实现
int main() {
char input[20] = {0};
//shutdown -s -t 60
//system()- 执行系统命令的函数
system("shutdown -s -t 60");
while (1) {
printf("请注意,你的电脑在1分钟内关机。在这输入\"I'm a pig.\"我可以取消关机\nplease input:");
scanf("%s", input);
if (strcmp(input, "I'm a pig.")) {
system("shutdown -a");
break;
}
}
return 0;
}