VC++运行C程序的基本方法.docx

上传人:b****4 文档编号:3811733 上传时间:2022-11-25 格式:DOCX 页数:17 大小:251.21KB
下载 相关 举报
VC++运行C程序的基本方法.docx_第1页
第1页 / 共17页
VC++运行C程序的基本方法.docx_第2页
第2页 / 共17页
VC++运行C程序的基本方法.docx_第3页
第3页 / 共17页
VC++运行C程序的基本方法.docx_第4页
第4页 / 共17页
VC++运行C程序的基本方法.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

VC++运行C程序的基本方法.docx

《VC++运行C程序的基本方法.docx》由会员分享,可在线阅读,更多相关《VC++运行C程序的基本方法.docx(17页珍藏版)》请在冰豆网上搜索。

VC++运行C程序的基本方法.docx

VC++运行C程序的基本方法

附录AC程序的基本开发过程

C语言程序开发涉及到四个过程:

编辑、编译、连接、装载并运行。

这些单词所表达的意义我们可以慢慢体会,下面首要的是学会依葫芦画瓢,学会按照下面的方法在VC++环境下建立一个工程、编辑源文件、编译、调试、装载并运行程序。

在Windows操作系统下,VC++环境的基本使用方法如下,详细的调试方法可参阅相关资料,或者参阅微软MSDN帮助文件。

A.1安装程序

VC++环境的安装请参阅相关的安装程序说明。

双击setup文件,然后根据提示,一路next就可以了。

A.2新建一个工程、新建一个源文件、添加源文件到工程

1.首先请在F盘(或其他盘)上建立文件夹TEST,以便将待建的C程序工程文件project等相关文件放置在该文件夹中。

2.新建一个工程project

首先鼠标左键单击“文件”菜单,选择“新建”单击鼠标左键,系统将弹出一个窗口,单击“工程”选项,将得到图A.1所示窗口。

请在“位置”栏填入刚才所建的目录F:

\TEST(可以是自己设定的其他目录),并在“工程名称”栏填入project(可以是自己命名的其他工程名),然后鼠标左键单击左边窗口倒数第三项“Win32ConsoleApplication”,使该项变蓝,然后鼠标左键单击“确定”按钮。

得到图A.2所示窗口,选择“一个空工程”,单击“完成”得到图A.3。

再单击“确定”得到图A.4所示的窗口,鼠标左键单击右下角的“FileView”字样,再单击projectfiles左边的“+”号,在其下面的工作空间将出现三个文件夹:

“SourceFiles”、“HeaderFiles”、“ResourceFiles”,如图A.5所示(此时尚无浮动菜单)。

图A.1

图A.2图A.3

图A.4

图A.5

3.新建一个源文件hello.c

要新建一个C程序源文件可以选择“文件”菜单的“新建”选项,在弹出的窗口中选择“文件”选项单击,得到如图A.6所示的窗口,其“位置”栏中的内容是默认的,在“添加到工程”前打勾,“工程名”project也是默认的,但“文件名”一栏中的内容需要自己填写,且必须是以.c为后缀,比如图中的hello.c(注:

该栏的内容一定要以.c为后缀,否则系统会默认为.cpp,这样编译时就会调用C++的编译器,而我们需要调用C语言的编译器)。

然后在左边选项中选中“C++SourceFile”选项,单击“确定”按钮,就得到了hello.c文件。

此时,右边文件区变白,我们就可以在文件区添加源程序代码了,如图A.8所示。

此时,左边的工作空间的“SourceFiles”文件夹前将出现一个“+”号,单击“+”号,其下将出现“hello.c”文件。

在hello.c文件中编制源文件将得到如图A.8所示的结果。

图A.6图A.7

图A.8

4.添加一个源文件到工程

鼠标右键单击“SourceFiles”文件夹,将弹出如图A.5所示的浮动菜单,拖动鼠标到“添加文件到目录”选项,单击鼠标左键弹出“插入文件到工程”选窗口,选择好正确的源文件,单击“确定”按钮,该源文件将添加到“SourceFiles”目录(如添加成功,“SourceFiles”文件夹前面将出现一个“+”号,鼠标左键单击加号将看到刚才添加的源文件出现在“SourceFiles”文件夹下面,鼠标左键双击该文件,该文件的内容将显示在右边的文件区,此时就可以编辑该源文件了。

注:

采用前述第3条方法生成的源文件hello.c不需要添加操作,因为在生成它时,它已经自动添加到了project工程。

A.3编译、连接、运行、调试一个程序

当源文件编辑完成后,就可以编译、连接和运行程序了。

方法如下:

单击“组建”菜单的“编译”选项,将完成编译工作得到***.obj目标文件(文件名就是源文件的名字),编译结果将在窗口最下面的输出窗口显示。

可根据窗口的提示修改源文件以改正错误。

单击“组建”菜单的“组建”选项,完成连接工作得到project.exe可执行文件(文件名是工程名),连接的结果也将在窗口最下面的输出窗口显示。

单击“组建”菜单的“全部重建”选项,将完成编译和连接两项工作,编译和连接的结果将在输出窗口显示。

单击“组建”菜单的“执行”选项,可运行程序project.exe,程序运行的结果如图A.7所示。

另外,单击“组建”菜单的“开始调试”选项,然后交替按下F11和F10快捷键可以完成程序的单步调试工作。

调试方法大家可以逐步摸索,慢慢体会,多试试自然就熟悉了。

不要怕出错误,经验是在错误中不断学习的。

A.4输出窗口的常见错误提示

在教学中,同学们在遇到编译、连接和运行错误提示时常常不知道其含义,下面罗列一下一些常见的错误,以帮助大家上机操作。

为了方便,我们采用了“倒推”的方式,我们将例题2.2的程序做一点简单修改,看看将会出现的错误和警告提示。

注:

我们将例题中的a=10和b=20两语句改为用scanf("%d,%d",&a,&b)输入。

在练习时,同学们也可以采用以下方法一步步试试,这样就会知道自己的程序编译、连接、调试、运行时出现类似问题的大致原因。

1.完全正确的程序

将例题2.2的源程序s2_2.c复制到project目录。

然后鼠标双击project目录下的project.dsw文件,将打开project工程(如新建工程也可)。

此后鼠标左键单击“SourceFiles”文件夹下方的hello.c文件,使其变蓝,然后按下键盘上的“Delete”按键,hello.c文件将从“SourceFiles”文件夹上删除。

此后可按A.2的第4操作步骤将s2_2.c源程序添加到“SourceFiles”目录。

双击“SourceFiles”文件夹下的s2_2.c文件名,将在右边窗口显示其文件内容,此后可对文件进行编辑将“a=10;b=20;”两语句删除,并在该位置添加以下二语句:

printf("Pleaseinputa,b:

");/*在屏幕上显示提示语,提示下一步的操作*/

scanf("%d,%d",&a,&b);/*调用scanf()函数输入a和b的值*/

这样程序将如下所示:

/*文件名:

s2_2.c,比较两个整数的大小*/

/*欢迎登陆C/C++教学网站:

*/

#include/*文件包含预处理命令*/

#include/*文件包含预处理命令*/

intMax(intx,inty);/*函数声明语句。

*/

intmain(void)/*主函数main(void)。

*/

{

inta,b,c;/*变量定义语句,定义了三个变量:

a,b,c*/

printf("Pleaseinputa,b:

");/*在屏幕上显示提示语,提示下一步的操作*/

scanf("%d,%d",&a,&b);/*调用scanf()函数输入a和b的值*/

c=Max(a,b);/*函数调用语句,调用自定义函数Max(),并将其返回值赋给c*/

printf("Max(a,b)=%d.\n",c);/*调用在stdio.h中声明的库函数printf()*/

/*输出系统提示并返回操作系统*/

system("PAUSE");/*调用库函数system()*/

return0;/*返回值0,返回操作系统*/

}

/*下面是Max()用户自定义函数的函数定义部分,满足函数定义的语法格式要求就是函数*/

intMax(intx,inty)/*函数头部分:

x和y为形式参数*/

{/*两个外层大括弧之间的内容为函数体部分*/

intz;/*变量定义语句。

定义了变量z*/

if(x>y)/*分支语句。

如果x>y成立,将x的值赋给z,否则将y的值赋给z*/

{

z=x;/*将x的值赋值给z变量*/

}

else

{

z=y;/*将y的值赋值给z变量*/

}

return(z);/*函数返回语句,函数返回主调函数并将z的值一并返回*/

}

点击“组建”菜单的“全部重建”按钮,执行编译、连接后,输出窗口将有如下显示:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

Linking...

project.exe-0error(s),0warning(s)

表示编译、连接正确出现0个错误,0个警告。

此时点击“组建”菜单的“执行[project.exe]”按钮,程序开始执行,系统弹出一个Dos控制台界面窗口,输出提示语:

“Pleaseinputa,b:

”(如图A.9所示),此时,输入:

“10,20”(注:

逗号为半角逗号),并按下回车,那么10将赋值给a,20将赋值给b,同时输出窗口将显示:

“Max(a,b)=20.”,表明运行正常,并求到了a和b的最大值(如图A.10所示)。

图A.9图A.10

2.输入非半角逗号导致结果不正确

在出现“Pleaseinputa,b:

”的时候,输入:

“10,20”(全角逗号),此时系统输出为:

“Max(a,b)=10.”。

结果并不是希望的20,原因是20并未输入给b,在scanf()的输入格式控制字符串中的两个%d和%d之间有一个半角逗号,必须原样输入。

上述输入中系统并未接收到半角逗号所以20也就不可能输入给b。

另外,如果在输入时输入“1020”(中间无半角逗号,只有空格),也会得到同样的结果。

当我们将“scanf("%d,%d",&a,&b);”改为“scanf("%d%d",&a,&b);”时,此时就可以在输入时用空格来分隔两个输入的整数。

3.在main()函数前面将函数声明语句“intMax(intx,inty);”注释掉

单击“组建”菜单的“编译”按钮,此时将会出现如下编译结果提示:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

F:

\test\project\s2_2.c(16):

warningC4013:

'Max'undefined;assumingexternreturningint

s2_2.obj-0error(s),0warning(s)

出现了C4013警告,它通知Max函数标识符未定义,并假定其返回int型数据类型。

在C89中,系统还可以假定它返回int,本题看起来也是正确的,但假设Max函数本身返回的不是int而是double,系统的这种假定就错误了。

另外,C99中,所有的函数在使用前都应声明(main函数除外)。

所以请养成习惯,使用前先对函数进行声明。

4.在main()函数前面将函数声明语句“intMax(intx,inty);”改为“doubleMax(intx,inty);”

单击“组建”菜单的“编译”按钮,此时将会出现如下编译结果提示:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

F:

\test\project\s2_2.c(16):

warningC4244:

'=':

conversionfrom'double'to'int',possiblelossofdata

F:

\test\project\s2_2.c(26):

errorC2371:

'Max':

redefinition;differentbasictypes

F:

\test\project\s2_2.c(7):

seedeclarationof'Max'

执行cl.exe时出错.

s2_2.obj-1error(s),0warning(s)

系统报告了一个警告和一个错误。

鼠标左键双击输出窗口的C4244警告,将在程序窗口出现一个蓝色箭头指向警告所在行,说明错误就在该行或者该行附近。

在“c=Max(a,b);”语句中,c是int型而Max()的返回值被声明为double型,所以系统警告说:

从double赋值给int进行的赋值转换,将可能引起数据丢失。

鼠标左键双击C2371错误提示,将在程序窗口出现一个蓝色箭头指向错误所在行,说明错误可能就在该行。

该错误提示说明:

Max()重复定义了。

事实上我们在声明时Max()返回double,而在定义时返回int,所以系统认为这是两个不同的定义,而且名字又相同,当然是重复定义了。

将声明语句的daouble改回int即可。

C2371下面一句是提示我们查找错误的线索——请参阅Max()的声明语句,鼠标左键双击它,程序窗口的蓝色箭头就会出现在该声明语句前面。

提示语“执行cl.exe时出错.”是告诉我们编译出错了。

在VC环境中,cl.exe和link.exe分别是对应编译功能和连接功能的执行文件,当程序中有语法错误,在执行编译时,系统就会提示“执行cl.exe时出错.”;当执行连接操作时,出现谅解错误时,系统将报告“执行link.exe时出错.”。

4.函数调用时,在实参前面错误增加数据类型说明,比如将“c=Max(a,b);”语句改为“c=Max(inta,intb);”

系统输出窗口显示如下:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

F:

\test\project\s2_2.c(16):

errorC2143:

syntaxerror:

missing')'before'type'

F:

\test\project\s2_2.c(16):

errorC2198:

'Max':

toofewactualparameters

F:

\test\project\s2_2.c(16):

errorC2059:

syntaxerror:

')'

执行cl.exe时出错.

s2_2.obj-1error(s),0warning(s)

鼠标左键双击错误c2134、c2198或c2059,蓝色肩头都将出现在“c=Max(inta,intb);”语句左边,说明是该语句的错误。

在函数定义和函数声明中所有形式参数前都应该有类型说明,但是在函数调用时,在实参前面则不能加类型说明了,因为编译系统早已知道了实参的类型。

5.函数调用时,实参与形式参数个数和类型不匹配,把“c=Max(a,b);”语句改为“c=Max(a);”

系统输出窗口显示如下:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

F:

\test\project\s2_2.c(16):

errorC2198:

'Max':

toofewactualparameters

执行cl.exe时出错.

s2_2.obj-1error(s),0warning(s)

错误C2198提示:

Max()实际参数过少。

函数需要两个参数,实际只给了一个参数,自然参数不匹配。

6.函数调用时,实参与形式参数个数和类型不匹配“c=Max(a,b);”语句改为“c=Max(a,a,a);”

将出现以下错误提示:

F:

\test\project\s2_2.c(16):

warningC4020:

'Max':

toomanyactualparameters

错误C4020提示:

Max()实际参数过多。

7.在main()函数中将语句“scanf("%d,%d",&a,&b);”改为“scanf("%d,%d",a,b);”

系统输出窗口显示如下:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

F:

\test\project\s2_2.c(14):

warningC4700:

localvariable'b'usedwithouthavingbeeninitialized

F:

\test\project\s2_2.c(14):

warningC4700:

localvariable'a'usedwithouthavingbeeninitialized

s2_2.obj-0error(s),0warning(s)

警告C4700提示:

变量a,b未经初始化就使用。

此时虽然未报告错误,但是实际上程序是不能运行的。

运行程序时,在系统提示:

“Pleaseinputa,b:

”后,从键盘输入的值10和20将不可能输入给a和b。

并且系统弹出如图A.11所示的错误提示框,表明内存错误。

因为scanf()的输入项应该是地址项,对于一般变量必须通过&取变量的地址,只有本来就是指针变量或者数组名等才可以直接使用。

这其实是内存错误的一种。

尤其当我们定义了一个指针变量,而又没有让该指针变量指向任何变量时,却通过该指针变量操作其指向的内容时,通常也会出现类似的内存错误。

图A.11图A.12

8.在main()函数中注释掉语句“scanf("%d,%d",&a,&b);”

系统输出窗口显示将同第7点,出现警告C4700提示:

变量a,b未经初始化就使用。

但这种情况下,程序能够运行,只是运行的结果莫名其妙,如下:

Pleaseinputa,b:

Max(a,b)=-858993460.

结果并不正确,因为a和b没有一个确定值,结果无意义。

9.在main()函数中将语句“scanf("%d,%d",&a,&b);”改为“scanf("%f,%f",&a,&b);”

此时点击“组建”菜单的“全部构建”按钮,系统不会出现任何警告或者错误提示,表明编译和连接都已经正常通过。

但是运行时却出现如图A.12所示的错误提示。

它表明了一种运行时错误。

这主要是由于输入格式不对应,a和b本为int类型,我们却以浮点型去输入当然是错误的。

而C语言是有比较严格类型检查的。

当我们将“scanf("%d,%d",&a,&b);”改为“scanf("%l,%l",&a,&b);”时,同样得不到正确的结果,因为长整型的格式控制字符串是%ld而不是%l。

改为“scanf("%ld,%ld",&a,&b);”则可以。

10.注释掉“#include

编译、连接时系统将出现如下警告提示:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

f:

\test\project\s2_2.c(13):

warningC4013:

'printf'undefined;assumingexternreturningint

f:

\test\project\s2_2.c(14):

warningC4013:

'scanf'undefined;assumingexternreturningint

s2_2.obj-0error(s),0warning(s)

警告C4013:

printf和scanf未定义。

这两个函数是系统库函数,由编译器生产厂家提供,在头文件中声明,因此要想使用它们必须在源文件中用包含预处理命令:

“#include”将它们包含进源文件。

否则,系统在编译时将发出上述警告。

虽然执行连接操作时能够正确连接,系统运行也能够正确调用printf()和scanf()函数,但是请大家记住该包含预处理命令是每一个程序都应该包含的,文件中还定义了许多有用的东西。

11.在main()函数中将语句“inta,b,c;”注释掉

编译时将得到以下结果:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

F:

\test\project\s2_2.c(14):

errorC2065:

'a':

undeclaredidentifier

F:

\test\project\s2_2.c(14):

errorC2065:

'b':

undeclaredidentifier

F:

\test\project\s2_2.c(16):

errorC2065:

'c':

undeclaredidentifier

执行cl.exe时出错.

s2_2.obj-1error(s),0warning(s)

它表明a,b,c三个标识符没有定义。

变量必须先定义、然后才能使用。

12.在main()函数中将语句“inta,b,c;”的分号去掉

编译时将出现以下错误提示:

F:

\test\project\s2_2.c(13):

errorC2146:

syntaxerror:

missing';'beforeidentifier'printf'

C2146错误:

在printf前丢失分号。

13.将Max()函数的“if(x>y)”改为“if(x>y);”

编译时将出现如下错误提示:

--------------------Configuration:

project-Win32Debug--------------------

Compiling...

s2_2.c

F:

\test\project\s2_2.c(33):

errorC2181:

illegalelsewithoutmatchingif

执行cl.exe时出错.

s2_2.obj-1error(s),0warning(s)

C2181错误,非法else,没有与其匹配的if。

因为在if(x>y)后面加上分号后,它就变成了一个完整的单分支if语句。

分号就是一个空语句,它的语句体就是该空语句。

这样后面的else就没有配套的if了。

所以出错。

14.将Max()函数的“return(z)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1