‘壹’ 深度学习给生物学带来了哪些改变
深度学习研究及其在生物医药领域的潜在应用
深度学习已经在各种生物学应用中取得成功。在本节中,我们回顾了在各个研究领域进行深度学习的挑战和机会,并在可能的情况下回顾将深度学习应用于这些问题的研究(表1)。我们首先回顾了生物标志物开发的重要领域,包括基因组学,转录组学,蛋白质组学,结构生物学和化学。然后,我们回顾一下药物发现和再利用的前景,包括使用多平台数据。
生物标志物。生物医学的一个重要任务是将生物学数据转化为反映表型和物理状态(如疾病)的有效生物标志物。生物标志物对于评估临床试验结果[18]以及检测和监测疾病,特别是像癌症这样的异质性疾病,是至关重要的[19,20]。识别敏感特异性生物标志物对于现代转化医学来说是一个巨大的挑战[21,22]。计算生物学是生物标志物发展。事实上,从基因组学到蛋白质组学都可以使用任何数据来源;这些在下一节中讨论。
基因组学。新一代测序(NGS)技术已经允许生产大量的基因组数据。这些数据的大部分分析都可以用现代计算方法在计算机上进行。这包括基因组的结构注释(包括非编码调控序列,蛋白质结合位点预测和剪接位点)。
基因组学的一个重要分支是宏基因组学,也被称为环境,生态基因组学或社区基因组学。NGS技术揭示了未经培育且以前没有得到充分研究的微生物的自然多样性。
宏基因组学中有几个生物信息学挑战。一个主要挑战是序列数据的功能分析和物种多样性的分析。深信念网络和经常性神经网络的使用已经允许通过表型分类宏基因组学pH数据和人类微生物组数据。 与基线方法相比,这些方法并没有提高分类准确性作为强化学习,但确实提供了学习数据集的分层表示的能力.[23]但是,Ditzler等强调DNN可以改善现有的宏基因组学分类算法,特别是在大数据集和适当选择网络参数的情况下。
表1. 深度学习技术应用于不同类型生物医学数据的总结
应用
数据源
研究目的
DL技术
准确率
利用深度学习增强癌症诊断和分类[28]
13种不同的癌症基因表达数据集(13 different gene expression data sets of cancers)
癌症检测,癌症类型分类
稀疏和堆栈自动编码器+ Softmax回归
对于每个数据集的准确度都比基准更好
深度学习组织调节拼接代码[32](Deep Learning of the Tissue-Regulated Splicing Code)
从RNA-Seq数据分析11 019个小鼠替代外显子(11 019 mouse alternative exons profiled from RNA-Seq data)
拼接模式识别
自动编码器+ DNN(3层)+薄荷(超参数选择)
AUC优于基线准确度
深卷积神经网络注释基因表达模式的小鼠脑[30]
由Allen Institute for Brain Science的小鼠脑的四个发育阶段的ISH图像
基因表达注释
CNN(Overfeat)
AUC=0.894
多模式深度学习方法的多平台癌症数据的综合数据分析[52]
卵巢癌和乳腺癌数据集(ovarian and breast cancer data sets)
聚集癌症患者
DBNs
lncRNA-MFDL:通过融合多个特征和使用深度学习鉴定人类长的非编码RNA[34]
Gencode和RefSeq的蛋白质编码和非编码序列(protein-coding and noncoding sequences from Gencode and RefSeq)
鉴定长的非编码RNA
lncRNA-MFDL(深层堆叠网络,每个单元DNN)
ACC = 97.1%
用于宏基因组分类的多层和递归神经网络[23]
pH微生物组测序数据集和人微生物组测序数据集(pH microbiome sequencing data set and human microbiome sequencing data set)
宏基因组分类
MLP, DBN, RNN
comparison
Multi-Level Gene/MiRNA Feature Selection using Deep Belief Nets and Active Learning[27]
来自6种癌症的MiRNA表达数据(MiRNA expression data from 6 type of cancers)
Gene/MiRNA特征选择(基因表达)
MLFS(DBN +特征选择+无监督主动学习)(MLFS (DBN + feature selection + unsupervised active learning))
F1 = 84.7%
成对输入神经网络用于目标配体相互作用预测[45]
sc-PDB数据库(sc-pdb:用于鉴定蛋白质中“可药用”结合位点的变化和多样性的数据库)
蛋白质 - 配体预测
PINN (SVD + Autoencoder/RBM)
AUC = 0.959
非编码变量与深度学习序列模型的预测效应[49]
来自ENCODE和Roadmap Epigenomics项目的160种不同TF,125种DHS谱和104种组蛋白标记谱的690 TF结合谱
从序列中预测非编码变异效应
DeepSEA (CNN)
AUC = 0.923 (histone)
通过深度学习预测DNA和RNA结合蛋白的序列特异性[48]
506 ChIP-seq实验,DREAM5 TF-DNA基序识别挑战
DNA和RNA结合蛋白的特异性分类
DeepBind(CNN)
train, AUC = 0.85; validation,
AUC > 0.7
具有双模深信道网络的蜂窝信号系统的跨物种学习[36]
来自SBV IMPROVER挑战的磷酸化蛋白质组学数据
跨物种学习(模拟细胞信号系统)
bDBN (bimodal DBN) and
sbDBN (semirestricted bimodal
DBN)
AUC = 0.93
表达数量性状基因(eQTL)的鉴定与阐明及其调控机制的深入研究[35]
GEUVADIS(来自从参与1000基因组项目的个体中提取的337个淋巴母细胞系的选择的RNA-Seq和全基因组范围的SNP-阵列数据的组合)
确定eQTL
MASSQTL(DNN)
AUC = 0.85
建立RNA结合蛋白靶点结构特征的深度学习框架[43]
源自doRiNA的24个数据集(转录后调节中的RNA相互作用数据库)
预测RNA结合蛋白的结合位点(RBP靶标识别)
DBN(多模式DBN)
AUC = 0.983 on PTB HITS-CL
DeepCNF-D:通过加权深度卷积神经场预测蛋白质有序/无序区域[42]
来自CASP的CASP9, CASP10数据集(蛋白质结构预测的关键评估)
预测蛋白质有序/无序区域
DeepCNF (CRF + CNN)
AUC = 0.855 on CASP9
AUC = 0.898 on CASP10
用深度神经网络分割微阵列[29]
两个数据集,来自2006年Lehmussola等人的微阵列图像
微阵列分割
CNN
MAE = 0.25
深度学习药物引起的肝损伤[46]
四个数据集,化合物,化学结构注释DILI阳性或DILI阴性(four data sets, compounds, chemical structure annotated DILI-positive or DILI-negative properties)
药物性肝损伤预测
RNN(递归神经网络)
AUC = 0.955
从头算蛋白质二级结构预测的深度学习网络方法[38]
训练,Protein Data Bank; 验证,CASP9,CASP10(蛋白质结构预测的关键评估)
从头算蛋白质二级结构预测
DNSS(多模RBM)
Q3 = 90.7%, Sov = 74.2%
蛋白质接触图预测的深层架构[39]
ASTRAL database
蛋白质接触图预测
RNN + DNN
ACC ∼ 30%
用深机器学习网络建模药物样分子的环氧化作用[47]
Accelrys代谢物数据库(AMD):389个环氧化分子,811个非氧化分子(Accelrys Metabolite Database (AMD): 389 epoxidized molecules, 811 nonepoxidized molecules)
建模分子的环氧化性质
CNN
AUC better than baseline accuracy
DNdisorder:使用增强和深度网络预测蛋白质紊乱[41]
DISORDER723, CASP9, CASP10
预测蛋白质有序/无序区域
RBM
AUC better than baseline
accuracy
Basset:用深度卷积神经网络学习可访问基因组的规则代码[50]
来自ENCODE和Epigenomics Roadmap项目的164个细胞类型的DNasel-seq数据
学习DNA序列的功能活动
CNN
AUC = 0.892
a首字母缩写词:CNN=卷积神经网络,DNN=深度神经网络,RNN=递归神经网络,DBN=深信念网络,RBM=限制玻尔兹曼机器,MLP=多层感知器,MLFS=多级特征选择,PINN= 网络,CRF=条件随机场。
转录。转录组学分析利用各种类型转录物(信使RNA(mRNA),长非编码RNA(lncRNA),微小RNA(miRNA)等)丰度的变化来收集各种功能信息,从剪接代码到各种疾病的生物标志物。
转录组学数据通常从不同类型的平台(各种微阵列平台,测序平台)获得,其不同之处在于测量的基因组和信号检测方法。许多因素导致基因表达数据的变异性。因此,即使对于单个平台分析也需要标准化。 跨平台分析需要规范化技术,这可能是一个重大挑战。由于DNN具有较高的泛化能力,因此特别适合于跨平台分析。他们也能很好地处理基因表达数据的其他一些主要问题,比如数据集的大小以及对降维和选择性/不变性的需求,下面我们将回顾几个已经使用的DNN 用不同类型的基因表达数据来获得不同程度的成功。
表格数据应用程序。基因表达数据可以表示的一种方式是作为矩阵的表格形式,其包含关于转录物表达的定量信息。这些数据是高维度的,由于数据中的信噪比损失,使得统计分析成为问题。[25]
高维数据可以通过两种方式处理:
I. 降维:
A.特征提取,例如用SVM或随机森林算法;
B.特征子集选择;
C.途径分析;
II. 使用对高维度较不敏感的方法,如随机森林或深层信念网络。
诸如主成分分析(PCA),奇异值分解,独立分量分析或非负矩阵分解等方法是常见的前沿方法。然而,上述方法将数据转换成许多难以用生物学解释的组件。此外,这种降维方法基于基因表达谱提取特征而不管基因之间的相互作用。通路分析可以减少变量的数量,减少错误率并保留更多的生物相关信息。[25,26]
深度学习在处理高维基质转录组学数据方面也取得了一些成功。在另一种方法中,将基因表达的特征与非编码转录物如miRNA的区域一起提取; 这是通过使用深度信念网络和主动学习来实现的,其中使用了深度学习特征提取器来减少六个癌症数据集的维度,并且胜过了基本特征选择方法[27]。主动学习与分类的应用提高了准确性,并且允许选择与癌症相关的特征(改进的癌症分类),而不仅仅基于基因表达谱。使用miRNA数据的特征选择是使用与先前选择的特征子集的目标基因的关系实施的。
在另一个深度学习应用中,Fakoor等人利用自编码器网络进行推广,并将其应用于使用从具有不同基因集合的不同类型的微阵列平台(Affimetrix家族)获得的微阵列基因表达数据的癌症分类[28]。他们通过PCA和非监督非线性稀疏特征学习(通过自动编码器)结合使用降维来构建用于微阵列数据的一般分类的特征。癌症和非癌细胞分类的结果显示出了重要的改进,特别是使用监督微调,这使得特征不那么通用,但即使对于没有跨平台标准化的数据也能获得更高的分类准确性。自动编码器的全球泛化能力有助于使用不同微阵列技术收集的数据,因此可能对来自公共领域的数据进行大规模综合分析有前途。
图像处理应用。基因表达也可以以可视形式存储为图像,例如来自微阵列的图像荧光信号或RNA原位杂交荧光或放射性信号。 在一些应用中,以图像处理性能优越着称的CNN已经显示出改善这些图像分析的潜力。
在微阵列分析中,由于斑点大小,形状,位置或信号强度的变化,检测信号和识别荧光斑点可能是具有挑战性的,并且荧光信号强度通常对应于基因或序列表达水平差。在对这个问题的深度学习技术的一个应用中,CNN被用于微阵列图像分割,并且在准确性方面显示出类似于基准方法的准确度的结果,但是训练更简单并且对计算源的要求更少。[29]
将CNN应用于基于图像的基因表达数据的另一个机会是RNA原位杂交,这是一种繁琐的技术,当允许这样的操作时,能够使基因表达在一组细胞,组织切片或整个生物体中定位和可视化。这种方法促进强大的纵向研究,说明发展过程中的表达模式的变化。它被用于构建详细的Allen DevelopmentMouse Brain Atlas,其中包含超过2000个基因的表达图谱,每个基因在多个脑部分中进行说明。过去,这些手动标注是耗时的,昂贵的,有时也是不准确的。然而,最近,Zeng等人使用深度预训练CNN进行自动注释[30]。要做到这一点,神经网络模型训练原始自然原位杂交图像的不同层次的发展中国家的大脑没有关于坐标(空间信息)的确切信息;这种技术在四个发展阶段的多个大脑水平上实现了卓越的准确性。
剪接。深度学习的另一个应用领域是剪接。剪接是在真核生物中提供蛋白质生物多样性的主要因素之一;此外,最近的研究显示“拼接代码”与各种疾病之间的联系[31]。然而,现代科学仍然不能全面地理解控制剪接调控的机制。剪接调节的现代概念包括转录水平,特定信号调节序列元件(剪接增强子或沉默子)的存在,剪接位点的结构和剪接因子的状态(例如特定位点的磷酸化可能改变剪接因子活性)。所有这些因素使分析变得复杂,因为它们之间存在大量元素和复杂的非线性相互作用。现有的拼接预测软件需要高通量测序数据作为输入,并且面临着原始读取比常规基因短的问题,以及基因组中假性基因的高重复水平和存在。因此,拼接机制的分析算法很慢,需要高度的组合计算来源,深度学习可能会在这方面提供改进。在使用五个组织特异性RNA-seq数据集的一个深度学习应用中,使用隐变量来开发DNN以用于基因组序列和组织类型中的特征,并且被证明优于贝叶斯方法预测个体内和组织间的组织剪接外显子拼接的转录本百分比的变化(拼接代码度量)[32]。
非编码RNA。非编码RNA是生物学中的另一个问题,需要复杂的计算方法,如深度学习。非编码RNAs非常重要,涉及转录,翻译和表观遗传学的调控[33],但是它们仍然难以与编码蛋白质的RNA区分开来。对于短的非编码RNA,这个任务已经很好地解决了,但是对于lncRNA来说这是相当具有挑战性的。lncRNAs组成异构类,可能含有推定的复制起点(ORF),短的蛋白质样序列。开发了一种新的深层次的学习方法,称为lncRNAMFDL,用于鉴定lnc-RNAs,使用ORF,k相邻碱基,二级结构和预测的编码结构域序列等多种特征的组合[34]。该方法使用从Gencode(lncRNA)和Refseq(蛋白质编码mRNA数据)的序列数据中提取的五个单独特征,并且在人类数据集中导致97.1%的预测准确性。
表达量性状基因座分析。最后,数量性状基因座(QTL)分析有潜力进行深入的学习。 QTL分析鉴定含有多态性的遗传基因座,所述多态性导致复杂的多基因性状(例如,体重,药物反应,免疫应答)的表型变异。显示遗传变异的一个这样的“性状”是给定组织和/或条件中任何给定基因的表达或转录本丰度。表达QTL(eQTL)是影响转录本丰度的遗传变异的基因座。 eQTL分析已经导致了对人类基因表达调控的洞察力,但面临着许多挑战。在局部调节表达的eQTL(顺式-eQTL)相对容易用有限数量的统计测试来鉴定,但是调节基因组中其它位置的基因表达的位点(trans-eQTL)更难以检测到。最近,为了解决使用各种编码的生物特征(诸如物理蛋白质相互作用网络,基因注释,进化保守,局部序列信息以及来自ENCODE项目的不同功能元件)的反式eQTL预测问题的深度学习方法MASSQTL[35]被提出。DNN利用来自其各自交叉验证折叠的9个DNN模型,优于其他机器学习模型,并且提供了对基因表达的调控架构的基础的新机制。深解码系统也被用来对trans-eQTL特征向量进行聚类,然后通过t-SNE降维技术进行可视化。
蛋白质组学。与转录组学相比,蛋白质组学是一个相当欠发达的研究领域,数据依然稀少,用于分析的计算方法较少。即使有相似的信号编码和传输机制,人类蛋白质组学数据的缺乏以及将模型生物体结果转化为人类的困难也使分析变得复杂。
深度学习可以以多种方式使蛋白质组学受益,因为一些方法不需要像其他机器学习算法那样的大量培训案例。深度学习方法的其他优点是他们建立数据的分层表示,并从复杂的相互作用中学习一般特征,从而有利于蛋白质的蛋白质组学和网络分析。例如,使用磷酸化数据,双峰深信念网络已被用于预测大鼠细胞对相同刺激的刺激的细胞反应[36]。与传统的管线相比,开发的算法获得了相当的准确性。
结构生物学和化学。结构生物学包括蛋白质折叠分析,蛋白质动力学,分子建模和药物设计。二级和三级结构是蛋白质和RNA分子的重要特征。对于蛋白质,适当的结构测定对于酶功能预测,催化中心和底物结合的形成,免疫功能(抗原结合),转录因子(DNA结合)和转录后修饰(RNA结合)是重要的。丧失适当的结构会导致功能丧失,并且在某些情况下会导致可能导致神经退行性疾病(如阿尔茨海默病或帕金森病)的异常蛋白质的聚集。[37]
基于复合同源性的比较建模是预测蛋白质二级结构的一种可能方式,但是受现有注释良好的化合物的量限制。另一方面,机器学习从头预测是基于公认的具有公知结构的化合物的模式,但是还不够精确以至于不能实际使用。从头开始使用深度学习方法通过使用蛋白质测序数据改进了结构预测[38]。同样,深度学习已经被应用于使用ASTRAL数据库数据和复杂的三阶段方法来预测二级结构元素和氨基酸残基之间的接触和取向[39]。所使用的方法是分析偏倚和高度可变数据的有效工具。
三维结构的不变性在功能上也是重要的。然而,有几种蛋白质没有独特的结构参与基本的生物过程,如细胞周期的控制,基因表达的调控,分子信号传递。此外,最近的研究显示一些无序蛋白质的显着性[37]; 许多癌基因蛋白具有非结构域,并且错误折叠蛋白的异常聚集导致疾病发展[40]。这种没有固定三维结构的蛋白被称为固有无序蛋白(IDP),而没有恒定结构的结构域被称为固有无序区(IDR)。
许多参数将IDP / IDR与结构化蛋白质区分开来,从而使预测过程具有挑战性。这个问题可以使用深度学习算法来解决,这些算法能够考虑各种各样的特征。2013年,Eickholt和Cheng发表了一个基于序列的深度学习预测指标DNdisorder,与先进的预测指标相比,改进了对无序蛋白质的预测[41]。后来在2015年,Wang等人提出了一种新的方法,DeepCNF,使用来自蛋白质结构预测的临界评估(CASP9和CASP10)的实验数据,能够准确预测多个参数,如IDPs或具有IDR的蛋白质。DeepCNF算法通过利用众多特征,比基线单从头(从头算)预测指标执行得更好[42]。
另一类重要的蛋白质是结合单链或双链RNA的RNA结合蛋白。 这些蛋白质参与RNA的各种转录后修饰:剪接,编辑,翻译调控(蛋白质合成)和聚腺苷酸化。RNA分子形成不同类型的臂和环,需要识别和形成RNA和蛋白质之间连接的二级和三级结构。RNA的二级和三级结构是可预测的,并且已经被用于建模结构偏好偏好和通过应用深度信念网络预测RBP的结合位点[43]。深度学习框架在真正的CLIP-seq(交联免疫沉淀高通量测序)数据集上进行了验证,以显示从原始序列和结构分布中提取隐藏特征的能力,并准确预测RBP的位点。
药物发现和再利用。计算药物生物学和生物化学广泛应用于药物发现,开发和再利用的几乎每个阶段。过去数十年来,不同的研究团体和公司在全球范围内开发了大量用于计算机模拟药物发现和目标延伸的计算方法,以减少时间和资源消耗。虽然存在许多方法[44],但是还没有一个是最优的(例如,无法执行通量筛选或者通过蛋白质类别进行限制),现在一些研究表明深度学习是一个重要的考虑方法(表1)。
药物发现的重要任务之一就是预测药物靶点的相互作用。 靶标(蛋白质)通常具有一个或多个与底物或调节分子的结合位点; 这些可以用于建立预测模型。 然而,包括其他蛋白质的成分可能会给分析带来偏见。成对输入神经网络(PINN)接受具有从蛋白质序列和靶分布获得的特征的两个载体的能力被Wang等人用来计算靶标-配体相互作用[45]。神经网络的这种优势比其他代表性的靶标-配体相互作用预测方法有更好的准确性。
药物发现和评估是昂贵,耗时且具有风险; 计算方法和各种预测算法可以帮助降低风险并节省资源。一个潜在的风险是毒性; 例如,肝毒性(肝毒性)是从生产中去除药物的常见原因。用计算方法预测肝毒性可能有助于避免可能的肝毒性药物。使用深度学习,可以有效地确定原始化学结构的化合物毒性,而不需要复杂的编码过程[46]。使用CNN也可以预测诸如环氧化的性质,这意味着高反应性和可能的毒性; 这是休斯等人首次实施的。通过使用环氧化分子和氢氧化物分子的简化分子输入线入口规格(SMILES)格式数据作为阴性对照[47]。
多平台数据(Multiomics)。使用多平台数据的能力是深度学习算法的主要优势。 由于生物系统复杂,具有多个相互关联的元素,基因组学,表观基因组学和转录组学数据的系统级整合是提取最有效且有生物学意义的结果的关键。整合过程在计算上不是微不足道的,但收益是生物标志物特异性和灵敏度比单一来源方法的增加。
计算生物学中需要分析组合数据的主要领域之一是计算表观遗传学。有联合分析基因组,转录组,甲基化组特征和组蛋白修饰提供了准确的表观基因组预测。
一些研究人员已经开发出深度学习方法,可用于分析来自多个来源的数据(表1)。Alipanahi等人开发了基于深度学习的方法DeepBind(tools.genes.toronto.e/deepbind/),以在各种疾病中计算核苷酸序列结合转录因子和RNA结合蛋白的能力,并表征单点突变对结合特性的影响。DeepBind软件受CNN启发,对技术不敏感; 相反,它与从微阵列到序列的定性不同形式的数据是相容的。CPU的实现也允许用户并行化计算过程[48]。在另一个基于CNN的应用程序中,Zhou和Troyanskaya设计了DeepSEA框架来预测染色质特征和疾病相关序列变异的评估。与其他计算方法不同,他们的算法能够捕获每个结合位点的大规模上下文序列信息,用于注释从头序列变异体[49]。开发了类似的CNN管线,揭示了序列变异对染色质调控的影响,并对DNase-seq(DNase I测序)数据进行了培训和测试[50]。一种名为Bassed的深度学习软件优于基线方法,并且在所有数据集上达到平均AUC0.892。最后,随着深层特征选择模型的发展,深度学习被用于识别主动增强器和促进器,该模型利用了DNN对复杂非线性相互作用进行建模的能力,并学习了高层次的广义特征[51]。模型从多平台数据中选择特征,并按照重要性进行排序。在这些应用中,深度学习方法是染色质性质的更敏感和更有力的预测因子,也是复杂生物标志物发展的关键。
癌症是一组异质性疾病的广泛名称,其中一些是由基因突变引起的,因此使用多平台数据的癌症分类可以揭示潜在的病理学。Liang等人开发了一个具有多平台数据的深层信念网络模型,用于癌症患者的聚类[52]。使用受限玻尔兹曼机对每种输入模式定义的特征进行编码。这种方法的一个优点是深层信念网络不需要具有正态分布的数据,因为其他聚类算法和遗传(生物)数据不是正态分布的。
最后,从自然语言处理的角度来看,深度学习在通过巨大的非结构化(研究出版物和专利)和结构化数据(知识注释图,如基因本体论[53]或Chembl[54])浏览时,通过检验假设的合理性。这些数据库一起形成了一个庞大的,多平台的数据集,如果结合起来,这些数据集将更加丰富和全面。
总之,现代生物数据的庞大规模,对于以人为本的分析来说太庞大而复杂。 机器学习,特别是深度学习与人类专业知识相结合,是将多个大型多平台数据库完全集成的唯一途径。 深度学习使人类能够做到以前无法想象的事情:具有数百万输入的图像识别,语音识别以及接近人类能力的语音自动化。 虽然深度学习和特别是无监督的深度学习仍处于起步阶段,特别是在生物学应用方面,但最初的研究支持它作为一种有希望的方法,尽管在实施中不受限制和挑战,但可以克服生物学数据的一些问题, 对数百万间接和相互关联的疾病机制和途径的新见解。
‘贰’ 13个最常用的Python深度学习库介绍
13个最常用的Python深度学习库介绍
如果你对深度学习和卷积神经网络感兴趣,但是并不知道从哪里开始,也不知道使用哪种库,那么这里就为你提供了许多帮助。
在这篇文章里,我详细解读了9个我最喜欢的Python深度学习库。
这个名单并不详尽,它只是我在计算机视觉的职业生涯中使用并在某个时间段发现特别有用的一个库的列表。
这其中的一些库我比别人用的多很多,尤其是Keras、mxnet和sklearn-theano。
其他的一些我是间接的使用,比如Theano和TensorFlow(库包括Keras、deepy和Blocks等)。
另外的我只是在一些特别的任务中用过(比如nolearn和他们的Deep Belief Network implementation)。
这篇文章的目的是向你介绍这些库。我建议你认真了解这里的每一个库,然后在某个具体工作情境中你就可以确定一个最适用的库。
我想再次重申,这份名单并不详尽。此外,由于我是计算机视觉研究人员并长期活跃在这个领域,对卷积神经网络(细胞神经网络)方面的库会关注更多。
我把这个深度学习库的列表分为三个部分。
第一部分是比较流行的库,你可能已经很熟悉了。对于这些库,我提供了一个通俗的、高层次的概述。然后,针对每个库我详细解说了我的喜欢之处和不喜欢之处,并列举了一些适当的应用案例。
第二部分进入到我个人最喜欢的深度学嫌弊习库,也是我日常工作中使局蚂用最多的,包括:Keras、mxnet和sklearn-theano等。
最后,我对第一部分中不经常使用的库做了一个“福利”板块,你或许还会从中发现有用的或者是在第二板块中我还没有尝试过但看起来很有趣的库。
接下来就让我们继续探索。
针对初学者:
Caffe
提到“深度学习库”就不可能不说到Caffe。事实上,自从你打开这个页面学习深度学习库,我就敢打保票你肯定听说Caffe。
那么,究竟Caffe是什么呢?
Caffe是由Berkeley Vision and Learning Center(BVLC)建立的深度学习框架。它是模块化的,速度极快。而且被应用于学术界和产业界的start-of-the-art应用程序中。
事实上,如果你去翻阅最新的深度学习出版物(也提供源代码),你就很可能会在它们相关的GitHub库中找到Caffe模型。
虽然Caffe本身并不是一个Python库,但它提供绑定到Python上的编程语言。我们通常在新领域开拓网络的时候使用这些绑定。
我把Caffe放在这个列表的原因是它几乎被应用在各个方面。你可以在一个空白文档里定义你的模型架构和解决方案,建立一个JSON文件类型的.prototxt配置文件。Caffe二进制文件提取这些.prototxt文件并培训你的网络。Caffe完成培训之后,你可以把你的网络和经过分类的新图像通过Caffe二进制文件,更好的就直接通过Python或MATLAB的API。
虽然我很喜欢Caffe的性能(它每天可以在K40 GPU上处理60万张图片),但相比之下我更喜欢Keras和mxnet。
主要的原因是,在.prototxt文件内部构建架构可能会变得相当乏味和无聊。更重要的是, Caffe不能用编程方式调整超参数!由于这两个原因,在基于Python的API中我倾向于对允许我实现终端到终端联桐者埋播网的库倾斜(包括交叉验证和调整超参数)。
Theano
在最开始我想说Theano是美丽的。如果没有Theano,我们根本不会达到现有的深度学习库的数量(特别是在Python)。同样的,如果没有numpy,我们就不会有SciPy、scikit-learn和 scikit-image,,同样可以说是关于Theano和深度学习更高级别的抽象。
非常核心的是,Theano是一个Python库,用来定义、优化和评估涉及多维数组的数学表达式。 Theano通过与numpy的紧密集成,透明地使用GPU来完成这些工作。
虽然可以利用Theano建立深度学习网络,但我倾向于认为Theano是神经网络的基石,同样的numpy是作为科学计算的基石。事实上,大多数我在文章中提到的库都是围绕着Theano,使自己变得更加便利。
不要误会我的意思,我爱Theano,我只是不喜欢用Theano编写代码。
在Theano建设卷积神经网络就像只用本机Python中的numpy写一个定制的支持向量机(SVM),当然这个对比并不是很完美。
你可以做到吗?
当然可以。
它值得花费您的时间和精力吗?
嗯,也许吧。这取决于你是否想摆脱低级别或你的应用是否需要。
就个人而言,我宁愿使用像Keras这样的库,它把Theano包装成更有人性化的API,同样的方式,scikit-learn使机器学习算法工作变得更加容易。
TensorFlow
与Theano类似,TensorFlow是使用数据流图进行数值计算的开源库(这是所有神经网络固有的特征)。最初由谷歌的机器智能研究机构内的Google Brain Team研究人员开发,此后库一直开源,并提供给公众。
相比于Theano ,TensorFlow的主要优点是分布式计算,特别是在多GPU的环境中(虽然这是Theano正在攻克的项目)。
除了用TensorFlow而不是Theano替换Keras后端,对于TensorFlow库我并没有太多的经验。然而在接下来的几个月里,我希望这有所改变。
Lasagne
Lasagne是Theano中用于构建和训练网络的轻量级库。这里的关键词是轻量级的,也就意味着它不是一个像Keras一样围绕着Theano的重包装的库。虽然这会导致你的代码更加繁琐,但它会把你从各种限制中解脱出来,同时还可以让您根据Theano进行模块化的构建。
简而言之:Lasagne的功能是Theano的低级编程和Keras的高级抽象之间的一个折中。
我最喜欢的:
Keras
如果我必须选出一个最喜欢的深度学习Python库,我将很难在Keras和mxnet中做出抉择——但最后,我想我会选Keras。
说真的,Keras的好处我说都说不完。
Keras是一个最低限度的、模块化的神经网络库,可以使用Theano或TensorFlow作为后端。Keras最主要的用户体验是,从构思到产生结果将会是一个非常迅速的过程。
在Keras中架构网络设计是十分轻松自然的。它包括一些state-of-the-art中针对优化(Adam,RMSProp)、标准化(BatchNorm)和激活层(PReLU,ELU,LeakyReLU)最新的算法。
Keras也非常注重卷积神经网络,这也是我十分需要的。无论它是有意还是无意的,我觉得从计算机视觉的角度来看这是非常有价值的。
更重要的是,你既可以轻松地构建基于序列的网络(其中输入线性流经网络)又可以创建基于图形的网络(输入可以“跳过”某些层直接和后面对接)。这使得创建像GoogLeNet和SqueezeNet这样复杂的网络结构变得容易得多。
我认为Keras唯一的问题是它不支持多GPU环境中并行地训练网络。这可能会也可能不会成为你的大忌。
如果我想尽快地训练网络,那么我可能会使用mxnet。但是如果我需要调整超参数,我就会用Keras设置四个独立的实验(分别在我的Titan X GPUs上运行)并评估结果。
mxnet
我第二喜欢的深度学习Python库无疑就是mxnet(重点也是训练图像分类网络)。虽然在mxnet中站立一个网络可能需要较多的代码,但它会提供给你惊人数量的语言绑定(C ++、Python、R、JavaScript等)。
Mxnet库真正出色的是分布式计算,它支持在多个CPU / GPU机训练你的网络,甚至可以在AWS、Azure以及YARN集群。
它确实需要更多的代码来设立一个实验并在mxnet上运行(与Keras相比),但如果你需要跨多个GPU或系统分配训练,我推荐mxnet。
sklearn-theano
有时候你并不需要终端到终端的培养一个卷积神经网络。相反,你需要把CNN看作一个特征提取器。当你没有足够的数据来从头培养一个完整的CNN时它就会变得特别有用。仅仅需要把你的输入图像放入流行的预先训练架构,如OverFeat、AlexNet、VGGNet或GoogLeNet,然后从FC层提取特征(或任何您要使用的层)。
总之,这就是sklearn-theano的功能所在。你不能用它从头到尾的训练一个模型,但它的神奇之处就是可以把网络作为特征提取器。当需要评估一个特定的问题是否适合使用深度学习来解决时,我倾向于使用这个库作为我的第一手判断。
nolearn
我在PyImageSearch博客上用过几次nolearn,主要是在我的MacBook Pro上进行一些初步的GPU实验和在Amazon EC2 GPU实例中进行深度学习。
Keras把 Theano和TensorFlow包装成了更具人性化的API,而nolearn也为Lasagne做了相同的事。此外,nolearn中所有的代码都是与scikit-learn兼容的,这对我来说绝对是个超级的福利。
我个人不使用nolearn做卷积神经网络(CNNs),但你当然也可以用(我更喜欢用Keras和mxnet来做CNNs)。我主要用nolearn来制作Deep Belief Networks (DBNs)。
DIGITS
DIGITS并不是一个真正的深度学习库(虽然它是用Python写的)。DIGITS(深度学习GPU培训系统)实际上是用于培训Caffe深度学习模式的web应用程序(虽然我认为你可以破解源代码然后使用Caffe以外其他的后端进行工作,但这听起来就像一场噩梦)。
如果你曾经用过Caffe,那么你就会知道通过它的终端来定义.prototxt文件、生成图像数据、运行网络并监管你的网络训练是相当繁琐的。 DIGITS旨在通过让你在浏览器中执行这些任务来解决这个问题。
此外,DIGITS的用户界面非常出色,它可以为你提供有价值的统计数据和图表作为你的模型训练。另外,你可以通过各种输入轻松地可视化网络中的激活层。最后,如果您想测试一个特定的图像,您可以把图片上传到你的DIGITS服务器或进入图片的URL,然后你的Caffe模型将会自动分类图像并把结果显示在浏览器中。干净利落!
Blocks
说实话,虽然我一直想尝试,但截至目前我的确从来没用过Blocks(这也是我把它包括在这个列表里的原因)。就像许多个在这个列表中的其他库一样,Blocks建立在Theano之上,呈现出一个用户友好型的API。
deepy
如果让你猜deepy是围绕哪个库建立的,你会猜什么?
没错,就是Theano。
我记得在前一段时间用过deepy(做了初始提交),但在接下里的大概6-8个月我都没有碰它了。我打算在接下来的博客文章里再尝试一下。
pylearn2
虽然我从没有主动地使用pylearn2,但由于历史原因,我觉得很有必要把它包括在这个列表里。 Pylearn2不仅仅是一般的机器学习库(地位类似于scikit-learn),也包含了深度学习算法的实现。
对于pylearn2我最大的担忧就是(在撰写本文时),它没有一个活跃的开发者。正因为如此,相比于像Keras和mxnet这样的有积极维护的库,推荐pylearn2我还有些犹豫。
Deeplearning4j
这本应是一个基于Python的列表,但我想我会把Deeplearning4j包括在这里,主要是出于对他们所做事迹的无比崇敬——Deeplearning4j为JVM建立了一个开源的、分布式的深度学习库。
如果您在企业工作,你可能会有一个塞满了用过的Hadoop和MapRece服务器的储存器。也许这些你还在用,也许早就不用了。
你怎样才能把这些相同的服务器应用到深度学习里?
事实证明是可以的——你只需要Deeplearning4j。
总计
以上就是本文关于13个最常用的Python深度学习库介绍的全部内容
‘叁’ DB、DBS、DBMS之间有什么关系
DB、DBS、DBMS三者的关系是DBS(数据库系统)包括DB(数据库)和DBMS(数据库管理系统)。数据库系统是一个通称,包括数据库、数据库管理系统、数据库管理人员等的统称,是最大的范畴。
1、DBMS和DB的关系:DBMS数据库管理系统(databasemanagementsystem)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库(DB)。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库(DB)中的数据。
2、DBS和DB的关系:数据库系统DBS(Data Base System,简称DBS)是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。它通常由软件、数据库(DB)和数据管理员组成。
(3)dbns提供哪种语言定义数据库扩展阅读
数据库及数据库系统组成成分:
1、数据库,即存储在磁带、磁盘、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。
2、数据库管理系统(DBMS)。它是一组能完成描述、管理、维护数据库的程序系统。它按照一种公用的和可控制的方法完成插入新数据、修改和检索原有数据的操作。
3、数据库管理员(DBA),有重新组织数据的能力,能改变数据的存储结构或数据存储位置。
4、用户和应用程序,具有可修改性和可扩充性。
‘肆’ 2009年4月19日四川计算机2级C语言机试题目或者答案
2007年4月全国计算机等级考试二级笔试试卷
C语言程序设计
(考试时间120分钟,满分100分)
一、选择题((1)—(10)每小题2分,(11)—(50)每题1分,共60分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)下列叙述中正确的是(B)
A)算法的效率只与问题的规模有关,而与数据的存储结构无关
B)算法的时间复杂度是指执行算法所需要的计算工作量
C)数据的逻辑结构与存储结构是一一对应的
D)算法的时间复杂度与空间复杂度一定相关
(2)在结构化程序设计中,模块划分的原则是(D)
A)各模块应包括尽量多的功能
B)各模块的规模应尽量大
C)各模块之间的联系应尽量紧密
D)模块内具有高内聚度、模块间具有低耦合度
(3)下列叙述中正确的是(A)
A)软件测试的主要目的是发现程序中的错误
B)软件测试的主要目的是确定程序中错误的位置
C)为了提高软件测试的效率,最好由程序编制者自己来完成软件测试的工作
D)软件测试是证明软件没有错误
(4)下面选项中不属于面向对象程序设计特征的是(C)
A)继承性
B)多态性
C)类比性
D)封装性
(5)下列对队列的叙述正确的是(D)
A)队列属于非线性表
B)队列按“先进后出”原则组织数据
C)队列在队尾删除数据
D)队列按“先进先出”原则组织数据
(6)对下列二叉树
A
B C
D E F X
Y Z
进行前序遍历的结果为(C)
A) DYBEAFCZX
B) YDEBFZXCA
C) ABDYECFXZ
D) ABCDEFXYZ
(7) 某二叉树中有n个度为2的结点,则该二叉树中的叶子结点数为(A)
A) n+1
B) n-1
C) 2n
D) n/2
(8) 在下列关系运算中,不改变关系表中的属性个数但能减少元组个数的是(B)
A) 并
B)交
C)投影
D)笛卡儿乘积
(9)在E-R图中,用来表示实体之间联系的图形是(C)
A) 矩形
B)椭圆形
C)菱形
D)平行四边形
(10)下列叙述中错误的是(A)
A) 在数据库系统中,数据的物理结构必须与逻辑结构一致
B) 数据库技术的根本目标是要解决数据的共享问题
C) 数据库设计是指在已有数据库管理系统的基础上建立数据库
D)数据库系统需要操作系统的支持
(11)算法中,对需要执行的每一步操作,必须给出清楚、严格的规定,这属于算法的(C)
A)正当性
B)可行性
C)确定性
D)有穷性
(12)下列叙述中错误的是(D)
A)计算机不能直接执行用C语言编写的源程序
B)C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件
C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件
D)后缀为.obj和.exe的二进制文件都可以直接运行
(13)按照C语言规定的用户标识符命名规则,不能出现在标识符中的是(B)
A)大写字母
B)连接符
C)数字字符
D)下划线
(14)以下叙述中错误的是(C)
A)C语言是一种结构化程序设计语言
B)结构化程序有顺序、分支、循环三种基本结构组成
C)使用三种基本结构构成的程序只能解决简单问题
D)结构化程序设计提倡模块化的设计方法
(15)对于一个正常运行的C程序,以下叙述中正确的是(A)
A)程序的执行总是从main函数开始,在main函数结束
B)程序的执行总是从程序的第一个函数开始,在main函数结束
C)程序的执行总是从main函数开始,在程序的最后一个函数中结束
D)程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束
(16)设变量均已正确定义,若要通过scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)(D)
A)10□X□20□Y〈回车〉
B)10□X20□Y〈回车〉
C)10□X〈回车〉
D)10X〈回车〉
20□Y〈回车〉 20Y〈回车〉
(17)若有代数式(其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是(C)
A)sqrt(abs(n^x+e^x))
B) sqrt(fabs(pow(n,x)+pow(x,e)))
C)sqrt(fabs(pow(n,x)+exp(x)))
D) sqrt(fabs(pow(x,n)+exp(x)))
(18)设有定义:int k=0;,以下选项的四个表达式中与其他三个表达式的值不相同的是(A)
A)k++
B)k+=1
C)++k
D)k+1
(19)有以下程序,其中%u表示按无符号整数输出(B)
main()
{unsigned int x=0xFFFF; /* x的初值为十六进制数 */
printf(“%u\n”,x);
}
程序运行后的输出结果是
A)-1
B)65535
C)32767
D)0xFFFF
(20)设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是(C)
A)if(x++);
B)if(x>y&&y!=0);
C)if(x>y) x- -
D)if(y<0) {;}
else y++; else x++;
(21)以下选项中,当x为大于1的奇数时,值为0的表达式(D)
A)x%2==1
B)x/2
C)x%2!=0
D)x%2==0
(22)以下叙述中正确的是(C)
A)break语句只能用于switch语句体中
B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环
C)break 语句只能用在循环体内和switch语句体内
D)在循环体内使用break语句和continue语句的作用相同
(23)有以下程序(A)
main()
{int k=5,n=0;
do
{switch(k)
{case1: case3:n+=1; break;
default;n=0;k--;
case2: case4:n+=2;k--;break;
}
printf(“%d”,n);
}while(k>0&&n<5);
}
程序运行后的输出结果是
A)235
B)0235
C)02356
D)2356
(24)有以下程序
mian()
{int i,j;
for(i=1;i<4;i++)
{for(j=i;j<4;j++) printf(“%d*%d=%d “,i,j,i*j);
printf(“\n”);
}
}
程序运行后的输出结果是(B)
A) 1*1=1 1*2=2 1*3=3 B) 1*1=1 1*2=2 1*3=3
2*1=2 2*2=4 2*2=4 2*3=6
3*1=3 3*3=9
C) 1*1=1 D) 1*1=1
1*2=2 2*2=4 2*1=2 2*2=4
1*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=9
(25)以下合法的字符型常量是(A)
A)”\x13”
B)”\018”
C)”65”
D)”\n”
(26)在C语言中,函数返回值的类型最终取决于(A)
A)函数定义时在函数首部所说明的函数类型
B)return语句中表达式值的类型
C)调用函数时主函数所传递的实参类型
D)函数定义时形参的类型
(27)已知大写字母A的ASCII码是65,小写字母aASCII码是97,以下不能将变量c中大写字母转换为对应小写字母的语句是(D)
A)c=(c-A)&+’a’
B)c=c+32
C)c=c-‘A’+’a’
D)c=(‘A’+c)&-‘a’
(28)有以下函数
int fun(char *s)
{char *t=s;
while(*t++);
return(t-s);
}
该函数的功能是(B)
A)比较两个字符的大小
B)计算s所指字符串占用内存字节的个数
C)计算s所指字符串的长度
D)将s所指字符串复制到字符串t中
(29)设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是(D)
A)float *p=1024;
B)int *p=(float x);
C)float p=&x;
D)float *P=&x;
(30)有以下程序
#include
main()
{int n,*p=NULL;
*p=&n;
printf(“Input n:”); scanf(“%d”,&p); printf(“output n:”); printf(“%d\n”,p);
}
该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是(A)
A)int n,*p=NULL;
B)*p=&n;
C)scanf(“%d”,&p)
D)printf(“%d\n”,p);
(31)以下程序中函数f的功能是:当flag为1时,进行有由小到大排序;当flag为0时,进行由大到小排序。
void f(int b[],int n,int flag)
{int i,j,t;
for(i=0;i
for (j=i+1;j
if(flag?b[i]>b[j]:b[i]
}
main()
{int a[10]={5,4,3,2,1,6,7,8,9,10},i;
f(&a[2],5,0); f(a,5,1);
for(i=0;i<10;i++) printf(“%d,”a[i]);
}
程序运行后的输出结果是(B)
A)1,2,3,4,5,6,7,8,9,10,
B)3,4,5,6,7,2,1,8,9,10,
C)5,4,3,2,1,6,7,8,9,10,
D)10,9,8,7,6,5,4,3,2,1,
(32)有以下程序
void f(int b[])
{int i;
for(i=2;i<6;i++) b[i]*=2;
}
main()
{int a[10]={1,2,3,4,5,6,7,8,9,10},i;
f(a);
for(i=0;i<10;i++) printf(“%d,”,a[i]);
}
程序运行后的输出结果是(B)
A)1,2,3,4,5,6,7,8,9,10,
B)1,2,6,8,10,12,7,8,9,10
C)1,2,3,4,10,12,14,16,9,10,
D)1,2,6,8,10,12,14,16,9,10,
(33)有以下程序
typedef struct{int b,p;}A;
void f(A c) /*注意:c是结构变量名 */
{int j;
c.b+=1; c.p+=2;
}
main()
{int i;
A a={1,2};
f(a);
printf(“%d,%d\n”,a.b,a.p);
}
程序运行后的输出结果是(D)
A)2,3
B)2,4
C)1,4
D)1,2
(34)有以下程序
main()
{int a[4][4]={{1,4,3,2,},{8,6,5,7,},{3,7,2,5,},{4,8,6,1,}},i,j,k,t;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
for(k=j+1;k<4;k++)
if(a[j][i]>a[k][i]){t=a[j][i];a[j][i]=a[k][i];a[k][i]=t;}/*按列排序*/
for(i=0;i<4;i++)printf(“%d,”,a[i][j]);
}
程序运行后的输出结果是(A)
A)1,6,5,7,
B)8,7,3,1,
C)4,7,5,2,
D)1,6,2,1,
(35) 有以下程序
main()
{int a[4][4]={{1,4,3,2,},{8,6,5,7,},{3,7,2,5,},{4,8,6,1,}},i,k,t;
for(i=0;i<3;i++)
for(k=i+i;k<4;k++) if(a[i][i]
for(i=0;i<4;i++)printf(“%d,”,a[0][i]);
}
程序运行后的输出结果是(B)
A)6,2,1,1,
B)6,4,3,2,
C)1,1,2,6,
D)2,3,4,6,
(36) 有以下程序
void f(int *q)
{int i=0;
for( ; i<5;i++)(*q)++;
}
main()
{int a[5]={1,2,3,4,5},i;
f(a);
for(i=0;i<5;i++)printf(“%d,”,a[i]);
}
程序运行后的输出结果是(B)
A)2,2,3,4,5,
B)6,2,3,4,5,
C)1,2,3,4,5,
D) 2,3,4,5,6,
(37) 有以下程序
#include
main()
{char p[20]={‘a’,’b’,’c’,’d’},q[]=”abc”, r[]=”abcde”;
strcpy(p+strlen(q),r); strcat(p,q);
printf(“%d%d\n”,sizeof(p),strlen(p));
}
程序运行后的输出结果是(C)
A)20 9
B)9 9
C)20 11
D)11 11
(38) 有以下程序
#include
main()
{char p[20]={‘a’,’b’,’c’,’d’},q[]=”abc”, r[]=”abcde”
strcat(p,r); Strcpy(p+strlen(q),q);
Printf(“%d \n”,sizeof(p));
}
程序运行后的输出结果是(B)
A)9
B)6
C)11
D)7
(39) 有以下程序
#include
main()
void f(char p[][10], int n ) /* 字符串从小到大排序 */
{ char t[10]; int i,j;
for(i=0;i
for(j=i+1;j
if(strcmp(p[i],p[j])>0) {strcpy(t,p[i]); strcpy(p[i],p[j]); strcpy(p[i],t); }
}
main()
{char p[5][10]={“abc”,”aabdfg”,”abbd”,”dcdbe”,”cd”};
f(p,5);
printf(“%d\n”,strlen(p[0]));
}
程序运行后的输出结果是(C)
A) 2
B) 4
C) 6
D) 3
(40) 有以下程序
void f(int n, int *r)
{int r1=0;
if(n%3==0) r1=n/3;
else if(n%5==0) r1=n/5;
else f(--n,&r1);
*r=r1;
}
main()
{int m=7,r;
f(m,&r); printf(“%d\n,r”);
}
程序运行后的输出结果是(A)
A) 2
B) 1
C)3
D) 0
(41)有以下程序
main(int argc,char *argv[])
{int n=0,i;
for(i=1;i n=n*10+*argv[i]-‘0’;
printf(“%d\n”,n);
}
编译连接后生成可执行文件tt.exe,若运行时输入以下命令行
tt 12 345 678
程序运行后的输出结果是(D)
A) 12
B) 12345
C)12345678
D) 136
(42) 有以下程序
int a=4;
int f(int n)
{int t=0; static int a=5;
if(n%2) {int a=6; t+=a++;}
else {int a=7 ;t+=a++;}
return t+a++;
}
main()
{int s=a,i=0;
for(;i〈2;i++) s+=f(i);
printf (“%d\n”,s);
}
程序运行后的输出结果是(B)
A)24
B)28
C)32
D)36
(43) 有一个名为init.txt的文件,内容如下:
#define HDY(A,B) A/B
# define PRINT(Y) Printf(“y=%d\n.,Y)
有以下程序
#include “init.txt”
main()
{int a=1,b=2,c=3,d=4,k;
K=HDY(a+c,b+d);
PRINT(K);
}
下面针对该程序的叙述正确的是(D)
A)编译有错
B)运行出错
C)运行结果为 y=0
D) 运行结果为 y=6
(44) 有以下程序
main()
{char ch[]=“uvwxyz”,*pc;
Pc=ch; printf(“%c\n”,*(pc+5));
}
程序运行后的输出结果是(A)
A)z
B)0
C)元素ch[5]的地址
D)字符y的地址
(45) 有以下程序
struct S {int n; int a[20];};
void f(struct S *P)
{int i,j,t;
for(i=0;in-1;i++)
for(j=i+1;jn;j++)
if(p->a[i]>p->a[j]) { t=p->a[i]; p->a[i]=p->a[j]; p->a[j]=t; }
}
main()
{int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
f(&s);
for(i=0;i printf(“%d”,s.a[i]);
}
程序运行后的输出结果是(A)
A)1,2,3,4,5,6,7,8,9,10,
B)10,9,8,7,6,5,4,3,2,1,
C)2,3,1,6,8,7,5,4,10,9,
D)10,9,8,7,6,1,2,3,4,5,
(46) 有以下程序
struct S{ int n; int a[20]; };
void f(int *a,int n)
{int i;
for(i=0;i a[i]+=i;
}
main()
{int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
f(s.a, s.n);
for(i=0;i printf(“%d”,s.a[i]);
}
程序运行后的输出结果是(A)
A)2,4,3,9,12,12,11,11,18,9,
B)3,4,2,7,9,8,6,5,11,10,
C)2,3,1,6,8,7,5,4,10,9,
D)1,2,3,6,8,7,5,4,10,9,
(47) 有以下程序段
typedef struct node { int data; struct node *next; } *NODE;
NODE p;
以下叙述正确的是(C)
A)p是指向struct node结构变量的指针的指针
B)NODE p;语句出错
C)p是指向struct node结构变量的指针
D)p是struct node结构变量
(48)有以下程序
main()
{unsigned char a=2,b=4,c=5,d;
d=a|b; d&=c; printf(“%d\n”,d); }
程序运行后的输出结果是(B)
A)3
B)4
C)5
D)6
(49)有以下程序
#include
main()
{FILE *fp; int k,n,a[6]={1,2,3,4,5,6};
fp=fopen(“d2.dat”,”w”);
fprintf(fp,”%d%d\n”,a[0],a[1],a[2]); fprintf(fp, “%d%d%d \n”,a[3],a[4],a[5]);
fclose(fp);
fp=fopen(“d2.dat”,”r”);
fscanf(fp, “%d%d”,&k,&n); printf(“%d%d\n”,k,n);
fclose(fp);
}
程序运行后的输出结果是(D)
A)1 2
B)1 4
C)123 4
D) 123 456
(50)有以下程序
#include
main ()
{FILE *fp; int i,a[6]={1,2,3,4,5,6k};
fp=fopen(“d3.dat”,”w+b”);
fwrite(a,sizeof(int),6,fp);
fseek(fp,sizeof(int)*3,SEEK_SET);/*该语句使读文件的位置指针从文件头向后移动3个int型数据*/
fread(a,sizeof(int),3,fp); fclose(fp);
for(i=0;i<6;i++) printf(“%d,”,a[i]);
}
程序运行后的输出结果是(A)
A)4,5,6,4,5,6,
B)1,2,3,4,5,6,
C)4,5,6,1,2,3,
D)6,5,4,3,2,1,
二.填空题(每空2分,共40分)请将每一个空的正确答案写在答题卡[1]至[20]序号的横线上,答在试卷上不得分。注意:以命令关键字填空的必须写完整.
(1) 在深度为7的满二叉树中,度为2的结点个数为___63____。
(2) 软件测试分为白箱(盒)测试和黑箱(盒)测试,等价类划分法属于__黑箱(或黑盒) 测试。
(3) 在数据库系统中,实现各种数据管理功能的核心软件称为 __数据库管理系统__。
(4) 软件生命周期可分为多个阶段,一般分为定义阶段、开发阶段和维护阶段。编码和测试属于 开发_____阶段。
(5)在结构化分析使用的数据流图(DFD)中,利用数据字典 对其中的图形元素进行确切解释。
(6)执行以下程序后的输出结果是 a=14 。
main()
{int a=10;
a=(3*5,a+4); printf(“a=%d\n”,a);
}
(7) 当执行以下程序时,输入1234567890<回车>,则其中while循环体将执行 0 次。
#include
main()
{char ch;
While((ch=getchar())==’0’) printf(“#”);
}
(8) (8)以下程序的运行结果是 m=4 k=4 i=5 k=5 。
int k=0;
void fun(int m)
{ m+=k; k+=m; printf(“m=%d\n k=%d ”,m,k++);}
main()
{ int i=4;
fun(i++); printf(“i=%d k=%d\n”,i,k);
}
(9) (9)以下程序的运行结果是 #& 。
main()
{int a=2,b=7,c=5;
switch(a>0)
{case 1:switch(b<0)
{case 1:switch(“@”); break;
Case 2: printf(“!”); break;
}
case 0: switch(c==5)
{ case 0: printf(“*”); break;
case 1: printf(“#”); break;
case 2: printf(“$”); break;
}
default : printf(“&”);
}
printf(“\n”);
}
(10)以下程序的输出结果是 9
# include
main()
{ printf(“%d\n”,strlen(“IBM\n012\1\\”));
}
(11)已定义char ch=”$”;int i=1,j;执行j=!ch&&i++以后,i的值为1
(12)以下程序的输出结果是 5 4
# include
main()
{ char a[]={‘\1’,’\2’,’\3’,’\4’,’\0’};
printf(“%d %d\n”,sizeof(a),srelen(a));
}
(13)设有定义语句:int a[][3]={{0},{1},{2}};,则数组元素a[1][2]的值为 0
(14)以下程序的功能是:求出数组x中各相邻两个元素的和依次存放到a数组中,然后输出。请填空。
main()
{int x[10],a[9],I;
for (i=0;i<10;i++)
scanf(“%d”,&x[i]);
for( i=1 ;i<10;i++)
a[i-1]=x[i]+ x[i-1] ;
for(i=0;i<9;i++)
printf(“%d”,a[i]);
printf(“\n”);
(15) 以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕上,请填空:
main()
{int x,y,z,max,*px,*py,*pz,*pmax;
scanf(“%d%d%d”,&x,&y,&z);
px=&x;
py=&y;
pz=&z;
pmax=&max;
*pmax=*px(或*pmax=x) ;
if(*pmax<*py)*pmax=*py;
if(*pmax<*pz)*pmax=*pz;
printf(“max=%d\n”,max);
}
(16)以下程序的输出结果是 10
int fun(int*x,int n)
{if(n==0)
return x[0];
else return x[0]+fun(x+1,n-1);
}
main()
{int a[]={1,2,3,4,5,6,7};
printf(“%d\n”,fun(a,3));
}
(17)以下程序的输出结果是 35
# include
main()
{char *s1,*s2,m;
s1=s2=(char*)malloc(sizeof(char));
*s1=15;
*s2=20;
m=*s1+*s2;
printf(“%d\n”,m);
}
(18)设有说明
struct DATE{int year;int month; int day;};
请写出一条定义语句,该语句定义d为上述结构体变量,并同时为其成员year、month、day 依次赋初值2006、10、1: struct DATA d={2006,10,1};
(19) 设有定义:FILE *fw;,请将以下打开文件的语句补充完整,以便可以向文本文件readme.txt的最后续写内容。
fw=fopen(“readme.txt”, "a" )
2007年4月全国计算机等级考试二级C语言笔试试题答案
一、选择题:
1-5 24134
6-10 31321
11-15 34231
16-20 43113
21-25 43421
26-30 14241
31-35 22412
36-40 23232
41-45 42411
46-50 13241
二、填空题:
1. 63
2,墨盒
3.DBNS
4,开发
5,数据 字典
6,a-14
7,0
8,无答案
9,# 与号
10,9
11,1
12,5_4
13,13 0
14,i=1
15,X[i-1]
16,无答案
17,10
18,40
19,无答案
20,"20a"
参考资料:http://www.examda.com/ncre2/C/zhenti/20070902/160001753.html
‘伍’ 谁有四川省计算机C语言二级考试的真题或者模拟题多给我几套最好了,要有答案的。要多少分您说,只要我有
2007年4月全国计算机等级考试二级笔试试卷
C语言程序设计
(考试时间120分钟,满分100分)
一、选择题((1)—(10)每小题2分,(11)—(50)每题1分,共60分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)下列叙述中正确的是(B)
A)算法的效率只与问题的规模有关,而与数据的存储结构无关
B)算法的时间复杂度是指执行算法所需要的计算工作量
C)数据的逻辑结构与存储结构是一一对应的
D)算法的时间复杂度与空间复杂度一定相关
(2)在结构化程序设计中,模块划分的原则是(D)
A)各模块应包括尽量多的功能
B)各模块的规模应尽量大
C)各模块之间的联系应尽量紧密
D)模块内具有高内聚度、模块间具有低耦合度
(3)下列叙述中正确的是(A)
A)软件测试的主要目的是发现程序中的错误
B)软件测试的主要目的是确定程序中错误的位置
C)为了提高软件测试的效率,最好由程序编制者自己来完成软件测试的工作
D)软件测试是证明软件没有错误
(4)下面选项中不属于面向对象程序设计特征的是(C)
A)继承性
B)多态性
C)类比性
D)封装性
(5)下列对队列的叙述正确的是(D)
A)队列属于非线性表
B)队列按“先进后出”原则组织数据
C)队列在队尾删除数据
D)队列按“先进先出”原则组织数据
(6)对下列二叉树
A
B C
D E F X
Y Z
进行前序遍历的结果为(C)
A) DYBEAFCZX
B) YDEBFZXCA
C) ABDYECFXZ
D) ABCDEFXYZ
(7) 某二叉树中有n个度为2的结点,则该二叉树中的叶子结点数为(A)
A) n+1
B) n-1
C) 2n
D) n/2
(8) 在下列关系运算中,不改变关系表中的属性个数但能减少元组个数的是(B)
A) 并
B)交
C)投影
D)笛卡儿乘积
(9)在E-R图中,用来表示实体之间联系的图形是(C)
A) 矩形
B)椭圆形
C)菱形
D)平行四边形
(10)下列叙述中错误的是(A)
A) 在数据库系统中,数据的物理结构必须与逻辑结构一致
B) 数据库技术的根本目标是要解决数据的共享问题
C) 数据库设计是指在已有数据库管理系统的基础上建立数据库
D)数据库系统需要操作系统的支持
(11)算法中,对需要执行的每一步操作,必须给出清楚、严格的规定,这属于算法的(C)
A)正当性
B)可行性
C)确定性
D)有穷性
(12)下列叙述中错误的是(D)
A)计算机不能直接执行用C语言编写的源程序
B)C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件
C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件
D)后缀为.obj和.exe的二进制文件都可以直接运行
(13)按照C语言规定的用户标识符命名规则,不能出现在标识符中的是(B)
A)大写字母
B)连接符
C)数字字符
D)下划线
(14)以下叙述中错误的是(C)
A)C语言是一种结构化程序设计语言
B)结构化程序有顺序、分支、循环三种基本结构组成
C)使用三种基本结构构成的程序只能解决简单问题
D)结构化程序设计提倡模块化的设计方法
(15)对于一个正常运行的C程序,以下叙述中正确的是(A)
A)程序的执行总是从main函数开始,在main函数结束
B)程序的执行总是从程序的第一个函数开始,在main函数结束
C)程序的执行总是从main函数开始,在程序的最后一个函数中结束
D)程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束
(16)设变量均已正确定义,若要通过scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)(D)
A)10□X□20□Y〈回车〉
B)10□X20□Y〈回车〉
C)10□X〈回车〉
D)10X〈回车〉
20□Y〈回车〉 20Y〈回车〉
(17)若有代数式(其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是(C)
A)sqrt(abs(n^x+e^x))
B) sqrt(fabs(pow(n,x)+pow(x,e)))
C)sqrt(fabs(pow(n,x)+exp(x)))
D) sqrt(fabs(pow(x,n)+exp(x)))
(18)设有定义:int k=0;,以下选项的四个表达式中与其他三个表达式的值不相同的是(A)
A)k++
B)k+=1
C)++k
D)k+1
(19)有以下程序,其中%u表示按无符号整数输出(B)
main()
{unsigned int x=0xFFFF; /* x的初值为十六进制数 */
printf(“%u\n”,x);
}
程序运行后的输出结果是
A)-1
B)65535
C)32767
D)0xFFFF
(20)设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是(C)
A)if(x++);
B)if(x>y&&y!=0);
C)if(x>y) x- -
D)if(y<0) {;}
else y++; else x++;
(21)以下选项中,当x为大于1的奇数时,值为0的表达式(D)
A)x%2==1
B)x/2
C)x%2!=0
D)x%2==0
(22)以下叙述中正确的是(C)
A)break语句只能用于switch语句体中
B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环
C)break 语句只能用在循环体内和switch语句体内
D)在循环体内使用break语句和continue语句的作用相同
(23)有以下程序(A)
main()
{int k=5,n=0;
do
{switch(k)
{case1: case3:n+=1; break;
default;n=0;k--;
case2: case4:n+=2;k--;break;
}
printf(“%d”,n);
}while(k>0&&n<5);
}
程序运行后的输出结果是
A)235
B)0235
C)02356
D)2356
(24)有以下程序
mian()
{int i,j;
for(i=1;i<4;i++)
{for(j=i;j<4;j++) printf(“%d*%d=%d “,i,j,i*j);
printf(“\n”);
}
}
程序运行后的输出结果是(B)
A) 1*1=1 1*2=2 1*3=3 B) 1*1=1 1*2=2 1*3=3
2*1=2 2*2=4 2*2=4 2*3=6
3*1=3 3*3=9
C) 1*1=1 D) 1*1=1
1*2=2 2*2=4 2*1=2 2*2=4
1*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=9
(25)以下合法的字符型常量是(A)
A)”\x13”
B)”\018”
C)”65”
D)”\n”
(26)在C语言中,函数返回值的类型最终取决于(A)
A)函数定义时在函数首部所说明的函数类型
B)return语句中表达式值的类型
C)调用函数时主函数所传递的实参类型
D)函数定义时形参的类型
(27)已知大写字母A的ASCII码是65,小写字母aASCII码是97,以下不能将变量c中大写字母转换为对应小写字母的语句是(D)
A)c=(c-A)&+’a’
B)c=c+32
C)c=c-‘A’+’a’
D)c=(‘A’+c)&-‘a’
(28)有以下函数
int fun(char *s)
{char *t=s;
while(*t++);
return(t-s);
}
该函数的功能是(B)
A)比较两个字符的大小
B)计算s所指字符串占用内存字节的个数
C)计算s所指字符串的长度
D)将s所指字符串复制到字符串t中
(29)设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是(D)
A)float *p=1024;
B)int *p=(float x);
C)float p=&x;
D)float *P=&x;
(30)有以下程序
#include
main()
{int n,*p=NULL;
*p=&n;
printf(“Input n:”); scanf(“%d”,&p); printf(“output n:”); printf(“%d\n”,p);
}
该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是(A)
A)int n,*p=NULL;
B)*p=&n;
C)scanf(“%d”,&p)
D)printf(“%d\n”,p);
(31)以下程序中函数f的功能是:当flag为1时,进行有由小到大排序;当flag为0时,进行由大到小排序。
void f(int b[],int n,int flag)
{int i,j,t;
for(i=0;i
for (j=i+1;j
if(flag?b[i]>b[j]:b[i]
}
main()
{int a[10]={5,4,3,2,1,6,7,8,9,10},i;
f(&a[2],5,0); f(a,5,1);
for(i=0;i<10;i++) printf(“%d,”a[i]);
}
程序运行后的输出结果是(B)
A)1,2,3,4,5,6,7,8,9,10,
B)3,4,5,6,7,2,1,8,9,10,
C)5,4,3,2,1,6,7,8,9,10,
D)10,9,8,7,6,5,4,3,2,1,
(32)有以下程序
void f(int b[])
{int i;
for(i=2;i<6;i++) b[i]*=2;
}
main()
{int a[10]={1,2,3,4,5,6,7,8,9,10},i;
f(a);
for(i=0;i<10;i++) printf(“%d,”,a[i]);
}
程序运行后的输出结果是(B)
A)1,2,3,4,5,6,7,8,9,10,
B)1,2,6,8,10,12,7,8,9,10
C)1,2,3,4,10,12,14,16,9,10,
D)1,2,6,8,10,12,14,16,9,10,
(33)有以下程序
typedef struct{int b,p;}A;
void f(A c) /*注意:c是结构变量名 */
{int j;
c.b+=1; c.p+=2;
}
main()
{int i;
A a={1,2};
f(a);
printf(“%d,%d\n”,a.b,a.p);
}
程序运行后的输出结果是(D)
A)2,3
B)2,4
C)1,4
D)1,2
(34)有以下程序
main()
{int a[4][4]={{1,4,3,2,},{8,6,5,7,},{3,7,2,5,},{4,8,6,1,}},i,j,k,t;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
for(k=j+1;k<4;k++)
if(a[j][i]>a[k][i]){t=a[j][i];a[j][i]=a[k][i];a[k][i]=t;}/*按列排序*/
for(i=0;i<4;i++)printf(“%d,”,a[i][j]);
}
程序运行后的输出结果是(A)
A)1,6,5,7,
B)8,7,3,1,
C)4,7,5,2,
D)1,6,2,1,
(35) 有以下程序
main()
{int a[4][4]={{1,4,3,2,},{8,6,5,7,},{3,7,2,5,},{4,8,6,1,}},i,k,t;
for(i=0;i<3;i++)
for(k=i+i;k<4;k++) if(a[i][i]
for(i=0;i<4;i++)printf(“%d,”,a[0][i]);
}
程序运行后的输出结果是(B)
A)6,2,1,1,
B)6,4,3,2,
C)1,1,2,6,
D)2,3,4,6,
(36) 有以下程序
void f(int *q)
{int i=0;
for( ; i<5;i++)(*q)++;
}
main()
{int a[5]={1,2,3,4,5},i;
f(a);
for(i=0;i<5;i++)printf(“%d,”,a[i]);
}
程序运行后的输出结果是(B)
A)2,2,3,4,5,
B)6,2,3,4,5,
C)1,2,3,4,5,
D) 2,3,4,5,6,
(37) 有以下程序
#include
main()
{char p[20]={‘a’,’b’,’c’,’d’},q[]=”abc”, r[]=”abcde”;
strcpy(p+strlen(q),r); strcat(p,q);
printf(“%d%d\n”,sizeof(p),strlen(p));
}
程序运行后的输出结果是(C)
A)20 9
B)9 9
C)20 11
D)11 11
(38) 有以下程序
#include
main()
{char p[20]={‘a’,’b’,’c’,’d’},q[]=”abc”, r[]=”abcde”
strcat(p,r); Strcpy(p+strlen(q),q);
Printf(“%d \n”,sizeof(p));
}
程序运行后的输出结果是(B)
A)9
B)6
C)11
D)7
(39) 有以下程序
#include
main()
void f(char p[][10], int n ) /* 字符串从小到大排序 */
{ char t[10]; int i,j;
for(i=0;i
for(j=i+1;j
if(strcmp(p[i],p[j])>0) {strcpy(t,p[i]); strcpy(p[i],p[j]); strcpy(p[i],t); }
}
main()
{char p[5][10]={“abc”,”aabdfg”,”abbd”,”dcdbe”,”cd”};
f(p,5);
printf(“%d\n”,strlen(p[0]));
}
程序运行后的输出结果是(C)
A) 2
B) 4
C) 6
D) 3
(40) 有以下程序
void f(int n, int *r)
{int r1=0;
if(n%3==0) r1=n/3;
else if(n%5==0) r1=n/5;
else f(--n,&r1);
*r=r1;
}
main()
{int m=7,r;
f(m,&r); printf(“%d\n,r”);
}
程序运行后的输出结果是(A)
A) 2
B) 1
C)3
D) 0
(41)有以下程序
main(int argc,char *argv[])
{int n=0,i;
for(i=1;i n=n*10+*argv[i]-‘0’;
printf(“%d\n”,n);
}
编译连接后生成可执行文件tt.exe,若运行时输入以下命令行
tt 12 345 678
程序运行后的输出结果是(D)
A) 12
B) 12345
C)12345678
D) 136
(42) 有以下程序
int a=4;
int f(int n)
{int t=0; static int a=5;
if(n%2) {int a=6; t+=a++;}
else {int a=7 ;t+=a++;}
return t+a++;
}
main()
{int s=a,i=0;
for(;i〈2;i++) s+=f(i);
printf (“%d\n”,s);
}
程序运行后的输出结果是(B)
A)24
B)28
C)32
D)36
(43) 有一个名为init.txt的文件,内容如下:
#define HDY(A,B) A/B
# define PRINT(Y) Printf(“y=%d\n.,Y)
有以下程序
#include “init.txt”
main()
{int a=1,b=2,c=3,d=4,k;
K=HDY(a+c,b+d);
PRINT(K);
}
下面针对该程序的叙述正确的是(D)
A)编译有错
B)运行出错
C)运行结果为 y=0
D) 运行结果为 y=6
(44) 有以下程序
main()
{char ch[]=“uvwxyz”,*pc;
Pc=ch; printf(“%c\n”,*(pc+5));
}
程序运行后的输出结果是(A)
A)z
B)0
C)元素ch[5]的地址
D)字符y的地址
(45) 有以下程序
struct S {int n; int a[20];};
void f(struct S *P)
{int i,j,t;
for(i=0;in-1;i++)
for(j=i+1;jn;j++)
if(p->a[i]>p->a[j]) { t=p->a[i]; p->a[i]=p->a[j]; p->a[j]=t; }
}
main()
{int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
f(&s);
for(i=0;i printf(“%d”,s.a[i]);
}
程序运行后的输出结果是(A)
A)1,2,3,4,5,6,7,8,9,10,
B)10,9,8,7,6,5,4,3,2,1,
C)2,3,1,6,8,7,5,4,10,9,
D)10,9,8,7,6,1,2,3,4,5,
(46) 有以下程序
struct S{ int n; int a[20]; };
void f(int *a,int n)
{int i;
for(i=0;i a[i]+=i;
}
main()
{int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
f(s.a, s.n);
for(i=0;i printf(“%d”,s.a[i]);
}
程序运行后的输出结果是(A)
A)2,4,3,9,12,12,11,11,18,9,
B)3,4,2,7,9,8,6,5,11,10,
C)2,3,1,6,8,7,5,4,10,9,
D)1,2,3,6,8,7,5,4,10,9,
(47) 有以下程序段
typedef struct node { int data; struct node *next; } *NODE;
NODE p;
以下叙述正确的是(C)
A)p是指向struct node结构变量的指针的指针
B)NODE p;语句出错
C)p是指向struct node结构变量的指针
D)p是struct node结构变量
(48)有以下程序
main()
{unsigned char a=2,b=4,c=5,d;
d=a|b; d&=c; printf(“%d\n”,d); }
程序运行后的输出结果是(B)
A)3
B)4
C)5
D)6
(49)有以下程序
#include
main()
{FILE *fp; int k,n,a[6]={1,2,3,4,5,6};
fp=fopen(“d2.dat”,”w”);
fprintf(fp,”%d%d\n”,a[0],a[1],a[2]); fprintf(fp, “%d%d%d \n”,a[3],a[4],a[5]);
fclose(fp);
fp=fopen(“d2.dat”,”r”);
fscanf(fp, “%d%d”,&k,&n); printf(“%d%d\n”,k,n);
fclose(fp);
}
程序运行后的输出结果是(D)
A)1 2
B)1 4
C)123 4
D) 123 456
(50)有以下程序
#include
main ()
{FILE *fp; int i,a[6]={1,2,3,4,5,6k};
fp=fopen(“d3.dat”,”w+b”);
fwrite(a,sizeof(int),6,fp);
fseek(fp,sizeof(int)*3,SEEK_SET);/*该语句使读文件的位置指针从文件头向后移动3个int型数据*/
fread(a,sizeof(int),3,fp); fclose(fp);
for(i=0;i<6;i++) printf(“%d,”,a[i]);
}
程序运行后的输出结果是(A)
A)4,5,6,4,5,6,
B)1,2,3,4,5,6,
C)4,5,6,1,2,3,
D)6,5,4,3,2,1,
二.填空题(每空2分,共40分)请将每一个空的正确答案写在答题卡[1]至[20]序号的横线上,答在试卷上不得分。注意:以命令关键字填空的必须写完整.
(1) 在深度为7的满二叉树中,度为2的结点个数为___63____。
(2) 软件测试分为白箱(盒)测试和黑箱(盒)测试,等价类划分法属于__黑箱(或黑盒) 测试。
(3) 在数据库系统中,实现各种数据管理功能的核心软件称为 __数据库管理系统__。
(4) 软件生命周期可分为多个阶段,一般分为定义阶段、开发阶段和维护阶段。编码和测试属于 开发_____阶段。
(5)在结构化分析使用的数据流图(DFD)中,利用数据字典 对其中的图形元素进行确切解释。
(6)执行以下程序后的输出结果是 a=14 。
main()
{int a=10;
a=(3*5,a+4); printf(“a=%d\n”,a);
}
(7) 当执行以下程序时,输入1234567890<回车>,则其中while循环体将执行 0 次。
#include
main()
{char ch;
While((ch=getchar())==’0’) printf(“#”);
}
(8) (8)以下程序的运行结果是 m=4 k=4 i=5 k=5 。
int k=0;
void fun(int m)
{ m+=k; k+=m; printf(“m=%d\n k=%d ”,m,k++);}
main()
{ int i=4;
fun(i++); printf(“i=%d k=%d\n”,i,k);
}
(9) (9)以下程序的运行结果是 #& 。
main()
{int a=2,b=7,c=5;
switch(a>0)
{case 1:switch(b<0)
{case 1:switch(“@”); break;
Case 2: printf(“!”); break;
}
case 0: switch(c==5)
{ case 0: printf(“*”); break;
case 1: printf(“#”); break;
case 2: printf(“$”); break;
}
default : printf(“&”);
}
printf(“\n”);
}
(10)以下程序的输出结果是 9
# include
main()
{ printf(“%d\n”,strlen(“IBM\n012\1\\”));
}
(11)已定义char ch=”$”;int i=1,j;执行j=!ch&&i++以后,i的值为1
(12)以下程序的输出结果是 5 4
# include
main()
{ char a[]={‘\1’,’\2’,’\3’,’\4’,’\0’};
printf(“%d %d\n”,sizeof(a),srelen(a));
}
(13)设有定义语句:int a[][3]={{0},{1},{2}};,则数组元素a[1][2]的值为 0
(14)以下程序的功能是:求出数组x中各相邻两个元素的和依次存放到a数组中,然后输出。请填空。
main()
{int x[10],a[9],I;
for (i=0;i<10;i++)
scanf(“%d”,&x[i]);
for( i=1 ;i<10;i++)
a[i-1]=x[i]+ x[i-1] ;
for(i=0;i<9;i++)
printf(“%d”,a[i]);
printf(“\n”);
(15) 以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕上,请填空:
main()
{int x,y,z,max,*px,*py,*pz,*pmax;
scanf(“%d%d%d”,&x,&y,&z);
px=&x;
py=&y;
pz=&z;
pmax=&max;
*pmax=*px(或*pmax=x) ;
if(*pmax<*py)*pmax=*py;
if(*pmax<*pz)*pmax=*pz;
printf(“max=%d\n”,max);
}
(16)以下程序的输出结果是 10
int fun(int*x,int n)
{if(n==0)
return x[0];
else return x[0]+fun(x+1,n-1);
}
main()
{int a[]={1,2,3,4,5,6,7};
printf(“%d\n”,fun(a,3));
}
(17)以下程序的输出结果是 35
# include
main()
{char *s1,*s2,m;
s1=s2=(char*)malloc(sizeof(char));
*s1=15;
*s2=20;
m=*s1+*s2;
printf(“%d\n”,m);
}
(18)设有说明
struct DATE{int year;int month; int day;};
请写出一条定义语句,该语句定义d为上述结构体变量,并同时为其成员year、month、day 依次赋初值2006、10、1: struct DATA d={2006,10,1};
(19) 设有定义:FILE *fw;,请将以下打开文件的语句补充完整,以便可以向文本文件readme.txt的最后续写内容。
fw=fopen(“readme.txt”, "a" )
2007年4月全国计算机等级考试二级C语言笔试试题答案
一、选择题:
1-5 24134
6-10 31321
11-15 34231
16-20 43113
21-25 43421
26-30 14241
31-35 22412
36-40 23232
41-45 42411
46-50 13241
二、填空题:
1. 63
2,墨盒
3.DBNS
4,开发
5,数据 字典
6,a-14
7,0
8,无答案
9,# 与号
10,9
11,1
12,5_4
13,13 0
14,i=1
15,X[i-1]
16,无答案
17,10
18,40
19,无答案
20,"20a"