7.3 TURBO C上机操作实验部分q1 实验一 C语言程序上机操作 一、实验目的 1.熟悉C语言的集成环境,了解菜单的使用方法。 2.掌握一个Turbo C程序上机操作的全过程。 二、操作简介:本实验将进一步介绍TURBO C系统的软件、硬件环境,主菜单、编辑环境的使用等基本操作。 三、实验内容: (一)TURBO C环境简介 1.硬件环境 IBM—PC或其它兼容机 配有一个3寸软盘驱动器,硬盘一个。 2.软件环境 ⑴ Windows 环境 ⑵ DOS 环境 ⑶ UNIX\XENIX环境。本章仅介绍1.2两部分 3. Turbo C 系统运行的软件构成 INSTALL.EXE 安装程序文件 TC.EXE 集成编译 TCINST.EXE 集成开发环境的配置设置程序 TCHELP.TCH 帮助文件 THELP.COM 读取TCHELP.TCH的驻留程序 README 关于Turbo C的信息文件 TCCONFIG.EXE 配置文件转换程序 MAKE.EXE 项目管理工具 TCC.EXE 命令行编译 TLINK.EXE Turbo C系列连接器 TLIB.EXE Turbo C系列库管理工具 C0?.OBJ 不同模式启动代码 C?.LIB 不同模式运行库 GRAPHICS.LIB 图形库 EMU.LIB 8087仿真库 FP87.LIB 8087库 *.H Turbo C头文件 *.BGI 不同显示器图形驱动程序 *.C Turbo C例行程序(源文件) 其中: 上面的?分别为: T Tiny(微型模式) S Small(小模式) C Compact(紧凑模式) M Medium(中型模式) L Large(大模式) H Huge(巨大模式) (二)TURBO C上机操作过程 1.C程序上机步骤流程图如图7.2所示。 2.DOS环境下运行TURBO C (1) 启动DOS系统,在DOS下直接进入TURBO C C:\>CD\TC↙ C:\>TC↙ (2) 启动TURBO C 系统文件 C:\TC>TC ↙ 图 7.1主菜单 (3) 在图7.1主菜单下用F10键和←、 →键,选择主菜单中的FILE项,并由此进入图7.3,用户在图7.3下用↑、↓键选NEW项即可进入编辑程序(新文件)状态。 (4) 用户在TURBO C全屏幕编辑状态下(图7.1),输入如下程序 main() { int a,b,c; clrscr(); gotoxy(10,5); printf("a,b=?",a,b); scanf("%d,%d",&a,&b); c=a+b; gotoxy(10,5); printf("a=%d,b=%d,c=%d",a,b,c); } 图7.2 C程序设计上机步骤流程图 注意: a.实线表示操作流程;b.虚线表示文件的生成过程。  图7.3 File 菜单 (5) 预运行,在主菜单图7.1下用F10和←、→键,选RUN项,并运行该程序,见图7.4,运行后欲观察运行结果,请用户在图7.4下用↑、↓ 键选 User Screen项即可。 (6) 预运行成功。则在图7.1下用F10键和光标移动键选SAVE项存盘,并将系统默认文件名“NONAME.C”修改成用户所希望的文件名,如用户欲存文件名“LX.C”,详见图7.5。 (7) 编译并生成OBJ和EXE文件,用户在图7.1下用F10键和←、→键选择主菜单中的compile项,用↑、↓键选择copmlie to OBJ和make exe file 以及Link EXE file项,即可完成OBJ、EXE文件的建立。编译对话框见图7.6。  图7.4 Run 菜单  图7.5 Save保存文件对话框 图7.6 Compile 菜单 (8) 用户在图7.1下用F10键和←、→键选择File项并在子菜单下用↑、↓ 键选择OS SHELL项,即可由TURBO C集成环境下切换到DOS状态,此时用户用DIR命令可看到一个C语言的源程序文件“LX.C”,也可在OUT子目录下看到OBJ、EXE扩展名的文件,详见如下操作实例。 C:\TC>DIR↙ ┇ LX.c ┇ C:\TC>CD OUT↙ C:\TC\OUT>DIR↙ ┇ LX.obj LX.EXE 此时用户可直接运行EXE扩展名文件如: ┇ C:\TC\out>LX↙ ┇ 运行结果同TURBO C状态下。 C:\TC\OUT>CD.. ↙ C:\TC>EXIT↙ 返回TURBO C(图7.1) 此时用户已完成对一个C源程序的编辑→预运行→存盘→编译→生成OBJ、EXE文件→查看(在DOS状态下)→运行(DOS下)→ 返回(由DOS下 TURBO C 集成环境)的全过程。 (9) 下一步用户可编辑另一C程序也可由系统中调用另一C程序进行编辑或运行。 例1:编辑另一C程序,用户在图7.1下用F10和← →键选择FILE下的NEW项并重复以上步骤即可。 例2:调用C盘中已有的C程序,用户在图7.1下用F10键和← →,选择FILE下的LOAD项,即可完成对C源程序的调用,操作分为两种形式: 第一种:在LOAD项下按回车键后出现一对话框见图7.7,此时用户输入一文件名,并按回车键,即可将该文件读入内存。 第二种:出现以上对话框时不输入文件名,直接按回车键,此时系统显示一对话框见图7.8。  图7.7 调用文件对话框  图7.8 查找或选择文件对话框 此时用户即可用←↑→↓选择欲调用文件。 3.Windows下运行TURBO C (1) 在WIN98下点击我的电脑→win98 (C:)→TC文件夹→TC进入TURBO C主菜单,见图7.1。 (2) TURBO C 下的编辑、编译、运行与DOS下相同,略。 (三)TURBO C主菜单项与常用命令 1.主菜单:位于屏幕最上面一行,由以下八个菜单项组成。 File 文件、调用DOS和退出等命令 Edit 编辑程序 Run 运行程序 Compile 编译、连接生成目标及可执行程序 Project 生成和维护由多个文件组成的项目文件 Option 设置集成工作环境 Debeg 检查、改变变量的值,查找函数,程序运行时查看调用栈 Break\Watch 控制断点及监视表达式 编辑窗口:位于主菜单下、message窗口之上,屏幕中上部很大的一片区域。主要用来录入和修改源程序。在该窗口的顶部为状态行,给出有关正在被编辑的文件的信息,光标在文件中的位置以及激活的编辑模式。 Line n 光标处在文件的第n行 Col n 光标处在文件的第n列 Insert 插入模式开关,用Indert或Ctrl+V切换模式开关(On/Off) Indent 自动缩进开关,用Ctrl+OL切换 Tab 制表模式开头,用Ctrl+OT切换 Fill 当Tab模式是打开时编辑程序将用制表及空格符优化每一行的开始,用Ctrl+OF切换 Unindent 当光标在一行中的第一个非空字符上时,或在空行上时,退格键回退一级。用Ctrl+OU切换 * 星号是在文件修改后而又未存盘时才出现在文件名前面的 2.TURBO C的常用菜单命令 (1) File 装入已有文件,建立新文件,保存文件,将文件存入指定目录、改变目录、由TURBO C进入DOS和返回TURBO C,其中子菜单的命令有: Load 装入一文件 Pick 显示最近装入编辑窗口的八个文件,并可选择其一装入编辑窗口。 New 建立新文件 Save 存盘,若文件名是NOMANE.C,系统会询问是否要改名。 Write to 给出文件名,把编辑内容写入该文件中,若该文件已存在,将覆盖源文件。 Directory 显示目录及所需文件列表(按回车键选择当前目录)。按F4改变匹配符,选择文件名将文件装入编辑窗口。 Change Dir 显示当前目录,改变驱动器及目录。 Os Shell 暂时退出Turbo C,进入DOS,键入Eixt 则返回TURBO C. Quit 退出TURBO C。 (2) Run 运行程序 (3) Compile 将源文件编译成.OBJ文件,生成.EXE文件,连接成.EXE文件。 Compile OBJ 将C源程序文件编译成.OBJ目标文件,编译时,弹出一窗口显示编译结果。编译生成后,按任意键即回到原窗口。 Make EXE File 此命令调用Project make来生成EXE文件,显示生成的.EXE文件名。 Link EXE File 把当前.OBJ文件及库文件连接在一起生成.EXE文件。 3.Edit中的快捷键(快捷编辑键) (1) 上翻一页 Ctrl-R or Pgup 下翻一页 Ctrl-C or Pgdn (2) 插入一行 Ctrl-N (3) 删除一行 Ctrl-Y (4) 定义块首 Ctrl-KB (5) 定义块尾 Ctrl-KK (6) 复制块 Ctrl-KC (7) 移动块 Ctrl-KV (8) 删除块 Ctrl-KY (9) 从盘中读入块 CTRL+KR (10) 将块写入磁盘 CTRL+KW (四)编程实现输出字符串“Hello world!” 实验二 C语言程序初步 一、预习内容 预习C语言程序的结构及C语言程序的书写格式。 二、实验目的 1.掌握C语言程序上机的编辑、编译、连接、运行的基本步骤。 2.了解C语言程序的结构。 三、实验内容 程序(一) 功能:输出两个数的最大值。 参考程序: #include <stdio.h> main() { int m,n; m=2; n=3; if(m<n) printf("%d",n); else printf("%d",m); } 程序(二) 功能:计算由键盘输入的任意两个整数的积。 参考程序: #include <stdio.h> main() int x,y,c scanf("%d,%d",&x,&y) c=x*y printf("The product is:%d",p) 先静态的检查上述程序,改正程序中的错误。 在编辑状态下照原样键入上述程序。 编译并运行上述程序,记下所给出的出错信息。 按照事先静态检查后所改正的情况,进行纠错。 再编译执行纠错后的程序。如还有错误,再编辑改正,直到不出现语法错误为止。 下面给出6组测试用例,进行程序测试: (1) 0,0 (2) 0,99 (3) 20,50, (4) 33000,20 (5) –5,-2 四、问题 修改程序一,要求求任意两个数的最大值。 分析程序二,上述哪组测试用例较好?为什么? 记下在调试过程中所发现的错误、系统给出的出错信息和对策。分析讨论对策成功或失败的原因。 C程序的结构和书写规则是什么? 实验三 数据类型 一、预习内容 预习各种数据类型的表示形式,存储空间及取值范围。 二、实验目的 了解C语言中数据类型的意义及使用方法。 三、实验内容 程序(一) 功能:验证C语言中各种数据类型的取值范围及各种类型变量的定义和使用方法。 操作符sizeof用以测试一个数据或类型所占用的空间的字节数。请编一个程序,测试各类型所占用的存储空间的大小。 程序(二) 功能:编程计算由键盘输入的任意两个整数的平均值,并进行不同值的测试。 参考程序:    #include <stdio.h> main() { int x,y,a; scanf("%d,%d",&x,&y); a=(x+y)/2; printf("The average is:%d",a); } 分别输入下列几组数据对程序进行测试:   1、2,6      6、-1,3   2、1,3      7、1,0   3、-2,-6     8、1,6   4、-1,-3     9、32800,33000   5、-2,6      10、-32800,33000 四、问题 分析程序二哪几组数据较好?通过测试,你发现程序有什么错误?若有请指出错误原因。 对于不同的数据类型,了解它们隐式和显式的相互转换,以及转换后的取值。 实验四 运算符和表达式 一、预习内容 预习各种运算符的功能、运算的优先级别及结合方向。 二、实验目的 1.掌握常用算术运算符的使用方法、优先级别及结合方向。 2.掌握c语言表达式的运算规则。 三、实验内容 程序(一) 功能:编写一个c语言程序,求下列表达式的值。 1.x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7 2.(float)(a+b)/2+(int)x%(int)y 设a=2,b=3,x=3.5,y=2.5 程序(二) 功能:根据程序验证程序的运行结果。 参考程序: main() {int i,j,m,n; i=8; j=10; m=++i; n=j++; printf("%d,%d,%d,%d",i,j,m,n); } 四、问题 程序一中的运算符的优先级式是什么?整除和除法有什么不同?如何编程能实现程序结果的正确输出? 理解程序二中++i和j++的意义和优先级别。 编写一个程序,测试常用十个运算符的优先顺序。 实验五 输入输出 一、预习内容 预习C语言输入输出的引用方法。 二、实验目的 1.掌握整型、实型、字符型数据的输入输出格式控制。 2.掌握输入、输出函数语句的使用方法。 三、实验内容 程序(一) 功能:测试程序的输出结果。 参考程序: main() { int a,b; float c,d; long e,f; unsigned int u,v; char c1,c2; scanf("%d,%d",&a,&b); scanf("%f,%f",&c,&d); scanf("%d,%d",&e,&f); scanf("%u,%u",&u,&v); scanf("%c,%c",&c1,&c2); printf("\n"); printf("a=%7d,b=%7d\n",a,b); printf("c=%10.2f,d=%10.2f\n",c,d); printf("e=%17ld,f=%17ld\n",e,f); printf("u=%u,v=%u\n",u,v); printf("c1=%c,c2=%c\n",c1,c2); } 调试上述程序无语法错误后,用下面的测试数据,对程序进行测试: a=123,b=456 c=17.6,d=71837.65 e=70000,f=2174506 u=62000,v=58765 c1='a',c2='b' 程序(二) 功能:如果a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1='a',c2='b'。想得到以下的输出格式和结果,请写出程序,要求输出的结果如下: a= 3 b= 4 c= 5 x=1.200000,y=2.400000,z=-3.600000 x+y= 3.60 y+z=-1.20 z+x=-2.40 c1='a' or 97(ASCII) c2='B' or 98(ASCII) 四、问题 分析程序一运行结果。特别注意输出c1,c2的值是什么?什么原因?如何修改能得到预期的结果? 将程序一输入e,f的语句改为: scanf("%d,%d",&e,&f); 再用上述测试数据测试并分析结果。 将程序一输入u,v的语句改为: scanf("%d,%d",&u,&v); 再用上述测试数据测试并分析结果。 将程序一输出e,f的语句改为: printf("e=%17d,f=%17d",e,f); 再用上述测试数据测试并分析结果。 将程序一输出u,v的语句改为: printf("u=%d,v=%d",u,v);或 printf("u=%o,v=%o",u,v); 再用上述测试数据测试并分析结果。 请同学们自己修改程序和改变数据输入的形式,分析各种情况下的输入与输出。 验证转义字符\n,\r的意义有何不同。 总结在printf函数中可以使用的各转义字符及其功能。 完成程序二的程序设计,如何修改格式使程序能输出'B'以及其相应的ASCII码值? 实验六 选择结构(If语句) 一、预习内容 1.逻辑运算符、if语句格式和功能 2.复合语句的作用和注意事项。 二、实验目的 1.掌握利用if语句实现选择结构程序设计的方法 2.掌握逻辑运算符的使用方法。 三、实验内容 程序(一) 功能:验证逻辑运算符的结果。 参考程序: main() {int a=3,b=4,c=5; printf("%d\n", a+b && b==c ); /* 输出“逻辑与”运算的值*/ printf("%d\n", a>b || b-c); /* 输出“逻辑或”运算的值*/ printf("%d\n",!( a>b)); /* 输出“逻辑非”运算的值*/ printf("%d\n", a!=c || !b && (a=1)); } 程序(二) 功能:编程实现任意三个数的升序排序。 参考程序: main() {float a,b,c,t; scanf("%f,%f,%f",&a,&b,&c); if (a>b) _________________ if(a>c) __________________ if(____) __________________ printf("%5.2f,%5.2f,%5.2f\n",a,b,c); } 程序(三) 功能:编程实现求分段函数的值。 -1 (x<0) y= 0 (x=0) 1 (x>0) 四、问题 复合语句的作用是什么? 如果把程序一中的输出函数语句printf("%d\n",!(a>b));中逻辑表达式!(a>b)的括号去掉,结果是否相同。为什么? 程序一运行完以后,变量a的值是多少?为什么? 把程序二补充完整。 当将上述程序中的某个复合语句的{}删去后,程序运行时会发生什变化? 独立完成程序三的编程。 实验七 选择结构(Switch语句) 一、预习内容 预习switch语句的定义格式及执行过程。 二、实验目的 掌握switch语句中条件与程序流程关系。 三、实验内容 程序(一) 功能:用户键入任意两个操作数和“+、-、*、/”中一个运算符,由计算机输出运行结果。 参考程序: #include<stdio.h> main() { float result,x,y; char ch; printf("\ninput x,y:"); scanf("%f,%f",&x,&y); printf("\ninput operator(+,-,*,/):"); scanf(" %c",&ch); result=0; switch(ch) {case '+': result=x+y; break; case '-': result=x-y; break; case '*': result=x*y; break; case '/': if(y!=0.0) result=x/y; else printf("divide overflow"); default: printf("sorry you have make mistakes please do it again"); } printf("%6.2f%c%6.2f=",x,ch,y); printf("%6.2f\n",result); } 程序(二) 功能:用户键入任意一个百分制成绩,要求输出成绩等级“A”、“B”、“C”、“D”、“E”。其中:90分以上为“A”,80~89分为“B”,70~79分为“C”,60~69分为“D”,60分以下为“E”。 提示:switch语句的case语句后面只能接常量,不能是变量或表达式,所以相应的语句应该为: Switch ((int)(score/10)) {case 10: case 9:printf("A");break; case 8:printf("B");break; case 7:printf("C");break; case 6:printf("D");break; default: printf("E");break; } 四、问题 程序一如不加default会出现什么问题? 程序一分别去掉两个break语句程序运行流程会有什么变化? 完成程序二的设计。 实验八 条件型循环结构 一、预习内容 预习while和do while语句的格式与功能。 二、实验目的 1.掌握利用while 或do while实现条件型循环结构程序时,如何正确设定循环条件,如何控制循环次数。 2.了解条件型循环结构的基本测试方法。 三、实验内容 程序(一) 功能:编程实现1+2+…+n的和。 参考程序: main() {int i,n,sum=0; i=1; scanf("%d",&n); while(i<=n) {sum+=i; ++i;} printf("sum=%d\n",sum); } 程序(二) 功能:编程实现1!+2!+…+n!的和。 参考程序: main() {long int p,sum=0 ; int i,n; i=1; p=1; scanf("%d",&n); do {p=_________; sum=________; ++i; }while(______); printf("sum=%ld\n",sum); } 程序(三) 功能:编程实现从键盘输入m和n的值,求他们的最大公约数和最小公倍数。 提示:首先使用辗转相除法求两个数的最大公约数。然后用两数的乘积除以最大公约数,即是两数的最小公倍数。 辗转相除法: 设m>n 。 令r = m%n 。 若r等于0,则n即为最大公约数,退出循环。否则,令m=n; n=r,转2)。 四、问题 如果程序一中变量i的初值是0,结果是否正确?为什么? 是否可以把程序一的语句++i;改为i++;? 用do while语句改写程序一。 把程序二补充完整。程序二中变量p的作用是什么?初值是否可以为0?为什么? 编程实现程序三的功能。 实验九 计数型循环结构 一、预习内容 预习for语句的循环控制结构。 二、实验目的 1.掌握利用for语句实现计数型循环结构程序设计的方法 2.了解计数型循环结构的基本测试方法。 三、实验内容: 程序(一) 功能:用For语句编程实现1!+2!+…+n!的和。 参考程序: main() {long int p,sum=0; int i,n; p=1; scanf("%d",&n); for(i=1;i<=n;i++) {p=p*i ; sum +=p ; } printf("sum=%ld\n",sum); } 程序(二) 功能:编程实现“水仙花数”的打印,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。 参考程序: main() {int i,j,k; for(n=100; ; n++) {i=n/100 ; j=_______; k=_______; } if(n==_________) printf("%4d ",n); } 程序(三) 功能:编程实现打印Fibonacci数列的前20项。 该数列的规律如下: 1 (n=1) fn= 1 (n=2) fn-1 + fn-2 (n>2) 四、问题 程序一中如果省略for语句括号中第一个和第二个表达式,程序如何改写? 程序一中如果for语句括号中的三个表达式都省略,程序如何改写? 把程序二补充完整。 编程实现程序三的功能。 实验十 循环嵌套 一、预习内容 课前预习循环嵌套的执行规律,以及循环嵌套的几种格式。 二、实验目的 掌握循环与分支嵌套的程序设计方法,注意内外层循环间的关系。 三、实验内容 程序(一) 功能:编程实现正三角型星号的打印。 参考程序: main() {int i,j,k,n; scanf("%d",&n); for(i=1;i<=n;i++) {for(j=1;j<=n-i;j++) printf(" "); for(k=1;k<=2*i-1;k++) printf("*"); printf("\n"); } } 程序(二) 功能:编程实现打印3~100之间的所有素数。 参考程序: #include <math.h> main() {int n,m,t,k=0; for( n=3;n<=100;n=n+2) {k=sqrt(_____); t=1; for(m=2;m<=_______; m++) if(________) {t=0; break;} if(t) {printf("%d",n);k++;} if(k%10==0) printf("\n"); } } 程序(三) 功能:编程实现一个小球从100高度自由落下,每次落地后反弹回原来的高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高? 提示:画图分析。设变量p表示每次落地后经过的米数,设变量h表示每次落地前小球离地面的高度,变量s表示前i次小球经过的米数之和。循环体可以表示为: p=h+h/2; s=s+p; h=h/2; 注意:最后一次不包括反弹米数,所以结果中的s应该减去h米,即应该经过s-h米。 四、问题 去掉程序一内层的花括号{ }程序会输出什么图形?为什么? 去掉程序一中printf("\n");语句,程序会输出什么结果?为什么? 如果想把程序一中的三角形倒过来,如何修改程序? 补充程序二。 程序二中变量t的作用是什么?如果不用变量t应如何修改程序? 程序二中语句if(k%10==0) printf("\n"); 起什么作用? 编程实现程序三的功能。 实验十一 一维数组 一、预习内容 预习一维数组的定义及引用方法。 二、实验目的 1.掌握一维数组的定义规则 2.正确运用一维数组进行程序设计。 三、实验内容 程序(一) 功能:编程实现用一维数组实现杨辉三角形的打印。 参考程序: main() { int a[6],i,j,k; a[1]=1; printf("%d\n",a[1]); for(i=2;i<6;i++) { a[i]=1; for(j=i-1;j>=2;j--) a[j]=a[j]+a[j-1]; for(k=1;k<=i;k++) printf("%d",a[k]); printf("\n"); } } 程序(二) 功能:编程实现用数组打印Fibonacci数列的前20项。 参考程序: #include <stdio.h> main() { int i; int ____________; for(i=2;i<20;i++) _______________; for(i=0;i<20;i++) {if(i%5==0) printf("\n"); printf("%12d",f[i]); } } 程序(三) 功能:编程实现读10个整数存入数组,找出其中最大值和最小值。 四、问题 程序一中语句for(k=1;k<=i;k++)改成for(k=1;k<=5;k++),程序的输出结果是什么? 完成程序二的空白部分,如何定义数组能实现数列的打印? 独立完成程序三的编程。 实验十二 排序 一、预习内容 预习数组及for循环语句等有关方面的内容。 二、实验目的 1.掌握排序的一般方法 2.正确使用数组来解决排序中的数据类型描述问题。 三、实验内容 程序(一) 功能:编程实现用冒泡对输入的10个数由小到大排序。 参考程序: #include <stdio.h> main() { int a[11],i,j,t; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); printf("\n"); for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) 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]); } 程序(二) 功能:编程实现用选择法对输入的10个数由小到大排序。 参考程序: #include <stdio.h> main() { int a[11],i,j,k,x; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); printf("\n"); for(i=1;i<10;i++) { ______________; for(j=i+1;j<=10;j++) if(a[j]<a[k]) __________; if____________ { x=a[i]; a[i]=a[k]; a[k]=x;} } printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); } 程序(三) 功能:编程实现由键盘输入一个数插入到有序数组中。 四、问题 若使程序一输出的排序结果为:a[1]=1 a[2]=2……a[10]=10的形式,程序应做何改动? 完成程序二的空白部分,把程序补充完整。 分析选择法和冒泡法排序的异同。 编程实现程序三的功能,要求插入的是任意数值。 实验十三 二维数组 一、预习内容 预习二维数组的定义和引用方法。 二、实验目的 1.掌握二维数组的定义规则 2.正确运用二维数组进行程序设计。 三、实验内容 程序(一) 功能:编程实现用二维数组打印杨辉三角形。 参考程序: main() {int a[6][6],i,j,k; for(i=1;i<6;i++) { a[i][1]=1; a[i][i]=1; } for(i=3;i<6;i++) for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j]+a[i-1][j-1]; for(i=1;i<6;i++) {for(j=1;j<6;j++) if(i>=j) printf("%d",a[i][j]); printf("\n"); } } 程序(二) 功能:编程实现将二维数组行列元素互换,存到另一个数组中。 参考程序: #include <stdio.h> main() { int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; printf("array a:\n"); for(i=0;i<=1;i++) { ___________________ { printf("%5d",a[i][j]); _____________; } printf("\n"); } printf("array b:\n"); for(i=0;i<=2;i++) { for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); } } 程序(三) 功能:编程实现求二维数组中最大元素值及其行列号 四、问题 分析用一维数组和二维数组打印杨辉三角形的异同。 若希望杨辉三角按如下格式输出时,程序应如何变动? 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 ………………… 完成程序二的空白部分,把程序补充完整。 编程实现程序三的功能。 实验十四 字符数组与字符串 一、预习内容 预习字符串的存储方式及其访问方法。 二、实验目的 1.掌握字符数组及字符串的异同点 2.掌握字符数组存放字符串时的注意事项。 三、实验内容 程序(一) 功能:编一个程序,将两个字符串连接起来(不要用strcat函数)。 参考程序: main() {char s1[80],s2[40]; int i=0,j=0; printf("\ninput string1: "); scanf("%s",s1); printf("\ninput string2: "); scanf("%s",s2); while (s1[i]!= '\0') i++; while (s2[j]!= '\0') s1[i++]=s2[j++]; s1[i]= '\0'; printf("The new string s: %s ",s1); } 程序(二) 功能:编程实现找出三个字符串的最大者。 提示:可以用函数strcmp和strcpy实现。 四、问题 将程序一中的字符串s1,s2的输入改为以字符为单位输入。 如果将程序一中的语句s1[i]='\0';去掉,分析程序结果如何? 独立编程实现程序二的功能。 实验十五 函数的定义和调用 一、预习内容 预习函数的定义及函数的实参与形参间进行参数传递的对应关系。 二、实验目的 1.掌握c语言函数定义及调用规则。 2.正确理解和掌握地址传递与值传递的区别以及系统在内存管理上的实现方式。 3.掌握递归的使用。 三、实验内容 程序(一) 功能:用户输入任意两个操作数,通过运行程序来观察,实参与形参间值传递的对应关系,以及形参的变化不影响实参原值的概念。 参考程序: #include<stdio.h> fun(int x,int y) {printf("x=%d y=%d\n",x,y); x=40;y=60; printf("x=%d y=%d\n",x,y); } main() {int a,b; printf("a,b=?"); scanf("%d,%d",&a,&b); fun(a,b); printf("a=%d b=%d\n",a,b); } 程序(二) 功能:用户输入任意两个操作数,通过运行此程序来分析并理解,地址传递的概念以及形参数组的变化为什么影响实参数组的工作原理。 参考程序: fun(int b[]); main() { int a[3]; printf("\na[0],a[1]=?"); scanf("%d,%d",&a[0],&a[1]); fun(a); printf("\na[0]=%d a[1]=%d",a[0],a[1]); } fun(int b[]) { printf("\nb[0]=%d b[1]=%d",b[0],b[1]); b[0]=40;b[1]=60; printf("\nb[0]=%d b[1]=%d",b[0],b[1]); } 程序(三) 功能:实现十进制到二进制的转换。 程序(四) 功能:编写并调试一个求n!(n为正整数)递归函数,希望能在运行过程中动态的显示递归函数被调用的轨迹。 四、问题 运行程序一并回答为什么形参的变化不影响实参的值?画出实参与形参的内存单元对应图并说明之。 程序一中实参与形参之间进行参数传递时是按变量名进行传递,还是按顺序进行传递? 为什么程序二中形参数组b的变化会影响实参数组a的值? 编程实现程序三、四的功能。 递归函数的两大要素是什么? 实验十六 变量的存储属性 一、预习内容 预习动态变量、静态变量及内部变量、外部变量的概念、属性和使用方法。在程序中如何运行多个文件。 二、实验目的 加深理解变量的存储属性。掌握多文件运行方法。 三、实验内容 程序(一) 功能:测试外部变量的值。 参考程序: int max(int x, int y) { int z; z=x>y?x:y; return(z); } main() { extern int a,b; printf("max=%d",max(a,b)); } int a=13,b=-8; 程序(二) 功能:测试auto变量的作用域。 参考程序: main() { int x=1; void prt(void); { int x=3; prt(); printf("2nd x=%d\n",x); } printf("1st x=%d\n",x); } void prt(void) {int x=5; printf("3th x=%d\n",x); } 程序(三) 功能:测试变量的寿命与可见性。 参考程序: #include <stdio.h> int i=1;main() { static int a; register int b=-10; int c=0; printf("-----MAIN------\n"); printf("i:%d a:%d b:%d c:%d\n",i,a,b,c); c=c+8; other(); printf("-----MAIN------\n"); printf("i:%d a:%d b:%d c:%d\n",i,a,b,c); i=i+10; other(); } other() {static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf("-----OTHER------\n"); printf("i:%d a:%d b:%d c:%d\n",i,a,b,c); b=a; } 程序(四) 功能:测试内部函数和外部函数。 参考程序: file1.c(文件1) main() {extern enter_string(char str[80]); extern delete_string(char str[],char ch); extern print_string(char str[]); char c; char str[80]; enter_string(str); scanf("%c",&c); delete_string(str,c); print_string(str); } file2.c(文件2) #include <stdio.h> enter_string(char str[80]) {gets(str);} file3.c(文件3) delete_string(char str[],char ch) {int i,j; for(i=j=0;str[i]!= '\0';i++) if (str[i]!=ch) str[j++]=str[i]; str[j]= '\0'; } file4.c(文件4) print_string(char str[]) { printf("%s",str);} 四、问题 分析程序一中a、b的作用域? 分析程序二中x的不同作用域? 分析程序三的运行结果,分析变量的寿命与可见性? 若把程序四中file1.c中的语句extern enter_string(char str[80]);去掉extern,则结果如何?为什么? 外部变量定义与声明有什么区别? 实验十七 指针变量的定义与引用 一、预习内容 预习指针类型变量的定义及引用方法。 二、实验目的 1.掌握预处理的使用。 2.掌握指针类型变量的定义和引用方法。 3.学会用指针对变量进行操作 三、实验内容 程序(一) 功能:用预处理实现求两个数的大数。 程序(二) 功能:用指针变量实现两个数的由小到大排序。 参考程序1: main() { int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a; p2=&b; if(a>b) { p=p1; p1=p2; p2=p;} printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); } 参考程序2: swap(int *p1, int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a>b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); } 四、问题 预处理和函数有什么不同? 完成程序一的设计。 能把程序二中的函数改成如下形式能否达到此目地,为什么? swap(int *p1,int *p2) {int *p; p=p1; p1=p2; p2=p; } 实验十八 指针与数组 一、预习内容 预习数组与指针之间的关系。 二、实验目的 1.掌握指针与一维数组、二维数组的关系 2.掌握指针数组的使用方法。 三、实验内容 程序(一) 功能:编写函数实现3*3矩阵的转置。 参考程序: main() {int i, *p, a[3][3]; printf("input matrix:\n"); for(i=0;i<3;i++) scanf("%d %d %d",&a[i][0], &a[i][1], &a[i][2]); p=&a[0][0]; move(p); printf("Now matrix:\n"); for(i=0;i<3;i++) printf("%d %d %d\n",a[i][0], a[i][1], a[i][2]); } move(int *pointer) { int i,j,t; for (i=0;i<3;i++) for(j=i;j<3;j++) {t=*(pointer+3*i+j); *(pointer+3*i+j)= *(pointer+3*j+i); *(pointer+3*j+i)=t; } } 程序(二) 功能:编程实现将数组a中的n个整数按相反顺序存放。 参考程序: void inv(int *x, int n) {int t,*p,*i,*j,m=_______; i=x; _________; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; } } main() {int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(____,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n"); } 程序(三) 功能:编程实现3个学生各学4门课,计算总平均分,并输出第n个学生成绩。 四、问题 程序一中若用数组名a作为函数实参,则程序如何修改? 程序一中语句p=&a[0][0];有什么作用?删除该语句会对程序有什么影响? 把程序二补充完整。 改写程序二,要求实参是指针类型,形参是数组类型。 编程实现程序二的功能,要求形参和实参均为指针类型。 完成程序三的功能,要求实现指针与二维数组间进行参数传递。 实验十九 指针与函数 一、预习内容 预习指针作函数参数以及函数的返回值为指针类型的程序设计方法。 二、实验目的 掌握指针作函数的参数、指向函数的指针及返回指针值的函数的程序设计方法。 三、实验内容 程序(一) 功能:编程实现用函数指针变量调用函数,比较两个数大小。 参考程序: main() {int max(int ,int), (*p)(); int a,b,c; p=max; scanf("%d,%d",&a,&b); c=(*p)(a,b); printf("a=%d,b=%d,max=%d\n",a,b,c); } int max(int x,int y) {int z; if(x>y) z=x; else z=y; return(z); } 程序(二) 功能:编程用函数指针变量作参数,求最大值、最小值和两数之和。 参考程序: void main() { int a,b,max(int,int), min(int,int),add(int,int); void process(int,int,int (*fun)()); scanf("%d,%d",&a,&b); process(a,b,max); process(a,b,min); process(a,b,add); } void process(int x,int y,int (*fun)()) {int result; result=(*fun)(x,y); printf("%d\n",result); } max(int x,int y) { printf("max="); return(x>y?x:y); } min(int x,int y) { printf("min="); return(x<y?x:y); } add(int x,int y) { printf("sum="); return(x+y); } 程序(三) 功能:编用指针实现某学生成绩的查询。 程序(四) 功能:编程用指针实现对字符串的选择法排序。 四、问题 请分析指向函数的指针和返回指针值的函数有什么不同? 程序二中把语句result=(*fun)(x,y);改为result=*(fun(x,y));能否实现预期的效果?为什么? 编程实现程序三的功能。 用指针数组实现程序四的功能。 实验二十 结构体及共用体 一、预习内容 预习结构体和共用体类型的定义和使用。 二、实验目的 1.掌握结构体类型的定义、区别和使用方法 2.掌握共用体类型的定义、区别和使用方法 三、实验内容 程序(一) 功能:从键盘输入5个学生的数据记录(学号、姓名、职业、班级),输出所有学生的信息表。 参考程序: #define N 5 struct student {char num[6]; char name[10]; char job; char class[10]; }stu[N]; main() {int i,j; for (i=0;i<N;i++) {printf("\n input NO.:"); scanf("%s",stu[i].num); printf("\n input name:"); scanf("%s",stu[i].name); printf("\n input job:"); scanf("%c",&stu[i].job); printf("\n input class:"); scanf("%s",stu[i].class); } printf("\n NO. Name Job Class\n"); for (i=0;i<N;i++) printf("%-6s%-10s%-3cs%-10s\n",stu[i].num,stu[i].name, stu[i].job,stu[i].class); } 程序(二) 功能:编程实现将一个整数按字节输出。 四、问题 将程序一改成输入若干人员的数据记录并输出所有人员的信息表的程序。(其中人员包括教师和学生两类,学生的数据包括学号、姓名、职业、班级,教师的数据包括编号、姓名、职业、单位) 定义如下:struct student {char num[6]; char name[10]; char job; union {char class[10]; char position[10]; }work; }stu[N]; 分析结构体变量和共用体变量在存储方式上有什么区别? 完成程序二的功能。 实验二十一 链表 一、预习内容 预习链表的建立和访问方法。 二、实验目的 1.掌握动态数据结构和静态数据结构的区别、作用 2.掌握链表的建立及访问方法。 三、实验内容 程序(一) 功能:建立一个链表,每个节点包括学号、姓名、性别、年龄,实现输入5个学生的记录。 参考程序: #define NULL 0 struct student { char num[6]; char name[20]; char sex[2]; int age; struct student *next;}stu[10]; main() { struct student *p,*pt,*head; int i,length,flag=1; while(flag==1) {scanf("%d",&length); if(length<10) flag=0; } for(i=0;i<length;i++) { p=(struct student *)malloc(sizeof(struct student)); if (i==0) head=pt=p; else pt->next=p; pt=p; printf("\n input NO.:"); scanf("%s",p->num); printf("\n input name.:"); scanf("%s",p->name); printf("\n input sex:"); scanf("%s",p->sex); printf("\n input age:"); scanf("%d",&p->age); } p->next=NULL; p=head; printf("\n No. Name Sex Age\n"); while(p!=NULL) {printf("%4s%8s%6s%6d\n",p->num, p->name, p->sex, p->age); p=p->next;} } 程序(二) 功能:编程实现对链表的插入、删除操作。 四、问题 程序一中变量pt的作用是什么? 完成程序二的功能。 实验二十二 位运算 一、预习内容 预习位操作的各种运算符的使用方法。 二、实验目的 1.理解位运算的概念 2.掌握位运算符的使用方法。 三、实验内容 程序(一) 功能:编程实现取一整数从右端开始的4~7位。 参考程序: main() {unsigned a,b,c,d; scanf("%o",&a); b=a>>4; c=~(~0<<4); d=b&c; printf("%o,%d\n%o,%d\n",a,a,b,b); } 程序(二) 功能:编程实现求一个数的补码。 提示:读入一个数a后,先进行取反赋值给b,然后在b的基础上加1即得a的补码. unsigned int getbits(unsigned value) { unsigned int z; z=value & 0100000; if (z==0100000) z=~value+1; else z=value; return(z); } 四、问题 语句z=value&0100000;的作用是什么? 把程序二补充完整。 程序二所应用的求补码原则是什么? 实验二十三 顺序文件 一、预习内容 预习文件的建立以及顺序访问时的读写方式。 二、实验目的 理解文件和文件指针的概念,掌握文件的定义、打开、关闭以及顺序读写方法。 三、实验内容 程序(一) 功能:利用文本文件的方法设计并运行如下程序以顺序访问方式建立和读取该文件,用户输入任意10人的学习成绩,通过运行此程序理解文件这一数据类型与其它数据类型的区别。 参考程序: #include<conio.h> #include<stdio.h> #include<string.h> main() {FILE *rf; int x,i; clrscr(); if((rf=fopen("stud.dat","w"))==NULL) {printf("cannot open file\n"); return; } for (i=0;i<10;i++) { printf("x=?"); scanf("%d",&x); fprintf(rf,"%d",x); } fclose(rf); } 程序(二) 功能:有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有的数据和计算出的平均分存在磁盘文件“stud”中。 程序(三) 功能:编程实现从键盘读入字符串并将小写字母转化为大写字母存入文件,输入的字符串以“!”结束,再从文件读回显示。 参考程序: #include <stdio.h> main() {FILE *fp; char str[100]; int i=0; if((fp=fopen("test","w"))==NULL) {printf("can not open the file\n"); exit(0); } printf("input a string:\n"); gets(str); while(str[i]!= '!') {if(str[i]>= 'a' && str[i]<= 'z') str[i]=str[i]-32; ____________; i++; } fclose(fp); ________________; fgets(str,________,fp); printf("%s\n",str); fclose(fp); } 四、问题 为什么说文件这一数据类型是一公共的共享数据类型? 请自己设计访问程序一建立的文件,文件名为stud.dat。 完成程序二的设计。 把程序三补充完整。 实验二十四 随机文件 一、预习内容 预习文件的随机访问方法。 二、实验目的 掌握和正确运用文件的定位函数fseek(文件类型指针,位移量,起始点)的使用方法。 三、实验内容 程序(一) 功能:利用二进制文件的方法设计并运行如下程序,并以随机访问方式读取该文件。 参考程序1:建立一个二进制文件。 #include<stdio.h> #include<string.h> main() { FILE *rf; int x,i; clrscr(); if((rf=fopen("stud.dat","wb"))==NULL) {printf("cannot open file\n"); return; } for (i=0;i<10;i++) { printf("x=?"); scanf("%d",&x); fprintf(rf,"%d ",x); } fclose(rf); } 参考程序2:随机访问参考程序1建立的文件。 main() {FILE *rf; int x,i,n; clrscr(); if((rf=fopen("stud.dat","rb"))==NULL) {printf("cannot open file\n"); return; } for (i=0;i<10;i++) {printf("input student please N?"); scanf("%d",&n); fseek(rf,n*2,0); fscanf(rf,"%d",&x); printf("%d\n",x); } fclose(rf); } 程序(二) 功能:编程实现磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示。 参考程序: #include <stdio.h> struct student_type {int num; char name[10]; int age; char addr[15]; }stud[3]; main() {int i; FILE *fp; if((fp=fopen("studat","rb"))==NULL) {printf("can't open file\n");exit(0); } for(i=0;i<3;i+=2) { fseek(fp,___________,0); fread(_________,sizeof(struct student_type),1,fp); printf("%s %d %d %s\n",stud[i].name, stud[i].num, stud[i].age,stud[i].addr); } fclose(fp);} 程序(三) 功能:编程实现求文件的长度。 四、问题 程序一中fseek(文件类型指针,位移量,起始点)函数的作用是什么? 请利用结构体类型设计内容为学号、姓名、高数、英语字段的文件程序,将上述字段存入该文件,并设计与之对应的查询程序。 完成程序二的设计。 把程序三补充完整。