一.修炼必备
1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)
2.趁手武器:印象笔记/有道云笔记
3.修炼秘籍:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)
4.雷劫必备:leetcode 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
注:遇到瓶颈怎么办?百度百科_全球领先的中文百科全书 (baidu.com)
二.分支语句详解(一)
1.C语言的结构类型
1)顺序结构:按照顺序从上到下执行C语句
2)选择结构:执行具有选择的C语句
3)循环结构:循环的执行某些C语句
2.什么是语句?
—— C语言由一个分号(;)隔开的就是一条语句
#include <stdio.h>
int main()
{
//C语言由一个分号(;)隔开的就是一条语句
;//空语句
int a = 10;//语句
return 0;//这就是一条语句
}
3.分支语句(if)详解
1)单分支:if(表达式){}
#include <stdio.h>
int main()
{
int a = 1;
//单分支{}
if (a)
{
printf("a = %d\n", a);//1
}
return 0;
}
2)双分支:if(表达式){ } else{ }
—— 如果if的表达式为真,执行if{ }里面的语句,反之执行else{ }里面的语句
#include <stdio.h>
int main()
{
int a = 0;
//双分支:if(){} else {}
if (a)
{
printf("hehe\n");
}
else
{
printf("haha\n");//haha
}
return 0;
}
3)多分支:if(表达式){ } else if(表达式){ } else if(表达式){ } …… else { }
—— 那个的表达式为真则执行那个,如果都不为真,则执行最后的else{ }中的代码
#include <stdio.h>
//多分支:if(表达式){} else if(表达式){} else if(表达式){} …… else {}
//—— 那个的表达式为真则执行那个,如果都不为真,则执行最后的else{}中的代码
int main()
{
int a = 10;
int b = 11;
int c = 10;
if (a == b)
{
printf("a等于b\n");
}
else if (b == c)
{
printf("b等于c\n");
}
else if (a == c)
{
printf("a等于c\n");//a等于c
}
else
{
printf("三个数均不相等!!!\n");
}
return 0;
}
4)if中的相互嵌套
#include <stdio.h>
//if中的相互嵌套
int main()
{
int age = 0;
scanf("%d", &age);
if (age > 18)
{
if (age > 30)
{
printf("中年\n");
}
else
{
printf("青年\n");
}
}
else
{
printf("未成年\n");
}
return 0;
}
5)判断以下代码的输出(悬空else)
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("haha\n");
else
printf("hehe\n");
return 0;
}
注:什么也不会打印,因为else只会和离它最近的那个if进行匹配
正确代码如下:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("haha\n");
else
printf("hehe\n");
return 0;
}
6)小tips
i.C语言中,0和NULL表示假,非0表示真
ii.一对{}就是一个代码块
#include <stdio.h>
int main()
{
int a = 0;
int* p = NULL;
if (a)
{
printf("hello\n");
}
else
{
printf("see you\n");//see you
}
if (p)
{
printf("null\n");
}
else
{
printf("true\n");//true
}
return 0;
}
7)practice
i.判断一个数是不是奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 0)
{
printf("%d是偶数\n", num);
}
else
{
printf("%d是奇数\n", num);
}
return 0;
}
ii.判断一个数是不是素数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
int i = 0;
for (i = 2; i < num; i++)
{
if (num % i == 0)
{
printf("%d不是素数\n", num);
return 0;
}
}
printf("%d是素数\n", num);
return 0;
}
三.分支语句详解(二)
1.switch语句的形式
switch(整型表达式)
{
case 整型常量表达式;
语句;
case 整型常量表达式;
语句;
case 整型常量表达式;
语句;
case 整型常量表达式;
语句;
……
default:
语句;
}//解释:case匹配switch整型表达式中的值,和那个case匹配则执行那个case中的语句,
//如果都不匹配,则执行default中的语句
2.一个小case快速上手switch
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
case 7:
printf("Sunday\n");
break;
default:
printf("我也不知道什么day啦~\n");
break;
}
return 0;
}
3.switch的细节讨论
1)switch(表达式)中的表达式必须是整型表达式,若是使用其他类型,则报错
整型表达式包括:char、short、int、long、long long
#include <stdio.h>
int main()
{
char ch = 'a';
scanf("%c", &ch);
switch (ch)
{
case 'a':
printf("a\n");
break;
case 'b':
printf("b\n");
break;
case 'c':
printf("c\n");
break;
case 'd':
printf("d\n");
break;
default:
printf("error\n");
break;
}
//double db = 0;
//scanf("%lf", &db);
//switch (db){} //错误,表达式不能是除整型外的其他类型
return 0;
}
2)case的后面只能跟整型常量表达式,不能是变量或其他类型的常量值
#include <stdio.h>
int main()
{
int day = 0;
int opt = 10;
scanf("%d", &day);
switch (day)
{
//case opt://错误,opt是变量名,而不是整型常量值
//case 1.3://错误,1.3是浮点数,而不是整型常量值
case 1://正确,1是整型常量值
printf("Monday\n");
break;
}
return 0;
}
3) 编程好习惯:case/defaul语句的结束都应加上break语句跳出switch语句,除非有特别要求
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
case 7:
printf("Sunday\n");
break;
default:
printf("我也不知道什么day啦~\n");
break;
}
return 0;
}
4)switch允许嵌套使用
#include <stdio.h>
int main()
{
int num = 1;
int a = 0;
int b = 10;
switch (num)
{
case 1:
switch (b)
{
case 10:
a++;
break;
case 20:
b++;
a++;
break;
default:
b++;
break;
}
break;
default:
break;
}
printf("%d %d\n", a, b);//1 10
return 0;
}
4.思考以下的代码输出什么?
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{
case 1:
n++;
case 2:
n++;
m++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("%d %d\n", m, n);// 5 3
return 0;
}
!!!恭喜你,成功突破至练气七层!!!
四.循环语句详解
1.循环语句形式
//1.while循环
while (条件)
{
语句;
}
解释:while里面的条件为真才会执行while循环里面的语句//2.do-while循环
do
{
语句;
} while (条件);
解释:do-while循环,先执行一次循环里面的所有语句,然后在进行判断while里面的条件//for循环
for(初始值;条件判断;调整部分)
{
语句;
}
解释:for循环只进行初始化一次,然后进行条件判断,为真则执行for循环里面的语句,为假则跳出循环,
执行完for循环里面的所有语句后,进行调整部分,然后在进行条件判断。一直执行到条件为假时跳出循环。
2.一个小case带你快速了解循环
#include <stdio.h>
//使用三种循环打印1-10的值
int main()
{
int i = 1;
//while循环
while (i <= 10)
{
printf("%d ", i);
i++;
}
printf("\n");
i = 1;
//do-while循环
do
{
printf("%d ", i);
i++;
}while (i <= 10);
printf("\n");
//for循环
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
3.循环语句细节讨论
1)while循环、do-while循环、for循环中的条件判断不为0或NULL才会执行里面的语句,但是do-while循环会执行一次
#include <stdio.h>
int main()
{
int i = 0;
int* p = NULL;
while (i)
{
printf("haha\n");
}
do
{
printf("hehe\n");//hehe
} while (p);
for (i = 0; i == 0; i++)
{
printf("hihi\n");
}
return 0;
}
2)死循环
//while的死循环
while (1){}
//do while的死循环
do
{
} while (1);
//for循环的死循环
for(;;){}
//解释:只要要条件判断恒为真,则会导致死循环
3)不建议在循环中修改循环变量,这会导致程序走向不可估计的方向
五.break、continue语句
1.break、continue的形式
//一般情况下就是加分号就使用
break;//使用在switch和循环中使用
1)break在switch中的作用:跳出switch语句
2)break在循环中的作用:终止循环,执行循环后面的语句
continue;//只能在循环中使用
1)跳过本次循环,也就是说本次循环后面的代码不会执行,在while、do-while循环中直接跳到条件判断,for循环中跳到调整部分,然后才到条件判断部分
2.一个小case让你快速上手break、continue语句
break代码:
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);// 1 2 3 4
i++;
}
printf("\n");
i = 1;
do
{
if (i == 4)
break;
printf("%d ", i);//1 2 3
i++;
} while (i <= 10);
printf("\n");
for (i = 1; i <= 10; i++)
{
if (i == 4)
{
break;
}
printf("%d ", i);//1 2 3
}
return 0;
}
continue代码:
#include <stdio.h>
//代码一:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);// 1 2 3 4 死循环
i++;
}
printf("\n");
return 0;
}
//代码二:
int main()
{
int i = 1;
do
{
if (i == 4)
continue;
printf("%d ", i);//1 2 3 死循环
i++;
} while (i <= 10);
printf("\n");
return 0;
}
//代码三:
int main()
{
for (i = 1; i <= 10; i++)
{
if (i == 4)
{
continue;//跳过后面的语句后还会执行i++
}
printf("%d ", i);//1 2 3 5 6 7 8 9 10
}
return 0;
}
3.break、continue在循环中的细节讨论
1)break在switch和循环中使用,使用后跳出switch和循环
//break在switch中的使用
int main()
{
int month = 1;
scanf("%d", &month);
switch (month)
{
case 12:
case 1:
case 2:
printf("冬季\n");
break;
case 3:
case 4:
case 5:
printf("春季\n");
break;
case 6:
case 7:
case 8:
printf("夏季\n");
break;
case 9:
case 10:
case 11:
printf("秋季\n");
break;
default:
printf("输入的月份有误\n");
break;
}
return 0;
}
2)continue只能在循环中使用
4.思考以下代码的结果
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
//问:循环执行多少次?0次,k=0后直接跳出循环,因为0为假
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
六.goto语句
1.goto语句介绍
C语言提供了可以随意滥用的goto语句和标记跳转的标号,goto语句常用于跳出多层循环
注:我们在万不得已的情况下,才会使用goto语句,因为goto语句会打乱程序和可读性较差
goto语句的语法:goto 标记;
2.一个小case让你快速了解goto语句
#include <stdio.h>
int main()
{
int i = 1, j = 1, k = 1, m = 1, n = 1;
for (i = 1; ;i++)
{
for (j = 1; ;j++)
{
for (k = 1; ;k++)
{
for (m = 1; ;m++)
{
for (n = 1; ;n++)
{
goto here;
}
}
}
}
}
here:
printf("haha\n");
return 0;
}
3.使用goto语句完成关机
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
int main()
{
char arr[10] = { 0 };
system("shutdown -s -t 60");//电脑60s后关机
again:
printf("电脑在一分钟后关机,如果输入:我是pig,则取消关机!\n请输入:");
scanf("%s", arr);
if (0 == strcmp("我是pig", arr))//字符串比较需要使用strcmp,相等则返回0
{
system("shutdown -a");//取消关机命令
}
else
{
goto again;
}
return 0;
}
!!!恭喜你,成功达到练气八层!!!