(环境管理)实验一C开发环境与程序设计步骤

 (环境管理)实验一 C 开发环境与程序设计步骤

 实验一 C++开发环境与程序设计步骤 一、目的和要求 1.学习 VisualC++6.0 集成环境,掌握源程序编辑方法; 2.掌握在 VisualC++6.0 集成开发环境中编译、调试与运行程序的方法; 3.通过运行简单的 C++程序,初步了解 C++源程序的特点。

 二、实验设备及分组 1.Windows2000 以上操作系统; 2.VisualC++6.0 语言环境; 3.每人一台 PC 机。

 三、内容和步骤 (一)C++程序设计步骤 一个 C++程序的设计可分成 5 个步骤:

 1.分析问题。根据实际问题,分析需求,确定解决方法。

 2.编辑源程序。编写 C++源程序,并利用一个编辑器将源程序输入到计算机中的某一个文件中。C++源文件的扩展名为“.cpp”。

 3.编译程序。编译源程序,检查语法错误,生成目标代码文件。目标代码文件的扩展名为“.obj”。

 4.连接程序。将一个或多个目标程序与库函数进行连接后,生成一个可执行文件。可执行文件的扩

 展名为“.exe”。

 5.运行程序。执行可执行文件,分析运行结果。若有算法错误,可进一步进行修改、编译、调试。

 在编译、连接和运行程序的过程中,都有可能出现各式各样的错误,要不断地修改源程序,重复以上过程,直到获得正确的结果为止。

 (二)VisualC++6.0 上机操作方法 VisualC++6.0 系统包含了许多独立的组件,如编辑器、编译器、调试器以及各种各样为开发 Windows环境下的 C++程序而设计的工具。其中最重要的是一个名为 DeveloperStudio 的集成开发环境(IDE)。DeveloperStudio 把所有的 VisualC++工具结合在一起,集成为一个由窗口、对话框、菜单、工具栏、快捷键及宏组成的和谐系统,通过该集成环境,程序员可以观察和控制整个开发进程。

 使用 VisualC++6.0 调试 C++程序要经过以下几个步骤:

 1.启动 VisualC++6.0 系统 启动 VisualC++6.0 系统有很多种方法,最常见的是通过鼠标单击“开始”菜单,选择“程序”,选择“MicrosoftVisualStudio6.0”,选择“MicrosoftVisualC++6.0”启动 VisualC++6.0。如果已经在桌面上建立了“MicrosoftVisualC++6.0”图标,则也可用鼠标双击该图标启动 VisualC++6.0。VisualC++6.0 启动成功后,就产生如图 1.1 所示的 VisualC++集成环境。

 图 1.1 典型的 DeveloperStudio 窗口 图 1.1 显示了一个典型的 DeveloperStudio 主窗口。它分为几个部分:窗口顶部是菜单和工具栏,

 其中包括“File(文件)”、“Edit(编辑)”、“View(视图)”、“Insert(插入)”、“Project(项目)”、“Build(编译、连接和运行)”、“Tools(工具)”、“Windows(窗口)”、“Help(帮助)”等菜单,分别对应一个下拉子菜单。左面的一个子窗口是工作区窗口,工作区的右面是编辑子窗口。最下面是输出子窗口。

 除了各种对话框外,DeveloperStudio 显示两种类型的窗口,即文档窗口和停靠窗口。文档窗口是一般的带边框子窗口,其中含有源代码文本或图形文档。Window 子菜单中列出了在屏幕上以平铺方式还是以层叠方式显示文档窗口的命令。所有其他的 DeveloperStudio 窗口,包括工具栏和菜单栏,都是停靠式窗口。

 开发环境有两个主要的停靠窗口――Workspace(工作区)窗口和 Output(输出)窗口。另外还有一个 Debugger(调试器)停靠窗口,只在调试过程中显示。

 停靠窗口可以固定在 DeveloperStudio 用户区的顶端、底端或侧面,或者浮动在屏幕上任何地方。停靠窗口,不论是浮动着的或是固定着的,总是出现在文档窗口的上面。这样,就保证了当焦点从一个窗口移到另一个时,浮动的工具栏一直都是可见的。但这也意味着,文档窗口偶尔会看起来像消失了似的。例如,如果你正在文本编辑器中编辑源代码,此时打开一个占据整个 DeveloperStudio 用户区的停靠窗口,源代码文档就会消失,它隐藏在新窗口之下。解决方法是要么关了覆盖的窗口,要么把它拖到不挡眼的地方去。

 值得注意的是,上述各种部件,包括子窗口、菜单栏和工具栏的位置不是一成不变的,可以根据个人

 的喜好重新安排。

 2.创建项目文件 通常都是使用项目的形式来控制和管理 C++程序文件的,C++的项目中存放特定程序的全部信息,包含源程序文件、库文件、建立程序所用的编译器和其他工具的清单。C++的项目以项目文件的形式存储在磁盘上。

 图 1.2 新建项目对话框 图 1.3 新建项目向导对话框 生成项目的操作步骤为:

 (1)选择集成环境中的“File”菜单中的“New”命令,产生“New”对话框,如图 1.2 所示。

 (2)选择对话框中的“Projects”标签,以便生成新的项目。在产生新项目时,系统自动生成一个项目工作区,并将新的项目加入到该项目工作区中。

 (3)在项目类型清单中,选择“Win32ConsoleApplication”项目,表示要生成一个 Windows32位控制台应用程序的项目。

 ( 4 )

 在 “ Location ” 文 本 框 中 输 入 存 放 项 目 文 件 的 文 件 夹 路 径 , 如“C:\DOCUMENTSANDSETTINGS\YUYONGYAN\桌面\新建文件夹”。

 (5)在“ProjectName”文本框中输入项目名。例如:Exe1_1。

 (6)检查“Platforms”文件框中是否已显示“Win32”,表示要开发 32 位的应用程序。

 (7)单击“New”对话框中的“OK”按钮。产生一个对话框向导,如图 1.3 所示。

 选“Anemptyproject”,按下“Finish”按钮,显示验证对话框,直接按“OK”按钮,这时就产生了一个项目文件。系统自动加上文件扩展名“.dsw”。

 3.创建C++源程序文件并将其加入到项目文件 (1)选择“File”菜单中的“New”命令,则产生“New”对话框,如图 1.4 所示。

 图 1.4 新建文件对话框 (2)选择对话框中的“Files”标签。

 (3)在文件类型清单中,选择“C++SourceFile”项目,表示要生成一个C++源程序。

 (4)在“File”文本框中输入C++源程序文件名。系统自动加上文件扩展名“.cpp”。例如:Exe1_1_1.cpp。

 (5)若“Addtoproject”复选框没有选中,则单击该复选框使其选中,表示系统要将指定的源程序文件加入到当前的项目文件中。

 (6)单击“OK”按钮。这时就建立了一个新的C++源程序文件,并已加入到了当前的项目文件中。产生如图 1.5 所示的窗口。

 该窗口有三个子窗口,左边的子窗口为项目工作区窗口;右边的子窗口为源程序编辑窗口,用于输入或编辑源程序;下边的窗口为信息输出窗口,用来显示出错信息或调试程序的信息。

 4.输入和编辑源程序

 在源程序编辑窗口输入例 1.1 中的源程序代码,如图 1.5 所示。

 5.保存源程序文件 选择“File”菜单中的“Save”命令,将源程序保存到相应的文件中。

 6.编译和连接 图 1.5VisualC++6.0 工作窗口 选择“Build”菜单中的“Compile”或“Build”命令,将源程序编译或编译连接,产生可执行文件。系统自动加上文件扩展名“.exe”。例如:Exe1_1_1.exe。

 在编译和连接期间,若出现错误,则在信息输出窗口给出错误或警告信息。改正错误后,重新编译或编译连接源程序,直到没有错误为止。

 7.运行 选择“Build”菜单中的“Execute”命令,则在VC++集成环境的控制下运行程序。被启动的程序在控制台窗口下运行,与 Windows 中运行 DOS 程序的窗口类似。见下图。

 图 1.6 运行结果 注意:也可以单击工具栏中的“!”按钮(BuildExecute)或者按快捷键“Ctrl+F5”,直接编译与运行源程序。

 8.打开已存在的项目文件 可用两种方法打开已存在的项目文件:

 (1)选择“File”菜单中的“Openworkspace”命令,然后在弹出的对话框中选择要打开的项目文件。

 (2)选择“File”菜单中的“Recentworkspaces”命令,然后再选择相应的项目文件。

 特别提醒:

 在调试一个应用程序时,VisualC++集成环境一次只能打开一个项目文件。当一个程序调试完成后,要开始输入另一个程序时,必须先关闭当前的项目文件,然后为新源程序建立一个新的项目文件。否则将出现不可预测的错误。

 关闭当前的项目文件的方法是:选择“File”菜单中的“Closeworkspace”命令。

 9.退出 VisualC++集成环境 选择“File”菜单中的“Exit”命令,可以退出集成环境。

 (三)验证分析程序 1.设计一个 C++程序,输出以下信息:

 *************** Hello!

 *************** 解:

 #include<iostream.h> voidmain()

 { cout<<"***************"<<"\n"; cout<<"Hello!"<<"\n"; cout<<"***************"<<"\n"; } 运行结果:

 *************** Hello!

 *************** 2.设计一个程序,从键盘输入一个圆的半径,求其周长和面积。

 解:

 #include<iostream.h> voidmain() { floats,r; cout<<"请输入圆的半径:"<<endl; cin>>r;

 s=3.14159*r*r; cout<<"圆的面积为:"<<s<<endl; } 运行结果:请输入圆的半径:5 圆的面积为:78.5397 (四)完成实验项目 1.设计一个程序,从键盘输入一个小写字母,将它转换成大写字母输出。

 2.输入一个球的半径,求其表面积和体积。

 四、课后作业 撰写实验报告

 五、实验机时 2 个标准学时。

 实验二数据类型、表达式和输入输出 一、目的和要求 1.掌握 C++语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符; 2.学会使用 C++的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(——)运算符的使用; 3.进一步熟悉 C++程序的编辑、编译、连接和运行的过程; 4.掌握数据的输入输出方法。

 二、实验设备及分组 1.Windows2000 以上操作系统; 2.VisualC++6.0 语言环境; 3.每人一台 PC 机。

 三、内容和步骤 (一)验证分析程序 1.编写程序完成变量 x 和变量 y 值的交换,调试程序并观察运行结果。

 要交换变量 x 和变量 y 的值,可以借用临时变量 z 进行交换。

 一个完整的参考程序如下:

 #include<iostream.h> voidmain() { intx,y,z;//A cout<<"x,y="; cin>>x>>y; cout<<"输入的 x="<<x<<"y="<<y<<endl; z=x; x=y; y=z; cout<<"输出的 x="<<x<<"y="<<y<<endl; } 思考:

 在键盘上分别按如下格式输入两组数据,并观察程序运行结果:

 5,3(回车)

 53(回车)

 将程序中的 x,y,z 命名为 auto,break,case,观察是否出错?分析原因。

 只将程序 A 行 x 改为大写 X,观察是否出错?分析原因。

 修改程序,用条件运算符输出两个数中的较大数。

 2.编程序输入 x、y 和 z 的值,计算的值。

 表达式的值不一定为整数,故程序中变量的类型应采用实型。

 参考程序如下:

 #include<iostream.h> voidmain() { floatx,y,z,e,f,w;//A cout<<"x,y,z="<<endl; cin>>x>>y>>z; e=(x+1)*(y-1);//B f=x+y;//C w=e/f;//D cout<<"w="<<w<<endl; } 思考:

 输入 x=5.4,y=3.1,z=2.7,观察程序运行结果。

 将程序中 A 行改为“intx,y,z,e,f,w;”,输入 x=5.4,y=3.1,z=2.7,观察程序运行结果。

 将程序中 A 行改为“floatx,y,z,w;”,B、C、D 行改为“w=(x+1)*(y-1)/x+y;”,观察程序运行结果。

 3.编写程序,从键盘输入一个三位正整数,将其倒序输出。例如:输入 861,输出为 168。

 输入的三位数为整数,变量类型按整型进行处理。可采用求余数的方法计算各位上的数,然后逆序输出。参考程序如下:

 #include<iostream.h> voidmain() { intn,i,j,k; cout<<"输入一个三位正整数 n:"; cin>>n; i=n%10;//i 存放个位数 n=(n-i)/10;//去掉个位数 j=n%10;//j 存放十位数 n=(n-j)/10;//去掉十位数

 k=n;//k 存放百位数 n=i*100+j*10+k; cout<<"逆转数为:"<<n<<endl; } 思考:

 修改程序,使其先取百位数,再取十位数,最后取个位数。

 4.本例测试了不同数据类型之间的数据转换。分析下列程序的运行结果。

 #include<iostream.h> voidmain() { inta=32,b; doublec=2.7,d; chare="D",f; b=a+c;//A d=a+c; f=a+e; cout<<"b="<<b<<endl;

 cout<<"d="<<d<<endl; cout<<"f="<<f<<endl;//B cout<<b+d+f<<endl;//C } 思考:

 修改程序 A 行,对 b 的输出值四舍五入。

 修改程序 B 行,按整型值输出 f。

 分析 C 行数据的值的类型。

 (二)完成实验项目 1.输入二整数 a、b,实现二个数的交换(不借用第三变量)。

 2.从键盘输入三角形的三边长,输出三角形的周长和面积(此处假设可以构成三角形)。

 3.编写程序输入两个整数,输出它们的商和余数。

 四、课后作业 1.从键盘输入一个三位整数 n=abc,从左到右用 a、b、c 表示各位的数字,现要求依次输出从右到左的各位数字,即输出另一个三位数 m=cba,例如:输入 123,输出 321。(不得采用实验中已使用过的方法)

 2.撰写实验报告。

 五、实验机时 2 个标准学时。

 实验三选择结构的程序设计 一、目的和要求 1.掌握 VisualC++6.0 集成环境中的单步执行; 2.熟悉 if 与 switch 语句的格式、执行过程、使用方法及典型案例; 3.学会使用选择结构解决一般的实际问题,能编写简单的应用程序。

 二、实验设备及分组 1.Windows2000 以上操作系统; 2.VisualC++6.0 语言环境; 3.每人一台 PC 机。

 三、内容和步骤 (一)验证分析程序 1.由键盘输入三个数,判断能否构成三角形。

 分析:

 判断 b+c>a 是否成立,若不成立则一定不能构成三角形;若成立则有可能构成三角形,再判断b-c<a 是否成立。因 b-c 有可能小于 0,用 b-c<a 时不能准确描述两边之差小于第三边,需取绝对值进行分析。

 参考程序如下:

 #include<iostream.h> voidmain() { doublea,b,c,t; cout<<"请输入 a 的值"<<endl; cin>>a; cout<<"请输入 b 的值"<<endl; cin>>b; cout<<"请输入 c 的值"<<endl; cin>>c; t=b-c; if(t<0) t=-t; if(b+c>a) { if(t<a) cout<<"能构成三角形"<<endl;

 else cout<<"不能构成三角形"<<endl; } else cout<<"不能构成三角形"<<endl; } 思考:

 将程序改为非嵌套的 if 语句实现。

 在程序中增加语句,使其在能构成三角形的情况下进一步判断三角形的类型(直角、钝角、锐角三角形)。

 提示:三角形的类型由最长边所对的角决定。假定三角形最长边为 c,其所对的角为 θ。其他两边为 a、b。计算公式如下:

 例如, 当 c 2 =a 2 +b 2 时,为直角三角形; 当 c 2 >a 2 +b 2 时,为钝角三角形; 当 c 2 <a 2 +b 2 时,为锐角三角形。

 2.某商店“五·一”长假期间购物打折。规则如下:

 若每位顾客一次购物, ①满 1000 元,打九折; ②满 2000 元,打八折; ③满 3000 元,打七折; ④满 4000 元,打六折; ⑤5000 元,打五折; 编写程序,输入购物款,输出实收款。

 解:本例使用了 if-elseif 语句进行多重判断。参考程序如下:

 #include<iostream.h> voidmain() { doublem,p; cout<<"输入购物款:"; cin>>m; if(m<1000)p=m; elseif(m<2000)p=0.9*m; elseif(m<3000)p=0.8*m;

 elseif(m<4000)p=0.7*m; elseif(m<5000)p=0.6*m; elsep=0.5*m; cout<<"实收款:"<<p<<endl; } 3.有下列分段函数:

 编一程序,输入 x,输出 y 的值。

 解:程序如下:

 #include<iostream.h> voidmain() { floatx,y; cout<<"Inputx:"; cin>>x; if(x>=0) if(x>=10) y=x*x*x;

 else y=x*x-5; else y=x+1; cout<<"y="<<y<<endl; } 运行结果:

 Inputx:-3 y=-2 (二)完成实验项目 1.设计一个程序,判断从键盘输入的整数的正负性和奇偶性。

 2.编写程序,实现下列函数功能:

 3.已知奖金税率如下:(a 代表奖金,r 代表税率)

 a<500(元)r=0% 500≤a<1000r=3% 1000≤a<2000r=5% 2000≤a<5000r=8%

 a≥5000r=12% 输入一个奖金数,求税率、应交税款及实得奖金数。

 3.输入某一年的年份和月份,计算该月的天数。

 提示 (1)一年中的大月(1 月、3 月、5 月、7 月、8 月、10 月、12 月),每月的天数为 31 天; (2)一年中的小月(4 月、6 月、9 月、11 月),每月的天数为 30 天; (3)对于 2 月,则要判断该年是平年还是闰年,平年的 2 月为 28 天,闰年的 2 月为 29 天。

 某年符合下面两个条件之一就是闰年:

 ①年份能被 400 整除; ②年份能被 4 整除,但不能被 100 整除。

 4.输入平面直角坐标系中一点的坐标值(x,y),判断该点是在那一个象限中或那一条坐标轴上。

 四、课后作业 1.设计一个计算器,可以实现简单的四则运算; 2.撰写实验报告。

 五、实验机时 2 个标准学时。

 实验四循环结构的程序设计 一、目的和要求 1.掌握循环结构 while、do - while、for 等语句格式、执行过程、使用方法及典型案例。

 2.学习循环结构的嵌套使用。

 3.掌握分支与循环综合程序的编写方法; 4.学习并熟悉 break、continue 的区别与使用。

 5.学会常用数值与图形的编程方法。

 二、实验设备及分组 1.Windows2000 以上操作系统; 2.VisualC++6.0 语言环境; 3.每人一台 PC 机。

 三、内容和步骤 (一)验证实验程序 1.计算:S=1+2+3+4+…+n。

 解:

 程序流程图如图 4.1 所示,程序如下:

 #include<iostream.h>

 voidmain() { inti,n,sum; cout<<"Inputaninteger:"; cin>>n; sum=0; i=1; while(i<=n) { sum=sum+i; i++; } cout<<"sum="<<sum<<endl; } 运行结果:

 Inputaninteger:5 sum=15

 2.裴波那契数列的前几个数为 1,1,2,3,5,8,……,其规律为:

 F 1 =1(n=1) F 2 =1(n=2) F n =F n-1 +F n-2 (n≥3) 编写程序求此数列的前面 40 个数。

 分析:可设两个变量 f1 和 f2,它们的初值为 f1=1,即数列的第 1 项,f2=1,即数列的第 2 项,用一个循环结构来求数列的前 40 项,每次处理两项,所以共循环 20 次,进入循环后,首先输出 f1、f2,然后令 f1=f1+f2,即可求得第 3 项,再令 f2=f2+f1,注意此时的 f1 已经是第 3 项了,所以可求得第 4 项;进入下一次循环时,首先输出第 3、4 项,然后按上述方法求得第 5、6 项,以此类推即可求得前 40 项。

 解:

 #include<iostream.h> #include<iomanip.h> voidmain() { longintf1,f2; inti;

 f1=1;f2=1; for(i=1;i<=20;i++) { cout<<setw(12)<<f1<<setw(12)<<f2; if(i%2==0) cout<<endl; f1=f1+f2; f2=f2+f1; } } 例中“if”语句的作用是使在一行中输出 4 个数。

 运行结果:

 1123 581321 345589144 233377610987 1597258441816765 10946177112865746368 75025121393196418317811

 51422983204013462692178309 35245785702887922746514930352 241578173908816963245986102334155 3.求出 100~200 之间的所有素数,输出时一行打印五个素数。

 分析:判断一个数 a 是否为素数,只需将它整除以 2~(取整)即可,如果都不能整除,则 a 就是素数。

 解:

 #include<iostream.h> #include<math.h> #include<iomanip.h> voidmain(void) { inta,k,i,n; n=0; for(a=100;a<=200;a++) { k=sqrt(a); for(i=2;i<=k;i++)

 if(a%i==0) break; if(i>k)//若 i>k,则 i 为素数 { cout<<setw(12)<<a;//输出素数 n=n+1;//对素数统计个数 if(n%5==0) cout<<endl; } } cout<<endl; } 程序运行后,输出,:

 101103107109113 127131137139149 151157163167173 179181191193197 199

 4.编写程序用公式计算 e 的近似值。直到最后一项小于给定精度。

 分析:这是一个累加求和的问题,仔细分析各项,可以发现从第二项开始,各项的值为前一项除以序号 n:

 解:

 #include<iostream.h> voidmain() { doublee=1.0,x=1.0,y,z; intn=1; cout<<"input 精度:"; cin>>z; y=1/x; while(y>=z) { x*=n; y=1/x; e+=y;

 ++n; } cout<<e<<endl; } 思考:

 将程序中 while 结构改写为 do-while,观察程序的运行结果。

 增加“continue”或“break”语句,使程序在输入数据大于 0.01 时,显示“精度要求太低,请重新输入”的提示。

 5.有一对兔子,从第 3 个月起每个月生一对兔子,小兔子从第 3 个月起每个月又生一对兔子。假设所有兔子都不死,编程序计算每个月的兔子是多少对?(求 20 个月)。

 分析:从第 3 个月开始,下个月兔子的对数为本月兔子的对数与上月兔子对数之和。这样可得出该序列的规律是:从第 3 项开始,该项的值为前两项之和。

 兔子数目的规律是:

 1、1、2、3、5、8、13、21、……。

 解:

 #include<iostream.h> voidmain()

 { intf1,f2,f3; inti; f1=f2=1; for(i=3;i<=20;i++) {//A f3=f1+f2; cout<<i<<"月兔子对数为:"<<f3<<endl; f1=f2; f2=f3; } } 思考:

 将程序 A 行中改写为“for(i=20;i>=3;i--)”后,观察程序运行结果; 画出本例的流程图。

 6.编写程序打印如图 4-2 所示蝶形图形。

 分析:此图形为上下对称结构,用-3~3 的整数标识行号 i,则每行字符“B”的个数可表示为

 6*|i|+1。每行字符“B”前空格的个数随着|i|的增大而减少,空格的个数要大于 0。

 解:

 #include<iostream.h> voidmain() { inti,j,k,d; for(i=-3;i<=3;i++) { cout<<endl; d=i; if(i<0)d=-i; for(j=1;j<=10-3*d;j++) cout<<""; for(k=1;k<=6*d+3;k++) cout<<"B"; } cout<<endl;

 } 思考:

 将程序中的“for(j=1;j<=10-3*d;j++)”用“for(j=1;j<=30-3*d;j++)”改写后,观察程序运行结果。

 将程序中的“for(i=-3;i<=3;i++)”用“for(i=-10;i<=10;i++)”改写后,观察程序运行结果。

 将程序中的“for(k=1;k<=6*d+3;k++)”用“for(k=1;k<=10*d+3;k++)”改写后,观察程序运行结果。

 7.将下列 do-while 结构修改为 while 结构,分别观察输出结果。

 #include<iostream.h> voidmain() { inta=0;//A do { a++; cout<<"a="<<a<<endl; }while(a>1);

 } 思考:

 将条件 while(a>1)改为 while(a),分别观察输出结果。

 将 A 语句改为 a=-10,while(a>1)改为 while(a),计算循环执行的次数。

 8.从键盘输入任意多个整数(-999 为结束标志),计算其中正数之和。

 分析:采用转向语句 break 和 continue 实现。break 在循环体中用于退出本层循环;continue用于结束本次循环。

 解:

 #include<iostream.h> voidmain() { intx,s=0; while(1) { cin>>x; if(x==-999)break;//A if(x<0)continue;//B

 s=s+x; } cout<<"s="<<s<<endl; } 思考:

 交换 A 行和 B 行的位置,观察程序运行结果。

 修改程序“输入任意多个整数(-999 为结束标志)”为“直到包含 20 个正数时”,计算正数之和。

 (二)完成实验项目 1.编程序打印一个如图 4-3 所示的数字金字塔:

 图 4-3 数字金字塔 2.输入一行字符,分别统计出其中英文字母、空格、数字字符、其它字符及单词的个数。

 3.设有一个数列,它的前四项为 0、0、2、5,以后每项分别是其前四项之和,编程求此数列的前20 项。

 4.求π近似值的公式为:

 其中,n=1、2、3…设计一个程序,求出当 n=1000 时的π的近似值。

 5.求出 1~599 中能被 3 整除,且至少有一位数字为 5 的所有整数。如 15、51、513 均是满足条件的整数。

 四、课后作业 1.设用 100 元钱买 100 支笔,其中钢笔每支 3 元,圆珠笔每支 2 元,铅笔每支 0.5 元,问钢笔、圆珠笔和铅笔可以各买多少支(每种笔至少买 1 支)? 2.撰写实验报告。

 五、实验机时 2 个标准学时。

 实验五数组 一、目的和要求 1.掌握一维数组、二维数组、字符数组的定义、初始化赋值、数组元素的引用方法; 2.掌握求最大、小值、平均值、排序的方法以及有序数组的查找、增加、删除的编程方法; 3.初步掌握字符串处理函数的使用方法以及字符串复制、连接、测长等程序的编写方法; 4.掌握数组的典型应用。

 二、实验设备及分组 1.Windows2000 以上操作系统; 2.VisualC++6.0 语言环境; 3.每人一台 PC 机。

 三内容和步骤 (一)验证实验程序 1.应用一维数组,对 10 个数进行冒泡排序,使其按照从大到小的顺序输出。

 分析:n 个数冒泡排序的方法是将第一个数与其后面的数逐个进行比较,发现大者进行交换,完成后最大的数就放到了第一个的位置;第二个数与其后面的数逐个进行比较,发现大者进行交换,完成后次大的数就放到了第二个的位置;如此循环,直到第 n-1 个数与第 n 个数进行比较,发现大者进行交换。

 解:

 #include<iostream.h> voidmain() { inta[10];//A inti,j,t; cout<<"输入数据:"<<endl; for(i=0;i<10;i++)//B { cout<<"a["<<i+1<<"]="; cin>>a[i]; } for(i=0;i<=8;i++) { for(j=i+1;j<=9;j++) { if(a[i]<a[j])

 { t=a[i]; a[i]=a[j]; a[j]=t; } } } cout<<"排序结果为:"<<endl; for(i=0;i<=9;i++)cout<<"a["<<i+1<<"]="<<a[i]<<""<<endl; } 思考:

 将 A 行改为下列程序段:

 intn; cin>>n; inta[n]” 观察运行结果?分析原因。

 将 B 行改为“for(i=1;i<=10;i++)”,观察现象。

 2.应用二维数组打印如图 5-1 所示杨辉三角形。

 分析:由杨辉三角形可以看出每行数存在以下规律:每行数据的个数与行序相同;每行的第一个数和最后一个数均为 1;中间的数为上一行同一列的数和其前一列的数之和。

 解:

 #include<iostream.h> voidmain() { inty[5][5]; inti,j,n=5; for(i=0;i<n;i++) { y[i][i]=1; y[i][0]=1; } for(i=2;i<n;i++) { for(j=1;j<i;j++) 1 1

 1 1

 2

 1 1

 3

 3

 1 1

 4

 6

 4

 1 图 5-1

 杨辉三角形

 y[i][j]=y[i-1][j-1]+y[i-1][j]; } cout<<"杨辉三角形:"<<endl; for(i=0;i<n;i++) { cout<<""; for(j=0;j<=i;j++)cout<<y[i][j]<<""; cout<<endl; } } 思考:

 添加语句输出如图 5-2 所示杨辉三角形。

 3.从键盘输入两个字符串,将它们连接成一个字符串。

 分析:建立两个变量 i、j,先使 i 指向字符数组 str1 的第一个元素,然后移动 i 使其指向 str1 的末尾,即指向 str1 的最后一个元素‘\0’;再使 j 指向字符数组 str2 的第一个元素,然后将 str2 中的元素分别赋给 str1 中相应位置的元素,直到 str2 结束为止,即 j 指向 str2 的最后一个元素‘\0’;最后在 str1 的末尾添加一个结束标志‘\0’。

 程序如下:

 解:

 #include<iostream.h> voidmain(void) { charstr1[40],str2[20];//定义字符数组 str1、str2 inti,j; cout<<"输入二个字符串:"; cin.getline(str1,20);//输入字符串 1 到 str1 中 cin.getline(str2,20);//输入字符串 2 到 str2 中 i=0;//使 i 指向 str1 的第一个元素 while(str1[i]!="\0")//判断 str1 是否结束 i++;//str1 没有结束,使 i 指向下一个元素 j=0;//使 j 指向 str2 的第一个元素 while(str2[j]!="\0")//判断 str2 是否结束 { str1[i]=str2[j];//str2 没有结束,将 str2[j]赋给;str1[i]

 i++;//使 i 指向 str1 的下一个元素 j++;//使 j 指向 str2 的下一个元素 } str1[i]="\0";//在 str1 末尾添加结束标志‘\0’ cout<<str1<<endl;//输出 str1 } 4.编程序将输入的字符串删去空格后输出。

 分析:逐个读取每个字符,若为空格将其后面的字符和字符串结束标志前移一位,再从该位置开始,重复上述操作,直到字符串结束。

 解:

 #include<iostream.h> voidmain() { charstr[]="Thisisabook!";//A inti=0,j; while(str[i]!=NULL) {

 if(str[i]=="") {//B j=i; while(str[j]!=NULL) { str[j]=str[j+1]; j++; } } i++; } cout<<str<<endl;//C } 思考:

 将程序中 A 行的“"”用“"”改写,观察现象。

 将程序中 B 行的“"”用“"”改写,观察现象。

 将程序中 C 行改写为:

 for(j=1;str[j]!=NULL;j++,cout<<str[j]); cout<<endl; 观察输出结果。

 编程序将输入字符串中出现的字符除空格外,按从大到小的顺序输出(每个字符只输出一次)。

 (二)完成实验项目 1.编程实现将一十进制整数 M 转换为 D 进制数。

 2.已知一 inta[20]数组,编程将值为偶数的元素移到数组前端,值为奇数的元素移到数组后端。(要求元素比较、移动次数尽量最少)

 3.求,其中 n≥20。

 4.某班有 10 个学生,进行了“数学”、“语文”、“英语”、“C++语言”等科目的考试,编写程序:

 (1)将考试成绩输入一个二维数组; (2)求每门课的平均成绩、每门课的不及格学生的人数及每门课的最高分与最低分; (3)求每个学生的平均成绩、总分、不及格门数; (4)按学生平均成绩的高低排序并输出。

 5.设计一个程序,打印杨辉三角形。(使用其它方法)

 6.编写程序,实现 str=str1+str2 的操作,此处运算符“+”表示将二个字符串 str1、str2 连接成一个字符串 str。用键盘将二个字符串输入字符数组 str1 与 str2 中,连接后的字符串存放在字符数

 组 str 中,并输出连接后的字符串 str。

 四、课后作业 1.设 A、B、C 为 m 行 n 列矩阵。设计矩阵加法程序,能完成 C=A+B 的操作。m 与 n 用 define 定义为常量,其值由用户自定义。

 2.已有一按从小到大次序排序好的数组,现输入一数,要求用折半查找法找出该数在数组中的位置。

 3.撰写实验报告。

 五、实验机时 4 个标准学时。

 实验六函数调用 一、目的和要求 1.了解函数的定义方法,理解函数的调用; 2.初步掌握函数的递归、嵌套调用; 3.了解函数调用的实参与形参的传递,以及参数默认值的设置。

 4.学习并了解重载函数、内联函数的基本概念。

 二、实验设备及分组 1.Windows2000 以上操作系统; 2.VisualC++6.0 语言环境; 3.每人一台 PC 机。

 三、内容和步骤 (一)验证实验程序 1.编写一个函数,用递归的方法求 1+2+3+4+…+n 的值。在主函数中进行输入输出。

 解:

 #include<iostream.h> intfun(intn) {

 intz; if(n<=0) z=0; else z=n+fun(n-1); return(z); } voidmain(void) { intx,sum; cout<<"请输入 X 的值"<<endl; cin>>x; sum=fun(x); cout<<"求和结果为:"<<sum<<endl; } 运行结果:

 请输入 X 的值

 10 求和结果为:55 2.编写程序,输入 m 和 n(n>m),求的值。

 分析:已知 根据公式,只要自定义一个函数计算阶乘,即可通过函数调用求出的值。

 解:

 阶乘函数定义如下:

 doublefact(intk) { intp=1; if((k==0)||(k==1)) returnp; else { for(inti=1;i<=k;i++) p=p*i; returnp;

 } } 一个完整的参考程序如下:

 #include<iostream.h> doublefact(int); voidmain() { intm,n; doublec; cout<<"pleaseinput"<<endl; l1:cout<<"n="; cin>>n; cout<<"m="; cin>>m; if(n<m){ cout<<"nmustbiggerthanm!,pleasereinput:"<<endl; gotol1;

 } c=fact(n)/(fact(m)*fact(n-m)); cout<<"c="<<c<<endl;//B } doublefact(intk) { intp=1; if((k==0)||(k==1)) returnp; else { for(inti=1;i<=k;i++)p=p*i; returnp; } } 思考:

 分别输入 n=0,1,3,m=0,1,2 测试程序。

 试用静态存储变量设计阶乘函数。

 3.编写程序,求两个自然数 m 和 n 的最大公约数和最小公倍数。

 分析:

 最大公约数就是能同时整除 m 和 n 的最大正整数,可用欧几里德算法(也称辗转相除法)求解。应用欧几里德算法计算两个数的最大公约数的方法是:求两个数(m、n)相除的余数 r(r=m/nm>n),当余数不为零时,m 取 n 的值,n 取 r 的值,再求两个数相除的余数,反复进行直到余数为零,除数n 是最大公约数。

 最小公倍数=m×n/最大公约数。

 解:

 #include<iostream.h> intfun1(intc,intd) { intr; r=c%d; while(r!=0) { c=d;

 d=r; r=c%d; } returnd; } voidmain() { intm,n,e,d; cout<<"mn="; cin>>m>>n; e=fun1(m,n); d=m*n/e; cout<<"最大公约数为:"<<e<<endl; cout<<"最小公倍数为:"<<d<<endl; } 思考:

 输入两个数 m=36,n=24 观察程序运行结果。

 用递归调用的方法实现程序编写,参考程序如下:

 #include<iostream.h> intfun1(intc,intd) { intr; r=c%d; if(r!=0) { c=d; d=r; fun1(c,d); } returnd; } voidmain() { intm,n,e,d;

 cout<<"mn="; cin>>m>>n; e=fun1(m,n); d=m*n/e; cout<<"最大公约数为:"<<e<<endl; cout<<"最小公倍数为:"<<d<<endl; } 编写计算三个数最大公约数的程序。

 4.分别输入整数半径和实数半径,使用函数重载计算圆的面积。

 分析:由于参数只有一个圆的半径,所以只能对不同类型的参数实现重载。

 解:程序如下 #include<iostream.h> #definePI3.14 intarea(int); floatarea(float); voidmain() {

 intr1; cout<<"输入一个整型半径 r=:"; cin>>r1; cout<<"area="<<area(r1)<<endl; floatr2; cout<<"输入一个实型半径 r=:"; cin>>r2; cout<<"area="<<area(r2)<<endl; } intarea(intx) { returnPI*x*x; } floatarea(floatx) { returnPI*x*x; }

 思考:

 编写重载函数实现对两个整型数、三个整型数、两个实型数、三个实型数等求最小值。

 5.使用内联函数计算长方形的面积。

 分析:C++编译器在调用遇到内联函数的地方,会用函数体中的代码替换函数。

 解:

 一个完整的内联函数参考程序如下:

 #include<iostream.h> floats(floatx,floaty); voidmain() { floata,b; cout<<"Inputtwofloata,b="; cin>>a>>b; cout<<"s="<<s(a,b)<<endl; } inlinefloats(floatx,floaty) {

 returnx*y; } 思考:

 将程序中的内联函数进行代码替换,并上机运行,观察结果。

 (二)完成实验项目 1.编写函数求:

 2 . 用 函 数 调 用 方 法 打印 九 九 表 乘 法 。

 3.以下函数是用递归方法计算 x 的 n 阶勒让德多项式的值。已有调用语句“p(n,x);”,编写poly 函数。递归公式如下:

 4.已知 x 的初始值为 3.14159/4,用牛顿法求解方程的近似解,要求精确到。的牛顿法为:

 5.已知 5 个学生 4 门课的成绩,要求主函数分调用各函数实现:

 (1)

 (1)找出每门课成绩最高的学生序号; (2)

 (2)找出课程有不及格的学生的序号及其各门课的全部成绩; (3)

 (3)求每门课程的平均分数,并输出; (4)

 (4)将学生按总分高低排序。

 6.设计函数 Fri(intM,intn),功能是将 M 个人围成一圈,编号为 1—M,从第 1 号开始报数,报到n 的倍数的人离开,一直数下去,直到最后只剩下 1 人。求此人的编号。

 四、课后作业 1.定义子函数如下:

 sum(intx,inty) { returnx+y; } 编写程序使用调用语句 sum()、sum(4)和 sum(5,7)分别对带默认参数值的函数 sum 进行调用。sum 函数声明如下:sum(intx=1,inty=2); 2.撰写实验报告。

 五、实验机时 2 个标准学时。

 实验七指针与引用 一、目的和要求 1.掌握指针、指针变量、指针常量的基本概念; 2.掌握指针与数组、指针与函数的关系及应用。

 3.初步掌握引用的概念及简单应用。

 二、实验设备及分组 1.Windows2000 以上操作系统; 2.VisualC++6.0 语言环境; 3.每人一台 PC 机。

 三、内容和步骤 (一)验证实验程序 1.指针变量的自加、自减、加 n 和减 n 运算。假设数组 a 的首地址为 1000。

 解:

 #include<iostream.h> voidmain() { inta[5]={0,1,2,3,4};

 int*p; p=&a[0];//p 指向 a[0],p=1000 p++;//p 指向下一个元素 a[1],p=1004 cout<<*p<<"\t";//输出 a[1]的内容 1。

 p=p+3;//p 指向下 3 个元素 a[4],p=1016 cout<<*p<<"\t";//输出 a[4]的内容 4。

 p ―― ;//p 指向上一个元素 a[3],p=1012 cout<<*p<<"\t";//输出 a[3]的内容 3。

 p=p ― 3;//p 指向上 3 个元素 a[0],p=1000 cout<<*p<<"\t";//输出 a[0]的内容 0。

 } 运行结果:

 1430 2.指出下列程序的错误。

 #include<iostream.h> voidexchange(int,int); voidmain()

 { inta,b; cin>>a>>b; cout<<"BeforeExchange:a="<<a<<",b="<<b<<endl; exchange(a,b); cout<<"AfterExchange:a="<<a<<",b="<<b<<endl; } voidexchange(intx,inty) { intt; t=x; x=y; y=t; } 分析:本例的目的是在子函数中交换的两个变量的值,在主函数中使用。但函数的数据传值调用方式是将实参的数据值传递给形参,实参和形参在内存中占用不同的地址单元,改变形参值不改变实参值。要想通过改变形参的值而改变实参的值,则应使用指针调用或引用调用。而且引用调用大有取

 代指针调用之势。

 图 7.1 通过指针实现数据交换 解:

 使用指针调用如下:

 #include<iostream.h> voidexchange(int*,int*); voidmain() { inta,b,*p1=&a,*p2=&b; cin>>a>>b; cout<<"BeforeExchange:a="<<a<<",b="<<b<<endl; exchange(p1,p2); cout<<"AfterExchange:a="<<a<<",b="<<b<<endl; } voidexchange(int*x,int*y) { intt;

 t=*x; *x=*y; *y=t; } 使用引用调用如下:

 #include<iostream.h> voidexchange(int&,int&); voidmain() { inta,b; cin>>a>>b; cout<<"BeforeExchange:a="<<a<<",b="<<b<<endl; exchange(a,b); cout<<"AfterExchange:a="<<a<<",b="<<b<<endl; } voidexchange(int&x,int&y) {

 intt; t=x;x=y;y=t; } 3.用指针变量输出二维数组各元素的值。

 解:

 #include<iostream.h> voidmain() { inta[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int*p=&a[0][0];//将二维数组首地址赋给指针变量 p for(inti=0;i<9;i++) { cout<<*p<<"\t";//输出二维数组中第 i 个元素值 p++;//指针变量 p 加 1,指向下一个元素 } } 运行结果:

 123456789 4.用指针与数组作为函数参数,用四种方法求整型数组的最大值。

 解:

 #include<iostream.h> intmax1(inta[],intn)//形参为数组名 { inti,max=a[0]; for(i=1;i<n;i++) if(a[i]>max) max=a[i]; returnmax; } intmax2(int*p,intn)//形参为指针 { inti,max=*(p+0); for(i=1;i<n;i++) if(*(p+i)>max)

 max=*(p+i); returnmax; } intmax3(inta[],intn)//形参为数组名 { inti,max=*(a+0); for(i=1;i<n;i++) if(*(a+i)>max) max=*(a+i); returnmax; } intmax4(int*p,intn)//形参为指针 { inti,max=p[0]; for(i=1;i<n;i++) if(p[i]>max) max=p[i];

 returnmax; } voidmain(void) { intb[]={1,3,2,5,4,6},*pi; cout<<"max1="<<max1(b,6)<<endl;//实参为数组名,形参为数组 cout<<"max2="<<max2(b,6)<<endl;//实参为数组名,形参为指针变量 pi=b; cout<<"max3="<<max3(pi,6)<<endl;//实参为指针变量,形参为数组 pi=b; cout<<"max4="<<max4(pi,6)<<endl;//实参为指针变量,形参指针变量 } 运行结果:

 max1=6 max2=6 max3=6 max4=6 5.变量和数组元素的地址都可以赋给一个指针,一个指针可以加上或减去一个整数;在两个指

 针指向同一数组不同元素时,可以进行减运算,结果为其间的数组元素个数。

 解:

 #include<iostream.h> voidmain() { inti,a[10]; int*p1,*p2; p1=a;//A p2=p1+5; for(i=0;i<=9;i++) { a[i]=i*i; cout<<"a["<<i<<"]="<<a[i]<<endl; } cout<<"a="<<a<<endl;//B cout<<"p1="<<p1<<",p2="<<p2<<endl; cout<<"p2-p1="<<p2-p1<<endl;

 cout<<"*p2-*p1="<<*p2-*p1<<endl;//C } 思考:

 将程序中 A 行改为“p1=&a[0]”观察程序运行结果。

 将程序中 B 行改为“cout<<"*a="<<*a<<endl;”观察程序运行结果。

 将程序中 C 行改为“cout<<"a[5]-a[0]="<<a[5]-a[0]<<endl;”观察程序运行结果。

 6.使用函数的指针分别调用两个函数 sum1 和 sum2 分别求不大于该数的偶数或奇数之和。

 分析:使用函数的指针,可以通过指针的赋值分别调用不同的函数。

 解:

 #include<iostream.h> intsum1(int); intsum2(int); voidmain() { inta; int(*f)(int);//A cout<<"Inputadata:";

 cin>>a; if(a%2==0) { f=sum1; cout<<(*f)(a)<<endl; } else { f=sum2; cout<<(*f)(a)<<endl; } } intsum1(intm) { ints1=0; for(inti=2;i<=m;i=i+2) s1=s1+i;

 returns1; } intsum2(intn) { ints2=0; for(inti=1;i<=n;i=i+2) s2=s2+i; returns2; } 思考:

 将 A 行改为“int(*f)(int);”,观察现象。

 分别输出两个函数的函数名,观察其地址值。

 7.输入两个字符串,将第二个字符串拼接到第一个字符串的尾部,然后输出拼接后的字符串。

 解:

 #include<iostream.h> #include<string.h> char*stringcat(char*p1,char*p2)

 { char*p=p1;//将目标串首地址赋给指针变量 p。

 while(*p1++);//指针 p1 移到 s1 的串尾 p1 ―― ; while(*p1++=*p2++);//将源串 s2 中的字符依次复制到目标串 s1 中。

 returnp;//返回指向目标串首地址的指针 p。

 } voidmain(void) { chars1[200],s2[100]; cout<<"输入第一个字符串:"; cin.getline(s1,100); cout<<"输入第二个字符串:"; cin.getline(s2,100); cout<<"拼接后的字符串:"; cout<<stringcat(s1,s2)<<endl;//将字符串 s2 拼接到字符串 s1 后输出 s1 的内容。

 }

 运行结果:

 输入第一个字符串:ABCD 输入第二个字符串:EFGH 拼接后的字符串:ABCDEFGH 8.自定义函数实现字符串的拷贝。

 分析:字符串不允许进行赋值运算,只能使用头文件 string.h 中定义的 strcpy()库函数。本例要求自己编制一个自定义函数实现 strcpy()库函数的功能。

 解:

 #include<iostream.h> char*mycopy(char*,constchar*); voidmain() { chars1[]="Iamastudent"; chars2[20]; mycopy(s2,s1); cout<<"s1="<<s1<<endl; cout<<"s2="<<s2<<endl; }

 char*mycopy(char*to,constchar*from) { char*temp=to; for(;*to++=*from++;); returntemp; } 将自定义函数改为下列程序段:

 char*mycopy(char*to,constchar*from) { char*temp=to; for(inti=0;*(from+i)!="\0";i++) *(to+i)=*(from+i); *(to+i)="\0"; returntemp; } 观察现象。

 将自定义函数的声明改为:“char*mycopy(constchar*,constchar*);”

 自定义函数相应改为:

 char*mycopy(constchar*to,constchar*from) { char*temp=to; for(;*to++=*from++;); returntemp; } 观察现象。

 在自定义函数中能否使用如下的语句“*from="a";” 9.编程,判定一个字符在一个字符串中出现的次数,如果该字符不出现则返回 0。

 分析:逐个读取字符串中的字符,当所给字符与字符串中的字符相同时,计数器 count 的值加 1 后继续查找,直到字符串尾。

 解:一个完整的参考程序如下:

 #include<iostream.h> char_count(char*s,charletter) { intcount=0;

 while(*s) if(*s++==letter) count++; return(count); } voidmain() { charstr[100],c; cout<<"inputastring:"; cin>>str; cout<<"inputaletter:"; cin>>c; cout<<"thecountis:"<<char_count(str,c)<<endl; } 思考:

 修改程序输出每个字符和其出现的次数,不允许字符重复输出。

 10.用指针实现字符串拷贝。

 解:

 #include<iostream.h> #include<string.h> voidmain() { char*p1="Iamastudent"; chars1[30],s2[30]; strcpy(s1,p1);//用命令拷贝字符串 char*p2=s2;//将数组 s2 首地址赋 p2 for(;*p2++=*p1++;);//用指针拷贝字符串 cout<<"s1="<<s1<<endl; cout<<"s2="<<s2<<endl; } 运行结果:

 s1=Iamastudent s2=Iamastudent 11.使用 new 和 delete 创建动态堆栈。

 分析:new 和 delete 运算符可以对数组和结构体进行动态内存分配和释放。

 解:

 #include<iostream.h> structStack { intstacksize; long*buffer; long*sp; }p; voidini(intsize) { p.stacksize=size; p.sp=p.buffer=newlong[size]; } voiddel() { deletep.buffer;

 } voidpush(longdata) { if(p.sp>=p.buffer+p.stacksize) cerr<<"stackoverflow!\n"; else { *p.sp++=data; cout<<data<<"ispushed."<<endl; } } longpop() { if(p.sp<=p.buffer) { cerr<<"stackisempty!\n"; return0;

 } return*--p.sp; } voidmain() { ini(5);//A push(1234); push(5678); push(1357); push(2468); cout<<endl; cout<<pop()<<"ispoped"<<endl; cout<<pop()<<"ispoped"<<endl; cout<<pop()<<"ispoped"<<endl; cout<<pop()<<"ispoped"<<endl; cout<<pop()<<"ispoped"<<endl; del();

 } 思考:

 将程序中 A 行分别改为“ini(2);”和“ini(8);”观察程序运行结果。

 12.使用指向指针的指针输出计算机课程名。

 分析:指向指针的指针变量即二级指针,其所指向的变量仍是一个指针。指向指针的指针多使用在二维数组,和字符数组处理过程。

 解:

 #include<iostream.h> char*name[]={"VisualBasic","VisualC++","Delphi","PowerBuild","VisualFoxpro"}; voidmain() { char**p=name; for(inti=0;i<5;i++) cout<<*(p+i)<<endl;//A } 思考:

 将 A 行修...

推荐访问:环境管理 程序设计 步骤