1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。广西师范大学职业技术师范学院C语言程序设计实验指导书唐 杰 编著广西师范大学职业技术师范学院 8月目 录第一章 开发工具简介1启动1建立项目2新建和编辑源文件4编译代码5运行结果5第二章 实验内容7实验一 开发环境与程序设计7实验二 数据类型、 运算符和表示式9实验三 逻辑结构程序设计12实验四 循环控制程序设计14实验五 数组16实验六 函数18实验七 菜单实现20实验八 指针22实验九 结构体与共用体26实验十 动态内存分配28实验十一 位运算29实验十二 编译预处理与自定义类型30实验十三 文件31参考文献: 32附录: C程
2、序设计实验报告32说明: 本实验指导书中第十、 十二、 十三个实验非计算机专业可选作。第一章 开发工具简介Microsoft Visual Studio 6.0是微软公司在1998年开发的一套软件开发工具, 其中包括Visual Basic、 Visual C+、 Visual J+和其它一些开发工具, 在课程中将主要使用Visual C+ 6.0( 简称VC6) 进行实验设计, VC6是当前同类产品中最为成熟, 也是使用最多的集成开发环境IDE( Integrated Development Environment) , 启动当VC6启动后, 会出现如Error! Reference sou
3、rce not found.所示的主程序窗口。图 0.1主界面在VC6的主界面中, 顶部是主菜单栏和工具栏, 主菜单共有9个菜单项。VC6主界面左侧是项目工作区窗口( Workspace) , 用来显示工作区的信息, 右侧是程序编辑窗口, 用来输入和编辑源代码, 下面的是输出窗口( Output) , 用来显示进行构建或调试等工作时的状态与数据信息, 最底部是状态栏, 各窗口可任意隐藏、 显示。建立项目用VC6进行程序设计, 是作为项目对待的, 一个项目是一个整体, 它存放建立程序所需要的全部信息, 包括程序所有源文件的名称及其关系, 所需库文件的清单和建立程序所用的编译器、 连接器和其它工具
4、的选项清单。由于VC6能够建立的工作项目共有16个或更多, 对于初学者来说有点复杂, 要全部弄清楚需要很长的时间, 因此, 本书只以实验中用到的控制台应用程序为例进行介绍。建立一个项目能够经过VC6的向导来完成, 选择主菜单中”文件”新建”菜单项, 将会弹出如Error! Reference source not found.所示的对话框, 在”Projects”标签页中列出了16个能够建立的项目选项, 选择”工程”选项卡, 选择”Win32 Console Application”, 然后在右上侧的”工程名称”文本框中输入项目名, ”位置”中输入要保存的项目路径, 点击下方的”确定”按钮即可
5、进入下一个界面。图 0.1新建项目对话框在下一个界面中, 显示的是能够创立的控制台应用程序类型, VC6中能够创立的控制台应用程序共有4种, 如Error! Reference source not found.所示。课程实验只需选择默认的”一个空工程”, 单击”完成”, VC6会将创立的项目信息显示出来, 如Error! Reference source not found.所示, 其中包括项目包含的文件及路径等内容。图 0.2控制台项目对话框图 0.3项目信息对话框 点击”确定”按钮, 完成项目新建工作, 这时VC6的主界面变成Error! Reference source not fou
6、nd.所示。能够看到新建的项目中未包含任何文件。图 0.4项目建立完成界面新建和编辑源文件向所创立的项目中添加源文件, 经过”文件”新建”菜单选项打开新建对话框, 这时弹出的对话框与Error! Reference source not found.一样, 可是标签页变成”文件”页, 如下所示。该标签页中列出了VC6能够新建的所有文件类型, 其中与实验有关的是”C/C+ Header File”和”C+ Source File”两类文件, 分别用来创立头文件和源文件的。单击”C+ Source File”选项, 并勾选”A添加工程”复选框, 选择项目名( 默认当前项目) , 然后在”文件”文本
7、框中输入源文件名, 在”C目录”文本框中输入或选择文件路径, 点击”确定”按钮就完成了新建文件的工作如下图所示。然后可在工作区编辑源程序。图 0.1源代码编辑界面编译代码在编辑器中输入源代码并保存, 然后能够经过主菜单中的”编译”项进行程序的编译、 链接和运行。也可经过工具栏( 编译微型条) 中工具快速完成( 如左图) 构建可执行文件, VC6会在主界面下方的信息输出窗口中将构建过程中的信息显示出来, 如编译过程和链接过程的步骤, 是否有错误等信息, 如Error! Reference source not found.所示。图 0.1构建信息输出窗口运行结果如果在构建过程中有错误发生, 错误
8、信息输出窗口中显示出来, 这时就需要返回到源代码中进行修改, 再重新构建, 直到没有错误为止。如果项目正确的构建完成, 就能够运行了。运行的方法是经过主菜单中的”编译”下的执行选项进行, 或者使用快捷键”Ctrl+F5”、 微型编译微型条也能实现同样的目的。最后, 运行的结果会显示在一个控制台窗口中, 如Error! Reference source not found.所示。图 0.1运行结果注: ”Press any key to continue”是系统提示信息。第二章 实验内容C语言是一门功能强大、 实且用性很强, 又非常灵活的程序设计语言, 只有经过不断的上机练习, 才能较好地理解和
9、掌握C语言。在实验课程中常采用的是较为常见的Visual C+ 6.0( 简称VC6) 开发环境。 本实验指导书中共有十三个实验, 每一个实验内容中都包含若干个实验项目, 每一次上机所需时间设计为2个学时, 共26学时。实验应掌握正确的方法, 即: 实验前先写好程序, 然后再上机调试经过, 并对调试结果进行分析, 总结实验的收获, 以进一步理解和巩固所学知识。实验一 开发环境与程序设计一、 实验目的1. 熟悉VC6的开发环境2. 掌握利用VC6进行程序编辑、 构建与调试的方法3. 了解子函数的调用方法4. 熟悉C源程序的结构和特点二、 实验内容1. VC6环境的使用(1) 掌握启动与关闭VC6
10、的方法。(2) 熟悉VC6各菜单项的内容与各窗口的用途。(3) 建立一个项目test, 其中包含一个源文件: test.c, 编译、 运行并查看其结果, 文件内容如表1所示: test.c文件内容1 #include 2 void main( )6 7 printf(大家好,欢迎使用VC开发环境n);8 2. 建立相应项目和源文件, 并输入下表信息, 执行结果, 体会函数调用关系。#include/求两个int型数中的大者int max(int x,int y) if(x=y)return x;elsereturn y;void main()int a,b,max1;scanf(%d%d,&a
11、,&b);/调用max函数, 经过max返回最大者max1=max(a,b);printf(最大者为:%d,max1);3. 分别输入Error! Reference source not found.、 表2所示程序源代码(1) 对源程序进行编译, 观察屏幕上显示的编译信息, 如有错误产生则找出原因并改正, 再进行编译, 直至没有错误。(2) 进行连接并运行程序, 分析运行结果。表 1 程序代码 #include void main() int a,b,sum1;float x,y,sum2; a = 123; b = 456; sum1 = a + b; printf(sum is %dn
12、, sum1); x=12.3; y=12.6; sum2=x+y; printf(”sum2=%5d”,sum2) 3. 以下表2代码接受从键盘上输入的int型数x, 乘2后赋值给int型的p单元, 若有错, 请改正。表 2程序代码 #include void main() scanf(x); int p=x*2; printf(”p=”,p)实验二 数据类型、 运算符和表示式一、 实验目的1. 掌握C语言的基本数据类型及其意义2. 熟悉变量的定义与赋值、 引用方法3. 掌握C语言的算术运算符及表示式及赋值语句的应用4. 掌握输入输出函数的使用5. 熟悉各种常见的格式转换符6. 进一步熟悉C
13、语言程序的编辑、 编译、 连接和运行的过程二、 实验内容1. 分析表1表3程序代码, 若有错, 则改正。表1代码1 #include void main() char s1 = 3, s2 = 4, s3 = 5; int c1 = 101, c2 = 102; printf(3 %ct4 %ct5 %cn, s1, s2, s3); printf(s1 = %dts2 = %dts3 = %dn, s1, s2, s3); printf(c1 = %dt %c, c1, c1);printf(c2 = %dt %c, c2, c2);表 2代码2 #include void main() f
14、loat x = 8.3, y = 4.2, s; int a = 7; s = x + a % 5 * (int)(x-y) % 2 / 3;printf(s = %f, s); 表 3代码3 #include /* 理解前置和后置自增自减的异同*/ void main() int i, j, p, q; i = 3; j = 6; p = i+; q = -j; printf(%d, %d, %d, i, j, p, q); p = i- + 3; q = +j -4; printf(%d, %d, %d, %d, i, j, p, q);2. 请改正表4表6程序代码的错误。表 4 代码4
15、 #include #define PI 3.14 void main(); int r = 3;area; area= PI*r*R; print(%d, r,area); 表 5 代码5 #include void main() int m; double x; scanf(%1d, &m); x = 3.14 * m * m printf(f, x); 表 6 代码6 #include void main() /* 求a, b的和, 要求精确到小数点后9位,并输出 */ float a = 12.1, b =0.,sum; sum=a+b;printf(sum=%d, sum);3. 按
16、表7表8所示程序代码中的注释要求将程序填写完整。表 7 代码7 #include void main() /* 完成a, b两个数的交换 */ int a = 9, b = 5; a += b; b = ; a -= ;printf(%d %d, a, b); 表8 代码8#include void main() int m, n; float x = 3.5, y = 6.2; scanf(%d, %d, &m, &n); /* 每个数的输出宽度为 6, 两数之间以逗号分隔 */ printf( , m, n); /* 每个数的输出宽度为 7, 小数位数为 2 */ printf(x = ,
17、 y = , ); 4. 编写程序, 用getchar函数读入两个字符c1, c2, 然后分别用putchar函数和printf函数输出这两个字符及其ASCII码, 并思考: 变量c1, c2应定义为字符型还是整型? 或是二者皆可? 5已知某商品单价2元/斤, 现销售5.12斤, 求销售额。要求: 已知条件用scanf完成。实验三 逻辑结构程序设计一、 实验目的1. 掌握逻辑运算符和逻辑表示式的正确使用2. 熟悉顺序结构中语句的执行过程3. 掌握if语句和switch语句4. 掌握基本的程序调试方法三、 实验内容1. 求分段函数的值, 分段函数如下: 要求经过scanf语句输入x的值, pri
18、ntf语句输出y的值。说明: 程序编译成功, 只是说明没有语法错误, 但不一定能得出正确结果, 因为有可能存在逻辑错误。经过跟踪变量、 调试程序, 能够找出问题所在。一般所用的调试方法有以下3种: ( 组建/开始调试) (1) 单步跟踪: Step Into (F10)(2) 运行到光标处: Run to cursor (Ctril+F10)(3) 设置断点: Insert/Remove Breakpoint (F9) 调试的一般过程: 调试, 是指在程序的运行过程的某一阶段观测程序的当前状态, 要使程序在执行到某一行时暂停, 应首先在该行设置断点。然后经过”组建( Build) /开始调试(
19、 Start Debug) /Go”命令菜单执行, 使程序进入调试状态, 此时注意观察: 组建菜单此时变为Debug菜单。程序执行到断点处会停顿下来。然后可采用Debug菜单中的4条命令来控制程序的运行。 Step Over: 运行当前断点指向的代码( 只运行一条代码) Step Into: 若当前断点所指代码是一个函数的调用, 则进入该函数单步执行。 Step Out: 若当前执行在某函数内, 使程序运行至函数返回处。 Run to Cursor: 使程序运行至光标所指的代码处。单步运行表5所示程序代码, 按要求进行变量跟踪, 并写出调试结果。表5 代码5#includevoid main(
20、) int i, j, k, ss, m = 1, n = 1; scanf(%d %d, &i, &j); /*查看变量i, j的取值, 读入数据是否正确? */ m += i+; /*观察变量m, j的结果, 为什么? */ n *= -j; /*观察变量n, j的结果, 为什么? */ ss = (k = m + 2, n - 5, k + n); /*观察变量k的结果, 为什么? */ printf(%d, ss); /*查看最终结果, 为什么? */ 2. 给出一个百分制成绩, 要求输出成绩等级A、 B、 C、 D和E。90分以上为A, 8980为B, 7970为C, 6960为D,
21、 60分以下为E。(1) 要求分别用if语句和switch语句来实现(2) 输入数据大于100或小于0时, 给出提示信息”输入数据出错! ”, 并结束程序运行。3. 定义一个不多于5位的正整数, 要求(1) 用scanf输入, 并求出它是几位数(2) 分别输出每一位数字(3) 按逆序输出各位数字, 例如原数是321, 应输出123(4) 对不合法的输入给出提示信息, 并结束程序实验四 循环控制程序设计一、 实验目的1. 掌握利用while语句、 dowhile语句和for语句实现循环控制的方法2. 掌握循环结构和选择结构的嵌套设计方法, 以及多重循环的设计方法3. 了解控制语句break、 c
22、ontinue和goto等语句的作用及使用方法4. 进一步熟悉程序的调试方法二、 实验内容1. 调试表1所示程序代码, 分别输入5和6, 以单步跟踪的方式运行程序。观察循环中命令的执行及转向情况, 并记录程序的运行结果。表1 代码1#include void main() int n; while (1) printf(请输入一个数: ); scanf(%d, &n); if (n % 2 = 1) printf(我说的是); continue; break; printf(谢谢, 这正是我要的数据! );2. 输入一行字符, 分别统计出其中的英文字母、 空格、 数字和其它字符的个数。3. 表
23、2所示程序代码的功能是: 假设树高k厘米, 小蚕每天向上爬m厘米, 每天晚上因睡觉向下滑n厘米, 爬到顶后不再下滑( nmk) 。计算小蚕需要多少天才能爬到树顶。(1) 在花括号的说明处将程序补充完整。(2) 测试数据: 分别令k、 m、 n为253、 71、 29, 输出结果应为6。表2 代码2 #include void main() int k, m, n,h, day = 0; /h为当天最高点 printf(请输入3个数: ); scanf(%d %d %d, &k, &m, &n); /*在此处编写若干语句, 使程序完整。*/ printf(n需要%d天, 小蚕能够爬到树顶。n,
24、day); 4. 使用循环语句编程, 输出图1所示的九九乘法表。*12345678911224336944812165510152025661218243036771421283542498816243240485654991827364554637281图1 九九乘法表5. 分别用while语句、 dowhile语句编写程序, 计算要求: (1) 用单循环编写程序(2) 使最后一项 的值小于等于给定的 即可结束运算, 设 (3) 除了输出 e 以外, 同时还要输出总的项数n 实验五 数组一、 实验目的1. 掌握一维数组与二维数组的定义、 初始化及使用方法2. 掌握字符数组和字符串函数的使用3
25、. 掌握与数组有关的算法4. 进一步理解模块化程序设计的方法二、 实验内容1. 表1代码所示程序的功能是: 将含n个元素的数组xx的前k个元素( kn) 移到数组的尾部, 变为后k个元素, 可是数组的这两段( 原前k个元素为一段, 另外的n-k个元素为一段) 中元素的顺序不变。例如: 输入: 7和1 2 3 4 5 6 7, 再输入: 5, 则输出: 6 7 1 2 3 4 5 请在横线处填入适当的内容, 将程序补充完整。表1 代码1 #include void main() int n, k, xx20; int i, j, t; printf(请输入元素个数: ); scanf(%d, &
26、n); printf(请输入%d个数: , n); for (i = 0; i n; i+) scanf(%d, &xxi); printf(n请输入要移动的元素个数: ); scanf(%d, &k); for (i = 0; i k; i+) t = ; for (j = 1; j n; j+) ; ; printf(n移动之后的元素序列为: n); for (i = 0; i n; i+) printf(%3d, ); printf(n); 2. 表2所示程序代码的功能是: 对数组a中的n种商品价格进行分段统计, 商品各段价格的数目存到数组b中, 其中: 价格为100元以下的个数存到b0
27、中, 价格在100到199元之间的个数存到b1中, 价格在200到299元的个数存到b2中, 价格在300到399元的个数存到b3中, 价格在400到499元的个数存到b4中, 价格在500以上的个数存到b5中。例如: 当数组a中的数据为: 90、 180、 270、 380、 590、 530、 140、 750、 380时, 调用函数后, 数组b中存放的数据应是: 1、 2、 1、 2、 0、 3。表2 代码2 #include void main() int i, a100=90,180,270,380,590,530,140,750,380, b6; /*在此处编写若干代码, 使程序完
28、整*/ printf(结果是: ); for (i = 0; i 6; i+) printf(%d, bi); printf(n); 3. 编写程序, 输入10个整数, 再把它们从小到大的顺序进行排列, 最后再输入一个整数k, 并将k插入到该整数数列中, 插入后的数列依然从小到大排列。例如: 输入6, 3, 42, 23, 35., 71, 98, 67, 56, 38, 最后输入待插入的数为59, 则输出结果应为: 3, 6, 23, 35, 38, 42, 56, 59, 67, 71, 98。实验六 函数一、 实验目的1. 掌握函数的定义和调用方法2. 掌握函数形参和实参的对应关系, 以
29、及”值传递”的方式3. 理解函数的嵌套调用和递归调用的方法4. 理解变量作用域和存在期的概念5. 掌握全局变量和局部变量、 动态变量、 静态变量的概念和使用方法6. 学习对多文件的程序进行编译和运行的方法二、 实验内容1. 输入表1程序代码并执行, 观察程序的运行结果。表1 代码1 #include int a = 3, b = 5; int max(int a, int b) int c; c = a b ? a : b; return c; int main() printf(%dn, max(a, b); return 1; (1) 在主函数的printf语句前加入int a = 8;
30、语句后重新执行程序, 观察其运行结果。分析变量a的作用域, 程序修改前后两次调用max函数时的实参a是否为同一变量? (2) 将int a = 3, b = 5;放入同一目录中的”f.h”文件中, 并在main函数文件中加入#include ”f.h”,主函数改为以下代码, 运行并观察其结果。 #include #include ”f.h” void main() extern int a, b; printf(%dn, max(a, b); (3) 若将关键字extern去掉再运行, 观察结果有何变化? 2. 编写子函数, 判断一个数是否是素数。在主函数中输入一个整数, 输出是否是素数的信息
31、。要求: 编写一个函数int prime(int n), 返回给定整数n是否为素数的标志。并在主函数中对任意输入的整数, 调用该函数, 输出结果。3. 编写程序, 计算下面公式并输出结果: 要求: (1) 编写一个函数计算。(2) 编写主函数, 输入n和m, 调用( 1) 中的函数完成计算。(3) 输入n和m要给出提示信息, 并检查n和m的合理性, 不合理的输入应输出错误信息, 并不再进行计算。(4) 运行程序并计算。实验七 菜单实现一、 实验目的1. 掌握菜单设计思想2. 了解容错方法实现3. 了解软件设计的一般思想。4. 掌握循环控制的综合运用。5. 掌握定位函数编写及常见库函数的使用。二
32、、 实验内容编写程序实现以下菜单功能说明:1) 各功能模块的实现可只用一个printf语句代替.2) 用循环实现菜单的处理.提示: stdlib.h含system(cls) 清屏函数 exit() 退出系统函数 实验八 指针一、 实验目的1.掌握指针的概念、 指针变量定义格式和引用方法2.掌握指针的运算方法3.掌握数组的指针和指向数组的指针变量4.掌握指针与函数的关系5.能正确使用字符串的指针和指向字符串的指针变量6.了解指向函数的指针7.了解指向指针变量的指针二、 实验内容1. 调试并修改表1程序代码, 使之具有如下功能: 用指针法输入12个数, 然后按每行4个数输出。表1 代码1 #inc
33、lude int main() int j, k, a12, *p; for (j = 0; j 12; j+) scanf(%d, p+); for (j = 0; j 12; j+) printf(%d, *p+); if (j % 4 = 0) printf(n); return 1; 2. 上机验证表2所示程序代码的运行结果, 使之具有如下功能: 输入3个整数, 按由小到大的顺序输出。表2 代码2#include void swap(int *p1, int *p2);int main() int n1, n2, n3; int *p1, *p2, *p3; printf(请输入3个整
34、数 n1, n2, n3: ); scanf(%d, %d, %d, &n1, &n2, &n3); p1 = &n1; p2 = &n2; p3 = &n3; if (n1 n2) swap(p1, p2); if (n1 n3) swap(p1, p3); if (n2 n3) swap(p2, p3); printf(现在, 顺序是: %d, %d, %dn, n1, n2, n3); return 1; void swap(int *p1, int *p2) int p; p = *p1; *p1 = *p2; *p2 = p; 3. 指出表3所示程序代码问题所在, 该程序功能为: 输
35、出数组a中的10个元素。表3代码3 #include int main() int a10; int *p, i; p = a; for (i = 0; i 10; i+) *p = i; p+; for (i = 0; i 10; p+) printf(%d, *p); return 1; 4. 表4所示程序代码是用来从键盘输入10个整数, 然后求出其中的最小值, 填空空缺部分, 使程序完整。表4代码4 #include int table10; void lookup(int *t, int *a, int n) int k; *a = t0; for (k = 1; k n; k+) i
36、f ( ) *a = tk; int main() int k, min, *p = &min; for (k = 0; k 10; k+) scanf(%d, table + k); lookup( , , 10); return 1;5. 填写代码, 使表5所示程序代码完整, 用来建立一个如图1 所示的二维数组, 并按以下格式输出。1 0 0 0 10 1 0 1 00 0 1 0 00 1 0 1 01 0 0 0 1图1 二维数组表5 代码5 #include int main() int a55 = 0, *p5, i, j; for (i = 0; i 5; i+) pi = ;
37、for (i = 0; i 5; i+) *(pi + ) = 1; *(pi + 5 - ) = 1; for (i = 0; i 5; i+) for (j = 0; j 5; j+) printf(%2d, pij); ; return 1; 实验九 结构体与共用体一、 实验目的1. 理解结构体类型、 共用体类型和枚举类型的概念及定义形式2. 掌握结构体类型和共用体类型变量的定义和引用形式3. 了解内存的动态分配、 链表的概念和操作4. 掌握用typedef定义类型的方法。二、 实验内容1. 分析表1程序代码, 预测结果并上机验证。表1 代码1#include int main() union bt int k; char c2; a; a.k = -7; printf(%o, %on, a.c0