




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计上机实验指导讲义L C语言程序设计上机实验指导讲义实验报告书写格式(供参考):C语言程序设计上机第 次实验报告实验名称: 姓名: 学号 班级 实验类型 1、 实验目的(1).(2) .2、 实验(设计)内容 (包括实验(设计)步骤、上机(设计)内容,程序清单,运行结果等)(1). .(2) .3、 实验体会 (1).(2).目 录C程序设计上机实验指导讲义1实验报告书写格式(供参考):IC语言程序设计上机第 次实验报告I目 录II实验一、I/O操作及顺序结构、分支结构程序设计3一、实验目的:3二、实验内容:3实验二、循环结构程序设计4一、实验目的:4二、实验内容:4实验三、数组程序设计7一、实验目的:7二、实验内容:7实验四、指针程序设计9一、实验目的:9二、实验内容:9三、补充资料10实验五、指针、函数程序设计13一、实验目的:13二、实验内容:13实验六、结构体程序设计17一、实验目的:17二、实验内容:17实验七、综合设计实验18一、实验目的:18二、实验内容:18三、实验步骤:19四、大型程序设计注意事项:19 19实验一、I/O操作及顺序结构、分支结构程序设计一、实验目的:1. 掌握C语言各种标准函数的使用,并学会通过在线帮助了解标准函数使用方法以及对应的头文件;2. 掌握C数据输入输出方法,包括格式化I/O、字符串I/O,可以选择掌握C+流输入输出cin/cout;3. 掌握预编译命令#define和#include的使用;4. 学会正确使用逻辑运算符及逻辑表达式,注意“= =”“=”的区别;5. 掌握顺序结构;6. 掌握选择分支结构的使用,包括if语句 和switch语句(两种形式);7. 注意培养良好的程序设计习惯和风格.通过编程及上机调试,提高编程能力。二、实验内容:1、 自行编程理解scanf和printf的各种格式说明,体会格式说明的类型要与输入/输出参数类型的一致性. 2、 参考在线帮助理解gets()、puts()、putchar()、getchar()、cin、cout等函数(类)的使用方法,试着编写程序实现输入输出操作,并体验行缓冲输入方式,以及重定向的含义;3、 输入华氏温度,要求输出摄氏温度,公式为:C=5/9*(F-32),输出要求文字说明,取2位小数。4、 试编程将阳历年365.2422天换算成几天几小时几分几秒?(注意:秒的结果是带小数的,试试存放秒的变量分别用float,double,long double定义,看结果有什么区别?)5、 口令编码:从键盘输入8位字符,对其进行编码,编码规律:将顺序输入的8位字符同生日(如19820928)进行按位异或(如输入“students”,s对1,t对9,.),输出编码结果。6、 写出下面表达式运算后a的值,设原来a=10。设a和n已定义成整型变量。(1)a+=a (2)a-=2(3)a*=2+3 (4)a/=a+a(5)a%=(n%=2),n的值等于5 (6)a+=a-=a*=a先自己分析,再试着编写程序求解,看得到的结果是否一致。7、 运行程序:#include #include void main() int i; char c; scanf(%d,&i); scanf(%c,&c); couti=iendl; coutc= 32?c:?)100|score=90)grade=A;else if(score=80)grade=B;elseif(score=70)grade=C;elseif(score=60)grade=D;else grade=E;printf(nthe student grade:%c,grade); 请把上述程序改为采用switch语句编写,写出程序,调试运行并输入测试数据,输出成绩等级。9、 编写程序求 s=z+x+yex+yx0 , y0z =e2x-y0=x=0ln xx=1【基本要求】:.打开math.h头文件(在bc或tc目录下的include子目录中),寻找要求的函数原型。. 分析问题,输入是什么,输出是什么,处理过程如何用if语句构造,编制可读性好的程序(利用缩进规则,空行规则,学会附加注释)。【测试数据】分析下面几组数据的测试结果:1)、-1 -62)、-3.1-2.53)、0.6-4.44)、0.785)、3-2【思考】:用switch语句实现有什么困难?程序如何防止不在这些条件内的数据输入?实验二、循环结构程序设计一、实验目的:1. 掌握while、dowhile和for三种循环语句的使用;2. 掌握流程控制语句continue、break、goto的使用。3. 利用C/C+开发环境的在线帮助自学C/C+语言(BC+环境下用F1、Alt+F1、Shift+F1,VC+环境下用F1看帮助),进一步掌握查找与修改编译错误以及学习调试的方法。二、实验内容:【一般示例】【例1】 求5!#include void main()int n,t;n=1;t=1;while(t=5)n=n*t;t=t+1;printf(“%d”,n);【例2】 求和s=1!+2!+3!#include void main()int n,s=0,t=1;for(n=1;n=3;n+)t=t*n;s=s+t;printf(“%dn”,s);【例3】 求和s= 3+33+333#include void main()int s=0,t=3,i;for(i=1;i=3;i+)s=s+t;t=10*t+3;printf(“%dn”,s);【例4】 有一数列:2/1,3/2,5/3,8/5,求出这个数列的前10项之和。#include void main()int n,t,;float a=2,b=1,s=0;for(n=1;n=10;n+) s=s+a/b;t=a;a=a+b;b=t;printf(“%fn ”,s); 【典型示例】用牛顿迭代求方程2x3-4x2+3x-6=0在1.0附近的根。#include void main()float x,x0,f,f1;x=1.0;do x0=x;f=(2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x=x0-f/f1;while(fabs(x-x0)=1e-5);printf(“%6.2f”,x);以下为上机编程实现:1、 编写一个程序,计算【基本要求】:用下述方式分别编程并比较结果: 从左到右各项相加;从右到左各项相加;从左到右各个正项和负项分别相加;从右到左各个正项和负项分别相加;【思考】: 三种循环结构for、while、do while都能实现吗? 如果n(项数)由程序运行时输入确定,程序应如何修改? 如果精度要求|sn-sn-1|1e-8,则程序如何修改,此时n的值是什么?2、 编写一个程序求整数n阶乘(n!)【基本要求】:每三个一行,共输出从1-21个数的排列,如下所示:1!12!23!64!245!1206!720【思考】:1)计算20的阶乘时遇到什么困难,怎么解决?(提示:考虑数据类型,printf时还要考虑指定与该类型对应的格式说明)2)设计一个循环,不断提示用户任意输入一个整数,计算该整数的阶乘并输出显示,直到用户输入负数终止循环。3、 输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。(用getchar、while、if-else if-else实现)4、 用迭代法求x= a 。求平方根的迭公式为Xn+1=1/2*(xn+a/xn)要求前后两次求出的x的差的绝对值小于10-55、 输出500以内的所有亲密数,并输出所有亲密数之和。要求:1)程序中既要有for循环也要有while或dowhile循环2)在输出每对亲密数时,小数在前、大数在后,并去掉重复的亲密数对,例如:220和284是一对亲密数,而284和220也是一对亲密数,只输出220和284这对“亲密数”3)输出要有文字说明。输出时每对亲密数用一对圆括号括起来,两数间逗号隔开,每对占一行4)“亲密数”定义:如果自然数M的所有因子(包括1不包括M本身)之和为N,而N所有因子和为M,则M和N为一对亲密数。如:6所有因子和1+2+36,所以,6和它自身构成一对“亲密数”。6、 输入一个十六进制数,输出相应的十进制数。实验三、数组程序设计一、实验目的:1 掌握一维、二维数组定义、引用、初始化的方法;2 掌握字符数组和字符串库函数的使用;3 掌握与数组有关的算法(排序与查找与矩阵运算);4 进一步熟悉C开发环境中调试、跟踪的使用。二、实验内容:1、 用交换法(又叫冒泡法)对10个整数升/降序排列输出(要求:外层循环变量代表的轮次号从0开始编号)2、 编程实现字符串拷贝、比较功能,要求不能使用系统库函数strcpy、strcmp。3、 有15个数存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出,要找的数用scanf函数输入。4、 输入一组实数,按录入顺序保存进数组arr中,采用选择法对其排序,任意输入一数,直接在arr数组中将其按序插入相应位置。(不允许使用其它数组来完成)5、 上机写出下面程序的运行结果并与自己分析结果比较:#include char str=“SSSWILTECH1111W1WALLMP1”;void main( ) int k; char c; for(k=2;(c=strk)!=0;k+) switch(c) case A:putchar(a);continue; case 1:break; case 1 :while(c=str+k)!=1&c!=0) ; case 9:putchar(#); case E: case L:continue; default:putchar(c);continue ; putchar(*); puts(“”) ;6、 编程实现将一行字符串中最长的单词输出。7、 输入一串字符,以“?”结束。统计各字母出现的次数,并按字母出现的多少输出(先输出次数多的,次数相同的按字母表顺序输出,不出现的字母不输出)。如:输入:5B3A+4-HDEH5DH?要求:排序方法任选交换法和选择法中一种输出:H3D2A1B1E18、 输入一段以回车换行终止的英文语句,要求将句中的多余空格删掉(允许在单词之间有一个空格),然后将句中单词首字母全改成大写输出。要求:该英文语句保存进数组中,删除多余空格及大写首字母均在同一个数组中进行。9、 编程求一个33矩阵对角线元素之和。实验四、指针程序设计一、实验目的:1、 进一步熟悉开发环境,掌握编译、连接和调试的技巧;2、 理解指针的概念,掌握指针变量的定义与引用;3、 掌握使用数组的指针和指向数组的指针变量;4、 掌握使用字符串的指针和指向字符串的指针变量。二、实验内容:1、 上机调试并理解下述例题:找错并作理解说明:#include void main(void)int a10,i,*p;for(i=0,p=a ; pa+10 ; p+,i+) *p = i+1;for(i=0 ; i10 ; i+,p+) cout*pendl;2、 编程实现:输入一个字符串,内有数字和非数字符号,如:a123x456 17960?302tab5876。将其中连续的数字作为一个整数,依次存放到一个数组a中。例如:123放在a0中,456放在a1中试统计共有多少个整数,并输出这些数。要求添加合适的注释。3、 利用指向指针的指针方法对6个字符串按字典顺序排序并输出。4、 利用指向指针的指针的方法对N个整数排序并输出。5、 编程实现,先读入一段正文,然后删除其中单词from、in、at、an和on,最后显示该结果文本段。6、 理解教材示例:例6.9,例6.10,例6.14三、补充资料关于内存的管理在C/C中的深度理解:内存分配方式有三种:(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,管理自动,但是分配的内存容量有限。(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new(C+运算符) 申请任意多少的内存,程序员自己负责在何时用free 或delete(C+运算符) 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。malloc/free 的使用要点函数malloc 的原型如下:void * malloc(size_t size);用malloc 申请一块长度为length 的整数类型的内存,程序如下:int *p = (int *) malloc(sizeof(int) * length);我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。u malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。u malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。我们通常记不住int, float 等数据类型的变量的确切字节数。例如int 变量在16 位系统下是2 个字节,在32 位下是4 个字节;而float 变量在16 位系统下是4 个字节,在32 位下也是4 个字节。在malloc 的“()”中使用sizeof 运算符是良好的风格,但要当心有时我们会昏了头,写出p = malloc(sizeof(p)这样的程序来。u 函数free 的原型如下:void free( void * memblock );为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p 的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。常见的内存错误及其对策如下:u 内存分配未成功,却使用了它。编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果是用malloc 或new 来申请内存,应该用if(p=NULL) 或if(p!=NULL)进行防错处理。例如:char *p = (char *) malloc(100);if(p=NULL) exit(1);strcpy(p, “hello”);u 忘记了释放内存,造成内存泄露。含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。但最终程序会突然死掉,系统出现提示:内存耗尽(out of memory)。动态内存的申请与释放必须配对,程序中malloc 与free 的使用次数一定要相同,否则肯定有错误(C中采用的new/delete 同理)例如:void GetMemory(char *p, int num)p = (char *)malloc(sizeof(char) * num);/不要以为局部变量p的内存空间会自动被回收,就能保证指针p指向的内存空间也会被回收,这是做不到的。void main() char *str = NULL;GetMemory(str, 100); / str 仍然为NULL,形参的变化不影响实参strcpy(str, hello); / 运行错误,同时另外隐藏的问题就是malloc分配的堆空间没有被释放u 释放了内存却继续使用它。有三种情况:(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。(2)函数的return 语句写错了,注意不要返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。(3)使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”例如:char *p = (char *) malloc(100);if(!p) exit(1);strcpy(p, “hello”);free(p); / p 所指的内存被释放,但是p 变量本身空间没有释放,其值代/表的所指内存的地址仍然不变。if(p != NULL) / 没有起到防错作用strcpy(p, “world”); / 出错,即便p 不是NULL 指针,它已不指向合法/的内存块/此时的p指针是典型的“野指针”,它所指内存中保存的是垃圾内容。从上面的分析可以发现指针有一些“似是而非”的特征:(1)指针变量本身消亡了,并不表示它所指的内存会被自动释放。(2)内存被释放了,并不表示指针会消亡或者成了NULL 指针。要坚决杜绝“野指针”,“野指针”不是NULL 指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if 语句很容易判断。但是“野指针”是很危险的,if 语句对它不起作用。 “野指针”产生的原因:(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL 指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如char *p = NULL;char *str = (char *) malloc(100);(2)指针p 被free 或者delete 之后,没有置为NULL,让人误以为p 是个合法的指针。如上例。试着单步跟踪分析下面程序出现乱码而不输出hello world的原因:#include char *GetString(void)char p = hello world;return p; / p指针指向哪一类内存空间?void main(void)char *str = NULL;str = GetString(); cout str endl; 写出你对结果的理解。实验五、指针、函数程序设计一、实验目的:1 理解函数定义和函数原型说明的方法,掌握函数调用中实参与形参的对应关系,理解“传值”和“传指针”;2 掌握递归函数定义和调用的方法。3 掌握指针和函数的结合4 掌握含多个源文件的程序的编译、连接和调试运行的方法。5 进一步熟悉C开发环境中调试的使用二、实验内容:在实际的程序设计中,通常要求实现在A函数中使用B函数中定义的数组,这就要需要传递数组的指针,实参常用数组名或指针变量来表示,B函数的形参用形参数组名变量或指针变量来表示,它们的参数传递通常有四种组合。【1】 int max (int x,int n)int i,max; max =x0; for (i =1;imax) max =xi; return max ;void main()int a10,i; for (i=0;i10;i+) scanf (“ %d ”,&ai) ; max (a,10) ; .【2】int max (int *x,int n) int *p,max; max =*x; for (p =x+1;pmax) max =*p; return max ;void main() int a10,i,*p; for (i=0;i10;i+) scanf (“ %d ”,&ai) ; p =a ; max (p,10) ; .【3】int max (int x,int n) int i,max; max =x0; for (i =1;imax) max =xi; return max ;void main()int a10,i,*p; for (i=0;i10;i+) scanf (“ %d ”,&ai) ; p =a ; max (p,10) ; .【4】int max (int *x,int n) int *p,max; max = *x ; for (p =x+1;pmax) max =*p; return max ;void main()int a10,i; for (i=0;i10;i+) scanf (“ %d ”,&ai) ; max (a,10) ; .理解形参分别是数组名变量和指针变量时元素逐个引用的方法(下标的自增和形参指针变量的移动两种方法),这四种参数传递方式可以灵活运用到下面的编程中。1、 用函数bubble()实现交换法(又叫冒泡法)对10个整数升序排列输出(要求:轮次号从0开始),算法采用数组一章中介绍的冒泡排序法,思考能否对算法改进以便在无序程度较低时减少轮次数;2、 选择法实现上面的操作(同样用函数实现)3、 字符串拷贝、比较,要求用函数编程实现,代替strcpy()、strcmp().4、 有15个无序数存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出,要找的数用scanf函数或Cin输入。(要求折半查找算法用函数实现,排序直接使用题1中的bubble()函数)5、 上题,任意输入一数,将其按序插入进相应位置。(要求插入算法用函数实现)6、 写一个函数,使给定的一个二维数组(3*3)转置,即行列互换。7、 理解运行一个递归函数,实现将任意的十进制正整数转换为八进制数。#include int ten_to_eight(int val, char a) int b, t, i; b = val % 8; t = val / 8; if (t 0) i = ten_to_eight(t, a); else i = 0; ai = b + 0; ai+1 = 0; return (i + 1);void main() int v; char s80; printf(Enter a number : ); scanf(%d,&v); ten_to_eight(v,s); printf(result : %sn,s);8、 下面的例子为递归法求阶乘的程序,程序编译连接后运行时发现无论敲入任意数值,其输出结果均为0。请通过调试跟踪找出程序中错误,并以此程序写一点你对递归函数的理解,比如:函数形参在堆栈中的分配、递归的执行过程、递归函数编制中需要注意的地方等等。#include long fact(int);void main() int n; scanf(%d,&n); long fact_rtn; fact_rtn =fact(n);/! printf(n!=%ldn,fact_rtn);long fact(int x) long rtn; if(x=0) rtn =1; else rtn =x*fact(-x); return rtn;调试时,fact()改成:long fact(int x) long rtn; int xingcan; xingcan =x ; if(x=0) rtn =1; else rtn =x*fact(-x); return rtn;在VC+中调试时,将光标放在!行按shift+F5(debug)然后不断按F11在界面右下角的watch窗口中输入xingcan和x观察两变量的值。从中发现错误。9、 上机编程:p.230四、编程题4(考虑连续出现字符C的情况),8,14,15要求调试通过后再写在上机报告上,另添加合适的注释。实验六、结构体程序设计一、实验目的:1、 掌握结构体类型的说明和结构体变量的定义;2、 掌握结构体变量成员的引用和对结构体变量的初始化;3、 掌握结构体数组及结构体指针变量的定义及使用。4、 理解并掌握结构体在函数间的传递;5、 进一步掌握复杂程序编译、连接和调试的技巧。二、实验内容:1、 建立一个考生人员情况登记表,表格内容如下:学生证号姓 名性 别出生日期(年月日)无符号整型字符数组型字符型M为男W为女结构体类型要求:(1)、正确定义该表格内容要求的数据类型;(2)、分别输入各成员项数据,并打印输出(为简便起见,假设只有3名考生)。2、 编程实现:(1)输入10个职工姓名和工资,(2)按职工姓名由小到大排序,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《幼儿教师招聘》真题含答案详解【考试直接用】
- 安全文明施工组织设计内容
- 2025一建《水利水电工程管理与实务》考前十页纸(完整版)
- 2025年教师招聘之《小学教师招聘》试卷含答案详解(培优)
- 教师招聘之《小学教师招聘》题型+答案(考点题)附参考答案详解(夺分金卷)
- 押题宝典教师招聘之《幼儿教师招聘》通关考试题库及参考答案详解(培优a卷)
- 教师招聘之《幼儿教师招聘》综合检测提分附参考答案详解(预热题)
- 教师招聘之《幼儿教师招聘》考试综合练习含答案详解【能力提升】
- 2025年四川宜宾屏山县发展和改革局招聘编外聘用人员4人笔试备考题库及完整答案详解1套
- 2025江西吉安市青原区司法局招聘2人笔试备考题库及答案解析
- 统编版语文四年级上册-2024-2025学年习作:小小动物园课件
- 口腔门诊药品管理制度
- 2025石油交易居间合同石油居间协议
- 初中拔高几何题目及答案
- 2024小学劳动技术课标考试模拟试卷及参考答案
- 人保农险理赔员考试题及答案
- JG/T 328-2011建筑装饰用石材蜂窝复合板
- 炼钢钢厂辅料管理制度
- 工程项目廉洁培训
- 2025年年中考物理综合复习(压轴特训100题55大考点)(原卷版+解析)
- 井工煤矿智能化管理培训课件
评论
0/150
提交评论