C Primer Plus 第7章——第二篇

news2024/12/28 8:29:32

你该逆袭了

第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 等于 true

	printf("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 == false
			inword = true;          //inword == true
			n_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.coloradmin.cn/o/2180083.html

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

相关文章

公交IC卡收单管理系统 多接口SQL注入

0x01 产品描述&#xff1a; 公交IC卡系统是公交一卡通系统核心建设部分&#xff0c;是高时尚、高科技的管理系统&#xff0c;大大提升了公交行业的服务&#xff0c;能让公交企业信息化和电子化打下一个良好的硬件基础和软件基 0x02 漏洞描述&#xff1a; 公交IC卡系统在/role&…

HashMap底层原理是什么?从源码入手,沉浸式解读HashMap序列化、存储、扩容、获取等方法具体实现

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码解析-CSDN博客 目录 一、基本介绍 1.1 集合和映射 1.1.1 基本介绍 1.1.2 思考&#xff1a;Map是不是集合&#xff1f; …

当今爆火的RPA其实就是自动化测试

最近有机会看到了 RPA 在实际工作中的重度应用&#xff0c;深刻感受到了自动化的强大实力&#xff0c;以后的应用前景时完全可期的。 RPA (Robotic Process Automation) 简介 Robotic Process Automation (RPA) 是一种技术&#xff0c;使用软件机器人&#xff08;或称“机器人…

知乎信息流广告营销获客投放策略!

知乎内容营销已成为品牌吸引目标客户、提升品牌知名度的重要手段&#xff0c;吸引了众多企业的关注。为了更好地利用知乎这一平台进行品牌推广&#xff0c;越来越多的企业开始关注知乎信息流广告的投放。云衔科技通过知乎信息流广告实现高效的营销获客&#xff0c;为企业提供知…

小程序原生-数据的双向绑定

1. 通过model:实现数据的双向绑定 <input type"text" name"名称" model:value"{{name}}" /> <checkbox model:checked"{{isChecked}}"/> 是否同意该协议// pages/test/test.js Page({data: {name:wuk,isChecked:false}, }…

无心上班,只想为祖国庆生?让ChatGPT帮你搞定工作!

国庆假期临近&#xff0c;大家的心早已飞向诗和远方了吧。 然而&#xff0c;现实总是无情地将我们拉回到堆积如山的工作任务上&#xff1a;紧急报告的截止日期就在眼前&#xff0c;复杂的项目策划还未动笔&#xff0c;客户的定制需求迫在眉睫。每年的这个时候&#xff0c;如何…

大模型产品架构全景解读:从应用场景到技术支持的完整路径

随着人工智能技术的迅猛发展&#xff0c;大模型逐渐成为推动各行业智能化转型的核心动力之一。大模型不仅可以处理大量数据&#xff0c;进行复杂任务的自动化&#xff0c;还能通过微调、蒸馏等技术在特定场景中表现出色。本文将结合大模型产品架构图&#xff0c;详细解读每一个…

解决TikTok无网络连接问题解析

随着社交媒体的快速发展&#xff0c;TikTok已成为全球用户最喜欢的短视频平台之一&#xff0c;吸引了数以亿计的用户。然而&#xff0c;在享受这个平台时&#xff0c;用户经常会遇到无网络连接的问题&#xff0c;这不仅影响观看体验&#xff0c;还可能导致无法上传内容或参与社…

数字人直播违规解决方案揭晓:阿凡达模式2.0版本如何实现7*24小时全天候无间断直播?

随着AI数字人行业的兴起&#xff0c;以数字人直播为代表的应用逐渐走入人们的视野&#xff0c;并成为企业降本增效的一大重要工具。不过&#xff0c;就目前的实际应用情况来看&#xff0c;绝大多数企业在使用数字人直播的过程中&#xff0c;经常会有直播间违规和账号封禁等情况…

IdmGAE Importance-Inspired Dynamic Masking for Graph Autoencoders

sigir24 #paper/⭐ 不要读这篇论文以及笔记了&#xff0c;没有用的东西。。这采样技术都是21-23年的论文的技术了&#xff0c;到24年还在用&#xff0c;也没有理论支撑。。。后悔读了 贡献&#xff1a;利用节点度和节点相似性去构造自适应增强 增强 构造度矩阵&#xff1a; D…

Word样式的同步与重置

有时候我们需要修改Word中的样式&#xff0c;实现排版的个性化。 如何同步样式到其他电脑上&#xff1f; Word中的样式是由Normal.dotm文件控制的&#xff0c;对样式所有的设置和修改&#xff0c;都会保存到这个问题件中&#xff0c;所以我们只需要在设置好样式以后&#xff…

骨传导耳机哪个牌子好?盘点五大热销主流机型全方位实测分析!

市面上的骨传导耳机品牌繁多&#xff0c;质量也参差不齐&#xff0c;甚至有些产品工艺粗糙&#xff0c;盲目入手使用可能存在安全隐患&#xff0c;还会影响听力和健康。那么&#xff0c;究竟骨传导耳机哪个牌子好&#xff1f;作为一名有着多年数码测试经验的博主&#xff0c;今…

【hot100-java】【编辑距离】

多维dp篇 class Solution {public int minDistance(String word1, String word2) {char [] sword1.toCharArray();char [] tword2.toCharArray();int ns.length;int mt.length;int [][] fnew int[n1][m1];for (int j1;j<m;j){f[0][j]j;}for(int i0;i<n;i){f[i1][0]i1;for…

博弈论(学习笔记)

定义何为最优&#xff01; 最优解是均衡&#xff01;&#xff08;&#xff09; 一次博弈 --- 一面之缘 复杂动态博弈&#xff1b; 路怒症----陌生人&#xff0c;一次性博弈。 一次性博弈最能暴露人性。 重复博弈太压抑了。 沙普利求解合作博弈的著名理论---如何为参与者制定利益…

24.9.29

星期一&#xff1a; 补 cf round974 div3 H cf传送门 题意&#xff1a;给一数组&#xff0c;q次询问&#xff0c;每次询问l-r区间内是否每个数字都出现偶数次 终于找到了梦中的随机数函数&#xff0c;这随机数真是非常顶级口牙 思路&a…

Python开源项目周排行 2024年第15周

#2024年第15周2024年8月30日1openuiOpenUI 是用于生成 UI 界面的 AI 工具。OpenUI 让你可以发挥想象力来描述 UI&#xff0c;然后查看它的实时渲染。你可以将生成的 HTML 转换为 React、Svelte、Web Components 等。它类似于 v0&#xff08;v0.dev&#xff09;&#xff0c;但是…

Unity开发绘画板——04.笔刷大小调节

笔刷大小调节 上面的代码中其实我们已经提供了笔刷大小的字段&#xff0c;即brushSize&#xff0c;现在只需要将该字段和界面中的Slider绑定即可&#xff0c;Slider值的范围我们设置为1~20 代码中只需要做如下改动&#xff1a; public Slider brushSizeSlider; //控制笔刷大…

Altium Designer脚本的执行方式

在Altium Designer脚本系统中执行脚本支持多种方法 1.点击工具栏的运行工具(蓝色向右三角图标)可以执行脚本程序&#xff1b; 2.点击菜单栏Run->Run可以执行脚本程序&#xff1b; 3.在脚本编辑器中&#xff0c;按键盘的F9键可以执行脚本程序&#xff1b; 4.通过菜单栏执行脚…

新品 | Teledyne FLIR IIS 推出Forge 1GigE SWIR 短波红外工业相机系列

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出了新品Forge 1GigE SWIR 130万像素的红外相机。 Forge 1GigE SWIR系列的首款相机配备宽频带、高灵敏度的Sony SenSWIR™️ 130万像素IMX990 InGaAs传感器。这款先进的传感器采用5um像素捕捉可见光和SWIR光谱&#xff…

【2025】基于Spring Boot的智慧农业小程序(源码+文档+调试+答疑)

文章目录 一、***-项目介绍二、***-开发环境三、***-系统展示四、***-代码展示五、***-项目文档展示六、***-项目总结 大家可以帮忙点赞、收藏、关注、评论啦 &#x1f447;&#x1f3fb; 一、***-项目介绍 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#x…