第1页:大学计算机—计算的思想和方法课程封面
《大学计算机—计算的思想和方法》课程封面,标示教材名称、第3版与编著者信息。
第2页:课程简介
- 课程定位核心通识课,计算机基础教学公共核心基础课程
- 授课对象非计算机专业本科生
- 教学目标
- 深入理解计算科学在科学研究和知识创新中的地位和作用。
- 全面培养个人的信息素养和计算思维能力。
- 了解计算发展的基本过程,理解发展中的主要发明
- 掌握问题求解的一般思想和方法,理解常用的问题求解算法。
- 理解数据的概念,理解数据结构的含义和作用
- 理解计算机程序、计算机程序设计语言的概念,理解程序编写和程序运行的基本内涵
- 理解通信和计算机网路的思想,了解常用的网络设备及其功能,理解主要的互联网应用
- 了解目前计算机学科的发展前沿,体会学科交叉在科研中的价值和意义
- 第1章绪论
- 第2章计算与计算机
- 第3章问题求解与算法
- 第4章数据与数据结构
- 第5章计算机程序
- 第6章计算机网络
- 第7章计算科学前沿
第3页:第5章 计算机程序
- 5.1 计算机程序概述
- 5.2 C/C++程序设计语言
- 5.3 类与对象
- 5.4 数据存储与管理
- 5.5 Web应用
知识要点:计算机程序,编译型程序,解释型程序,计算机程序设计语言,机器语言汇编语言高级语言软件开发环境,程序编译,程序连接,函数库,动态连接库(DLL)
第4页:5.1 计算机程序概述
- 计算机程序及其分类
- 程序设计语言
- 程序设计语言的分类
- 程序设计语言与编程思想
- 常见计算机程序设计语言
- 计算机软件系统开发
第5页:计算机程序及其分类
- 计算机程序,是指用户为了达到某种目的而编写的可以控制计算机运行的一组指令序列。
- 程序的分类
- 按源程序能否直接运行分类
- 按程序运行环境分类
- Dos程序、Windows程序、Unix程序、Linux程序,以及MacOS程序,Android程序等
- 虚拟机运行环境,如Java程序
- Web程序
第6页:程序设计语言
- 程序设计语言(Programming Language),就是用于编写计算机程序的语言,由一组基本符号和一组语法规则构成。
- 基本符号定义了程序中能够出现的字符和词汇,并赋予它们特定的含义。
- 语法规则定义了构成程序的基本符号、符号之间的组合规则,这些规则可以描述数据及其操作,以及各种程序语句及程序流程控制。
- 程序设计语言的分类
第7页:程序设计语言与编程思想
- 软件危机,20世纪60年代末,出现了软件工程的概念
- 结构化编程思想
- 如果问题比较复杂,将问题分解为几个相对简单的子问题,如果某个子问题还比较复杂,进一步划分,直到分解后的每个问题都是相对简单的。
- 1970年,出现了第一个结构化程序设计语言Pascal。
- 面向对象编程(Object Oriented Programming,OOP)
- 20世纪80年代
- 数据和操作的封装,消息映射在事件和函数之间进行关联
- 降低了函数的偶合度,提高系统的可扩充性和代码重用的层次,极大的增强了软件系统的可扩展性和灵活性。
第8页:高级程序设计语言的发展
- 1951年,美国IBM公司的约翰·贝克斯[1]针对汇编语言的缺点着手研究开发一种新的计算机程序设计语言,这就是FORTRAN语言
- LISP语言(1958年)、ALGOL语言(1958年)、COBOL语言(1959年),Basic(1964)
- 20世纪70年代
- Pascal(1971)
- C语言(1972年)、Smalltalk语言(1972年)、Prolog语言(1972年)
- 20世纪80年代
- C++语言(1980年)
- Ada语言(1983年)
- Perl(1987)
- 20世纪90年代
- Python(1991年)、可视化编程语言VisualBasic(1991年)、具有跨平台特征的面向对象语言Java(1995年)、Delphi(1995年)、C#(2001年)
第9页:常见计算机程序设计语言
本页主体为图片内容,文字版要点待对照原课件补充。
第10页:计算机软件系统开发
- 软件开发的基本步骤
- 需求分析
- 系统设计,包括功能设计、用户界面设计、算法设计、数据库设计等
- 系统实施
- 系统测试
- 运行和维护
- 软件开发环境
第11页:程序的编译连接和运行
本页主体为图片内容,文字版要点待对照原课件补充。
第12页:5.1 计算机程序概述
- 5.1 计算机程序概述
- 5.2 C/C++程序设计语言
- 5.3 类与对象
- 5.4 数据存储与管理
- 5.5 Web应用
知识要点:c语言,c程序结构,c语言字符集,转义字符,关键字(保留字),标识符,数据类型,定点数,浮点数,运算符,表达式,赋值语句,输入/输出语句,分支语句,重复语句,构造类型,类型定义,结构化编程,函数,局部变量,全局变量。
第13页:5.2 C/C++程序设计语言
- C语言及C程序结构
- C语言基本符号
- 数据与数据类型
- 运算符与表达式
- 赋值语句和输入/输出
- 分支语句
- 循环控制语句
- 函数
第14页:高级程序设计语言的发展
- 1950年代由John Backus领导的一个小组研制的FORTRAN语言,从此揭开了计算机高级程序设计语言发展的序幕。
- 20世纪50年代后期,ALGOL语言、COBOL语言相继问世
- 在60年代的十年间,人们研制了多达200种的高级程序设计语言,包括Basic
- 20世纪70年代,Pascal语言问世
- 在Pascal基础上,Ada语言问世
第15页:C语言的产生和发展
- 在ALGOL 60的基础上,1963年英国剑桥大学推出了CPL(Combined Programming Langurage)语言
- 1970年美国贝尔实验室的肯·汤普逊以BCPL语言为基础,作了进一步的简化,设计出了简单且接近硬件的B语言(取BCPL的第一个字母),并用B语言写出了第一个UNIX操作系统。
- 1972年至1973年间,美国贝尔实验室的丹尼斯•里奇(Dennis Ritchie)在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
第16页:Ken Thompson
- 肯·汤普逊(Kenneth Lane Thompson,1943年2月4日-),一般称之为Ken Thompson,为美国计算机科学学者,与丹尼斯·里奇共同发明了Unix和C语言,于1983年共同获得图灵奖,理由是他们“研究发展了通用的操作系统理论,尤其是实现了UNIX操作系统”。
- 后门,
- 装了UNIX的PDP-11最早被安装在Bell Lab里供大家日常使用。Bell Lab里的科学家发现Ken总是具有最高权限,分析了UNIX代码,找到后门,修改代码,然后重新编译了整个UNIX。他们发现Ken还是轻而易举地拿到他们的帐户权限。
- 14年,直到Ken道出个中缘由。原来,代码里的确有后门,但后门不在Unix代码里,而在编译Unix代码的C编译器里。每次C编译器编译UNIX的代码,就自动生成后门代码。而整个Bell Lab的人,都是用Ken的C编译器无法显示该图片。
第17页:Dennis Ritchie
- 丹尼斯·里奇(Dennis Ritchie,1941年9月9日~2011年10月9日),美国计算机科学家,对C语言和其他编程语言、Multics和Unix等操作系统的发展做出了巨大贡献,1983年同KenThompson一起获得图灵奖。
- 1978年与布莱恩·科尔尼干(Brian W.Kernighan)一起出版了名著《The CProgramming Language》,成为C语言方面最权威的教材之一。无法显示该图片。
第18页:C程序结构
- 一个简单的C程序
- #include <stdio.h>
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //计算一个正整数n的阶乘,并返回该阶乘
- int fact(int n)
- {
- int i,res=1;
- for (i=1;i<=n;i++)
- res *= i;
- return res;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //输入一个正整数,求它的阶乘,并输出
- main()
- {
- int x,y;
第19页:C语言基本符号
- 字符表
- 基本字符
- 转义字符,不可打印的字符,它以反斜线字符“\”开始
- \r表示回车(CR),将当前位置移到本行开头,ASCII值为13;\n表示换行(LF),将当前位置移到下一行开头,ASCII值为10
- 运算符号
- 关键字(保留字)
- 标识符
- 注释
- 形式上:单行注释和多行注释
- 功能上:序言性注释和描述性注释
第20页:ANSI C语言关键字列表(1)
ANSI C语言关键字列表(1)
本页主体为图片内容,文字版要点待对照原课件补充。
第21页:ANSI C语言关键字列表(2)
ANSI C语言关键字列表(2)
本页主体为图片内容,文字版要点待对照原课件补充。
第22页:ANSI C语言关键字列表(3)
ANSI C语言关键字列表(3)
本页主体为图片内容,文字版要点待对照原课件补充。
第23页:数据与数据类型
- 常量
- 直接常量(又称字面常量)和符号常量
- 符号常量定义
- #define <常量名>常量
- 例如:#define PI 3.14
- 为什么要定义常量?
- 变量
- 变量定义
- auto | static | register | extern <类型> <变量名表>;
- 例如:int a,b;
第24页:数据类型
第25页:字符类型
- 类型名为char
- 可打印字符
- 转义字符,ASCII码字符集中不可打印的控制字符和特定功能的字符
第26页:整数类型
- C标准将整数类型分成有符号整数和无符号整数
- 每一种整数,又分成标准整型(int)、短整型(short)和长整型(long)。
第27页:实数类型
本页主体为图片内容,文字版要点待对照原课件补充。
第28页:枚举类型
- 当一个变量的取值仅有少数几种可能时,可以使用枚举类型。
- 枚举类型定义的一般形式
- enmu <枚举类型名> {<枚举常量表>};
- 举例:enum weekday {sun,mon,tue,wed,thu,fri,sat};
- 定义该类型的变量
- enum weekday workday,freeday;
- 说明
- 枚举元素均为常量,不能当作变量赋值。
- 枚举元素作为常量,从左到右对应的序号值为0,1,2,…。
- 枚举元素的值(序号)可由用户指定,如:enum weekday{sun=7,mon=1,tue,wed, thu,fri,sat};
- 枚举类型数据可以作关系运算。
- 不能将一个整数赋给枚举类型变量
第29页:数组
- 数组是由固定数量的、相同类型的元素构成,数组类型是一种构造数据类型。
- 数组元素在内存中占用连续的存储空间
- 数组有一维数组、二维数组和多维数组。
第30页:一维数组
- 定义的一般形式
- 数组元素
- 变量说明时可以初始化
- int x[10] = {21,16,55,106,75,80,92,31,100,11};
- int x[10] = {21,16, ,106,75}
- int a[] = {50,28,31,56,11,66};
第31页:二维数组
- 如果一维数组的元素类型为数组类型,即构成二维数组。
- 二维数组定义的一般形式
- <类型标识符> <数组变量名>[常量表达式] [常量表达式]
- int xx[3][2];说明一个3
- 2的整数数组,分3行2列共6个元素。
- 元素的引用
- 初始化
- int x[3][2] = {{21,16},{55,106},{75,80}}
- 对数组中的部分元素赋初值,如:int x[3][2] = {{21},{,106},{75}}
第32页:字符数组
- 元素类型为字符(char)类型的数组为字符数组。字符数组具有许多其它类型的数组不具有的特性
- 在字符数组初始化时,若字符个数小于数组长度,则未赋值元素自动定为空字符(‘\0’)
- 在C语言中,将字符串作为字符数组处理,每个字符串的结尾都隐式的包含一个字符串结束标志('\0')。例如"Hello World"共11个字符,但在内存中占12个字节。
第33页:结构体
- 结构体是一种构造型数据类型,一般是由前面的简单类型(又称基本类型)数据构造而成。主要用于描述具有多个属性的数据对象,如一个学生(包括姓名、性别、出生年月等属性)。
- 声明结构体类型的一般形式为
第34页:结构体举例
结构体举例
本页主体为图片内容,文字版要点待对照原课件补充。
第35页:结构体变量的操作
- 对于结构体,对成员的访问是通过结构体变量名和成员名完成
- 一般形式
- 举例
第36页:指针类型
- 指针可以看作是内存地址
- 指针类型变量定义的一般形式
- 内存空间
- 用户不能直接为一个指针变量赋值,但可以将一个变量的地址赋给指针变量,或者通过malloc函数为指针变量申请内存空间,或者将一个指针变量的赋给另一个指针变量
- int *p1,*p2,*p3;
- int x;
- 下列语句是正确的:
- p1=(int *)malloc(sizeof(int));
- p2= &x;
- p3= p1;
- 指针变量的值和地址内的值概念不同,指针变量的值为地址。
第37页:类型定义
- 用户可以为一个构造型数据类型的定义命名,一般形式
- 举例1:
- typedef float Dollars;
- Dollars salary,fee;
- 举例2:
- typedef struct d{
- int year;
- int month;
- int day;
- } MyDate;
第38页:运算符
- 算术运算符
- 加法(+)、减法(-)和乘法(*)
- 整除(/)、模除(%)
- 关系运算符
- 逻辑运算符
- &&(逻辑与),||(逻辑或)和!(逻辑非),
- 运算结果为True(非0值)或False(0值)。
- 自增、自减运算符
- i++,i--(在使用i之后,将i的值加1或减1)
- ++i,--i(在使用i之前,将i的值加1或减1)
- 强制类型转换
- (<类型名>)(表达式)
- 例如(double) x将x转换成double类型
第39页:表达式
- 表达式是指常量、变量、函数、运算符和括号连接而成的式子
- 表达式的分类
- 算术表达式(结果为整数、实数)
- 字符表达式(结果为字符,或字符串)
- 逻辑表达式(结果为True或False,在C语言中,0代表False,非0的数代表True)。
第40页:赋值运算符(=)和赋值表达式
- 赋值运算
- 将一个表达式的值赋给一个变量
- <变量名> = <表达式>
- 赋值表达式
- 赋值运算符(=)将一个变量和一个表达式连接而成的式子
- 赋值表达式,表达式都有一个值,如a=5是一个赋值表达式,表达式的值为5(变量a的值也为5)
- 类型转换
- 若等号左边的变量为整数类型,右边表达式为实数类型(float、double和long double),则自动舍弃表达式的小数部分。反之,左边的变量为实数类型,右边表达式为整数类型,则将表达式的值以实数形式存储到变量中。
- 当将一个字符赋给一个整型变量时,将字符的8位值存放到整型变量的低8位,高位字节全0或由字符的最高位决定。反之,将int、short或long int数据赋值给一个char变量时,取整型数据的低8位。
第41页:复合赋值运算符
- 二目(两个操作数)运算符,都可以和赋值号(=)构成复合赋值符。如:+=,-=,*=,/=,<<=,>>=,&=,^=,|=等
- 例如:a += 6等价于a = a+6,x *= (y+1)等价于x =x* (y+1)。
第42页:逗号运算符和逗号表达式
- 逗号运算符
- 逗号表达式
- 计算顺序
- 先计算表达式1,然后计算表达式2,..,表达式n.。逗号表达式的值为表达式n的值。
- 例如,x=(a=1,2*3)的结果为6。
第43页:赋值语句
- 赋值语句的基本功能是为变量赋值。赋值语句由赋值表达式加一个分号构成。
- 一般形式
- 赋值语句的基本功能是将赋值号(=)右边表达式的值赋给左边的变量
- 举例:if ((a=b)>0) c=1;
第44页:输入/输出
输入/输出
本页主体为图片内容,文字版要点待对照原课件补充。
第45页:分支语句(1)
第46页:例5-2
- 输入两个整数x,y,一个字符ch,根据字符ch的值分别对x和y做加(+)、减(-)、乘(*)、除(/)运算,并输出运算结果
- #include <stdio.h>
- void main(void)
- {
- int x,y,z;
- char ch;
- scanf("%d%d%c",&x,&y,&ch);
- if (ch=='+')
- z=x+y;
- if (ch=='-')
- z=x-y;
- if (ch=='*')
- z=x*y;
- if (ch=='/')
- z=x/y;
- printf("z=%d",z);
- }
第47页:分支语句(2)
- if-else语句
- 一般形式
- if (<表达式>)
- <语句1>;
- else
- <语句2>;
- 逻辑功能
第48页:分支语句(3)
- switch语句
- 一般形式
- switch (<条件表达式>)
- {
- case表达式1:
- 语句1;
- [break;]
- case表达式2:
- 语句2;
- [break;]
- ……
- case表达式n:
- 语句n;
- [break;]
- [default:
- 语句n+1;
- ]
- }
第49页:例5-2b
- scanf("%d%d%c",&x,&y,&ch);
- switch (ch)
- {
- case '+':
- z=x+y;
- break;
- case '-':
- z=x-y;
- break;
- case '*':
- z=x*y;
- break;
- case '/':
- z=x/y;
- break;
- }
- printf("z=%d",z);
第50页:条件运算符
- 条件运算符(?:)
- 逻辑功能
- 计算表达式1的值,如果为真,则条件表达式取表达式2的值,否则取表达式3的值
- 例如if (a<b)min = a;elsemin = b;可以写成下面的条件表达式:min = (a<b) ? a:b
第51页:循环控制语句(1)
第52页:例5-3
- 输入一个正整数,计算正整数的位数。
- #include <stdio.h>
- void main(void)
- {
- int x,width=0;
- scanf("%d",&x);
- while (x>0)
- {
- width++;
- x = x/10;
- }
- printf("wid=%d",width);
- }
第53页:循环控制语句(2)
- do-while语句
- 一般形式
- do {
- 语句(循环体)
- } while(<表达式>);
- 逻辑功能
第54页:例5-4
- 输入一串十六进制字符(0~9,a~f)计算对应的十进制值,并输出。
- #include <stdio.h>
- void main(void)
- {
- char ch;
- int x=0;
- do {
- scanf("%c",&ch);
- if (ch>='0' && ch<='9')
- x= x*16 + ch-'0';
- else
- if (ch>='a' && ch<='f')
- x= x*16 +(ch-'a')+10;
- else
- if (ch>='A' && ch<='F')
- x= x*16 +(ch-'A')+10;
- } while ((ch>='0' && ch<='9') || (ch>='a' && ch<='f') ||(ch>='A' && ch<='F'));
- printf("x=%d",x);
- }
第55页:循环控制语句(3)
- for语句
- 一般形式
- for (表达式1;表达式2;表达式3)
- <语句>;
- 执行过程
- (1)计算表达式1。
- (2)计算表达式2,如果为真,则执行循环体,然后转步骤(3)。否则,结束循环。
- (3)计算表达式3
- (4)无条件转步骤(2)
- (5)循环结束
第56页:例5-5
- 输出杨辉三角形前10行的内容
- 分析
- (1)第i行有i个数字。
- (2)对于每一行的第一个和最后一个数均为1,其他的任何一个数等于上一行对应的数和前面数的和。
第57页:程序代码