00 / 预备篇:读懂符号与程序 · 小节 1
把符号读成一句话
读懂集合、条件、下标和求和,不把符号当成暗号。
预备基础 · 技术讲解 · 本节来源与考点
前置知识:从这里开始即可 · 符号回看
从一个问题开始
“所有借阅者中,至少一人逾期”怎样写得不含糊?
把这件事讲清楚
集合是按规则确定的一组对象。读作“x属于A”;表示A中每个元素也在B中。是同时属于两者,是至少属于一个。是空集。命题是能判断真假的陈述。“且”要两项都真,“或”允许同时真。表示P成立时Q必成立,不保证反向。读“任意”,读“存在”。
下标是第i个数,不是乘法。表示从第1个加到第n个。函数给输入x对应输出;同一输入不能随意对应不同输出。
为什么成立 · 关键推导
先说清对象范围,再写条件,最后检查反例。否定“每个人都完成”应是“存在一个人没完成”,不是“所有人都没完成”。否定“存在”时则变成“所有都不”。
入门例题 / 1
A={1,2,3},B={3,4}。逐个检查成员,交集只有3,并集去重复为{1,2,3,4}。这样算是因为集合不计顺序、不计重复。
典型应用与变式 / 2
设三天借书量,总量。若“逾期就提醒”为真,不能推出“提醒就一定逾期”,也可能是到期前提醒。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
空集和{0}相同吗?
需要一点提示
比较元素个数。
查看过程、答案与错因
不相同。空集没有元素,{0}有一个元素0。常见错误是把“什么都没有”和“数值为零”混淆。
计算与执行过程
A={1,2,4},B={2,3,4},求交、并。
需要一点提示
先圈共同元素,再合并去重。
查看过程、答案与错因
交集{2,4},并集{1,2,3,4}。重复的2与4各写一次。
条件与错误辨析
否定“每个方案都便宜且安全”。
需要一点提示
否定全称和“且”。
查看过程、答案与错因
存在一个方案不便宜或不安全;只要其中一个要求失败即可,不能要求两者同时失败。
带走这一句
先翻译成普通话,再用小例子检查符号。
00 / 预备篇:读懂符号与程序 · 小节 2
先数清可能性:排列与组合
分清分步选择与分类选择、顺序有关与无关。
预备基础 · 技术讲解 · 本节来源与考点
从一个问题开始
从5名同学中选2人值班,选组长与组员和只选两个人有什么差别?
把这件事讲清楚
互斥的几类选择相加;一个任务分成连续步骤,各步可选数量相乘。阶乘是从1乘到n,并约定。从n个不同对象选k个并排顺序,排列数;只选集合不排顺序,组合数。使用公式前要问:能否重复?是否区分顺序?对象是否不同?
为什么成立 · 关键推导
先排k个位置,选择数依次是n、n−1……。若不看顺序,同一k人组被排了次,所以除以。允许重复的k位密码每位n选,数量是,不能套不重复排列。
入门例题 / 1
5人选组长和组员:第一职务5选,第二4选,共20。只选2人则每组被正反计两次,20/2=10。
典型应用与变式 / 2
从3本设计书和2本技术书中各选1本:3×2=6。只选1本书是3+2=5。两题差别在“各选一本”和“合计一本”。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
四位0—9密码可以重复且首位可为0,共多少?
需要一点提示
每一位都独立有10种选择。
查看过程、答案与错因
10⁴=10000。密码不是四位整数;不能擅自排除首位0。
计算与执行过程
6人任选3人,再从其中选队长。
需要一点提示
先组合,再选职务。
查看过程、答案与错因
C₆³×3=20×3=60;也可先6选队长,再从5人选2人,6×10=60。
条件与错误辨析
抽取两张卡不放回,是否总能把两次概率直接相乘?
需要一点提示
第二次剩下的卡改变了。
查看过程、答案与错因
可以乘条件概率,不能默认两次同概率且独立。计数的乘法原理不等于概率独立性。
带走这一句
先画选择步骤,最后才套排列组合公式。
00 / 预备篇:读懂符号与程序 · 小节 3
让计算机按顺序做事
手动跟踪短程序,知道变量在每一步如何变化。
预备基础 · 技术讲解 · 本节来源与考点
前置知识:先数清可能性:排列与组合 · 符号回看
从一个问题开始
统计三个借阅数2、0、5,程序怎样得到7而不是只记住最后的5?
把循环展开成状态表
读第0项2,累加器由0变2;循环边界是i<n。
读第1项0,sum仍为2。
读第2项5,sum变7;i=3退出,不访问a[3]。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
变量是存值的有名位置。C中int表示整数,double表示浮点数。=把右侧结果放进左侧变量,==才是比较相等。if按条件选择,for重复步骤。数组a[0]是第一个元素,长度n的合法下标是0到n−1。函数把一段计算封装成有名称的操作,参数是输入,return给出结果。以下均为教学伪代码,使用←表示赋值,不要求安装环境。
为什么成立 · 关键推导
执行顺序:初始化sum←0;i←0;若i<n则把a[i]加到sum;i←i+1;重新判断。循环不变式是“进入第i轮前,sum等于前i个数的和”。初始化满足,逐轮保持,i=n时得到总和。
入门例题 / 1
a=[2,0,5]:i=0时sum由0到2;i=1仍2;i=2到7;i=3退出。选择累加而不是覆盖,是因为要保留前面结果。
典型应用与变式 / 2
求平均数:函数mean(a,n)先检查n>0,再求和并除以n。C写(double)sum/n以得到小数。例如sum=7,n=3,整数除法得2,转换后约2.333。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
在C中if(x=0)和if(x==0)一样吗?
需要一点提示
一个修改值,一个询问。
查看过程、答案与错因
不一样。x=0会把x设为0,表达式值为0,条件判假;x==0比较而不修改。
计算与执行过程
跟踪s←0;对i=1到4执行:若i为偶数则s←s+i。
需要一点提示
列出真正执行加法的轮次。
查看过程、答案与错因
只有i=2、4相加,最终s=6。奇数轮仍执行条件检查,但不加。
条件与错误辨析
数组长3时循环i<=3有何问题?
需要一点提示
最后一次访问哪个下标?
查看过程、答案与错因
会访问a[3],越界;应i<3。空数组时不能读a[0],求平均也不能除以0。
带走这一句
把程序当成逐行更新的表,别靠“看起来像”猜结果。
00 / 预备篇:读懂符号与程序 · 小节 4
数组、指针与结构体怎样配合
区分位置和值,看懂链表节点所需的最小C语法。
预备基础 · 技术讲解 · 本节来源与考点
从一个问题开始
图书记录既要存编号又要找到下一本,为什么一个整数不够?
插入节点:先接后继,再接前驱
原链表A→B→C,新节点S尚未接入。
先令S.next指向B,原链不断开。
再令A.next指向S,形成A→S→B→C。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
数组把同类型元素连续存放。地址是位置的标识;指针保存地址。C中&x取得x的地址,*p在p指向合法对象时读写该对象。NULL表示不指向有效对象,不能解引用。结构体把不同字段组合为记录:struct Node { int value; struct Node *next; }; next保存下一节点的地址。p->value读取指针p所指结构体的value字段。
指针不是它所指的值;复制指针会让两个指针访问同一对象。动态分配要检查失败,释放后不能继续使用该块内存。这里先通过箭头理解,链表章再动手操作。
为什么成立 · 关键推导
画两个层次:变量框中写地址,箭头指向对象框;改变p会换指向,改变*p会改对象值。数组访问a[i]须满足0≤i<n;先确认对象存在,再沿箭头访问。
入门例题 / 1
x=3,p=&x,随后*p=8。因为p仍指向x,最后x=8。若只把p设为NULL,则x仍8,改变的是指针本身。
典型应用与变式 / 2
节点A=(4,指向B),B=(7,NULL)。从A访问next得到B,再读value得7;B的next为NULL说明到尾端,不应再读NULL->value。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
q=p后,修改*q是否可能改变*p?
需要一点提示
画两根箭头。
查看过程、答案与错因
如果它们仍指向同一个合法对象,会改变同一份值。复制地址没有复制对象。
计算与执行过程
a=[10,20,30],i=1,a[i]=a[i-1]+5后数组是什么?
需要一点提示
C数组从0编号。
查看过程、答案与错因
[10,15,30]。只更新第二项,第一、三项不变。
条件与错误辨析
释放节点后继续沿它的next访问安全吗?
需要一点提示
释放后对象还属于程序吗?
查看过程、答案与错因
不安全,属于释放后使用。应先保存需要的next,再释放当前节点;保存的next也必须指向仍存活的节点。
带走这一句
先看地址指向谁,再看读写的是地址还是对象。
章末 / 把知识接起来
综合训练
原创综合训练
5人选2人作无职务区别的小组;跟踪数组[2,3,4]的累加;指出循环i<=3的问题。
需要一点提示
分别确认顺序、累加不变式和合法下标。
查看过程、答案与错因
组合C₅²=10;s从0变2、5、9;长度3只能访问0、1、2,i=3越界。计数组合不考虑成员先后,程序循环却必须按明确执行顺序。