第2章 语言与字符串
- 格式:pdf
- 大小:351.28 KB
- 文档页数:9
第2章 C 语言的基本数据类型本章要点了解C 语言的数据类型,掌握基本数据类型的应用及其相互转换规则,理解变量和常量的概念,并掌握其定义及引用方法。
本章的难点是数据在内存中的存储形式。
第一节 C 语言的数据类型由于信息的表现形式多种多样,处理的方法也不相同,所以,我们必须考虑用不同形式的数据来表示不同的信息。
例如:一个班级的人数要用整数来表示;班级学生的平均成绩要用小数表示;学生的姓名、性别要用字符来表示;一个班级学生某一门课程的成绩要用一组不同的数值来表示等。
计算机语言中的数据类型就是为了能够高效处理各种不同的数据而引进的一个概念,是指数据的内在表现形式。
不同的数据类型具有不同的取值范围和不同的操作。
C 语言提供的数据类型如图2-1所示。
在程序中使用的所有数据都必须指定它的数据类型,C 语言的数据类型由基本类型和非基本类型组成。
其中,基本数据类型是其他数据类型的基础。
C 语言中的基本数据类型包括整型、实型(浮点型)、字符型,其中实型又包括单精度和双精度两种类型。
本章主要讨论这4种基本类型。
整型、单精度型、双精度型和字符型数据定义的关键字分别为:int 、float 、double 和char 。
除了这四个关键字外,C 语言中还提供了一些数据类型的修饰符,如:long 、short 、signed 和unsigned 。
它们的作用是与基本类型的定义关键字结合起来使用,以对基本类型进行扩充,使得在程序编写的过程中可以灵活调整数值的范围以及所占用的存储空间。
结合修饰符的应用,基本数据类型可进一步划分,如表2-1所示。
表2-1 各种数据类型及其说明语言的数据类型图)空类型(指针类型)共用体类型()结构体类型(数组类型构造类型)枚举类型()字符型()双精度型()单精度型(实型(浮点型))整型(基本类型C 12void union structenum char double float int -⎪⎪⎪⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎧⎪⎩⎪⎨⎧⎪⎪⎩⎪⎪⎨⎧⎩⎨⎧说明:(1)表中方括号内的部分是可以省略不写的。
浙大版《c语言程序设计(第4版)》讲解《C语言程序设计》是国内C语言教材的重要书籍,高校中的计算机专业等都有教授。
浙大版《C语言程序设计(第4版)》是由著名计算机科学家袁春风编写的C语言教材,该书主要介绍了C语言基础、字符串、数组、指针、结构体、文件操作等内容。
本文将对该书内容做简要概括。
第一部分:C语言基础第一章:概述该章主要介绍了计算机语言的发展与演化,C语言的历史和主要特点,以及C语言的应用领域和发展前景。
第二章:初识C语言该章节主要介绍了C语言的基本概念,例如标识符、关键字、注释等。
并且结合一些简单的例子介绍了C语言的语法格式和执行规则。
第三章:数据类型该章节主要介绍了C语言的数据类型,包括整型、实型、字符型、布尔型等。
并且介绍了类型转换及其规则。
第四章:运算符与表达式该章节主要介绍了C语言的基本运算符及其优先级、结合性和作用。
并且通过实例来介绍了使用运算符和表达式的方法及注意事项。
第五章:分支结构该章节主要介绍了C语言中的分支结构,包括if、if-else、switch等,以及运用分支结构解决问题的方法和技巧。
第二部分:数组、字符串和指针第七章:数组该章节主要介绍了C语言中的数组,包括一维数组、二维数组等,并结合例子介绍了数组的定义、初始化、遍历、赋值等操作。
第八章:字符串该章节主要介绍了C语言中的字符串,包括字符串的定义、初始化、输入、输出等。
并且介绍了使用字符串解决问题的方法和技巧。
第九章:指针第三部分:函数与结构体该章节主要介绍了C语言中的结构体,包括结构体的定义、初始化、访问、结构体数组、结构体指针等。
并且介绍了结构体在程序中的应用。
第四部分:文件操作与其他第十二章:文件操作第十三章:其他语言特性与扩展该章节主要介绍了C语言扩展的特性,包括宏定义、预处理指令、变长参数等。
并且介绍了C语言与其他语言的异同点。
总结:《C语言程序设计(第4版)》是一本权威的C语言教材,该书系统全面地介绍了C语言的基本概念、语法格式、运算符、控制语句、数组、指针、函数、结构体、文件操作等方面的内容,让读者对C语言的掌握更加深入。
第2章 语言与字符串这个理论中,我们要把问题交为更具体的问题,“给定字符串s 和语言L ,s 是否在L 中?”进行形式化之前,要先定义几个术语。
字母表(alphabet )记为∑,是个有限集。
∑的成员称为符号(symbols )或字符(characters )。
2.1 字符串字符串(string )是某个字母表∑中符号的有限序列。
给定字母表∑,可以从∑构造的最短字符串是空串,记为ε。
字母表∑中的所有字符串集合记为∑*。
这里采用Kleene 星号运算符,定义如例2.1所示。
例2.1 字母表字母表名称字母表符号 例子字符串 英语字母表{a, b, c, …, z} ε, aabbcg, aaaaa 二进制字母表{0, 1} ε, 0, 001100 星号字母表音乐字母表 {}教材中直接数符号和字符串写成like this 。
2.1.1 字符串函数字符串s 的长度(length )记为|s |,是s 中的字符个数。
例如:|ε| = 0|1001101| = 7对任意符号c 和字符串s ,函数#c (s )定义为s 中符号c 出现的次数,例如#a (abbaaa)=4。
接合(concatenation )字符串s 与t 写成s ||t 或st ,就是在s 后面添加t 。
例如,如果x = good ,y = bye ,则xy = goodbye 。
因此|xy | = |x | + |y |。
空串ε在接合字符串时,字符串不变,因此∀x (x ε = εx = x )。
接合作为字符串函数是结合性的,因此∀s ,t ,w ((st )w = s (tw ))。
下面定义字符串复制(replication )。
对每个字符串w 和自然数i ,w i 定义为w 0 = εw i +1 = w i w在8第2章语言与字符串例如:a3 = aaa(bye)2 = byebyea0b3 = bbb最后,我们定义字符串的逆(reversal)。
对每个字符串w,字符串的逆写成W R,定义为如果|w| = 0,则W R = w = ε。
如果|w|≥1,则∃a∈∑ (∃u∈∑* (w = ua)),(即w最后一个字符为a。
)然后定义W R=au R。
定理2.1 字符串的接合与逆定理:如果w与x为字符串,则(wx)R=x R w R。
例如,(nametag)R = (tag)R(name)R = gateman。
证明:我们对|x|进行了归纳:基本case:|x| = 0。
则x=ε,(wx)R = (wε)R= (w)R = εw R=εR w R=x R w R。
证明:∀n≥0 (((|x| = n)→ ((wx)R= x R w R))→((|x| = n+1) →((wx)R = x R w R)))。
对任意字符串x,其中|x| = n+1,则x=ua,其中a为字符,|u|=n。
因此:(wx)R = (w(ua))R将x写成ua= ((wu)a)R接合的结合律= a(wu) R逆的定义= a(u R w R) 归纳假设=(au)R w R接合的结合律=(ua)R w R逆的定义=x R w R将ua写成x2.1.2 字符串的关系字符串s为t的子串(substring)的充分必要条件为s在t中连续出现。
例如:aaa是 aaabbbaaa的子串aaaaaa不是 aaabbbaaa的子串字符串s为t的正子串(proper substring)的充分必要条件为s是t的子串,且s≠t。
每个字符串是自己的子串,但不是其正子串。
空串ε是任何字符串的子串。
字符串s是t的前缀(prefix)的充分必要条件为∃x∈∑*(t = sx)。
字符串s是t的正前缀(proper prefix)的充分必要条件为s是t的前缀,且s≠t。
每个字符串是自己的前缀,但不是其正前缀。
空串ε是任何字符串的前缀。
例如,abba的前缀为ε,a,ab,abb,abba。
字符串s是t的后缀(suffix)的充分必要条件为∃x∈∑* (t = xs)。
字符串s是t的正后缀(proper suffix)的充分必要条件为s是t的后缀,且s≠t。
每个字符串是自己的后缀,但不是其正后缀。
空串ε是任何字符串的后缀。
例如,abba的后缀为ε,a,ab,abb,abba。
2.2 语言 92.2 语言语言(language)是有限字母表∑上的(有限或无限)字符串集。
介绍多种语言时,可以用∑L表示语言L的字符串采用哪个字母表。
例2.2给定字母表定义语言设∑ = {a,b}. ∑* = {ε,a,b,aa,ab,ba,bb,aaa,aab,...}.∑上的语言例子包括:Ø,{ε},{a,b},{ε,a,aa,aaa,aaaa,aaaaa},{ε,a,aa,aaa,aaaa,aaaaa,...}2.2.1 定义语言的方法我们用各种方法定义语言。
由于语言是集合,因此可以用任何时候集合定义方法定义。
例如,可以指定特征函数,即对集合中每个元素为真而对其他元素为假的谓词。
例2.3所有a在所有b之前设L={w{a∈,b}*:,w中所有a在所有b之前},则字符串ε,a,aa,aaa,aabbb和bb属于L,而aba,ba与abc不属于L。
注意有些字符串平凡满足L成员的要求。
规则没有要求其中有a或b,只是说所有a在所有b之前(如果有)。
如果没有a或没有b,则不会违反这个规则,因此字符串ε,a,aa与bb平凡满足L成员的要求。
例2.4字符串以a结尾∈,b}*(x =ya)},则字符串a,aa,aaa,bbaa与ba属于L,而ε,bab 设L={x: ∃y{a与bca不属于L。
L中的所有字符串可以表示为{a,b}*中的字符串接合一个a到末尾。
例2.5用英语描述语言的问题∈ 1, 2, 3, 4, 5, 6, 7, 8, 9}*,且x、y看成自然数的十进制表示时,设L={x#y:x,y{0,square(x)=y}。
字符串3#9和12#144属于L,而3#18、12与12#12#12不属于L。
字符串#?是不是属于L?取决于怎么理解“x、y看成自然数的十进制表示”。
ε是不是某个自然数的十进制表示?将字符串变成数字的算法可能将ε换算为0,则0是0的平方,因此#属于L。
反过来,如果将字符串变成数字的算法认为ε是无效输入,则#不属于L。
这个例子说明存在用英语描述语言的问题,即歧义性。
我们只能使用无歧义的术语,下面将介绍其他避免这个问题的定义方法。
例2.6空语言设L = {} = ∅,L是空语言,不包含任何字符串。
例2.7空语言不同于空串L = {ε}是包含空串ε的语言,不同于空语言。
10第2章语言与字符串上面介绍的所有例子符合语言的定义,即字符串集合,但不同于日常用法。
日常语言也符合这个定义。
例2.8英语不是定义合理的语言设L={w:w英语句子}例如:Kerry hit the ball. /*显然属于LColorless green ideas sleep furiously4. /*语法正确,但是什么意思呢The window needs fixed. /*L的方言Ball the Stacy hit blue. /*显然不属于L像英语之类语言的问题是没有明确规定包含什么字符串。
如果事先无法产生形式规范,就无法建立语言。
英语、中文、西班牙语之类的自然语言虽然很难指定,但非常重要。
因此,人们投入巨大精力创建形式和计算有效的描述,以便在文法检查、文本数据库抽取之类应用程序中运用。
在创建英语之类自然语言的形式描述时,可以使用我们开发的理论,见第2部分和第3部分。
例2.9停止问题语言∈ b}*:all a’s precede all b’s}设L = {w: w是对所有输入停止的C语言程序}。
L比{x{a,之类更复杂。
但和英语不同,它具有明确的形式规范。
我们要介绍的理论指出了L的许多重要特性。
可以用字符串定义的关系定义语言。
例2.10使用前缀关系我们用字符串定义的前缀关系定义如下语言:L1 ={w∈ {a,b}*: no prefix of w contains b}={ε,a,aa,aaa,aaaa,aaaaa,aaaaaa,...}L2 ={w∈ {a,b}*: no prefix of w starts with b}={w∈ {a,b}*: the first character of w is a }∪ {ε}L3 ={w∈ {a,b}*: every prefix of w starts with b}= ∅L3等于∅,因为ε是每个字符串的前缀。
由于ε不以b开头,因此没有一个字符串符合L3要求。
前面曾介绍过,我们定义了字符串的复制运算符:对任何时候字符串s和整数n,s n=n 的n个副本接合。
例如,(bye)2=byebye。
可以用复制定义语言而不是定义各个字符串,只要n用变量而不是特定常量。
例2.11用复制定义语言设L={a n:n≥0},L={ε,a,aa,aaa,aaaa,aaaaa, ...}.2.2 语言 11语言是集合,因此如果要提供语言的计算定义,可以指定:y语言生成器,枚举这个语言的元素,或者,y语言识别器,确定某个字符串是否属于这个语言,是返回真值,不是返回假值。
例如,逻辑定义L={x:∃y{a∈,b}*(x=ya)}可以返回语言生成器(枚举器)或语言识别器。
考虑一个语言L的枚举器时,有时可能要考虑L生成元素的顺序。
如果∑L的元素是D 的顺序(例如写字母或数字0~9),则可以用D定义L的总的辞典顺序(lexicographic order,写成<L):y短字符串在长字符串之前,即∀x(∀y((|x|<|y|)→(x<L y)))。
y长度相同时,用D按辞典顺序排列。
本书使用辞典顺序时,假设D是字母和数字的标准顺序。
如果D不明确,我们会指出。
程序辞典式枚举(lexicographically enumerates)L的元素的充分必要条件为按辞典顺序枚举。
例2.12辞典式枚举∈,b}*:all a’s precede all b’s},则L的辞典式枚举如下:设L={x {aε, a, b, aa, ab, bb, aaa, aab, abb, bbb, aaaa, aaab, aabb, abbb, bbbb, aaaaa, ...本书第2部分、第3部分、第4部分用各种形式方法指定各类语言的语言生成器(枚举器)或语言识别器。
2.2.2 语言的势一种语言有多大?任何时候字母表的最小语言是∅,其势(Cardinality)为0。
任何字母表∑的最大语言是∑*。
什么是|∑*|?假设∑=∅,则∑*={ε},|∑*|=1。
如果∑不是空呢?定理2.2 ∑*的势定理:如果∑≠∅,则∑*是可计数的无限集。