请选择 进入手机版 | 继续访问电脑版

我爱科技论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 520|回复: 2

[技术分享] 【数据结构与算法】计算机基础知识点总结归纳速记版

[复制链接]

696

主题

743

帖子

7927

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7927

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2018-3-29 19:03:00 | 显示全部楼层 |阅读模式
要点:
1.注意题目中的要求是“正确”还是“错误”的选项
2.一定要注意静态变量static int a这样的数据类型, 在进行程序运算的的时候静态变量会缓存结果
3.注意结束符‘\0’不是“\0”






$公共基础知识
第一章:数据结构与算法
1.】算法的复杂度是指运行该算法所需要的计算机资源的多少,所需的资源越多,该算法的复杂度越高;反之,所需资源越少,复杂度越低。算法复杂度包括算法的时间复杂度和算法的空间复杂度,
算法的时间复杂度是指执行算法所需要的计算工作量(执行该算法的基本运算次数),
算法空间复杂度指执行这个算法所需要的内存空间。
(【1】:输入数据所占的存储空间;程序本身所占的存储空间;算法执行过程中所需要的额外空间。
   【2】如果额外空间量相对于问题规模(即输入数据所占的存储空间)来说是常数,即额外空间量不随问题规模的变化而变化,则称该算法是原地工作的。

2.】面向对象基本方法的基本概念有【对象】、【类】和【实例】、【消息】、【继承】与【多态性】
3.】程序执行的效率与数据的存储结构、数据的逻辑结构、程序的控制结构、所处理的数据量等有关。
4.】满足有且只有一个根结点并且每一个结点最多有一个前件,也最多有一个后件的非空的数据结构认为是线性结构,不满足条件的结构为非线性结构。空数据结构可以是线性结构也可以是非线性结构。非空数据结构可以没有根结点,如非性线结构"图"就没有根结点。
5.】在线性表的链式存储结构中,各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。线性链表中数据的插入和删除都不需要移动表中的元素,只需改变结点的指针域即可。
6.】一个非空的数据结构如果满足以下两个条件:
1)有且只有一个根节点;2)每一个节点最多有一个前件,也最多有一个后件,称为线性结构,称为线性表,可以采用顺序存储和链接存储,其中链式存储空间不连续。双向链表节点有两个指针域,指向前一个节点的指针和指向后一个节点的指针,也是线性结构。顺序存储结构中可能根节点不唯一,故可能不是线性结构。栈是所有的插入与删除都限定在表的同一端进行的线性表;队列是指允许在一端进行插入,而在另一端进行删除的线性表。
7】算法是指对解题方案的准确而完整的描述,简单地说,就是解决问题的操作步骤。算法不同于数学上的计算方法,强调实现。算法的有穷性是指,算法中的操作步骤为有限个,且每个步骤都能在有限时间内完成。
8.】栈是所有的插入与删除都限定在表的同一端进行的线性表;队列是指允许在一端进行插入,而在另一端进行删除的线性表,二者均即可以顺序存储也可以链式存储。为了充分地利用数组的存储空间,把数组的前端和后端连接起来,形成一个环形的表,称为循环队列,因此循环队列是队列的一种顺序存储结构,。
9】带链的队列就是用一个单链表来表示队列,队列中的每一个元素对应链表中的一个节点,其存储结构既可以采用顺序存储也可以是链接存储,其中顺序存储的空间连续而链式存储空间不连续,D选项错误。循环队列中,由于指针超过队列地址最大值时会移动到队列最小地址处,所以队头指针可以大于也可以小于队尾指针,
10】线性链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以一般要多于顺序存储结构。
11】顺序表具有以下两个基本特征:线性表中所有元素所占的存储空间是连续的;线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。在顺序表中,每个元素占有相同的存储单元。
12】栈是一种先进后出的线性表,队列是一种先进先出的线性表,栈与队列都是线性结构。
13】栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。栈的修改是按后进先出的原则进行的。因此,栈称为先进后出表,或"后进先出"表
14】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。当栈为空时,栈顶指针top=0,经过入栈和退栈运算,指针始终指向栈顶元素。top=20,则当前栈中有20个元素
15】队列是指允许在一端进行插入,而在另一端进行删除的线性表。由于最先进入队列的元素将最先出队,所以队列具有"先进先出"的特性,体现了"先来先服务"的原则。
作业调度是指根据一定信息,按照一定的算法,从外存的后备队列中选取某些作业调入内存分配资源并将新创建的进程插入就绪队列的过程。
执行程序中的过程调用一般指函数调用,需要调用时候转入被调用函数地址执行程序,与队列无关。
执行程序中的循环控制是指算法的基本控制结构,包括对循环条件的判定与执行循环体,与队列无关。
二叉树是一个有限的结点集合,二叉树的遍历是指不重复地访问二叉树中的所有结点,与队列无关。
16】在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界时,其加1操作的结果是指向向量的下界0。由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时,头尾指针均相等。


第二章:程序设计基础
1】对象的基本特点是:标识唯一性、分类性、多态性、封装性、模块独立性好。
     类是具有共同属性、共同方法的对象的集合,是关于对象的抽象描述,反映属于该对象类型的所有对象的性质。对象具有的性质,类也具有。
2】整数类实例包括:十进制常量用0~9表示,不能以0开头;八进制常量用0~7表示,必须用0开头;十六进制常量用0~9和A~F(a~f)表示,必须以0x或0X开头。A选项(ox1201)正确。B选项是浮点数实例(0.518),C选项是字符串实例(-152),D选项为科学计数法表示的浮点数实例。(518E-2)
3】【字符实例的一般形式是用一对单引号括起来的一个字符。】另外ASCII码中还有一些控制字符,C语言中用转义字符的形式来书写这些常,【转义字符一反斜杠(\)开始,后面跟1个字符或字符序列。】'518'单引号中有三个字符,A选项错误。"5"双引号为字符串,B选项错误。'nm'单引号中有两个字符,C选项错误。'\n'为换行符,属于字符类实例,D选项正确。
警告:特别要注意【‘’】(字符)和【 “”】(字符串)的区别


第三章:软件工程基础
1】计算机软件由两部分组成:一是机器可执行的程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。
2】软件生命周期可以分为软件定义、软件开发与软件运行维护三个阶段。主要活动阶段是:可行性研究与计划阶段,需求分析,软件设计,软件实现,软件测试,运行和维护。
3】计算机软件按功能分为应用软件、系统软件、支撑软件(或工具软件)。系统软件是管理计算机的资源,提高计算机的使用效率,为用户提供各种服务的软件,如(【操作系统】、【数据库管理系统】、【编译程序】、【汇编程序】和【网络软件】、【c编译程序】等)
4】软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。C选项叙述不全面。
软件工程包含3个要素:方法、工具和过程。B选项错误。
软件工程的目标是:
(1.)在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品,追求这些目标有助于提高软件产品的质量和开发效率,减少维护的困难。D选项错误。
(2.)软件工程是用工程、科学和数学的原则与方法研制、维护计算机软件的有关技术及管理方法。
4】数据定义语言:负责数据的模式定义与数据的物理存取构建;数据操纵语言:负责数据的操纵,包括查询及增、删、改等操作;数据控制语言:负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。
5】数据库系统的三级模式是【概念模式、外模式和内模式。】概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法
6】软件生命周期各阶段的主要任务是:问题定义、可行性研究与计划制定、需求分析、软件设计、软件实现、软件测试、运行维护。其中需求分析是指对待开发软件提出的需求进行分析并给出详细定义,也即是确定软件系统要做什么
7】需求分析阶段的工作可概括为4个方面:①需求获取。②需求分析。③编写需求规格说明书。④需求审评。
6】在测试之前制定测试计划,并严格执行,测试用例的选择不可随意,应选择有代表性的,尽可能发现迄今为止尚未发现的错误。测试根本目的是【尽可能多地发现并排除软件中隐藏的错误。软件测试是保证软件质量、可靠性的关键步骤】
7】在需求分析阶段可以使用的工具有数据流图【DFD图】 (数据流图中,对所有元素都进行了命名,所有名字的定义集中起来就构成了【数据字典】),【数据字典DD】,【判定树与判定表】
8】程序设计分为:结构化程序设计,面向对象的程序设计。结构化设计方法使用的描述方式是【系统结构图】
9】软件需求规格说明书有以下几个方面的作用。①便于用户、开发人员进行理解和交流,B正确;②反映出用户问题的结构,可以作为软件开发工作的基础和依据,C正确;③作为确认测试和验收的依据,A正确。
10】软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。模块之间的耦合应尽可能的低,模块的内聚度应尽可能的高。
11】软件设计包括软件结构设计、数据设计、接口设计、过程设计
12】扇出指的是由一个模块直接调用的其他模块数。题干中某系统为一个模块,其扇出数目为n(n>3),功能1与功能n模块扇出数均为2


第四章 数据库设计基础
1】数据库是指长期存储在计算机内的、有组织的、可共享的数据集合。
           数据库系统是由数据库及其管理软件组成的系统,是应用软件。
           数据库管理系统是数据库系统的核心,它位于用户与操作系统之间,属于系统软件。
           数据结构是计算机存储、组织数据的方式。
2】数据字典是在需求分析阶段建立,在数据库设计过程中不断修改、充实和完善的。【数据流图】
3】数据管理技术的发展经历了3个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。由下表可知C选项正确。
特点        人工管理阶段        文件系统阶段        数据库系统阶段       
管理者        人        文件系统        数据库管理系统       
面向对象        某个应用程序        某个应用程序        现实世界       
共享程度        无共享,冗余度大        共享性差,冗余度大        共享性大,冗余度小       
独立性        不独立,完全依赖于程序        独立性差        具有高度的物理独立性和一定的逻辑独立性       
结构化        无结构        记录内有结构,整体无结构        整体结构化,用数据模型描述       
控制能力        由应用程序控制        由应用程序控制        由DBMS提供数据安全性、完整性、并发控制和恢复       
4】数据库应用系统中的核心问题是数据库的设计, 注意不是数据库管理系统的设计
5】数据独立性包括物理独立性和逻辑独立性,物理独立性指数据的物理结构的改变,不会影响数据库的逻辑结构,也不会引起应用程序的改动;逻辑独立性指数据库的总体逻辑结构的改变,不会导致相应的应用程序的改变数据库系统的数据独立性,是指数据库中数据独立于应用程序且不依赖于应用程序,即数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。
6】数据库系统的三级模式是【概念模式】、【外模式】和【内模式】。
概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。
【外模式也称子模式或用户模式】,它是用户的数据视图,给出了每个用户的局部数据描述,所以选择C)。
【内模式又称物理模式】,它给出了数据库物理存储结构与物理存取方法
7】数据模型通常由数据结构、数据操作及数据约束3部分组成。
8】关系模型实体间的联系采用二维表来表示,简称表。选项C为网状模型实体间的联系,选项D为层次模型实体间的联系,选项A【属性刻画了实体】
9】在E-R图中【实体集用矩形】,【属性用椭圆】,【联系用菱形】。
10】层次模型的基本结构是树形结构,网状模型是一个不加任何条件限制的无向图,关系模型采用二维表来表示,所以三种数据库的划分原则是数据之间的联系方式。
11】关系模型采用二维表来表示,即每个二维表称为一个关系。
12】二维表中的一行称为元组。候选键(码)是二维表中能唯一标识元组的最小属性集。若一个二维表有多个候选码,则选定其中一个作为主键(码)供用户使用。表M中的某属性集是表N的候选键或者主键,则称该属性集为表M的外键(码)
13】系模型中可以有3类完整性约束:实体完整性约束、参照完整性约束和用户定义的完整性约束。实体完整性约束是指,若属性M是关系的主键,则属性M中的属性值不能为空值。属性B为主键,最后一个记录为空,违反了实体完整性约束,A选项正确
14】关系模型中可以有3类完整性约束:实体完整性约束、参照完整性约束和用户定义的完整性约束。【实体完整性】约束是指,若属性M是关系的主键,则属性M中的属性值不能为空值。T中主键不为空,A选项错误。【参照完整性】约束是指,若属性(或属性组)A是关系M的外键,它与关系M的主码相对应,则对于关系M中的每个元组在A上的值必须为:要么取空值;要么等于关系M中某个元组的主码值。属性B为关系S的外键,它与关系S的主键相对应,则T中元组在B上应该为空或者与S中主键值相等,题目中不相等,违反参照完整性约束,B选项正确。此题关系中无语义要求,C选项错误。


$二级C语言
第一章:C语言概述
1】结构化程序设计把一个复杂问题的求解过程分阶段进行,需要保证自顶向下、逐步细化、模块化设计、结构化编码。进行模块化设计时,1】首先设计框架,并定义和调试好各个模块之间的输入输出关系,2】然后完成各个模块的编写调试后再集中编译,模块化的程序设计采用自顶向下、逐步细化的原则,A选项叙述错误,C选项叙述正确。各个模块可以由不同人员同时进行编写调试,提高编写程序的效率,B选项叙述正确。结构化程序主要由3种基本控制结构组成,顺序结构、选择结构、循环结构,这三种基本结构可以解决任何复杂的问题,D选项叙述正确。故选择A选项。
2】函数体是函数首部下面的花括号内的部分,所以函数体必须由{开始,A选项正确。一个源程序文件可以包括预处理命令、全局声明、函数定义,程序总是从【main函数】开始执行的,不是main语句
3】编译就是把高级语言变成计算机可以识别的二进制语言,不经过编译的源程序是不能运行的
4】【书写风格良好的程序易读性好,方便团队合作,分模块来完成复杂的程序设计】,B选项叙述正确。但是书写风格与程序执行效率无关,【程序执行效率与程序的数据结构有关】,由算法的时间复杂度【所能处理的工作量】和空间复杂度【所需要的内存】决定
5】算法的特征:①有穷性?一个算法(对任何合法的输入)在执行有穷步后能够结束,并且在有限的时间内完成?②确定性?算法中的每一步都有确切的含义?③可行性?算法中的操作能够用已经实现的基本运算执行有限次来实现?④输入:一个算法有零个或者多个输入,【零个输入就是算法本身确定了初始条件?】⑤输出:一个算法有一个或者多个输出,以反映出数据加工的结果?
6】算法的描述有伪代码、流程图、N-S结构图等?           E-R是实体联系模型?
7】C语言程序的模块化通过函数来体现,所以选择A?                                                                                          
8】模块化程序的优点【良好的代码书写风格】:1、易于维护和复用,可以提高程序编制的效率,2、易于分工合作,3、易于模块化调试测试。模块化程序的副作用:1、可能会降低程序运行效率,2、设计的前期工作需要多花费时间。
9】C程序中主函数不能被其他函数调用,所以A选项错误?main函数可以放在程序开始,也可以放在中间,也可以放在最后,位置不固定,但程序执行时必须从main函数开始,所以B选项错误?在C程序的函数中不能定义另一个函数,可以声明或调用另一个函数,所以C选项正确?每个C程序中必须包含一个main函数,但不一定是每个C程序文件中必须有,用户单独编写的某个函数也可以存储为一个C程序文件,所以D选项错误
10】简单程序设计步骤为:确定数据结构、确定算法、编码、调试、整理文档,不包括安装编译程序
11】C语言中标识符由字母、下划线、数字组成,且开头必须是字母或下划线。另外,关键字不能作为标识符。因为C语言中区分大小写,所以B)选项中的"FOR"可以作为标识符来用。A)选项中含有非法字符&,所以选择A)。






第二章 运算符与表达式
1】sizeof是C语言中的一个操作符(operator),不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数?
2】由于按位或"|"优先级高于赋值"=",10=1010B,5=0101B,按位或结果为1111B=15,故c=15,d=15;”c语言中异或的用法,也就这个“^"符号“
3】*与()的优先级,()的优先级高于*,因为(*f)()是在定义函数指针。f指向函数的指针。f=add,将函数add()的首地址赋给指针f,所以调用函数add()可以写为f(),【其返回值是整型,不是指针类型】,不能用 *   取指针指向的内存单元的数据,故k=*f(a,b)的调用方式错误。
4】C 语言中,逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式。逗号运算符的优先级是所有运算符中级别最低的,逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算,并以最右边表达式值作为整个逗号表达式的值。
5】1、后置自增运算:k++表示先运算,后自加。 2、前置自增运算:++k表示先自加,后运算。因此,表达式x=0,x+10,x++的计算过程为首先赋值x=0,【然后将x加10,但是并不对x进行赋值,最后计算x++,】并,根据后置自增运算的计算结果,即为x=0.0。
6】【*p=s, 可得p指向s[0], p->y指向s[1],现p->y=s,因此p->y指向s[0]。因此p->x=1,++p->x等价于++(p->x),因此打印结果为2
7】浮点数1.99被强制转换成1,执行语句a=(int)1.99  *  3;计算得a=1*3=3【注意强制数据类型转换的作用域】
8】A选项中不能将变量y赋给表达式,C选项中错误与A选项一样,D选项中强制类型转换表达式应写成(double)x/10?
9】表达式【c = (13>>1) | 1】【注意按位或  |  运算符的执行规则】中,>>是右移符号,【13换算成二进制后右移1位】,【再和 1 进行按位或运算】,结果为7;表达式d = (13>1)||1中,首先判断13是否大于1,此时条件成立返回1后,再和1进行或运算,结果为1
10】表达式c = (13>>1)|1中,>>是右移符号,13换算成二进制后右移1位,再和1进行按位或运算,结果为7;表达式d = (13>1)||1中,首先判断13是否大于1,此时条件成立返回1后,再和1进行或运算,结果为1
11】逗号表达式的计算过程是从左到右逐个求每个表达式的值,取最右边一个表达式的值作为该逗号表达式的值
12】表达式1?表达式2:表达式3,若表达式1为真,则执行表达式2,否则执行表达式3,++a表示先将变量a+1,再执行其他操作,逻辑或运算符遵循"短路求值"策略,即只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解右操作数,表达式(++a || ++b)中,左操作数++a的值为1,已经可以确定整个逻辑表达式的结果为1,因此右操作数++b不再求解,直接执行表达式2,即++c








第四章 选择结构
1】当x为大于1的奇数时,值为0的表达式是  x%2==0
2】注意在C语言中,逻辑真值对应非0; C选项中,表达式:x==y 是合法的;D选项中,分支结构的流程走向是根据表达式的值,并
3】【警告:】0<x<5在C语言里不能这样直接表达,需要分步骤来实现,一般使用x>0&&x<5来描述。在C语言0<x<5属于一个逻辑运算表达式,可以理解为(0<x)<5,因此选项A错误
4】与 ( !a== 0 )的逻辑值不等价的表达式;!与==运算,!的优先级高于==,即等价于(!a)==0。如果a 0,则表达式为真,否则表达式为假,因此可以验证选项
5】'a'=1/2*(x=y=20,x*3), 'a'即表示a为字符常量,再给'a'赋值1/2*(x=y=20,x*3),是不正确的
6】由&&构成的逻辑表达式与由||构成的逻辑表达式都有"短路"现象

7】注意:0<x<10完全等价于: (0<x) && (x<10)。条件是x>0 并且x <10,表达式(x>0)&&(x<10)的值是1或0。但是 0<x<10的执行顺序:先执行0<x是否为真,返回值为0或1,再执行y<10,表达式的结果为1; C选项中,逻辑"非"(即运算符!)的运算级别是最高的;A选项中,算术运算符优先级较高,关系和逻辑运算符优先级较低。
8】由&&构成的逻辑表达式与由||构成的逻辑表达式都有"短路"现象
9】逻辑或"||"要求只要两边的运算对象有一个非零,结果就为真,虽然不知道a的值,但是若a为1,则左边运算对象为1,若a的值不是1,则右边运算对象的值为1,所以总能保证一边非零,所以结果为真,即1?
10】














第五章 循环结构
1】  while(--k)  printf("%d",k -= 3);--k先自减在使用,所以第一次判断条件即为while(4),条件为真执行打印k的值k=4-3,结果为1,第二次判断条件即为while(0),条件为假,结束循环,打印回车换行符?
2】while循环是先判断条件,满足条件后执行循环体,执行完后接着判断条件,执行,直到最后一次判断条件后不成立,跳出循环,所以最后一次执行了条件表达式,但是没有执行循环体。即 条件表达式的执行次数总是比循环体的执行次数多一次
3】while循环语句一般形式为:while(表达式){循环体},执行过程为:首先判断表达式,成立(非0)则执行循环体,不成立(0)则退出循环。do…while循环语句一般形式为:do{循环体}while(表达式),执行过程为:首先执行循环体,之后判断表达式,成立(非0)则再一次执行循环体,不成立(0)则退出循环。假设表达式1与表达式2成立次数为n1与n2。若n1>n2,则循环体A执行次数为n2+1,B执行次数n2+1;若n1<n2,则循环体A执行次数为n1,B执行次数n1;循环体A与循环体B的执行次数相同


4】执行过程为,从键盘读入一个字符,存放在缓冲区,直到读入的字符为"#"(不存入内存)时才退出循环,遇到"回车"时,将缓存区内的字符依次输出。while((c=getchar()) != '#')
5】题目使用更相减损术求最大公约数,其思想:1、任意给定两个正整数,判断它们是否都是偶数。若是,则用2约简,若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
6】程序执行过程为:执行do…while的循环体:y=5,判断y为真,x=1;y=4,x=2;y=3,x=3;y=2,x=4;y=1,x=5;y=0,判断y为假,退出循环体。判断do…while条件y=0为假,y=-1,退出循环。输出x,y为5,-1
7】 printf("%c", *p + password);
  程序执行过程为:定义字符数组str并且初始化为:"wind",定义password并通过scanf函数从键盘为其赋值2。定义指针p并使其指向字符串。通过while循环,将字符数组中每一个字符的ASCII码加2,并且按字符格式输出每一个字符。程序运行后输出结果是:ykpf
8】字符之间做加减法,是【注意:用其ASCII码进行加减,但是不能超过范围0~255,否则不是合法的字符。】while循环语句一般形式为:while(表达式){循环体},执行过程为,首先判断表达式,成立(非0)则执行循环体,不成立(0)则退出循环。程序执行过程为:定义字符变量ch = 'A',判断'A'<'D'成立,输出0,ch='B';判断'B'<'D'成立,输出1,ch='C';判断'C'<'D'成立,输出2,ch='D';判断'D'<'D'不成立,退出循环。程序运行后的输出结果是012
9】putchar()函数功能是输出一个字符,由whlie判断条件和ch初始值可知,,只要ch 'A',每次执行二次putchar,否则跳出。第一次输出CD,第二次输出BC,第三次输出A,跳出循环
10】while(E)中的(E)等价的表达式:(E>0||E<0)和  (! E==0)   和  ( E != 0 )
11】在fun函数中,while循环的功能是:逐个取字符数组s的字符判断其是否是数字。若是则将其作为个位数字保存到变量n中,n的原数据的各个数位将相应左移一个10进制位。当指针s指向数组的第3位时,循环条件不成立,循环结束,返回n的值,输出n的值为61。while(*s <= '9'&&*s >='0')  { n=10*n+*s-'0' ; s++; }
12】第一次while判断条件中a++,先用后加,为-2不为0条件为真,执行a的自加与++b操作,a的值变为-1,b的值变为1?第二次while判断后,a的值变为0,b的值变为2?第三次while判断条件为假,但是仍要执行自加操作,即值为1,跳出循环?
13】while(!E) s;while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体。while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。该题中如要执行语句s,则!E应为真,因此E应等于0
14】 while((*b=*a)!='\0')  
;While循环条件为:(*b=*a)!='\0',执行时先把指针a所指向的字符赋给指针b所在内存单元,如果该字符不是结束标识"\0",执行循环体a++;b++;,指针a、b分别指向下一个字符单元。再判断循环条件,如果成立,继续把指针a所指向的字符赋给指针b所在内存单元,直到遇到结束标识为止。
15】本题重点考察while循环语句的简单应用。函数fun()中,前一个while循环的作用是:如果形参指针t所指内容不为0,则让t增1,直到它指向0。后一个 while循环的作用是:将s所指内容赋给t所指地址,然后两者同时增1,直到赋给t的内容为0。由此可见,函数fun()的作用就是将形参s所指字符串连接到形参t所指字符串末尾,相当于库函数中的strcat()。主函数中使用fun()将数组aa中的字符串连接到了数组ss中原有字符串之后,所以执行完后,ss中的字符串为"accbbxxyy"。程序最后输出的结果是:accbbxxyy,bbxxyy。
16】题中传入字符串OABCDEF,然后执行fun后,就得到了该字符串中字符的个数,不包括结尾符,该字符串有7个字符




















第六章 数组
1】没有A选项的引用形式。【*与&放在一起作用抵消】,所以B选项错误,最大只能引用到x[9]。*(pt+i)表示引用指针pt所指元素后的第i个元素,所以C选项错误,最大只能为*(pt+9)
2】printf函数按照格式符说明输出对应的数据。%s控制符用于输出字符串,输出时从给定地址开始依次输出字符,直到遇到'\0'结束。给字符变量赋值0,相当于赋值'\0'。初始化时name="STRING",改动数组第4个和第6个元素之后字符串变为"STREN"。调用printf输出字符串为STREN
3】【警告:一定要注意静态变量static int a遮掩的数据类型, 在进行程序运算的的时候静态变量会缓存结果】内部静态变量是始终存在的,当函数被调用退出后,内部静态变量会保存数据,再次调用该函数时,以前调用时的数值仍然保留着。fun(a,5)的值是15,再次调用后sum=15,所以fun(b,4)=45,s=45+15=60。
4】注意【长度为n的数组其各个元素的下标应该是从0到n-1】,因此,长度为10的数组a,第10个元素为a[9],而不是a[10]
5】数组名后面括号的值必须是整形常量,不可以是变量
正确定义:int a[2*3]={0}     #define N 3       int a[N+N]       int a[] = {1,2,3,4,5,6};
错误定义:int N = 6, a[N];    error
6】int a[1]={0}表示定义一个数组a[1]初值为0,int  b[] = {9},表示定义一个数组b,其中只有一个值9,系统自动识别数组有1个元素。
char  c[3] = {"A", "B"},【注意:数组元素为字符串,需要用二维数组来表示】  error
char  d = "12";,字符串常量不能赋值给字符变量  error
char a[2] = {"A", "B"};不合法,应为char a[2] = {'A', 'B'};
7】 char c1, *c2, **c3, c4[2]; 是C语言的合法语句  其中c1是字符型变量,c2是字符型指针变量,c3是【指向字符型指针】的指针变量,c4[2]是一个一维字符数组,这些都是C语言的合法语句
8】【用字符串方式赋值比用字符逐个赋值要多占1个字节】,在该选项中应为3个字节。用字符串方式赋值比用字符逐个赋值要多占1个字节,在该选项中应为3个字节。
9】,一条语句只能定义一个数组是不准确的,可以通过一条语句定义多个数组;C选项中,数组说明符的一对方括号中可以是整型常量,可以是整型常量表达式;D选项中,在引用数组元素时,【下标表达式必须是【整型】的】










第七章 函数
1】本题考查malloc函数,题目中要求p指向一个int型的动态存储单元,那么就应该将分配的存储单元转化为int
2】选项中函数pow(x,e)错误应该直接使用exp(x)函数。C)选项中函数abs(n^x+e^x)错误,应该使用fabs()返回浮点数的绝对值
3】sin是库函数,在使用时应包含math.h,其参数应该为被求角度的弧度制表示。C语言中π不是已定义的常量,需要用户自定义或者直接使用3.14代替π。B选项没有替换π,也没有将30度换算成弧度,错误。C选项没有将30度换算成弧度,错误。D选项弧度换算错误, 【π对应于180°,应该除以180.0而不是360.0。】
4】" \t  \"  \\  \n  \'  \0 6 5 \0 8 A B (\0)"中共有13个字符,而strlen()函数从字符串第一个字符开始扫描,直到碰到第一个结束符'\0'为止,然后返回计数器值(长度不包含"\0")。故输出结果为6。
5】函数名后括号内的数据称为"函数参数",其中列出的是各个参数的【数据类型和名称】。调用函数时,括号里面的实参应该与形参的个数与数据类型一致。函数fun参数列表中有两个参数,分别是逗号表达式(exp1,exp2)值与(exp1, exp2, exp3)值
6】程序编译是从上到下进行的,所以如果函数定义放在主函数之后,那么在函数调用时必须提前声明函数,可以在主函数之前声明函数,也可以在主函数中函数调用之前声明函数。题目中函数findmax定义放在了函数之后,所以主函数中声明了findma函数。【int findmax(int,int,int);为函数声明,m=findmax(a,b,c);为函数调用,int findmax(intx,inty,int z){}为函数定义。】A选项正确。B选项是在main函数外定义的findmax函数,错误。在main函数中,出现了一次findmax函数的声明和一次findmax函数的调用,不是两次调用,C选项错误。D选项在main函数内不是定义findmax函数而是声明findmax函数。
7】C语言C程序的入口函数是main(),因此C程序中有且只有一个main函数,故选项B错误。分号是C语言一条语句的结束标志,不是分隔符, 【C语言分隔符是用来分隔多个变量、数据项、表达式等的符号,包括逗号、空白符、分号和冒号等等】,选项C错误。C语言的程序不是以分号结束的,分号是C语言一条语句的结束标志,【C语言是面向过程的,从main函数开始在main函数里结束】,选项D错误。










第八章 指针
1】在计算机内存中,用一个字节表示一个内存单元并为每一个存储单元编号,这个编号就是存储单元的"地址"。【一个变量的地址称为该变量的"指针"】。专门用来存放变量地址的变量,称为"指针变量"。A选项正确。常量存储在编译文件中,不能取地址。B选项错误。一个指针变量的地址只能赋给指向这种类型的指针变量,与其本身类型不同,不能赋值,C选项错误。未赋初值的指针变量自动赋任意地址值
2】指针运算符 (通常称为间接引用运算符:indirection operator或复引用运算符:dereferencing operator),它返回其操作数(即一个指针)所指向的对象的值。【定义语句中的 * 号不是一个间址运算符,而是定义指针变量的说明符】,因此,A项错误,B项正确,原则上说p可以放double兼容性的变量地址
3】A选项语句中b变量还没有定义不能直接用于给a变量赋值?C选项语句中*b?*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c?D选项语句中a=0.0后面应该为逗号,不能是分号?
4】在f(int *p,int*q)函数中,执行【p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1】,所以m的得知所对应的值没有变,而n的值则为3了。
5】如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。
6】【注意!!】题干中定义一个指针变量ptr,再把a的地址值赋给ptr,此时a和*ptr代表同一内存单元中的值,*ptr=8表示把a和*ptr的值修改为8,【a = (*ptr) ++表示把指针ptr对应地址单元里的值赋给a,再将ptr对应地址单元里的值加1】,因此*(ptr)值为9,同时a也为9,因此答案为A选项。
7】函数f()的功能是:定义一个临时的整型指针变量s,指向全局变量k,然后用k的值对s指向的内存地址进行赋值,结果当然是k的值不变;另外在调用函数f()过程中,虽然使用m的地址初始化s,但是s在f函数内部又被指向k的地址,所以s的后续操作对m没有任何影响,因此最后输出为3,5
8】把一个指针变量的值赋给另一个指针变量,但一定要确保这两个指针变量的(基类型是相同的)【强制类型转换】
9】只要两个指针变量基类型相同,可以指向同一个对象
10】sizeof(FILE*)=4,因为file* 为指针,指针的大小4 ,sizeof(int*)=4,理由同前面。文件指针的值是地址,是一个16进制的数,它的值不一定小于文件字节数,因此选项B错误。【文件指针是所指文件的当前读取位置,而不是文件指针的值】因此选项C错误。intfscanf(FILE*stream,constchar*format,[argument...]);
fscanf函数可以向任意类型的文件,写入任意数量不能超过系统的缓冲区,写文件先写入缓冲区,最后一起写入文件,因此选项D错误
11】函数调用中形参值的变化不会传递给实参;(float array[], int *ptr)均表示定义了2个指针变量*array和ptr,其中函数形参中int array[]其实相当于int* array
12】static定义一个静态分布变量,变量只会初始化一次。在for函数的循环体中调用sum(i)函数,循环3次,每次都把i值累加在init中,再执行i+1操作,因此,退出循环后,init=1+1+2+3=7,再执行次sum(1),init=8后,把init的地址赋给指针p,输出指针p指向的init的值
13】指针变量可以通过求地址运算符(&) 来获得地址值,可以通过指针变量获得地址值,还可以通过标准函数获得地址值;C选项中,【p=NULL;和p=0;或p='\0';等价;】D选项中,【语句p=NULL;执行后,指针p并不是指向地址为0的存储单元,而是具有一个确定的值-"空"】
14】指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,否则将引起错误;C选项中,p=NULL;和p=0;是等价的;D选项中,【指向同一数组的两指针变量进行关系运算可表示它们所值数组元素之间的关系】
15】如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
16】【常数的地址存储在内存的常量区,常量区存储的都是常量,值都是不可修改的】,所以直接取常量的地址赋给指针变量没有任何意义,C语言也不允许这样做,编译会出错,B选项错误;表达式的值存储在临时变量中,内存中存在专门用来存储临时变量的区域,对这块地址进行操作也是没有意义的,C语言不允许这样做,编译会出错,C选项错误;可以取一个指针变量的地址,但是指针变量的地址属于指针,只能赋值给指针类型的指针变量
17】本题主要考查了指向字符串的指针和字符数组,str1为一个字符指针,所以sizeof为4,str2为字符数组,其中包含6个字符,所以答案为4 6
因为p是指向一个指针数组,作为数组名,不能指向别的地方。B选项错误,因为p[0]是一个int指针,也就是int*;而a是一个指向指针的指针int**。C选项正确,因为p[0]是一个int*,a[1][2]是int,&a[1][2]是int*,类型吻合。D选项错误,因为a作为数组名,不能取地址。即使能取,p[1]是int*,&a是int***
18】因为p是指向一个指针数组,作为数组名,不能指向别的地方。B选项错误,因为p[0]是一个int指针,也就是int*;而a是一个指向指针的指针int**。C选项正确,因为p[0]是一个int*,a[1][2]是int,&a[1][2]是int*,类型吻合。D选项错误,因为a作为数组名,不能取地址。即使能取,p[1]是int*,&a是int***,类型不对。
19】 char str[][20]={"One*World",     "One*Dream!"},*p=str[1];
,   unsigned int strlen(char *s); 计算字符串s的(unsigned int型)长度,不包括'\0'在内; p指向数组的第二个元素,因此strlen(p)=10
20】注意strlen()【长度,不包括\0】和sizeof()【包括\0】二者的区别










第九章 编译预处理与动态存储分配
1】预处理命令是以"#"号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以B),C)错误。C)语言的预处理能够实现宏定义和条件编译等功能
2】宏名习惯采用大写字母,以便与一般变量区别,但是并没有规定一定要用大写字母而且宏替换不占用运行时间,不具有类型,不具有计算功能
3】#define命令是C语言中的一个宏定义命令,标识符一般使用大写,为了区分其他标识符,它用来将一个标识符定义为一个字符串,【该标识符被称为宏名,被定义的字符串称为替换文本】。宏定义不进行其他操作,仅仅只是替换标识符。S(k+j+2)=k+j+2*k+j+2/k+j+2,经计算可得29,S(j+k+2)=j+k+2*k+j+2/j+k+2,计算可得29。因此输出为29,29
4】宏定义不是C语句,末尾不需要有分号。所以语句printf("%4.1f\n" , S(a+b));展开后为printf("%4.1f\n" ,3.5;*a+b*a+b;);所以程序会出现语法错误
5】注意:【预处理是在程序编译之前进行的】;预处理是在程序编译之前进行的;
6】数学库中定义了函数的名称、参数个数与类型、返回值类型与具体的函数体,A选项正确。【编译预处理时,预处理程序将查找指定的被包含文件,并将其复制到#include命令出现的位置上,BC选项错误。不引用math.h文件,文件编译时,编译器无法识别没有被定义的sin函数,D选项错误。
7】本题考查malloc函数,题目中要求p指向一个int型的动态存储单元,那么就应该将分配的存储单元转化为int
8】B选项中,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数;C选项中,函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型;A选项中,虽然不同基类型的指针变量占用字节数是相同的,但是不能混用
9】














第十章 结构体与共用体
1】【typedef 类型名 新类型名】 表示为一个已有定义的类型标识符重新定义一个类型名,题中,首先为指针类型命名为T,再通过T定义了一个数组指针*a[20],整个功能等价于int  **a[20]
2】C语言允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取"别名"。类型定义符typedef即可用来完成此功能,可以完全代替原来的类型说明符。因此,变量a的类型为int *a[10]。typedef int *T[10],由于[]运算符优先级高于*,可以看成typedef int[10] *T,替换T可得int[10] *a=>int *a[10]
3】注意:关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型
4】stud[0].name[3]为数组stud第一个元素的成员name字符数组的第四个元素m。stud[3].name[3]为数组stud第四个元素的成员name字符数组的第四个元素u。stud[2].name[2]为数组stud第三个元素的成员name字符数组的第三个元素u。stud[1].name[1]为数组stud第二个元素的成员name字符数组的第二个元素u
5】用typedef说明一种新类型名STU,其使用情况与结构体基本一致。程序执行过程为:定义STU类型数组,长度为2,并为其初始化。s[0].name="Hua",s[0].sex='m',s[0].age=18,s[1].name="Qin",s[1].sex='f',s[1].age=19。调用函数fun(s+1)将变量s[1]地址传入函数,则s[1].name="Tong",s[1].age=20。依次输出s[0].name,s[0].age,s[1].name ,s[1].age,结果为Hua,18,Tong,20
6】C语言允许用typedef说明一种新类型名,其一般形式如下:typedef 类型名 新类型名;题目中定义了新类型Date,这种类型变量包含3个成员,DATE是这种新类型的名字。DATE是用户说明的新结构体类型名,不是结构体变量,C选项叙述正确,A选项叙述错误,选择A选项。struct Date是用户定义的结构体类型,B选项叙述正确。struct是结构体类型的关键字,D选项叙述正确。
7】主函数首先为结构体定义两个变量s1,s2,分别使用字符串拷贝函数strcpy()为s1和s2的成员name赋值,再将s2中的成员信息赋值给s1,因此输出为"="【s1 = s2 ,在结构体变量之间也表示赋值】
8】oid  fun(int  array[4], int  *ptr); fun()函数,第一个参数虽然是数组类型,但是会退化为指针,并且形参数组的个数没有用。第二个参数是指针,因此实际上二个形参都是指针。两个形参都是指针,传递的都是地址,而不是值。
9】








第十一章 文件
1】本题考查文件的概念,【文件是由数据序列组成,可以构成二进制文件或文本文件】
2】文件指针【指向的是文件缓冲区】,而不是文件本身位置,因此B,C选项错误;fscanf()函数作用是从指定的文件中格式化读数据,读取数据类型由格式控制符决定;在【C语言中用一个指针变量指向一个文件,这个指针称为文件指针】。通过文件指针就可对它所指的文件进行各种操作。【文件指针不是文件位置指针;文件指针是指针变量,存储的是文件缓存区首地址】,而不是文件在计算机磁盘中的路径信息
3】sizeof(FILE*)=4,因为file* 为指针,指针的大小4 ,sizeof(int*)=4,理由同前面。文件指针的值是地址,是一个16进制的数,它的值不一定小于文件字节数,因此选项B错误。【文件指针是所指文件的当前读取位置,而不是文件指针的值】
4】fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。
【   fscanf函数从文本文件中按格式输入。
      fprintf函数按照格式向文本文件中输出数据。文件定位函数fseek,将指针由文件开头0、当前位置1、末尾2移动指定字节。      rewind函数功能使文件的位置指针返回到文件头。程序执行过程为:以读/写方式建立一个新的文本文件data.dat,将1写入文件;执行for循环,将文件指针移到文件开头,将文件第一个数值1赋给k,再将指针移动到开头,向文件内输入a+k=3。for循环实现将a数组中元素累加,结果21存放在文件中。
      调用rewind将文件指针移动到开头,调用fscanf函数从文件中读出数值赋予k=21,调用fclose函数关闭文件,打印k值
5】C语言中打开一个文件通过系统函数fopen实现,其调用的一般形式为:FILE* fopen("文件名","操作方式");通过这个函数把程序中要读、写的文件与磁盘上实际的数据文件联系起来,A选项正确。B选项函数调用中缺少参数"操作方法",错误。【fopen函数返回一个指向指定文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL】,C选项错误。fopen函数的返回值必须赋给一个文件类型的指针变量
6】】fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。如果指定文件不存在则创建一个文件名为指定文件名的新文件,然后打开它。在指定文件有错误或者指定文件不存在却不能创建新文件的情况下,打开文件操作错误,返回空指针。本题程序中,文件test.txt已存在,程序运行后,文件test.txt中的原有内容将全部消失
7】对一个文件操作完成后,要将该文件关闭,"关闭"就是使文件指针变量不再指向该文件。程序编写者应该在程序终止之前关闭所有文件,如果不关闭,文件将会丢失数据。因为,【在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失】【用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。】
8】【文件结束或者错误,则返回符EOF是在头文件stdio.h中定义的宏,一般值为-1】,在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。【在文本文件中,数据都是以字符的ASCII代码值的形式存放,由于不可能出现-1,因此可以用EOF作为文件结束标志。】0----255的字符
9】fputc函数,该函数将字符ch写到文件指针fp所指向的文件的当前写指针的位置。函数格式:int fputc (int n, File *fp)
10】fputs函数的功能是用来向指定文件输出一个字符串。fwrite函数的功能是用来向文件写数据块。fprintf函数按照格式向文本文件中输出数据。这三者都是库函数,而fpout不是库函数
11】 fgetc()从文件读入一个字符到指定变量。fputc()将指定字符写入fp文件中,fprintf(),fwrite()均是写入文件操作函数
12】fgets读取一个长度为(n-1)的字符串,
        fread按照指定的长度读取数据项,对应2进制的打开方式,
        fscanf按指定格式读,对应文本打开方式,
        getc从指定的文件读入一个字符,即从fp所指向的文件中读入一个字符赋给ch。
13】【 fread()函数用法是fread(void *buffer,int size,int n,FILE *fp),其中buffer为指针类型,应该传入指针类型的值,a应该改为&a    】
14】本题考查文件的定位,【feof函数的用法是从输入流读取数据,如果到达文件末尾(遇文件结束符)】,eof函数值为非零值,否则为0
15】在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种【以EOF作为文件结束标志的文件,必须是文本文件】。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1
16】
  





上一篇:【C语言资料进阶】分享自己收集整理的计算机二级资料笔记
下一篇:【黑科技工具】使用shiAndroid Killer软件手动去除优酷土豆视频安卓版APK软件...
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。

3

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2018-8-8 19:26:36 | 显示全部楼层
这个还是挺详细的
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。

0

主题

4

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2018-8-25 16:11:29 | 显示全部楼层
赞一个
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

微信扫一扫

快速回复 返回顶部 返回列表