68
程程程程程程 (C) 程程程

程序设计语言 (C)

  • Upload
    mauve

  • View
    115

  • Download
    0

Embed Size (px)

DESCRIPTION

程序设计语言 (C). 王正杰. 课程概述. 本课程的目的:掌握基本的语法,掌握基本的编程技术,为后续课程的进一步学习打下良好的基础。 C 与 C++ 的基本关系: C++ 完全兼容 C 。 上机环境的选择: Trubo C 或者 Visual C++6.0 教材内容的取舍及补充:会有极其少量的内容略过,并且补充部分内容。. 本课程和计算机等级考试二级 C 的关系:两者并不等同,学习课程对考试非常有帮助,但是不是以考试为目标。 本课程中涉及 C 语言与 C++ 的不同之处会给大家指出。. 第一章 C 语言基础. - PowerPoint PPT Presentation

Citation preview

程序设计语言(C)王正杰

课程概述• 本课程的目的:掌握基本的语法,掌握

基本的编程技术,为后续课程的进一步学习打下良好的基础。

• C 与 C++ 的基本关系: C++ 完全兼容 C 。• 上机环境的选择: Trubo C 或者 Visual

C++6.0

• 教材内容的取舍及补充:会有极其少量的内容略过,并且补充部分内容。

• 本课程和计算机等级考试二级 C 的关系:两者并不等同,学习课程对考试非常有帮助,但是不是以考试为目标。

• 本课程中涉及 C 语言与 C++ 的不同之处会给大家指出。

第一章 C 语言基础

[ 本章重点 ] 学会创建一个简单 Visual C++6.0控制台程序,掌握 C 语言的基本数据类型以及常量、变量的含义和用法,各种运算符的运算规则、优先级、结合性,各种表达式的含义和用法。

[ 本章难点 ] 理解 C 语言基本数据类型、常量、变量、运算符、表达式的概念及在程序中的用法。

计算机语言( Computer Language )是用于人与计算机之间通讯的语言,是人与计算机之间传递信息的媒介。开始使用机器语言来编程,后来为了减小编程的难度,产生了汇编语言。汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过容易识别和记忆,所以汇编语言有时又称为伪机器语言,机器语言和汇编语言被称为“低级语言”。随着程序规的不断扩大,汇编语言越来越不能满足人们需要, 20 世纪 50 年代,出现了“高级语言”。

它接近人们习惯使用的自然语言和数学语言。高级语言是目前绝大多数编程者的选择,和汇编语言相比,它将许多相关的机器指令合成为单条指令,大大简化了程序中的指令,同时由于省略了很多细节,编程者也就不需要有太多的专业知识,更易为人编写,而且程序的平台无关性使程序可以方便地被移植到网络上的不同机器、不同平台。从计算机编程语言的发展过程我们可以看出,编程语言的功能越来越强大,程序员的编程工作越来越容易。

在 1970 年 , AT&T 贝尔实验室的 Ken Thompson 设计出 B 语言 , 1972 年美国的 Dennis Ritchie 在 B 语言的基础上设计发明了另一种语言,取名为 C 语言,随着微型计算机的日益普及 , 出现了许多 C 语言版本。

C++ 是从 C 语言发展演变而来的,首先是一个更好的 C引入了类的机制,最初的 C++ 被称为“带类的 C” 。 1983 年正式取名为 C++ ,从 1989 年开始 C++ 语言的标准化工作,于 1994 年制定了 ANSI C++ 标准草案,于 1998 年 11月被国际标准化组织( ISO )批准为国际标准,成为目前的 C++ 。目前,有多种开发环境供开发人员选择使用。

如何快速入门 C 语言 语言的重要性:1.首先, C 语言语法结构很简洁精妙,写出的

程序也很高效,它能够让编程人员深入系统底层,编写底层硬件的驱动程序,所以,如果想在程序设计方面有所建树,就必须去学习它。

2. 其次,学会 C 语言,再学习别的语言会非常轻松,如果掌握了 C 语言,就等于掌握了很多门语言。

3.再者,对于专业以硬件方面为主的学生来说,以后的课程还要用到它,如数据结构、单片机编程等,所以为了顺利学习以后的课程,也必须去学好它。

• 提出以下几点建议:1.初学者开始一定要调整好自己的心态,不

要急于求成,不用怕学不会。不少人在学习之前,可能就听到了不少人说这门课非常难学。的确,这门课是比较难入门并且不容易学,但肯定能学会。刚开始学习时,应顺着教材一步一步的走,先记忆教材上的知识,等到以后学习的内容逐渐增多,再逐渐加深理解,遵循由易入门,逐渐深入的学习方法。

2.勤学多练。不管是初学者还是已经能熟练运用者,在学习新的内容时总会遇到不容易懂的知识点,这时可以采取的方法是多

看几遍书,多问几个人,多上机练习几次,难点最终会被克服。

3. 有选择的学。 C 语言的功能非常强大,内容也非常多,初学者一定不要想把它的所有功能都学会,只需要先掌握基本的概念和方法,再把常用的部分和大的编程框架能学会学懂就可以了,以后遇到要实现新的软件功能时,再去查找相应的参考资料来编程实现。

经典书籍推荐 C++

常见教材 C++

经典书籍推荐 C 语言

常见教材 C 语言

编程环境的使用• 集成开发环境( IDE )非常复杂,只需要

掌握基本的功能。• 建立工程时和添加源文件时不要选错。• 在机房上机应将文件保存到硬盘其它分区,尽量不要保存在 C盘。

• 下机前,保存好文件,便于下次上机继续使用。

• 学会基本的调试技术。

• 建立一个简单的 Visual C++6.0 控制台程序• 使用应用程序向导来完成,代码如下:

#include "stdafx.h"

int main(int argc, char* argv[])

{

printf("Hello World!\n");

return 0;

}

书写程序时应遵循的规则 : 1. 各个单词之间要用空格或其他分界符分开。2. 一条语句占一行,每一条语句都必须以

“ ;” 结尾,但预处理命令,函数头和花括号“ }” 之后不加分号。

3. {} 都是成对出现的,相匹配的大括号在同一列,括起来的语句,通常表示程序的某一层次结构,内部再嵌套 {} 时,应进行缩进排列,以便看起来层次清晰,增加程序的可读性;缩进是指程序在书写时不要将

程序的每一行都由第一列开始,在适当的地方加进一些空行或空格,它同注释一样,也是为了提高程序的可读性。

4. 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性,注释的内容要清楚、明了,含义准确,防止注释二义性,注释行与代码行尽量分行书写。

5. 严格区分大小写,两个词只有在包括大小写都完全相同的情况下才代表同一目标

#include <stdio.h> //头文件int main(int argc, char* argv[])//main函数头{ //main函数体开始标志int a; //定义了一个变量 a

printf("请输入一个整数 \n") ;//在屏幕上输出提示scanf(“%d”,&a); //把从键盘上输入的

//数存入变量 a

printf("你输入的整数是%d\n“,a);//在屏幕上输出 // 提示和 a的值

return 0; //函数返回} //main函数体结束标志

(一)基本字符集 字符是组成语言的最基本的元素。 C 语言字符集由字母、数字、空格、标点和特殊字符组成。在字符常量、字符串常量和注释中还可以使用汉字或其它可表示的图形符号,在其他部分只能使用由字符集中的字符组成的符号。

1. 字母 :小写字母 a~ z共 26 个,大写字母 A~ Z共 26 个

2. 数字: 0~ 9共 10 个

3. 空白符:空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用,在其它地方出现时,只起间隔作用,编译程序对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不发生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。

4. 标点和特殊字符: ! # % ^ & * _( 下划线 ) + = - ~ < > / \ ' " , . ; ( ) [ ] { }

标识符的构成规则

• 以大写字母、小写字母或下划线 (_) 开始。• 可以由以大写字母、小写字母、下划线 (_)

或数字 0~9组成。• 大写字母和小写字母代表不同的标识符。

标识符命名的基本规则 标识符命名尽量做到顾名思义,尽量用英文表达出标识符的功能。变量命名要符合“匈牙利法则”,即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求每个单词的第一个字母应大写,对于变量作注释时可紧跟在变量的后面说明变量的作用,例如用变量 cStudentName 代表学生的名字,用变量 cTeacherName 代表教师的名字;函数的命名应该尽量用英文表达出函数完成的功能,遵循动宾结构的命名法则,函数名中动词在前,例如用 DrawPicture命名绘图函数的名字。

关键字 关键字是由 C 语言规定的具有特定意义的字符串,程序员只能按系统已定义好的用法去使用,因此通常也称为保留字。C语言的关键字分为以下 3 类:

1. 类型说明符 用于定义、说明变量、函数或其它数据结构的

类型,常用的类型说明符有 auto bool char class const enum extern float friend int long namespace private protected public register short signed static struct template typedef typename union unsigned virtual void 等。

2. 语句定义符 用于表示一个语句的功能,常用的语句定义符有 break case default do 等。

3. 预处理命令字 用于表示一个预处理命令,在程序中

使用时前面都以“ #” 来引导,常用的预处理命令字有 define include undef 等。

运算符

C语言中含有丰富的运算符,运算符与变量、函数一起组成表达式,表示各种运算功能,常用的运算符有 = + - * / % >> << & | ^ == && || ?: += -= *= /= ++ -- 等。

分隔符 在C语言中采用的分隔符有逗号和空格

两种,一定要英文标点状态下输入。逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,作间隔符。在关键字,标识符之间必须要有一个以上的空格符作间隔,否则将会出现语法错误,例如把 int iStudentNum 写成 intiStudentNum ,编译器会把 intiStudentNum当成一个标识符处理,其结果就会出错。

注释符 C/C++ 语言的注释符有 // /* */ 共三

个。注释有两种书写方式:一种是以“ //”开始的行,则该行为注释;另一种是以“ /*” 开始,从该标志起,直到遇到结束注释标志“ */” ,在“ /*” 和“ */” 之间的内容全是注释,这个方式常用于注释内容较多的情况。

程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。在调试程序时,对暂不使用的语句也可用注释符括起来,待调试结束后再去掉注释符。

常量和变量

• 在程序运行过程中,其值不能被改变的量称为常量(包括字面常量(直接常量)和符号常量)。

• 其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。存储单元在程序中可以根据需要赋予不同的数值,所以变量值是可以变化的,但是变量必须先定义后使用。

常量和符号常量• 常量区分为不同的类型,如 12 ,

0 , -3 为整型常量, 4.6 、 -1.23 为实型常量,‘ a’ ,‘ d’ 为字符常量。常量一般从其字面形式即可判别。这种常量称为字面常量或直接常量。

• 可以用一个标识符代表一个常量,称为符号常量,即标识符形式的常量。请注意符号常量不同于变量,它的值在其作用域内不能改变,也不能再被赋值。如 :

• #define price 30

数据类型 —整型数据及取值范围

• 类型类型 说明符 说明符 位数位数 数值范围数值范围• 短整短整 shortshort 1616 -32768-32768 ~~ 3276732767

• 基本 基本 intint 32 32 --223131 ~~ ((223131-1)-1)

• 长整长整 longlong 3232 --223131 ~~ ((223131-1)-1)

• 无符号无符号unsigned shortunsigned short 1616 00 ~~ 65535 65535 unsigned intunsigned int 3232 00 ~~ ((223232-1-1))unsigned longunsigned long 3232 00 ~~ ((223232-1-1))

数据类型——实型数据

float v ,r,h;

r=2.5;

h=3.2;

v=3.14159*r*r*h

数据类型 ——字符型数据

• 字符常量• 单引号括起来的一个字符,如: 'a', 'D', '?', '$'• 字符变量• 用来存放字符常量例: char c1,c2; c1='a'; c2='A';

• 字符数据在内存中的存储形式• 以 ASCII码存储,占 1字节,用 7 个二进制位

• 字符数据的使用方法–字符数据和整型数据之间可以运算。–字符数据与整型数据可以互相赋值。

• 字符串常量例 :"CHINA"

"a" 'a'

所以: char c; c="a";

C H I N A \0 C H I N A \0

a \0a \0

aa

Page 37

数据类型 ——字符型数据

数据类型数据类型 —— ——布尔型数据

• 布尔型变量的说明:例: bool flag;

• 布尔型数据的取值:只有 false 和 true 两个值

变量的定义数据类型 变量名标识符 1, 变量名标识符 2, ……;bool flag; //定义了一个布尔变量 flagint a, b, c; //定义了三个整型变量 a 、 b 、 cchar c5,c6; //定义了两个字符变量 c5 、 c6关于变量定义需要说明的是:1) 在同一个程序块中,或者说在一对 {} 的同一层次内,

不能有两个相同的变量名。2)没有字符串变量类型,字符串是用字符类型的数组或

指针来定义,在以后学习。 3) 变量的定义比较自由,可以随时定义,但一般在程序

开始位置或函数体语句前面定义。 4) 在不同位置定义的变量,作用范围不同。

• 使用变量前对变量赋值的过程称为变量初始化,可以在定义变量时同时初始化变量,例如:

int a=10, b=20; //定义了二个整型变量 a 、 b

char c5=’d’; //定义了一个字符变量 c5 ,char c6=’\n’; //定义了一个字符变量 c6 ,初值为 // 换行符• 也可以在定义以后对变量进行赋值定义变量以后再赋值,例如:

int a,b; //定义了三个整型变量 a 、 b

char c5; //定义了字符变量 c5

a=10;b=20; // a 、 b 、 c初值分别为 10 、 20 、30

算术运算符与算术表达式• 基本算术运算符 + - * / (若整数相除,结果取整 )

% (取余,操作数为整数)• 优先级与结合性先乘除,后加减,同级自左至右• ++, -- (自增、自减)例: i++; -- j;

简单的赋值运算符 "="

• 举例n=n+5

• 表达式的类型:等号左边对象的类型• 表达式的值:等号左边对象被赋值后的值• i=m=n=8 // 变量 i 、 m 、 n 的值都为 8 , // 表达式的值也为 8 , //此表达式等价于 i=(m=(n=8))

复合的赋值运算符• 有 10 种复合运算符:

+=, -=, *=, /=, %=,<<=,>>=,&=,^=,|=

• 例a+=3 等价于 a=a+3x*=y+8 等价于 x=x*(y+8)

关系运算• 关系运算是比较简单的一种逻辑运算,优

先次序为: < <= > >= == !=

• 优先级相同(高) 优先级相同(低)

• 关系表达式是一种最简单的逻辑表达式–其结果类型为 bool ,值只能为 true (非0 ) 或 false ( 0 )。

• 例如: a>b , c<=a+b , x+y==3

逻辑运算

• 逻辑运算符 !( 非 ) &&( 与 ) ||( 或 )优先次序: 高 → 低

• 逻辑表达式 例如: (a>b)&&(x>y) 其结果类型为 bool ,值只能为 true (非0 ) 或 false ( 0 )

条件运算符

• 一般形式表达式 1 ?表达式 2:表达式 3

表达式 1 必须是 bool 类型•执行顺序

– 先求解表达式 1,– 若表达式 1的值为 true,则求解表达式 2,表

达式 2的值为最终结果– 若表达式 1的值为 false,则求解表达式 3,

表达式 3的值为最终结果

• 注意:– 条件运算符优级高于赋值运算符,低于逻辑运算符

– 表达式 2 、 3 的类型可以不同,条件表达式的最终类型为 2 和 3 中较高的类型。

• 例: x=a>b? a:b;

逗号运算• 格式

表达式 1 ,表达式 2

• 求解顺序及结果先求解 1 ,再求解 2 ,最终结果为表达式

2 的值• 例

a=3*5 , a*4 最终结果为 60

运算符优先级括号++ , -- , sizeof*, /, %+, -==, !=位运算&&||?:赋值运算逗号运算 低

运算时的自动转换 • 进行算术运算时计算机将数据类型从低类

型到高类型进行转换 • char short int long float double

低 高• 赋值运算要求左值与右值的类型相同,若

类型不同,编译系统会自动将右值转换为左值的类型。

强制类型转换• 语法形式:

类型说明符 ( 表达式 ) 或( 类型说明符 ) 表达式

• 强制类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。

• 需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。

表达式的书写 表达式的书写应注意以下几点:1. 表达式要在同一行书写,计算公式要分解为正确

的表达式。 例如:数学中计算数 a 的平方在 C 语言编程时

的写法是: a*a 或者用计算幂的函数 pow( ) ,所需头文件是 <math.h> ,写法是 pow(a,2) 。

2. 乘号 * 不能省略,也不能用 · 代替。3. 表达式中只能使用圆括号,不能使用其它括号。4. 书写比较复杂的表达式时,要尽量多写括号,把

运算的优先级固定住,避免出现表达式二义性。

表达式语句表达式语句• 格式:

表达式;• 表达式语句与表达式的区别:

表达式可以包含在其它表达式中,而语句不可。例: if ((a=b)>0) t=a;

不可写为: if ((a=b;)>0) t=a;

复合语句• 将多个语句用一对大括号包围,便构成一

个复合语句• 例如

{

sum=sum+i;

i++;

}

数据的输入输出的概念 • 在编程时,数据的输入输出是相对计算机

而言,数据的输入就是把外部的数据传输到计算机中,数据的输出是把计算机中的数据传输到外部,最常见的输入设备是键盘,输出设备是屏幕。

• 在编程时,有多种方法实现数据的输入输出。在有图形界面的程序中数据的输入输出一般是用控件来实现,如标签、文本框、表格、报表控件等来实现的。

C++ 语言的输入输出• 要使用头文件: #include”iostream.h”• 向标准输出设备(显示器)输出

例: int x , y; cout<<“x=“<<x<<“y=”<<y;

• 从标准输入设备(键盘)输入例: int x,y; cin>>x>>y; 或者 cin>>x; cin >>y;

• 或者使用头文件:• #include”iostream”

• using namespace std;// 使用命名空间

C 语言的输入输出

要包含头文件: #include "stdio.h"

stdio.h 是 standard input & output 的缩写输入使用 scanf()函数,输出使用 printf()函

printf函数的一般格式为 printf(格式控制,输出表列 )

如: printf(“%d , %c\n” , i , c);

• 括弧内包括两部分:(1) “格式控制”是用双引号括起来的字符串,

也称“转换控制字符串”,它包括两种信息:① 格式说明,由“ %” 和格式字符组成,如%

d , %f 等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“ %”字符开始的。② 普通字符,即需要原样输出的字符。例如上面 printf函数中双引号内的逗号、空格和换行符。

(2) “输出表列”是需要输出的一些数据,可以是表达式。

不同类型数据用不同的格式字符。常用的如下:(1) d格式符。用来输出十进制整数。 %d , 按整型数据的实际长度输出。(2) c格式符,用来输出一个字符。如:   char  c='a'; printf("%c" , c); 输出字符‘ a’ ,请注意:“ %c” 中的 c 是格式符,逗号右边的 c 是变量名,不要搞混。

(3) s格式符,用来输出一个字符串例如:  printf("%s" , "china")输出“ china”字符串 ( 不包括双引号 ) 。

输入的一般形式scanf(格式控制,地址表列 )

“格式控制”的含义同 printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。

用 scanf函数输入数据。void main()

{

int a,b,c;

scanf("%d%d%d",&a,&b,&c);

printf("%d,%d,%d\n",a,b,c);

}

• &a 、 &b 、 &c 中的“ &” 是“地址运算符”, &a 指 a 在内存中的地址。上面 scanf函数的作用是:按照 a 、b 、 c 在内存的地址将 a 、 b 、 c 的值存进去。变量 a 、 b 、 c 的地址是在 编译连接阶段分配的。

• “%d%d%d” 表示按十进制整数形式输入数据。输入数据时,在两个数据之间以一个或多个空格间隔,也可以用回车键、跳格键 tab 。

• 下面输入均为合法: ① 3    4    5

② 3

  4 5

③ 3(按 tab键 )4

  5• 用“ %d%d%d”格式输入数据时,不能用逗号作两个数据间的分隔符,如下面输入不合法:  3 , 4 , 5

使用 scanf函数时应注意的问题(1) scanf函数中的“格式控制”后面应当是

变量地址,而不应是变量名。例如,如果 a 、 b 为整型变量,则     scanf("%d , %d" , a , b);是不对的,应将“ a , b”改为“ &a , &b” 。这是 c 语言与其他高级语言不同之处。

(2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。例如   scanf("%d , %d" , &a , &b);输入时应用如下形式:     3 , 4

注意 3 后面是逗号,它与 scanf函数中的“格式控制”中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的:     3 4 ( 不对 )

3:4 ( 不对 )

(3) 在用“ %c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入:   scanf("%c%c%c" , &c1 , &c2 , &c3);如输入    a   b  c

字符‘ a’送给 c1 ,字符‘ ’送给 c2 ,字符‘ b’送给 c3 ,因为 %c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此‘ ’作为下一个字符送给 c2 。

关于输入输出的注意事项• C 语言的格式输入输出的规定比较繁琐,

用得不对就得不到预期的结果,而输入输出又是最基本的操作,几乎每一个程序都包含输入输出,不少编程人员由于掌握不好这方面的知识而浪费了大量调试程序的时间。因此我们做了比较仔细的介绍,以便在编程时有所遵循。但是,在学习时完全不必花许多精力去掌握每一个细节,重点掌握最常用的一些规则即可。

本章小结

• 本章简单介绍了计算机语言的发展,并通过一个控制台程序实例演示了如何建立一个工程,重点讲解了基本数据类型、运算符和表达式,最后介绍了 C++ 语言中数据的输入输出以及常用的两个输入输出对象 cin 和 cout 和 C 语言中的输入输出函数 scanf() 和 printf() 。