声明:
《零基础学Qt4编程》中的专栏文章是qter_wd007的原创技术文章。
本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的原始地址。
作者保留版权,未经作者预先书面许可,不得用于任何商业用途。否则相关的法律责任请自付。
实例说明:
本例将编写一个实现直角三角形斜边的程序,在这过程中需要进行开平方运算,通过调用C++标准库自带的函数可以实现该功能。通过学习这个例子,读者可以掌握C++语言中文件包含语句的使用以及如何使用标准类库中提供的函数。这个控制台程序是在Qt Creator中完成的。
我们将给出两个完整的代码,分别使用C库和C++库来实现,我们也会为大家分析两者的不同,请读者细心体会。
文件包含语句的工作原理:
几乎每一个程序的开头都会看到这样的语句,即文件包含指令:
#include “文件名”
或者是:
#include<文件名>
编译器遇到文件包含指令时,把指令所指文件的全部内容包含到应用程序中,替代这条文件包含指令,并作为源程序的一部分。
实例讲解:
1.文件包含指令
#include<文件名>形式指定的文件是由系统提供的标准类库文件。如果安装了Microsoft的Visual Studio,则一般的C++类库文件都放在Microsoft Visual Studio的主目录”VC/Include/”下(Visual Studio 6.0则是在VC98/Include下),Qt 4的类库文件都放在Qt 4的主目录”C:/Qt/4.5.0/include”(以我安装的Qt 4.5.0版,采用默认安装SDK方法为例。读者的实际情况请对应查找验证路径)下。编译器会在默认目录下搜索文件包含指令中指定的文件。
#include “文件名”这种形式一般用于包含用户自己编写的文件。编译程序先在当前目录中查找包含文件,如找不到,再在上面列出的两个缺省目录中查找。建议统一采用这种形式来处理文件包含指令。
2.编写勾三股四弦必五程序
下面举一个使用数学函数的例子来说明这个问题。该程序实现直角三角形斜边求取的功能,其中需要用到开平方的操作。无论是计算机还是人,精确的开平方运算都是一项很困难的工作,C++的数学函数库中提供了开平方操作的函数:
double sqrt(double x);
使用它之前需要在文件的开始处加入文件包含语句:
#include “math.h”
然后就可以在文件的任何位置使用这个函数。printf和scanf函数的声明则包含在标准输入输出类库头文件stdio.h中。
3.操作步骤
按照实例1的步骤创建一个基于控制台的工程gou3gu4xian5。
第1步,创建项目
选择菜单“File->New...”,弹出新建(New)对话框,如图1所示。
图1 创建控制台类型的应用程序
在其中选择【Projects->Qt4 Console Application】,创建一个控制台类型的应用程序,然后点击【OK】按钮,进入下一步设置。
第2步,设置工程名称和路径
如图2所示,首先通过点击【Browse...】按钮来选择工程文件的存放位置,然后再在【Name:】文本框中输入工程的名称,我们这里是gou3gu4xian5。设置完成后,点击【Next】按钮进入下一步设置。
图2 设置应用程序的保存位置和名称
第3步,选择要包含的Qt4模块
如图3所示,在【选择需要包含的模块(Select required modules)】对话框中,通过勾选各个模块前面的复选框来选中它们,我们这里是简单的控制台程序,只需选中默认的【QtCore Module】即可,然后点击【Next】按钮进入下一步设置。
图3 选择需要包含的模块
小贴士:在Qt Creator中如何回到上一步再重新设置
如果对上一步的设置不满意,怎样回到上一步的设置呢?有同学可能回苦恼,Qt Creator的向导式设置页面中并没有提供这样的按钮啊。其实是有的,只不过它并不在我们习惯的右下角,而是在对话框的左上角,有一个左右箭头的图标,当可以回到上一步再进行设置时,它会显示为明亮的蓝色,如图4所示。
图4页面导航按钮
第4步,完成创建
如图5所示,Qt Creator根据前面我们提供的信息,给出了该工程的摘要,我们确认无误后,点击【Finish】按钮,完成工程的创建。
图5 完成工程的创建
这时,Qt Creator会把创建完成的工程展现在我们面前,如图6所示,工程中包含了一个.pro文件和一个main.cpp文件。
图6 创建好的工程浏览
第5步,书写程序代码
我们在Qt Creator的代码编辑器中完成代码的编写。这个程序主要是对main()主函数的修改,在Projects边栏中双击main.cpp,在右边的代码编辑器中输入以下的代码:
#include <QtCore/QCoreApplication>
#include "stdio.h"
#include "math.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
float a = 0.0;
float b = 0.0;
float c = 0.0;
printf(" |///n");
printf(" | // c/n");
printf(" a| ///n");
printf(" |___///n");
printf(" b/n");
printf("请输入直角边边长a:/n");
scanf("%f",&a);
printf("请输入另一条直角边边长b:/n");
scanf("%f",&b);
c = sqrt(a*a + b*b);
printf("斜边边长为:%f /n",c);
//system("pause");
return app.exec();
}
完成编辑后,按下Ctrl+Shift+S键,保存工程后的情形如图7所示。
图7 完成代码编辑后的情形
第6步,编译运行程序
编译(Ctrl+B)运行(Ctrl+R)程序,得到程序运行的结果如图8所示:
图8 程序运行结果
说明:C++标准类库包含了大量的应用函数,程序员必须知道如何查找和利用这些类库资源。这里给出一些常用的类库的头文件,如表1所示。
表1 常用类库函数头文件及其内容
头文件名 |
包含函数的主要功能 |
conio.h |
文本处理、输入输出函数等 |
dir.h |
目录处理 |
float.h |
定义float、double、long double等类型的属性 |
iostream.h |
输入输出流相关操作 |
malloc.h |
内存操作 |
math.h |
数学函数、相关的宏和类型 |
stdio.h |
标准输入输出函数 |
stdlib.h |
整数运算、字符转换、内存管理等 |
string.h |
字符串处理 |
time.h |
与时间相关的操作 |
windows.h |
windows应用程序所需的数据类型和数据结构定义 |
下面是我们使用C++习惯来编写的程序代码,main.cpp文件内容如下:
#include <QtCore/QCoreApplication>
//#include "stdio.h"
#include "iostream.h"
#include "math.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
float a = 0.0;
float b = 0.0;
float c = 0.0;
cout << " |///n";
cout << " | // c/n";
cout << " a| ///n";
cout << " |___///n";
cout << " b/n";
cout << "请输入直角边边长a:/n";
cin >> a;
cout<< "请输入另一条直角边边长b:/n";
cin >> b;
c = sqrt(a*a + b*b);
cout << "斜边边长为:/n",c;
//system("pause");
return app.exec();
}
熟悉C语言的读者不难看出,用C++编写的程序和用C编写的程序在程序结构上是基本相同的,都是以main()函数作为程序的入口,两者都是以一对{}把函数中的语句括起来,而且两者都是以分号作为语句的结束标志。但是,两者也有一些不同之处,C++中是以iostream.h文件作为标准输入输出头文件,C中则是以stdio.h作为标准输入输出头文件;C++中采用符号“<<”作为标准输出,而不是通过printf函数来实现。
为了进一步理解文件包含的概念,我们将a、b、c、三个变量的定义放到另一文件中,并用文件包含指令将其加入main.cpp中。选择菜单“File->New”,在弹出的【New】对话框中选择“C++->C++ Header File”,如图9所示。
图9 新建一个C++头文件
在接下来弹出的【Choose the location】对话框中输入文件名"var.h",保存位置选择默认即可,如图10所示。
图10 为新文件命名并确定其位置
将原来main.cpp中的变量声明语句
float a = 0.0;
float b = 0.0;
float c = 0.0;
放入到var.h文件中,将该段语句在main.cpp中删除,并在main.cpp前面加入文件包含指令:
#include "var.h"
再次编译运行程序,可以得到和步骤中相同的运行效果。这里不再赘述,请读者自行完成。
注意:这里为了演示类库包含语句的使用,才选择了将变量定义放在C++头文件中的,但读者要知道,这并不是推荐的做法。
本节重点回顾:
C++语言是一种支持模块化的语言,编译器编译应用程序使用到的模块,这样能大大提高编译效率,生成的应用程序也相对比较小。
模块化最大的好处是源代码的重复利用。Qt 4中包含了可视化程序需要的大部分框架,程序员可以根据需要选择程序的框架结构,而省去了大量重复性的代码编写工作。模块化给程序员开发带来了巨大的方便,程序员可以根据需要编写自己需要的类库文件,在多个程序中可以以包含文件的形式进行调用;程序员也可以将一个大型的程序划分为功能相对独立的多个部分,对各个部分分别进行编写调试,最后再用文件包含指令将所有的文件整合成一个大的程序,由此也产生了工程(Project)的概念。顺带提一句,在光鲜的Qt Creator的后面,Qt 4是在用.pro文件管理工程设置等信息。
事实上,C++语言和C语言两者之间既有紧密的联系,又各有自己的特点。在以后的章节中,我们将会为大家讲解C++的基础知识,这部分内容里面,C++和C语言有很多是一致的。