530 likes | 701 Views
学习目的. 学习掌握 C 语言的语法结构。 学习结构化程序设计的一般方法,提高分析能力和综合能力。 能够用 C 语言编程解决一些的实际问题。 能通过 NCRE 二级 C 语言考试. 目标. 了解程序设计中的一些基本概念 使用 Visual C++ 6.0 创建 C 程序 掌握 C 语言的数据类型与变量. 程序和程序设计. 一、基本概念 1. 程序( program ) :为解决某一问题而设计的一系列指令,能被计算机识别和执行。 2. 程序设计语言: 人与计算机打交道时交流信息的一类媒介和工具,由 语句( statement ) 组成。.
E N D
学习目的 学习掌握C语言的语法结构。 学习结构化程序设计的一般方法,提高分析能力和综合能力。 能够用C语言编程解决一些的实际问题。 能通过NCRE二级C语言考试
目标 • 了解程序设计中的一些基本概念 • 使用Visual C++ 6.0 创建 C程序 • 掌握C语言的数据类型与变量
程序和程序设计 一、基本概念 1.程序(program):为解决某一问题而设计的一系列指令,能被计算机识别和执行。 2.程序设计语言:人与计算机打交道时交流信息的一类媒介和工具,由语句(statement)组成。
3.机器语言:(machine language)计算机直接使用的二进制形式的程序语言或机器代码。 • 4.汇编语言:(assembler language)一种面向机器的用符号表示的低级程序设计语言。相当于机器指令的助记符号,与机器语言很接近。 • 5.高级语言:(high-level language)是易为人们所理解的完全符号化的程序设计语言。 • 6.源程序:用户用高级语言编写的程序称为,C源程序文件名字后缀一般为“.c“或”cpp”。 • 7.目标程序:由二进制代码组成的程序 • 8.编译程序:具有翻译功能的软件 • 9.连接(linker):将目标模块和其它一些必要的功能模块装配在一起,生成可执行文件,执行程序文件后缀为".exe"。
机器语言 汇编语言 高级语言 特点:二进制表示、面向机器、直接运行。 特点:符号化的机器语言、面向机器、翻译后运行。 特点:类自然语言、面向问题、翻译后运行。 2+3 ADD 2,3 010100100011 2+3
高级语言的编译和执行 可以…我现在可以理解了 哎呀…我理解不了 高级语言程序 高级语言由编译/解释程序转换为机器代码 编译程序/解释程序(编译器/解释器) 这种机器代码计算机可以理解 编译程序/解释程序 机器代码 高级编程语言中的指令 计算机硬件
C 源程序 目标文件 可执行程序 编译和执行C程序 源程序:是用户创建的文件,以“.c”为文件扩展名保存 目标文件:是编译器的输出结果。这类文件的常见扩展名为.obj” 0 1 形式 编译 可执行文件:是连接器的输出结果。可执行文件的扩展名为“.exe”。 头文件:含有函数的声明和预处理语句,用于帮助访问外部定义的函数。头文件的扩展名为“.h”。 连接 C语言函数库
演示下面例题 #include“stdio.h” main() { printf(“Hello,World!”); } 演示:使用Visual C++ 6.0编辑和运行程序的过程
C语言的基本结构 #include <stdio.h> void main() { printf("Hello World\n"); } 以.h为后缀的文件被称为头文件,可以是 C 程序中现成的标准库文件,也可以是自定义的库文件。 以 # 开始的语句称为预处理器指令 在函数定义的后面有一个左大括号,即 { main() 函数是 C 程序处理的起点。 在屏幕上产生一行输出“Hello world”,并换行(\n) 它表示函数的开始,后面是函数的主体 stdio.h文件中包含了有关输入输出语句的函数 #include语句不是必需的,但是,如果程序有该语句,就必须将它放在程序的开始处 main() 函数可以返回一个值,也可以不返回值。如果某个函数没有返回值,那么在它的前面有一个关键字 void 在函数定义的结尾处有一个右大括号,即 } 函数主体中的每个语句都以分号结束。 大括号也可以用于将语句块括起来 C 程序中的一个语句可以跨越多行,并且用分号通知编译器该语句已结束。
C 程序中的注释 /* ************************* 作者: 创建日期: 描述: … … ************************** */ #include <头文件> void main() { … … } /* 此程序由××× 编写 * 用来打印输出“Hello World”*/ 单行注释 多行注释 // 此程序用来打印Hello World #include <stdio.h> void main() { printf("Hello World\n"); } 注释 C 程序可以包含注释,以便向读者作一般说明 在程序中添加注释是一个好的编程习惯,可以增强程序的可读性。 编译器并不处理这些注释
※说明: 1.必须使用main作为主函数名 ,程序是从主函数开始执行,具有唯一性 注意后面不能带“ ;” 2.函数体用左花括号“{”开始,用右花括号结束“}” 3.用分号“;”作为语句结束的标志 注意是语句的结束标志 4.注释部分: ⑴必须用/*和*/括起来 ⑵必须成对出现, ⑶”/“和”*“之间不能有空格 ⑷注释可以出现在程序的任何地方 ⑸注释部分对程序运行不起作用 ⑹在注释之间不可以再嵌套/* */ 5,预处理器指理必须以”#“开头,但不能加分号 / * 此程序由××× 编写 * 用来打印输出/*“Hello World”*/ * / #include <stdio.h>; void main(); { printf("Hello World\n") }
※程序运行: 1.编译:通过菜单栏或微型工具栏(Ctrl+F7); 2.执行:通过菜单栏或微型工具栏(F7); ※VC自动生成文件介绍: 1.Debug文件夹:包含调试生成的信息以及(或者)程序exe文件; 2 .DSP:VC开发环境生成的工程文件,文本格式; 3 .NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。 4 .PLG:编译信息文件,编译时的error和warning信息文件。 5 .OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。
※CL命令(理解程序编译过程): cl.exe命令是VC编译连接的命令行工具,通常VC开发我们是在集成环境中进行编译及其连接(也就是所谓的build),但实际上集成环境中也是通过调用cl.exe进行编译连接的。 1.CL hello.c:同时完成编译和连接功能; 2.分步执行: (1)编译:CL hello.c /p; (2)链接:Link hello.obj。 3.CL hello.c /P 查看预编译内容
整 型 基本类型 单精度型float 实型 双精度型double 字符类型char 数组 短整型short C 数 据 类 型 整型int 结构体struct 构造类型 长整型long 共用体union 枚举类型enum 指针类型 空类型void 定义类型typedef C语言数据类型 本章所介绍的数据类型 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作
标识符、常量和变量 1. 标识符 定义:是程序中引用对象的名称,用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 C语言的关键字不能用作变量名 大小写敏感 长度:有效长度为32个字符。随系统而异,但至少前8个字符有效 命名原则: 变量名和函数名中的英文字母一般用小写,以增加可读性 见名知意 不宜混淆 如l与I, o与0 在TC2.0及BC3.1中,变量名(标识符)的有效长度为1~32个字符,缺省值为32,但在VC中其长度可达到255 .字符非法 数字3不可作首字符 #字符非法 $不可作首字符 >字符非法 char是关键字 • 例:判断下列标识符号合法性 • sum Sum M.D.John day Date 3days • student_name #33 lotus_1_2_3 • char a>b _above $123 M.D.John 3days #33 char a>b $123
C语言的关键字 • 关键字(Keywords)是C语言中的词汇。 • 也称为保留字(Reserved words) • 类型说明 int、long、short、float、double、char、unsigned、signed、const、void、volatile、enum 、struct、union • 语句定义 if、else、goto、switch、case、do、while、for、continue、break、return、default、typedef • 存储类别说明 auto、register、extern、static • 长度运算符 sizeof
标识符、常量和变量 2. 常量 定义:程序运行时其值不能改变的量(即常数) 常量的分类: 直接常量( 值常量) 整型常量:10、15、-10、-30 实型常量:12.5、 30.0、-1.5 字符常量:‘A’、‘b’、‘c’ 字符串常量:“sum”、“A”、“123” 符号常量 用标识符来代表常量。 其定义格式为: #include <stdio.h> #define PRICE 30 void main ( ) { int num, total; num = 10; total = num * PRICE; printf ("total = %d", total); } 运行结果:total = 300 • 行尾不能有分号 • define前面一定要有# • 符号常量名最好使用大写 • 符号常量名最好有意义 #define 符号常量 常量 #define NUM 20 #define PI 3.1415926
基本数据类型 位、字节 • 内存储器的组织 位(bit):最小的存储单位,可以容纳两个值之一,即0或1。 2000 2001 字节(Byte):基本的存储单位,8位。 2002 地址:以字节为单位从0开始编号。
标识符、常量和变量 3. 变量 定义:程序运行时其值可以被改变的量 变量的两要素 :变量名 、变量值 变量的定义格式 : 变量的初始化:定义时赋初始值 变量的使用:先定义,后赋值 变量定义位置:一般放在函数开头 地址 地址 地址 变量定义 short int a=1, b=-3, c; …... 可执行语句 void main ( ) { int a, b = 2; float data; a = 1; data = (a + b) * 1.2; printf (“data=%f\n”, data); } 1 a 2字节 b -3 2字节 c 2字节 编译程序根据变量定义为其 分配指定字节的内存单元 …... 随机数 内存 数据类型 变量名1[,变量名2,…,变量名n]; • int x, y, z; • float radius, length, area; • char ch; 决定分配字节数 和数的表示范围 合法标识符 例: int a = 2, b, c = 4; float data = 3.67; char ch = ‘A’; int x = 1, y = 1, z = 1; int x = y = z = 1; 例1: int student; stadent = 19; //Undefined symbol ‘statent’ in function main 例2: float a,b,c; c = a % b; //Illegal use of floating point in function main
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 RAM 00000000 00001010 基本数据类型 整数的存储方式 • 有符号的正整数 • 在内存中以二进制补码形式存放。 • 正整数的补码与原码相同。 • 例如:10 符号位 可表示的数的范围 数轴 -215=-32768 0 215-1=32767
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 RAM 11111111 11111111 基本数据类型 整数的存储方式 • 无符号整数 • 所有二进制位都存放数值。 • 例如:65535 可表示的数的范围 0 216-1=65535
基本数据类型 整数的类型 • C语言提供多种整数类型 • 为程序员提供了针对不同用途的多种选择。 仅供参考,实际值与所使用的操作系统、编译系统、机器有关。 C标准只规定:short ≤ int ≤ long
基本数据类型 整型常量 • 整型常量有三种形式: • 十进制(decimal)整数 12 65 65535 • 八进制(octal)整数:带前缀 0(zero) 014 0101 0177777 • 十六进制(hexadecimal)整数:带前缀 0x或 0X 0xc 0x41 0xffff • 默认类型是int,即有符号的基本整型。
RAM 基本数据类型 整型变量 • 声明变量(Declaration) • 变量在使用之前必须被声明。 • 声明语句的格式: • 举例 <类型说明符> <变量名>[,<变量名>[,...]]; 变量声明创建了变量:为变量分配了存储空间。 int counter; int width, height; short x, y; long number; height
RAM 基本数据类型 整型变量 • 初始化(Initialize)变量 • 为变量赋一个初始值。 • 可以在声明语句中初始化变量。 • 举例 • 变量获得值的方法 • 直接赋值 • 输入 • 初始化 int counter = 0; int width = 352, height = 288; 初始化式 288 height
基本数据类型 整型变量 • 输出变量的值 • 可以使用printf()函数。 • 与int类型对应的格式说明符是%d。 • 举例 #include <stdio.h> void main() { int a, b; a=32767; b=-32768; printf("a=%d,b=%d\n", a, b); } a=32767,b=-32768
RAM 01000001 基本数据类型 字符的存储方式 • 字符编码 • 计算机使用一种数字编码(整数)来表示字符,每一个字符都对应一个特定的整数。 • 常用的编码是ASCII(美国信息交换用标准码)。 • 7位二进制数,十进制码值范围从0到127。 • 一般用一个字节保存,最高位为0。 • 字符的存储方式与整数相同 • 举例 • 字母A的ASCII码值为65, • 那么在内存中以65的二进制形式存储, • 且占一个字节。 01000001
基本数据类型 字符的类型和字符变量 • C语言的字符类型:char • 占一个字节; • 可视为一个有符号的整数。 • 举例(cw02-03.c) #include <stdio.h> void main() { char c1, c2; //声明字符变量 c1 = 97; //把一个整数赋值给字符变量 c2 = c1-32; //字符变量可以进行算术运算 printf("c1=%c,c2=%c\n", c1, c2); printf("c1=%d,c2=%d\n", c1, c2); } c1=a,c2=A c1=97,c2=65
基本数据类型 字符常量 • 字符常量 • 用单引号括起来的一个字符。 'x' '9' '+‘ • C语言将字符常量视为int类型。 • 举例(cw02-04.c) • 如果int类型为16位,char类型为8位, • 那么对于’bc’,将把’b’和’c’的ASCII码值存储在两个字节中,并把’c’赋值给变量c2。 • 注意:不同系统处理方式不同,结果不同。 c1 0 1 1 0 0 0 0 1 97 c2 0 1 1 0 0 0 1 1 99 L 99 0 1 1 0 0 0 1 1 ‘bc’ H 98 0 1 1 0 0 0 1 0 char c1, c2; c1=‘a’; c2=‘bc’;
基本数据类型 字符常量 • 转义字符(escape character) • 指代一些特殊的字符。(打印不出来的字符) • 举例(cw02-05.c) \a警报 \\反斜杠(\) \b退格 \?问号(?) \f走纸 \‘单引号(’) \n换行 \“双引号(”) \r回车 \ooo八进制值(o表示一个八进制数字) \t水平制表符 \xhh十六进制值(h表示一个十六进制数字) \v垂直制表符 #include <stdio.h> void main() { printf("a\tb\nc\bd\100\x40\n"); } ab d@@
0 (3.14159)10 0 (2)10 数符 尾数部分 阶符 阶码 RAM + 3.14159 × 10+2 基本数据类型 浮点数的存储方式 • 浮点数 • 浮点型数据在内存中按指数形式存放。 • 例如:314.15 = 3.1415×102 科学计数法允许使用少量的数字表示很大范围的数和很小的数。 由此可见,尾数部分的宽度决定了有效数字的个数(即精度),阶码部分的宽度决定了数值范围。
基本数据类型 浮点数的类型 • 浮点数也有多种类型 • 类型名称及典型大小 S = ±1 参考<float.h> 仅供参考,实际值与所使用的操作系统、编译系统、机器有关。 可表示的负数 可表示的正数 数轴 0
基本数据类型 浮点型常量 • 浮点型常量有两种形式: • 十进制形式 12.3 .65 0. • 指数形式:< 小数 > < e | E > < 整数 > 1.2e-2 .1E5 7E0 1.2×10-2 0.1×105 7.0×100 • 默认类型是double。 • 可以加上后缀 f或 F表示float类型,或者 l或 L表示long double类型,否则该常量是double类型。 2.3f 1.2L .1E5f
基本数据类型 浮点型变量 • 浮点型变量的声明和初始化 • 举例 float radius; double x = 0.0, y = 0.0; 不能写成: double x = y =0.0;
基本数据类型 浮点型变量 • 浮点数的输出 • 使用printf()函数 • float和double对应的格式说明符为%f、%e。 • 举例 #include <stdio.h> void main() { float f; double d; f=33333.33333f; d=33333.3333333333; printf("f=%f\nd=%f", f, d); } 有效数字位数是有限的,在可表示的有效位之外的数字被舍去。因此可能会产生误差。 f=33333.332031 d=33333.333333
1.3 C语言的运算符与表达式 算术运算符:(+ - * / % ++ --) 关系运算符:(< <= == > >= !=) 逻辑运算符:((! && ||) 位运算符 :(<< >> ~ | ^ &) 赋值运算符:(= 及其扩展) 条件运算符:(?:) 逗号运算符:(,) 指针运算符:(* &) 求字节数 :(sizeof) 强制类型转换:(类型) 分量运算符:(. ->) 下标运算符:([]) 其它 :(( ) -) C 运 算 符 变量用来存放数据,运算符则用来处理数据。用运算符将变量和常量连接起来的符合C语法规则的式子被称为表达式。 运算符的分类: 单目运算符:只带一个操作数的运算符。如:++、--运算符。 双目运算符:带两个操作数的运算符。如:+、-运算符。 三目运算符:带三个操作数的运算符。如:?运算符。 • 学习运算符时应注意: • 运算符的功能:该运算符主要用于做什么运算。 • 与运算量关系:要求运算量的个数及运算量的类型。 • 运算符的优先级:表达式中包含多个不同运算符时运算符运算的先后次序。 • 运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结合性)。 • 运算结果的类型:表达式运算后最终所得到的值的类型。
1. 赋值运算符、赋值表达式 • 赋值运算符(“=”,双目运算符) • 一般形式: 变量 = 常量或变量或表达式 • 功能:将右边常量或变量或表达式的值赋给左边变量 • 赋值表达式 例如: int x, y, z; x = 20; y = x; z = x + y; • 定义: 由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一个表达式连接起来的表达式,称为赋值表达式。 • 一般格式: 变量 (复合)赋值运算符 表达式 例如:“c=a>b?1:0”。
赋值语句 • 定义:赋值表达式在其后面加分号就构成了赋值语句。 例如:x = 8; a = b = c = 5; • 赋值运算符及赋值表达式的使用 • 注意: • 赋值语句“=”左边必须是变量名或对应某特定内存单元的表达式,不能是常量或其它表达式。 例如:30 = a; b + 2 = 5; 都是错误的。 • 赋值语句中的“=”表示赋值,不是代数中相等的意思。要表示相等的意思则应用关系运算符“==”表示,二者切勿混淆! • 多个变量连续赋值 例如:a = b = c = 10; a = (b = (c = 10)); 结果:a、b、c的值都为10 • 赋值表达式的嵌套 例如:a = (b = 2) + (c = 3) 结果:b为2,c为3,a为b+c即5 ( a = (b = 2) + (c = 3))
基本算术运算符:+ - * / % 结合方向:从左向右 优先级: - ---->* / % -----> + - (2) (3) (4) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据 2. 算术运算符、算术表达式 例:5 % 2 = -5 % 2 = 1 % 10 = 5 % 1 = 5.5 % 2 1 例:5 / 2 = -5 / 2.0 = 2 -1 -2.5 1 0 ()
表达式和算术表达式 算术运算符的优先级 赋值运算符的优先级 3. 算术运算符、算术表达式 表达式:用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合C语言语法规则的式子。 算术表达式:表达式中的运算符都是算术运算符的表达式。 • 运算符优先级(到目前为止) 例:3 + 5 * 8、(x + y) / 2 - 1等
自增、自减运算符++ -- 作用:使变量值加1或减1 种类: 前置 ++i, --i (先执行i=i+1或i=i-1,再使用i值) 后置 i++,i-- (先使用i值,再执行i=i+1或i=i-1) 4. 自增自减运算符、符号运算符 • 负号运算符(“-”) 减号(-)既是一个算术运算符,又是一个负号运算符。负号运算符是单目运算符。例如:a = 2,那么-a的值就是-2。负号运算符的优先级比较高。 例:j = 3; k = ++j; j = 3; k = j++; j = 3; printf (“%d”, ++j); j = 3; printf(“%d”, j++); a = 3; b = 5; c = (++a) * b; a = 3; b = 5; c = (a++) * b; //k=4,j=4 //k=3,j=4 //4 //3 //c=20,a=4 //c=15,a=4
自增、自减运算符注意事项 ++和--运算符只能用于变量,不能用于常量和表达式。 因为++和--蕴含着赋值操作。 例如:5++、--(a+b)都是非法的表达式。 负号运算符、++、--优先级相同,当这些运算符连用时,按照从右向左的顺序计算,即具有右结合性。 两个+和-之间不能有空格。 在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。 例如:++i++是非法的。 自增、自减运算,常用于循环语句中,使循环控制变变量加(或减)-1,以及指针变量中,使指针指向下(或上)一个地址。 4. 自增自减运算符、符号运算符 • 例: • int p, i = 2, j = 3; • p = -i++; p = ? i = ? • p = i+++j; p = ? i = ? j = ? • p = i+--j; p = ? i = ? j = ? • p = i+++--j; p = ? i = ? j = ? -2 3 3 3 5 4 2 2 4 3 2
5. 逗号运算符、逗号表达式 位运算符:, 逗号表达式:用逗号连接起来的表达式。其一般形式为: 表达式1,表达式2,……,表达式k 优先级:优先级最低。 结合性:左结合性 。即逗号表达式的求值顺序是从左向右依此计算用逗号分隔的各表达式的值。 逗号表达式的值:最后一个表达式的值就是整个逗号表达式的值。 用途:常用于循环for语句中。 例如:a+3, b=4, b++ • 例: • #include <stdio.h> • void main ( ) • { • int x, y = 7; • int z = 4; • x = (y = y + 6, y / z); • printf ("x = %d\n", x); • } • 例: a = 3 * 5, a * 4 • a = 3 * 5, a * 4, a + 5 • 例:x = (a = 3, 6 * 3) • x = a = 3, 6 * a • 例:a = 1; b = 2; c = 3; • printf (“%d,%d,%d”, a, b, c); • printf (“%d,%d,%d”, (a, b, c), b, c); //a=15,表达式值60 //a=15,表达式值20 //赋值表达式,表达式值18,x=18 //逗号表达式,表达式值18,x=3 运行结果:x = 3 //1,2,3 //3,2,3
a += 3 a = a + 3 x *= y + 8 x = x * (y + 8) x %= 3 x = x % 3 x &= y = 3 y = 3 和 x &= y 6. 复合运算符 定义:将算术运算符、位运算符与赋值运算符组合在一起就构成了复合赋值运算符。复合赋值运算符即包含了算术运算或位运算,又包含了赋值操作。 种类: += -= *= /= %= <<= >>= &= ^= |= 含义:exp1 op= exp2exp1 = exp1 op exp2 例:a=12; a+=a-=a*a; //a=-264 等价于a=a+(a=a-(a*a))
1.4 数据输出 一、基本概念 1.输出:把数据从计算机内部送到计算机外部设备上的操作称为“输出 ” 2.输入:从计算机外部设备将数据送入计算机内部的操作称为“输入” 注意:c语言本身不提供输入和输出语句,但是有输入和输出函数 二、printf函数的一般调用形式 1.作用;在终端设备上按指定格式输出 2.形式: 表达式 :printf(格式控制,输出项表) 语 句:printf(格式控制,输出项表);
输入/输出函数 #include <stdio.h> void main() { int num; printf("请输入一个数:"); scanf("%d",&num); printf(" \n%d 的平方为%d \n",num,num*num); } 输入/输出函数 (printf/scanf) 用于接受和显示数据或信息 转换字符串 转义序列
int visitor_count = 150; printf ("%d", visitor_count); visitor_count "%d" printf 将一些信息按照指定的格式送到标准输出(显示器) 将按指定的格式显示该变量的值
int visitor_count = 150; printf ("%d", visitor_count); 输出结果:150
printf 函数 float circumference = 78.53; printf ("%f", circumference); 9.4786789; 输出结果:78.530000 9.478679 默认情况下精确到六位小数
一、Scanf函数的一般调用形式 1.作用:是在终端设备上输入数据 2.形式: 表达式:scanf(格式控制,输入项表) 语 句 : scanf(格式控制,输入项表); ※注意:格式控制必须与你对应的变量的类型相等,否则会出现相不到的数据 二、通过scanf函数从键盘输入数据 当调用scanf函数从键盘输入数据时,最后一定要按下回车,scanf才能接受从键盘 输入的数据。若同时输入多个数据,则数据与数据之间用空格键隔开