【C语言_C语言语句_复习篇】

目录

一、C语言的语句有哪些

        1.1 空语句

        1.2 表达式语句

        1.3 函数调用语句

        1.4 复合语句

        1.5 控制语句

 二、分支语句(两种)

        1.1 if语句

                1.1.1  普通分支语句(if、if_else)

                1.1.2  嵌套if语句

                1.1.3  else嵌套if两种写法的比较

                1.1.4  else悬空问题

                1.1.5  if语句的代码可读性

        1.2  switch语句(不常用)

三、循环语句 

         3.1 while循环

         3.2 do_while循环(不常用)

         3.3 for循环

         3.4 循环嵌套的练习

 四、转向语句

        4.1 break 语句

        4.2 continue 语句

        4.3 goto 语句

        4.4 return 语句

五、选择语句_例题

六、循环控制_例题

七、循环打印二维图形_例题


一、C语言的语句有哪些

1. C语言代码由一条条语句构成,每条语句的结束标志是封号

2. C语言的语句有5大类分别是空语句表达式语句函数调用语句复合语句控制语句

1.1 空语句

1. 概念:封号前面什么都不写的一条语句称为空语句。

2. 用法:这里需要一条语句,但不希望这条语句其任何作用。

int main()
{;//空语句return 0;
}

 1.2 表达式语句

1. 问:编程语言中表达式可以由什么构成?

    答:一个操作数、一个操作数和一个运算符、两个操作数和一个操作符,多个操作数和多  个操作符,例如:1,i++,1+2,1+2*3,c=a+b。

2. 概念:封号前面是表达式的一条语句称为表达式语句。

int main()
{int i = 0;int a = 0, b = 0, c = 0;1;//表达式语句i++;//表达式语句1 + 2;//表达式语句1 + 2 * 3;//表达式语句c = a + b;表达式语句return 0;
}

1.3 函数调用语句

1. 概念:封号前面是函数调用的一条语句称为函数调用语句。

2. 用法:在函数中需要利用具有某功能的函数时使用。

int Add(int a, int b)
{return a + b;
}int main()
{int a = 1;int b = 2;int sum = Add(a, b);//自定义函数的函数调用printf("%d\n", sum);//库函数的函数调用return 0;
}

1.4 复合语句

1. 概念:被{ }包裹起来的所有语句整体被称为复合语句。

2. 补充:一个{ }被称为一个代码块。

//在屏幕上打印用*组成的金字塔,行高列宽均为4int main()//复合语句1
{int i = 0;for (i = 0; i < 4; i++)//复合语句2{int j = 0;//空白for (j = 0; j < 4 - 1 - i; j++)//复合语句3{printf(" ");}//星星for (j = 0; j <= i; j++)//复合语句4{printf("*");}//换行printf("\n");}return 0;
}

 1.5 控制语句

1. 概念:控制语句共9种,用于控制程序的执行流程,实现顺序、选择和循环结构

    ① 选择语句:if_else语句、switch语句

    ② 循环语句:while语句、do_while语句、for语句

    ③ 转向语句:break语句、continue语句、goto语句、return语句

 二、分支语句(两种)

1.1 if语句

1.1.1  普通分支语句(if、if_else)

1. 如果表达式成立就执行...否则就执行...。

2. if 和 else 默认只能控制一条语句,相同时控制多条语句需使用{ }括起来。

1.1.2  嵌套if语句

1. 如果表达式1成立并且表达式2成立就执行...否则就执行...。

2. 如果表达式1不成立的基础上表达式2成立就执行...否则就执行...。

3. if_else if _else 适用于将主线直接分成几部分的情况。

4.   总之,if语句的嵌套,其实就是将分支单元划分为更小的分支单元。if中直接嵌套if表示条件的条件,eles中嵌套if,普通写法表示将上一个条件不满足的部分划分为更小的分支单元,而 if_else if _else 写法常用于题目中有明显想将主线划分为多个并列分支单元的意向。

1.1.3  else嵌套if两种写法的比较

//else嵌套if两种写法的比较:
//两种写法本质是一个意思,只是在于使用者喜欢怎样去使用
//题目:判断整型n是正数、负数还是0
//写法一:
int main()
{int n = 0;scanf("%d", &n);//判断if(n > 0){printf("%d是正数\n", n);}else//else部分就只剩下<=0的情况了{//理解成剩余部分再划分的写法if(n < 0){printf("%d是负数\n", n);}else{printf("%d是0\n", n);}}return 0;
}
//写法二:
int main()
{int n = 0;scanf("%d", &n);//判断if(n > 0){printf("%d是正数\n", n);}else if(n < 0)//理解成主线划分的多个并列的分支写法{printf("%d是负数\n", n);}else{printf("%d是0\n", n);}return 0;
}

1.1.4  else悬空问题

1. 问题起源:在写C语言题目或读别人的代码时,由于代码可读性差导致我们无法准确判断if语句中的else到底是跟着哪个if,因而造成了else悬空问题。

2. 解决方法:代码从上往下读,只要遇到else就根据else总是与最近的未配对的if配对原则进行匹配即可。

int main() 
{int a = 1;int b = 2;if ( a == 0 )if ( b == 2 )printf("123\n");elseprintf("abc\n");return 0;
}
//这段代码在屏幕上什么都不会打印
//是因为该代码中的else与第二个if配对,而不是与第一个if配对

1.1.5  if语句的代码可读性

//示例1:比较变量a和常数3是否相等,相等就在屏幕上打印hehe
int main()
{int a = 0;if (a = 3)//手误写法,最终会造成表达逻辑有误{printf("hehe\n");}
}
//启示:
//变量和常数比较是否相等时,把常数写在左边,变量写在右边
//这样当我们粗心把==写成=时编译器会报警告,而不是继续编译//示例2:虽节省空间,但可读性差
int main(){int a = 0;if (a == 0){printf("hehe\n");}else{printf("haha\n");
}
//启示:
//不能省的空间不要省,无论控制1条还是控制多条语句都写上代码块//示例3:可读性好
int main()
{int arr[] = { 1,2,3 };int sz = sizeof(arr) / sizeof(arr[0]);//定义数字后立即计算数组大小int i = 0;for (i = 0; i < sz; i++){if (2 == arr[i])//比较常量和变量是否相等时,常量在左,变量在右{printf("hehe");//不管控制几条语句,都采用代码块括起来}}return 0;
}

1.2  switch语句(不常用)

1. switch语句可实现多分支,由于使用条件苛刻所以在特定情况下才主动使用switch语句。

2. 苛刻条件:

①switch后面的表达式必须是整型表达式。

②case后面的值必须是整型常量表达式(字符是特殊的整型类型,枚举类型也可以)。

3. 需要理解:

①case和default相当于每个分支的入口,而break相当于每个分支的出口,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,直到遇到break语句或者来到switch语句的结尾才会跳出switch语句。

②当所有case都不满足时,才执行default分支,default分支可依据具体情况选择写还是不写

③每个switch语句只能有一个default分支。

④case和default分支没有顺序要求,但dafault通常写在最后面。

⑤switch语句的最后一个分支可以不写break,但最好是写上。

switch(表达式)
{
case 值1:语句1;语句2;...break;
case 值2:语句1;语句2;...break;
case 值3:语句1;语句2;...break;
...
default:语句1;语句2;...break;
}

三、循环语句 

 3.1 while循环

1. 特点:循环条件总是比循环体多执行一次,且循环变量需在循环体内部调整。

2. 补充:想要一直循环可以将表达式写成恒真的形式,例如:while(1)。

3. 运行过程:先判断while后面的表达式是否为真,如果为真就执行一次循环体的内容,执行完后,程序又会来到while循环的第一行,继续判断while后面的表达式是否为真;如果为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容。

 3.2 do_while循环(不常用)

1. 特点:循环体至少执行一次,且循环变量需在循环体内部调整。

2. 注意:do_while中while后面的封号别忘记写了。

3. 运行过程:先执行do后面代码块内的所有内容,执行完后来到while所在行,判断while后面的表达式是否为真,如果为真将继续执行一次循环体内的所有内容;如果为假,将跳出循环来到while(表达式)的下一行。

 3.3 for循环

1. 表达式1:循环变量初始化部分

    表达式2:循环是否继续的条件

    表达式3:循环变量的调整

2. 特点:表达式1至执行一次,表达式2总是比循环体多执行一次。

3. 注意:①表达式之间是用封号隔开的 ②表达式1、2、3均可以省略,但并不建议省略 ③for循环的循环条件所含的循环变量不一定要写在表达式3的位置,例如,《国王发金币问题》[NOIP2015]金币_牛客题霸_牛客网 (nowcoder.com)

4. 运行过程:先执行表达式1,再就表达式2的真假判断是否要执行循环体的内容,如果表达式2为真,那么将执行一次循环体内的内容,执行完后,程序将回到for循环的第一行,执行表达式3,执行完后,再次执行表达式2,判断是否要继续执行循环体的内容;如果表达式2为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容,包括表达式3。

 

//《国王发金币问题》
解法一:
int main()
{int k = 0;scanf("%d", &k);int day = 0;//已计算的天数int sum = 0;//发放的金币总和for(int money = 1; day < k; money++){for(int i = 0; i < money; i++){sum += money;day++;if(day == k){break;}}}//输出printf("%d\n", sum);return 0;
}//解法二:
int main()
{int k = 0;scanf("%d", &k);int day = 0;//已发金币的天数int money = 1;int sum = 0;while (money){int i = 0;for (i = 0; i < money; i++){sum += money;day++;if (day == k){goto next;}}money++;}
next://输出结果printf("%d\n", sum);return 0;
}

 3.4 循环嵌套的练习

//【打印100~200之间的素数】
int main()
{int i = 0;//循环产⽣100~200的数字for(i=101; i<=200; i += 2){int flag = 1;//假设每次得到的i是素数int j = 0;for(j=2; j<=(int)sqrt((double)i); j++){if(i % j == 0){flag = 0;break;}}//if(flag == 1){printf("%d ", i);}}return 0;
}

 四、转向语句

4.1 break 语句

1. 关键字break的作用:只要break在循环体中被执行,就会直接跳出当前所在的一层循环。

4.2 continue 语句

1. 关键字continue的作用:跳过本次循环体中后面的代码。

4.3 goto 语句

1. C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号,goto 语句可以实现在同⼀个函数内跳转到设置好的标号处,标号一定要顶格写。

2. goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以建议能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。

4.4 return 语句

1. return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式的结果。

2. return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。

3. return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。

4. return语句执⾏后,函数就彻底返回,后边的代码不再执⾏,如下方图片代码。

5. 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return,否则会出现编译错误。

五、选择语句_例题

[NOIP2008]ISBN号码_牛客题霸_牛客网 (nowcoder.com)

//18.ISBN号码//打印数组
void Print(char arr[], int sz)
{int i = 0;//循环变量for (i = 0; i < sz; i++){printf("%c", arr[i]);}
}int main()
{char arr[13] = { '0' };int sz = sizeof(arr) / sizeof(arr[0]);int sum = 0;int j = 1;int i = 0;//循环变量for (i = 0; i < sz; i++){scanf("%c", &arr[i]);if (i != 1 && i != 5 && i != 11 && i != 12){sum += (arr[i] - 48) * (j++);}}//if (sum % 11 == 10){if (arr[sz - 1] == 'X'){printf("Right\n");}else{arr[sz - 1] = 'X';Print(arr, sz);}}else{if (arr[sz - 1] == sum % 11 + 48){printf("Right\n");}else{arr[sz - 1] = sum % 11 + 48;Print(arr, sz);}}return 0;
}

六、循环控制_例题

包含数字9的数_牛客题霸_牛客网 (nowcoder.com)

水仙花数_牛客题霸_牛客网 (nowcoder.com)

变种水仙花_牛客题霸_牛客网 (nowcoder.com)

小乐乐与进制转换_牛客题霸_牛客网 (nowcoder.com)

[NOIP2015]金币_牛客题霸_牛客网 (nowcoder.com)

回文对称数_牛客题霸_牛客网 (nowcoder.com)

//5.求1~2019之间含有数字9的数有几个int main()
{int i = 0;//循环变量int count = 0;//计数器for (i = 1; i < 2020; i++){int i2 = i;//替身while (i2){if (i2 % 10 == 9){count++;break;}i2 /= 10;}}//输出printf("%d\n", count);return 0;
}
//7.求整数m~n之间的水仙花数#include <math.h>int main()
{int m = 0, n = 0;while (~scanf("%d %d", &m, &n)){int flag = 1;//如果这组中没有水仙花数for (; m <= n; m++){int sum = 0;int m2 = m;while (m2){sum += (int)pow(m2 % 10, 3.0);//调整m2 /= 10;}if (m == sum){flag = 0;printf("%d ", m);}}换行//printf("\n");//但题目的意思是不用换行//if (flag){printf("no\n");}}return 0;
}
//8.求5位数中的所有变种水仙花数int main()
{int i = 0;//循环变量for (i = 10000; i < 100000; i++){int j = 0;//被除数int sum = 0;for (j = 10; j < 100000; j *= 10){sum += (i % j) * (i / j);}if (i == sum){printf("%d ", i);}换行//printf("\n");//但题目的意思是不用换行}return 0;
}
//10.将一个10进制数转化成6进制数并输出int main()
{int n = 0;int arr[20] = { 0 };int i = 0;scanf("%d", &n);while (n){arr[i++] = n % 6;n /= 6;}//for (i--; i >= 0; i--){printf("%d", arr[i]);//数组元素里面存的数字仍然是10进制的}return 0;
}
//11.国王发金币*int main()
{int k = 0;scanf("%d", &k);int day = 0;//已发金币的天数int money = 1;int sum = 0;while (money){int i = 0;for (i = 0; i < money; i++){sum += money;day++;if (day == k){goto next;}}money++;}
next://输出结果printf("%d\n", sum);return 0;
}
//12.回文对称数int main()
{int n = 0;int i = 0;//循环变量scanf("%d", &n);for (i = 1; i <= n; i++){int i2 = i;int sum = 0;while (i2){sum = sum * 10 + i2 % 10;//调整i2 /= 10;}if (i == sum){printf("%d\n", i);}}return 0;
}

七、循环打印二维图形_例题

菱形图案_牛客题霸_牛客网 (nowcoder.com)

K形图案_牛客题霸_牛客网 (nowcoder.com)

//8.菱形图案*int main()
{int n = 0;while (~scanf("%d", &n)){int i = 0;//行int j = 0;//列//上三角for (i = 0; i < n; i++){//空格for (j = 0; j < n - i; j++){printf(" ");}//星星for (j = 0; j <= i; j++){printf("* ");}//换行printf("\n");}//下三角for (i = (n + 1); i > 0; i--){//空格for (j = 0; j < (n + 1) - i; j++){printf(" ");}//星星for (j = i; j > 0; j--){printf("* ");}//换行printf("\n");}}return 0;
}
//9.K形图案*int main()
{int n = 0;while (~scanf("%d", &n)){int i = 0;//行int j = 0;//列//上三角for (i = n; i > 0; i--){for (j = i + 1; j > 0; j--){printf("* ");}//换行printf("\n");}//下三角for (i = 0; i < n + 1; i++){for (j = 0; j <= i; j++){printf("* ");}//换行printf("\n");}}return 0;
}

八、图片

 

本篇已完结。。。。。。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MapReduce解析:从定义到核心思想,编程规范与序列化解读

目录 一、 MapReduce1.1 MapReduce定义1.2 MapReduce优缺点1.2.1 优点1.2.2 缺点 1.3 MapReduce核心思想1.4 MapReduce进程1.5 常用数据序列化类型1.6 MapReduce编程规范1.6.1Mapper阶段1.6.2 Reduce阶段1.6.3 Driver阶段 1.7 WordCount案例实操1.7.1 本地测试1.7.2 提交到集群…

TEC温度器温度控制器

一 主要特点 1 两路独立的串口&#xff0c;可同时手动和串口指令设定 PID 和温度&#xff1b; 2 一拖二结构&#xff0c;一个调试器控制两个控温模块单元&#xff1b; 3 精准控制温度&#xff0c;用户可自行修正&#xff1b;PT100/PT1000/NTC3435 温度电阻偏差&#xff1b; …

1.1 课程架构介绍:STM32H5信息安全特性概览

1.1 课程架构介绍&#xff1a;STM32H5信息安全特性概览 1. 概述 开发者在打造嵌入式系统时&#xff0c;安全和性能是产品开发设计的考量重点。为实现这一目标&#xff0c;ST推出了STM32H5系列&#xff0c;该系列作为微控制器新标杆面向工业应用市场&#xff0c;将为用户带来更…

windows中如何将已安装的node.js版本进行更换

第一步&#xff1a;先清除已经安装好的node.js版本 1.按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 然后进入命令控制行窗口&#xff0c;并输入where node…

【Axure教程】能增删改的树形表格

多层级表格又成为树形表格&#xff0c;是在后台常用的一种表格形式&#xff0c;当表格数据存在多层级关系是&#xff0c;可以通过多层级表格&#xff0c;从而更加清晰的呈现数据内容&#xff0c;帮助人们更好地理解和分析数据之间的关系&#xff0c;从而更加有效地传递信息。 …

【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM 新生代、老年代、永久代的区别

大家好&#xff0c;我是锋哥。今天分享关于JVM新生代、老年代、永久代的区别的JVM面试题&#xff0c;希望对大家有帮助&#xff1b; JVM 新生代、老年代、永久代的区别? 在 Java 中&#xff0c;堆被划分成两个不同的区域&#xff1a;新生代 ( Young ) 、老年代 ( Old ) 。而新…

【微服务】nacos注册中心

Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 1.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在…

C++ 改造红黑树,封装map和set

C 改造红黑树,封装map和set 一.前言:已经实现好了的红黑树二.简化STL库里面对于map和set的封装1.STL库中红黑树的简化代码2.STL库中set的简化代码3.STL库中map的简化代码4.封装map和set的第一步5.红黑树第一个模板参数的价值6.红黑树节点的定义 三.仿函数1.解除仿函数的误解2.仿…

Android App冷启动耗时优化

Android应用启动过程 Android应用启动过程&#xff0c;主要包含app::onCreate及执行前的Application阶段及Activity::onCreate执行之后的Activity阶段&#xff0c;以及两个阶段之间的间隙handleMessage阶段和最终页面渲染上屏完成前数据加载阶段四个区间组成。 具体来看&#x…

IDEA中配置Tomcat

在IDEA中配置Tomcat 第一步&#xff1a;选择这个方框 第二步&#xff1a;选择号&#xff0c;找到Tomcat Server&#xff08;Local&#xff09; 第三步&#xff1a;将红方框内填完整 第四步&#xff1a;创建artifaces&#xff0c;选择Deployment–>Artia…选择 *.war expl…

嵌入式驱动学习第三周——字符设备驱动关键结构体

前言 linux内核将字符设备抽象成一个具体的数据结构&#xff0c;可以理解为字符设备对象&#xff0c;这篇博客就来讲解一下字符设备驱动的关键结构体。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以…

ArcGis Pro Python工具箱教程 02 工具箱工具集添加

ArcGis Pro Python工具箱教程 02 工具箱工具集添加 经过上一章的教程&#xff0c;pyt工具箱已将可以建立一个模板了&#xff0c;但是所建立的工具都是在一个列表&#xff0c;要进行查找会非常麻烦&#xff0c;所以要采用工具集的分类 官方文档中已经给出了添加工具集的方法&a…

以题为例浅谈SSRF

什么是ssrf SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连…

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本

【linux线程(二)】线程互斥与线程同步

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 多线程互…

基于大模型和向量数据库的 RAG 示例

1 RAG 介绍 RAG是一种先进的自然语言处理方法&#xff0c;它结合了信息检索和文本生成技术&#xff0c;用于提高问答系统、聊天机器人等应用的性能。 2 RAG 的工作流程 文档加载&#xff08;Document Loading&#xff09; 从各种来源加载大量文档数据。这些文档…

Redis 除了做缓存,还能做什么?

分布式锁&#xff1a;通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下&#xff0c;我们都是基于 Redisson 来实现分布式锁。关于 Redis 实现分布式锁的详细介绍&#xff0c;可以看这篇文章&#xff1a;分布式锁详解open in new window 。限流&#xff1a;一般是通过 …

json-server 安装成功,查看版本直接报错。安装默认版本埋下的一个坑,和node版本不匹配

文章目录 一、作者的错误二、作者安装的过程三、版本问题的解决方式四、安装成功&#xff0c;显示命令不存在的解决思路五、安装失败的解决思路六、json-server运行命令参考文档 一、作者的错误 安装成功 错误原文 file:///C:/Users/ljj/AppData/Roaming/nvm/v14.18.1/node_g…

go语言基础笔记

1.基本类型 1.1. 基本类型 bool int: int8, int16, int32(rune), int64 uint: uint8(byte), uint16, uint32, uint64 float32, float64 string 复数&#xff1a;complex64, complex128 复数有实部和虚部&#xff0c;complex64的实部和虚部为32位&#xff0c;complex128的实部…

Vue首屏优化方案

在Vue项目中&#xff0c;引入到工程中的所有js、css文件&#xff0c;编译时都会被打包进vendor.js&#xff0c;浏览器在加载该文件之后才能开始显示首屏。若是引入的库众多&#xff0c;那么vendor.js文件体积将会相当的大&#xff0c;影响首屏的体验。可以看个例子&#xff1a;…