哈工大(威海)c语言实验报告册答案
实验1简单判定性问题求解 一、实验学时 完成本实验需4学时。 二、实验目的 1、阅读程序题 (1)掌握C语言数据类型,熟悉如何定义一个整型、字符型的变量,以及对它们赋值的方法; (2)掌握不同的类型数据之间赋值的规律; (3)掌握数据在内存中的存储方式; (4)学会输入、输出函数的基本格式和使用方法; (5)学会使用有关算术运算符、逻辑运算符、关系运算符,以及包含这些运算符的表达式。 2、编程题 (1)如何运用if-else判定性结构进行程序设计; (2)如何运用switch判定性结构进行程序设计。 3、调试题 (1)熟悉C程序的编辑、编译、连接和运行的过程。 三、实验指导 为了达到最佳的实验效果,以下提供几条适于编程的指导意见,可供参考。 1、阅读程序题应先运用自己在课堂所学的知识,推导出结果,在上机时输入计算机,印证自己推导的结果,注意观察数据在内存中的存储方式、含不同种运算符表达式的输出结果。 2、编程题必须首先画出流程图,并反复思考判断程序设计的正确性,完成程序的设计。要注意简单判定性问题的结构选择。 3、调试题应明确程序的调试、测试是一项非常烦琐的工作,也是非常重要的工作。对于初学者来说应该建立良好的习惯,在调试程序的时候,应该尽可能考虑到程序运行时各种可能情况。 四、实验内容 1、阅读程序题 (1)main( ) { /*定义字符型变量*/ char c1,c2; /*向字符变量赋以整数*/ c1=97; c2=98; printf(“%c %c\n“,c1,c2); /*以字符形式输出*/ printf(“%d %d\n“,c1,c2); /*以整数形式输出*/ } 该程序的输出结果是 a b(换行)97 98 。 思考:可否改成int c1,c2;输出结果是? 相同 (2)main() { int a=7,b=5; printf(“%d\n“,b=b/a); } 该程序的输出结果是 0 。 思考:若将printf语句中%d变为%f,可否输出分式的值? 可以 (3)main() { int a=9; a+=a-=a+a; /*包含复合的赋值运算符的赋值表达式*/ printf(“%d\n“,a); } 该程序的输出结果是 -18 。 思考:赋值表达式a+=a-=a+a的求解步骤? 第一步:a=a-(a+a)=-9 第二步a=a+a=18 (4)main() { int k=-1; printf(“%d,%u\n“,k,k); } 该程序的输出结果是 -1 4294967295 。 思考:-1在内存中的存储形式? 取反加一 11111111111111111111111111111111(32个) (5)main() { unsigned x1; int b=-1; x1=b; /*有符号数据传送给无符号变量*/ printf(“%u“,x1); } 该程序的输出结果是 4294967295 。 思考:不同类型的整型数据相互赋值时,规则是什么? (6)main() { int a=3,b=4,c=5; printf(“%d\n“,(!(a100||scorehigh) printf(“\n %d is not in data[]“,num); /*若low大于high,则查找失败*/ } 程序中包含有一些错误,按下述步骤进行调试。 程序调试记录 1、程序出现的错误及改正 1.用{}把十四十五行括起来 2.第十行i=1改成i=0; 2、程序的改进 1.把七八九三行与十十一两行换一下位置,方便用户操作; 实验5 深入模块化设计与应用 一、实验学时 完成本实验需4学时。 二、实验目的 1、阅读程序题 (1)学会使用函数嵌套调用的使用方法 (2)学会使用一维数组做为函数参数 (3)递归调用的设计与使用 (4)学会使用指针做为函数的参数 2、编程题 (1)如何运用指针进行程序设计 (2)如何以一维数组、二维数组做为函数参数进行程序设计 (3)冒泡排序、选择排序的灵活应用 三、实验指导 为了达到最佳的实验效果,以下提供几条适于模块化编程的指导意见,可供参考。 1、阅读程序题应先运用自己在课堂所学的知识,推导出结果,在上机时输入计算机,印证自己推导的结果,注意观察函数嵌套调用、一维数组做为函数参数、指针做为函数的参数、递归调用的使用方法。 2、编程题必须首先画出流程图,并反复思考判断程序设计的正确性,以面向过程的、模块化设计方法完成程序设计。要注意变量设置、函数参数及返回值在数据传递或共享中的重要作用。 四、实验内容 1、阅读程序题 (1)int func(int a, int b) { return (a+b);} void main() { int x=2,y=5,z=8,r; r=func(func(x,y),z); printf(“%d\n”,r); } 该程序的输出结果是 15 。 (2)int f(int b[], int n) { int i,r; r=1; for(i=0;i2) return(fib(n-1)+fib(n-2)); else return(2); } void main() { printf(“%d\n”,fib(3));} 该程序的输出结果是 4 。 (4)int f(char *s) { int k=0; while(*s) k=k*10+*s++-‘0’; return(k); } 以f(“1234”)方式调用该函数,结果 1234 。 (5)void sort(int *b,int n) { int i,j,k,t; for(i=0;inum); } } void main() { struct line *phead; phead=Create(); Output(phead); } #include #include #include struct line {int num; struct line *next;}; struct line *Create() {struct line *pHead=0,*pNew; int nCount=0,i; while(1) {pNew=(struct line *)malloc(sizeof(struct line)); for(i=9;i>0;i--) {nCount++; pNew->num=i; pNew->next=0; pHead->next=pNew; pHead=pNew;} if (i=0) break; 五、程序调试记录 1、程序出现的错误及改正 2、程序的改进 实验8数据永久性存储用 一、实验学时 完成本实验需3学时。 二、实验目的 1、阅读程序题 学习文件指针的概念,熟悉并掌握各种基本文件操作函数,以及如何进行文件基本操作。 2、编程题 (1)如何运用文件指针进行文件的打开、关闭操作;了解常用的文件打开模式;了解文件存储的相对路径和绝对路径的区别 (2)了解各种文件打开方式、字符读写、字符串读写、数据块读写等不同函数之间的区别以及实现方式。 3、作为全书最后一章,本章的实验内容结合了前面几章的知识,培养学生的综合编程能力。 三、实验指导 本章内容相对固定,没有给初学者更多的灵活发挥空间,因此相对容易掌握;但同时本章涉及到的基本文件操作函数较多,而且要求能够准确运用。因此本章实验需要注意以下几点。 1、上机前要求熟悉各种文件读写函数,包括参数、返回值、调用方式以及功能,必要的时候需要一点点“死记硬背”(本课程大部分内容没有这种要求)。在上机时通过读程序和实际编程,巩固对上述函数的功能和使用方法的了解。 2、编程题的测试数据要求学生自己构建,在构建文件时要注意多尝试各种可能发生的情况,例如特殊字符;中英文字符混合;空行等等,观察程序的运行结果。 四、实验内容 1、阅读程序题 (1) #include main( ) { FILE *fp; int i,k=0,n=0; fp=(“d1.dat“,“w“); for(i=1;i1),每个记录有两个字段:一个是英文单词,另一个是相应的汉语解释。各个记录按英文单词的词典顺序排列,各英文单词并不重复。 要求编写一个用于维护、更新该英汉词典文件的函数。维护、更新的方法是:首先读入英汉词典文件,并将读入的N个英文单词和相应的汉语解释依次存放在一个结构体数组中。输入一个英文单词及其汉语解释,然后在该数组中查找输入的英文单词,若找到,则用输入的汉语解释更新原有的解释;若找不到,则需要将输入的英文单词及其汉语解释插入到该数组的适当位置,使各记录仍按英文单词的词典顺序排列。最后将数组输出,形成新的英汉词典文件,算法结束. 测试数据: 输出结果: 流程图 程序代码 (2)将若干个原始文件合并成一个文件,然后键盘输入k值,在合并文件中恢复出其中第k个原始文件。要求采用三个函数实现:文件合并函数、文件恢复函数、主函数。 提示:合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为: typedef stmct { char file_name[256]; /*原始文件名*/ long length; /*原始文件长度(字节数)*/ long offset; /*原始文件在合并文件中的位置(偏移量)*/ }FileInfo; 最后通过控制信息恢复出原始文件。 程序代码 流程图 测试数据: 输出结果: 五、程序调试记录 要求:写出题号,并编写顺序号。如四(1)出现的错误 (1)······ (2)······ 1、程序出现的错误及改正 2、程序的改进