【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.hqwc.cn/news/540126.html

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

相关文章

嵌入式毕业设计-基于智能家居灯光控制系统的设计与实现

项目介绍 技术&#xff1a;C语言、单片机等 在科技进步与社会发展的今天&#xff0c;智能家居这一概念慢慢走进人们的生活。照明控制作为智能家居的重要组成部分&#xff0c;它与人们日常生活的联系最为紧密&#xff0c;本文研究了利用ZigBee网络进行室内通信&#xff0c;克服…

美团大规模KV存储挑战与架构实践

KV 存储作为美团一项重要的在线存储服务&#xff0c;承载了在线服务每天万亿级的请求量&#xff0c;并且保持着 99.995% 的服务可用性。在 DataFunSummit 2023 数据基础架构峰会上&#xff0c;我们分享了《美团大规模 KV 存储挑战与架构实践》&#xff0c;本文为演讲内容的整理…

做外贸如何打动老是邮件不回复的客户

有人说&#xff1a;进入公司半年&#xff0c;都没有碰到什么大客户&#xff0c;小客户接了没利润&#xff0c;不想接&#xff0c;很难找到自己的定位&#xff0c;不知道如何去开发客户。 这是一个范围很大的问题&#xff0c;每个行业不一样&#xff0c;做外贸很多时候都是相通…

(Linux学习 十)磁盘管理(上)基本分区介绍

一、磁盘管理 添加磁盘&#xff1a;傻瓜式操作下一步下一步&#xff0c;只需设置磁盘内存大小 管理磁盘流程 新硬盘–>分区&#xff08;MBR或者GPT&#xff09;–>格式化/文件系统Filesystem–>挂载mount 1.查看磁盘信息 ll /dev/sd* //方法一 lsblk //方…

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

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

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …

IDEA把中国大陆高校教育邮箱都封了?

今天本想趁着快到期前&#xff0c;用教育邮箱续命&#xff0c;没想到&#xff1a; 天不遂人愿&#xff01;只能继续申请开源项目的许可证&#xff01; 可惜了&#xff0c;没提交在每个月&#xff1a;

vue-创建vue项目记录

安装node.js 先安装node.js的运行环境node.js的下载地址 安装后就可以使用npm命令 1、清除npm缓存&#xff1a;npm cache clean --force 2、禁用SSL&#xff1a;npm config set strict-ssl false 3、手动设置npm镜像源&#xff1a;npm config set registry https://registry.…

【学习总结】python transformers 预处理 YelpReviewFull 数据集,并展示

1. 数据简介 Yelp是一家总部位于美国旧金山的跨国公司&#xff0c;它开发Yelp.com网站和Yelp移动应用程序。Yelp是一个用户对餐馆等场所进行评价的网站。&#xff08;维基百科&#xff09; Yelp 评论数据集包含来自 Yelp 的评论。 它是从 Yelp 数据集挑战 2015 数据中提取的。…

最近火绒的explorer问题,电脑黑屏只有鼠标

由于安全限制,覆盖文件是行不通的,按照火绒官方给的方法试试,还是不行。主要是他最后一步写得有问题。恭喜火绒,成功的将我们所有客户的电脑安装的火绒卸载。 解决方案 1、CTRL+SHIFT+ESC调出任务管理器; 2、左上角,文件–运行新任务–浏览,进入火绒安装路径,双击HRU…

web的部署

首先&#xff0c;我们鼠标右击此电脑&#xff0c;管理&#xff0c;添加角色和功能 默认下一步&#xff0c; 默认下一步&#xff0c; 默认下一步&#xff0c; 勾选web&#xff0c;点击下一步&#xff0c; 点击下一步&#xff0c; 默认下一步&#xff0c; 勾选所需功能&#xff0…

【Paper Reading】6.RLHF-V 提出用RLHF的1.4k的数据微调显著降低MLLM的虚幻问题

分类 内容 论文题目 RLHF-V: Towards Trustworthy MLLMs via Behavior Alignment from Fine-grained Correctional Human Feedback 作者 作者团队&#xff1a;由来自清华大学和新加坡国立大学的研究者组成&#xff0c;包括Tianyu Yu, Yuan Yao, Haoye Zhang, Taiwen He, Y…