C语言实验报告《逻辑结构程序设计》(精选13篇)
1.C语言实验报告《逻辑结构程序设计》 篇一
黔南民族师范学院 C语言程序设计上机实验报告
系部:计算机科学系 年级:2013 级 班级:
姓名:
学号:
实验时间:
实验成绩:
2013年月日
实验三顺序结构程序的设计
一 实验名称:顺序结构程序的设计
二.实验环境:windows XP系统,VC++6.0软件
三.实验目的:
四.实验内容:
五.算法描述流程图
六.源程序
七.测试数据及运行结果
八.实验心得
实验成绩评分要求
1、原创性发现抄袭或雷同成绩为0分
2、正确性程序正确60分
3、可读性格式清楚,有注释,变量命名规范20分
4、健壮性对特殊测试数据有考虑有测试10分
5、效率程序运行效率高10分
2.C语言实验报告《逻辑结构程序设计》 篇二
在我们的研究对象中,在社会系统中的人类生存问题、进化问题,还有在经济系统中的经济增长问题、股票问题、市场预测等等方面,具有动态模糊性的问题是普遍存在的。如,在知识处理系统中,常常会有这样的例子:“天渐渐昏暗下来了”,此例中的“渐渐”和“昏暗”就分别具有“动态性”和“模糊性”。苏州大学的李凡长教授在1996年以美籍伊朗数学家L.A.Zadeh在1973年提出的模糊逻辑为理论基础,提出了动态模糊逻辑(DFL)[1]作为解决动态模糊问题的理论工具,到目前为止已取得了一系列研究成果。为了进一步推动DFL的广泛应用,使其成为一种切实可实现的逻辑系统,我们有必要对动态模糊问题的解决提供软件支持,研究设计一种可以模拟处理动态模糊问题的程序设计语言。
现有的比较常用、比较流行的高级程序设计语言,如,C语言、VC++、JAVA、.Net类语言等基本上都适用于对精确的、确定性的数据和结构进行处理。当然也有一些比较特殊的程序设计语言,如,唐秩松院士领导的科研小组以时序逻辑为理论工具研制并实现的时序逻辑语言XYZ/E[2]可以在一定程度上解决动态性问题,国内外专家学者研究的Fuzzy Prolog[3,4]和武汉大学陈世鸿教授正在研究设计的FLL语言[5,6]等用来研究解决模糊性问题。经过分析我们发现可以解决动态模糊性问题的程序设计语言不多见,李凡长教授曾在文献[7]中给出过动态模糊数据程序设计语言的一个框架,除此之外,到目前为止,极少有人再尝试去研究设计可以解决动态模糊问题的程序设计语言。本文试图做这方面的研究工作,鉴于DFL程序设计语言的初始研究阶段,我们将先通过结构化操作语义给出它的语言定义。
1 基本概念
1.1 动态模糊数据[8]
公约1 把既是“动态的”又是“模糊的”的数据特性称作动态模糊性。
公约2 把具有动态模糊性的数据称作动态模糊数据。
例1 她越来越帅气了。“越来越”体现了“动态性”;“帅气”体现了模糊性,因此把整个子句称作动态模糊数据。
1.2 动态模糊逻辑(DFL)简介
略,参看文献[1]。
2 动态模糊逻辑的程序设计语言的语法
要定义一种程序设计语言,最基本的是要定义它的语法和语义。动态模糊逻辑的程序设计语言与以往的程序设计语言的重要区别在于它可以处理动态模糊数据。要做到这一点我们可以借鉴Dijkstra所提出的监督命令的程序结构[9,10],这种程序结构的特点是在程序中引入了不确定性,为每个可能被执行的语句提供一个监督条件。
从文献[1]中我们知道动态模糊集是由指称集到[0,1]×[←,→]的映射来定义的,为了引入动态模糊集我们有必要增加一个特殊集合D=[0,1]×[←,→],程序中的每个变量通过映射对应到D集合中的一个元素,以描述隶属度。下面我们给出DFL程序设计语言的抽象语法。
S::= skip|
abort|
(S;S)|
if G fi|
do G od
G::=B→S|
(G□G)
E rel E
上述语法的语法范畴是:
S是语句集
E是表达式集
G是监督命令集
B是布尔表达式集
op表示运算操作
Bop表示布尔运算
rel表示关系运算
只给出抽象语法是不够的,我们还需要给出每一个结构的精确定义,也就是给出语句的语义。
3 动态模糊逻辑程序设计语言的结构化操作语义
定义语义的方法[9]有很多种,主要的有:操作语义、指称语义、公理语义和代数语义。鉴于操作语义可以得到语言的抽象模型,对实现者具有很好的指导意义的优点,本文将使用操作语义给出动态模糊逻辑的程序设计语言的抽象模型。操作语义有多种不同的描述方法[9]。在这里我们采用Plotkin在1981年提出的结构化操作语义[9],它的基本思想为:复合成分的操作语义应该可以归结为它的各个组成部分的操作语义。我们用一个三元组<DFSC,DFO,DFSS>的形式给出动态模糊逻辑的程序设计语言的结构化操作语义模型,其中DFSC表示动态模糊语法范畴,DFO表示动态模糊算子,DFSS表示动态模糊语义。
3.1 动态模糊语法范畴DFSC
动态模糊语法范畴指的是语言所使用的所有语法符号。在第三部分的抽象语法中我们已经给出了我们所要设计的程序设计语言的语法范畴,在这里就不赘述了。
3.2 动态模糊算子DFO
动态模糊算子DFO用[←,→]表示,表明在某一时刻,其当前状态有两种发展趋势:“→”指示好的或前进的趋势,“←”指示坏的或后退的趋势。
3.3 动态模糊语义DFSS
动态模糊语义DFSS描述了具有动态性和模糊性语句结构的含义。在这里我们依据Plotkin的结构化操作语义引入动态模糊算子DFO即可得到动态模糊语义的基本内容。
从抽象语法中我们可以看出动态模糊程序设计语言的操作语义包含四种关系术语:表达式,布尔表达式,语句和监督命令。表达式与布尔表达式的模糊语义比较容易理解,在这我们就不具体给出,我们主要介绍动态模糊语句和动态模糊监督命令的语义。
3.3.1 语句
介绍两个状态:failure,当监督语句中的所有监督条件都不成立时执行条件语句出现的错误状态;abortion,因执行abort语句或由于其他原因而造成的程序不正常终止状态。
其中t表示t模数运算。
3.3.2 监督命令
摘要:动态模糊问题在客观世界中是普遍存在的,作为解决动态模糊问题的理论工具-动态模糊逻辑(DFL)已有十年的研究历史了,为了更有效地解决动态模糊问题,使DFL成为一种切实可实现的逻辑系统,有必要研究设计一种适合解决动态模糊性问题的程序设计语言。仿照监督命令的程序结构,给出动态模糊程序设计语言的结构化操作语义,其内容包括:动态模糊逻辑程序设计语言的抽象语法、动态模糊语义并通过一个简单实例说明其有效性。
关键词:动态模糊逻辑,动态模糊逻辑程序设计语言,结构化操作语义
参考文献
[1]李凡长,刘贵全,佘玉梅.动态模糊逻辑引论[M].昆明:云南科技出版社,2005,7.
[2]唐秩松,等.时序逻辑程序设计与软件工程[M].北京:科学出版社,2002.
[3]Munakata,Toshinori.Notes on implementing fuzzy sets in Prolog[J].Fuzzy Sets and Systems,1998,98:311317.
[4]HUA Hong,WANG Yi de.The Implementation of Fuzzy Prolog Lan-guage[J].Chinese Journal of Cumputer,1988,11(6):378383.
[5]陈世鸿,等.FLL语言的说明性语义与过程性语义[J].武汉大学学报:自然科学版,1999,45(3):287290.
[6]陈世鸿,等.模糊逻辑语言FLL的并行计算模型FPCM[J].数学物理学报,2002,22A(1):4854.
[7]李凡长,等.动态模糊数据模型及其设计语言[J].计算机科学,1997,24(12):4953.
[8]李凡长,等.动态模糊数据模型研究.计算机研究与发展,1998,35(8):714718.
[9]陆汝钤.计算机语言的形式语义.北京:科学出版社,1992,12.
3.C语言实验报告《逻辑结构程序设计》 篇三
许多院校的专业开设了C语言课程,将其作为学生学习程序设计技术的入门课程,这与C语言的特点是分不开的。C语言不但可以编写系统软件,而且可以根据用户的需要编写出满足用户要求的应用软件,尤其是C语言具有很好的对计算机的硬件编程能力。同时,C语言具有逻辑性强、处理问题周密、严谨的特点,是集知识和技能于一体,实践性很强的课程。学生通过学习C语言可掌握程序设计的一些基本方法和技巧。然而C语言的数据类型较多、表达式丰富、语法结构较复杂,使它成为一门教师难教、学生难学的课程。因此,在重视理论教学的同时,必须加强实验环节。只有上机实践才能正真学会如何编写程序和调试程序,体会到“优化”程序;也只有通过上机实践才能更好地掌握程序设计的理论知识。然而,在C语言实验课中,我这两年的教学观察中发现普遍存在以下几个问题:
第一,学生没有明确的实验目标,实验兴趣不大。上机时一些学生无所事事或玩游戏,不但害了自己,还影响其他同学。第二,现有教材中上机实验都立足于C语言本身的一些语言规则,和实际开发脱节,没有较容易理解和生动有趣的范例,比较死板、枯燥。第三、现有实验大多注重语句、语法等,没有把编程解题思路和程序测试等放在首位,对学生分析问题和解决问题的能力训练不够。
二、实验教学探讨
我在教学的过程中,职借鉴职业技术学院的职业性教学的经验,注重职业岗位能力与职业技能的训练,注重解决问题、分析问题和自学等能力的培养。在C语言实验上机课中,主要是引导学生突破传统的思维方式,培养学生读、写程序和调试程序的能力以及提高上机的学习兴趣和自主实验的方法技巧等。
1、简化入门实验,提高学生实验兴趣 学生大多已习惯于计算机的图形操作界面,且基础比较薄弱,动手能力相对也差,加上或多或少的惰性,而开始学习C语言后,突然进入的是一个纯英文的界面和纯键盘操作,这种反差很大。为减轻学生畏惧压力,让学生容易上手,可简化C语言的入门实验操作:(1)在桌面上创建TC的快捷方式,双击后可直接进入TC编辑环境。(2)在编辑、编译、连接及运行C语言程序时,教学生直接按F2键进行存盘操作,Ctrl+F9运行程序,Alt+F5看到运行结果。而没必要让学生先认识TC的菜单中每个英文单词的意义等,将TC环境的细节认识和程序的编译、连接等单步操作留到后面实验中逐步了解。学生一上机就能体会到成功,并利用发音和动画程序引起学生的兴趣。
2、设计针对性的实验 设计一些学生们比较感兴趣的编程题目,加强学生对程序错误的诊察和校正能力、测试关系和逻辑表达式的能力、程序代码优化能力等方面的培养。从输入输出语句上机开始,我有意设计了相应的上机实验。如在选择结构中,设计如下过程:
(1)实验内容和步骤:①例:有如下程序段(让学生填写成完整的程序):
if(a>b)scanf(“%d”,&x);
else scanf(“%d”,&x);
为了更容易看明白程序的逻辑结构,用流程图来加以描述。要求增加一些输入语句和输出语句,以便使上述程序段能在不同a,b和x值下运行,并且能观察程序流程经过(覆盖)了哪些语句、哪些分支及哪些路径。
②实验步骤:记下分别使用下列各组数据运行时的操作流程。
⑴a=1,b=1,x=1;
⑵a=1,b=1,x=2;
⑶a=3,b=0,x=1;
⑷a=2,b=0,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;
(2)分析讨论:①用哪一组数据就可以使程序段中的每个处理语句都执行一次?为了找出程序中2各条处理语句中的错误,应该使用什么样的数据对程序进行测试?请上机验证自己的结论。②用哪两组数据就可以使程序段中的每个分支都至少运行一次?这种情形与上面的讨论有何不同?如果为了找出程序中各分支中的错误,应该使用什么样的数据对程序进行测试?请上机验证自己的结论。③用哪两组数据就可以把判定框中的每个条件都运算一次?如果为了测试出判定条件中的错误,应使用哪些数据对程序进行测试?请上机验证自己的结论。④用哪四组数据才可以把各种条件的组合都检测一遍?如果为了测试各种条件组合的情形,应该使用什么样的测试数据?请上机验证自己的结论。⑤用哪四组数据才可以把从起始到终止的各条路径都覆盖一次?如果为了测试出程序在不同路径下的错误,应该使用什么样的测试数据?请上机验证自己的结论。
(3)进一步的实验:①从键盘输入三个数,代表三条线段的长度。请写一个判定这三条线段所组成的三角形属于什么类型(不等边、等腰、等边或不能构成三角形)的C程序。②请分别设计下列数据对自己的程序进行测试。
A.找出各条语句中的错误。
B.找出各分支中的错误。
C.找出各条件中的错误。
D.找出各种条件组合中的错误。
E.找出各条路径中的错误。
而在循环语句上机中,对学生进行代码优化训练,让学生学会删除多余运算、代码外提、强度削弱、变换循环控制条件等代码优化手段。通过这些上机实践,学生大致知道一些软件测试、程序优化知识,提高了学生上机的积极性,使学生从上机就是检验书本例题、习题中解脱出来。
3、设计综合性的实验 以往大多数学生在学完C语言后,普遍反映看得清程序的设计代码意义,但遇到实际问题就无从下手。这主要是教材上缺少实际意义的题目,为此,一定要设计短期上机实验任务与长期任务结合的上机内容。以一个大题目作为长期任务,再按不同功能模块分解开来,形成一个个短期任务。每一章学过之后要求完成一项或几项编程作业,而各章的编程作业不是孤立的,而是相互联系的,实际上它们都是一个较大型较复杂程序的组成部分。这样就可以使学生的任务形成一种连贯性,在整个学科的学习过程中始终都有一个总任务的驱动,而学生又在一个又一个短期任务的驱动下,体验着一次又一次迈向成功的喜悦。
例如,以“学生成绩管理系统”为课程设计的长期任务,从常用输入/输出语句printf和scanf开始,让学生编写主函数并在主函数中调用若干个空函数形成一个文本型菜单的雏形;学习常用数据类型后,再编写一个验证密码输入的函数;选择结构后,要求编写一个菜单选取函数;循环控制和数组后,要求建立班级课程的成绩输入输出函数;学完结构体类型后,要求使用结构体数组来存储和处理学生的信息;学习链表后,要求利用单链表动态管理学生的成绩;最后在“文件”这一章,要求利用文件操作完成学生成绩管理。当学完整个课程,完成了平时要求的各项编程作业之后,就会发现,原来自己完成的远不是一个一个零碎的程序段,而是在一块一块制作程序的各个部件,只要通过简单的程序拼装,就可以构成一个比较复杂的程序。这也在潜移默化中培养了学生采用各个击破的方法解决实际问题的意识。最后,学生从整体的角度来审视整个程序的设计,并通过上机进行综合调试,达到提高编程能力的目的。
4、采用协作方式的实验组织形式 协作学习由David W. 和Roger R. Jonson教授提出,是学生以小组形式参与、为达到共同的学习目标、在一定的激励机制下最大化个人和他人习得成果,而合作互助的一切相关行为。
采用这种形式在上机过程中,学生之间为了达到小组学习目标,个体之间可以采用对话、商讨、争论等形式对问题进行充分论证,以期获得达到学习目标的最佳途径。学生学习中的协作活动有利于发展学生个体的思维能力,增强学生个体之间的沟通能力以及对学生个体之间差异的包容能力。此外,协作学习对提高学生的学习业绩、形成学生的批判性思维与创新性思维、对待学习内容与学校的乐观态度、小组个体之间及其与社会成员的交流沟通能力、自尊心与个体间相互尊重关系的处理等都有明显的积极作用。
在尊重学生个体差异和一人一机基础上,利用局域网,将学生分成小组进行协作实验;将实验心得体会、结论等在网上共享。改变以前那种各自为阵,互不往来的实验组织方式。
三、结束语
4.C语言实验报告《逻辑结构程序设计》 篇四
一、、for(i=0;i T[2*d]=' Scanf(“%s”,&s)、#define ARR-SIZE 80; Inverse(char a); Str[i]=str[j]; 3、int f=1; 二、1、i<=n S+x[i] i2—i1+12、#include String strTemp[i] J++; 2、求圆环的面积。(函数的嵌套调用;定义求圆的面积和圆环面积实现)#include } float area_ring(float x,float y){ float c;c=fabs(area(x)-area(y));return(c);} float area(float r){ return(PI*r*r);} 3、设计求n!的函数(分别使用连乘和递归法)再调用函数求x!-y!+z!。递归 #include t*=i;return t;} void main(){ { unsigned int n;printf(“input a unsignded interger number:n”);scanf(“%d”,&n);printf(“%d!=%10ldn”,n,fac(n));} { (四)一、实验目的 1.掌握C语言中函数和模块 2.掌握怎样定义函数,如何调用或使用函数,如何声明函数 3.掌握函数的参数,了解在函数调用时,参数是如何传递的 4.在使用函数的过程中怎样确定函数的参数 5.如何使用局部变量和全局变量 二、实验内容 1.偶数判断 描述: 编写一个用户自定义函数,该函数有一个整型参数,函数的功能是:当这个整型数的值是偶数时,函数的返回值为0,当这个整型数的值是奇数时,返回值为1。编写一个程序,从键盘输入m个整数,分别调用用户自定义函数来判断这m个整数的奇偶性。 输入: 第一行为一个整数m,表示要判断m个整数的奇偶性;紧接着是m行,每行一个整数。 输出:有m行,分别对应输入的第2到第m+1行的整数的奇偶性 样例输入: 2 1 6 样例输出: 奇数 偶数 ·程序代码: #include“stdio.h” int isEven(int a){ if(a%2==0) return 1;else return 0;} int main(){ int m,i,b;scanf(“%d”,&m); for(i=1;i<=m;i++) { scanf(“%d”,&b); if(isEven(b)==1) printf(“偶数n”); else printf(“奇数n”); } return 0;} 2.温度转换 描述: 编写一个用户自定义函数,函数的功能是:将华氏温度转F换为摄氏温度C。转换公式为:C=5*(F-32)/9。编写一个程序,输出指定范围的华氏温度与摄氏温度的对照表,其中华氏温度步长为4。 输入: 两个空格隔开的整数n,m(且0 #include “stdio.h” float conver(int f){ return 5*(f-32)/9.0;} int main(){ int n,m,i;scanf(“%d%d”,&n,&m);for(i=n;i<=m;i+=4) printf(“%d%10.2fn”,i,conver(i));return 0;} 3.最大值函数 描述:编写一个用户自定义函数,该函数有三个整数参数,函数的功能是:求解这三个整数的最大值,函数的返回值为三个参数的最大值。编写一个程序,从键盘输入任意5个整数,分别两次调用用户自定义函数来求出这5个整数中的最大值。 输入:第一行为N,表示有N组数据,接下来是N行,每行是5个用空格隔开的整数(在VC++6.0 int范围)。输出:有N行,每行是对应输入的5个整数的最大值。样例输入: 3 1 2 3 4 5 5 4 3 2 1 1 2 5 3 4 样例输出: 5 5 5 ·程序代码: #include “stdio.h” int max(int a, int b, int c){ int t;t=a;if(b>t) t=b;if(c>t) t=c;return t;} int main(){ int n,a,b,c,d,e,i;scanf(“%d”,&n);for(i=1;i<=n;i++){ scanf(“%d%d%d%d%d”,&a,&b,&c,&d,&e); printf(“%dn”,max(a,b,max(c,d,e)));} return 0;} 4.三位数数字排序 描述: 对于给定的若干个三位正整数,将它们的各位上的数字按由小到大的顺序输出。要求,写一个函数,能将其整型参数的各位数字按照由小到大进行输出。主函数完成对输入的若干个三位数,分别调用该函数,完成指定的输出。输入: 若干行,每行有一个三位正整数,输入为0结束。输出: 有若干行,依次对应于非0的整数,将相应三位正整数的数字由小到大输出,数字间没有空格。 样例输入: 123 987 670 0 样例输出: 123 789 067 ·程序代码: #include “stdio.h” int main(void){ int n,a[4],xx,sum;scanf(“%d”,&n);while(n!=0){ int i,j; for(i=1;i<=3;i++) { a[i]=n%10; n/=10; } for(i=1;i<=3;i++) { for(j=i;j<=3;j++) { if(a[i]>a[j]) { xx=a[j]; a[j]=a[i]; a[i]=xx; } } } for(i=1;i<=3;i++) } { printf(“%d”,a[i]);} printf(“n”); scanf(“%d”,&n);} return 0;5.排列数计算 描述: 表示从m个元素中抽出n个元素的排列的个数。 计算公式为:编写一个用户自定义函数,该函数有一个整数参数,函数的功能是求解这个整数的阶乘,函数的返回值为这个整数的阶乘。编写一个程序,从键盘输入m、n值,分别两次调用用户自定义函数来求解 : 多行测试数据,每行两个用空格隔开的整数,0 0 表示结束。 输出: 有多行,对应于非0 0行的排列值。 样例输入: 5 3 8 2 0 0 样例输出: 60 56 ·程序代码: #include “stdio.h” int main(void){ double n,m,t;double x1,x2,i,k,kk;scanf(“%lf%lf”,&m,&n);while(n!=0&&m!=0){ x1=1; /*if(m { t=m; m=n; n=t; } */ for(i=1;i<=m;i++) { x1*=i; } k=m-n; x2=1; for(i=1;i<=k;i++) { x2*=i; } kk=x1/x2; printf(“%.0lfn”,kk); scanf(“%lf%lf”,&m,&n);} return 0;} 6.素数对 描述: 哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.做好了这件实事,就能说明这个猜想是成立的.由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的,而且素数对中的第一个数不大于第二个数.输入:输入中是一些偶整数M(6 #include “stdio.h” int prime(int n){ int i;for(i=2;i if(n%i==0) return 0; return 1;} int main(){ int m,i;while(scanf(“%d”,&m)==1)for(i=m/2;i>=2;i--) if(prime(i)&&prime(m-i)&&i!=m-i) { printf(“%d %dn”,i,m-i); break; } return 0;} 7.函数表达式计算 描述:计算下列表达式的值: 输入:输入x和n的值,其中x为非负实数,n为正整数。输出:输出f(x,n),保留2位小数。样例输入: 3 2 样例输出: 2.00 ·程序代码: #include “math.h” #include “stdio.h” /* f(x,1)=sqrt(1+x);f(x,2)=sqrt(2+sqrt(1+x))=sqrt(2+f(x,1));f(3,x)=sqrt(3+sqrt(2+qrt(1+x)))=sqrt(3+f(x,2));......f(x,n)=sqrt(n+f(x,n-1));*/ double f(double x,int n){ if(n>1) return sqrt(n+f(x,n-1));else return sqrt(1+x);} int main(){ int n;double x;scanf(“%lf%d”,&x,&n);printf(“%.2fn”,f(x,n));return 0;} 8.递归公约数 描述:递归形式的公约数定义如下: 使用此定义求两个整数的最大公约数。 输入: 有多行,每行为两个用空格隔开的整数。 输出: 对应的有多行,每行为对应输入的两个整数的最大公约数。 样例输入: 12 6 9 5 11 3 样例输出: 6 1 1 ·程序代码: # include “stdio.h” int gcd(int m, int n){ if(m%n==0) return n;else gcd(n,m%n);} int main(void){ int a,b;while(scanf(“%d%d”,&a,&b)==2){ 结构化程序设计都可用顺序结构、选择结构和循环结构这3种基本结构来说明。顺序结构是按语句的书写顺序依次执行;选择结构是对给定条件进行判断,然后决定执行两分支中的一个分支或多分支中的一个分支;循环结构是在一定条件成立的情况下,反复执行某个程序段。流程控制语句是实现这些程序流程的语句。流程控制语句在程序设计中起着至关重要的作用,通过3种基本控制结构使结构化程序具有唯一的人口和出口,没有死循环,并且程序的静态形式与动态执行形式之间具有良好的一一对应关系。在C语言中,有4种语句是顺序执行的: (1) 空语句,只有一个分号“;”表示什么也不做,作为语句结束符。 (2) 表达式语句,主要有赋值语句、自加减运算符构成的语句和逗号表达式语句,表达式后面加一个分号。 (3) 函数调用语句,它是由一个函数调用和一个分号组成的。 (4) 复合语句,由“{”和“}”把一些变量说明和语句组合放在一起,又叫做语句块。选择语句有switch语句和if语句。循环语句有for, while和do-while语句以及一些辅助流程转向语句如continue, break等。三种结构共同作为各种复杂程序的基本构造单元,由这3种结构经过反复嵌套构成的程序就是结构化程序。但如果在编程过程中无限制地使用转移语句 (goto) ,会使程序的控制流程强制性地向前或向后跳转而导致程序的流程无序可循,结构杂乱无章。结构化减少了程序的复杂性,提高了可靠性、测试性和维护性,使用少数的基本结构,就可使程序逻辑结构清晰易懂,容易验证程序的正确性。对初学计算机语言的人来说。最重要的就是正确的程序流程概念,不仅要懂而且要灵活。所以,用结构化方法设计的结构是清晰的,有利于编写出结构良好的程序。结构化程序设计方法的原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句,将程序设计针对的问题进行分解,直到分解到对应于一个个功能更简单,又独立的模块,每个模块再分解到上述3种基本程序结构。 本质上,结构化程序设计主要强调程序,其次算法是灵魂。程序=算法+数据结构+程序设计方法+语言工具和环境。算法是解决“做什么”和“怎么做”的问题;数据结构是加工对象;语言是工具;编程需要采用合适的方法。具体解决问题包含的步骤:一是分析问题,找出解决问题的模型;二是根据模型设计出处理方法;三是进行编程,实现算法;四是上机编辑、编译、连接、运行,直到得出正确结果;五是对结果进行分析,整理出文字材料。 大家知道,程序设计的任务不只是编写出一个程序,还应考虑它的质量。否则会使程序质量降低、可靠性差、开发周期长、维护费用高,这就是常说的“软件危机”,它将会严重阻碍计算机应用的发展。由于多数高级语言都支持结构化程序设计方法,他们的语法上都含有3种基本结构的语句,结构化程序设计方法设计的模块结构到程序实现是直接转换的,所以只需用相应的语句结构代替标准的控制结构。 摘要:C语言是结构化程序设计语言中较好的一种;结构化程序设计方法可以总结为自顶向下、逐步求精、模块化、限制使用goto语句, 将原来较为复杂的问题简化为一系列简单模块的设计;一个程序的任何逻辑问题均可用顺序结构、选择结构和循环结构这3种基本结构来描述。 关键词:结构化程序设计,顺序结构,选择结构,循环结构,算法 参考文献 [1]谭浩强:《C语言程序设计》, (第二版) 清华大学出版社, 1999年。 课程名称 _____C语言程序设计____ 实验项目 _实验一 顺序结构程序设计___ 实验仪器 ______ ___________ 系别_____光电学院_______ 专业______电信__________ 班级/学号 学生姓名 ______***_________实验日期 ____2011年10月17日___ 成绩 _______________________指导教师 一、实验目的1、掌握C语言中,基本的输入输出函数的使用方法。 2、掌握printf中转义字符’t’,’n’的用法。 3、掌握赋值语句的用法。 4、掌握算术表达式、赋值表达式的计算。 5、掌握数学函数的使用。 二、实验内容 1、输入圆的半径 r,计算圆的周长和面积。其中 π =3.1416程序代码: …… 执行结果: [输入] …… [输出] …… 2、3、…… 三、实验体会 目 录 实验一visual c++编译环境的使用..............................................................................2 实验二 顺序程序设计...............................................................................................6 实验三 选择结构程序设计........................................................................................9 实验四 循环结构程序设计......................................................................................13 实验五 函数...........................................................................................................17 实验六 指针...........................................................................................................22 实验七 数组...........................................................................................................25 实验八 结构体........................................................................................................32 实验一visual c++编译环境的使用 实验目的: 1.掌握c程序设计编程环境visual c++,掌握运行一个c程序设计的基本步骤,包括编辑、编译、连接和运行。 2.掌握c语言程序设计的基本框架,能够编写简单的c程序。3.了解程序调试的思想,能找出并改正c程序中的语法错误。实验内容: 1.在“我的电脑”上新建一个文件夹,用于存放c程序,文件夹名字可以是学号姓名。2.调试示例,在屏幕上显示一个短句“Hello World!”。 源程序 #include Hello World!基本步骤:(要求熟练掌握)1)启动VC++ “开始”->“程序”->“Microsoft Visual Studio 6.0”->“Microsoft Visual C++6.0”进入VC++编程环境。2)新建文件(*.cpp) “文件”->“新建”,单击“文件”选项卡,选择“C++Source Files”,修改文件保存“目录”和“文件”(文件名),单击“确定”。 3)编辑和保存(注意:源程序一定要在英文状态下输入,即字符标点都要在半角状态下,同时注意大小写,一般都用小写) 在编辑窗口输入源程序,然后执行“文件”->“保存”或“文件”->“另存为” 4)编译(*.obj) 用来检查语法错误 “编译”->“编译”或Ctrl+F7,在产生的工作区队话框中,选择“是”。5)连接(*.exe)“编译”->“构件”或F7 6)运行 “编译”->“执行”或Ctrl+F5 7)关闭程序工作区 “文件”->“关闭工作区” 8)打开文件 “文件”->“打开” 9)查看C源文件、目标文件和可执行文件的存放位置。 源文件在保存目录下,目标文件和可执行文件在“保存目录Debug”中 3.编程,在屏幕上显示一个短句“this is my first c program.”。4.调试示例,在屏幕上显示一个短句“welcome to you!”。源程序(有错误的程序)#include 1)按照实验2中介绍的步骤1)~3)输入上述源程序并保存。 2)编译,“编译”->“编译”(Ctrl+F7),信息窗口中显示编译出错信息,如下图所示。3)找出错误,在信息窗口中依次双击出错信息,编辑窗口就会出现一个箭头指向程序出错的位置,一般在箭头的当前行或上一行,可以找到出错语句。 第4行,出错信息:Welcome是一个未定义的变量,但Welcome并不是变量,出错的原因是Welcome前少了一个双引号。 4)改正错误,重新编译,得下如下图所示出错信息。 出错信息:“}”前少了分号。 5)再次改正错误,在“}”前即printf()后加上“;”(英文状态),生新编译,显示正确 6)连接,“编译”->“构件”(F7),出现如下出错信息。 出错信息:缺少主函数。 7)改正错误,即把“mian”改为“main”后,重新连接,信息窗口显示连接正确。8)运行,“编译”->“执行”(Ctrl+F5),观察结果是否与要求一致。5.改错,改正下列程序中的错误,在屏幕上显示以下3行信息。 **************** Welcome **************** 源程序(有错误的程序)#include } 实验报告要求 将以上各题的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 Printf(“ Welcome”)Printf(“****************n”); 实验二 顺序程序设计 【实验目的】 1.学会顺序程序设计的思想 2.进一步熟悉Turbo C集成编译环境的使用,达到熟练使用的目的 3.熟练掌握各种数据类型的输入输出格式,并学会使用输入输出函数 4.学会使用表达式 【实验内容】 1.在屏幕中输出一行文字“Hello,Welcome!” 说明: (1)只需要在屏幕中显示一行文字即可 参考程序如下: #include printf(“Hello,Welcome!n”);} 2. 输入一个华氏温度,要求输出摄氏温度。公式为 输出要求有文字说明,取两位小数 说明: (1)摄氏温度F和华氏温度c都应用float类型变量存储(2)注意表达式书写中的各变量的顺序问题(3)输出时只需输出两位小数 参考程序如下: #include float F,c; printf(“input F:”); scanf(“%f”,&F); c=5*(F-32)/9; printf(“c=%.2fn”,c);} 3.输入三角形三边长a、b、c,求三角形周长和l面积s。用scanf输入数据,输出计算结果,输出时要求有文字说明,取消书店后两位小数。说明: (1)程序设计中使用的所有变量均为float类型 c59F32(2)三角形周长公式:labc abc2(3)三角形面积公式;sp(pa)(pb)(pc),其中 p (4)注意应保证输入数据能够构成三角形 (5)需要使用开根号函数sqrt,在程序顶部加上#include #include float a,b,c,l,s; float p; printf(“input a,b,c:”); scanf(“%f,%f,%f”,&a,&b,&c); l=a+b+c; p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c)); printf(“l=%.2fn”,l);printf(“s=%.2fn”,s);} 4.设圆半径r1.5,圆柱高h3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取消书店后两位小数。说明: (1)程序设计中使用的所有变量均为float类型(2)圆周长公式:l2r(3)圆面积公式:S1r(4)圆球表面积公式:S24r V14322(5)圆球体积公式: r3 (6)圆柱体积公式:V2rh 参考程序如下: #include 2main(){ float r=1.5,h=3; float l,s1,s2,v1,v2; l=2*PI*r; s1=PI*r*r; s2=4*PI*r*r; v1=4*PI*r*r*r/3; v2=PI*r*r*h; printf(“l=%.2fn”,l);printf(“s1=%.2fn”,s1);printf(“s2=%.2fn”,s2);printf(“v1=%.2fn”,v1);printf(“v2=%.2fn”,v2);} 实验三 选择结构程序设计 【实验目的】 1.了解C语言的逻辑运算 2.学会使用if语句和switch语句 3.熟练掌握选择结构程序设计方法 【实验内容】 1.有一函数 y x x1 1x10 2x 13x11 x10 写一程序,输入x,输出y值 说明: (1)根据输入x的不同求y的值,使用if语句 (2)分别输入三个分段中的三个数,判断输出结果是否正确,测试程序正确与否 参考程序如下: #include float x,y; printf(“input x:”); scanf(“%f”,&x); if(x<1) y=x; if(x>=1 && x<10) y=2*x-1; if(x>=10) y=3*x-11;printf(“y=%fn”,y);} 2.从键盘输入一个字符,可以是数字、字母、或是标点符号,对输入的字符进行判断,如果是数字则输出“* is a number!”,如果是字母则输出“* is a letter!”,如果是其他的字符怎输出“* is the other!”(*为输入的字符)说明: (1)从键盘输入一个字符,用char类型变量存储(2)使用if语句作判断(3)判断条件根据输入字符的ASCII码值的范围,具体的ASCII码值参看书后的ASCII码表 参考程序如下: #include char c; printf(“input a char:”); scanf(“%c”,&c); if(c>=48 && c<=57) printf(“%c is a number!n”,c); else if((c>=65 && c<=90)||(c>=97 && c<=122)) printf(“%c is a letter!n”,c); else printf(“%c is the other!n”,c);} 3.输入两个实数a、b,保证变量a中存储的是较大的数,变量b中存储的实较小的数,并按照由大到小的顺序输出。说明: (1)需要对输入的两个数进行比较,判断是否需要交换两个数(2)按照从大到小的顺序输出两个数 参考程序如下: #include float a,b; float temp; printf(“input a,b:”); scanf(“%f,%f”,&a,&b); if(a { temp=a; } printf(“%f,%fn”,a,b);} 4.输入一年份,判断该年是否是闰年。说明: (1)判断闰年的条件:能够被4整除,但不能被100整除或者能被100整除,又能被400整除 (2)使用一个变量来代表是否是闰年 a=b;b=temp;10(3)如果是闰年则输出“* is a leap year!”,否则输出“* is not a leap year!”。*代表输入的年份 参考程序如下: #include int year; int flag=0; printf(“input a year:”); scanf(“%d”,&year); if((year%4==0 && year%100!=0)||(year%100==0 && year%400==0)) flag=1; if(flag==1) printf(“%d is a leap year!n”,year); else printf(“%d is not a leap year!n”,year);} 5.从键盘输入一个月号,显示输出该月号的英文名称 说明: (1)使用if语句较为麻烦,因为需要做12次比较(2)使用switch语句 (3)如果输入月份超出范围,则应当输出错误信息 参考程序如下: #include int month; printf(“input a month:”); scanf(“%d”,&month); switch(month) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: printf(“January!n”);printf(“February!n”);break;break;printf(“March!n”);break;printf(“April!n”);break;printf(“May!n”);break;printf(“June!n”);break;printf(“July!n”);break;printf(“August!n”);break;printf(“September!n”);break;case 10: printf(“October!n”);break;case 11: printf(“November!n”);break;case 12: printf(“December!n”);break; } } default: printf(“input error!n”);12 实验四 循环结构程序设计 【实验目的】 1.学会使用while、do-while、for语句 2.熟练掌握循环结构程序设计方法 3.掌握选择结构与循环结构的嵌套 【实验内容】 201.求和说明: n!n1(即求1!+2!+„„+20!) (1)首先要求出每一项的n!的值 (2)然后把各项相加得到所求的值 (3)存储求和运算结果的变量的初始值应为0(4)存储求积运算结果的变量的初始值应为1 参考程序如下: ①使用while循环 #include float sum=0; float mid=1; int n=1; while(n!=21) { mid=mid*n; } printf(“sum=%fn”,sum);} ②使用for循环 #include float sum=0; float mid=1; int n; for(n=1;n<=20;n++) { mid=mid*n;n++;sum=sum+mid; sum=sum+mid;} printf(“sum=%fn”,sum);} 2.求出100到200以内最大的素数和最小的素数,并求出两者的差值 说明: (1)素数的概念:只能被1和自身整除的正整数 (2)分别求出这个两个素数,并输出,输出格式为: big one:* small one:* 最小的素数正序找出 最大的素数倒序找出 (3)求出两者的差,并输出,输出格式为: result:* 参考程序如下: #include int big,small; int result; } for(i=200;i>=100;i--){ int i,j;int flag;for(i=100;i<200;i++){ flag=0;for(j=2;j } if(i%j==0){ } flag=1;break;if(flag==0){ } small=i;break;flag=0;for(j=2;j { } if(flag==0){ } big=i;break;if(i%j==0){ flag=1;break;} } result=big-small;printf(“big:%dn”,big);printf(“small:%dn”,small);printf(“reslut:%dn”,result);} 3.输入两个正整数m和n,求其最大公约数和最小公倍数 说明: (1)最大公约数:能够被m和n同时整除的最大正整数(2)最小公倍数:m和n相乘的积除以最大公约数 (3)使用for循环,将m和n同时除以1到m(m为m和n两者中较小者),直到找出最大的正整数即为最大公约数(4)输出格式如下: The greatest common divisor is *! The least common multiple is *!参考程序如下: #include printf(“input m,n:”); scanf(“%d,%d”,&m,&n);if(m>n){ temp=m;m=n; n=temp;} for(i=1;i<=m;i++){ if(n%i==0 && m%i==0) great=i;} least=m*n/great;printf(“The greatest common divisor is %dn”,great);printf(“The least common multiple is %dn”,least);} 4.打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本书。例如,153是一水仙花数,因为153153 说明:(1)“水仙花数”是三位数,所以范围是从100到999(2)使用for循环 (3)循环中需要把数字的每一位都分离出来,然后求和,同原数字比较,进行判断 参考程序如下: #include int i;int temp;for(i=100;i<1000;i++){ a=i/100;b=(i-a*100)/10;c=i%10;temp=a*a*a+b*b*b+c*c*c;if(i==temp)printf(“%dn”,i); 33} } 实验五 函数 【实验目的】 1.掌握C语言函数的定义、声明以及函数的调用方法 2.了解主调函数和被调函数之间的参数传递方式 3.熟练掌握数组作为函数参数的用法 【实验内容】 1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。说明: (1)判断素数的函数名为Prime(2)传递参数为int类型的变量(3)输出格式为: * is a prime!或者* is not a prime!参考程序如下: #include if(num%i==0) { } flag=1;break;} if(flag==0)printf(“%d is a prime!n”,num);else printf(“%d is not a prime!n”,num);} main(){ int num;printf(“input a num:”);scanf(“%d”,&num);Prime(num);} 2.写一个函数,用“冒泡法”对输入的10个数字由小到大顺序排列,并输出。说明: (1)排序的函数名为Sort(2)排序前后的输入输出都应在主函数中完成(3)使用数组作为函数参数(4)使用“冒泡法”排序 参考程序如下: #include } } main(){ int num[10];int i;printf(“input 10 numbers:”);for(i=0;i<10;i++) scanf(“%d”,&num[i]);Sort(num);printf(“the sorted numbers:”);for(i=0;i<10;i++) printf(“%d ”,num[i]);} 3.写一函数,使给定的一个二维数组(5×5)转置,即行列互换。说明: (1)使用5×5的二维数组存放数据 (2)矩阵转置的函数名为Turn(2)转置前后的输入输出都应在主函数中完成(3)使用数组作为函数参数 for(j=0;j<9-i;j++){ } if(num[j]>num[j+1]){ temp=num[j]; } num[j]=num[j+1];num[j+1]=temp;18 参考程序如下: #include } } main(){ int num[5][5]={{1,2,3,4,5},{6,7,8,9,0},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}}; int i,j;printf(“Before array be turned:n”);for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%2d ”,num[i][j]);for(j=i;j<5;j++){ } temp=num[i][j];num[i][j]=num[j][i];num[j][i]=temp; printf(“n”);} Turn(num);printf(“After array be turned:n”);for(i=0;i<5;i++){ } } 4.写一函数,使输入的字符串反序存放,在主函数中输入和输出字符串。说明: (1)字符串反序的函数名为Reverse(2)反序前后的输入输出都应在主函数中完成(3)使用数组作为函数参数 for(j=0;j<5;j++)printf(“%2d ”,num[i][j]);printf(“n”);19(4)需要使用strlen函数得到字符串长度,需要在源文件头部加入#include #include } } main(){ char str[50];printf(“input a string:”);scanf(“%s”,str);Reverse(str);printf(“After reversed is %sn”,str);} 5.写一函数,将两个字符串连接。 说明: (1)连接两个字符串的函数名为:Connect(2)将连个字符串存入两个字符串数组中,要保证第一个字符串的长度能够容纳两个字符串之和 (3)连接两个字符串主要是找到第一个字符串的结尾,然后将第二个字符串连接到第二个字符串的后边 (4)输出格式为: The connected string is *!(5)使用数组作为函数参数 (6)连接前后的字符串输出都要在主函数中完成,自定义函数只完成连接功能 参考程序如下: #include str1[i]=str2[j];str1[i]=';} main(){ char str1[50],str2[20];int i,j;printf(“input string1:”);scanf(“%s”,str1);getchar();printf(“input string2:”);scanf(“%s”,str2);Connect(str1,str2);printf(“The connected string is %sn”,str1);} 6.写一函数,求字符串的长度,并编写主函数。说明: (1)求字符串长度的函数名为:Count(2)字符串结束的标志是’’(3)输出格式为: The length of string is *!(4)使用数组作为函数参数 参考程序如下: #include 实验六 指针 【实验目的】 1.掌握C语言指针变量的定义、声明和赋值 2.学会使用指针变量的程序设计 3.掌握指针作为函数参数的用法 【实验内容】 1.使用指针作为函数参数,写一交换两个数的函数 说明: (1)交换两个数的函数名为:Swap(2)使用指针变量作为函数参数 (3)在主函数中输入输出,自定义函数只完成交换功能 参考程序如下: #include 2.使用指针作为函数参数,写一求数组中最大值和最小值的函数。说明: (1)函数名为:MaxAndMin(2)使用指针指向一维数组 (3)最大值和最小值的输出必须要在主函数中 参考程序如下: #include *max=array[0];*min=array[0];for(i=0;i<10;i++){ if(*maxarray[i])*min=array[i]; } } main(){ int array[10]={0,1,2,3,4,5,6,7,8,9};int max,min;int *p1,*p2;p1=&max;p2=&min;MaxAndMin(array,p1,p2);printf(“max=%dnmin=%dn”,max,min);} 3.找出以下程序的错误,并加以修改。①交换两个数 #include temp=p1; p1=p2; p2=temp;} main(){ int a,b;int *pointer_1,*pointer_2; scanf(“%d,%d”,&a,&b); pointer_1=&a;pointer_2=&b;Swap(pointer_1,pointer_2); } ②输出数组重点全部元素 #include *p++=i; for(i=0;i<10;i++) printf(“a[%d]=%dn”,i,*p++);} 4.写一函数,求出矩阵中的最大值和最小值,要求使用指针作为函数参数。说明: (1)使用二维数组存放矩阵元素(2)只用指针变量指向数组(3)函数名为:ArrayMaxAndMin 参考程序如下: #include *min=*(array+i*n+j);for(i=0;i } if(*max<*(array+i*n+j))*max=*(array+i*n+j);if(*min>*(array+i*n+j))*min=*(array+i*n+j); } } main(){ int array[3][3]={1,2,3,4,5,6,7,8,9};int max,min;int *p,*p1,*p2;p=array;p1=&max;p2=&min;ArrayMaxAndMin(p,p1,p2,3);printf(“max=%dnmin=%dn”,max,min);} 实验七 数组 【实验目的】 1.掌握一维数组和二维数组的定义、赋值和初始化的方法 2.掌握字符数组的使用 3.熟练掌握与数组相关的各种算法 【实验内容】 1.从键盘输入10个整数,对这个十个数进行排序,并输出 说明: (1)将这10个整数存入一个含有10个元素的一维数组中 (2)冒泡法:从第一个数开始依次让相邻的两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍比较后,最大的数已放在最后,第二遍只需考虑剩下的数,以此类推直到最后两个数比较后就可以完成排序。(3)比较完成后将数组中元素依次输出 参考程序如下: #include scanf(“%d”,&num[i]);for(i=0;i<=8;i++){ for(j=0;j<9-i;j++){ if(num[j]>num[j+1]){ temp=num[j];num[j]=num[j+1];num[j+1]=temp; } } } printf(“the sorted numbers:”);printf(“%d ”,num[i]);for(i=0;i<10;i++) } 2.从键盘输入一串字符串,统计字符串中特定字符的个数(特定字符也需要从键盘输入),并输出个数 说明: (1)输入时需要用到的输入格式控制字是%s(2)字符串存入一个足够大的字符数组中,保证输入的字符个数不要超过最大个数(3)使用循环控制语句,需要了解字符数组的结束标志是’’,作为循环的结束标志(4)输出格式如下: The number of * is *!参考程序如下: #include { if(str[i]==ch)count++;i++;} printf(“The number of %c is %d!n”,ch,count);} 注意: 程序中多了一行getchar(),这并不是多余的,而是因为在输入完字符串后,键入的回车被放入到内存的输入缓冲区中,在输入特殊字符的时候ch得到了上一个回车,而无法得到我们要输入的字符,因此需要使用一行getchar()将缓冲区中的回车读出,相当于清除缓冲区的作用。 3.青年歌手参加歌曲大奖赛,有10个评委进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。 说明: (1)将10位评委的打分放入一个含有10个元素的一维数组中(2)程序设计重点是排序 (3)排序后只要用中间的8个元素即可(4)输出格式为: The average is *!参考程序如下: #include scanf(“%f”,&score[i]);for(i=0;i<=8;i++){ for(j=0;j<9-i;j++){ if(score[j]>score[j+1]){ } temp=score[j];score[j]=score[j+1];score[j+1]=temp;} } for(i=1;i<=8;i++){ sum=sum+score[i]; } average=sum/8;printf(“The average is %f!n”,average);} 4.将两个字符串连接起来,不要使用strcat函数。 说明: (1)将连个字符串存入两个字符串数组中,要保证第一个字符串的长度能够容纳两个字符串之和 (2)连接两个字符串主要是找到第一个字符串的结尾,然后将第二个字符串连接到第二个字符串的后边 (3)输出格式为: The connected string is *!参考程序如下: #include printf(“input string1:”);scanf(“%s”,str1);getchar();printf(“input string2:”);scanf(“%s”,str2);for(i=0;str1[i]!=';i++);for(j=0;str2[j]!=';j++,i++) str1[i]=str2[j];str1[i]=';printf(“The connected string is %sn”,str1);} 5.已有一个已排好序的数组,从键盘输入一个数,要求按原来排序的规律将它插入数组中。说明: (1)需要保证数组的元素据个数比插入前多1(2)需要找到在数组中插入的位置 (3)可倒序查找:假设从小到大排序,从最后一个开始查找,如果要插入元素比当前数组元素小则将该数组元素赋予后边一个元素,继续比较;否则将要插入元素赋予该数组元素的下一个元素,然后break结束循环(4)输入该数组即可 参考程序如下: #include if(a[i]>b)a[i+1]=a[i];else { } a[i+1]=b;break;} printf(“The new sorted array is ”);for(i=0;i<10;i++) } printf(“%d ”,a[i]);6.将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。说明: (1)只要将原来数组中的值以中间值为中心交换 n1(2)交换次数为2次 (3)注意此时的n是数组最后一个元素的下标 参考程序如下: #include temp=num1[i]; num1[i]=num1[9-i];num1[9-i]=temp;} for(i=0;i<(8+1)/2;i++){ temp=num2[i];num2[i]=num2[8-i];num2[8-i]=temp; } printf(“The converted array1 is ”);for(i=0;i<10;i++) printf(“%d ”,num1[i]);printf(“nThe converted array2 is ”);for(i=0;i<9;i++) printf(“%d ”,num2[i]);} 7.求一个3×3矩阵的对角线元素之和 说明: (1)使用3×3的二维数组存储数据 (2)使用for循环嵌套,判断数组中元素是否是对角线元素,如果是则相加(3)对角线元素的特点是行号和列号相同 参考程序如下: #include int array[3][3]={1,2,3,4,5,6,7,8,9};int sum=0;int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++){ } if(i==j)sum=sum+array[i][j];{ } printf(“summary is %dn”,sum);} 8.设计一个较为复杂的一维数组操作程序,实现对一维数组的基本操作 说明: (1)通过输入函数实现对一维数组的输入,可以将数组定义为100个整型元素,输入其中的10个元素 (2)在屏幕上将数组中的10个元素输出 (3)往数组中插入一个元素,并将插入后的11个元素输出(4)从数组中删除一个元素,并将删除后的10个元素输出 (5)从数组中查找一个元素,并将查找后的元素下标输出,如果元素不存在,给出提示 参考程序如下: #include int a[100],i,j;int ins,del,find,pos;printf(“input the data: ”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“The array is ”);for(i=0;i<10;i++)printf(“%d ”,a[i]);printf(“ninsert a data: ”);scanf(“%d”,&ins);for(i=0;i<10;i++){ if(ins for(j=9;j>=i;j--)a[j+1]=a[j];a[i]=ins;break; } } if(i==10) a[i]=ins;printf(“nAfter insert: ”);for(i=0;i<11;i++)printf(“%d ”,a[i]);printf(“ndelete a data: ”);scanf(“%d”,&del);for(i=0;i<11;i++){ if(del==a[i]) { for(j=i;j<10;j++) a[j]=a[j+1];break; } } if(i==11) printf(“nnot foundn”);else { printf(“nAfter delte: ”); for(i=0;i<10;i++)printf(“%d ”,a[i]);} printf(“nfind a data: ”);scanf(“%d”,&find);for(i=0;i<10;i++){ if(find==a[i]) { pos=i; break; } } if(i==10) printf(“nnot foundn”);else printf(“npos=%dn”,pos+1);} 实验八 结构体 【实验目的】 1.掌握C语言结构体变量的定义和使用 2.学会设计简单的结构体程序 【实验内容】 1.有一学生信息包含学号、姓名、性别、年龄、电话等信息,要求设以一个结构体用于存储该学生信息,实现学生信息的输入和显示。说明: (1)使用结构体实现学生信息的存储(2)按照序号顺序排列学生信息(3)实现按照序号查找学生信息 参考程序如下: #include if(i==0)printf(“The first onen”);if(i==1)printf(“The second onen”);if(i==2)printf(“The third onen”);printf(“ input number:”);scanf(“%s”,stu[i].num);printf(“ input name:”);scanf(“%s”,stu[i].name);printf(“ input sex:”);scanf(“%s”,stu[i].sex);printf(“ input age:”);scanf(“%d”,&stu[i].age); } 为提高实验设计的科学性与合理性, 促进C语言程序设计课程教学效果提升, 让学生通过实验操作提高实践技能, 科学合理设计实验内容是十分必要的。 1.1概念。综合性实验是指实验内容涉及课程综合知识的实验, 设计性实验是指独立于课本内容的探究性实验, 要求学生善于发现问题。并综合应用所学知识设计实验方案, 认真探究相关内容, 发现问题和解决问题, 并得出结论, 深化对相关内容的理解。 1.2作用。教学中通过综合性和设计性实验的设计和应用, 具有重要作用。不仅能推动课程教学顺利进行, 加深学生对C语言程序设计教学内容的理解。还能培养学生善于发现问题和解决问题的能力。通过自主探究和深入体会, 深化对所学内容的认识, 增强知识应用技能和创新能力, 促进教学效果和学习效率提升。 二、综合性和设计性实验的对策 2.1合理设计实验内容。实验设计时, 根据教学目标和人才培养流程, 规划不同的设计性、综合性实验, 为后续实验课程教学的有效开展奠定基础。设计性实验包括:根据输入日期求是该年度的第多少天?编写判断素数的函数, 编写带参数的宏定义等。综合性实验包括:应用流程控制语句、模块化设计方法、丰富的数据类型设计与实现“学生管理系统”。对这些内容进行科学合理安排, 采用有效的教学方法, 有利于实验教学顺利进行, 提高课程教学效果和质量。 2.2有效实施实验过程。设计性实验实施过程中, 要求学生根据实验题目设计算法, 并实现算法功能。课前针对实验内容提出问题, 让学生通过思考之后再回答, 例如, 如何实现闰年和素数的判断等。这些问题有利于学生加深对理论知识的理解, 将其用来解决实际问题。对学生的疑惑, 任课老师进行适当引导, 让学生自己思考和探究, 得出正确答案。综合性实验实施过程中, 以“学生成绩管理系统”为任务, 从输入/输出语句开始, 再过渡到编写函数, 学习结构选择、循环控制和数组, 再学习存储和处理个人数据, 在“文件”这一章中完成学生成绩管理系统的编制。再进行调试, 提升系统功能, 保证系统能够得到更为合理有效的利用。 2.3科学进行实验考核。设计性实验考核时, 学生提交实验报告和源程序代码, 同时详细记录实验中出现的问题, 修改方法和运行结果, 让任课老师对这些内容有全面的了解, 掌握学生实验过程中的基本情况。综合性实验考核中, 学生要提交实验报告和全部源程序代码, 并要求学生进行答辩, 任课老师可针对实验内容提问, 由学生回答。 三、综合性和设计性实验的效果 整个实验教学过程中, 有利于师生间的互动与交流, 学生对实验中遇到的疑惑能及时提出, 任课老师可以及时为学生回答问题, 帮助学生解答疑惑, 为学生更好探究知识创造条件。但任课老师采用的是引导式方式指导学生, 学生是在任课老师引导下完成学习任务, 达到提高实践操作技能的目的。实验完成后进行的回访和调查显示, 学生能将理论知识和编程技能巧妙结合起来, 有效掌握所学内容, 深化对实验内容和相关理论知识的认识。85%的学生反映, 采用综合性和设计性实验方式, 不仅增强学生的自主学习技能和探究能力, 还能深化对理论知识的理解, 掌握很多的重要技能。此外, 提高学生分析和解决复杂问题的能力, 拓展学生视野, 对C语言程序设计有更为全面和详细的认识。为以后在工作中独立解决问题打下坚实基础, 对学生以后的学习和工作也具有积极作用。 四、结束语 实验是C语言程序设计课程教学不可忽视的内容。作为任课老师, 应该认识其重要作用, 根据教学目标和人才培养要求, 有效开展综合性和设计性实验, 遵循实验操作步骤, 做好评价考核工作。从而推动课程教学顺利进行, 提高教学效果和学生的实践技能, 也为学生以后更好从事自己的工作打下基础。 参考文献 [1]钱言玉.《C语言程序设计》课程实验教学研究[J].合肥师范学院学报, 2014 (3) , 86-87, 100 标 准 实 验 报 告 (实验)课程名称 高级语言程序设计实验 电 子 科 技 大 学 实 验 报 告 实验时间: 10月12日晚 一、实验室名称: 校公共机房 二、实验项目名称:顺序和分支程序设计 三、实验学时:4学时 四、实验原理: 使用VS2010等C语言集成开发环境(IDE),在微型计算机上对程序进行编辑、编译、连接与运行。通过上机练习掌握在C编译器中编辑、编译、连接、和运行C程序的方法和过程。 五、实验目的: 1.熟悉C程序开发环境,熟悉C程序的编辑、编译、连接和运行的过程。2.掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型、指针型变量,以及对它们赋值的方法。 3.掌握C语言的各种运算符,以及这些运算符的混合使用。4.掌握简单顺序程序设计方法。5.学会使用scanf和printf函数。 6.掌握分支结构各种语句的一般功能和执行过程,会使用分支结构编程。 六、实验内容: 上机完成以下编程实验,调试运行程序并完成报告。 1.编写一个C程序,输入三个整数,计算三个整数的和,并将结果输出。2.编写一个C程序,输入一个字符,找到这个字符前后各隔一个字符的字符。例如,输入‘d’,显示:‘b’和‘f’。3.习题2.22(p91) 4.习题2.23(p91)5.习题 3.3(p134) 6.输入一个两位数,输出对应的英文单词。 七、实验器材(设备、元器件): 硬件要求:普通pc机,1G内存,100G硬盘空间即可。 软件要求:Windows 7,包括C编译器的IDE。 八、实验步骤、实验编程与运行结果: 1.程序文件名为ex1_1,源程序清单如下: #include } int a,b,c,d;scanf(“%d %d %d”,&a,&b,&c);d=a+b+c;printf(“%d”,d); 典型测试数据(输入): 25 26 27 应输出(上机前自己分析的结果):78 上机时遇到的问题:wu 实际运行结果:78 2.程序文件名为ex1_2,源程序清单如下: #include void main(){ int x,y,z;scanf(“%c”,&x);y=x+2;z=x-2; } printf(“%c %c”,y,z); 典型测试数据(输入): h 应输出(上机前自己分析的结果): j f 上机时遇到的问题: wu 实际运行结果:j f 3.程序文件名为ex1_3,源程序清单如下: #include } float r,s,c;scanf(“%f”,&r);s=3.14*r*r;c=2*3*r;printf(“s=%fn”,s);printf(“c=%f”,c); 典型测试数据(输入):5 应输出(上机前自己分析的结果):78.5 31.4 上机时遇到的问题: wu 实际运行结果:78.5 31.4 4.程序文件名为ex1_4,源程序清单如下: #include } scanf(“%f”,&c);a=9*c;b=a/5;F=b+32;printf(“%f”,F); 典型测试数据(输入): 35 应输出(上机前自己分析的结果): 95 上机时遇到的问题: wu 解决办法: 实际运行结果:95 5.程序文件名为ex1_5,源程序清单如下: #include } int a,b,c;scanf(“%d %d”,&a,&c);b=a-110;if(c==b){ } else if(c>=b+5){ } else if(c<=b-5){ } printf(“过瘦n”);printf(“过胖n”);printf(“标准n”); 典型测试数据(输入):180 70 应输出(上机前自己分析的结果):标准 上机时遇到的问题: 无 解决办法:多测试几组典型数据; 实际运行结果:标准 6.程序文件名为ex1_6,源程序清单如下: #include } else if(a>=2){ switch(a){ case 2:printf(“twenty”);break;case 3:printf(“thirty”);break;case 4:printf(“fouty”);break;case 5:printf(“fifty”);break;case 6:printf(“sixty”);break;case 7:printf(“seventy”);break;int a,b;scanf(“%1d%1d”,&a,&b);if(a==1) { switch(b){ } case 4:printf(“fourteen”);break;case 2:printf(“twelve”);break;case 5:printf(“fifteen”);break;case 6:printf(“sixteen”);break;case 7:printf(“seventeen”);break;case 8:printf(“eighteen”);break;case 9:printf(“nineteen”);break;default:printf(“n”);case 3:printf(“thirteen”);break;case 1:printf(“eleven”);break; } } case 8:printf(“eighty”);break;case 9:printf(“ninety”);break;default:printf(“n”);} switch(b){ case 1:printf(“one”);break; } case 2:printf(“two”);break;case 3:printf(“threee”);break;case 4:printf(“four”);break;case 5:printf(“five”);break;case 6:printf(“six”);break;case 7:printf(“seven”);break;case 8:printf(“eight”);break;case 9:printf(“nine”);break;default:printf(“n”); 典型测试数据(输入): 55 应输出(上机前自己分析的结果):fiftyfive 上机时遇到的问题: wu 解决办法: 实际运行结果:fiftyfive 九、实验结论:课下应提前做好,不然时间来不及。 十、总结及心得体会:应用生疏 十一、对本实验过程及方法、手段的改进建议:无 报告评分: 1.使用函数指针编写用梯形公式计算定积分1sinxdx和102xdx1x2的值,取105。 baxi提示:将积分区间[a,b]作n等分:,hnai*h,i0,1,2,,n,在每一分段[xi1,xi]上取点i(1)近似代替曲边梯形得: bnxi1,i(2)xi,每一小段上用梯形来af(x)dxi1f(i(1))f(i(2))xi2记上式右边为Tn,则: ban1Tn[f(xi1)f(xi)]ni12ban11[f(x)f(x)f(x)f(x)f(xn)] 012n1ni1222.使用数组指针处理方阵,方阵的阶数定义为常量N。用数组指针作函数参数完成下列功能,每个功能编一个函数。 实现方阵的初始化; 实现方阵的输出; 实现两个方阵相加,并输出相加结果; 实现两个方阵相减,并输出相减结果; 实现两个方阵相乘,并输出相乘结果; 主函数定义两个整型二维数组,分别调用上述函数去实现功能。 程序一 #include t=t+0.5*h*f(x); x=a+i*h;} 版权:ydz return t;} double g(double x){ return sin(x)/x;} double p(double x){ return 1/(1+x*x);} void main(){ t1=jifen(1,2,g);t2=jifen(0,1,p);printf(“%lfn%lfn”,t1,t2);} 程序二 #include for(j=0;j scanf(“%d”,p[i]+j); } } } void shuchu(int(*p)[N]){ int i,j;for(i=0;i for(j=0;j printf(“%d ”,*(p[i]+j)); } printf(“n”);} } void xiangjia(int(*p)[N],int(*q)[N],int(*r)[N]){ int i,j;for(i=0;i 版权:ydz for(j=0;j *(r[i]+j)=*(p[i]+j)+*(q[i]+j); printf(“%d ”,*(r[i]+j)); } printf(“n”);} } void xiangjian(int(*p)[N],int(*q)[N],int(*r)[N]){ int i,j;for(i=0;i for(j=0;j *(r[i]+j)=*(p[i]+j)-*(q[i]+j); printf(“%d ”,*(r[i]+j)); } printf(“n”);} } void xiangcheng(int(*p)[N],int(*q)[N],int(*r)[N]){ int i,j,k;for(i=0;i for(j=0;j *(r[i]+j)=0; 姓名: 班级: 学号: 实验内容: 编写一个程序,从键盘输入任意一个五位数,把这个数值分解为单个数字,然后打印出每一个数字(每个数字之间用三个空格分开)。例如用户输入了42339,屏幕输出结果为: 【提示】巧妙使用 / 和 % 两种运算符。源代码: #include long int num,a,b,c,d,e; scanf(“%ld”,&num);a=num/10000;b=num%10000/1000;c=num%1000/100;d=num%100/10;e=num%10;printf(“%ld %ld %ld %ld %ldn”,a,b,c,d,e);} 运行结果: 实验内容: 已知三角形三边a,b,c,计算三角形的面积。 注:三角形面积公式为area=[s(s-a)(s-b)(s-c)]的1/2次幂 S=1/2*(a+b+c)源代码: #include } scanf(“%lf%lf%lf”,&a,&b,&c);s=(a+b+c)/2;if(a>0 && b>0 && c>0){ area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“area=%lfn”,area);} else printf(“输入错误,三角形边长不能为负数或0n”);运行结果: 实验内容: 输入圆的半径,计算出圆的周长和面积 源代码: #include double r,z,area,pi=3.14159;scanf(“%lf”,&r);if(r>0) { z=2*pi*r;area=pow(r,2)*pi;printf(“圆面积为%lf周长为%lfn”,area,z);return 0; } } else printf(“输如错误,圆的半径不能为负数或0n”);运行结果: 实验内容: • 体型判断。按“体指数”对肥胖程度进行划分: 体指数t = 体重w /(身高h)2 (w 单位为公斤,h单位为米) – 当t < 18时,为低体重; – 当t介于18和25之间时,为正常体重; – 当t介于25和27之间时,为超重体重; – 当t >= 27时,为肥胖。 • 编程从键盘输入你的身高h和体重w,根据给定公式计算体指数t,然后判断你的体重属于何种类型。• 用3种方法编程: – 算法1:用不带else子句的if语句编程 – 算法2:用在if子句中嵌入if 语句的形式编程 – 算法3:用在else子句中嵌入if 语句的形式编程 算法1:源代码: #include float w,h;double t;scanf(“%f%f”,&h,&w);if(w<=0 || h<=0){ printf(“输入错误,身高体重不能为负数或0n”);} { t=w/pow(h,2); if(t<18){ printf(“低体重n”); goto loop; goto loop; } if(t>=18 && t<25) { } if(t>=25 && t<27){ printf(“超重体重n”); goto loop;} if(t>=27){ printf(“正常体重n”);goto loop; printf(“肥胖n”); } } loop:return 0;} 运行结果: 算法2:源代码: #include #include float w,h;double t;scanf(“%f%f”,&h,&w);if(w<=0 || h<=0){ printf(“输入错误,身高体重不能为负数或0n”);} { t=w/pow(h,2);if(t<25){ if(t>=18){ } printf(“正常体重n”);goto loop;goto loop; printf(“低体重n”);} if(t>=25){ if(t<27){ } printf(“超重体重n”);goto loop; printf(“肥胖n”);} } loop:return 0;} 运行结果: 算法3:源代码: #include float w,h;double t;scanf(“%f%f”,&h,&w);if(w<=0 || h<=0)printf(“输入错误,身高体重不能为负数或0n”);else { } t=w/pow(h,2);if(t<18)printf(“低体重n”);else { } if(t>=18 && t<25)printf(“正常体重n”);else { } if(t>=25 && t<27) printf(“超重体重n”);else printf(“肥胖n”);return 0;} 运行结果: 实验内容: 编写一个程序,计算-32768~+32767之间任意整数(由键盘输入)中各位奇数的平方和。源代码: #include } int a,b=0,c=0,i;scanf(“%d”,&a);for(i=0;i<5;i++){ if(a%2!=0){ } a/=10;} printf(“%dn”,b);return 0;c=a%10;b=b+c*c; 运行结果: 实验内容: 设有一四位数abcd=(ab+cd)2,编写一个程序,求a、b、c、d。源代码: #include for(num=1000;num<=9999;num++){ a=num/1000; } 运行结果: } return 0;b=num%1000/100;c=num%100/10;d=num%10;if(num==pow((10*a+b+10*c+d),2))printf(“a=%db=%dc=%dd=%dn”,a,b,c,d); 实验内容: 鸡兔问题:鸡兔共30只,脚共有90个。编写一个程序,求鸡、兔各多少只。源代码: #include } 运行结果: int x,y;for(x=0;x<=45;x++){ } return 0;for(y=0;y<=22;y++)if(x+y==30 && 2*x+4*y==90)printf(“鸡有%d只,兔有%d只n”,x,y); 实验内容: 编写一个程序,求S值(n由键盘输入): (程序检验参考: x=6.66,n=8时,s=40.955;x=6.66,n=15时,s=-1.511 源代码: #include #include double jiecheng(int); double s=0,x=6.66; } double jiecheng(int x){ } double f;if(x==0||x==1)f=1;int n,i;scanf(“%d”,&n);for(i=1;i<=n;i++){ } printf(“%.3fn”,s);return 0;s=s+pow(-1,i)*pow(x,i)/jiecheng(i);else f=jiecheng(x-1)*x;return f; 运行结果: 实验内容: 编写一个程序,求前 n 项之和S值,其中 n≥1,x ≠ 0。(n由键盘输入): 2x 5x 13x S = ── ── + ──-── +...2x 5x 13x(程序检验参考:x=6.66,n=8时,s=-16.492;x=6.66,n=15时,s=-28.469)源代码: #include int a=1,b=2,n,i,t=0; double s=0,x; scanf(“%lf%d”,&x,&n); if(n>=1) { for(i=1;i<=n;i++) { if(i%2) { s+=pow(-1,i+1)*a/(b*x); t=a; a=b; b=t+b; } else { s+=pow(-1,i+1)*a*x/b; t=a; a=b; b=t+b; } } printf(“%fn”,s); } return 0;} 运行结果: x3x5x7x9x,3!5!7!9! 实验内容: 利用泰勒级数sin(x)≈ 计算sin(x)的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项。 (程序检验参考:x=6时,sin(x)=-0.279415,count=13)源代码: #include double s=0,x; int i,count=0;scanf(“%lf”,&x);for(i=1;;i+=2){ } s+=pow(-1,count)*pow(x,i)/jiecheng(i);count+=1;if(fabs((pow(x,i)/jiecheng(i))) } printf(“sin(x)=%f count=%dn”,s,count);return 0;double jiecheng(int i){ } 运行结果: double f;if(i==0||i==1)f=1;else f=jiecheng(i-1)*i;return f; 实验内容: 三色球问题。若一个口袋中放有12个球,其中有3个红色的,3个白色的,6个黑色的,从中任取8个球,问共有多少种不同的颜色搭配? 源代码: #include int i,j,k,way=0; for(i=0;i<=3;i++) { for(j=0;j<=3;j++) { for(k=0;k<=6;k++) { if(i+j+k==8) way=way+1; } } } printf(“way=%dn”,way); return 0;} 运行结果: 实验内容:编程打印以下图案 ****** ****** ****** ****** 源代码: #include int i,j;for(j=1;j<=4;j++){ for(i=1;i<=4-j;i++) } { printf(“ ”);} printf(“******n”); return 0;} 运行结果: * *** ***** ******* 源代码: #include int i,j;for(j=1;j<=4;j++) { for(i=1;i<=2*j-1;i++) } printf(“*”);printf(“n”);return 0;} 运行结果: * * * * * * * * * * * * * * * * * * * * * * * * * 源代码: #include int i,j,m,n;for(j=1;j<=7;j++){ if(i<5) { } else { m=j-4;n=(15-2*j);m=4-j;n=2*j-1; } for(i=1;i<=m;i++) printf(“ ”); for(i=1;i<=n;i++)printf(“*”); printf(“n”);} return 0;} 运行结果: 实验内容: 输出下三角形乘法九九表--------1 2 3 4 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 源代码: #include 9n”); for(j=1;j<=i;j++) { printf(“ %d ”,k=i*j); } printf(“n”);} return 0;} 【C语言实验报告《逻辑结构程序设计》】推荐阅读: c语言实验报告实验4.doc08-10 c语言实验报告本11-08 c语言实验五函数11-18 c语言课后实验答案01-02 西南交大c语言实验06-24 《C语言循环结构》课程教学设计研究12-19 c程序设计实验报告08-06 组合逻辑电路实验设计10-175.c语言实验报告 篇五
6.C语言实验报告(四) 篇六
7.对C语言中结构化程序设计的认识 篇七
8.C语言上机实验报告_书写格式 篇八
9.C语言程序设计实验教案 篇九
10.C语言实验报告《逻辑结构程序设计》 篇十
11.C语言实验报告《逻辑结构程序设计》 篇十一
12.C语言实验报告《逻辑结构程序设计》 篇十二
13.大一C语言上机实验报告 篇十三