1、广西师范大学职业技术师范学院C语言程序设计实验指导书唐 杰 编著广西师范大学职业技术师范学院2023年8月目 录第一章 开发工具简介1启动1建立项目2新建和编辑源文献4编译代码5运营结果5第二章 实验内容7实验一 开发环境与程序设计7实验二 数据类型、运算符和表达式9实验三 逻辑结构程序设计12实验四 循环控制程序设计14实验五 数组16实验六 函数18实验七 菜单实现20实验八 指针22实验九 结构体与共用体26实验十 动态内存分派28实验十一 位运算29实验十二 编译预解决与自定义类型30实验十三 文献31参考文献:32附录:C程序设计实验报告32说明:本实验指导书中第十、十二、十三个实验
2、非计算机专业可选作。第一章 开发工具简介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 source not found.所示的主程序窗口。图 0.1主界面在VC6的主界面中,顶部是主
3、菜单栏和工具栏,主菜单共有9个菜单项。VC6主界面左侧是项目工作区窗口(Workspace),用来显示工作区的信息,右侧是程序编辑窗口,用来输入和编辑源代码,下面的是输出窗口(Output),用来显示进行构建或调试等工作时的状态与数据信息,最底部是状态栏,各窗口可任意隐藏、显示。建立项目用VC6进行程序设计,是作为项目对待的,一个项目是一个整体,它存放建立程序所需要的所有信息,涉及程序所有源文献的名称及其关系,所需库文献的清单和建立程序所用的编译器、连接器和其它工具的选项清单。由于VC6可以建立的工作项目共有16个或更多,对于初学者来说有点复杂,要所有弄清楚需要很长的时间,因此,本书只以实验中
4、用到的控制台应用程序为例进行介绍。建立一个项目可以通过VC6的向导来完毕,选择主菜单中“文献”“新建”菜单项,将会弹出如Error! Reference source not found.所示的对话框,在“Projects”标签页中列出了16个可以建立的项目选项,选择“工程”选项卡,选择“Win32 Console Application”,然后在右上侧的“工程名称”文本框中输入项目名,“位置”中输入要保存的项目途径,点击下方的“拟定”按钮即可进入下一个界面。图 0.1新建项目对话框在下一个界面中,显示的是可以创建的控制台应用程序类型,VC6中可以创建的控制台应用程序共有4种,如Error!
5、Reference source not found.所示。课程实验只需选择默认的“一个空工程”,单击“完毕”,VC6会将创建的项目信息显示出来,如Error! Reference source not found.所示,其中涉及项目包含的文献及途径等内容。图 0.2控制台项目对话框图 0.3项目信息对话框 点击“拟定”按钮,完毕项目新建工作,这时VC6的主界面变成Error! Reference source not found.所示。可以看到新建的项目中未包含任何文献。图 0.4项目建立完毕界面新建和编辑源文献向所创建的项目中添加源文献,通过“文献”“新建”菜单选项打开新建对话框,这时弹出
6、的对话框与Error! Reference source not found.同样,但是标签页变成“文献”页,如下所示。该标签页中列出了VC6可以新建的所有文献类型,其中与实验有关的是“C/C+ Header File”和“C+ Source File”两类文献,分别用来创建头文献和源文献的。单击“C+ Source File”选项,并勾选“A添加工程”复选框,选择项目名(默认当前项目),然后在“文献”文本框中输入源文献名,在“C目录”文本框中输入或选择文献途径,点击“拟定”按钮就完毕了新建文献的工作如下图所示。然后可在工作区编辑源程序。图 0.1源代码编辑界面编译代码在编辑器中输入源代码并保
7、存,然后可以通过主菜单中的“编译”项进行程序的编译、链接和运营。也可通过工具栏(编译微型条)中工具快速完毕(如左图)构建可执行文献,VC6会在主界面下方的信息输出窗口中将构建过程中的信息显示出来,如编译过程和链接过程的环节,是否有错误等信息,如Error! Reference source not found.所示。图 0.1构建信息输出窗口运营结果假如在构建过程中有错误发生,错误信息输出窗口中显示出来,这时就需要返回到源代码中进行修改,再重新构建,直到没有错误为止。假如项目对的的构建完毕,就可以运营了。运营的方法是通过主菜单中的“编译”下的执行选项进行,或者使用快捷键“Ctrl+F5”、微型
8、编译微型条也能实现同样的目的。最后,运营的结果会显示在一个控制台窗口中,如Error! Reference source not found.所示。图 0.1运营结果注:“Press any key to continue”是系统提醒信息。第二章 实验内容C语言是一门功能强大、实且用性很强,又非常灵活的程序设计语言,只有通过不断的上机练习,才干较好地理解和掌握C语言。在实验课程中常采用的是较为常用的Visual C+ 6.0(简称VC6)开发环境。 本实验指导书中共有十三个实验,每一个实验内容中都包含若干个实验项目,每一次上机所需时间设计为2个学时,共26学时。实验应掌握对的的方法,即:实验前
9、先写好程序,然后再上机调试通过,并对调试结果进行分析,总结实验的收获,以进一步理解和巩固所学知识。实验一 开发环境与程序设计一、实验目的1. 熟悉VC6的开发环境2. 掌握运用VC6进行程序编辑、构建与调试的方法3. 了解子函数的调用方法4. 熟悉C源程序的结构和特点二、实验内容1. VC6环境的使用(1) 掌握启动与关闭VC6的方法。(2) 熟悉VC6各菜单项的内容与各窗口的用途。(3) 建立一个项目test,其中包含一个源文献:test.c,编译、运营并查看其结果,文献内容如表1所示: test.c文献内容1 #include 2 void main( )6 7 printf(大家好,欢迎
10、使用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,&b);/调用max函数,通过max返回最大者max1=max(a,b);printf(最大者为:%d,max1);3. 分别输入Error! Reference source not found.、表2所示程序源代码(1) 对源程序进行编译,观测屏幕上显示的编译信息,如有错误产生则
11、找出因素并改正,再进行编译,直至没有错误。(2) 进行连接并运营程序,分析运营结果。表 1 程序代码 #include void main() int a,b,sum1;float x,y,sum2; a = 123; b = 456; sum1 = a + b; printf(sum is %dn, 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
12、p=x*2; printf(“p=”,p)实验二 数据类型、运算符和表达式一、 实验目的1. 掌握C语言的基本数据类型及其意义2. 熟悉变量的定义与赋值、引用方法3. 掌握C语言的算术运算符及表达式及赋值语句的应用4. 掌握输入输出函数的使用5. 熟悉各种常用的格式转换符6. 进一步熟悉C语言程序的编辑、编译、连接和运营的过程二、 实验内容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,
13、 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() float 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 =
14、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 #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
15、* 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. 按表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
16、m, n; float x = 3.5, y = 6.2; scanf(%d, %d, &m, &n); /* 每个数的输出宽度为 6,两数之间以逗号分隔 */ printf( , m, n); /* 每个数的输出宽度为 7,小数位数为 2 */ printf(x = , y = , ); 4. 编写程序,用getchar函数读入两个字符c1,c2,然后分别用putchar函数和printf函数输出这两个字符及其ASCII码,并思考:变量c1,c2应定义为字符型还是整型?或是两者皆可? 5已知某商品单价2元/斤,现销售5.12斤,求销售额。规定:已知条件用scanf完毕。实验三 逻辑结构程序设
17、计一、实验目的1. 掌握逻辑运算符和逻辑表达式的对的使用2. 熟悉顺序结构中语句的执行过程3. 掌握if语句和switch语句4. 掌握基本的程序调试方法三、 实验内容1. 求分段函数的值,分段函数如下:规定通过scanf语句输入x的值,printf语句输出y的值。说明:程序编译成功,只是说明没有语法错误,但不一定能得出对的结果,由于有也许存在逻辑错误。通过跟踪变量、调试程序,可以找出问题所在。通常所用的调试方法有以下3种:(组建/开始调试)(1) 单步跟踪:Step Into (F10)(2) 运营到光标处:Run to cursor (Ctril+F10)(3) 设立断点:Insert/R
18、emove Breakpoint (F9) 调试的一般过程: 调试,是指在程序的运营过程的某一阶段观测程序的当前状态,要使程序在执行到某一行时暂停,应一方面在该行设立断点。然后通过“组建(Build)/开始调试(Start Debug)/Go”命令菜单执行,使程序进入调试状态,此时注意观测:组建菜单此时变为Debug菜单。程序执行到断点处会停顿下来。然后可采用Debug菜单中的4条命令来控制程序的运营。 Step Over:运营当前断点指向的代码(只运营一条代码) Step Into:若当前断点所指代码是一个函数的调用,则进入该函数单步执行。 Step Out:若当前执行在某函数内,使程序运营
19、至函数返回处。 Run to Cursor:使程序运营至光标所指的代码处。单步运营表5所示程序代码,按规定进行变量跟踪,并写出调试结果。表5 代码5#includevoid main() 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); /
20、*查看最终结果,为什么?*/ 2. 给出一个百分制成绩,规定输出成绩等级A、B、C、D和E。90分以上为A,8980为B,7970为C,6960为D,60分以下为E。(1) 规定分别用if语句和switch语句来实现(2) 输入数据大于100或小于0时,给出提醒信息“输入数据犯错!”,并结束程序运营。3. 定义一个不多于5位的正整数,规定(1) 用scanf输入,并求出它是几位数(2) 分别输出每一位数字(3) 按逆序输出各位数字,例如原数是321,应输出123(4) 对不合法的输入给出提醒信息,并结束程序实验四 循环控制程序设计一、实验目的1. 掌握运用while语句、dowhile语句和f
21、or语句实现循环控制的方法2. 掌握循环结构和选择结构的嵌套设计方法,以及多重循环的设计方法3. 了解控制语句break、continue和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(谢谢
22、,这正是我要的数据!);2. 输入一行字符,分别记录出其中的英文字母、空格、数字和其他字符的个数。3. 表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); /*在此处编写若干
23、语句,使程序完整。*/ printf(n需要%d天,小蚕可以爬到树顶。n, day); 4. 使用循环语句编程,输出图1所示的九九乘法表。*12345678911224336944812165510152025661218243036771421283542498816243240485654991827364554637281图1 九九乘法表5. 分别用while语句、dowhile语句编写程序,计算规定:(1) 用单循环编写程序(2) 使最后一项 的值小于等于给定的 即可结束运算,设 (3) 除了输出 e 以外,同时还要输出总的项数n 实验五 数组一、实验目的1. 掌握一维数组与二维数组的
24、定义、初始化及使用方法2. 掌握字符数组和字符串函数的使用3. 掌握与数组有关的算法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(请输入元素个数:)
25、; scanf(%d, &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元以下的
26、个数存到b0中,价格在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; /*在此处编写若干代码,使程序完整*/ printf(结果是:);
27、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. 掌握函数形参和实参的相应关系,以及“值传递”的方式3. 理解函数的嵌套调用和递归调用的方法4. 理解变量作用域和存在期的概念5.
28、掌握全局变量和局部变量、动态变量、静态变量的概念和使用方法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; 语句后重新执行程序,观测其运营结果。分析变量a的作用域,程序修改前后两次调用max函数时的实参a是否为同一
29、变量?(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. 编写子函数,判断一个数是否是素数。在主函数中输入一个整数,输出是否是素数的信息。规定:编写一个函数int prime(int n),返回给定整数n是否为素数的标志。并在主函数中对任意输入的整数,调用该函
30、数,输出结果。3. 编写程序,计算下面公式并输出结果:规定:(1) 编写一个函数计算。(2) 编写主函数,输入n和m,调用(1)中的函数完毕计算。(3) 输入n和m要给出提醒信息,并检查n和m的合理性,不合理的输入应输犯错误信息,并不再进行计算。(4) 运营程序并计算。实验七 菜单实现一、 实验目的1. 掌握菜单设计思想2. 了解容错方法实现3. 了解软件设计的一般思想。4. 掌握循环控制的综合运用。5. 掌握定位函数编写及常用库函数的使用。二、 实验内容编写程序实现以下菜单功能说明:1) 各功能模块的实现可只用一个printf语句代替.2) 用循环实现菜单的解决.提醒: stdlib.h含s
31、ystem(cls) 清屏函数 exit() 退出系统函数 实验八 指针一、实验目的1.掌握指针的概念、指针变量定义格式和引用方法2.掌握指针的运算方法3.掌握数组的指针和指向数组的指针变量4.掌握指针与函数的关系5.能对的使用字符串的指针和指向字符串的指针变量6.了解指向函数的指针7.了解指向指针变量的指针二、实验内容1. 调试并修改表1程序代码,使之具有如下功能:用指针法输入12个数,然后按每行4个数输出。表1 代码1 #include int main() int j, k, a12, *p; for (j = 0; j 12; j+) scanf(%d, p+); for (j = 0
32、; 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个整数 n1, n2, n3: ); scanf(%d, %d, %d, &n1, &n2, &n3); p1 = &n1; p2 = &n2; p3 = &n3; if (
33、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所示程序代码问题所在,该程序功能为:输出数组a中的10个元素。表3代码3 #include int main() int a10; int *p, i; p = a; for (i = 0; i 10; i+) *p
34、 = 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+) if ( ) *a = tk; int main() int k, min, *p = &min; for (k = 0; k 10; k+) scanf(%d, table + k);
35、 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 = ; for (i = 0; i 5; i+) *(pi + ) = 1; *(pi + 5 - ) = 1; for (i = 0; i 5; i+) for (j = 0; j 5; j+)
36、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, a.c1); return 1; 2. 编写程序,完毕以下功能:(1) 有5个学生,每个学生的数据涉及学号、姓名、3门课的成绩(2) 用一个函数input从键盘输入5个学生的数据(3) 用一个函数average求每个学生的总平均分(4) 用一个函数max找出总分最高学生的数据(5) 输出3门课总平均成绩,以及最高分学生的数据(6) 改用结构体的指针变量用动态分派完毕此题功能。实验十 动态内存分派一、 实验目的1. 了解动态内存分派机制。2. 掌握基本动态内存分派函数及应用。3. 掌握单链表的生成、链表元素增、减、维护。二、实验内容1生成一不带头结点的含三个元素的单链表,并输出。2在原单链表中插入一个元素。3在原单链表中删除