c语言上机实验指导.doc
C语言程序设计实验指导目 录上机实验总的目的和要求-3实验一 TURBOC的使用与最简单的C程序设计-4实验二 算法-8实验三 数据类型,运算符和表达式-9实验四 顺序结构程序设计-12实验五 选择结构程序设计 -15实验六 循环控制-18实验七 数组-20实验八 函数-22实验九 *编译预处理-25 实验十 指针-27实验十一 结构体与共用体-30实验十二*位运算-33实验十三 文件-34上机实验总的目的和要求学习C语言程序设计课程必须重视实践环节。即独立编写程序,独立上机调试程序。上机的目的,绝不是为了验证教材和上课的内容或者验证自己所编的程序正确与否。应该说,学习程序设计,上机实验的目的:(1)加深对讲授内容的理解,尤其是一些语法规定,通过多次上机,就能自然地、熟练地掌握。(2)熟悉所用的计算机系统的操作方法,了解和熟悉C语言程序开发的环境。(3)学会上机调试程序,也就是善于发现程序中的错误,并能很快的排除这些错误。上机实验一般包括以下几个步骤:(1)准备好上机所需的程序。手编程序应书写整齐,并经人工检查无误后才能上机,以提高上机效率。对程序中存在的问题,应做出记号,切记不编程序或抄别人程序去上机。(2)上机输入和调试自己的程序。应该一人一组,独立上机。上机过程中出现的问题,除了系统问题以外,应该自己调试,独立处理。(3)上机结束后,应整理出实验报告,实验报告应包括以下内容:a、题目。b、程序清单(计算机打印出的程序清单)。c、运行结果(必须是上面程序清单所对应打印输出的结果)。d、对运行情况所做的分析以及本次调试程序所取得的经验。如果程序未能通过,应分析其原因。下面的每一次实验对应教材中的一章内容。上机时间为每次2小时。在实验内容中有“*”部分是选做的题目,如有时间可以选做这些部分。实验一 TURBOC的使用与最简单的C程序设计一、实验目的:1、掌握TurboC的使用。2、理解C程序的结构。3、掌握C程序设计、调试,运行的步骤、方法。4、理解最简单的C程序设计方法。二、实验准备:1、计算机基本操作练习。2、TurboC软件使用预习。3、设计出下面问题的程序。三、实验步骤及内容:1、开机,启动TC。(1)开机,从Windows98的启动菜单中选择“5 Command prompt only”进入DOS状态。(2)进入TC目录。(3)启动TC。 命令格式:TC 文件名.扩展名说明:若缺省文件名,则直接启动。进入TC界面,并显示版本信息。此时按ESC键进入编辑状态。若给定文件名,(缺省扩展名则默认为.C)则打开该文件(若不存在则新建该文件)进行编辑。2、TC的使用(1)启动TC后,进入TC的界面。该界面分为四部分:菜单区、编辑区、信息区、提示行。A、菜单区:TC界面的最上面一行,是TC的主菜单。包括8项: File 文件操作 Edit 编辑操作 Run 运行 Compile 编译 Project 工程(项目) Option 选项 Debug 调试 Break/Watch 中断/监视每个菜单项下都包含有各项具体功能,用户可以通过选择,执行相应的功能。B、编辑区。TC界面的主要部分,由标题Edit,状态行和文本编辑区域组成。状态行中指示光标所在行、列。现在是否处于插入状态(若有Insert标志表示处于插入状态,没有则处于改写状态)以及正在编辑的文件名。C、信息区。由标题message和信息显示区域组成,用来显示编译文件后的错误。单步执行时要监测变量的值等信息。D、提示行。TC界面的最下面一行,用于提示用户一些最常用的操作:F1帮助,F5窗口的缩放,F6 窗口的切换,F8单步执行程序,F9编译连接,F10激活主菜单。(2)菜单的操作A、激活菜单 F10或AltB、移动光条 方向键C、选择某项 回车D、放弃选择 ESCE、主菜单项的直接选中 Alt高亮度的字符 如:要选中File 按AltFF、子菜单的直接选中 选中主菜单项后,直接按高亮度的字母如:选中File后,要选中Save 按“s”.部分快捷键(直接按该键就会击活菜单项具体的功能)除前面提示行中列出的以外,常用的还有:F2保存 F3装入文件 F4从坐标所在位置单步执行F7单步跟踪Alt-F1:查看最近一次的帮助信息Alt-F3:选择文件装入Alt-F5:查看运行结果Alt-X:退出TCCtrl-F1:查看与光标所在位置内容相关的帮助信息Ctrl-F2:取消单步执行Ctrl-F8:设置断点Ctrl-F9:编译、连接并运行(3)文件操作A、新建文件 可采用以下方法:(a)在启动TC时不带文件名,则系统默认为NONAME.C,存盘时再输入文件名。(b)启动TC时带新文件名。(c)在TC环境下选择File下的New。B、打开文件 可采用以下方法:(a)启动TC时带文件名 。(b)在TC环境下选择File下的Load,再输入文件名。(c)以通过Load打开过的文件再次打开,可选择File下的Pick,进行选择。C、保存文件 可采用以下方法:(a)选择File下的Save,存盘。若原文件名是NONAME.C,则存盘时还要输入文件名。(b)选择File下的Write to,输入文件名,则将文件换名存盘。(4)编辑操作TC采用的是全屏幕编辑器,即凡输入过内容的地方都可将光标移到该处直接修改。A、移动光标:左移一个字符 右移一个字符 上移一行 下移一行 移动到行首 Home移动到行末 End向下翻页 PageDown向上翻页 PageUp移动到窗口左上角 Ctrl-Home移动到窗口右上角 Ctrl-End移动到文件头 Ctrl-PageUp移动到文件尾 Ctrl-PageDownB、删除内容:删除光标前的字符 Backspace(退格)删除光标位置上的字符 Delete(del)删除一行 Ctrl-YC、块操作:定义块首 Ctrl-KB 定义块尾 Ctrl-KK块复制 Ctrl-KC 块移动 Ctrl-KV块删除 Ctrl-KY 块取消 Ctrl-KH(5)C程序的调试、运行A、输入程序B、编译、运行形成可执行文件选择Compile下的Compile to OBJ 编译生成目标文件Compile/link EXE file 将目标文件连接成可执行文件Compile/make EXE file 编译直接生成可执行文件(程序输入后,用快捷键F9即表示make exe file,完成编译和连接)。C、执行选择Run下的Run(Ctrl-F9)。D、查看结果运行按Alt-F5,查看后按任意键返回。(6)退出TC选择File下的Quit或直接按Alt-X。3.简单的C程序设计、调试,运行。(1) 输出三个整数,输出它们中的最大值。(2) 已知一个三角形底边为10,其高比底边大6,求三角形面积。四、实验报告:1、源程序。2、调试过程中出现的错误及修改情况。3、实验结果。4、实验的感受及体会。实验二 算法一、实验目的:1、了解算法的概念、特性以及算法在程序设计中的地位;2、熟悉算法的表示方法;3、掌握用流程图、NS图表示一个算法;4、能独立设计一个问题的算法,并根据该算法编出问题的程序。二、实验准备: 1、复习算法的概念及特性。2、复习算法的几种表示方法。3、源程序。三、实验步骤及内容:1、根据例题,判断20002500年中的每一年是否闰年的算法,写出该问题的程序。算法表示:设y为被检测的年份。S1:2000=>yS2:若y不能被4整除,则输出y“不是闰年”。然后转到S6。S3:若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S6。S4:若y能被100整除,又能被400整除,输出y“是闰年”,否则输出y“不是闰年”。然后转到S6。S5:输出y“不是闰年”。S6:y+1=>yS7:当y<=2500时,转到S2继续执行,如y>2500,算法停止。*2、用流程图、NS图表示下列问题的算法:依次将10个数输入,要求将其中最大的数打印出来。并根据设计出的算法写出程序。*3、用流程图、NS图表示下列问题的算法:将100200之间的素数打印出来。并根据设计出的算法写出程序。四、实验报告:1、步骤2和步骤3中的流程图和NS图。2、源程序。3、调试过程中出现的错误及修改情况。4、实验结果。5、实验感受及体会。实验三 数据类型、运算符和表达式一、实验目的:1、掌握C语言数据类型,熟悉如何定义一个整型,字符型,实型变量,以及对他们赋值的方法,了解以上类型数据输出时所用的格式转换符。2、学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加,自减运算符的使用。3、进一步熟悉C程序的编辑,编译,连接和运行的过程。二、实验准备: 1、复习C语言的数据类型。2、复习各种运算符和表达式。3、复习自加、自减运算符并能够熟练应用。三、实验步骤及内容:1、运行程序并回答问题(1)mian() printf("%c",'007'); printf("%c",'016'); 问题:如果执行printf("%c",0x7);printf("%c",0xe);会得到什么结果?为什么?(2)#include<stdio.h> mian() char c1,c2; c1=getchar();/*getchar()函数功能输入一个字符*/ c2=getchar(); putchar(c1); /*putchar()函数功能输出一个字符*/ putchar(c2); 问题:把c1,c2定义成整型变量是否可以?为什么?采用同样的输入值观察结果。2、整型变量与字符在任何情况下都可以互相代替吗?为什么?(1)#include <stdio.h> main() int a, b,c; printf("Input a,b,c");/*提示输入三个数*/ scanf("%d%d%d”,&a,&b,&c); printf("a*b*c=%dn",a*b*c); 问题:此程序在运行时会不会产生溢出?请调试程序并观察结果。3、输入程序并运行:main( )char c1,c2;c1=97;c2=98;printf(“%c,%c”,c1,c2);在此基础上:(1)加printf(“%d,%d”,c1,c2);运行。(2)将第二行改为:int c1,c2;运行。(3)将第三行改为:c1=300;c2=400;运行。4、输入程序并运行:main( )char c1=a,c2=b,c3=c,c4=101,c5=116;printf(“a%cb%ctc%ctabcn”,c1,c2,c3);printf(“tb%c%c”,c4,c5);5、输入程序并运行:main( )int i,j,m,n;i=8;j=10;m=+i;n=j+;printf(“%d,%d,%d,%d”,i,j,m,n);作以下改动:(1)将第四行改为:m=i+;n=+j;(2)程序改为:main( )int i,j;i=8;j=10;printf(“%d,%d”,i+,j+);(3)在(2)的基础上,将printf语句改为:printf(“%d,%d”,+i,+j);(4)再将printf改为:printf(“%d,%d,%d,%d”,i,j,i+,j+);(5)程序改为:main( )int i,j,m=0,n=0;i=8;j=10;m+=i+;n-=-j;printf(“i=%d,j=%d,m=%d,n=%d”,i,j,m,n);6、程序填空并上机运行(1)从键盘输入两个小写英文字母,编程交换它们的值,然后输出其对应的ASCII码,如:ab(回车),输出c1=66,c2=65.main ( ) char c1,c2,t; scanf ("%c%c",_); _;c1=c2;_;printf ("c1=_,c2=_n",_,_);(2)在屏幕上显示“C语言编程” #define ZF "C语言编程"main ( ) printf (_);*(3)main ( ) _/*定义一个字符数组a为“a happy girl!”*/static char b4='b','o','y'printf (_); /*输出a的第5个元素*/printf ("%sn",_) /*输出“a happy girl!”*/_;printf ("%sn",b);四、实验报告: 1、源程序。2、调试过程中出现的错误及修改情况。3、实验结果。4、根据实验结果分析原有程序和修改后的程序的差别。5、实验的感受及体会。实验四 顺序结构程序设计一、实验目的: 1、掌握C语言中使用最多的一种语句赋值语句的使用。2、掌握数据的输入输出方法,能正确使用各种格式转换符。二、实验准备: 1、复习C语言的赋值运算符“=”,同时区分“=”和“= =”的区别。2、复习printf和scanf的格式及要求。3、源程序。三、实验步骤及内容: 1、输入并运行以下程序:main( )int a,b;float d,e;char c1,c2;double f,g;long m,n;unsigned int p,q;a=61;b=62;c1=a;c2=b;d=3.56;e=-6.87;f=3157.;g=0.;m=50000;n=-60000;p=32768;q=40000;printf(“a=%d,b=%dnc1=%c,c2=%cnd=%6.2f,e=%6.2fn”,a,b,c1,c2,d,e);printf(“f=%15.6f,g=%15.2fn m=%ld,n=%ldnp=%u,q=%un”,f,g,m,n,p,q);在以上基础上,做以下改动:(1)将程序第813行改为a=61;b=62;c1=a;c2=b;f=3157.;g=0.;d=f;e=g;p=a=m=50000;q=b=n=-60000;运行程序,分析结果。(2)在(1)的基础上将printf语句改为:printf(“a=%d,b=%dnc1=%c,c2=%cn d=%15.6f,e=%15.6fn”,a,b,c1,c2,d,e);printf(“f=%f,g=%fn m=%d,n=%dn p=%d,q=%dn”,f,g,m,n,p,q);(3)将p,q改用%o格式符输出。(4)改用scanf函数输入数据而不用赋值语句,scanf函数如下:scanf(“%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u”,&a,&b,&c1,&c2,&d,&e,&f,&g,&m,&n,&p,&q);输入的数据如下:61,62,a,b,3.56,-6.87,3157.,0.,50000,-60000,37678,40000(说明:lf和ld格式符分别用于double型和long型数据)分析运行结果。2、程序填空(1)输入一球体的半径求球体的体积。_main( ) double r,v; printf("input r:"); scanf("_",&r); v=_*PI*_; printf("=%.2lfn",v);问题:第3个空白处填写4/3是否合理,为什么?(2)任意输入一个整数X,求他的平方根。提示:平方根函数在库函数math.h文件中定义,它的格式为:double sqrt(double x)_main( ) int x; printf("Input x:"); scanf("%d",_); printf("sqrt(x)=%.2lfn",_);3、运行程序并回答问题#include<stdio.h>main( )int n,x,y,z;printf("请输入一个不大于1000的整数:");scanf("%d",&n);x=n/100;y=(n-x*100)/10;z=(n-x*100-y*10);printf("n%d%d%dn",z,y,x);问题:此程序的功能是什么?你能用其他方法实现同样的功能吗?请上机调试。4、编写程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar和scanf函数输出这两个字符。四、实验报告: 1、源程序。2、调试过程中出现的错误及修改情况。3、实验结果。4、根据实验结果分析原有程序和修改后的程序的差别。5、实验的感受及体会。实验五 选择结构程序设计一、实验目的:1、了解C语言表示逻辑量的方法(以0代表“假”,以1代表“真” )。2、学会正确使用逻辑运算符和逻辑表达式。3、熟练掌握if语句和switch语句。二、实验准备: 1、复习关系、逻辑、条件运算符和表达式。2、复习if语句的三种形式。3、复习if语句的嵌套并能够正确分析。4、复习多分支选择switch语句。5、源程序。三、实验步骤及内容:1、完善下列程序并回答问题已知一函数: -1x<0 y= 0x=0 1 x>0现有4个程序段:A)if(x<0) y=-1;else if(x= =0) y=0;else y=1;B)y=-1;if(x!=0) if(x>0)y=1;else y=0;C)y=0;if(x>=0)if(x>0)y=1;else y=-1;D)if(x>=0) if(x>0)y=1;else y=0;else y=-1;问题:哪个程序段不能实现此函数关系?为什么?请用缩进格式编写完整的程序并上机调试.2、运行程序并回答问题main( ) int a,b,max,min; scanf("%d%d",&a,&b); if(a>b) max=a;min=b; else min=a;max=b; printf("max=%d,min=%dn",max,min);问题:a、此程序的功能是什么?b、请用条件表达式语句(?:)修改程序使之完成相同的功能。3、输入一个不大于4的正整数,判断它是几位数,然后输出各位之积。main( ) int x,a,b,c,d,n; printf("请输入个不大于4位的正整数X:"); scanf("%d",&x); if(x>_) n=4; else if(x>_) n=3; else if(x>_) n=2; else n=1; a=x/1000;/* x的个,十,百,千位分别用d,c,b,a表示*/ b=_; c=_; d=_; switch(_) case 4:printf("%d*%d*%d*%d=%dn", a,b,c,d, a*b*d*c); _;case 3:_;_;case 2:_;_;case 1:_;_; 4、编程(1)有一函数 x (x<1) y = 2x-1 (1<=x<10) 3x-11 (x>=10)用scanf函数输入x的值(分别为x<1、110、>=10三种情况),求y值。(2)给出一个百分制成绩,要求输出成绩等为:A、B、C、D、E。(90分以上为A,8189分为B,7079分为C,6069分为D,60分以下为E。)(3)有一个不多于5位的正整数,要求:1)求出它是几位数;2)分别打印出每一位数字;3)按逆序打印出各位数字,例如原数为321,应输出123。*4)输出四个整数,要求按大小顺序输出。四、实验报告: 1、源程序。2、调试过程中出现的错误及修改情况。3、实验结果。4、实验的感受及体会。实验六 循环控制一、实验目的:1.熟悉用while语句,dowhile语句和for语句实现循环的方法。2.掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等)。二、实验准备: 1、复习while语句,dowhile语句和for语句的特点和适用条件。2、复习continue语句和break语句的区别。3、源程序。三、实验步骤及内容:1、以下程序是用来计算S=1+2+3+10,请更正下列程序的错误,并上机调试.(1)main( ) int i=1; while(i<10) sum+=i; +i; printf("sum=%dn",sum);(2)main( ) int i=sum=0; do sum+=i; +i; while(i<10) printf("sum=%dn",sum);(3)main( ) int i,sum=0; for(i=1;i<10;+i) sum=sum+i; printf("sum=%dn",sum); 2、完善程序并回答问题下列程序用来计算S=1+1/1! +1/2! +1/3! +1/N!main( ) int t,n,i; float s; s=_;t=_; scanf("%d",&n); for(i=1;i<=_;+i) t=_; s=s+_; printf("s=%fn",s);问题:1)此程序用双循环怎么实现?请写出程序上机调试(提示:内循环计算介乘,外循环实现累加).*2)若要计算S=1/2! +1/4! +1/6! +1/10!,用哪种算法比较合适?请编程上机调试。3、编写下列问题的源程序并上机调试。(1)输入两个正整数,求其中最大公约数和最小公倍数。(2)输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。(3)用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。*(4)猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少桃子。三、实验报告:1、源程序。2、错误原因及其修改记录。3、实验结果记录。4、实验体会。实验七 数组一、实验目的:1、掌握一维数组和二维数组的定义、赋值和输入输出的方法。2、掌握字符数组和字符串函数的使用。3、掌握与数组有关的算法(特别是排序算法)。二、实验准备: 1、复习数组的基本知识。2、复习字符串数组的特点和常用的字符串处理函数。3、源程序。三、实验步骤及内容:1、程序填空求两数组的和:main()int i,j,k,a33,b33,c33;for (i=0;i<=2;i+) for(j=0;j<=2;j+) _;_ _;for( i=0;i<=2;i+) for(j=0;j<=2;j+) cij= ;for (i=0;i<=2;i+) for(j=0;j<=2;j+) printf(“%d”,cij);2、程序改错:计算3*3矩阵两条对角线元素之和:#include <stdio.h>void main (void)static int a3=1,2,3,4,5,6,7,8,9;int i,j;/*foundError*/int s1=2;/*found Error */int s2=2;for (i=0;i<3;i+) for (j=0;j<3;j+) if (i=j) s1+=aij;/*found Error */ if i=js2+=aij;printf(“%d,%d”,s1,s2);3、编写下列问题的源程序并上机调试运行。(1)用选择法对10个整数排序(10个整数用scanf函数输入)。(2)有15个数存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。(3)将两个字符串连接起来,不要用strcat函数。*(4)找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。此二维数组可以设定如下: 9 80 205 40 90 -60 96 1210 -3 101 89数组元素的值用赋初值方法在程序中指定。四、实验报告:1、源程序。2、错误原因及其修改记录。3、实验结果记录。4、实验体会。实验八 函数一、实验目的:1、掌握定义函数的方法。2、掌握函数实参与形参的对应关系,以及“值传递”的方式。3、掌握函数的嵌套调用和递归调用的方法。4、掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。二、实验准备: 1、复习函数调用的基本理论知识。2、复习函数的嵌套调用和递归调用的方法。3、复习全局变量、局部变量;静态变量、动态变量;外部变量等概念和具体使用。4、源程序。三、实验步骤及内容:1、运行程序并回答问题(1)程序main() play(3);void print_star() printf("* * * * * * * * * *n")void print_message() printf("Good Friend! n");void play(int n) int i; for(i=1;i<=n;+i) print_star(); print_message(); 问题:运行后出现什么错误?为什么?应如何修改?请上机调试。(2)以下程序用于计算1+2+3+4+5。 main() int i,sum; for(i=1;i<=5;+i) sum=add(i);printf("sum=%dn",sum); add (int a) int s=0; s=s+a;return(s);问题:此程序能否得到正确结果?为什么?请在不增加语句的条件下,修改程序并上机调试。(3)程序int x=567; main() printf("x=%d,y=%dn",x,y); int y=890问题:运行程序后出现什么错误?为什么?如何修改?2、程序填空本程序的作用是在三位正整数中寻找符合下列条件的整数,它既是完全平方数,又有两位数字相同,例如144,676等,下列程序要找出所有满足上述条件的三位数并输出。 main() int n,k,a,b,c; for(k=1;k+) _; if(n<100) _; if(n