C Primer Plus 第7章——第二篇

你该逆袭了

第7章:重点摘录

  • 三、逻辑运算符
    • 1、备选拼写:iso646.h 头文件
    • 2、优先级
    • 3、求值顺序
    • 4、范围
  • 四、一个统计单词的程序
    • 1、针对代码,提出疑问,第8章节进行讲解
    • 2、我结合自己的理解,自己写的代码
  • 五、条件运算符 ?:
  • 六、循环辅助:continue 和 break
    • 1、continue 语句
    • 2、break 语句
  • 七、多重选择:switch 和 break
    • 1、switch 语句
  • 八、goto语句(C不需要,不要用)
    • 1、能不用就不用 goto 语句
    • 2、可以使用 goto 语句 的场合
  • 九、关键概念
  • 十、本章小结

三、逻辑运算符

#include <stdio.h>
#define PERIOD '.'     //PERIOD 相当于 单引号—句点—单引号int main()
{char ch = 0;int charcount = 0;while ((ch = getchar()) != PERIOD){if (ch != '"' && ch != '\'')charcount++;}printf("there are %d non_quoto characters.\n", charcount);return 0;
}

1、备选拼写:iso646.h 头文件

#include <stdio.h>
#include <iso646.h>    //and or not 代替 && || ! 的头文件
#define PERIOD '.'     //PERIOD 相当于 单引号—句点—单引号int main()
{char ch = 0;int charcount = 0;while ((ch = getchar()) != PERIOD)      //用 and 代替 &&{if (ch != '"' and ch != '\'')charcount++;}printf("there are %d non_quoto characters.\n", charcount);return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、优先级

优先级顺序:从上到下
( )

算数运算符
关系运算符
&&
||
赋值运算符
在这里插入图片描述

3、求值顺序

除了两个运算符共享一个运算对象的情况外,C 通常不保证先对复杂表达式中哪部分求值。
例如,下面的语句,可能先对表达式 5+3 求值,也可能先对表达式 9+6 求值:

apples = (5 + 3) * (9 + 6);

C 把先计算哪部分的决定权留给编译器的设计者,以便针对特定系统优化设计。
但是,对于 逻辑运算符 是个例外,C 保证 逻辑表达式 的 求值顺序 是 从左往右。
&& 和 || 运算符都属 序列点,所以程序在从一个运算对象执行到另一个运算对象之前,所有的副作用都会生效。
而且,C 保证一旦发现某个元素让整个表达式无效,便立即停止求值。

在这里插入图片描述

4、范围

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <ctype.h>int main()
{int i = 0;char str[] = "test string.\n";while (islower(str[i]))       //无论使用哪种特定的字符编码,islower()函数都能正常运行,是可移植的   {i++;}printf("%d\n", i);   // 4 return 0;
}

四、一个统计单词的程序

//P195 程序清单7.7
//统计字符数、单词数、行数#include <stdio.h>
#include <ctype.h>   //为isspace( )提供函数原型
#include <stdbool.h> //为bool、true、false提供定义
#define STOP '|'     int main()
{char c = 0;   //读入字符char prev = 0;  //读入的前一个字符long n_chars = 0L;  //字符数int n_lines = 0;  //行数int n_words = 0;  //单词数int p_lines = 0;  //不完整的行数bool inword = false;  //如果 c 在单词中,inword 等于 trueprintf("enter text to be analyzed ( | to terminate):\n");  //这里用 '|' 来作为 结束标志prev = '\n';  //用于识别完整的 行while ((c = getchar()) != STOP){n_chars++;  // 统计 字符if (c == '\n') n_lines++;  //统计 行if (!isspace(c) && !inword) //此时字符不是空格,并且inword为false,说明刚刚开始了一个单词,现在要改变inword的值为true,并且单词数量+1 {                           //!inword == falseinword = true;          //inword == truen_words++;}if (isspace(c) && inword)  //此时字符为空格,并且inword为true,说明刚刚结束了一个单词,现在要改变inword的值为false。inword = false;prev = c;}if (prev != '\n')  //这里要注意 STOP 字符位于一行的中间的情况。是否递增行数计数?//我们可以作为特殊行计数,即没有换行符的一行字符。{                  //可以通过记录之前读取的字符识别这种情况,即如果读取时发现 STOP 字符的上一个字符不是换行符,那么这行就是特殊行。p_lines = 1;}printf("characters=%ld,words=%d,lines=%d, ",n_chars, n_words, n_lines);printf("partial lines =%d\n", p_lines);return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、针对代码,提出疑问,第8章节进行讲解

问:检查代码,查看一下如果单词之间有多个空格时,程序是否能正常运行。
答:不能,第8章讲解了如何修正这个问题,让该程序能统计文件中的单词量。

2、我结合自己的理解,自己写的代码

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#define STOP '|'int main()
{char c = 0;  //输入的每一个字符char pre = 0;  //上一个字符,如果上一个字符是 '\n',说明是一个完整的行//如果上一个字符不是 '\n',说明是一个不完整的行int n_words = 0;  //单词个数int n_chars = 0;  //字符个数int n_lines = 0;  //完整的代码行数int p_lines = 0;  //不完整的代码行数bool inward = false;  //inward 从 false 变成 true ,说明新增了一个单词pre = '\n';inward = false;while ((c = getchar()) != STOP){n_chars++;  //字符数量加 1 if (c == '\n'){n_lines++;  //新增了 1 行}if (!isspace(c) && !inward)  //始终记住:inward 从 false 变成 true ,说明新增了一个单词{                            //根据这个原则来理解这两段代码inward = true;  n_words++;}if (isspace(c) && inward)    //始终记住:inward 从 false 变成 true ,说明新增了一个单词{                            //根据这个原则来理解这两段代码inward = false;}pre = c;}if (pre != '\n'){p_lines = 1;  //遇到 STOP 就停止程序了,所以直接给 p_lines 赋值为 1 就可以了。 }printf("characters = %d,words = %d,lines = %d,p_lines = %d\n",n_chars, n_words, n_lines, p_lines);return 0;
}

五、条件运算符 ?:

在这里插入图片描述
在这里插入图片描述

//P197 程序清单7.8
//使用条件运算符
//重点:商店只卖整罐油漆,不会拆分来卖,所以如果计算结果是 1.7 罐,就需要 2 罐。
//因此,该程序计算得到带小数的结果时应该进 1 。
//条件运算符常用于处理这种情况,而且还要根据单复数分别打印 can 和 cans 。#include <stdio.h>
#define COVERAGE 350    //每罐油漆可刷面积int main()
{int sq_feet = 0;int cans = 0;printf("enter number of square feet to be painted:\n");while (scanf("%d", &sq_feet) == 1){cans = sq_feet / COVERAGE;cans += ((sq_feet % COVERAGE == 0) ? 0 : 1);printf("you need %d %s of paint.\n", cans,cans == 1 ? "can" : "cans");printf("enter next value (q to quit):\n");}return 0;
}

自己写了一遍

#include <stdio.h>
#define MEIGUAN 350  //每罐油漆可以粉刷的面积int main()
{int mianji = 0;int cans = 0;printf("请输入你要粉刷的墙壁的面积:");while (scanf("%d", &mianji) == 1){cans = mianji / MEIGUAN;cans += mianji % MEIGUAN == 0 ? 0 : 1;printf("需要的油漆的罐数是 %d %s\n", cans, cans == 1 ? "can" : "cans");  //这是这个程序的亮点!!!printf("请再次输入你要粉刷的墙壁的面积:");}return 0;
}

在这里插入图片描述
在这里插入图片描述

六、循环辅助:continue 和 break

1、continue 语句

在这里插入图片描述

//P198 程序清单7.9#include <stdio.h>int main()
{const double MIN = 0.0f;const double MAX = 100.0f;double score = 0;double min = 0;double max = 0;double total = 0;int n = 0;min = MAX;  //请注意理解max = MIN;  //请注意理解score = 0;total = 0;n = 0;  printf("请输入得分score:");while (scanf("%lf", &score) == 1){if (score < MIN || score > MAX){printf("数据无效,请重新输入数据:");continue;  //注意点}min = (score < min ? score : min);   //请注意理解max = (score > max ? score : max);   //请注意理解 n++;  //计算输入数据的个数total += score;printf("输入下一个数据:(输入非浮点数,退出程序)");}if (n > 0){printf("%d 个数据的平均分是:%lf\n", n, total / n);printf("low=%0.1f  high=%0.1f\n", min, max);}else{printf("没有输入有效的数据。\n");}return 0;
}

在这里插入图片描述
上述代码的注意点:就是比较一组数据的最小值和最大值。

 	min = MAX;  //请注意理解max = MIN;  //请注意理解min = (score < min ? score : min);   //请注意理解max = (score > max ? score : max);   //请注意理解 

在这里插入图片描述
在这里插入图片描述

2、break 语句

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、多重选择:switch 和 break

#include <stdio.h>
#include <ctype.h>int main()
{char ch = 0;printf("请输入小写字母,我会根据你所给的小写字母,来给定特定的语句:");while ((ch = getchar()) != '#'){if (ch == '\n'){continue;}if (islower(ch)){switch (ch){case 'a':printf("你输入的是小写字母 a \n");break;  //跳出 switch 语句case 'b':printf("你输入的是小写字母 b \n");break;case 'c':printf("你输入的是小写字母 c \n");break;case 'd':printf("你输入的是小写字母 d \n");break;case 'e':printf("你输入的是小写字母 e \n");break;default:printf("可以了可以了\n");break;}}else{printf("我只认识小写字母。\n");}while (getchar() != '\n'){continue;  //用于清除多余的字母}printf("请输入下一个字母:");}printf("bye\n");return 0;
}

在这里插入图片描述

	while (getchar() != '\n'){continue;  //用于清除多余的字母}

在这里插入图片描述
在这里插入图片描述

1、switch 语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、goto语句(C不需要,不要用)

在这里插入图片描述
在这里插入图片描述

1、能不用就不用 goto 语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、可以使用 goto 语句 的场合

在这里插入图片描述
在这里插入图片描述

九、关键概念

在这里插入图片描述

十、本章小结

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

解决macOS MySQL安装后不能远程访问的问题

主要是因为我的后端服务是通过docker部署的, 无法和宿主机的MySQL进行通信. 首先输入 use mysql; 之后输入 update user set host “%” where user “root”; 最后输入 flush privileges; 合起来就是: use mysql;update user set host "%" where user &qu…

TypeScript 基本使用指南【前端 26】

TypeScript 基本使用指南 引言 TypeScript 是 JavaScript 的一个超集&#xff0c;它添加了类型系统和一些其他特性&#xff0c;使得开发大型应用时更加高效和可靠。TypeScript 代码最终会被编译成普通的 JavaScript 代码&#xff0c;这意味着你可以在任何支持 JavaScript 的环…

轻量级日志管理系统SpringBoot3+Loki+grafana的使用实例

目录 文章目录 目录1、简介2、SpringBoot3应用发送日志到Loki2.1、基本介绍2.2、添加依赖2.3、配置文件application.yml2.4、创建logback配置2.5、添加日志示例2.6、运行SpringBoot3 3、在grafana中查看日志3.1、登录grafana3.2、查询日志3.3、查询我们的SpringBoot发送过来的日…

828华为云征文|针对Flexus X实例云服务器的CPU和内存性能测评

目录 一、Flexus X实例云服务器简介 1.1 产品摘要 1.2 产品优势 1.3 本次测评服务器规格 二、CPU性能测试 2.1 操作说明 2.2 操作步骤 2.2 结果分析 三、测试内存负载 3.1 操作说明 3.2 操作步骤 3.3 结果分析 四、测试终评 一、Flexus X实例云服务器简介 1.1 产品…

PostgreSQL数据库与PostGIS在Windows中的部署与运行

本文介绍在Windows电脑中&#xff0c;下载、安装、部署并运行PostgreSQL与PostGIS数据库服务的方法。 PostgreSQL是一种功能强大的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其稳定性、可靠性和丰富的功能而闻名&#xff1b;其支持多种高级特性&…

今天推荐一个文档管理系统 Dorisoy.Pan

Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统&#xff0c;它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术&#xff0c;以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端&#xff0c;包括网站、Android、iO…

Mybatis缓存机制(图文并茂!)

目录 一级缓存 需求我们在一个测试中通过ID两次查询Monster表中的信息。 二级缓存 案例分许(和上述一样的需求) EhCache第三方缓存 在了解缓存机制之前&#xff0c;我们要先了解什么是缓存&#xff1a; ‌缓存是一种高速存储器&#xff0c;用于暂时存储访问频繁的数据&…

Dubbo快速入门(一):分布式与微服务、Dubbo基本概念

文章目录 一、分布式与微服务概念1.大型互联网架构目标2.集群和分布式&#xff08;1&#xff09;集群 (Cluster)&#xff08;2&#xff09;分布式计算 (Distributed Computing)&#xff08;3&#xff09;集群与分布式的关系&#xff08;4&#xff09;实践中的应用案例 3.架构演…

了解独享IP的概念及其独特优势

在网络世界中&#xff0c;IP地址是用来识别和定位设备的标识符。独享IP是一种服务模式。使用代理服务器时&#xff0c;用户拥有一个不与其他用户共享的专用独立IP地址。与共享IP相比&#xff0c;独享IP为用户提供了更高的独立性和隐私保护。下面详细介绍独享IP的定义、工作原理…

SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句

最近做一个需求&#xff0c;关于SQL高可用优化&#xff0c;需要优化项目中的SQL&#xff0c;提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…

【LLM大模型】Ollama 运行 GGUF 模型

Ollama 默认直接支持很多模型&#xff0c;只需要简单的使用 ollama run命令&#xff0c;示例如下&#xff1a; ollama run gemma:2b就可安装、启动、使用对应模型。 通过这样方式直接支持的模型我们可以通过https://ollama.com/library 找到。 在https://huggingface.co/mod…

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具&#xff0c;软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容&#xff0c;流畅地…

启动 Ntopng 服务前需先启动 redis 服务及 Ntopng 常用参数介绍

启动Ntopng服务之前需要先启动redis服务&#xff0c;因为Ntopng服务依赖于redis服务的键值存储。 服务重启 服务启动 Ntopng常用参数&#xff1a; -d 将 Ntopng 进程放入后台执行。默认情况下&#xff0c;Ntop 在前台运行。 -u 指定启动Ntopng执行的用户&#xff0c;默认为…

算法:852.山脉数组的峰顶索引

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;二分算法&#xff09; 题目的提示已经非常明显了&#xff0c;使用O(logN)的算法&#xff0c;那就是二分算法。 如何寻找二段性&#xff1f; 观察数据&#xff0c;可以发现&#xff0c;需要找的峰顶索引的左右两侧数…

LLM工程师启航:生成式AI简明教程

编者按&#xff1a; 大模型发展了近两年&#xff0c;Baihai IDP公众号也分享了近百篇LLM各环节的技术洞察&#xff0c;有前沿探讨、有落地实践、有应用经验。但回头来看&#xff0c;我们似乎从来没有认真、从0开始探讨过LLM的基本原理。 最近&#xff0c;一些企业客户和伙伴来询…

SLF4J报错log4j又报错

项目场景&#xff1a; 搭建一个spirngboot项目&#xff0c;启动运行时&#xff0c;SLF4J报错 解决后 ~ log4j又报错了。 问题描述 首先是SLF4J报错了&#xff0c;解决完SL4J报错问题后&#xff0c;再次启动项目&#xff0c;log4j又报错了 。。。 报错信息&#xff1a; SLF4J…

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…

excel导出图片---HSSFWorkbook--SXSSFWorkbook

1 概述 平时在工作中&#xff0c;excel导出图片经常会用到&#xff0c;但奈何HSSFWorkbook导出数据数量有限制问题&#xff0c;所以企业里大多都用SXSSFWorkbook格式&#xff0c;很少用HSSFWorkbook。所以今天以这两种格式分别记录下&#xff0c;图片的导出过程。 2 HSSFWork…

解决Qt每次修改代码后首次运行崩溃,后几次不崩溃问题

在使用unique_ptr声明成员变量后&#xff0c;我习惯性地在初始化构造列表中进行如下构造&#xff1a; 注意看&#xff0c;我将m_menuBtnGroup的父类指定为ui->center_menu_widget&#xff0c;这便是导致崩溃的根本原因&#xff0c;解决办法便是先用this初始化&#xff0c;后…

YOLOV8在清微智能芯片的部署与实现(一)

现在以YOLOV8 为例&#xff0c;进行演示 文章目录 1. YOLOV8浮点模型训练1.1 准备数据集1.1.1 下载业务数据集1.1.2 下载开源数据集1.1.3 自定义数据集1.1.4 将数据转换为yolo训练数据格式 1.2 yolov8项目准备1.3 训练模型 2. YOLOV8浮点模型推理2.1 模型推理2.2 模型val.py评…