计算机网络典型习题讲解(完整版).ppt
请从低到高的顺序指出OSI参考模型中的七层, 并对其中(任选的)五层的每一层指出一个实际协议的例子。
答:物理层、数据链路层、网络层、传输层、会话层(或会晤层)、表示层、应用层
物理层:任何一种调制解调体制
数据链路层:ALOHA、CSMA或CSMA/CD、TDMA、FDMA、CDMA、FDDI等之一
网络层:ARP、IP、ICMP、OSPF、BGP等
传输层:TCP、UDP之一
会话层:NetBIOS等
表示层:XML、HTML、MIME、XDR等
应用层:FTP、HTTP、DNS、SMTP、DHCP、 RIP 、ODBC、RPC等
从下到上列举OSI 7层模型,并概要说明每层的主要功能。
物理层:该层包括物理连网媒介,是计算机连网的基础。
数据链路层:在不可靠的物理线路上进行可靠的数据传递
网络层:实际完成主机到主机的通信服务。(IP、ARP、RARP、ICMP+各种选路协议)
传输层:在终端用户之间提供透明的数据传输。(TCP、UDP)
会话层:负责在网络中的两节点之间建立和维持通信
表示层:为不同终端的上层用户提供数据和信息的格式化方法。(例如加密解密)
应用层:……
王道2020年操作系统.pdf
王道2020年操作系统
考研用书
综上所述,操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。计算机操作系统是随着计算机研究和应用的发展逐步形成并发展起来的,它是计算机系统中最基本的系统软件。
1.1.2操作系统的特征
操作系统是一种系统软件,但与其他系统软件和应用软件有很大的不同,它有自己的特殊性即基本特征。操作系统的基本特征包括并发、共享、虚拟和异步。这些概念对理解和掌握操作系统的核心至关重要,将一直贯穿于各个章节中。
1.并发(Concurrence)
并发是指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中同时存在多个运行的程序,因此它具有处理和调度多个程序同时执行的能力。在操作系统中,引入进程的目的是使程序能并发执行。
注意同一时间间隔(并发)和同一时刻(并行)的区别。在多道程序环境下,一段时间内,宏观上有多道程序在同时执行,而在每个时刻,单处理机环境下实际仅能有一道程序执行,因此微观上这些程序仍是分时交替执行的。操作系
考研计算机基础课程—操作系统电子讲义.pdf
第1章操作系统概述
1.1操作系统的概念、特征、功能和提供的服务
1.1.1操作系统的概念
操作系统是计算机系统中最重要、最基本的系统软件,操作系统位于硬件和用户程序之间。一方面,它能向用户提供使用计算机的接口;另一方面,它能管理计算机软硬件资源,提高其利用率;再者,利用虚拟技术,扩展了计算机的功能和使用范围。因此,操作系统的定义为:操作系统是控制和管理计算机软、硬件资源,以尽可能合理、高效的方法为不同用户及其应用程序提供服务的一种系统程序。
操作系统的目标
1)方便性(用户的观点)提供良好的、一致的用户接口,弥补硬件系统的类型和数量差别,使计算机更容易使用。
2)有效性(系统管理人员的观点)
王道2020年计算机组成原理.pdf
【考纲内容】
(一)计算机发展历程
(二)计算机系统层次结构
计算机硬件的基本组成、计算机软件的分类、计算机的工作过程
(三)计算机性能指标
吞吐量、响应时间、CPU时钟周期、主频、CPI、CPU执行时间
MIPS、MFLOPS、GFLOPS、TFLOPS
【复习提示】
本章是组成原理的概述,考查时易对有关概念或性能指标出选择题,也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念,是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧,相信随着后续章节的学习,一定会有更为深入的理解。本章中读者要重点掌握各个性能指标的计算,这部分内容在历年真题中出现的频率很高。
学习本章时,请读者思考以下问题:
1)计算机由哪几部分组成?以哪部分为中心?
2)主频高的CPU一定比主须低的CPU快吗?为什么?
3)翻译程序、汇编程序、编译程序、解释程序有什么差别?各自的特性是什么?
4)不同级别的语言编写的程序有什么区别?哪种语言编写的程序能被硬件直接执行?
请读者在学习本章的过程中寻找答案,本章末尾会给出参考答案。
1.1.1计算机硬件的发展
1.计算机的四代变化
从1946年世界
天勤2019版计算机组成原理高分笔记..pdf
知识点讲解
.1计算机的发展历程
1.1.1计算机硬件的发展
计算机从20世纪40年代诞生至今,已有几十年的历史。计算机的发展历程既是计算机硬件技术的发展历史,也是计算机软件技术的发展历史。
1.计算机的发展历程
(1)第一代计算机(1946-1957年)——电子管时代主要特点:①电子管作为开关器件:②使用机器语言;③可以存储信息;④输入/输出很慢。
(2)第二代计算机(1958-1964年)——晶体管时代主要特点:①晶体管代替电子管;②采用磁心存储器;③汇编语言取代机器语言。
(3)第三代计算机(1965-1971年)—中小规模集成电路时代主要特点:①中小规模的集成电路代替晶体管;②操作系统问世。
(4)第四代计算机(1972年至今)—超大规模集成电路时代主要特点:①采用集成度很高的电路;②微处理器问世。
从第一代到第四代,计算机的体系结构都是相同的,即都由控制器、存储器、运算器、
北航计算机网络课件.pdf
1.1计算机网络定义与分类
一、计算机网络的定义
·计算机网络(Computer network)的简单定义
计算机网络是一些互相连接的、自治的计算机的集合
A collection of autonomous computers interconnected by a single technology
·网络的功能
-连通性
-资源共享
·计算机网络与分布式系统(distributed system)-在分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的
-计算机网络则没有这种统一性
-分布式系统建立在网络之上
密码学与网络安全知识点整理.docx
密码编码学与网络安全
第一章 概述
一、OSI安全框架
1、主要关注
①安全攻击:任何危及系统信息安全的活动。
②安全机制:用来保护系统免受侦听、阻止安全攻击及恢复系统的机制。
③安全服务:加强数据处理系统和信息传输的安全性的一种服务。其目的在于利用一种或多种安全机制阻止安全攻击。
2、安全攻击
①主动攻击:
以各种方式有选择地破坏信息,如添加、修改、删除、伪造、重放、冒充、乱序、病毒等,人为通过网络通信连接进行的。
可分为四类:伪装、重播、消息修改和拒绝服务。
②被动攻击:
(1)不干扰网络信息系统正常工作情况下,进行窃听或监测数据传输。
(2)计算机病毒、木马、恶意软件等。这些威胁一般是用户通过某种途径(如使用了带病毒的U盘,带病毒或木马或恶意软件的网页/图片/邮件等)感染上的。
3、安全服务
①身份认证 Authentication
认证发送方和接收方的身份(对等实体身份认证);
认证信息的来源(数据源身份认证)。
②访问控制 Access control
保护信息免于被未经授权的实体访问。
③数据机密性 data confidentiality
保护数据免于非授权
密码学之看完不过你找我V1.1.pdf
选择题(五道)考的知识点应该比较小,也比较难掌控,只有认真把书看一遍并且多看看试题才能做到胸有成竹。下面是我自己的一些知识点总结:
1.安全机制指用来检测、阻止攻击或者从攻击状态里恢复的过程(或包含这种过程的设备),最重要的安全机制之一就是密码编码机制2.欲达理论安全,加密密钥长度必须大于等于明文长度,密钥只用一次,用完即丢,即一次一密,不实用。
3.密码体制:加密系统采用的基本工作方式称为密码体制。密码体制的基本要素是密码算法和密钥。密码算法是一些公式、法则或程序;密钥是密码算法中的控制参数。(明文密文不算基本要素,注意跟书22页上对称密码模型5个基本成分的区别)
4.序列密码(流密码)和分组密码
·序列密码:如果密文不仅与最初给定的算法和密钥有关,同时也与明文位置有关(是所处位置的函数),则称为序列密码体制。加密以明文比特为单位,以伪随机序列与明文序列模2加后,作为密文序列。
·分组密码:如果经过加密所得到的密文仅与给定的密码算法和密钥有关,与被处理的明文数据在整个明文中的位置无关,则称为分组密码体制。通常以大于等于64位的数据块为单位,加密得相同长度的密文。
控制单元&控制单元设计.pptx
取指周期
①PC->MAR 现行指令地址送至MAR
②1->R向主存发送读命令,启动主存读操作
③M(MAR)->MDR 现行指令从存储器中读至MDR
④MDR->IR 现行指令送至R
⑤0P(IR)->CU 指令操作码送至CU译码
⑥(PC)+1->PC形成下一条指令地址
存储器讲解.docx
例4.3用一个512K×8位的Flash存储芯片组成一个4M×32位的半导体只读存储器。
试回答:
(1)该存储器的数据线数。
(2)该存储器的地址线数。
(3)共需几片这科存储芯片?
(4)说明每根地址线的作用。
(1)对于4M×32位的存储器,数据线为32位。
(2)对于4M×32位的存储器,按字寻址的范围是2,按字节寻址的范固是2“,故该存储器的地址线为24位A2s~Ab。
(3)4片512K×8位的Flash可组成512K×32位的存储器,4M×32位的存储器共需32片512K×8位的Flash。
(4)CPU的24根地址线中,最低2位地址A,A。为字节地址,Aa~A,这19根地址线与Flash 的地址线相连,最高3位地址AsA22A21可通过3线-8线译码器形成片选信号。每一个片选信号同时选中4片Flash,以满足32位的数据线要求。
例4.5设有8个模块组成的八体存储器结构,每个模块的存取周期为400ms,存储字长为32位。数据总线宽度为32位,总线传输周期50ns,试求顺序存储(高位交又)和交义存储(低位交叉)的存储器带宽。
大连理工大学软件学院2014数据结构期末考试(学长手抄整理).docx
数据结构2014 – 2015 期末试卷
(1.不保证题目完全没有问题 2.部分图片来自网络)
一、选择(2’×15=30’)
1.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为( )
A.O(0) B.O(1) C.O(n) D.O(n2)
2.用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( )
A.仅修改队头指针 B.仅修改队尾指针
C.队头、队尾指针都不修改 D.队头、队尾指针都可能要修改
3.设栈S和队列Q的初始状态均为空,元素a,b,c,d,e,f,g依次进入栈S,若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是b,d,c,f,e,a,g,则栈S的容量至少是( )
A.1 B.2 C.3 D.4
4.对n(n≥2)个权值均不相同的字符构成哈夫曼树,关于该树的叙述中,错误的是( )
A.该树一定是一棵完全二叉树 B.树中一定没有度为1的结点
C.树中两个权值最小的结点一定是兄弟结点
D.
大连理工大学软件学院离散数学电子教材.pdf
1.1命题和联结词
1.1.1命题的概念
定义1.1命题是或者为真,或者为假,而不是两者同时成立的陈述句。
离散数学
作为命题的陈述句所表达的判断结果称作命题的真值,真值只能取两个值:真或假。
真值为真的命题称为真命题,真值为假的命题称为假命题。注意:任何命题的真值都是唯一的。
如果一个命题的真值是真,则用1或T(True)来表示;如果一个命题的真值是假,则用0或F(False)来表示。
命题用大写的英文字母,如P,Q,R……来表示。
判断给定句子是否为命题分为两步:首先判断该句子是否为陈述句;其次判断它是否有唯一的一个真值。
例1.1判断下面句子是否是命题。
(1)2013年是闰年。
计组知识点摘要.docx
1.计算机组织与结构概述
-冯诺依曼计算机特点(6个)
-计算机系统的层次结构(5个层次)
-计算机硬件框图(图1.7&&图1.8)
-存储器、运算器、控制器等组成
-机器字长、存储容量等概念
-如何衡量运算速度(记住常用的英文缩写 MIPS百万条指令每秒 CPI FLOPS等)
2.系统总线
-总线分类(3种)
-//地址总线分类(3种)
-系统总线的分类(3种)(重点注意传输方向)
-总线的特性(4种)
-总线性能指标(重点注意总线的带宽的定义还有就是总线复用)
-总线标准(若干线,PCI,ISA,EISA,USB)(重点注意USB)
-总线结构(单总线、双总线、三总线)
-总线判优控制(3种方式)
-总线通信控制(4个阶段、4种方式)
其中的异步通信(3种应答方式)
-数据传输率(比特率/波特率)
3.存储器
-存储器层次结构
-半导体译码驱动方式(2种方式)
-静态RAM、动态RAM
-动态RAM的刷新(3种刷新 刷新间隔)
-可修改信息的ROM(3种ROM)
-闪存(Flash Memory)
-存储器扩展(3种扩展方式 例4.1 芯片+地址+图)
-校验码(汉明码:奇偶
计算机网络笔记.zip
内容同夏峰计算机网络B站网课笔记
一、概述
1.1 五层模型
互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。
用户接触到的,只是最上面的一层,根本没有感觉到下面的层。要理解互联网,必须从最下层开始,自下而上理解每一层的功能。
如何分层有不同的模型,有的模型分七层,有的分四层。我觉得,把互联网分成五层,比较容易解释。
计算机网络高分笔记.pdf
一.计算机网络的概念、组成与功能
【定位】概念:课本17页1.5.1组成:请看疑问点(2)功能:请看疑问点(3)【可能疑问点】(1)自治计算机就是能够进行自我管理、配置和维护的计算机(我们现在用的电脑),像以前的终端(只有显示器,仅仅显示数据),就不能叫做自治计算机了。
(2)从逻辑功能上讲,计算机网络由通信子网和资源子网两部分构成:
1通信子网:由各种传输介质、通信设备和相应的网络协议组成,它为网络提供数据传输、交换和控制能力,实现连网计算机之间的数据通信(包括物理层、数据链路层、网络层)。2.资源子网:由主机、终端以及各种软件资源、信息资源组成,负责全网的数据处理业务,向网络用户提供各种网络资源与服务。
(3)计算机网络具有以下一些基本功能:1.数据通信:它是计算机网络最基本的功能。
包括连接控制、传输控制、差错控制、流量控制、路由选择、多路复用等子功能。2.
资源共享:包括数据资源、软件资源以及硬件资源。3.信息综合处理:将分散在各地计算机中的数据资料进行集中处理或分级处理。如自动订票系统、银行金融系统、数据采集与处理系统等。4.负载均衡:即将工作任务均衡的分配给计算机网络中的各
网络层 中文资料.zip
第三章网络层:IP协议
3.1网络互联的概念
没有任何单独一种数据链路层机制能满足所有类型的网络应用环境;需要一种最大范围的网络,它能以统一的方式向各种不同类型的网络应用提供公共的通讯服务。
通过IP协议统一实现网络层的逻辑功能,这些高级功能屏蔽了各种具体的数据链路层的功能特点,将其变换为统一的网络层服务,作为其结果的逻辑网络,就是因特网。
在体系结构上,因特网是各种局域网和广域网通过网络互连设备一以后称为路由器(router)一互相连接起来的网际,即网络的网络。
计网(万良田).rar
大连理工大学
软件学院
计算机网络
万良田老师
上课PPT
Chapter 1: Introduction
Chapter 2: application layer
Chapter 3: Transport Layer
Chapter 4: network layer
Chapter 5: Link layer
Chapter 6: Wireless and Mobile Networks
16.第十六章 数据管理.txt
第十六章 数据管理
16.1 简单链表
链表是一种常见的基础数据结构,是一种线性表,但并不会按线性的顺序存储数据,而是在每一个结点里存储下一个结点的指针。由于不必按顺序存储,链表的插入和删除操作不需要移动数据。
案例 通讯录管理
问题描述 完成一个采用有序链表管理的通讯录,具备插入、查询、删除、输出通信者信息的功能。每个通信者具有编号、姓名、性别、电话及地址信息。
为采用链表管理多条通信者记录,首先定义通信者的数据结构和链表结点的结构。设链表结点仅含一个数据域和一个指针域,数据域描述通信者的相关信息。
定义通信者的结点类型:
typedef struct
{
char num[5]; /*编号*/
char name[20]; /*姓名*/
char sex[3]; /*性别*/
char phone[13]; /*电话*/
char addr[31]; /*地址*/
}DataType;
因此,线性表的链式存储结构定义如下:
typedef struct node
{
DataType data; /*结点数据域*/
struct node *next; /*结点指针域*/
}ListNode;
typedef ListNode * LinkList;
ListNode * p; /*定义一个指向结点的指针变量*/
LinkList head; /*定义指向单链表的头指针*/
上面的LinkList和ListNode *是不同名字的同一指针类型,取不同的名是为了在概念上更明确。指针变量的值要么为空(NULL),不指向任何结点,要么非空,值为一个结点的存储地址。指针变量指向的结点没有具体说明,在程序执行过程中,需要存储结点时才产生,通过malloc函数实现。如给指针变量p分配一个结点的地址:p=(ListNdoe *)malloc(sizeof(ListNode));该语句功能是申请分配一个类型为ListNode的结点的地址空间,将其首地址存入指针变量p中。结点不需要时可用free(p)释放结点的存储空间,这时p为空值NULL。
为实现通讯录管理的功能,首先设计一个含有多个菜单的主菜单程序,然后实现菜单中的相应功能:
Case1 通讯录链表初始化;
Case2 通信者结点的插入;
Case3 通信者结点的查询;
Case4 通信者结点的删除;
Case5 通信录链表的输出;
Case6 退出管理系统。
请选择0~5:使用数字0~5选择菜单项,其他输入不起作用。
1.通讯录链表初始化
链表初始化是建立一个空的链表,这里的链表采用的是带头结点的链表。带头结点的链表好处是使得在链表头和尾插入结点与在链表中间插入算法一致,简化了代码。
初始化链表结构:头指针head --> 头结点 NULL
2.通信者结点的插入
因为是有序(依据编号从小到大)链表,首先找插入位置。需要找到第一个比插入结点p编号大的结点p2,p要插入在p2前。需要用指针p1记载p2之前的结点,这样插入时,即可把p插在p1之后p2之前。
插入结点的关键代码为:
p->next=p2;
p1->next=p;
3.通信者结点的查询
可分别依据编号和姓名进行查询。
(1)依据编号:设链表中结点按编号升序排列,查询过程中,从头开始比较。碰到待查编号等于某结点编号时,返回该结点地址。碰到待查编号大于某结点编号时,继续和下一结点比较。碰到待查编号小于某结点编号时,说明链表中不存在该编号的结点,返回NULL。
(2)依据姓名:从头开始比较,依次用待查姓名和各个结点的姓名比较,相等则返回该结点地址。否则,继续和下一结点比较,直到链表结束,若没有相等结点则返回空指针。
4.通信者结点的删除
首先调用查询功能找到结点p,删除时还需要找到该结点之前的结点q,删除语句为:
q->next=p->next;
最后通过free(p)释放p指向的结点空间。
5.通信录链表的输出
依次遍历各个结点的数据信息
6.退出管理系统
终止程序
例:通讯录有序链表管理(待修改)
#include
#include
#include
/*通讯录结点类型*/
typedef struct
{
char num[5]; /*编号*/
char name[8]; /*姓名*/
char sex[3]; /*性别*/
char phone[13]; /*电话*/
char addr[31]; /*地址*/
} DataType;
/*结点类型定义*/
typedef struct node
{
DataType data; /*结点数据域*/
struct node *next; /*结点指针域*/
} ListNode;
typedef ListNode * LinkList;
LinkList head;
ListNode *p;
/*函数说明*/
int menu_select();
LinkList createList();
void insertNode(LinkList head,ListNode *p);
ListNode * listFind(LinkList head);
void delNode(LinkList head);
void printList(LinkList head);
/*主函数*/
void main()
{
for( ; ; )
{
switch(menu_select())
{
case 1:
printf("**************************\n");
printf("* 通讯录链表的初始化 *\n");
printf("**************************\n");
head=createList();
break;
case 2:
printf("**************************\n");
printf("* 通讯者信息的添加 *\n");
printf("**************************\n");
printf("编号 姓名 性别 电话 地址\n");
p=(ListNode *)malloc(sizeof(ListNode)); /*申请新结点*/
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
insertNode(head,p);
break;
case 3:
15.第十五章 数组进阶.txt
第十五章 数组进阶
15.1 数据模型
数据是描述事务的符号记录,模型是现实世界的抽象。现实世界的事务及关联关系可以抽象成一个具体的模型,模型通过某种数据结构映射到计算机世界中,进而计算机通过软件处理数据来达到模拟、管理现实世界事务的目的。
通过数组可以管理学生花名册、模拟一个棋盘等。
案例 贪吃蛇游戏
1.模型设计
2.视图表达
3.获取控制信息
clock函数是自进程启动后此进程运行到此处使用CPU的毫秒数,需要头文件time.h。
kbhit函数检查是否有键按下,返回值为整数,未按键时返回0,需要头文件conio.h。
4.利用控制信息修改数据模型变为新的数据模型
例:贪吃蛇游戏
#include
#include
#include
#include
#include
int head,tail;
int main()
{
int changeModel(char tcsQipan[22][22],int tcsZuobiao[2][20],char direction);
long start;
int gamespeed=500;
int timeover;
int direction=77;
char tcsQipan[22][22];
int tcsZuobiao[2][20];
int i,j;
/*初始化蛇位置坐标*/
for(i=0; i<=3; i++)
{
tcsZuobiao[1][i]=i+1;
tcsZuobiao[0][i]=1;
}
head=3; /*蛇头在第3列*/
tail=0; /*蛇尾在第0列*/
/*初始化棋盘*/
/*初始化贪吃蛇棋盘中间空白部分*/
for(i=1; i<=20; i++)
for(j=1; j<=20; j++)
tcsQipan[i][j]=' ';
/*初始化贪吃蛇棋盘上下墙壁*/
for(i=0; i<=21; i++)
{
tcsQipan[0][i]='-';
tcsQipan[21][i]='-';
}
/*初始化贪吃蛇棋盘左右墙壁*/
for(i=0; i<=20; i++)
{
tcsQipan[i][0]='|';
tcsQipan[i][21]='|';
}
/*初始化贪吃蛇在棋盘中的位置*/
for(i=1; i<=3; i++)
tcsQipan[1][i]='*';
tcsQipan[1][4]='#';/*蛇头*/
/*重复:清屏、显示磁盘、获取控制方向、按键有效性检查、更新模型*/
14.第十四章 函数进阶.txt
第十四章 函数进阶
14.1 分解与抽象
案例 日期运算
给定日期由年月日(3个整数,年的取值在1970~2050间)组成,完成以下功能:
(1)判定给定日期的合法性。
(2)计算两个日期相差的天数。
(3)计算一个日期加上一个整数后对应的日期。
(4)计算一个日期减去一个整数后对应的日期。
(5)计算一个日期是星期几。
分析:
1.判断给定日期的合法性
首先判断年份是否在1970~2050之间,然后判断月份是否在1~12之间,最后判断日的合法性。当月份为1、3、5、7、8、10、12时,日在1~31之间;月份为4、6、9、11时,日在1~30之间;月份为2时,若年为闰年,日在1~29之间,不为闰年在1~28之间。
闰年:year%4==0&&year0;!=0||year@0==0
2.计算两个日期相差的天数
计算日期A和日期B相差天数,A小于B且A与B不在同一年时,把天数分为三段:
(1)A到A所在年份12月31日的天数;
(2)A所在年份后整年部分(A、B在相邻年份时无整年部分);
(3)B所在年份1月1日到B的天数。
若A小于B且A、B在同一年,直接在年内计算。
3.计算一个日期加上一个整数后对应的日期。
4.计算一个日期减去一个整数后对应的日期。
5.计算一个日期是星期几。
计算日期A为星期几,先找一个知道为星期几的参照日期B,通过计算A和B的相差天数,就可计算出日期A星期几。
例:日期综合运算。
#include
#include
/*日期结构体*/
struct date
{
int year;
int month;
int day;
};
/*二维数组,第0行是闰年每月天数,第1行是非闰年每月天数 */
int m[2][12]= {{31,29,31,30,31,30,31,31,30,31,30,31},
{31,28,31,30,31,30,31,31,30,31,30,31}};
/*判断闰年,是返回1,不是返回0*/
int leap(int y)
{
if(y%4==0&&y0;!=0||y@0==0)
return 1;
else
return 0;
}
/*将给定日期转换成从1970年1月1日到该日期经过的天数*/
int dateToDays(struct date d)
{
int sum=0,i;
/*把整年的天数累加到sum中*/
for(i=1970; i<d.year; i++)
sum+=leap(i)+365; /*闰年时返回1,多加一天*/
/*不够整年的month之前的整月天数累加到sum中*/
if(leap(d.year))
for(i=0; i<d.month-1; i++)
sum+=m[0][i];
else
for(i=0; i<d.month-1; i++)
sum+=m[1][i];
sum+=d.day;
return sum;
}
/*将给定天数转换成从1970年1月1日经过该天数的日期*/
struct date daysToDate(int days)
{
13.第十三章 文件.txt
第十三章 文件
对数据的管理无论是用数组还是链表,都是存储在内存中的,程序结束后都会丢失,下一次运行程序时,要重新输入或运算生成数据。要把程序运行的数据保存起来以便下次运行继续使用,在计算机中持久保存数据的方式是利用文件保存。
13.1 文件概述
文件一般是指存储在外部介质上数据的集合。文件以数据形式存放在外部介质上,操作系统以文件为单位对数据进行管理。想找到存在外部介质上的数据,必须按文件名找到指定的文件然后再从该文件中读取数据。要想在外部介质上存储数据必须先建立一个文件(以文件名标识),才能向它输出数据。从操作系统角度,每一个与主机相连的输入输出设备都可以被看作一个文件。在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上保存,以后要用时再从磁盘中输入到计算机的内存,这就要用到磁盘文件。
操作系统的文件标识包括三部分:
(1)文件路径:表示文件在外部存储设备中的位置。
(2)文件名:遵循标识符的命名规则。
(3)文件扩展名:表示文件的性质(.txt .dat .c)。
如:d:\c++\temp\flie1.dat
文件操作是一种典型的IO操作(输入输出操作)。输入输出是针对内存而言的,进内存为输入,出内存为输出。
标准输入输出就是标准输入设备(键盘)和标准输出设备(显示器),键盘和显示器就是一种文件。C语言将文件看成字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。C语言中对文件的存取是以字符(字节)为单位的,输入输出数据流的开始和结束仅受程序控制不受物理符号控制(如回车换行符)。输出时不会自动增加回车换行符作为记录结束的标志,输入时不以回车换行符作为记录的间隔(实际上C文件不是由记录构成的),这种文件称为流式文件。
ANSI新标准文件采用缓冲方式,系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据必先送到输出缓冲区,装满缓冲区后才一起送到磁盘。从磁盘向内存输入数据先送到输入缓冲区,程序需要数据时去缓冲区读取,若缓冲区无数据,则程序进入阻塞状态(等待数据)。
C语言把数据看作是一连串的字符(字节),根据数据的组成形式,分为ASCII文件和二进制文件。
文本文件又称ASCII文件,每个字节存放一个ASCII码,代表一个字符。如1、2的ASCII码分别为49、50,所以整数12用ASCII文件存放时,存放形式为00110001 00110010
二进制文件是直接用数据的二进制形式存放的,即把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
程序中实现对文件的处理通常分三步:
(1)打开文件:将程序与文件建立联系。
(2)操作文件:对文件进行读写操作,即输入输出。
(3)关闭文件:操作完成应当切断文件与程序的联系。
C语言中没有输入输出语句,对文件的读写都是用库函数实现的。ANSI规定了标准输入输出函数,用它们对文件进行读写,这些函数的声明包含在头文件stdio.h中。
13.2 文件的打开与关闭
文件进行读写操作前先要打开,使用完毕要关闭。打开文件,是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。关闭文件则断开指针与文件之间的联系。
1.打开文件(fopen函数)
原型:FILE *fopen(char *filename, char *mode);
FILE是在stdio.h头文件中定义的一个结构体,用来保存文件信息。
fopen函数用来打开一个文件,其调用的一般形式为:
文件指针名=fopen(文件名,使用文件方式);
其中:
·“文件指针名”必须是被说明为FILE类型的指针变量。
·“文件名”是被打开文件的文件名,是字符串常量或字符串数组。
·“使用文件方式”是指文件的类型和操作要求。
如:
FILE *fp;
fp=fopen("file1.txt","r");
其意义是在当前目录下打开文件file1.txt,只允许读操作,并使fp指向该文件。
又如:
FILE *fp;
fp=fopen("c:\\file2.txt","rb");
意义是打开C驱动器磁盘根目录下的文件file2.txt,对其按二进制方式进行读操作。两个反斜线\\中的第一个表示转义字符,第二个表示根目录。
文件打开方式
r 只读打开一个文本文件,只允许读数据
w 只写打开或建立一个文本文件,只允许写数据
a 追加打开一个文本文件,并在文件末尾写数据
r+ 读写打开一个文本文件,允许读和写
w+ 读写打开或建立一个文本文件,允许读和写
a+ 读写打开一个文本文件,允许读和在文件末尾写数据
rb 只读打开一个二进制文件,只允许读数据
wb 只写打开或建立一个二进制文件,只允许写数据
ab 追加打开一个二进制文件,并在文件末尾写数据
rb+ 读写打开一个二进制文件,允许读和写
wb+ 读写打开或建立一个二进制文件,允许读和写
ab+ 读写打开一个二进制文件,允许读和在文件末尾写数据
(1)文件使用方式由r、w、a、b、+拼成,含义分别为:
r(read) 读
w(write) 写
a(append) 追加
b(binary)二进制文件
+ 读和写
(2)用r方式打开文件时文件必须存在,只能从该文件读出。
(3)用w方式打开只能向文件写入。若打开的文件不存在,则以指定的文件名建立新文件。若存在,则将存在的文件删除,重建新文件。
(4)向一个已存在的文件追加新的信息,只能用a方式打开。文件必须存在,否则会出错。
(5)打开文件出错时fopen将返回一个空指针值NULL。程序中可用这一信息判断是否完成打开文件的工作,并做相应的处理。因此常用以下程序段打开文件:
if((fp=fopen("c:\\file2.txt","rb"))==NULL)
{
printf("\nerror on open c:\\file2.txt!");
exit(0);
}
(6)把文本文件读入内存时,要将ASCII码转换成二进制码。把内存数据以文本方式写入磁盘时,要将二进制码转换成ASCII码。因此文本文件的读写花费较多的转换时间,对二进制文件的读写不存在这些转换。
(7)标准输入文件(键盘)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。
2.关闭文件(fclose函数)
文件使用完毕,应用关闭文件函数把文件关闭,从而把缓冲区的数据写入文件中。否则程序结束时可能造成数据丢失。
fclose函数使用形式:
fclose(文件指针);
如:fclose(fp);
正常完成关闭文件操作时,fclose函数返回值0。发生错误时返回EOF。
13.3 文件读写
对文件的读和写是最常用的文件操作,在C语言标准库中提供了多种文件读写的函数。
字符读写函数:fgetc和fputc
字符串读写函数:fgets和fputs
数据块读写函数:fread和fwrite
格式化读写函数:fscanf和fprintf
13.3.1 字符读写函数
1.读字符函数fgetc
规格:int fgetc(FILE * stream);
功能:从指定的文件中读一个字符。
参数:stream为指向文件的指针。
返回值:从stream所指的文件流中读取一个字符,转换为int类型返回。若已到文件尾返回EOF,文件状态改为结束状态。若读错误返回EOF,文件改为错误状态。EOF在stdio.h中定义为-1。
例如:
ch=fgetc(fp);
其含义是从打开的文件fp中读取一个字符并送入ch中。
对于fgetc函数的使用有几点说明:
(1)在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
(2)文件内部有一个位置指针,用来指向文件的当前读写字节,文件打开时,位置指针总指向文件的第一个字节。使用fgetc函数后位置指针向后移动一个字节。因此可连续多次使用fgetc函数读取多个字符。文件指针是指向整个文件的,要在程序中定义说明,只要不重新赋值文件指针值不变。文件内部的位置指针用于指示文件内部的当前读写位置,每读写一次,位置指针向后移动,它无需在程序中定义说明,由系统自动设置。
例:读取文本文件file.txt,把其中所有非空格字符输出在标准输出设备上。
#include
#include
#include
int main()
{
FILE *fp;
char ch;
if((fp=fopen("file.txt","r"))==NULL)
{
printf("\nCan't open file,strike any key exit!");
getch(); /*等待敲键盘,显示Can't open file,strike any key exit!*/
exit(1); /*结束程序*/
}
ch=fgetc(fp);
while(ch!=EOF) /*文件结束时读取得到EOF*/
{
if(ch!=' ')
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
return 0;
}
12.第十二章 自定义数据类型.txt
第十二章 自定义数据类型
12.1 结构体
结构体(structure)又叫结构,是一种构造类型,由若干成员构成,成员可以是一个基本数据类型或一个构造类型。
12.1.1 结构体声明
声明结构体的形式:
struct 结构名
{
成员表列;
};
成员表列由若干个成员组成,每个成员必须做类型说明,形式为:
类型说明符 成员名;
例1:声明学生结构:
struct student
{
int iNum;
char cArrName[20];
char cSex;
float fScore;
};
注意不要忘记}后的分号(;)。
成员名可与程序中其他变量同名,互不干扰。
结构体声明并不分配空间,结构体声明是在说明一种数据类型,不是变量定义。例1中结构体student与int、float一样都是数据类型。
声明结构体后可定义结构体变量,这时分配空间。
12.1.2 结构体变量定义
声明结构体后可以定义结构体变量。
定义方法:
a.先声明结构体,再定义结构体变量
struct student
{
int iNum;
char cArrName[20];
char cSex;
float fScore;
};
struct student stu1,stu2;
可以用宏定义使用一个符号常量表示一个结构体类型。
b.在声明结构体同时定义结构体变量
struct student
{
int iNum;
char cArrName[20];
char cSex;
float fScore;
}stu1,stu2;
c.直接定义结构体变量
struct
{
int iNum;
char cArrName[20];
char cSex;
float fScore;
}stu1,stu2;
第三种与第二种区别在于省去了结构体类型名,而直接给出结构体变量。这种方法结构体只能用一次,即使再声明成员完全相同的结构体类型,也和此次定义的结构体类型属于不同的结构体类型。
结构体变量在内存空间中是连续存储的,结构体类型大小为sizeof(struct student),为各成员大小之和,各编译系统为内存管理方便可能分配大一些的内存空间来存储结构体,保证字节对齐。在Dev中上述结构体类型student为32字节。
结构体成员可以又是一个结构体,即构成嵌套的结构体。如:
struct date
{
int year;
int month;
int day;
};
struct student
{
int iNum;
char cArrName[20];
char cSex;
float fScore;
struct date birthday;
};
12.1.3 结构体变量引用
1.结构变量初始化
11.第十一章 指针.txt
第十一章 指针
11.1 理解指针
在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元。为了正确访问内存单元,必须为每个内存单元编号,根据一个内存的编号即可准确找到该内存单元,内存单元的编号也叫地址,通常把这个地址称为指针(pointer)。一个指针变量的值就是某个内存单元的地址(或称某个内存单元的指针)。
在一个指针变量中存放一个数组的首地址,因为数组是连续存放的,通过访问指针变量取得数组的首地址,也就找到了该数组。在C语言中,一种数据类型或数据结构往往占有一组连续的内存单元,用指针描述一个数据结构的首地址,该指针指向这个数据结构。
11.2 指向变量的指针
#include
int main()
{
int i=1,*pi=&i;
printf("%d",sizeof(pi));
return 0;
}
变量i的三个属性:
(1)值:为1,通过变量名访问,如i+5。
(2)地址:占用内存空间的位置,通过&i访问。
(3)类型:为int,决定该变量能参加的运算,决定了其占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小用sizeof运算符计算,sizeof(i)或sizeof(int)。
变量的指针就是变量的地址,存放变量地址的变量是指针变量。C语言中允许用一个变量存放指针,称为指针变量。
11.2.1 指针变量定义
指针变量定义的一般形式:
类型说明符 *变量名;
如:
int *pi;
对指针变量的定义包括3个内容:
(1)指针类型说明:*表示这是一个指针变量。
(2)指针变量名:pi为指针变量名。
(3)指针所指向的变量的数据类型:int为指针变量所指向的变量的数据类型,说明pi只能存储整型变量的地址。
如:
float *pf; /*pf为指向浮点变量的指针变量*/
char *pc; /*pc为指向字符变量的指针变量*/
11.2.2 指针变量引用
未经赋值的指针变量不能使用,否则将造成系统紊乱,甚至死机。指针变量只能赋予地址。C语言中,变量的地址是由编译系统分配的。
与指针相关的两个运算符:
(1)&:取地址运算符
一般形式:
&变量名
表示取一个内存变量的地址。
(2)*:指针运算符(或称“间接访问”运算符)
一般形式:
*指针变量名
通过指针变间接访问指针变量所指向变量的数据。
#include
int main()
{
int i=1,*pi=&i;
printf("%d",sizeof(pi));
return 0;
}
对指针变量的应用的说明:
a.对*要区别类型说明符与间接访问符。
b.不能用一个数给指针变量赋值,但是指针可用0赋值,代表空指针,即不指向任何数据。
c.给指针变量赋值时,指针变量前不能加*。
如:int i;
int *pi;
*pi=&i; /*写法错误,应该为pi=&i*/
pi赋值&i后可用*pi间接访问i
d.指针变量为指向具体有效地址时,直接访问会有危险。
如:
int *pi; /*指针变量pi为赋值,不知道指向哪里*/
*pi=200; /*向pi所指向的地址空间赋值200*/
C语言对未赋值的指针变量的值是不确定的。上面语句中使pi所指向的空间赋值200,这时,当pi指向有用数据空间时,该数据将被200覆盖,导致数据破坏;当指针pi指向系统空间时,系统遭到破坏,严重时将导致系统瘫痪。
指针变量定义时,编译系统就会给定一个值,如何判定一个指针变量是否指向有用数据空间,建议定义指针时初始化为0,间接访问前让它指向有效空间,这样间接访问时可以判断指针是否指向有效地址。如:
int *pi=0;
·
·
·
if(pi!=0)
*pi=200;
省略号部分,若未使pi指向有效空间,对*pi的赋值不会进行。
e.指针变量的值可以改变,像普通变量一样被重新赋值,就是说可以改变指针变量的指向。
f.指针变量只能用同类型的地址赋值。
g.同类型指针变量间可以相互赋值。
例:交换指针变量的值。
#include
int main()
{
int i1=3,i2=4;
int *pi1=&i1;,*pi2=&i2;,*pi3=0;
printf("*pi1=%d\t*pi2=%d\n",*pi1,*pi2);
pi3=pi1;
pi1=pi2;
pi2=pi3;
printf("*pi1=%d\t*pi2=%d\n",*pi1,*pi2);
return 0;
}
运行结果:
*pi1=3 *pi2=4
*pi1=4 *pi2=3
交换了指针变量的值,导致指针变量交换了指向。
例:交换指针变量所指向的数据的值。
#include
int main()
{
int i1=3,i2=4,temp=0,*pi1=&i1;,*pi2=&i2;
printf("i1=%d\ti2=%d\n",i1,i2);
temp=*pi1;
*pi1=*pi2;
*pi2=temp;
printf("i1=%d\ti2=%d\n",i1,i2);
}
运行结果:
i1=3 i2=4
i1=4 i2=3
11.3 数组与指针
一个数组包含若干元素,每个数组元素都在内存中占用内存单元。数组的指针是指数组的起始地址,数组元素的指针是指数组元素的地址。
11.3.1 一维数组与指针
一个数组是由连续的一块内存单元组成的,数组名就是这块连续内存单元的首地址(常量)。一个数组元素的首地址也是指它所占有的内存单元的首地址。
#include
int main()
{
int arr[5];
printf("%d",arr==&arr;[0]);
return 0;
}
运行结果:
1
arr与&arr;[0]指向同一内存单元,都是数组的首地址,也是0号元素的首地址。arr是常量地址,&arr;[0]是整型变量arr[0]的地址。
1.指针相关的运算符
(1)取地址运算符&
(2)间接访问运算符*
(3)赋值运算符=,给指针变量赋值。
(4)算术运算符+、-、++、--
p1+i:结果为p1地址值位置跳过(i*p1所指类型字节数)个字节后的地址。
p1-i:结果为p1地址值位置跳回(i*p1所指类型字节数)个字节后的地址。
p2-p1:结果为相差字节数÷指针变量所指类型字节数。
p2++:结果为p1地址值位置跳过p1所指类型字节数后的地址。
(5)关系运算,支持六种关系运算符,用来比较地址的大小。
例:
int arr[5];
int *p1,*p2;
p1=&arr;[0];
p2=&arr;[4];
①*p1++:*和++同优先级,结合方向从右到左,所以*p1++等价*(p1++),先执行*p1,然后p1加1。表达式的值为arr[0],p1的值为&arr;[1]。
10.第十章 函数.txt
第十章 函数
10.1 理解函数
C语言函数是程序中对分解与抽象思想的实现。C语言把大段的程序代码按照功能分解开,体现出对重复使用的程序段的抽象。
例:求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)。
/*求最大公约数用辗转相除法*/
#include
int main()
{
int i1,i2,i3,i4,gcd,lcm,temp;
printf("Input i1 and i2:");
scanf("%d%d",&i1;,&i2;);
i3=i1;
i4=i2;
temp=i2;
while(temp!=0)
{
temp=i1%i2;
i1=i2;
i2=temp;
}
gcd=i1;
lcm=i3*i4/gcd;
printf("最大公约数:%d\n最小公倍数:%d\n",gcd,lcm);
return 0;
}
例:利用函数分解求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)。
/*利用函数分解求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)*/
#include
int gcd(int i1,int i2);
int lcm(int i1,int i2);
int gcd(int i1,int i2)
{
int temp;
temp=i2;
while(temp!=0)
{
temp=i1%i2;
i1=i2;
i2=temp;
}
return i1;
}
int lcm(int i1,int i2)
{
return i1*i2/gcd(i1,i2);
}
int main()
{
int i1,i2;
printf("Input i1 and i2:");
scanf("%d%d",&i1;,&i2;);
printf("最大公约数:%d\n最小公倍数:%d\n",gcd(i1,i2),lcm(i1,i2));
return 0;
}
C程序结构:
(1)一个C程序可以由多个模块构成,每个模块可由若干个小模块构成,继续分解,直到分解成不可分割的最小模块单元为止,最小模块单元即为一个函数。C程序由多个函数构成。每个函数可以单独放在一个文件中,也可以将若干个功能相关的函数放在一个文件中,C语言程序可以由多个文件组成,文件负责组织存放若干函数。
(2)源程序文件是C程序的编译单位,每个文件单独编译,便于调试,方便团队开发。
(3)main函数是程序执行的入口,main函数可以调用其他函数,其他函数调用结束后要返回main函数,main函数执行完毕,整个程序就结束了。
(4)main函数可以出现在任何位置,其他函数的位置也不是强制的,每个函数有且仅有一个main函数。
(5)C程序的所有函数都是平行定义的,在一个函数内部不允许定义另外的函数,函数可以互相调用,也可以调用自己,但是不能调用main函数。
10.2 函数定义和分类
10.2.1 函数定义
函数定义的一般形式:
1.无参函数的一般形式:
类型说明符 函数名()
{
声明部分;
执行语句部分;
}
例:输出当前时间。
#include
#include
/*showTime函数返回1979年1月1日0时0分0秒到当前的秒数*/
long showTime()
{
long lct;
lct=time(0); /*time(0)返回1979年1月1日0时0分0秒到当前的秒数*/
return lct;
}
int main()
{
long lCurTime=showTime();
printf("%ld",lCurTime);
return 0;
}
函数由函数首部和函数体两部分构成。
(1)函数首部
函数首部包括类型说明符、函数名、形式参数。类型说明符指明了函数的类型,函数的类型实际上是函数返回值的类型。函数名是由用户自定义的标识符,函数名后有一个括号,无参函数的函数名括号中没有参数,但括号不可少。
(2)函数体
{}中的内容称为函数体。函数体包括声明部分和执行语句部分。声明部分对函数体内部用到的变量和函数的类型进行声明,执行语句部分是函数对数据进行加工完成函数功能的部分。
2.有参函数的一般形式:
类型说明符 函数名(形式参数表)
{
声明部分;
执行语句部分;
}
有参函数比无参函数多了形式参数表,形式参数表的格式为:
类型1 形参变量1,类型2 形参变量2,类型3 形参变量3,···,类型n 形参变量n
形参表中的变量称为形式参数,各参数之间用逗号间隔。在进行函数调用时,主调函数赋予形参实际的值。形参是变量,必须给以类型说明。
10.2.2 函数分类
从函数定义的角度看,函数可分为库函数和用户自定义函数。
(1)库函数:由C系统提供,用户无需定义,也不必在程序中作类型说明,只需在程序前包含该函数原型的头文件即可在程序中直接调用。如printf、scanf、sqrt等。
(2)用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,通常在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。被调函数与主调函数在同一文件中且被调函数在主调函数之前定义,可以不进行类型声明。
C语言的函数兼有其他语言中的函数和过程两种功能,可把函数分为有返回值函数和无返回值函数两种。
(1)有返回值函数:有返回值函数被调用执行完后向调用者返回一个执行结果,称为函数返回值。用户定义的需要返回函数值的函数,必须在函数定义和函数说明中明确返回值类型。
(2)无返回值函数:无返回值函数用于完成特定的处理任务,执行完成后不向调用者返回函数值。这类函数类似于其他语言的过程。用户定义无返回值函数时可指定函数的返回为“空类型”,空类型说明符为void。
例:输出当前时间。
#include
#include
/*showTime函数返回1979年1月1日0时0分0秒到当前的秒数*/
void showTime()
{
long lct;
lct=time(0); /*time(0)返回1979年1月1日0时0分0秒到当前的秒数*/
printf("%ld",lct);
}
int main()
{
showTime();
return 0;
}
9.第九章 数组.txt
第九章 数组
9.1 理解数组
C语言数组是一个由若干同类型数据组成的集合,数组由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素。
9.2 一维数组
9.2.1 一维数组定义
定义形式: 类型说明符 数组名[常量表达式]
类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度,数组中每个成员称为数组元素。
对于数组的说明:
(1)类型说明符实际上是指数组元素的类型。
(2)数组名实际上就是第一个元素的地址,是一个常量。
(3)方括号中常量表达式表示数组元素的个数,可以是符号常量。因为数组和一般变量的空间在编译阶段分配,而变量的值在运行时才获得,编译时并不知道变量的值,因此不能用变量定义数组的大小。
(4)数组占用空间大小的计算,可以用sizeof运算符。数组总字节数=sizeof(类型说明符)*数组长度=sizeof(数组名)。
9.2.2 一维数组引用
数组元素的的标识方法为数组名后跟下标。引用数组元素的一般形式为:数组名[下标]。下标只能为整型常量、整型变量、整型表达式。
每个数组元素和变量一样,可以进行读写、输入输出操作等。
数组定义的方括号中给出的是数组长度,只能是常量。数组元素引用中的下标是元素在数组中位置的标识,可以是整型常量、整型变量、整型表达式。
注意:
(1)使用具有N个元素的数组时,引用下标为0~N-1,第一个元素为数组名[0],最后一个元素为数组名[N-1]。数组名代表起始地址,下标代表从起始地址开始偏移几个元素,第一个元素偏移0,第N个元素偏移N-1,下标为N-1。
(2)引用数组元素下标越界时,运行并不报错(因为检查是否越界占用系统时间,C语言崇尚高效),但越界使用可能破坏其他数据。
(3)C语言中只能单个的使用下标标识每个数组元素。
用循环语句输入、输出数组元素的值:
int iArr[5];
for(i=0;i<5;i++)
scanf("%d",&iArr;);
for(i=0;i<5;i++)
printf("%d",iArr[i]);
对元素分别赋值1,2,3,4,5
int iArr[5];
for(i=0;i<5;i++)
iArr[i]=i+1;
(4)数组定义后若不给元素赋值,则值由编译器指定无意义的数据。
9.2.3 一维数组初始化
给数组赋值有两种方法:赋值语句对数组元素逐个赋值,初始化赋值。初始化赋值指在数组定义时给数组元素赋予初值。
数组初始化是在编译阶段进行的,可以减少运行时间,提高效率。
初始化赋值的形式:
类型说明符 数组名[常量表达式]={值1,值2,···,值n};
对数组初始化赋值的说明:
(1)可以只给部分元素赋初值,当{}中值的个数少于元素个数时,只给前面部分元素赋初值,未赋值的元素会赋予与数组元素类型相关的特定值,整型为0,浮点型为0.0,字符型为'\0'。
补充说明:字符'0'和'\0'区别:
字符'0':ASCII码为48,内存中存放表示:00110000。
字符'\0' :ASCII码为0,表示一个字符串结束的标志。这是转义字符(整体视为一个字符)。由于内存中存储字符,存储的是对应字符集的字符编码,所以内存中的表现形式为00000000。
(2)只能给元素逐个赋值。如给5个元素全部赋初值1,要写成:
int iA[5]={1,1,1,1,1};
(3)如果给元素全部赋值,可以不给出数组长度(即数组元素的个数)。
9.2.4 一维数组案例分析
例:把一个整数插入到已经按照从小到大顺序排好序的整型数组中,使得整型数组依然有序。
【问题分析】
8.第八章 循环结构.txt
第八章 循环结构
8.1 理解循环结构
用程序解决循环问题时,为了正确设计循环结构主要思考这些问题:
(1)需要重复哪些步骤,即循环体中包含哪些操作。
(2)对于循环次数能确定的,通常使用计数器控制循环。
(3)循环次数不确定时,利用标记控制循环,使循环不会无限次执行。
(4)如何修改条件,使循环条件的值趋于0。
8.2 循环语句
C程序用while语句、do-while语句、for语句实现循环结构。
8.2.1 while语句
while语句实现当型循环,一般形式:
while(表达式)
{
循环体语句;
}
执行该语句时先求解表达式,根据其值判断是否执行循环体。若表达式值为逻辑真(非0),执行循环体,结束一轮循环后再次计算表达式,若值为真再次执行循环体。重复以上操作,直到表达式值为假(值为0),则结束循环,执行花括号后面的语句。
使用while语句实现循环结构,算法通常为:
(1)在循环结构外设置条件变量,即为与循环条件相关的变量赋值;
(2)测试循环条件,决定是否执行循环体,若其值为假结束循环;
(3)执行循环体;
(4)更新条件变量的值;
(5)重复(2)(3)(4)。
例:用while语句实现求1~100的和。
#include
int main()
{
int sum=0, /*累加和*/
i=1; /*计数器*/
while(i<=100) /*循环条件*/
{
sum+=i;
i++; /*修改条件变量*/
}
printf("sum=%d\n",sum);
return 0;
}
运行结果:
sum=5050
8.2.2 do=while语句
do-while语句实现直到型循环,一般形式:
do{
循环体语句;
}while(表达式);
执行该语句时先执行一次循环体,然后判断表达式值是否为真,若为真继续执行循环体,直到表达式值为假,则结束循环,执行花括号后的语句。
例:用do-while语句实现求1~100的和。
#include
int main()
{
int sum=0,i=1;
do{
sum+=i;
i++;
}while(i<=100); /*注意不要忘记分号;*/
printf("sum=%d\n",sum);
return 0;
}
注意:
(1)do-while语句圆括号后用分号结束,while语句圆括号后不能有分号,否则产生逻辑错误导致循环体为空,无法修改循环条件,造成无限循环。
(2)while语句循环体为1条语句时可省略{},但好的习惯是不缺省{}。
8.2.3 for语句
for语句时C程序中使用最广泛和最灵活的循环语句,一般形式:
for(表达式1;表达式2;表达式3)
{
循环体语句;
}
for语句执行过程:
(1)执行表达式1;
7.第七章 选择结构.txt
第七章 选择结构
7.1 理解选择结构
(1)if语句及if-else语句
(2)switch语句
(3)条件表达式语句
(4)goto语句
7.2 简单分支语句
7.2.1 单分支if语句
基本形式:
if(表达式)
{
语句块;
}
表达式值为逻辑真(ture,非0),执行语句块;否则,表达式值为逻辑假(false,为0),不执行语句块。
7.2.2 双分支if-else语句
基本形式:
if(表达式)
{
语句1;
}
else
{
语句2;
}
表达式值为逻辑真(ture,非0),执行语句1;否则,表达式值为逻辑假(false,为0),执行语句2。
7.3 多分支语句
7.3.1 嵌套if语句
1.嵌套语句的形式
嵌套if-else语句形式
if(表达式1)
{
if(表达式2)
{
语句1;
}
else
{
语句2;
}
}
else
{
if(表达式3)
{
语句3;
}
else
{
语句4;
}
}
该嵌套语句等价下面4个if语句:
if(表达式1&&表达式2) {语句1}
if(表达式1&&!表达式2) {语句1}
if(!表达式1&&表达式3) {语句1}
if(!表达式1&&!表达式3){语句1}
例:求一元二次方程a*x*x+b*x+c=0的根
#include
#include
int main()
{
float a,b,c,disc,x1,x2;
printf("Input coefficents of equation:\n");
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
if(a==0)
{
printf("Not a quodratic!\n ");
}
else
{
disc=b*b-4*a*c;
if(disc==0)
{
printf("Two equal roots:%.2f\n",-b/(2*a));
}
else
{
if(disc>0)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("x1=%.2f x2=%.2f\n",x1,x2);
}
else
{
printf("No real roots!\n");
}
}
}
return 0;
}
2.if-else配对问题
C语言规定,else总是与它最接近且未配对的if语句配对。
7.3.2 多分支else if语句
一般形式:
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
·
·
·
else if(表达式3)
{
语句3;
}
else
{
语句
}
例:求一元二次方程a*x*x+b*x+c=0的根,并能计算方程的复数根。
#include
#include
int main()
{
double a,b,c,disc,x1,x2,realPart,imagPart;
printf("输入方程系数:\n");
scanf("a=%lf b=%lf c=%lf",&a,&b,&c);
disc=b*b-4*a*c;
if(fabs(a)<=1e-6) /*if(a==0)*/
printf("不是一元二次方程!\n ");
else if(fabs(disc)0)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("有两个不等实根:x1=%.2f x2=%.2f\n",x1,x2);
}
else
{
realPart=-b/(2*a);
imagPart=(sqrt(-disc))/(2*a);
printf("有两个虚根:x1=%.2f+%.2fi x2=%.2f-%.2fi\n",realPart,imagPart,realPart,imagPart);
}
return 0;
}
运行结果:
输入方程系数:
a=1 b=1 c=1
有两个虚根:x1=-0.50+1.73i x2=-0.50-1.73i
注:由于计算机不能精确表示所有实数,因此最好不使用运算符==直接判断两个实数的关系,而是求两者差的绝对值是否足够小来判断相等关系。如对于double a判断a==0表示为fabs(a)<=1e-6
7.3.3 switch语句
一般形式:
switch(表达式)
{
case 标号1:语句1;break;
case 标号2:语句2;break;
·
·
·
case 标号n:语句n;break;
default:语句n+1;
}
语句执行过程为:先计算表达式的值,将其与每个case后的标号值比较,当和某个标号值相匹配时,执行该case分支对应的语句,若所有标号值都不能与其匹配,执行default分支的语句。
例:
enum weather{sunny,cloudy,rainy};
enum weather toaday=cloudy;
switch(today)
{
case 0:printf("wear a T-shirt and a cap\n");break;
case 1:printf("wear a T-shirt and a jacket");break;
case 2:printf("bring an umbrella\n");break;
default:printf("whatever\n");
}
weather为枚举类型,today为枚举类型weather的变量,其值只能为枚举型常量sunny、cloudy、rainy中的一个,分别代表数值0、1、2。使用枚举类型可用标识符表示整数值。switch的圆括号中是用于判断的表达式,这里为枚举类型变量today,值为枚举型常量cloudy,具有整型值1,与case后的标号依次匹配,发现与第2个标号相等,执行case 1分支的语句。break作用是跳出当前选择结构,执行switch语句后的代码。若没有break语句,该代码段输出结果为:
wear a T-shirt and a jacket
bring an umbrella
whatever
使用switch语句时注意:
括号中的表达式应具有整型值,
6.第六章 运算符与表达式.txt
第六章 运算符与表达式
C运算符的分类:
算术运算符:+、-、*、/、%、++、--
关系运算符;>、=、<=
逻辑运算符:&&、||、!
位操作运算符:位与&、位或|、位非~、位异或^、左移<>
赋值运算符:=、复合算术运算赋值(+=、-=、*=、/=、%=)、复合位运算赋值(&=、|=、^=、<>=)
条件运算符:?:
逗号运算符:,
指针运算符:取地址&、取内容*
求字节数运算符:sizeof
其他运算符:()、下标[]、成员运算符(->、.)
6.1 概述
按运算符连接操作数分三类:
1.单目运算符:又称一元运算符,即只有一个操作数的运算符。负号-、正号+、自增++、自减--、非!、sizeof、指针运算符、部分位操作运算符。
2.双目运算符:又称二元运算符,连接两个操作数。大部分运算符属于此类。
3.三目运算符:连接三个操作数。C语言中唯一的三目运算符为条件运算符(?:)。
运算符有优先级和结合性。运算先后顺序受运算符的优先级和结合性制约。
表达式由常量、变量、函数和运算符组成。单个常量、变量、函数调用形式可看作表达式的特例,称为初等表达式。运算符左边的操作数称为左操作数,右边的叫右操作数。
6.2 算术运算
1.整数运算
加减乘除运算、单目运算符负号-将整数符号取反。求余运算符%计算整数相除所得的余数,如11%4为11/4的余数3。
a.整数运算结果为整数。整数相除返回整数部分,舍去小数部分,编译器不同舍入方法不同。11/4结果是2,1/3结果为0,1/5*5结果不为1。
b.除法运算中除数不能为0,求模运算操作数必须为整型,因此不能进行除零和模零运算。
c.运算符的执行顺序由优先级决定,单目运算符负号-优先级高于加减乘除,乘除优先级高于加减。
可以用括号运算符标明或改变计算顺序,括号中的表达式总是先执行。四则运算符为左结合。
2.实数运算:实数运算的结果为实型。
3.字符运算
5.第五章 数据类型与输入输出.txt
第五章 数据类型与输入输出
5.1C语言要素
5.1.1字符集
字符用于组成标识符、字符串、表达式。C语言能够识别的字符有以下几类。
1.字母:A~Z,a~z
2.数字:0~9
3.特殊字符。29个图形字符(英语键盘上除开·@、$和中文标点):+ - * / % = ! & | ^ ~ _ . ( ) [ ] { } ? : ; , "" '' # \
4.空白符。空格符(ASCII码:0x20)、回车符\r、换行符\n、换页符\f、横向制表符\t、纵向制表符\v
注:ANSI C引入三元字符,为某些非英语键盘没有的字符提供输入方法,三元字符由两个问号和一个其他字符构成。
5.1.2标识符与关键字
C语言使用的词分为标识符、关键字、运算符、分隔符、常量、注释六类。
1.标识符
4.第四章 算法描述和编码规范.txt
4.1 程序设计与算法描述
4.1.1 程序设计与算法
编写程序时,首先考虑解决问题思路并描述出来,然后画流程图,最后编写代码。没有算法描述和流程图就编写代码如同盖房子没有图纸。
1.算法的概念。为解决一个问题而采取的方法和步骤,称为算法。或者说算法是解决一个问题的方法的精确描述。
2.算法的特点。
(1)有穷性:必须在执行了有穷个计算步骤后终止。
(2)确定性:每一个步骤必须是精确性的、无二义性的。
(3)可行性:可以用计算机解决,能在有限步、有限时间内完成。
(4)有输入。
(5)有输出。
例:交换两个大小相同的杯子中的液体(A水、B酒)。
算法:(1)再找一个与A大小相同空杯子C;(2)A→C;(3)B→A;(4)C→B。
例:输入一个整数,打印其绝对值。
3.第三章 数据结构.txt
结构化程序设计的首创者是Wirth,他提出一个公式:数据结构+算法=程序,因此获得图灵奖。该公式揭秘了程序的两个基本要素,数据结构(data structure)是对数据的描述,算法即为操作步骤。
3.1 数组
抛砖引玉 例1:求N门课程的平均成绩。
#include
#define N 5 /*课程数目*/
int main()
{
int aGrade[N]; /*成绩数组*/
int i=0; /*计数器*/
float iSum=0; /*N门课程成绩和*/
printf("Input %d grade:",N);
while(i<N) /*遍历数组*/
{
scanf("%d",&aGrade;[i]); /*输入数组元素值*/
iSum+=aGrade[i];
++i;
}
printf("average=%.2f\n",iSum/N);
return 0;
}
运行结果:
Input 5 grade:87 74 66 91 56
average=74.80
1.数组的定义。定义数组时要指定数组的大小和类型。类型即为数组中数据的类型,方括号[]中必须是正整型常量,表示数组的长度,即包含多少个数据。
2.数组的引用。数组中的每个数据称为数组元素,aGrade[i]表示数组的第i+1个元素。引用数组元素时[]中的整数称为下标,可为整型常量或变量,下标范围为0~N-1。数组元素的使用像变量一样,可通过运算符进行各种运算,也可作为参数实现输入输出操作。
乘胜追击 例2:求5个学生的最高成绩和最低成绩。……
2.第二章 结构化程序设计初探.txt
2.1 重复与循环语句
抛砖引玉 例1:求多门课程的总成绩。
#include
#define N 5 /*课程数目*/
int main()
{
int iGrade=0; /*考试成绩*/
int iSum=0; /*总成绩*/
int iCounter=0; /*计数器*/
while(iCounter<N) /*计数器控制循环*/
{
iCounter=iCounter+1;
printf("Input grade%d:",iCounter);
scanf("%d",&iGrade;);
iSum=iSum+iGrade; /*累加成绩*/
}
printf("Sum=%d",iSum);
return 0;
}
运行结果:
Input gradel:78
Input grade2:82
Input grade3:79
Input grade4:88
Input grade5:90
Sum=417
1.循环的概念。为解决某一问题或计算某一计算结果,在满足特定条件的情况下重复执行一组操作。C语言中循环结构一般由while、do…while和for语句实现。
2.while语句。while语句圆括号()中的表达式是进行循环操作的条件,值为真时执行循环体,然后再判断条件表达式的值,若为真重复执行循环体,条件表达式值为假(0)时,循环结束。
3.计数器与循环条件。一般将iCounter这种整型变量称为计数器。计数器在执行次数确定的循环结构中常用于构造循环条件。设计循环结构时要保证循环执行次数有限,不能使其无限循环下去。循环是有条件的循环,要谨慎设计循环条件,并在循环体中适当修改相关变量的值,使循环条件的值趋于0。
乘胜追击 例2:求n门课的平均成绩。……
1.第一章 数据的基本操作.txt
第一章 数据的基本操作
1.1 数据的存储与输出
抛砖引玉 :1:指定并输出阿Q的C语言成绩。
#include /*引入库函数*/
int main() /*主函数*/
{
int iScore; /*定义整型变量存放成绩*/
iScore=92; /*将92赋值给变量iScore*/
printf("阿Q的C语言成绩:"); /*输出一串字符*/
printf("%d\n",iScore); /*输出成绩*/
return 0; /*结束函数,返回0*/
}
运行结果:
阿Q的C语言成绩:92
1.变量的概念
变量是程序中存储数据的基本单位,每个变量都有类型、名字和值,为了将数据正确地存储在内存中必须选择合适的类型,好比将物品保存起来需要选择合适的容器,既能装下物品又不浪费空间。变量的名字是识别该数据的标识符,变量的值在程序运行过程中可以被改变。
2.输出函数printf()
printf函数能将其参数按照指定的格式输出,方便程序员或程序用户直观地观测内存中存储的二进制数据,该函数还可以直接输出引号中的字符串。
乘胜追击 例2:输出阿Q的年龄和身高。……
第二章顺序表练习.txt
从顺序表中删除具有最小值的元素并由函数返回被删元素的值,空出的位置由最后一个元素填补。
从顺序表中删除具有给定值x的所有元素。
从有序顺序表中删除其值在给定值s与t之间(s<t)的所有元素。
C语言常用头文件、位运算、SetConsoleTextAttribute()函数.docx
头文件
stdio.h
scanf、printf
getchar、putchar
gets、puts
stdlib.h
rand()%a+b:产生0~32767的随机数,a为范围,b为范围起始值,即产生b~b+a-1的随机数。
srand(随机种子):如srand(time(0))。
malloc(8)、calloc(10,sizeof(int))、realloc(指针变量,字节数)、free(fp)
exit()
time.h
time(0)与time(NULL)作为随机种子。
string.h
strlen("car")//返回值为3
strcat(cArr,"China")//char cArr[20]="I love ",调用后cArr为I love China
strcpy(cArr,"China")//char cArr[20]="I love ",调用后cArr为China
strcmp("ab","ac")//返回值小于0(-1)
strstr(const char *pc1, const char *pc2)//返回pc1指向的字符串中第一次出现pc2指向的字符串的地址
ctype.h
isalpha(字符):不是字母时返回值为1
tolower(大写字母字符):将大写字母转换为小写字母
conio.h
getch()
2019年北航软院991真题.pdf
991数据结构与C语言程序设计真题
北京航空航天大学2019年
硕士研究生招生考试初试试题科目代码 901数据结构与C语言程序设计(共7页)
考生注意:所有答题务必书写在考场提供的答题纸上,写在本试题单上的答题一律无效(本题单不参与阅卷)。
一、单项选择题(本题共20分,每小题各2分)
1,设n为某问题的规模。若某算法的时间复杂度为0(n),则表示该算法的A.执行时间为n:B.执行时间为n;C.执行时间与n2呈正比关系;D.执行时间与n无关。
2,对于长度为n的非空线性表,下列4种操作中,在顺序表上实现比在链表上实现时间效率更高的是-
A.输出表中第i个数据元素的值(sisn)
B.依次输出表