在诸多的高级语言中,C语言是不折不扣的元老级语言。它是怎么发展而来的?有哪些特性?怎么样才能使用它开发一个C程序?本章就带你来了解这些信息。除此以外,本章还会介绍Visual C++ 6.0和Visual Studio 2019开发环境,让你快速对C语言有一个全面的了解。深刻了解C语言,你会对编程产生浓厚的兴趣。
本章的知识架构及重难点如下:
开发环境:Visual C++ 6.0 Visual Studio 2019
C语言概述:
C语言的发展史:程序语言简述 C语言的历史
C语言的特点:高效性、灵活性、功能丰富、表达力强、移植性好。
一个简单的C程序:#include指令 空行 main函数声明 函数体 执行语句 return语句 代码的注释
一个完整的C程序:定义常量 函数声明 定义变量 输入语句 数学运算语句
表示重点内容
机器语言是低级语言,也称为二进制代码语言,是一种使用0、1表示的二进制代码编写指令以执行计算机操作的语言。机器语言的特点是计算机可以直接识别,不需要进行任何翻译。
汇编语言是面向机器的程序设计语言。为了减轻开发者使用二进制代码编程的痛苦,用英文字母或符号串来替代机器语言的二进制码,这样就把不易理解和使用的机器语言变成了汇编语言。因此,汇编语言要比机器语言更便于阅读和理解。
由于汇编语言依赖于硬件体系,并且助记符号数量比较多,所以其运用起来仍然不够方便。为了使程序语言能更贴近人类的自然语言,同时又不依赖于计算机硬件,于是产生了高级语言。这种语言,其语法形式类似于英文,并且因为不需要对硬件进行直接操作,因此易于被普通人所理解与使用。其中影响较大、使用普通的高级语言有Fortran、ALGOL、Basic、COBOL、LISP、Pascal、PROLOG、C、C++、VC、VB、Delphi、Java等。
早期操作系统都是用汇编语言编写的,由于汇编语言依赖于计算机硬件,程序的可读性和可移植性都不是很好。为了提高可读性和可移植性,人们开始寻找一种语言,这种语言既要具有高级语言的特性,又不能失去低级语言的优点。于是,C语言产生了。
C语言是在BCPL语言(简称B语言)的基础上发展和完善起来的,而B语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson)于1970年研制出来的。20世纪70年代初期,AT&T Bell实验室的程序员丹尼斯·里奇第一次把B语言改为C语言。
最初,C语言运行于AT&T的多用户、多任务的UNIX操作系统上。后来,丹尼斯·里奇用C语言改写了UNIX C的编译程序,UNIX操作系统的开发者肯·汤普逊又用C语言成功地改写了UNIX,从此开创了编程史上的新篇章。UNIX成为第一个不是用汇编语言编写的主流操作系统。
1983年,美国国家标准委员会(ANSI)对C语言进行了标准化,于1983年颁布了第一个C语言草案(83ANSI C),后来于1987年又颁布了另一个C语言标准草案(87ANSI C),最新的C语言标准C99于1999年颁布,并在2000年3月被ANSI采用。但是由于未得到主流编译器厂家的支持,C99并未得到广泛使用。
尽管C语言是在大型商业机构和学术界的研究实验室中研发的,但是当开发者们为第一台个人计算机提供C编译系统之后,C语言就得以广泛传播,并为大多数程序员所接受。对MS-DOS操作系统来说,系统软件和实用程序都是用C语言编写的。Windows操作系统大部分也是用C语言编写的。
C语言是一种面向过程的语言,同时具有高级语言和汇编语言的优点。C语言可以广泛应用于不同的操作系统,如UNIX、MS-DOS、Microsoft Windows及Linux等。
在C语言基础上发展起来的有支持多种程序设计风格的C++语言,网络上广泛使用的Java和JavaScript,以及微软的C#语言等。也就是说,学好C语言之后,再学习其他语言就会比较轻松。
说明:
目前流行的C语言版本有以下几个。
Microsoft C或称MS C。
Borland Turbo C或称Turbo C。
AT&TC。
C语言是一种通用的程序设计语言,主要用来进行系统程序设计,具有如下特点。
1.高效性
从C语言的发展历程可以看到,它继承了低级语言的优点,代码运行效率高,并具有良好的可读性和编写性。一般情况下,C语言生成的目标代码的执行效率只比汇编程序低10%~20%。
2.灵活性
C语言中的语法不拘一格,可在原有语法基础上进行创造、复合,从而给程序员更多想象和发挥的空间。
3.功能丰富
除C语言中所具有的类型外,还可以使用丰富的运算符和自定义结构类型来表达复杂的数据类型,完成所需要的功能。
4.表达力强
C语言的语法形式与人们惯用的自然语言相似,书写形式自由,结构规范,通过简单的控制语句即可轻松控制程序流程,完成烦琐的程序要求。
5.移植性好
作为高级语言,C语言具有良好的可移植性。在不同的操作系统下,只需要简单地修改甚至不用修改,即可进行跨平台的程序开发操作。
正是由于C语言拥有上述优点,因此它在程序开发中备受青睐。
下面通过一个简单的实例来看看C语言程序是什么样的。为了便于讲解,实例代码中专门标注了行号(真实程序中这些行号是不存在的)。
例1.1 输出一行语句
本实例程序的功能是显示一条信息“I want to self-study C language”, 通过这处程序可以初窥C程序的样貌。虽然这个简单的小程序只有7行,却充分说明了C程序是由什么位置开始、什么位置结束的。
运行程序,显示效果如图1.1所示。
图1.1 一个简单的C程序
{
printf("I want to self-study C language\n"); /*输出要显示的字符串*/
return 0; /*程序返回0*/
}
上面介绍main函数时,提到了一个名词"函数头"。既然有函数头,是不是也应该有函数体呢?没错,一个函数通常就分为两个部分:一个是函数头,二是函数体。
程序代码的第4行和第7行是两个大括号,这对大括号以及其中的语句块就构成了函数体。第5行和第6行语句就是函数体中要执行的内容。其中,printf函数就包含在标准输入/输出库文件stdio中,因为前面做了包含声明,所以这里开发者可以直接调用,进行字符串的输出操作。
printf("I want to self-study C language\n"); /*输出要显示的字符串*/
执行语句就是函数体中要执行的动作内容。本行代码是这个简单例子中最复杂的语句,但其实不难理解。printf是格式化输出函数,用于向控制台输出文字或符号。括号中的内容称为函数参数,这里可以看到要输出的字符串为“I want to self-study C language" 。其中还可以看到”\n"这样一个符号,称之为转义字符,其作用是实现换行。关于转义字符的内容将第3章中介绍。
特别需要注意的是,语句的结尾一定要添加英文分号。
return 0; /*程序返回0*/
本行语句使main函数终止运行,并向操作系统返回一个整型常量0。前面介绍main函数时,说过它需要返回一个整型值,这里0就是要返回的整型值。可以将return语句理解成main函数的结束标志。
printf("I want self-study C language\n"); /*输出要显示的字符串*/
return 0; /*程序返回0*/
这段对代码的解释描述性文字称为代码注释,作用是为了他人能快速理解程序代码的含义和设计思想。注释内容包含在“/”和“/”之间,其语法格式如下:
/其中为注释内容/
注意
编写规范的代码格式和添加详细的注释,是一个优秀程序员应该具备的好习惯。
1.3节中已经介绍过#include包含命令、main函数、函数体、return返回语句、代码注释等内容,这里不再进行重复说明。下面介绍程序中新出现的一些内容。
#define Height 10 /*定义常量Height*/
本行代码使用#define定义了一个符号常量。#define在这里的功能是设定用符号Height代表数值10。这样在程序编译时,只要遇见Height标识符,就会被替换为数值10。从而满足题设中“其高已给出”这个条件。
2.函数声明
实例代码的第3行:
int calculate(int Long, int Width); /*用户自定义函数calculate声明*/
本行代码的作用是对calculate函数进行声明。什么是函数声明呢?举例说明,两个公司进行合作,A公司要派一个经理到B公司进行业务洽谈。A公司会发送一个通知给B公司,告诉B公司会派一个经理过去,请B公司在机场接一下这位洽谈业务的经理。A公司会将这位经理的名字和大概的体貌特征告诉B公司的有关迎接人员,这样当这位经理下飞机之后,B公司就可以将他的名字写在纸上做成接机牌,然后找到这位经理。声明函数的作用,就类似于A公司告诉B公司前去谈判的经理信息的过程。也就是说,此处声明calculate函数,表示后面将给出calculate函数的具体定义内容。
int m_Long; /*定义整型变量m_Long, 表示长度*/
int m_Width; /*定义整型变量m_Width,表示宽度*/
int result; /*定义整型变量result,表示体积*/
这3行语句都是定义变量的语句。变量的作用就是存储数值,使得程序可利用变量进行计算。这就像在二元一次方程中,X和Y就是变量,当为赋值后,如X为5,Y为10,这样X+Y的结果就等于15。C语言中,使用变量前必须先进行定义,编译器会根据变量类型为其分配内存空间。
scanf("%d",&m_Long); /*输入长方体的长度*/
例1.1中曾介绍过格式化输出函数printf,既然有输出函数,就一定有输入函数。C语言中,scanf函数用来接收键盘输入的内容,并将输入的内容保存在相应变量中。可以看到,在scanf函数的参数中,m_Long就是之前定义的整型变量,作用是存储输入的信息内容;"&"符号是取地址运算符,其具体内容会在后续章节中介绍。
int calculate(int Long, int Width) /*自定义计算体积函数calculate*/
{
int result = Long*Width*Height; /*计算体积*/
return result; /*将计算的体积结果返回*/
}
本段代码定义了一个calculate函数,作用是计算长方体的体积。前面介绍过main、printf、scanf函数,它们都属于C语言标准库函数,由系统提前定义好,读者直接调用就行。但calculate函数是用户根据需要自行定义的函数,因此必须给出定义的函数体。定义之后,读者一样可随时调用它。有关函数的具体内容将在第9章中介绍。
int result = Long * Width * Height; /*计算体积*/
本行代码在calculate函数体内,其功能是将变量Long、Width、Height三者相乘得到的结果保存在result变量中。其中的“*”代表乘法运算符。
关于C语言程序,相信读者此时已经有了一定了解。下面再将例1.2的运行过程总结一下。
(1)包含程序所需的头文件。
(2)定义一个常量Height,代表长方体的高度10。
(3)对calculate函数进行声明。
(4)进入main函数,程序开始执行。
(5)在main函数中,首先定义3个整型变量,分别代表长方体的长度、宽度和体积。
(6)显示提示文字,然后根据显示的文字输入有关的数据。
(7)当长方体的长度和宽度都输入之后,会调用calculate函数,计算长方体的体积。
(8)定义calculate函数的位置在main函数的下面,在calculate函数体内将计算长方体体积的结果进行返回。
(9)在main函数中,result变量得到了calculate函数返回的结果。
(10)通过输出语句将其中长方体的体积显示出来。
(11)程序结束。
int Add(int Num1, int Num2) /*定义计算加法函数*/
{ /*将两个数相加的结果保存在result中*/
int result = Num1+Num2;
return result; /*将计算的结果返回*/
}
将其中的执行语句按层级依次进行缩进,并排列代码注释,就会很有层次感。
int Add(int Num1, int Num2) /*定义计算加法函数*/
{
int result = Num1+Num2; /*将两个数相加的结果保存在result中*/
return result; /*将计算的结果返回*/
}
(2)进入安装向导界面,如图1.5所示,单击Next按钮。进入End User License Agreement(最终用户许可协议)界面,如图1.6所示,首先选中I accept the agreement单选按钮,然后单击Next按钮。
(3)进入Product Number and User ID(产品号和用户ID)界面,如图1.7所示。在安装包内找到CDKEY.txt文件,填写产品ID。姓名和公司名称根据情况填写,可以采用默认设置,不对其修改,单击Next按钮。
(4)进入Visual C++ 6.0 Enterprise Edition (Visual C++ 6.0英文企业版)界面,如图1.8所示。选中Install Visual C++6.0 Enterprise Edition单选按钮,然后单击Next按钮。
(5)进入Choose Common Install Folder(选择公用安装文件夹)界面,如图1.9所示。公用文件默认存储在C盘中,单击Browse按钮,选择安装路径,这里建议安装在磁盘空间剩余比较大的磁盘中,以节约系统盘(C盘)空间。设置安装路径后,单击Next按钮。
(6)进入安装程序的欢迎界面中,如图1.10所示,单击“继续”按钮。
(7)进入产品ID确认界面,如图1.11所示,在此界面中,显示要安装的Visual C++6.0软件的产品ID,在向Microsoft请求技术支持时,需要提供此产品ID,单击“确定”按钮。
(8)如果读者计算机中安装过Visual C++6.0,即便已经卸载了,重新安装时还是会提示如图1.12所示的信息。安装软件检测到系统之前安装过Visual C++6.0,如果想要覆盖安装,单击“是”按钮;如果要将Visual C++6.0安装在其他位置,单击“否”按钮。这里单击“是”按钮,继续安装。
(9)进入选择安装类型界面,如图1.13所示。第一项Typical表示传统安装,第二项Custom表示自定义安装,这里选择Typical安装类型。
(10)进入注册环境变量界面,如图1.14所示,在此界面中,选中Register Environment Variables复选框,注册环境变量,单击OK按钮。
(11)弹出数据更新提示,如图1.15所示,单击“是”按钮,开始安装Visual C++ 6.0, 如图1.16所示。
(12)当进度条达到100%时,会进入如图1.17所示的界面,提示系统NT错误标志,这是由于Windows10系统兼容性问题导致的,单击“确定”按钮即可。
(13)完成以上操作后,会进入如图1.18所示的未响应界面。出现这种情况,同样是由于Windows10系统兼容性问题导致的。这时单击鼠标,会弹出如图1.19所示的提示框,单击“关闭程序”选项,然后在“开始”菜单中找到Visual C++6.0图标并单击,就可以正常使用Visual C++ 6.0了。
2.Visual C++ 6.0的使用
Visual C++ 6.0程序的主界面如图1.20所示,下面来创建一个C语言源程序文件。
(1)在菜单栏中选择File-New命令,如图1.21所示,或者按Ctrl+N快捷键。
(2)打开New对话框,选择Files选项卡,在左侧的列表框中选择C++ Source File选项,右侧的File文本框中输入文件名称,Location文本框中设置文件保存地址,如图1.22所示,单击OK按钮,即可创建一个C源程序。
注意:因为创建的是C源文件,所以File文本框中要将C源文件的扩展名一起输入。例如,创建名称为Hello的C源文件,文本框中应输入“Hello.c"。
(3)此时可在开发环境中看到刚才创建的Hello.c源文件,如图1.23所示。
(4)将例1.1的程序代码输入其中,如图1.24所示。
(5)程序编写完成后,需要进行编译。选择Build-Compile命令,如图1.25所示。
(6)出现如图1.26所示的对话框,询问是否创建一个默认项目工作环境。单击“是”按钮,此时会询问是否要改动源文件的保存地址,如图1.27所示。
(7)单击“是”按钮后,编译程序。如果程序没有错误,即可被成功编译。虽然此时代码已经被编译,但是还没有链接生成.exe可执行文件,因此如果此时要执行程序,会出现如图1.28所示的提示对话框,询问是否要创建.exe可执行文件。单击“是”按钮,则会链接生成.exe文件,即可执行程序。
(8)当然,也有直接创建.exe文件的操作选项。可以选择Build-Build命令,执行创建.exe文件操作,如图1.29所示。
注意:在编译程序时可以直接选择Build命令进行编译、链接。这样就不用进行上面步骤(5)中的Compile操作,而可以直接将编译和链接操作一起的执行。
(9)只有执行程序才可以看到有关程序执行的结果显示,可以选择Build-Execute命令进行执行程序操作,即可观察到程序的运行结果,如图1.30所示。
Visual C++ 6.0集成开发环境提供了一些有用的工具栏按钮。例如,代表Compile操作,代表Build操作,!代表Execute操作。
编写程序时,使用快捷键会加快程序的编写进度。建议读者熟记如下常用操作的快捷键。
1.Ctrl+N:创建一个新文件。
2.Ctrl+]: 检测程序中的括号是否匹配。
3.F7:Build操作。
4.Ctrl+F5:Execute(执行)操作。
5.Alt+F8:整理多段不整齐的源代码。
F5:调试操作。
为了便于读者阅读代码,可将程序运行结果的显示底色和文字进行修改。修改过程如下。
(1)按Ctrl+F5快捷键执行一个C程序,在程序标题栏上单击鼠标右键,在弹出的快捷菜单中选择“属性”命令,如图1.31所示。
(2)此时弹出“属性”对话框,在“颜色”选项卡中对“屏幕文字”和“屏幕背景”进行修改,如图1.32所示。在此读者可以根据自己的喜好设置颜色并显示。
1.6.2 Visual Studio 2019
Microsoft Visual Studio(简称VS)是微软公司推出的开发工具集,也是目前最流行的Windows平台应用程序的集成开发环境之一。Visual Studio不仅可以编写C语言程序,还可以开发C++、C#、ASP.NET等,用其编写的代码适用于微软支持的所有平台。下面以Visual Studio 2019社区版的安装为例,讲解具体的安装过程和使用方法。
1.Visual Studio 2019的安装
Visual Studio 2019社区版是完全免费的,其下载地址为https://www.visualstudio.com/zh-hans/downloads/。安装文件是exe可执行文件,其命名格式为“vs_community_编译版本号.exe"。
(1)笔者下载的安装文件名为vs_community_1230733315.1531385802.exe文件,双击该文件开始安装。
说明:安装Visual Studio 2019开发环境前,需要先安装.NET Framework 4.6框架。如果没有安装,请先到微软官方网站下载并安装,下载地址为https://www.microsoft.com/zh-CN/download/details.aspx?id=48130。
(2)在安装程序界面中单击”继续"按钮,跳转到安装选项界面,如图1.33所示。选中”使用C++的桌面开发”复选框(其他复选框可根据个人需要确定是否安装),在“位置”文本框中设置安装路径,建议安装在D盘或其他磁盘,最后单击“安装”按钮。
注意:在安装Visual Studio 2019开发环境时,一定要确保计算机处于联网状态,否则无法正常安装。
(3)跳转到安装进度界面,显示安装进度条,如图1.34所示。
(4)安装完成后,也就是进度条为100%时,会出现如图1.35所示的界面。单击“重启”按钮,完成Visual Studio 2019的安装。
(5)重启计算机,在“开始”菜单中选择Visual Studio 2019命令,打开Visual Studio 2019。如果是第一次打开,会出现欢迎界面,单击“以后再说”按钮跳过。
(6)进入Visual Studio 2019环境的开发设置界面,如图1.36所示,在“开发设置”下拉列表框中选择Visual C++选项,颜色根据自己的喜好来选择,最后单击“启动Visual Studio”按钮。等待几秒钟后,即可进入开发欢迎界面。
2.Visual Studio 2019的使用
(1)打开Visual Studio 2019开发环境,单击“创建新项目”选项,如图1.37所示,然后在打开的界面中选择“空项目”选项,并单击“下一步”按钮,如图1.38所示。
(2)打开“配置新项目”对话框,在“项目名称”文本框中输入文件名称,在“位置”下拉列表框中设置文件保存地址(可通过选择修改地址按钮修改文件存储位置),如图1.39所示。最后单击“创建”按钮,打开如图1.40所示的窗口。
(3)选择“解决方案资源管理器”中的Demo,右击“源文件”选项,在弹出的快捷菜单中选择“添加”-“新建项”命令,如图1.41所示,或者按Shift+Ctrl+A组合键,打开“添加新项”对话框。
(4)如图1.42所示,左侧选择Visual C++选项,右侧列表框中将显示可创建的不同文件。因为要创建C源文件,因此这里选择C++ 文件(cpp)选项,在下方的“名称”文本框中输入要创建的C名称,如demo.c,在“位置”下拉列表框中设置文件的保存地址,最后单击“添加”按钮。
注意:因为要创建C源文件,所以在文本框中将默认扩展名.cpp改为c。例如,创建名称为demo的C源文件,文本框中应改为demo.c。
(5)此时已添加了一个C文件demo.c,如图1.43所示。
(6)将代码写入demo.c文件中,如图1.44所示。
(7)代码编写完之后,接下来就要编译程序了。在菜单栏中选择"生成“-"编译”命令,如图1.45所示,或者按Ctrl+F7快捷键,编译程序。
(8)编译结束后,如在输出工作空间的位置输出“生成:成功1个,失败0个,最新0个,跳过0个”,则表示编译成功。此时将得到一个可执行文件。
(9)在菜单栏中选择“调试”-”开始执行(不调试)”命令,如图1.46所示,或者按Ctrl+F5快捷键,运行程序,结果如图1.47所示。
1.7 实践与练习
综合练习1:输出三十六计 编写程序,输出三十六计中的若干计策。实现效果如下:
综合练习2:输出丹尼斯·里奇的传奇人生 丹尼斯·里奇是现代计算机及网络技术的奠定者,也是C语言和UNIX之父。1973年,丹尼斯·里奇和肯·汤姆森在玩模拟太阳系航行的Space Trave游戏时发现机器中没有操作系统,于是联合开发了C语言,并用C语言开发了UNIX操作系统,从而拉开了程序开发时代的序幕。编写程序,输出丹尼斯·里奇的传奇人生经历。实现效果如下:
综合练习3:输出搜狐邮箱登录界面 参照图1.48,编写程序,输出模拟的搜狐邮箱登录界面,效果如图1.49所示。
综合练习4:输出“情人节快乐” 每年的阳历2月14日和阴历7月7日是中西方的情人节,这是一个关于爱、浪漫以及花、巧克力、贺卡的节日,男女在这一天互换礼物,以表达爱意或友好。编写程序,打印输出如下图形。
综合练习5:输出微信个性签名 微信提供了个性签名功能,每个人都可以设置属于自己的个性签名。应用printf函数在IDLE窗口中输出如下个性签名。
综合练习6:输出图书音像勋章 某网站设置了如图1.50所示的图书音像勋章,编写程序,模拟输出类似的效果。图标可以采用特殊符号“★、▲、◆、●”代替,也可以选用其他自己喜欢的小图标加以装饰,文字颜色用紫色输出,实现效果如图1.51所示。
综合练习7:输出京东秒杀界面 京东秒杀是京东商城旗下一款品牌特卖购物的应用,其倒计时效果如图1.52所示。编写程序,输出如图1.53所示的京东秒杀的文字版。
综合练习8:输出4399游戏登录界面 参照图1.54, 输出模拟的4399游戏登录界面,效果如图1.55所示。