第一部分 上机实验指导 实验1 C语言运行环境与C程序调试方法 实验1.1 在MicrosoftVisualStudio2010环境下设计 C程序的基本步骤 【实验目的】 . 熟悉C程序设计编程环境MicrosoftVisualStudio2010,掌握运行一个简单C程 序的基本步骤,包括编辑、编译、连接和运行。 . 掌握C程序设计的基本框架,能够编写简单的C程序。 . 了解程序调试的思想,能找出并改正C程序中的语法错误。 【实验内容】 1.在C盘根目录下以“学号+姓名”为名建立一个文件夹,每个程序的项目目录都存 到该目录下。例如,文件夹名为“42110101李一”。 2.调试示例,在屏幕上输出一个字符串"Thisisanexperiment!"。 程序代码如下: #include //预处理部分,输入输出函数的头文件 int main() //主函数 { printf("This is an experiment!\n"); //输出一行信息 return 0 ; //main 函数的返回值 } 运行结果: This is an experiment! 程序调试基本步骤: (1)启动MicrosoftVisualStudio2010。 选择“开始”→“程序”→MicrosoftVisualStudio2010→MicrosoftVisualStudio2010 菜单命令,进入MicrosoftVisualStudio2010 编程环境。如果桌面上有MicrosoftVisual Studio2010(简称VS2010)的快捷方式(如图1-1所示), 则可通过双击VS2010 在桌面 上的快捷方式,打开VS2010 的集成开发环境窗口(如图1-2所示)。 图1-1 MicrosoftVisualStudio2010 的桌面快捷方式 图1-2 MicrosoftVisualStudio2010 中文版主窗口 (2)新建项目。 在VS2010 窗口中,选择“文件”→“新建”菜单命令,单击“项目”选项卡,然后选择 “Win32 控制台应用程序”选项,在“位置”文本框中输入准备建立的项目的存储路径(如 “C:\42110101 李一”), 在其上方的“名称”文本框中输入准备建立的项目的名字,单击“确 定”按钮(如图1-3所示), 然后单击“下一步”按钮,在“应用程序设置”选项卡中选择“空项 目”选项(如图1-4所示), 单击“完成”按钮。 2 C/C+ + 程序设计进阶实验指导与习题解析(第 2 版) 图1-3 创建项目 图1-4 选择空项目 (3)新建文件。 在VS2010 解决方案资源管理器窗口的“源文件”处右击,选择“添加”→“新建项”菜 单,在弹出的对话框中选择“C++文件”选项,然后在“名称”处输入源文件名称(如图1-5 所示), 单击“添加”按钮。 (4)编辑和保存源文件。 在编辑窗口输入源程序,然后选择“文件”→“保存”菜单命令或“文件”→“另存为”菜 第一部分上机实验指导 3 图1-5 新建文件 单命令保存文件。在编辑窗口书写源程序代码时,一般采用缩进风格,缩进可以使用空格 键或Tab键来实现。另外,也可以采用MicrosoftVisualStudio2010软件自动排版,方 法是先把源程序代码输入到编辑窗口,然后选中全部代码,接着按下快捷键Alt+F8,就 可完成代码的自动排版。 (5)生成解决方案。 选择“生成”→“生成解决方案”菜单命令,或按快捷键Ctrl+F7,对源程序文件进行 编译链接。 在输出窗口中显示错误(eror)或警告(warning)信息。若有错误,可以通过单击输 出窗口右侧的上下滚动按钮,在窗口中依次双击出错信息,在编辑源程序窗口中就会出现 一个箭头指向程序出错的位置,一般在箭头的当前行或上一行,可以找到出错语句。在改 正错误时,应从第一条错误开始修改,每修改一处错误,重新生成一次,直至出现“0eror (s),0warning(s)”。当没有错误与警告出现时,输出窗口所显示的最后一行应该是“成 功1个,失败0个,最新0个,跳过0个”,如图1-6所示。 (6)运行程序。 生成成功后,生成可执行程序。选择“调试”→“开始执行(不调试)”选项,也可按组合 键Ctrl+F5,运行可执行程序,执行后将出现一个类似于DOS窗口的界面,如图1-7 所示 ( 。 7)关闭项目。 当程序调试成功以后,应该先关闭当前项目,才能进行下一个项目的调试。选择“文 4 C/C++程序设计进阶实验指导与习题解析(第 2 版) 图1-6 编译后的输出窗口 图1-7 执行文件窗口 件”→“关闭解决方案”菜单命令,即可关闭当前项目。 (8)打开项目。 项目关闭以后,若想重新打开该项目进行检查或修改,可选择“文件”→“打开项目或 解决方案”,找到该项目的解决方案名,双击即可。 实验1.在Mio2010 环境下调试C程序 2 crosoftVisualStudi 【实验目的】 .掌握调试一个简单C程序的基本过程。 .了解程序调试的思想,找出并改正C程序中的语法错误。 第一部分上机实验指导 5 6 C/ C++程序设计进阶实验指导与习题解析(第2 版) 【实验内容】 1.在屏幕上输出一个字符串"Howareyou!"。 程序代码如下(注意,该程序有误,读者需要阅读代码并找出错误): #include int mian() { printf(How are you!\n") return 0; } 运行结果(改正后的运行结果): How are you! 操作步骤: (1)按照实验1.1中介绍的步骤(1)~步骤(4)输入上述源程序并保存。 (2)选择“生成”→“生成解决方案”菜单命令,对源程序进行编译链接。信息窗口中 显示编译错误信息,如图1-8所示。 图1-8 编译后的信息窗口 错误提示“未声明的标识符”,此处少写了双引号,改正后重新生成解决方案。 (3)此次出错信息提示为“缺少‘;’(在'return'的前面)”,改正错误后重新生成解决 方案。 (4)此次出错信息提示为“无法解析的外部符号_main”,出错信息提示缺少主函数, 把mian改为main后,重新生成,信息窗口显示生成成功。 (5)运行。选择“调试”→“开始执行(不调试)”选项,运行程序,观察运行结果是否与 第一部分 上机实验指导 7 要求一致。 2.改正程序中的错误,使之能够在屏幕上显示以下3行信息。 ************************** Welcome to Jilin University ************************** 程序代码如下(有错误): #include int main() { printf("***********************\n"); printf("Welcome to Jilin University") printf("***********************\n"); } 3.编程并调试,在屏幕上显示一个字符串"Thisismyfirstcprogram."。 【思考题】 思考在实验过程中自己遇到的问题,试一试能否找到解决问题的方法。 实验2 基本类型数据运算及其输入输出 实验2.1 基本类型数据及其运算 【实验目的】 . 掌握基本类型变量的定义。 . 掌握C语言运算符的使用。 【实验内容】 1.取出一个3位整数的各位数字并输出。 程序代码如下: #include int main() { int x=123; int c1,c2,c3; c1=x%10; c2=x/10%10; c3=x/100; 8 C/ C++程序设计进阶实验指导与习题解析(第2 版) printf("%d,%d,%d\n ",c3,c2,c1); return 0; } 运行结果: 1,2,3 (1)若将程序中的printf语句改为“printf("%d%d%d",c3,c2,c1);”,运行结果会是 什么?( 2)列出求x的各位数字的其他方法。 2.自增运算符(++)的使用。 运行如下程序,并分析运行结果。 #include int main() { int x=2,y,z; y=++x; z=x++; printf("x=%d,y=%d,z=%d\n ",x,y,z); return 0; } 3.有如下程序: #include int main() { int x=6,y,z; x+=x*=x-2; printf("x=%d\n",x); printf("%d\n ",(y=z=5,y--,z+1,y+z)); return 0; } 运行程序并分析结果。 4.编程实现:不使用if语句交换两个变量的值。 实验2.2 数据的输入输出 【实验目的】 . 掌握文件打开函数fopen和文件关闭函数fclose的使用方法。 . 掌握文件格式化读函数fscanf和文件格式化写函数fprintf的使用方法。 第一部分 上机实验指导 9 【实验内容】 1.为使得a=1,b=2,c='A',d=5.5,在键盘上正确输入数据。 程序代码如下: #include int main() { int a,b; char c; float d; scanf("a=%d b=%d",&a,&b); scanf("%c %e",&c,&d); printf("a=%d,b=%d,c=%c,d=%f",a,b,c,d); return 0; } (1)运行程序,输入: a=1 |b=2 A |5.5 会产生什么结果? 与要求值是否相同? (2)若输入: a=1 |b=2A |5.5 会产生什么结果? 与要求值是否相同? 2.有如下程序: #include int main() { int a, b; float d, e; char c1, c2; a=12; b=3456; c1='a'; c2='b'; d=1234.56789; e=0.123456789; printf("a=%d,b=%d\nc1=%c,c2=%c\n",a,b,c1,c2); printf("d=%f,e=%f\n",d,e); printf("d=%10.3f,e=%10.4f\n",d,e); return 0; } (1)运行程序,对照结果分析各语句的作用。 10 C/ C++程序设计进阶实验指导与习题解析(第2 版) (2)将程序中的printf语句修改为如下形式,然后运行程序,查看结果。 printf("a=%4d,b=%2d\nc1=%3c,c2=%-3c\n",a,b,c1,c2); printf("d=%-f,e=%-f\n",d,e); printf("d=%-10.3f,e=%-10.4f\n",d,e); (3)修改程序,不使用赋值语句,而用下面的scanf语句: scanf("%d%d%c%c%f%f",&a,&b,&c1,&c2,&d,&e); ① 按照程序原来的数据格式,如何为上述变量提供数据? ② 使用如下格式输入数据: 60 |70 |a |b |5.67 |-6.78 为什么得不到正确的运行结果? 3.运行如下程序: #include int main() { int a, b; float d, e; char c1, c2; a=12; b=3456; c1='a'; c2='b'; d=1234.56789; e=0.123456789; scanf("%d%d",&a,&b); c1=getchar(); c2=getchar(); scanf("%f%f",&d,&e); printf("a=%d,b=%d\nc1=%c,c2=%c\n",a,b,c1,c2); printf("d=%.2f,e=%.2f\n",d,e); return 0; } 输入: 50 |60 AB 程序会输出什么结果? 运行程序验证所分析的结论。 4.有如下程序: #include int main() { int x=3,y=2,z=1; printf("%d,%d\n",(++x,y++),z+2); 第一部分 上机实验指导 11 return 0; } 运行结果: 2,3 分析得到此结果的原因。 5.有如下程序: #include #include int main() { char c1,c2; int n; float f; scanf("%c%c%d%f",&c1,&c2,&n,&f); FILE *fp; if((fp=fopen("myinput.txt","w"))==NULL) //以写方式打开文本文件myinput.txt { printf("cannot open file\n"); exit(0); } fprintf(fp,"%c%c %d %f",c1,c2,n,f); //写入文件 fclose(fp); return 0; } (1)运行程序,当从键盘输入in101.5时,写出文件myinput.txt中的内容。 (2)运行程序,当从键盘输入in101.5时,写出文件myinput.txt中的内容。 (3)分析文件中内容不同的原因。 6.运行以下程序,分析文件myinput.txt中的内容变化原因。 #include #include int main() { char c1,c2; int n; float f; FILE *fp; if((fp=fopen("myinput.txt","r+ "))==NULL) //以读写方式打开文本文件 myinput.txt 12 C/ C++程序设计进阶实验指导与习题解析(第2 版) { printf("cannot open file\n"); exit(0); } fscanf(fp,"%c%c %d %f",&c1,&c2,&n,&f); //读文件数据 rewind(fp); n=100; fprintf(fp,"%c%c %d %f",c1,c2,n,f); fclose(fp); return 0; } 实验3 选择结构程序设计 实验3.1 使用表达式与if语句 【实验目的】 . 练习使用表达式表示条件。 . 使用if语句进行编程。 【实验内容】 1.从键盘输入一个字符。如果是大写字母,就转换成小写;如果是小写字母,就转换 成大写;如果是其他字符,则保持原样并输出结果。 2.从键盘输入一个数字,判断其是否为5的倍数而不是7的倍数。如果是,则输出 Yes;否则输出No。 3.从键盘输入一个4位正整数,求其逆序数,并输出。例如,若输入7168,则输出应 该是8617。 实验3.2 使用if语句与switch语句编程 【实验目的】 . 学会分支语句编程。 . 学会switch语句编程。 【实验内容】 1.编写一个C程序,从键盘上输入一个字符: 若该字符是数字字符,则把它转换为对应的整数并输出; 第一部分 上机实验指导 13 若该字符是大写字母,则转换为小写并输出; 若该字符是小写字母,则转换为大写并输出; 若该字符是其他字符,则不进行任何操作。 2.输入3个整数,按从大到小的顺序输出。 3.给出一个百分制的成绩,要求输出成绩等级A、B、C、D、E。90分以上的为A 级, 80~89分的为B级,70~79分的为C级,60~69分的为D级,60分以下的为E级。 实验3.3 使用if语句编程 【实验目的】 . 使用if语句进行编程。 . 求正整数各个数位上的数字。 【实验内容】 1.从键盘输入一个字符。如果是字母,就输出其对应的ASCII;如果是数字字符,就 转换成对应整数并输出。 2.从键盘输入一个数字,判断其是否能同时被3和5整除。如果是,输出Yes;否则 输出No。 3.从键盘输入一个4位正整数,求其各位数字之积,并输出。例如,若输入2523,则 输出应该是60。 实验3.4 使用表达式与if语句编程 【实验目的】 . 练习使用表达式表示条件。 . 使用if语句进行编程。 【实验内容】 1.根据以下函数关系编写一个程序,对输入的每个x 值,计算出y 的值并输出。 y = x -5 x <-2 2x -3 -2≤x ≤5 3x +6 x >5 ì . í .. .. 2.从键盘输入3个数,求其中最小者并输出。 3.从键盘输入一个5位整数,判断它是不是对称数,并输出判断结果。例如,43234 就是对称数。 实验 4 循环结构程序设计 实验4.使用循环语句(1) 1 【实验目的】 .熟练使用循环语句。 .使用break语句。 .使用循环的嵌套。 【实验内容】 1. 有如下公式 : 11 1 1-2×2 -3×3 -…- m ×m m 的值从键盘输入,若输入5, 536389 。 则应输出0. 2. 输出100~999 间所有三位数字都相等的整数。 提示:对于100~999 间的每一个整数,求出每位上的数字,然后判断它们是否相等。 如果相等,就输出该整数。 输出的结果应该为111 、222 、333 、444 、555 、666 、777 、888 、999 。 3. 输出乘法口诀表 。 1×1= 1 1×2=22×2= 4 1×3=3 2×3=6 3×3= 9 1×4=4 2×4=8 3×4=12 4×4=16 . 1×9=9 2×9=18 3×9=27 4×9=36 … 8×9=72 9×9=81 实验4.2 使用循环语句(2) 【实验目的】 .熟练使用循环语句。 .掌握双重循环。 【实验内容】 1. 求出下列分数序列的前20 项之和。 14 C/C+ + 程序设计进阶实验指导与习题解析(第 2 版) 第一部分 上机实验指导 15 21 ,32 ,53 ,85 ,… 2.找出一个大于给定整数m 且紧随m 的质数。 提示:对m +1及以后的每个整数,判断是否为质数,如果是就输出,并终止程序。 3.编写一个程序,使其输出结果为: 1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 2*2= 4 2*3= 6 2*4= 8 2*5= 10 2*6= 12 2*7= 14 2*8= 16 2*9= 18 3*3= 9 3*4= 12 3*5= 15 3*6= 18 3*7= 21 3*8= 24 3*9= 27 . 8*8= 64 8*9= 72 9*9= 81 实验4.3 使用循环语句(3) 【实验目的】 . 熟练使用循环语句。 . 理解循环条件和循环体。 【实验内容】 1.将大于整数m 且紧随m 的k 个质数输出。例如,若m 的值为17,k 的值为5,则应 输出19,23,29,31,37。m 和k 的值从键盘输入。 2.有一数列,第一项值为3,后一项值都比前一项的值增5。计算前20项中被4除后 余2的所有项之和并输出。 3.有4个数字1、2、3、4,能组成多少个互不相同且无重复数字的三位数? 分别是 多少? 实验4.4 使用循环语句(4) 【实验目的】 . 熟练使用循环语句。 . 理解循环条件和循环体。 . 使用break语句。 【实验内容】 1.一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,设计程 序,求它在第10次落地时,共经过多少米? 第10次反弹多高? 2.输出给定整数n 的所有质数因子(不包括1与自身)。 16 C/ C++程序设计进阶实验指导与习题解析(第2 版) 3.设计程序,使其根据下面公式计算S 的值并输出。设n 的值为10。 S =1+ 1 1+2+ 1 1+2+3+ … + 1 1+2+3+ … +n 实验4.5 读写文件中字符 【实验目的】 . 掌握读文件字符函数fgetc和写文件字符函数fputc。 . 与循环语句结合,向文件中写入或读出一串字符。 【实验内容】 1.编写程序,利用fputc函数(不允许使用fprintf函数),将键盘输入的以#结尾的一 串字符存入文件file.txt中。 2.查询实验内容1中文件file.txt的内容是否包含'a'字符,如果包含,在屏幕上输出 "Found",否则输出"NotFound"。 实验5 数 组 实验5.1 数组输入输出 【实验目的】 . 掌握数组元素的输入输出方法。 【实验内容】 1.定义一个有12个元素的一维整型数组a,从键盘输入元素的值,然后以每行3个 数据的形式输出a数组。 2.输出一维数组(1,-9,7,2,-10,3)中最大元素的下标。 3.利用单个字符输入输出函数从键盘输入任意长度字符串,并逐一输出该字符串。 实验5.2 排序 【实验目的】 . 利用数组进行数据排序。 【实验内容】 1.从键盘输入若干字符串,将它们由大到小排序并输出。 第一部分 上机实验指导 17 2.将3×4矩阵的每一行按由大到小排序。 3.任意输入一个自然数,输出由该自然数的各位数字组成的最大数。例如,输入 2583,则输出8532。 实验5.3 查找 【实验目的】 . 利用数组进行数据查找。 【实验内容】 1.从键盘输入若干字符串,输出其中最长的一个字符串并输出它的长度。 2.有一个3×4的矩阵,求出每行的最小值及每列的最小值。 3.输入一个长度不超过100 的字符串,删除该字符串中的重复字符。例如 abacaeedabcdcd,删除重复字符后的字符串为abced。 实验5.4 矩阵操作 【实验目的】 . 利用数组进行矩阵的输入输出。 【实验内容】 1.计算两个矩阵相乘得到的第三个矩阵,并打印计算结果。 2.求4×4矩阵的两条对角线元素之和。 3.编写一个程序,求出4×4的二维数组周边元素之和。 实验5.5 文件字符串读写 【实验目的】 . 掌握文件字符串读函数fgets和文件字符串写函数fputs。 【实验内容】 1.编写程序,从键盘输入任意长度不超过100 的英文字符串并存储到文件 file.txt中。 2.将实验内容1file.txt文件中的英文字符进行加密,追加到文件中。 加密方法:将字符a' '替代为字符'*'。 18 C/ C++程序设计进阶实验指导与习题解析(第2 版) 实验6 函 数 【实验目的】 . 掌握函数的定义与调用方法。 . 掌握函数实参与形参的对应关系,以及值传递和地址传递方式。 . 掌握函数的嵌套调用与递归调用的方法。 . 掌握变量的作用域与生存期的概念,并能利用变量的作用域与生存期有效地利用 内存。 【实验内容】 1.编写一个函数fun,其功能是求出100~1000中三位数字相同的所有整数(如111、 222、…、999),把这些整数放在ss所指数组中,个数作为函数值返回。 运行结果: The result: 111 222 333 444 555 666 777 888 999 2.编写一个带有函数的程序,在主函数中读入一个字符串(长度<20),调用函数将 该字符串中的所有字符按ASCII升序排序,然后在主函数中将排序结果输出。例如,输 入edcba,则输出abcde。 3.编写一个函数fun,其功能是求出小于或等于n 的所有质数,并将它们放在一个一 维数组中,然后返回所求出的质数的个数。 输入: 10 运行结果: 2 3 5 7 4.编写带有函数的程序,函数的功能是从1~100中选出能被3整除,且某一位上的 数字为4的整数,并把这些整数放在b所指的数组中,整数的个数作为函数值返回。 运行结果: 42 45 48 54 84 5.编写带有函数的程序(函数名为voidfun(charb[])),功能是将字符数组b中下标 为奇数位置上的字母转换为小写字母(若该位置上不是字母,则不转换,注意下标是从0 开始的)。 例如,输入aBbCC45GhNJ,则应输出abbcC45ghnJ。 6.编写带有函数的程序(函数名为intfun(charb[],charc)),功能是求出数组b中 指定字符的个数,并返回此值。 第一部分 上机实验指导 19 例如,输入121412132,再输入字符1则输出4。 7.编写带有函数的程序(函数名为intfun(intb[],intt)),功能是求出数组的最大元 素在数组中的下标,并显示其数值。 例如,输入566 243 665 398 543 335 567 876 666,则输出结果为7,876。 8.函数fun的功能是把数组a中的n 个数的两倍与数组b中的逆序的n 个数的三倍 一一对应相加,并将结果存在数组c对应位置中。 例如: 数组a中的值是2,3,4,5,1 数组b中的值是1,2,3,5,8 调用该函数后,数组c存放的数据是28,21,17,16,5 9.编写一个函数,功能为分别统计字符串中大写字母和小写字母的个数。例如,输 入adwWDSaSeDDfgj,结果为upper=6,lower=8。 10.现需要计算班级C语言成绩及格率,在主函数中读入10个学生的C语言成绩, 输入要存储的文件名,并调用子函数compute。 要求编写子函数compute,其功能是:计算C语言成绩及格率,并将及格成绩、不及 格成绩及及格率存入文件中,要求在输出每一项前加上标注,及格率保留两位小数。 文件内容如下所示: 及格:976697898777 不及格:54345544 及格率:60% 程序如下: #include #include void compute(int score[10],char *filename,int n) { . //填写此段程序 }i nt main() { int score[10]; int i=0; char name[20]; printf("请输入文件名\n"); gets(name); printf("请输入10 个成绩\n"); for(i=0;i<10;i++) scanf("%d",&score[i]); compute(score,name,10); system("pause"); return 0; } 20 C/ C++程序设计进阶实验指导与习题解析(第2 版) 实验7 指 针 实验7.1 用指针变量引用数组 【实验目的】 . 练习使用指针变量进行编程。 . 练习使用指针运算符。 【实验内容】 1.利用指针变量访问目标变量,使两个数据实现降序排列输出。 程序如下: #include int main() { int x=10,y=100; . //填写此段程序 printf("max=%d, min=%d\n",*p1,*p2); return 0; } 说明:程序中指针变量p1、p2的值可以改变,即改变其所指向的目标变量;而被指向 的目标变量的值不应改变。 (1)若将程序中的“printf("max=%d,min=%d\n",*p1,*p2) ”改为“printf ("max=%d,min=%d\n",p1,p2) ”,结果会是什么? (2)若想利用指针变量改变所指的目标变量x和y的值,应如何修改程序? 2.利用指针变量访问数组。 程序如下: #include int main() { int arr[4],i; int *p=arr; //定义p 为指针变量并指向数组首地址 //通过指针移动为元素赋值 . //填写此段程序 //使p 重新指向数组首地址 //移动指针