




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC+环境的C程序的基本开发过程C语言程序开发涉及到四个过程:编辑、编译、连接、装载并运行。A.2 新建一个工程、新建一个源文件、添加源文件到工程1首先请在F盘(或其他盘)上建立文件夹TEST,以便将待建的C程序工程文件project等相关文件放置在该文件夹中。2新建一个工程project 首先鼠标左键单击“文件”菜单,选择“新建”单击鼠标左键,系统将弹出一个窗口,单击“工程”选项,将得到图A.1所示窗口。请在“位置”栏填入刚才所建的目录F:TEST(可以是自己设定的其他目录),并在“工程名称”栏填入project(可以是自己命名的其他工程名),然后鼠标左键单击左边窗口倒数第三项“Win32 Console Application”,然后鼠标左键单击“确定”按钮。得到图A.2所示窗口。图A.1选择“一个空工程”,单击“完成”得到图A.3。再单击“确定”得到图A.4所示的窗口。图A.2图A.3鼠标左键单击右下角的“FileView”字样,再单击project files左边的“+”号,在其下面的工作空间将出现三个文件夹:“Source Files”、“Header Files”、“Resource Files”,如图A.5所示(此时尚无浮动菜单)。图A.4图A.53新建一个源文件hello.c要新建一个C程序源文件可以选择“文件”菜单的“新建”选项,在弹出的窗口中选择“文件”选项单击,得到如图A.6所示的窗口,其“位置”栏中的内容是默认的,在“添加到工程”前打勾,“工程名”project也是默认的,但“文件名”一栏中的内容需要自己填写,且必须是以.c为后缀,比如图中的 hello.c(注:该栏的内容一定要以.c为后缀,否则系统会默认为.cpp,这样编译时就会调用C+的编译器,而我们需要调用C语言的编译器)。然后在左边选项中选中“C+ Source File”选项,单击“确定”按钮,就得到了hello.c文件。我们就可以在文件区添加源程序代码了,如图A.8所示。此时,左边的工作空间的“Source Files”文件夹前将出现一个“+”号,单击“+”号,其下将出现“hello.c”文件。在hello.c文件中编制源文件将得到如图A.8所示的结果。 图A.6图A.7图A.84添加一个源文件到工程鼠标右键单击“Source Files”文件夹,将弹出如图A.5所示的浮动菜单,拖动鼠标到“添加文件到目录”选项,单击鼠标左键弹出“插入文件到工程”选窗口,选择好正确的源文件,单击“确定”按钮,该源文件将添加到“Source Files”目录(如添加成功,“Source Files”文件夹前面将出现一个“+”号,鼠标左键单击加号将看到刚才添加的源文件出现在“Source Files”文件夹下面,鼠标左键双击该文件,该文件的内容将显示在右边的文件区,此时就可以编辑该源文件了。注:采用前述第3条方法生成的源文件hello.c不需要添加操作,因为在生成它时,它已经自动添加到了project工程。A.3 编译、连接、运行、调试一个程序当源文件编辑完成后,就可以编译、连接和运行程序了。方法如下:单击“组建”菜单的“编译”选项,将完成编译工作得到*.obj目标文件(文件名就是源文件的名字),编译结果将在窗口最下面的输出窗口显示。可根据窗口的提示修改源文件以改正错误。单击“组建”菜单的“组建”选项,完成连接工作得到project.exe可执行文件(文件名是工程名),连接的结果也将在窗口最下面的输出窗口显示。单击“组建”菜单的“全部重建”选项,将完成编译和连接两项工作,编译和连接的结果将在输出窗口显示。单击“组建”菜单的“执行”选项,可运行程序project.exe,程序运行的结果如图A.7所示。另外,单击“组建”菜单的“开始调试”选项,然后交替按下F11和F10快捷键可以完成程序的单步调试工作。调试方法大家可以逐步摸索,慢慢体会,多试试自然就熟悉了。不要怕出错误,经验是在错误中不断学习的。A.4 输出窗口的常见错误提示下面罗列一下一些常见的错误,看看将会出现的错误和警告提示。在练习时,同学们也可以采用以下方法一步步试试,这样就会知道自己的程序编译、连接、调试、运行时出现类似问题的大致原因。1完全正确的程序将例题2.2的源程序s2_2.c复制到project目录。然后鼠标双击project目录下的project.dsw文件,将打开project工程(如新建工程也可)。此后鼠标左键单击“Source Files”文件夹下方的hello.c文件,使其变蓝,然后按下键盘上的“Delete”按键,hello.c文件将从“Source Files”文件夹上删除。此后可按 A.2的第4操作步骤将s2_2.c源程序添加到“Source Files”目录。双击“Source Files”文件夹下的s2_2.c文件名,将在右边窗口显示其文件内容,此后可对文件进行编辑将“a=10;b=20;”两语句删除,并在该位置添加以下二语句:printf(Please input a, b:);/* 在屏幕上显示提示语,提示下一步的操作 */scanf(%d,%d, &a, &b);/* 调用scanf()函数输入a和b的值 */这样程序将如下所示:/* 文件名:s2_2.c,比较两个整数的大小 */* 欢迎登陆C/C+教学网站:/chenliangyin */#include /* 文件包含预处理命令 */#include /* 文件包含预处理命令 */int Max (int x, int y);/* 函数声明语句。*/int main (void)/* 主函数main(void)。*/ int a, b, c;/* 变量定义语句,定义了三个变量:a,b,c */printf(Please input a, 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( ) */ return 0; /* 返回值0,返回操作系统 */ /* 下面是Max( )用户自定义函数的函数定义部分,满足函数定义的语法格式要求就是函数 */int Max (int x, int y)/* 函数头部分:x和y为形式参数 */* 两个外层大括弧之间的内容为函数体部分 */ int z;/* 变量定义语句。定义了变量z */ if ( xy )/* 分支语句。如果xy成立,将x的值赋给z,否则将y的值赋给z */ z = x;/* 将x的值赋值给z变量 */ else z = y;/* 将y的值赋值给z变量 */ return (z);/* 函数返回语句,函数返回主调函数并将z的值一并返回 */点击“组建”菜单的“全部重建”按钮,执行编译、连接后,输出窗口将有如下显示:-Configuration: project - Win32 Debug-Compiling.s2_2.cLject.exe - 0 error(s), 0 warning(s)表示编译、连接正确出现0个错误,0个警告。此时点击“组建”菜单的“执行project.exe”按钮,程序开始执行,系统弹出一个Dos控制台界面窗口,输出提示语:“Please input a, b:”(如图A.9所示),此时,输入:“10,20”(注:逗号为半角逗号),并按下回车,那么10将赋值给a,20将赋值给b,同时输出窗口将显示:“Max (a, b) = 20.”,表明运行正常,并求到了a和b的最大值(如图A.10所示)。图A.9图A.102输入非半角逗号导致结果不正确在出现“Please input a, b:”的时候,输入:“10,20”(全角逗号),此时系统输出为:“Max (a, b) = 10.”。结果并不是希望的20,原因是20并未输入给b,在scanf( )的输入格式控制字符串中的两个%d和%d之间有一个半角逗号,必须原样输入。上述输入中系统并未接收到半角逗号所以20也就不可能输入给b。另外,如果在输入时输入“10 20”(中间无半角逗号,只有空格),也会得到同样的结果。当我们将“scanf(%d,%d, &a, &b);”改为“scanf(%d%d, &a, &b);”时,此时就可以在输入时用空格来分隔两个输入的整数。3在main()函数前面将函数声明语句“int Max (int x, int y);”注释掉单击“组建”菜单的“编译”按钮,此时将会出现如下编译结果提示:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(16) : warning C4013: Max undefined; assuming extern returning ints2_2.obj - 0 error(s), 0 warning(s)出现了C4013警告,它通知Max函数标识符未定义,并假定其返回int型数据类型。在C89中,系统还可以假定它返回int,本题看起来也是正确的,但假设Max函数本身返回的不是int而是double,系统的这种假定就错误了。另外,C99中,所有的函数在使用前都应声明(main函数除外)。所以请养成习惯,使用前先对函数进行声明。4在main()函数前面将函数声明语句“int Max (int x, int y);”改为“double Max (int x, int y);”单击“组建”菜单的“编译”按钮,此时将会出现如下编译结果提示:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(16) : warning C4244: = : conversion from double to int , possible loss of dataF:testprojects2_2.c(26) : error C2371: Max : redefinition; different basic types F:testprojects2_2.c(7) : see declaration of Max执行 cl.exe 时出错.s2_2.obj - 1 error(s), 0 warning(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 (int a, int b);”系统输出窗口显示如下:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(16) : error C2143: syntax error : missing ) before typeF:testprojects2_2.c(16) : error C2198: Max : too few actual parametersF:testprojects2_2.c(16) : error C2059: syntax error : )执行 cl.exe 时出错.s2_2.obj - 1 error(s), 0 warning(s)鼠标左键双击错误c2134、c2198或c2059,蓝色肩头都将出现在“c = Max (int a, int b);”语句左边,说明是该语句的错误。在函数定义和函数声明中所有形式参数前都应该有类型说明,但是在函数调用时,在实参前面则不能加类型说明了,因为编译系统早已知道了实参的类型。5函数调用时,实参与形式参数个数和类型不匹配,把“c = Max (a, b);”语句改为“c = Max ( a);” 系统输出窗口显示如下:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(16) : error C2198: Max : too few actual parameters执行 cl.exe 时出错.s2_2.obj - 1 error(s), 0 warning(s)错误C2198提示:Max( )实际参数过少。函数需要两个参数,实际只给了一个参数,自然参数不匹配。6函数调用时,实参与形式参数个数和类型不匹配“c = Max (a, b);”语句改为“c = Max ( a, a, a);”将出现以下错误提示:F:testprojects2_2.c(16) : warning C4020: Max : too many actual parameters错误C4020提示:Max( )实际参数过多。7在main()函数中将语句“scanf(%d,%d, &a, &b);”改为“scanf(%d,%d, a, b);”系统输出窗口显示如下:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(14) : warning C4700: local variable b used without having been initializedF:testprojects2_2.c(14) : warning C4700: local variable a used without having been initializeds2_2.obj - 0 error(s), 0 warning(s)警告C4700提示:变量a,b未经初始化就使用。此时虽然未报告错误,但是实际上程序是不能运行的。运行程序时,在系统提示:“Please input a, b:”后,从键盘输入的值10和20将不可能输入给a和b。并且系统弹出如图A.11所示的错误提示框,表明内存错误。因为scanf( )的输入项应该是地址项,对于一般变量必须通过&取变量的地址,只有本来就是指针变量或者数组名等才可以直接使用。这其实是内存错误的一种。尤其当我们定义了一个指针变量,而又没有让该指针变量指向任何变量时,却通过该指针变量操作其指向的内容时,通常也会出现类似的内存错误。 图A.11图A.128在main()函数中注释掉语句“scanf(%d,%d, &a, &b);”系统输出窗口显示将同第7点,出现警告C4700提示:变量a,b未经初始化就使用。但这种情况下,程序能够运行,只是运行的结果莫名其妙,如下:Please input a, 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 - Win32 Debug-Compiling.s2_2.cf:testprojects2_2.c(13) : warning C4013: printf undefined; assuming extern returning intf:testprojects2_2.c(14) : warning C4013: scanf undefined; assuming extern returning ints2_2.obj - 0 error(s), 0 warning(s)警告C4013:printf和scanf未定义。这两个函数是系统库函数,由编译器生产厂家提供,在头文件中声明,因此要想使用它们必须在源文件中用包含预处理命令:“#include ”将它们包含进源文件。否则,系统在编译时将发出上述警告。虽然执行连接操作时能够正确连接,系统运行也能够正确调用printf( )和scanf( )函数,但是请大家记住该包含预处理命令是每一个程序都应该包含的,文件中还定义了许多有用的东西。11在main()函数中将语句“int a,b,c;”注释掉编译时将得到以下结果:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(14) : error C2065: a : undeclared identifierF:testprojects2_2.c(14) : error C2065: b : undeclared identifierF:testprojects2_2.c(16) : error C2065: c : undeclared identifier执行 cl.exe 时出错.s2_2.obj - 1 error(s), 0 warning(s)它表明a,b,c三个标识符没有定义。变量必须先定义、然后才能使用。12在main()函数中将语句“int a,b,c;”的分号去掉编译时将出现以下错误提示:F:testprojects2_2.c(13) : error C2146: syntax error : missing ; before identifier printfC2146错误:在printf前丢失分号。13将Max()函数的“if ( x y )”改为“if ( x y );”编译时将出现如下错误提示:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(33) : error C2181: illegal else without matching if执行 cl.exe 时出错.s2_2.obj - 1 error(s), 0 warning(s)C2181错误,非法else,没有与其匹配的if。因为在if(xy)后面加上分号后,它就变成了一个完整的单分支if语句。分号就是一个空语句,它的语句体就是该空语句。这样后面的else就没有配套的if了。所以出错。14将Max()函数的“return (z);”语句注释掉编译时将出现如下错误提示:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(39) : warning C4716: Max : must return a values2_2.obj - 0 error(s), 0 warning(s)警告C4716提示,Max()函数必须返回一个值。鼠标左键双击该警告,程序中Max( )函数定义体的右大括符所在一行将出现蓝色箭头。表示到此为止还没有return语句。15在main()函数中将语句“printf (Max (a, b) = %d.n, c);”改为“printf (Max (a, b) = %d.n);”此时,编译、连接都正确,但是输出结果却不正确,因为%d占位符根本就没有对应的输出项。自然不会有任何输出结果。16在main()函数中将语句“printf (Max (a, b) = %d.n, c);”改为“printf (Max (a, b) = %f.n, c);”此时,编译、连接都正确,但是会出现第9条的运行时错误。原因就是类型不匹配。所以C语言程序需要特别注意输入输出格式和数据类型的严格匹配。17在Max ( )的定义体部分,在其函数头部增加分号,变为“int Max (int x, int y);”此时,编译将报错:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(26) : error C2449: found at file scope (missing function header?)F:testprojects2_2.c(39) : error C2059: syntax error : 执行 cl.exe 时出错.project.exe - 1 error(s), 0 warning(s)错误C2449表明在文件范围内丢失文件头,事实上,它把“int Max (int x, int y);”当成了一个独立的函数声明语句,这样其后的函数体自然就没有了函数头,所以报错。18当我们去掉main()函数前的函数声明语句“int Max (int x, int y);”后面的分号时此时,编译将不能够通过,将报告如下错误:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(10) : error C2085: main : not in formal parameter listF:testprojects2_2.c(10) : error C2143: syntax error : missing ; before F:testprojects2_2.c(26) : error C2084: function int _cdecl Max(int ,int ) already has a body执行 cl.exe 时出错.s2_2.obj - 1 error(s), 0 warning(s)这样,系统将会把该Max()视为函数定义,所以它会认为main()应该是函数体的一个语句,丢失了分号,而且后面居然还有Max()函数体定义,自然被认为重复定义。而事实上我们只是丢失了一个分号。19假设将语句“scanf(%d,%d, &a, &b);”用以下两语句取代:“a = getchar( ); b = getchar( );”取代此时,编译、连接都会正常通过,但是请特别注意输入的使用:假设想将65赋值给a,将66赋值给b,在出现:“Please input a, b:”时,正确的输入应该是连续输入AB并回车;绝对不能输入“A空格B回车”,这样赋值给b的将是空格;也不能输入“A回车B回车”,这样赋值给b的将是回车。此后比较的结果自然不正确。20假设将“c = Max(a,b);”语句改为“c = Max1(a,b);”此时将出现如下编译、连接警告和错误提示:-Configuration: project - Win32 Debug-Compiling.s2_2.cF:testprojects2_2.c(16) : warning C4013: Max1 undefined; assuming extern returning intLinking.s2_2.obj : error LNK2001: unresolved external symbol _Max1Debug/project.exe : fatal error LNK1120: 1 unresolved externals执行 link.exe 时出错.project.exe - 1 error(s), 0 warning(s)C4013警告表明Max1标识符未定义。LNK2001错误表明不能够解析外部标识符_Max1,因为Max1在本文件中找不到定义,所以系统会认为它是一个在别的源文件中定义的外部标识符,但是无法解析该外部标识符,所以无法连接,出现致命的LNK1120错误。link.exe是连接操作的执行文件,由于无法解析标识符,所以系统报告“执行link.exe时出错.”。该错误看起来很幼稚,但是我们在编程时却经常出现类似错误,原因多半是由于函数名、变量名等标识符前后不一致造成的。有同学经常大小写不分,l和1不分,0和o不分,造成书写错误。21把“int main (void)”头部改为“int mian (void)”,看看编译、连接时有什么反映编译将正常通过,但连接却会报告如下错误:-Configuration: project - Win32 Debug-Linking.LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/project.exe : fatal error LNK1120: 1 unresolved externals执行 link.exe 时出错.project.exe - 1 error(s), 0 warning(s)系统报告无法解析外部标识符_main,因为每个C程序都必须有一个main()函数,在本程序中错把main写为了mian,系统自然找不到main,所以只好到其他源文件中去找,依然找不到,所以报告无法解析外部标识符main。曾有不止一个同学在执行s2_1.c程序时,信誓旦旦的告诉我:“陈老师,我的程序绝对和书上的一模一样,没有任何不同,可就是通不过,不知道是何原因?”。人们从来不相信自己会把main写成mian。22将main( )函数中的语句“int a, b, c;”改为“int a, b, c, d;”系统编译时将出现以下警告:F:testprojects2_2.c(11) : warning C4101: d : unreferenced local variable它提示C4101警告:d局部变量(实际就是内部变量)未引用。也就是说该变量定义后不曾使用。实际编程时,一般的警告都不足以引起致命错误,但是建议大家还是要高度重视警告,它是程序出现bug的重要提示信息。最好将程序中的所有警告都消除,以增强程序的正确性。23请将hello.c文件和s2_2文件同时添加到”S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年营养师考试冲刺试卷:实操技能与心理营养深度解析
- 新能源汽车发展前景
- 深层搅拌桩软基处理施工方案
- 2025年东北师范大学教师教育研究院春季学期专任教师招聘7人考前自测高频考点模拟试题及答案详解(新)
- 2024计算机四级考前冲刺练习试题及答案详解【夺冠】
- 2024计算机四级考前冲刺练习及答案详解【考点梳理】
- 2025临床执业医师测试卷(名校卷)附答案详解
- 2024-2025学年自考专业(计算机网络)考试彩蛋押题含答案详解(完整版)
- 2024自考专业(建筑工程)考试黑钻押题含答案详解(培优A卷)
- 2024-2025学年度广播电视播音员主持人能力提升B卷题库附参考答案详解【能力提升】
- GB/T 8167-1987包装用缓冲材料动态压缩试验方法
- GB/T 34903.2-2017石油、石化与天然气工业与油气开采相关介质接触的非金属材料第2部分:弹性体
- GB/T 19806-2005塑料管材和管件聚乙烯电熔组件的挤压剥离试验
- -Unit 2知识点归纳 牛津译林版英语九年级上册
- 中医内科学表格
- 陶瓷-课件商周至汉代瓷器
- 村卫生室健康扶贫督导考核表
- DB37T 3842-2019 铁矿绿色矿山建设规范
- 《光电显示技术》OLED原理
- 诊断学基础知识常见症状ppt课件
- 丰田安全管理(安全班组活动)(课堂PPT)
评论
0/150
提交评论