软件工程c上机实验指导书修订_第1页
软件工程c上机实验指导书修订_第2页
软件工程c上机实验指导书修订_第3页
软件工程c上机实验指导书修订_第4页
软件工程c上机实验指导书修订_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件设计基础实验指导书PAGE文档编号:实验指导书英文名称缩写–版本《软件设计基础》课程实验指导书(适用于软件工程专业)软件工程系辽宁工程技术大学软件学院年月日目录TOC\o"1-3"\h\z实验1C程序的运行环境和运行一个C程序的方法 1实验2数据类型、运算符和表达式 5实验3最简单的C程序设计 8实验4逻辑结构程序设计 12实验5循环控制 16实验6数组 22实验7函数 26实验8指针 29实验9结构体和共用体 36实验10位运算 38实验11文件 39实验12综合应用实验 43-PAGE42-实验1C程序的运行环境和运行一个C程序的方法一、实验目的1、了解如何编辑、编译、连接和运行一个C程序;2、通过运行简单的C程序,初步了解C程序的特点。二、实验内容1、学习进入C的工作环境并熟悉TurboC集成环境;2、练习输入并运行一个简单的C程序,掌握和理解C程序的结构;3、初步了解C程序的编译、连接和运行的过程。三、实验性质验证性实验四、实验学时2学时五、实验环境TurboC2.0四、实验原理及步骤1、启动TurboC进入TurboC集成环境后,首先在屏幕上显示TurboC主菜单窗口。在该窗口,有8个菜单条目。每一个菜单的意义如下:File处理文件(包括装入、存盘、选择、建立、换名写盘),目录操作(包括列表、改变工作目录),退出系统及调用DOS;Edit建立、编辑源文件;Run控制运行程序。如果程序已经编译连接好,且Debug/SourceDebugging以及Option/Compiler/Codegeneration/OBJDebugInformation开关置为On,则可以用此菜单初始化调试阶段;Compile编译并生成目标程序与可执行文件;Project允许说明程序中包含哪些文件的管理条目;Options可以选择集成环境任选项(如存储模式、编译时的任选项、诊断及连接任选项)及定义宏;也可以记录IncludeOutput及Library文件目录,保存编译任选项和从配置文件加载任选;Debug检查、改变变量的值,查找函数,程序运行时查看调用栈。选择程序编译时是否在执行行代码中插入调试信息;Break/Watch增加、删除、编辑监视表达式,及设置、清除、执行至断点;特别要指出的是,除了Edit项外,每一个菜单又有对应的子菜单。而选择Edit项目后,只是进入编辑器;为了从主菜单中选择所需要的功能,可以用以下两种方式之一:按F10键后,可以看到屏幕上部主菜单中有反白显示,此时,利用左、右光标移动键(←与→)选择需要的菜单,然后按回车(Enter)键。直接按Alt+主菜单条目中的首字母(分别为F、E、R、C、P、O、D、B),此时就会出现相应的子菜单。例如,按Alt+F表示选择文件子菜单(File)。当出现子菜单时,其中某个条目是高亮度的,此时可以利用上、下光标移动键(↑与↓)来移动该高亮度线,从而选择所需要的功能。在菜单调用时,按Esc键后将直接返回到活动窗口。2、输入程序(1)输入以下程序,并运行。main(){printf("Howareyou!");}(2)有下面的C程序,计算由键盘输入的任意两个整数的积。#include(stdio.h);main()scanf(“%x,%y”,&x,%y)p=prodct(x,t)printf(“Theproductis:”,p)intprodct(inta,intb)intcc=a*breturnc调试上述程序:静态地检查上述程序,改正程序中的错误;在编辑状态下照原样键入上述程序;编译并运行上述程序,记下所给出的出错信息;按照事先静态检查后所改正的情况,进行纠错;再编译执行纠错后的程序;如还有错误,再编辑改正,直到不出现语法错误为止。下面给出6组测试用例,你认为哪几组较好?为什么?0,00,9920,5033000,20-5,-2-5,2要测试出上述程序中所有错误,你认为应当用几组测试用例?3、运行程序按Ctrl+F9运行程序,如果没有报错,可以按Alt+F5查看运行结果,再按空格键回到编辑窗口。4、保存文件按F2键,弹出一个对话框,在对话框中输入文件名,如:exam1.c。5、退出TC程序按Alt+X键,弹出对话框,提示是否真的要退出TC,如果输入Y就会退出TC。6、打开已经存在的文件首选启动TC;按F3,弹出对话框;在该对话框中,输入文件名即可。五、实验报告1.提交源程序2.总结实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。实验2数据类型、运算符和表达式一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法;2、掌握不同的类型数据之间赋值的规律;3、学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用;4、进一步熟悉C程序的编辑、编译、连接和运行的过程。二、实验内容1、输入有代表性的程序,比较整型数据、字符型数据以及字符串型数据的区别与联系;2、输入程序,体会C编译系统自动的数据类型转换。三、实验性质验证性实验四、实验学时2学时五、实验环境TurboC2.0六、实验原理及步骤1、用printf函数来输出以下表达式运行结果(1)当x=5,y=6,z=7时x<yy>xx!=yx==z-2x=x-2x>=zx<=z(2)当x=0,y=-1,z=1时x&&yx||yy&&zy||zx&yx|y2、下面的程序试图计算由键盘输入的任意两个整数的平均值#include<stdio.h>main(){intx,y,a;scanf(“%x,%y,&x,&y);a=(x+y)/2;printf(“Theaverageis:”a);}调试无语法错误后,分别使用下列测试用例对上述程序进行测试:(1)2,6(2)1,3(3)-2,-6(4)-1,-3(5)-2,6(6)-1,3(7)1,0(8)1,6(9)32800,33000(10)-32800,33000分析上述哪几组测试用例较好?通过测试,你发现程序有什么错误了吗?若有错误,请指出错误原因。操作符sizeof用以测试一个数据或类型所占用的存储空间的字节数。请编写一个程序,测试各基本数据类型所占用的存储空间大小。3、编写一个C语言程序,测试下列各表达式i,ji+1,j+1i++,j++++i,++ji+++++j++i+++++j++要求在各表达式中i和j都分别有相同的初值。在实验中注意下列问题:哪些表达式是错误的?为什么?理解+,++,++i,i++的意义和优先级别。七、实验报告1.提交源程序2.分析以下两个问题:(1)“=”和“==”有什么区别?(2)“&”和“&&”、“|”和“||”有什么区别?实验3最简单的C程序设计一、实验目的1、掌握C语言中使用最多的一种语句——赋值语句的使用方法;2、掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。二、实验内容1、掌握C语言程序输入、输出的方法和格式;2、掌握各种格式转换符的正确使用方法;3、编写程序,练习小数的输出用法;4、编程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和scanf函数输出这两个字符。三、实验性质验证性实验四、实验学时2学时五、实验环境TurboC2.0六、实验原理及步骤第一组实验程序:1、输入并编辑下面的程序main(){inta,b;floatc,d;longe,f;unsignedintu,v;charc1,c2;scanf(“%d,%d”,a,b);scanf(“%f,%f”,c,d);scanf(“%ld,%ld”,e,f);scanf(“%o,%o”,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=%o,d=%o\n”,&u,&v);printf(“c1=%c,d=%c\n”,&c1,&c2);这个程序有语法错误吗?为什么?2、调试上述程序无语法错误后,用下面的测试数据,对程序进行测试。a=123,b=456,c=17.6,d=71837.65,e=70000,f=2174506u=62000,v=58765,c1=’a’,c2=’b’分析运行结果。特别注意输入c1,c2的值是什么?什么原因?3、将输入e和f的语句改为:scanf(“%d,%d”,&e,&f);再用上述测试数据测试并分析结果。4、将输入u、v的语句改为:scanf(“%d,%d”,&u,&v);再用上述测试数据测试并分析结果。5、将输出e,f的语句改为:printf(“e=%17d,f=%17d\n”,e,f);再用上述测试数据测试并分析结果。6、将输出u、v的语句改为:printf(“u=%u,v=%u\n”,u,v);或printf(“u=%d,v=%d\n”,u,v);再用上述测试数据测试并分析结果。7、请修改程序和改变数据输入的形式,分析各种情况下的输入与输出。8、在scanf(“%c,%c”,&c1,&c2);语句之前加一个语句:getchar();9、验证转义字符\n与\r的意义有何不同。第二组实验程序:1、输入x,y,编写程序求z=x+|y|的值程序中用scanf函数输入x和y的值,请分析以下两个语句scanf(“%f%f”,x,y);scanf(“%f%f”,&x,&y);哪一个是正确的,分别运行之,分析程序运行结果。如果scanf函数改为scanf(“%f,%f”,&x,&y);应该怎样输入数据。2、编写输入三角形的三边长a、b、c,求三角形面积area的程序。输入前要加提示语句;输出结果前要有必要的文字说明;输入一组数据3、4、5,观察运算结果;输入另外一组数据3、4、8,观察运算结果,分析这个运算结果是否有效。*第三组实验程序:1、编写一个程序,由键盘输入学生的三门课英语、数学和程序设计的成绩,计算并输出总成绩、平均成绩。2、编写一个程序,输入一个三位正整数,要求反向输出对应的整数,如输入789,则输出987。七、实验报告1.提交源程序2.分析以下两个问题:(1)总结在printf函数中可以使用的各种格式指定符,并给出样例;(2)总结在printf函数中可以使用的各转义字符及其功能。实验4逻辑结构程序设计一、实验目的及内容1、了解条件与程序流程的关系;2、了解用不同的数据使程序的流程覆盖不同的语句、分支和路径;3、学会正确使用逻辑运算符和逻辑表达式;4、熟练掌握if语句和switch语句。二、实验性质验证性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理及步骤第一组实验程序:1、有如下程序段:{……if(a>1&&b==0)x=x/a;if(a==2||x>1)x=x+1;}为了更容易明白程序的逻辑结构,用流程图来加以描述。a>1&&b==0x=x/aa>1&&b==0x=x/aa==2||x>1x=x+1YNYN要求增加一些输入语句和输出语句,以便使上述程序能在不同的a,b和x值下运行,并且能观察程序流程经过(覆盖)了哪些语句、哪些分支及哪些路径。2、实验步骤记下分别使用下列各组数据运行时的操作流程。a=1,b=1,x=1;a=1,b=1,x=2;a=3,b=0,x=1;a=2,b=1,x=4;a=2,b=1,x=1;a=1,b=0,x=2;a=2,b=1,x=1;a=3,b=0,x=2。3、分析讨论用哪一组数据就可使程序中的每个处理语句都执行一次?为了找出程序中各条处理语句中的错误,应该使用什么样的数据对程序进行测试?请上机验证自己的结论。用哪两组数据就可以使程序段中的每个分支都运行一次?这种情形与上面的讨论有何不同?如果为了找出程序中积压分支中的错误,应该使用什么样的数据对程序进行测试?请上机验证自己的结论。用哪两组数据就可以把判定框中的每个条件运算都进行一次?如果为了测试出判定条件中的错误,应使用哪些数据对程序进行测试?请上机验证自己的结论。用哪四组数据才可以把各种条件的组合都检测一遍?如果为了测试各种条件的组合的情形,应该使用什么样的测试数据?请上机验证自己的结论。用哪四组数据才可以把起始到终止的各条路径都覆盖一次?如果为了测试出程序在不同路径下的错误,应该使用什么样的测试数据?请上机验证自己的结论。第二组实验程序:1、用scanf函数输入一个年份year,计算这一年2月份的天数days,然后用输出函数printf输出days。实验步骤与要求:(1)有变量定义为整型;(2)输入前要加提示语句;(3)输出结果前要有必要的文字说明。说明:(1)闰年的条件是:year能被4整除但不能被100整除,或者year能被400整除。(2)如果year是闰年,则2月份的天数为29天,不是闰年则为28天。2、编写程序,输入三角形三边a、b、c,判断a、b、c能否构成三角形,若不能则输出相应的信息,若能则判断组成的是等腰、等边、直角还是一般三角形。实验步骤与要求:(1)输入一组数据3,4,8,观察程序运行结果,并与实验二中程序2做比较。(2)另外再输入几组数据进行测试。3,4,53,3,33,3,5(3)如果程序有误,可采用“跟踪打印”的调试方法,确定错误的出处。3、编写程序,输入奖金数a,计算并输出税率、应缴税款和实得奖金数。奖金税率a<5000.00500≤a<10000.051000≤a<20000.082000≤a<50000.105000≤a0.15实验步骤与要求:(1)用if语句编程,自变量和函数值均为双精度类型;(2)用scanf函数输入奖金数a,输出结果采用以下形式:a=具体值rate=税率值tax=应缴税款profit=实得奖金数(3)分别输入a=280,512,1000,4250,5100,运行该程序(4)用if~elseif语句和switch语句编程,其它同上。*第三组实验程序:1、编写一个程序,要求输入一个字符并判断它是字母字符、数字字符、还是其他字符。2、编写一个程序,求一元二次方程ax2+bx+c=0的根。3、输入一个无符号整数,判断该数是偶数还是奇数。六、实验报告1.提交源程序2.分析以下问题:对于多分枝选择结构何时使用if语句的嵌套,何时使用switch语句?实验5循环控制一、实验目的及内容1、熟悉掌握用while语句,do-while语句和for语句实现循环的方法;2、掌握在程序设计中用循环的方法实现一些常用算法;3、掌握在程序设计条件型循环结构时,如何正确地设定循环条件、如何控制循环的次数以及条件型循环结构的基本测试方法;4、掌握如何正确地控制计数型循环结构的次数、对计数型循环结构进行测试的基本方法及在嵌套循环结构中提高程序效率的方法。二、实验性质验证性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理与步骤第一组实验程序(条件型循环结构)1、下面是一个计算e的近似值(使误差小于给定的δ)的程序。//缺??//缺??main(){doublee=1.0,x=1.0,y,detax;inti=1;printf(“\npleaseinputenteraerror:”);//未定义函数scanf(“%lf”,&detax);//未定义函数y=1/x;while(y>=detax){ x=x*I;//未定义变量Iy=1/x;e=e+y;++i;}printf(“%12.10lf”,e);//未定义函数}2、实验步骤(1)阅读上面的程序,写出程序所依据的计算公式。(2)当输入的detax各是什么值时,能分别使程序按下面的要求运行:不进入循环;只循环一次;只循环两次;进入死循环(程序将永远循环下去)。为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?(3)原程序中while语句中的y>=detax,分别换成y>detax,y=detax,y<detaxy<=detax,观察程序运行将会有什么变化。假如不知道机器内的程序中的各语句实际上是什么,分别输入什么样的detax来测试出while语句的循环条件写错了。(4)把原程序中while语句之前的y=1/x语句去掉,观察程序的运行将会发生什么样的变化。假如不知道机器内的程序实际上是怎么写的,输入什么样的detax就能测试出少了上述这条语句。(5)若把原程序中的++i换成i++,观察程序的运行发生了什么变化?假如不知道这条语句到底是怎么写的,输入什么样的detax就能测试出这条语句写错了。(6)把原程序中的while结构改写成do—while结构,再分别按上述的(2)、(3)两步进行实验。3、分析讨论总结一下测试条件循环结构的一般方法。第二组实验程序(计数型循环结构)1、下面是一个用以计算和的C程序。main(){inti,j;longsum=0;for(i=1,i<=20,i++)//查查错误for(j=1;j<=3;j++)sum=sum+(i+1)*(i+1)*(j+2)printf(“sumis:%d\n”,sum);}2、实验步骤(1)

将上述程序中的和分别做什么样修改,能使程序按如下要求运行:不循环;外循环1次,不进入内循环;外循环,内循环各1次;外循环1次,内循环2次;外循环2次,内循环1次;外循环19次,内循环3次;外循环20次,内循环2次;外循环21次,内循环3次。(2)试修改程序,以便能知道控制表达式i=1;j<=20;i++和j=1;j<3;j+=各执行了多少次?(3)内循环与外循环的控制表达式进行对换,观察程序的执行结果有无变化,并且观察对换后的外循环与内循环控制表达式执行的总次数有无变化?(4)将(3)中程序写为main(){inti,j,k;longsum=0;for(j=1.j<=3.j++){k=j+2;for(i=1;i<=20;i++)//有错误sum=sum+(i+1)*(i+1)**k;//有错误}printf(“sumis:%d\n”,sum);}观察程序的执行结果有无变化?(5)将(3)中程序改写为main(){intI,j,m,n;longsum=0;for(j=1;j<=3;j++){m=j+2;for(I=1;j<=20;I++)//循环会终止吗,为什么,注意观察j的变化 {n=I+1;sum=sum+m*m*k;}}printf(“sumis:%d\n”,sum);}观察程序的执行结果有无变化?(6)在(5)的程序中,若将外循环控制表达式分别做如下修改:j=1;j<3;j++j=1;j=3;j++j=1;j>=3;j++j=1;j>3;j++j=1;j<=3;j--j=1;j>3;j--j=1;j<3;j++j=0;j<=3;j+=j=0;j<3;j++j=1;j<=3;j++j=1;j<3;++j观察程序的执行结果有无变化?*第三组实验程序:1、编写一个程序,将输入的正文复制到输出,复制过程中删除每个输入行的前置空格。2、求解满足条件1+2+3+···+n≥300的最小的n及总和值。3、编写一个程序,把用户输入的数据累加,直到输入零为止,输出累加的结果。4、输入一个正整数n,求sum=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值。5、打印输出半径为1到10的圆的面积,若面积在40到90之间则予以打印,否则,不予打印。六、实验报告1.提交源程序2.分析以下两个问题:(1)如何测试计数型循环结构的控制表达式中的错误?(2)从实验中你得到了哪些提高嵌套循环程序效率的启示?实验6数组一、实验目的及内容1、掌握一维数组和二维数组的定义、赋值和输入输出的方法;2、掌握字符数组和字符串函数的使用;3、掌握与数组有关的算法,特别是排序算法。二、实验性质验证性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理与步骤1、编写程序,测试下列数组的定义方式是否正确(1)main(){intn;scanf(“%d”,&n);inta[n];……}(2)main(){constintn=10;inta[n];

}(3)

#include<stdio.h>#defineM10main(){inta[M];

}(4)main(){inta[2+2*4];

}(5)#include<stdio.h>#defineM2#defineN8main(){inta[M+N];}通过这一实验,可以说明什么问题?2、运行下面的C程序,根据运行结果,可以说明什么?main(){intnum[5]={1,2,3,4,5};intii;for(i=0;i<=5;i++)//尤其注意最后一次循环printf(“%d”,num[i]);}3、操作符&用以求一个变量的地址,这在函数scanf中已经使用过了。现在要你设计一个程序,返回一个3*5的二维数组各元素的地址,并由此说明二维数组中各元素是按什么顺序存诸的。4、为一个起泡排序程序设计测试用例,并测试之。5、1983年,在ACM图林奖颁奖大会上,杰出的计算机科学家,UNIX的鼻祖,C语言的创始人之一,图林大奖得主,KenThompson上台的第一句话是:“我是一个程序员,在我的1040表上,我自豪地写上了我的职业。作为一个程序员,我的工作就是写程序,今天我将向大家提供一个我曾经写过的最精练的程序。”这个程序如下:#include<stdio.h>chars[]={'\t','0','\n','}',';','\n','\n','/','*','\n',0};/*(213linesdeleted)*//**Thestringisa*representationofthebody*ofthisprogramfrom'0'*totheend*/voidmain(void){inti;printf("char\ts[]={\"");for(i=0;s[i];i++){printf("\t%d,\n",s[i]);}printf("%s",s);}6、用冒泡法对10个整数排序。10个整数用scanf函数输入;7、对一个有序数列,用折半查找法找出该数是第几个元素的值;8、将两个字符串连接起来,不要用strcat函数。请上机运行这个程序,指出它的功能和运行结果。六、实验报告1.提交源程序2.通过实验,分析定义与引用数组的区别。实验7函数一、实验目的及内容1、掌握定义函数的方法;2、掌握函数实参与形参的对应关系以及“值传递”的方式;3、掌握函数的嵌套调用和递归调用的方法;4、掌握全局变量和局部变量动态变量、静态变量的概念和使用方法;5、学习对多文件程序的编译和运行。二、实验性质验证性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理与步骤1、上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。main(){int,y;//这在定义什么东西?printf("%d\n",sum(x+y));//sum的顶用形式正确吗?intsum(a,b)//函数可以嵌套定义吗?{inta,b;//形式参数是这样声明的吗?return(a+b);}}2、编写并调试一个求(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。3、编写一个函数,判断一个数是不是素数。在主函数中输入一个整数,输出是否是素数的信息。实验步骤与要求:(1)编写一个函数prime(n),返回给定整数n是否为素数。(2)编写一个主函数,输入一个整数,调用(1)中的函数,判断此整数是否为素数,并输出结果。(3)对于属于多函数程序,可以采用每个函数分别进行编辑、编译的方法,然后再连接、运行。如果编译有错时,可分别修改,这样便于调试。实验4和实验4也可以使用这样的调试方法。4、用梯形法求函数的定积分。实验步骤与要求:(1)编制一个函数sab(a,b,n),其功能是求函数f(x)在[a,b]上的定积分,其中n为区间[a,b]的等分数。要求该函数在一个独立的文件中。(2)编制一个主函数以及计算被积函数值的函数f(x),在主函数中调用(1)中的函数计算并输出下列积分值。要求主函数与函数f(x)在同一个文件中。(3)编制另一个主函数以及计算被积函数值的函数f(x),在主函数中调用(1)中的函数计算并输出下列积分值。要求主函数与函数f(x)在同一个文件中。说明:用梯形法求定积分,梯形公式为:s=h[f(a)+f(b)]/2+hf(a+kh)其中,h=(b-a)/n5、用递归方法编写程序,求n阶勒让德多项式的值,递归公式为:1(n=0)pn(x)=x(n=1)((2n-1)xpn-1(x)-(n-1)pn-2(x))/n(n>1)实验步骤与要求:(1)根据递归公式编制计算n阶勒让德多项式的递归函数p(n,x);(2)编制一个主函数,由键盘输入n,x,调用(1)中的函数计算n阶勒让德多项式的值;(3)输入(n,x)=(4,2)运行该程序,然后自定义几组数据再运行该程序。程序调试说明:多模块的调试除了可以采用前面实验中采用的各种调试方法以外,还可以采用“回声打印”的调试方法。当函数之间要传递的数据较多时,容易出错。这时,在有关的输入数据之后加上输出语句,以便反映数据输入的情况。在函数之间有数据传递后,再用输出语句把传递后的数据输出,这样可以找到数据的错误处,以便分析原因。*6、求幻方:对于n行n列的方阵(n为奇数),将1~n2共n2个数填于此方阵中,如果所得方阵中的每一行、每一列以及两个对角线上各数之和均相等,则称此方阵为魔幻纵横图。请编写程序实现(n从键盘输入)。*7、求解组合数:计算在总数为n个的对象中,任意取p个的所有不同组合数(其中n为>0的正整数,p为>=0的正整数且p<=n)及其具体的组合情况。要求用递归函数调用的方法实现。六、实验报告1.提交源程序2.分析以下两个问题:(1)针对以上实验内容写出相应的参数传递过程并分析结果;(2)讨论参数的传递的几种形式。实验8指针一、实验目的及内容1、通过实验进一步掌握指针的概念,会定义和使用指针变量;2、能正确使用数组的指针和指向数组的指针变量;3、能正确使用字符串的指针和指向字符串的指针变量;4、能正确使用指向函数的指针变量;5、了解指向指针的指针的概念及其使用方法。二、实验性质验证性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理与步骤第一组实验程序:1、指出下面程序错误的原因。#include<stdio.h>voidmain(void){intx=10,y=5,*px,*py;px=py;//此前,py并未初始化。px=&x;py=&y;printf("*px=%d,*py=%d,*px,*py);//格式控制字符串不全}2、下面的程序试图有如下运行结果:whichstyleyouwantto:Capital(c)oruncapital(a):c↙COMPUTERWhichsytleyouwantto:Capital(c)oruncapital(a):u↙computer请调试下面的程序,使其有如上执行结果。#include<stdio.h>//缺某库函数包含语句voidmain(void){char*s;charc;printf("whichstyleyouwantto:ln");printf("capital(c)oruncapital(a):");c=getchar();if(c='c')strcpy(s,"COMPUTER");//注意s指针指向了谁?elsestrcpy(s,"computer");//库函数put(s);//库函数,名字对吗?}分析出错原因。3、下面的程序能获得上述运行结果吗?#include<stdio.h>#include<string.h>voidmain(void){char*S="COMPUTER";//??charc;printf("whichstyleyouwantto\n");printf("capital(c)oruncapital(u);");c=getchar();if(c='c')//此处判断关系,形式对吗?{puts(s);}else{s="computer";puts(s);}}分析出错原因。4、设计一个C程序,用以测试下列各表达式的运算。(1)y=*px++(2)y=*++py(3)y=(*py)++(4)y=--*ppx++第二组实验程序:1、想使指针变量pt1指向a和b中的大者,pt2指向小者,以下程序能否实现此目的?#include<stdio.h>#include<string.h>voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}voidmain(void){inta,b,*pt1,pt2;scanf("%d,%d",&a,&b);pt1=&a;pt2=&b;if(a<b)swap(pt1.pt2);printf("%d,%d\n",*pt1,*pt2);}上机调试此程序。如果不能实现题目要求,指出原因,并修改之。2、下面的程序,注意其中的复杂声明语句:int(*function[4])();和各标记符的含义,并记录执行结果。#include<stdio.h>#include<string.h>voidmain(void){intfun1();intfun2();intfun3();intfun4();int*execute(intx,inty,int*fun());int(*function[4])();inta=10,b=5,i;function[0]=fun1;function[1]=fun2;function[2]=fun3;function[3]=fun4;for(i=0;i<4;i++)printf("funno.%d->%d\n",i+1,execute(a,b,function[i]));}int*execute(intx,inty,int*fun()){return(*fun)(x,y);}intfun1(intx,inty){return(x+y);}intfun2(intx,inty){return(x-y);}intfun3(intx,inty){return(x*y);}intfun4(intx,inty){return(x/y);}3、程序voidmain(intargc,char*argv[]){while(argc-->1)printf("%s\n",*++argv);}假设该程序的文件名为shiyan.cpp,编译后可执行程序名为shiyan.exe(用DOS时),在dos下运行时,输入下面命令行:shiyan.exeBASICC++COBOLPASCL分析输出结果。可运行程序:#include<stdio.h>#include<string.h>voidswap(int*p1,int*p2)//思考为何如此修改即可达到交换的目的?{intiTemp;iTemp=*p1;*p1=*p2;*p2=iTemp;}voidmain(void){inta,b,*pt1,*pt2;scanf("%d,%d",&a,&b);pt1=&a;pt2=&b;if(a<b){swap(pt1,pt2);}printf("%d,%d\n",*pt1,*pt2);}第三组实验程序:*1、筛选法求素数用筛选法找出n以内的所有素数(就是质数),并按每行10个数的形式打印出来。*2、报数问题有n个人围成一圈,顺序编号。从第一个人开始报数(从1到m),凡报到m的人退出圈子,问最后一个圈中的人的编号?*3、统计整数输入一段文字,将其中连续的数字作为整数存放在另一数组中,并统计整数的个数。六、实验报告1.提交源程序2.分析:数组与指针的联系。实验9结构体和共用体一、实验目的1、掌握结构体类型变量的定义和使用;2、掌握结构体类型数组的概念和使用;3、掌握链表的概念,初步学会对链表进行操作;4、掌握共用体的概念与使用。二、实验内容编程序并上机调试运行:1、由10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数据。2、13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到3者退出圈子,找出最后留在圈子中的人原来的序号。3、本题要求用链表实现。建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。4、练习一个使用共用体的程序。三、实验性质验证性实验四、实验学时2学时五、实验环境TurboC2.0六、实验原理与步骤1、建立一个链表每个结点包括的成员为:职工号、工资。用malloc打印出来。用一个creat来建立链表,用list来输出数据。5个职工号为101,103,105,107,109。2、在上题基础上,新增加一个职工的数据,按职工号的顺序插入链表,新插入的职工号为106。写一函数insert来插入新结点。3、在上面的基础上,写一函数delete,用来删除一个结点。要求删除职工号为103的结点。打印出删除后的链表。4、你有无办法测试构造链表时,内存空间的动态分配情形?*5、现有一个班有30个学生,每个学生信息包括姓名、学号、以及期末总成绩。要求编写程序找出其中总分最高和最低的学生,并分别打印出其所有信息。七、实验报告提交源程序分析在上机过程中遇到的问题及解决方法。实验10位运算一、实验目的及内容1、掌握按位运算的概念和方法,学会使用位运算符;2、学会通过位运算实现对某些位的操作。二、实验性质验证性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理与步骤1、编一个程序,将一个整数的高字节和低字节分别输出(用位运算方法)。上机运行。2、编一个程序,止将一个整数的低4位翻转。上机运行,用十六进制数输入和输出。3、将一个整数i的各位循环左移4位,设i的值为十六进制数65。4、设计一个函数,当给定一个整数后,能得到该数的补码(应考虑该整数是正数或负数)。5、编写一程序,检查所用的计算机系统的C编译在执行右移时是按照逻辑右移的原则,还是按照算术右移的原则进行操作。6、编一个函数getbits,从一个16位的单元中取出某几位,用八进制数打印出来。7、设计一个函数,使给出一个数的原码,能得到该数的补码。 六、实验报告1.提交源程序2.分析在上机过程中遇到的问题及解决方法。实验11文件一、实验目的及内容1、掌握文件以及缓冲文件系统、文件指针的概念;2、学会使用文件打开、关闭、读、写文件操作函数;3、学会用缓冲文件系统对文件进行简单的操作。二、实验性质验证性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理与步骤1、从键盘输入一个字符串,然后将其以文件形式存到磁盘上。磁盘文件名为file1.c。2、从磁盘文件file1.c读入一行字符,将其中所有小写字母改为大写字母,然后输出到磁盘文件file2.c中。3、已有两个文本文件,今要求编程序从这两个文件中读出各行字符,逐个比较这两个文件中相应的行和列上的字符,如果遇到互不相同的字符,输出它是第几行第几列的字符。4、统计一篇文章中大写字母的个数和文章中的句子数(句子的结束标志是句点后跟一个或多个空格)。5、建立一个磁盘文件,其内容是0~90°之间每隔5°的正弦值。程序如下:#include<iostream.h>#include<fstream.h>#include<math.h>#definePI3.14159main(){floatS[19];inti,a;ofstreamout(“fsin.bny”);if(!out){cout<<”Cannotopenfile.”<<endl;return1;}for(i=0,a=-5;i<19;i++){a+=5;S[i]=sin(a*PI/180.0);}out.write((unsignedchar*)&s,sizeofs);out.close();return0;}6、把实验题5所建立的文件的内容读出并打印。程序如下:#include<iostream.h>#include<fstream.h>main(){floatS[19];inti,a;ifstreamin(“fsin.bny”);if(!in){cout<<“Cannotopenfile.”<<endl;return1;}in.read((unsignedchar*)s,sizeofs);cout<<endl;cout<<“isin(i)”<<endl;for(i=0,a=-5;i<19;i++){a+=5;cout<<“a<<S[i]<<”<<endl;}in.close();return0;}7、有5个学生,每个学生有3门课的成绩,从键盘输入以上数据,计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。*8、TYPE命令模拟:在windows的MS-DOS方式下有一个DOS内部命令TYPE,用于显示文本文件的内容,其命令使用格式为:TYPEFILE。在此我们使用C语言来模拟实现该程序。*9、存储文件:从键盘输入若干行文本,直到输入字符串”END”位置,将其中包含英文字母的行,送到文件SAVE01.TXT中存储起来,并显示SAVE01.TXT中的最后5行(不足5行的以实际行数为准)。*10、文件复制:编写程序实现文件的复制,其中源文件名称和目标文件名称使用命令行参数提供。六、实验报告1.提交源程序2.分析以下两个问题:(1)缓冲文件系统和非缓冲文件系统的区别?(2)文件打开和关闭的含义?为什么要打开和关闭文件?实验12综合应用实验一、实验目的与内容1、掌握用C语言进行简单的数据库管理。2、了解C程序菜单设计的一般方法。3、理解链表的概念及应用。

二、实验性质综合性实验三、实验学时2学时四、实验环境TurboC2.0五、实验原理和步骤*1、学生信息处理:一个学生的信息包括学号、姓名、年龄、身高四项信息。现分别编写以下程序实现对学生信息的处理。(1)输入若干学生的信息,下一次输入之前进行提示选择,输入的选择为字符串“END”则结束,否则继续。输入的信息以文本文件格式保存,文件名通过命令行参数给出;学生信息各个信息项之间用制表符隔开,每个学生信息占一行。(2)通过运行程序(1),生成学生信息文件。编写程序统计学生的人数、平均年龄、平均身高。将所有学生的信息和统计信息送打印机打印。2、建立一个链表,每个结点包括学号、姓名、及三科成绩、平均成绩。除平均成绩外,各项均由键盘输入。要求:(A)计算平均成绩;(B)要实现插入功能;(C)要有排序功能;(D)要有存取功能。参考程序:#include<stdio.h>structSStudent{unsignednumber;charname[11];intscore1,score2,score3;structSStudent*link;};structSStudent*CreateTable();voidAppendToTable(structSStudent*stu);voidInsertToTable(structSStudent*stu);voidQueryTable(structSStudent*stu,unsignedage);voidSortTable(structSStudent*stu);voidPrintTable(structSStudent*stu);voidSave(structSStudent*stu);voidLoad(structSStudent*stu);voidHelp();voidmain(){structSStudent*student;unsignednumber;charkeyValue;student=CreateTable();clrscr();Help();printf("\n=");while((keyValue=getche())!='q'&&keyValue!='Q'&&keyValue!=27){puts("");switch(keyValue){case'l':case'L': PrintTable(student);break;case'd':case'D': printf("Pleaseinputthenumberyouwantdelete:"); scanf("%d",&number); QueryTable(student,number); break;case'a':case'A': AppendToTable(student);break;case'i':case'I': InsertToTable(student);break;case's':case'S': SortTable(student); puts("Sortcomplished!PleaseusecommandLtolist."); break;case'v':case'V': Save(student);break;case'o':case'O': Load(student);break;case'c':case'C': clrscr();break;case'h':case'H': Help();break;default:puts("Errorcommand!");}printf("\n=");}}

structSStudent*CreateTable(){structSStudent*stu;stu=(structSStudent*)malloc(sizeof(structSStudent));stu->number=0;stu->score1=stu->score2=stu->score3=0;stu->name[0]='\0';stu->link=NULL;return(stu);}

voidAppendToTable(structSStudent*stu){structSStudent*next,*last;intnumber;last=stu;while(last->link)last=last->link;printf("Pleaseinputthenumber(0toquit):");scanf("%d",&number);while(number){next=(structSStudent*)malloc(sizeof(structSStudent));next->number=number;printf("Pleaseinputname:");scanf("%10s",next->name);printf("Pleaseinputthefirstscore:");scanf("%d",&next->score1);printf("Pleaseinputthesecondscore:");scanf("%d",&next->score2);printf("Pleaseinputthethirdscore:");scanf("%d",&next->score3);last->link=next;last=last->link;printf("\nPleaseinputthenumber(0toquit):");scanf("%d",&number);}last->link=NULL;}

voidInsertToTable(structSStudent*stu){structSStudent*next,*last;intnumber;printf("Pleaseinputthenumber(0toquit):");scanf("%d",&number);while(number){next=(structSStudent*)malloc(sizeof(structSStudent));next->number=number;printf("Pleaseinputname:");scanf("%10s",next->name);printf("Pleaseinputthefirstscore:");scanf("%d",&next->score1);printf("Pleaseinputthesecondscore:");scanf("%d",&next->score2);printf("Pleaseinputthethirdscore:");scanf("%d",&next->score3);last=stu;while(last->link){if(last->link->number>next->number){ next->link=last->link; last->link=next; break;}elselast=last->link;}printf("\nPleaseinputthenumber(0toquit):");scanf("%d",&number);}}

voidQueryTable(structSStudent*stu,unsignednumber){structSStudent*temp,*next;next=stu;while(next->link){if(next->link->number==number){temp=next->link;next->link=next->link->link;free(temp);}elsenext=next->link;}}

voidPrintTable(structSStudent*stu){stu=stu->link;if(!stu){puts("ThetableisEMPTY!");return;}printf("number\tname\t\tscore1\tscore2\tscore3\n");while(stu){printf("%3d\t",stu->number);printf("%-10s\t",stu->name);printf("%4d\t",stu->score1);printf("%4d\t",stu->score2);printf("%4d\t\n",stu->score3);stu=stu->link;}}

voidSortTable(structSStudent*stu){structSStudent*next,*last,*temp;intflag;last=stu;while(last->link){next=stu;flag=1;while(next->link!=last->link){if(next->link->number>last->link->number){ temp=last->link; last->link=last->link->link; temp->link=next->link; next->link=temp; flag=0; break;}elsenext=next->link;}if(flag)last=last->link;}}

voidSave(structSStudent*stu){unsignedcharfilename[13];FILE*fileSave;printf("Pleaseinputthefilenameyouwantsavein:");scanf("%s",filename

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论