为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

vc++6.0集成环境下de c 语言编译操作指导

2011-09-30 47页 doc 1MB 53阅读

用户头像

is_847720

暂无简介

举报
vc++6.0集成环境下de c 语言编译操作指导1 上机实验目的与要求 一、实验目的 上机实验是学习程序设计语言必不可少的实践环节,特别是C语言灵活、简洁、语法检查不太严格,更需要通过编程实践来掌握它。C程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。若因为学时所限不能保证集中的上机学时,希望学生能在课外自行上机,当然更应珍惜有限的课内上机的机会。如此才能尽快掌握C语言开发程序的能力,为今后的继续学习打下一个良好的基础。为此,我们结合课堂讲授的内容和进度,安排了12次上机实验。上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,更...
vc++6.0集成环境下de c 语言编译操作指导
1 上机实验目的与要求 一、实验目的 上机实验是学习程序设计语言必不可少的实践环节,特别是C语言灵活、简洁、语法检查不太严格,更需要通过编程实践来掌握它。C程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。若因为学时所限不能保证集中的上机学时,希望学生能在课外自行上机,当然更应珍惜有限的课内上机的机会。如此才能尽快掌握C语言开发程序的能力,为今后的继续学习打下一个良好的基础。为此,我们结合课堂讲授的内容和进度,安排了12次上机实验。上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,更重要的还有如下几个方面: 1.加深对课堂讲授内容的理解 课堂上要讲授许多关于C语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背更不可取。通过多次上机练习,对于语法规则有了感性的认识,能加深对它的理解。在理解的基础上就自然而然地掌握了。对于一些知识点自己认为在课堂上听懂了,但上机实践中会发现原来的理解有偏差;还有一些知识点中错误只有在程序运行时(编译连接通过后)才能发现,这些只能通过上机才能体会和掌握。 学习C语言不能停留在只学习它的语法规则上,而在于利用学到的知识编写C语言程序并解决实际问题,由计算机帮助我们解题。只有通过上机才能检验自己编写的程序是否能得到正确的结果。 通过上机实验来验证自己编制的程序是否正确,是大多数同学初入门的心态。倘若只停留在这一步,那就是“固步自封”。当程序验证完成后,应该问自己:还有其他的解决方法吗?还可以用其他的语句吗?这是最好的吗?此题中自己犯了那些错误? 通过自己编程得到正确的结果才能加深对C语言的理解和和提高开发能力。算法之精妙、程序结构之清晰、界面之友好、容错性之高永远是程序员追求的目标。 2.熟悉程序开发环境、学习计算机系统的操作方法 一个C语言源程序从编辑、编译、连接到运行,都要有一定的外部操作环境下的支撑。所谓"环境"就是所用的计算机系统硬件、软件配置情况,只有学会使用这些环境,才能进行程序开发工作。通过上机实验,熟练地掌握C语言开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它语言开发环境时就会触类旁通,很快掌握。 本书中将要介绍3种上机实验环境,以适应不同的要求。它们分别是: ●WIN-TC集成环境(16位图形界面编译系统) ●Visual C++ V6.0集成环境(32位图形界面编译系统) ●Turbo C2.0集成环境(16位字符界面编译系统)。 3.学习上机调试程序 完成了程序的编写,决不意味着万事大吉。无论技术多么高超的人都不敢吹嘘:“凡是自己编写的程序能一次性通过而无任何错误”。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆语法错误:scanf( )函数的输入中出现非地址项、某变量未进行类型定义、语句末尾缺少分号括号或引号未成对等。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。 经常上机的人见多识广,经验丰富,对出现的错误能很快地找到出错点。通过C语言提供的调试手段逐步缩小错误点的范围,最终找到错误点和错误原因,这样的经验和能力只有通过长期上机实践才能取得。向别人学习调试程序的经验当然重要,但更重要的是自己上机实践,分析、调试程序的经验和心得。别人告诉你一个经验,当时似乎明白。当出现错误时,由于情况千变万化,这个经验不一定用得上,或者根本没有意识到使用该经验。类似的错误照犯不误。只有通过自己在调试程序过程中的经历并分析总结出的经验才是自己的。一旦遇到问题,应对之策自然而生。所以调试程序不能指望别人替代,必须自己动手。编制出源程序,只能说完成一半工作,另一半工作就是调试程序、得到正确结果。可以这样说:“不会调试程序就编不好程序”。 二、实验要求 上机实验一般经历上机前的准备(编程)、上机调试运行和实验后的总结三个步骤。 1.上机前的准备 根据问题,进行分析,选择适当算法并编写程序。上机前一定要仔细检查程序(称为静态检查)直到找不到错误(包括语法和逻辑错误)。分析可能遇到的问题及解决的对策。准备几组测试程序的数据和预期的正确结果,以便发现程序中可能存在的错误。 上机前没有充分的准备,到上机时临时拼凑一个错误百出的程序,宝贵的上机时间白白浪费了;如果抄写或复制一个别人编写的程序,到头来自己一无所获。 2.上机输入和编辑C源程序,并对源程序进行编译、连接、调试运行。 按照C 语言语法规则而编写的C 程序称为源程序。源程序由字母、数字及其它符号等 构成,在计算机内部用相应的ASCII 码表示,并保存在扩展名为 .C 或.CPP的文件中。源程序是无法直接被计算机运行的,这就需要把源程序先翻译成机器指令(目标程序),然后计算机的CPU 才能运行。 源程序翻译过程由两个步骤实现:编译与连接。 首先对源程序进行编译,即把每一条语句用若干条机器指令来实现,以生成由机器指令组成的目标程序。但目标程序还不能马上交计算机直接运行,因为在源程序中,输入、输出以及常用函数的计算过程并不是用户自己编写的,而直接调用系统函数库中的库函数。因此,必须把“库函数”的计算过程指令连接到经编译生成的目标程序中,合成可执行程序,并加入经操作系统对执行程序的地址重定位机制而产生的文件头,方可由计算机运行,最终得到结果。 首先进入 C 语言集成开发环境,输入并编辑事先准备好的源程序;然后对源程序进行编译,查找语法错误,若存在语法错误,重新进入编辑环境,改正后再进行编译,直到通过编译,得到目标程序(扩展名为 .OBJ)。下一步是进行连接,产生可执行程序(扩展名为.EXE)。使用预先准备的测试数据运行程序,观察是否得到预期的正确结果。若有问题,则仔细调试,排除各种错误,直到得到正确结果。 在调试过程中,要充分利用C语言集成开发环境提供的调试手段和工具,例如单步跟踪、设置断点、监视变量值的变化等。整个过程应自己独立完成。不要一点小问题就找老师,学会独立思考,勤于分析,通过自己实践得到的经验用起来更加得心应手。 3.整理上机实验结果,写出实验报告 实验结束后,要整理实验结果并认真分析和总结,根据教师要求写出实验报告。 实验报告一般包括如下内容: ⑴ 实验名称。 ⑵ 实验目的要求 ⑶ 具体的实验步骤(含程序或程序段) ⑷ 实验结果 原始数据、相应的运行结果和必要的说明。 ⑸ 实验小结 实验过程中的心得体会和经验教训的分析与思考 C语言编译工具及其操作方法 一、WIN-TC编译系统 WIN-TC是基于windows操作系统的一个16位的C语言编译工具,它的内核还是Turbo c V2.0。所以最好是在windows98下使用。 操作步骤: 1、​ 进入WIN-TC集成环境: 双击桌面上的WIN-TC图标或在WIN-TC文件夹中双击WIN-TC.EXE文件进入WIN-TC集成环境,如图W-1。若你想将自己的实验成果(含源程序)保存在自己的文件夹中,可以先建立一个文件夹,如:C:\mydoc, 然后单击:编辑 → 编辑配置 → 工作目录右边图标 → 找到C\mydoc→确定。 出现如图W-2,你的实验成果将保存在C:\mydoc文件夹中。 否则你的所有成果将保存在:\WIN-TC\projects文件夹中。 在如图W-1主窗口中可能残留有其它C程序,此时可以单击: 文件→新建。出现图W-3。 在图W-3的中间窗口中输入准备好的C语言源程序,认真仔细检查有无错误,然后转第2步进行编译连接。此处,假设已经输入了如下程序: 例L1-1 #include void main( ) /*主函数*/ { printf(“This is a program.\n”); /*在屏幕上显示:This is a program */ getch(); } 图W-1 新建文件窗口 图W-2 编辑配置 2、编译、连接源程序: 图W-3 WIN-TC集成环中境源程序输入与编辑 在如图W-3中单击:运行 → 编译连接,此时有2种可能: ●程序中有错误,此时在屏幕下部 [输出] 小窗口中有出错的行号及错误原因,应据此进行修改并再次编译连接。 ●程序无错。则出现如下图W-4 图W-4 输入源程序文件名 输入文件名后单击: 保存 ,出现如图W-5,单击: 确定。 图W-5 编译连接成功 3、​ 运行程序 单击:运行 → 编译连接运行 → 确定。 ● 特别重要提示:在WIN 2K 或WIN XP 系统下运行,程序最后一行一定要加上: getch(); 否则,看不到运行结果。 出现如下显示运行结果的黑色窗口(图W-6),在此窗口中,若需要输入数据,则在此按照输入格式输入。本例不要求输入数据。 图W-6 运行结果 二、VISUAL C++ V6.0编译系统 VC++6.0是一个集成环境下的编辑、编译、运行C语言程序的工具,其操作步骤如下: 1、事先在尾逻辑盘上建立自己的工作文件夹(例如:E:\MYDOC) 2、单击桌面上的图标或单击: 开始 → 程序 → Microsoft Visual Studio 6.0 → Microsoft Visual C++ 6.0,可启动VC++,屏幕上将显示图V-1所示的窗口。 图V-1 VC++ 6.0主窗口 3、单击:文件 → 新建→工程 出现图V-2窗口,选中Win32 Console Application并在在工程文本框中输入工程名(例如:P1);单击位置文本框右边的省略号按钮进行浏览并找到自己事先建立的文件夹(如:E:\MYDOC). 单击 确定→完成→确定 图V-2 新建工程窗口 4、单击:文件 → 新建→文件 ,选中 “C++Source File”,在“文件”框中输入文件名(如VL1-1),若想将实验成果保存在自己的文件夹中,此处可以在目录对话框中输入自己的事先建立的文件夹(如:c:\mydoc)。或单击目录对话框右边的…按钮并逐步选择到c:\mydoc,出现图V-3。 图V-3 输入文件名 ●再单击:确定 按钮,出现如下图V-4 5、在图V-4的源程序编辑区内,输入源程序。以如下程序VL1-1为例: #include void main( ) /*主函数*/ { /*函数体应该处于一对大括号中*/ int a,b,sum; /*定义整形变量a,b,sum*/ a=123; b=456; /*给变量a,b赋值*/ sum=a+b; /*做加法,并将此和赋值给变量SUM保存*/ printf("total=%d\n",sum); /*输出变量SUM的值*/ } 图V-4 输入源程序 ●特别提示:在Visual C++下,程序尾不要:getch(); VC++不支持该函数。 6、单击:编译 → 编译VL1-1.cpp,出现如图V-5。在窗口底部信息框中可以看到: 0 errer(s), 0 warning(s) 表明编译通过,程序无任何错误,可以进行下一步连接。 图V-5 编译源程序正确 7、若程序有错误,则出现 图V-6,且在屏幕底小信息窗口中出现错误信息,应根据提示改正错误,重新进行第6步,直到无任何错误。单击菜单 编译 → 构建VL1-1.EXE进行连接。无任何错误时出现如图V-7窗口。进入第 8 步。否则重新第5步修改源程序。 图V-6 源程序有错误提示 (注:本例题中sum 变量未定义且第4行尾缺了分号 ;。改正后再重复第6步、第7步直到编译连接正确。此时信息窗口中显示错误是 0 。) 图V-7 连接源程序正确 8、单击菜单 编译 → 执行P1.EXE,出现如图V-9窗口。 图V-8 执行程序 9、出现程序运行结果,如图V-9。观察结果正确后,按任何键即可回到集成环境窗口。若程序需要输入数据,则在图V-9中按照数据格式输入数据后得到运行结果。若结果不正确,再修改源程序,重复第6、7、8、9步。 图V-9 程序运行结果 10、完成第一个程序: 单击主菜单中的 文件 关闭工作区,弹出小窗口如图V-10,单击 是 回到图V-1,完成第一个程序。 图V-10 ●在硬盘上查看本工程p1产生的文件 在自己的文件夹如E:\MYDOC中可以看到子文件夹P1,在P1中有VL1-1.CPP,这就是源程序文件。有P1.DSW,这是P1工程(工作区)文件,打开(或双击)它可以重新进入P1工程进行修改。进入P1中的DEBUG文件夹,有P1.EXE文件,这就是执行程序,双击它可以得到本程序运行结果。 11、开始第二个程序 重复3~10步输入并编辑、编译、连接、运行第2个源程序。 三、VC60环境下程序调试 程序编译连接通过后,发现运行结果不正确时会问“问题出在哪儿?”,调试程序的过程就是缩小错误范围直到找到发生错误的语句并加以改正的过程。 1、在源程序中设置断点 设置断点就是为了缩小错误范围而将程序分成若干块甚至单个语句。 设置断点: 光标移到某程序行上按下 F9 键,该行前出现红色圆点。程序执行到此会无条件停下来, 这是无条件断点。有时想当某个变量或某一表达式等于某一特定值时能停下来,即依据条件设置断点,这叫条件断点,要在专门的窗口中设置,其方法较复杂,请参考其他资料。 图V-11 程序中设置断点示意 2、跟踪执行 ①单步执行: F10键:每次执行当前光标处的一行程序或一条语句或一次函数调用(不进入函数中)。 F11键:每次执行当前光标处的一行程序或一条语句,遇到函数调用则进入该函数中。 ②执行到下一个断点: F5键:从当前行一直执行到下一个断点处停 ③执行到光标处 CTRL+F10键:从当前行一直执行到光标处停 ④执行完余下代码: SHIFT+F10键:从当前行执行完本函数中余下所有代码 ⑤退出调试模式 SHIFT+F5键:停止调试返回到编辑源程序状态 ⑥重新开始 CTRL+SHIFT+F5键:重新开始,返回掉程序的第一条代码 3、查看程序执行过程中变量值的变化 边执行变查看变量的值时调试的重要环节,进入调试模式后系统会自动打开Variables窗口和Watch窗口。 ①Variables窗口:其中包含三个标签。 Auto标签: 按字母顺序显示当前所有变量(包含变量的地址如&a,若有的话)的值,构造型变量如数组、结构体则可按下前面的+号展开 Locals标签:显示当前函数内所有局部变量的名称和值 This标签:显示this指针的类型、名称和值 ②Watch窗口:含有Watch1~4等四个标签,每个标签都可以由用户输入任意变量和表达式并观察其值。 图V-12 Variables窗口中的Auto标签 图V-13 Variables窗口中的Locals标签 四、在C语言程序中使用汉字 在WIN2K和WIN-XP下汉字只能作为字符串使用,只有VC++系统中才能使用汉字串。 第一章上机题 编译环境、数据类型 1、键盘输入圆的半径,输出其面积 #define PI 3.14159 /*编译预处理——符号常量*/ #include /*编译预处理——头文件*/ #include void main( ) /*主函数, 用户自定义的函数*/ { float r,s; /*定义变量r、s类型为单精度实型*/ printf("Enter a radius:"); scanf("%f",&r); /*由键盘输入圆的半径*/ s=PI*pow(r,2); /*计算圆面积s*/ printf("R=%f,S=%f\n",r,s); /*输出结果*/ } 2、整数溢出示例 #include void main() {short int a,b; /*改为:long int a,b;则结果正确*/ a=32767;b=a+1; printf(“%d,%d\n”,a,b); } 3、实型数据7位有效,小数保留6位例 #include void main() {float a,b; a=123456.789e5; b=a+2; printf(“%f\n”,a); 改为:double a,b;后结果正确: printf(“%f\n”,b); } 4、实型数据7位有效,小数保留6位例 #include void main() {float x=111111.111,y=222222.222; printf(“%f\n”,x+y); } 5、字符与整数(ASCII码)输出例 #include void main() { char ch1,ch2; ch1='a'; ch2='b'; printf("ch1=%c,ch2=%c\n",ch1,ch2); printf("ch1=%d,ch2=%d\n",ch1,ch2); } 6、字符与字符串的区别(‘a’和”a”除了定界符不一样外,内存占用字节数不同)例 #include void main() { char c1[ ]={'a'},c2[ ]="a"; printf("%d,%d\n",sizeof(c1),sizeof(c2)); } 第二章上机题 学习C语言运算符、表达式 1、不同类型数据混合运算及PRINTF函数中格式串与输出项类型匹配例 #include void main() {int a=1; char c1='A'; float f=100; double d=200.0; long l=40000; printf("\n%f ",a+c1+f+d); printf("%d ",sizeof(a+c1+f+d)); printf("%ld ",a+l); printf("%f ",a+c1); /*整数用实输格式%f输出, 结果错误*/ printf("%lf ",c1+d); } 2、自增自减运算例 #include void main() {int i=3,x,y; x=i++; /* 执行后,x的值为3,i的值为4*/ y=++i; /* 执行后,y的值为5,i的值为5*/ printf("%d %d %d\n",x,y,i); } 3、自增自减运算例 #include void main() {int i=8; printf("%3d",++i); printf("%3d",--i); printf("%3d",i++); printf("%3d",i--); printf("%3d",-i++); printf("%3d\n",-i--); /*单目运算++、- -结合方向自右向左,相当于–(i++) 和 -(i- -) */ } 10、自增自减运算例 #include void main() {int x=100; printf("%d,%d,%d,%d\n",x++,x,--x,x); /*TC20编译器下函数的实参数的求值顺序为:自右向左*/ printf("%d\n",x); } 4、强制类型转换例(变量num被强制转换输出后其本身值和类型未改变) #include void main() {float num=2.5; int a; a=(int)num; printf("%d\n",a); printf("%f\n",num); printf("%d\n",sizeof(num)); } 5、赋值过程中溢出例 #include void main() {int a,b=322,c; float x,y=8.88; char c1=‘k’,c2; a=y;x=b;c=c1;c2=b; printf(“%d,%f,%d,%c”,a,x,c,c2);}/*变量c2的值按%c字符输出为什么是字符B 呢?*/ 6、赋值表达式例 #include void main() {int x=2,y,z; x*=3+2; printf("(1)x=%d\n",x); x*=y=z=4; printf("(2)x=%d\n",x); x=y=1; z=x++-1; printf("(3)x=%d***z=%d\n",x,z); z=x++*++y; printf("(1)x=%d***y=%d***z=%d\n",x,y,z); } 7、逗号表达式例 #include void main() {int a=4; char b='B'; double c=3.14; printf("(a*a,a)=%d\n",(a*a,a)); printf("(c+2.23,a)=%d\n",(c+2.23,a)); printf("(c,b,a)=%d\n",(c,b,a)); } 8、逻辑表达式的值例 #include void main() { char x='m',y='n'; int n; n=x void main() {int a=1,b=2,n,x; n=1; x=(a>b)&&(++n); printf("x=%d\n",x); printf("n=%d\n",n); } 10、逻辑表达式的值例 #include void main() {int m,k; k=(m=0)||(m=1)&&(m=2); printf("%d,%d\n",m,k); k=(m=2)||(m=1)&&(m=0); printf("%d,%d\n",m,k); k=(m=2)&&(m=1)||(m=0); printf("%d,%d\n",m,k); k=(m=0)&&(m=1)||(m=2); printf("%d,%d\n",m,k); } 11、逗号表达式的值 #include void main() {int a=2,b=4,c=6,x,y; y=((x=a+b),(b+c)); /*尾表达式的值就是逗号表达式的值*/ printf("y=%d,x=%d\n",y,x); } 运行结果:y=10,x=6 12、位运算例,从键盘上输入1个正整数给变量num,按16位二进制位逐位输出该数。 #include "stdio.h" void main() { int num, mask, i; printf("Input a integer number: "); scanf("%d",&num); mask =1<<15; /*构造1个最高位为1、其余各位为0的整数*/ printf("%d=",num); for(i=1; i<=16; i++) { putchar(num&mask ?'1':'0'); /*输出最高位的值(1/0)*/ num <<= 1; /*将次高位移到最高位上*/ if( i%4==0 ) putchar(','); /*四位一组,用逗号分开*/ } printf("\bB\n"); } 第三章上机题 顺序结构程序 ●重点是输出输入格式控制,难点是scanf()函数的实际操作,特别是数据的分隔和格式控制中的普通字符的键入。 1、利用赋值表达式语句交换2个变量的值。 #include void main() { int a=3,b=4, c; printf("a=%d,b=%d\n",a,b); c=a,a=b,b=c; printf("a=%d,b=%d\n",a,b); } 2、输入三角形三边a, b, c 则计算三角形面积。 #include #include /*若无math.h,编译连接通过,但结果错误,为什么?*/ void main( ) {float a,b,c,area,s; printf ("enter float a,b,c:\n") ; scanf("%f,%f,%f",&a,&b,&c) ; s=1.0/2*(a+b+c); /* 或1/2.0 */ area=sqrt(s*(s-a)*(s-b)*(s-c)); printf ("area=%6.2f \n",area); } 3、输入一个三位正整数,然后将它逆序输出。例如输入 123 , 输出为: 321 #include void main( ) { int m , n , a , b , c ; printf("input a int number\n"); scanf("%d",&m); a=m/100; b=m/10%10; c=m%10; n=100*c+10*b+a; printf("%d\n",n); } 第四章上机题 选择结构程序 1、输入三角形三边a, b, c若能组成三角形, 则计算三角形面积。否则显示出 错信息。 三角形面积= #include #include void main( ) { float a,b,c,area,s ; printf ("enter float a,b,c:\n") ; scanf("%f,%f,%f",&a,&b,&c) ; if (a+b>c&&b+c>a&&c+a>b) { s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf ("area=%6.2f \n",area); } else printf("it is not a triangle\n"); } 2、输入三个整数a , b, c, 找出其中最小数送min且输出。 #include void main ( ) { int a, b, c, min ; scanf("%d,%d,%d", &a, &b,&c) ; if (aa >c 此时 c 最小 */ else if (bb>c 此时 c 最小 */ printf("min=%d\n",min); } 3、键盘输入5个年份,显示出其中的闰年,并显示出闰年的个数。判断润年的逻辑式: year%4==0 && year%100!=0 || year%400==0 #include void main() { int year,leap,sum=0,i=1; loop1:if(i>5) goto loop2; leap=0; scanf("%d",&year); if(year%4==0 && year%100!=0 ||year%400==0) { leap=1; sum+=1; } if(leap) printf("%d is ",year); else printf("%d is not ",year); printf("a leap year\n"); i+=1; goto loop1; loop2:printf("sum=%d\n",sum); } 4、求一元二次方程的根。 #include #include void main() {float a,b,c,disc,x1,x2,realpart,imagpart; scanf(“%f,%f,%f”,&a,&b,&c); if ( fabs(a)<=1e-6) printf(“is not quadratic”); /*不是二次方程*/ else disc=b*b-4*a*c; if ( fabs(disc)<=1e-6) /*机器零*/ printf(“has two equal roots:%8.4f\n”,-b/(2*a)); /*等根*/ else if (disc>1e-6) /*不等的实根*/ { x1=(-b+sqrt(disc))/(2*a);x2=(-b+sqr(disc))/(2*a); printf(“has distinct real roots:%8.4f and %8.4f\n”,x1,x2); } else { realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); /*虚根*/ printf(“%8.4f+%8.4fi\n”,realpart,imagpart); printf(“%8.4f-%8.4fi\n”,realpart,imagpart); } } 第五章上机题 循环结构程序 1、数列求和: 分析: n由键盘输入,是项数,分子用变量m, m=m*x (注意赋值号左右两边m表示不同的意义,左边的m表示当前项分子,右边m表示前一项的分子), m为 i 个x的乘积,即x的 i 次幂; i为控制变量,从1开始每次加1,一直加到n。各项求和可用表达式sum=sum+ m / i (注意赋值号左右两边sum表示不同的意义,左边的sum表示包括当前项在内的累加和,右边sum表示当前项以前的累加和), m , sum为实型数据. #include void main( ) {int i, n; float x, sum=0.0, m=1.0; printf("input x , n=?\n"); scanf(" %f,%d", &x,&n); i=1; while(i<=n) { m=m*x; sum=sum+m/i; i++; } printf("sum=%8.2f\n", sum); } 2、输入一个正整数,并将其逆序输出(如输入12345 则输出54321。 分析:键入一个正整数为num, 数值不大于32767) 每次用 %10可求得个位数字, 用 /10 求得整数商,下次再用 %10求得10位上数字……..: #include void main( ) { int m ,num, right; printf(" enter number m: "); scanf("%d",&m); num=m; printf("%d\n",m); do { right=num%10; /* 求个位数字 */ printf("%d",right); num=num/10; /* 个位数字被去掉,得到新的整数 */ }while(num!=0); printf("\n"); } 3、设limit为任意给定的整数,编程求和式: sum=1+1/2+1/3+1/4+…..+1/n大于limit的最小自然数n。 #include void main() {long n=0;float sum=0;int limit; printf("Enter the upper limit="); scanf("%d",&limit); do {++n; sum+=1.0/n; } while (sum<=limit); printf("\nn=%ld\n",n); } do while( )与while( )适合不同的应用题,本题利用while( )循环能方便地编写程序吗?试一试。 4、求在3位数中, 各位数字的立方和等于该数本身的3位数及其个数并输出。例如:153=13+53+33;153就是这样的数(称为水仙花数) 分析:所求数的取值范围是100~999,该3位数用d 表示,各位数字分别 用a,b,c 表示,则:a=d/100,b=d%100/10 ,c=d%1 设变量s,使 s=a3+b3+c3,判断:若d=s,则d 即为所求的3位数。 #include void main( ) { int d , s , a , b , c , n ; n=0; for(d=100;d<=999;d++) { a=d/100; b=d%100/10; c=d%10; s=a*a*a+b*b*b+c*c*c; if ( d==s ) { n++; printf("%6d",d); } } printf("\n n=%d \n",n); } 5、一个真正的九九乘法表是一个下三角形形式的,如何实现 #include void main() {int i,j; for(i=1;i<=9;i++) {for(j=1;j<=9;j++) { if(j>i) break; printf("%-2d*%-2d=%-3d",i,j,i*j); } printf("\n"); } } 6、求2~100 之间的素数.(素数是大于1,且除了1和它本身外,不能被其它任何整数所整除的整数)。根据初等数论,一个正整数的因数不会超过他的算术根。用此范围内整数试除,若都不能除尽他,则此数就是素数,此时标志 flag=1。 #include #include void main (void) { int i, j , k, flag; k=0; for( i=2;i<100;i++) { flag=1; /* 每次进入内循环检查i是否为素数都要重置标志量为1 */ for(j=2;j<=sqrt(i);j++) if (i%j==0) flag=0; if ( flag==1 ) {printf("%4d",i ); k++; /*素数个数增 1 */ if (!(k%10) ) printf("\n");/* 每行输出10个素数 */ } } printf("\n k=%d\n", k); } 7、输出如下花纹图案、 #include void main( ) { int i , j , k ; for(i=0; i<5; i++) {for(j=1; j<=i; j++) printf(“ ”); for(k=0; k<5; k++) printf(“*”); printf(“\n”) } } 8、输出如下花纹图案。 #include void main( ) {int i,j; for(i=1;i<=5;i++) { for(j=1;j<=5-i;j++) printf(" "); for(j=1;j<=2*i-1;j++) printf("*"); printf("\n"); } } 9、循环控制变量的后置自增自减运算 #include void main() { int x=-1; do {;} while (x++); printf("x=%d\n",x);} 10、求两个正整数的最大公约数: #include void main() {int a,b,i; printf("Enter two number:"); scanf("%d,%d",&a,&b); if (a1;i--) {if(a%i==0&&b%i==0) break; /*找到了最大公约数,结束本层循环*/ } printf("(%d,%d)=%d\n",a,b,i); } 11、用П/4=1-1/3+1/5-1/7+……….公式求П的近近似值,知道某项的绝对值小于10-6为止。 #include #include void main() { float s,n,t,pi; t=1.0;pi=0;n=1.0;s=1.0; while(fabs(t)>1e-6) {pi=pi+t; n=n+2; s=-s; /*运用这种办法改变符号*/ t=s/n; } pi=pi*4.0; printf("pi=%10.6f\n",pi); } 12、打印fibonacci数列 1,1,2,3,5,8, ... 的前40项。  分析: f1=1 f2=1 f3=f1+f2 ……….f(n)=f(n-1)+f(n-2) 采用的是递推的方法: 新的 f1=f1+f2, 新的 f2=f2+f1,注意:赋值左右两边的f1、f2表示不同的意义,左边的f2、f2是当前fi、f2,右边的f2、f2是上一次的f1、f2. #include void main() {long f1,f2; int i; f1=1;f2=1; for(i=1;i<=20;i++) {printf("%-9ld%-9ld",f1,f2); if(i%4==0) printf("\n"); f1=f1+f2; f2=f2+f1; } } 13、鸡与兔同笼,其中共有25个头, 有80只脚, 问笼中鸡和兔各有多少只? 设:鸡X只,兔Y只,则:y=25-x #include void main() {int x,y; for (x=1;x<40;x++) {y=25-x; if(2*x+4*y== 80) printf(“x=%d,y=%d\n”,x,y); } } 14、取n=10,求自然对数底 e 的近似值。e=1+1/1!+1/2!+1/3!+…….+1/n! 变量e是总和, 变量term:每一项的项值。 递推公式:term =term *1/i; (赋值号左右两边的同名变量表示不同的意义) ,即第I项的项值等于他前一项的项值除以本项的项号。 #include void main() {int i;double term,e; term=e=1; for(i=1;i<=10;i++) {term=term*1.0/i; e+=term; } printf(“e=%f\n”,e); } 第六章上机题 数组 1、键盘输入10数,输出其中最小的数。 用数组a[10]存放10个数,通过循环控制数组元素的下标。第1个数a[0]作为比较的目标。从第二个数a[1]开始直到a[9] ,每一个数与a[0]进行比较。如果大于a[0],则放弃此数并读入下一个数,否则将此小数赋值给a[0]。通过9次比较后,a[0]就是最小数。-----打擂台法 #include void main() { int i,a[10],min; printf("input 10 number:"); for(i=0;i<=9;i++) scanf("%d",&a[i]); min=a[0]; for(i=1;i<=9;i++) if(min>a[i]) min=a[i]; printf("\nmin= %d\n",min); } 2、用数组方法打印出Fibonicci数列的前20项。按定义可以得到Fibonicci数列, 1,1,2,3,5,8,13,21,… #include void main() {int i; long int f[40]={1,1}; for(i=2;i<40;i++) f[i]=f[i-1]+f[i-2]; for(i=0; i<40; i++) {if (i%5==0) printf("\n"); printf("%12ld",f[i]); } printf(“\n”); } 3、键盘输入10数,用最小元素法从小到大排序输出。 #include void main() { int i,j,a[11],t; printf("input 10 number:\n"); for(i=1;i<=10;i++) scanf("%d",&a[i]); for(i=1;i<=9;i++) for(j=i+1;j<=10;j++) if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;} for(i=1;i<=10;i++) printf("%d ", a[i]); } 4、键盘输入10数,用冒泡法法从小到大排序输出。 #include void main() {int a[11]; /* 用a[1]~a[10], a[0]不用 */ int i,j,t; /* i,j作循环变量,t作两两比较的临时变量 */ printf("input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); /* 输入10个整数 */ printf("\n"); for(j=1;j<=9;j++) /* 第j轮比较 */ for(i=1;i<=10-j;i++) /* 第j轮中两两比较10-j次 */ if (a[i]>a[i+1]) /* 交换大小 */ { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } printf("the sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); } 5、对数据排序的目的是为了快速查找某个数据。用折半法在一含有n个(设n=10)整数升序数组a中查找某一整数x并显示其在数组中的位置。 #include void main() {int x,mid,top,bottom,a[10]={2,3,5,7,8,11,14,35,68,70}; printf("请输入要查找的数?"); scanf("%d",&x); bottom=0,top=9; while(bottom<=top) { mid=(bottom+top)/2; if (xa[mid]) bottom=mid+1; else break; } if(bottom<=top)printf("%d 在数组中的下标是:%d\n",x,mid); else printf("查无此数!\n"); } 6、有一个3×4的矩阵,要求编程序求出值最大的那个元素的值及其所在的行号和列号。 问题分析:首先把第一个元素a[0][0]作为临时最大值max,然后将max与每一个元素a[i][j]进行比较,若某个a[i][j]>max,把a[i][j]作为新的临时最大值,并记录下其行下标 I 和列 j 。当全部元素比较完后,max是整个矩阵全部元素的最大值。下面给出程序。 #include void main() {int i,j,row=0,colum=0,max; int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; max=a[0][0]; for(i=0;i<=2;i++) /* 用二重循环遍历全部元素 */ for(j=0;j<=3;j++) if (a[i][j]>max ) { max=a[i][j];row=i;colum=j;} printf("max=%d, row=%d, colum=%d\n",max,row,colum); } 7、输入6个学生、每人5门课的成绩,统计每个学生的平均成绩。 #include void main() {int s[6][5],sum[6],i,j;/*二维数组s[6][5]的第一维6表示6个学生,第二维5表示5门成绩,sum[6]表示6个成绩和*/ printf("please input 5 score :\n"); for(i=0;i<6;i++) /*二维表的横向统计时第一维变量作为外循环,若要纵向统计则第二维变量j作为外循环*/ { printf("%-4d:",i+1); for(j=0;j<5;j++) scanf("%d",&s[i][j]);} for(i=0;i<6;i++) {sum[i]=0; for(j=0;j<5;j++) sum[i]+=s[i][j]; }/*各个学生成绩求和*/ for(j=0;j<6;j++) printf("student%-4d %-6.2f", j+1,sum[j]/5); }/*思考:若要求各科平均成绩如何改动?(各科平均成绩是纵向统计)*/ ●综合编程题: 十个歌手参加电视大讲赛,十个评委给每人打一个分,去掉一个最高分和一个最低分, 得到一个平均分,最后按平均分排序,打印出前3名歌手的编号及成绩。 8、打印出以下的杨辉三角形(要求打印出10行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 问题分析 这是一个10*10的矩阵,该矩阵的特点是对角线 上方的元素全 为0,是一个下三角矩阵。杨辉三角形各行 系数有如下规律: (1)各行第一个数都是1。(a[i][1]=1) (2)各行最后一个数都是1。(a[i][i]=1) (3) 从第3行起,其余各数是上一行同列和前一列两个数 之和。 a[i][j]=a[i-1][i]+a[i-1][j-1],(其中i为行数j为列数。) #include #define N 11 void main() { int i,j,a[N][N]; for(i=1;i void main() {int i,j; char c[]="I am happy"; char d[]={'I',' ','a','m',' ','h','a','p','p','y'}; puts(c); puts(d); i=sizeof(c);j=sizeof(d); printf("%d %d\n",i,j); } 10、读入一以!号结尾的字符串,统计其中数字0、1、2、3、4、5、6、7、8、9各出现多少次? 分析:我们用下标变量a[0]~a[9]分别统计0~9出现的次数,注意到0的ASCII码为48,用变量c表示字符,若c为‘0’,则a[c-48]加1,此时实际上是c[1]加1,若c为‘1’,同样是a[c-48]加1,但此时实际上是c[1]加1。 #include "stdio.h" void main() {int i,a[10]; char c; printf("读入一串以!号结尾的字符串\n"); for(i=0;i<10;i++) a[i]=0; while((c=getchar())!='!') if(c>=48&&c<=57) a[c-48]++; printf("统计结果为:\n"); for(i=0;i<=9;i++) printf("字符 %c 共出现 %d 次\n",i+48,a[i]); } 11、输入一串以句号为结束标志的字母,再反序打印这些字母。 #include void main() {char s[101],ch;int i=0,j; do {scanf("%c",&ch); if((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z')) {s[i]=ch; i++;} }while(ch!='.'); s[i]
/
本文档为【vc++6.0集成环境下de c 语言编译操作指导】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索