c语言总结(精选9篇)
--------13软件工程一班郭笑笑
------------老师:
徐
静
经过一学期的对c语言这门课程学习,我对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,更多的在运用起来的时候还是感到很棘手,因为私下练习的时间太短了。
上机实验是学习程序设计语言必不可少的实践环节,特别是c语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。
学习c程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间,为此,结合课堂讲授的内容和进度,老师为我们安排了多次上机实验。课程上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,还可以有以下几方面的好处:
1.加深对课堂讲授内容的理解。
2.熟悉程序开发环境、学习计算机系统的操作方法。
3.学习上机调试程序等等。我对程序调试还没有完全掌握,不能很快找出程序的错误。
因为课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,死记硬背也不容易记住。还有一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,不能很好地利用学到的知识编写c语言程序,解决实际问题。总的来说在这半年的时间里,我学到了许多,但是也有很多内容是不会的。我觉得我在这一学期中掌握的内容有(收获):
1.printf(“%*sn”,M,“字符串”+N)的用法说明 2.scanf函数的用法和说明
3.自增自减:n++、n--、++n、--n 4.进制的转换:二进制、八进制、十进制、十六进制
5.变量在内在中的存放与转换.6.3.字符-----‘’的作用:与一些字母组成转义字符,与数字组成代表八进制数.另外说明一下r,其作用是将当前位置移到本行开头,后面再输入字符时,原有的字符将会被覆盖。
7.5.逗号运算符.8..局部变量.全局变量 9..预编译处理命令
10.#define:宏定义只是在编译前对代码作简单的字符串替换,不会考虑任何错误.宏定义不是语句,后面不要加“;”.似懂非懂(不能很好地应用): 1.退出过程.(1)continue :用于结束某次循环继续下一循环.(2)break: 用于结束循环或结束switch语句.(3)return: 用于结束某函数.(4)exit: 用于结束某一程 2.void的说明.Void代表空类型,在定义指针变量或函数时可以定义为void型,定义指针变量后可以在用的时候通过强制类型转换使其指向任何类型的数据.定义函数时,只是说明不能有返回值.如果函数中出现return就会报错.3.指针:(1).指针的加减法:指针的加减法不是作简单的加减,而是以指针变量所占的字节数为单位进行加减.(2).数组名是指针常量,不能改变其值,比如数组a[ ],如果进行a++;就会报错
(3).虽然指针变量中存放的地址是整型数据,但不能将整型数据直接赋值给指针变量,应该这样(假如p为int *型),p=(int *)1000;但禁用些法,因为你不知道1000这个单元有没有被其它单元占用,后果不可预料,同样也不能将一个指针变量的值直接赋给整形变量,也要进行强制类型转换.(4)定义指针后,在使用之前一定要先给它赋初值,切记
(5).二维数组中指针问题(int a[3] [4]),数组名a是一个指向行的指针(指向数组),而在其前面加一个 * ,*a就是指向列的指针(指向无素).a与*都是指向a[0][0];但a+1(行指针)指向a[1][0];而*a+1(列指针,和*(a+0)+1一样)却指向a[0][1];同样在a+1前加一个*就又变成列指针了,*(a+1)+2就指向a[1][2].(6),复杂类型的说明:从变量名处起,根据运算符优先级结合,一步一步分析,下面以一个比较复杂的类型(int *(*p(int))[ ])为例: 第一步,p先与()结合,说明是一个函数,第二步,()内有一个int,说明函数有一个形参为int型,第三步与*结合,说明返回的是一个指针变量,第四步与[ ]结合,说明该指针变量指向数组,第五步再与*结合,说明数组中的元素为指针型,第六步说明数组中的指针元素的类型为int型,完毕,所以这是一个返回一个由整型指针变量组成的数组的指针变量的函数。4.结构体的应用。完全不会的:
在C语言程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,数组元素共用一个名称(即数组名),通过元素在数组序列的顺序号(即下标)来区分,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别[1]。
在C语言中,对数组定义的理解虽然看似简单,但由于数组的使用范围相当广泛,在对字符串、指针、函数等的过程中,都离不开数组。因此有必要对数组在解决实际问题中一些基本操作进行总结。
学习数组的关键要掌握它的定义、赋值和应用。
数组的应用可以分为排序、插入、删除、合并、查询,还可用来存储大数据等,下面分别介绍这些应用操作。
1 数组排序
数组排序是C语言中的一项重要内容,也是以后几种应用的基础。所谓排序就是杂乱无章的数据按照大小顺序排列,包括整型、实型、字符串的排序。排序的方法有很多种,常用的有交换法、插入法,其中交换法包括冒泡排序法和快速排序。我们以冒泡法排序为例。
冒泡法排序的思想是:对于n个数从小到大排序,将数组中相邻两个数进行比较,将小的调到前头,也就是说,第一个数和第二个数比较,大数放前,小数放后,第二个和第三个进行比较,大数放前,小数放后,依此类推,……,经过第一轮比较后,找到一个最大数在最下面。然后进行下一轮比较,一共要n-1轮就可把所有的数都排好序[2]。其算法描述的流程图如图一所示:
如果用一般变量来做这道题,将定义十个变量,而且在比较排序过程不能使用循环的方法一次解决问题,用数组的话就可以很方便地解决这个问题。在冒泡排序算法中很多同学在计算每轮中比较的次数出现问题。
2 数组插入
数组插入指的是有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。假如现在有一个由n个元素按照升序构成的数组,在插入一个数x时按下面的方法处理:
(1)如果插入的数x比a数组最后一个数大,则将插入的数放在a数组末尾。
(2)如果插入的数x不比a数组最后一个数大,则将x依次和a[0]到a[n-1]比较,直到出现a[i]>x为止,这时表示x应该插入到a[i-1]之后,a[i]之前。所以要将a[i]到a[n-1]各元素向后移一个位置(即a[n-1]变成a[n],a[n-2]变成a[n-1],…,a[i]变成a[i+1]),然后将x放在a[i]中[3]。该算法描述的流程图如图二所示:
在数组插入中,学生们容易出现数组越界问题,他们在定义数组时,数组的容量定义为n,应使数组的容量比原来的容量要大于1,因为要插入一个元素到数组中,数组元素个数会从原先的n个变成n+1个。还有一个比较容易犯错的问题是当一旦发现a[i]比x大时,没有中断比较的循环,导致插入错误。
3 数组删除
数组删除操作指的是用户从键盘中输入一个数,然后到数组中去查找这个数。如果数组中存在该数,则把该数从数组中删除掉;如果数组中不存在该数,则不用做删除操作。例如,有一个数组a,其中元素为1,2,2,2,5,4,2,3,若用户从键盘上输入一个数2,则要在数组中删掉2,删除之后的数组元素只有1,5,4,3。该删除操作算法的流程图如图三所示:
在数组删除操作中,学生们容易忽略要删除的元素在数组中连续出现的这种现象,导致漏删,所以程序中一定要当删掉一个元素时,循环变量i的值倒退一次,即i--。为了要正确输出删除之后的数组元素,应该在该程序中用一个变量count来计算删掉了几个元素。
4 数组合并
数组合并操作指的是对两个有序的数组合并之后仍然有序。例如:a[4]={1,5,100,200},b[3]={2,7,90},合并之后存放到数组c中,则c[7]={1,2,5,7,90,100,200}。该算法描述的流程图如图四所示:
在数组合并操作中,学生们容易遗漏a数组或b数组中末尾的一些元素。
5 数组查询
从数组中查询一个数最简单的方法是从第1个数开始顺序查找,将要找的数与数组中的数一一比较,直到找到为止(如果数组中无此数,则应找到最后一个数,然后判定“找不到”)。但这种“顺序查找法”效率低,如果数组中有1000个数,且要找的数恰好是第1000个数,则要进行999次比较才能得到结果,平均比较次数为500次。本文介绍效率较高的折半查找法,基本思路如下:
假如有已按由小到大排好序的9个数,a[1]~a[9],其值分别为:1,3,5,7,9,11,13,15,17,若输入一个数3,想查3是否在此数组中,先找出数组中居中的数,即a[5](其值为9),将3与a[5]比较有a[5]>3,显然3应当在a[1]到a[5]范围内,这样可缩小查找范围,查找范围缩小一半。再将3与a[1]到a[5]范围内的居中的数a[3](其值为5)比较有a[3]>3,则3应当在在a[1]到a[3]范围内,又将查找范围缩小一半。再将3与a[1]到a[3]范围内的居中的数a[2](其值为3)进行比较有a[3]=3,查找结束,一共比较了3次。如果数组中有n个数,则最多比较次数为int(log2n)+1。该算法的流程图由于篇幅原因,在此不列出。
6 利用数组完成高精度阶乘运算
计算机所能表示与处理的数的有效数字位数是有限的。例如,在字长32位的计算机上运行的程序中可处理的整数的最大值4294967295,对于求阶乘n!,当n较大时,会产生溢出。为了完成高精度阶乘运算,可以用一个整形数组存放一个参加运算的操作数,其中每个数组元素存放十进制表示的正整数的一个数字位。例如,程序正确时,能计算并输出8!值为10080,16!的值为2615348736000。该算法的流程图如图五所示:
在该操作中,学生们对存放阶乘结果的a数组的初始化赋值不正确,我们应该使a[0]=1,其余数组元素为0。当数组元素的值大于9时不知如何把该值分解成个位和十位,十位上的数字要进位到下个数组元素中。
7 结束语
目前很多编程专家在大型软件程序的开发中,使用数组来替代指针,可见数组是C语言编程的精髓[4]。利用它可以编写出颇有特色、质量优良的程序,实现许多用其它高级语言难以实现的功能。但数组使用比较灵活,十分容易出错。只有在编程过程中不断总结数组的使用技巧,通过在实践中不断摸索,才能准确无误地驾驭数组,所以要多做一些有关数组的应用问题。
参考文献
[1]郝彦琴.《C语言程序设计》中的数组[J].湖南农机,2008,35(11):34-35.
[2]谭浩强.C语言程序设计(第三版)[M].北京:清华大学出版社.
[3]谭浩强.C语言设计题解与上机指导(第三版)[M].北京:清华大学出版社.
【关键词】C语言;编程技巧;学习技巧;教学效果
前言:我国高校已经普遍开展C语言的学习,对培养知识经济时代下高素质、复合型人才起到了重要的推动作用。然而在实践过程中却发现,学生学习C语言的动力不足、掌握及运用能力较低,为C语言进一步发展蒙上了一层阴影。所以本文首先对C语言学习过程中的难点进行分析,随后探讨C语言编程技巧的应用内容,以为学生学习及课堂教学效果的提升提供帮助。
一、当前C语言学习难点
(一)函数的定义和应用
由于C语言是一门较为高级的计算机汇编语言,在学习过程中包含了大量的函数,而相应函数如何定义和使用成为当前学生学习的难点之所在。众所周知,C语言编程过程中往往会通过汇编语言来将函数功能在相应代码中实现[1]。然而,在实际运用及学习过程中经常会出现函数嵌套的事情发生,而产生该现象的原因则是在C语言编程过程中已經定义了一个函数,但是操作者并没有注意到此种情况,当使用不同定义的函数时,系统就会提示不能在函数体内定义函数。所以在C语言学习过程中关于函数的定于和使用是困扰学生的主要问题。
(二)编写程序的工整严谨性
运用C语言编写程序是当前知识经济时代下较为常用的程序编写方式,需要操作人员具有较强的逻辑思维能力以及编写水平,并且耐心要足够良好。编写程序主要是通过计算机检验来实现相应的功能,在编写过程中每一个细节问题都需要处理到位。一旦某个环节某个字母没有正确书写,那么将会导致编写的整段程序无法运行,降低了程序编写效率。而编程工整性和严谨性是考验每一个学生学习效果及能力的重要指标。但是对于当前大多数学生来说,编写程序仍然是一个难点问题,出错几率始终居高不下,导致学生在经过了很长时间学习后依然无法掌握正确的编写技巧,继而丧失了继续学习的兴趣和信心。所以C语言学习过程如何运用编程技巧来提高编写程序的工整严谨性成为当前亟待解决的问题。
二、C语言编程技巧在C语言学习中的应用
(一)指针技巧的掌握与运用
C语言编程技巧中指针是一个较为特殊的变量,在其中存储着大量的数值,可以被称作是内存地址之一。指针技巧可以通过分解来将各部分内容展现在学生面前,以促使学生明确指针的使用。当前C语言学习中指针由指针类型、指针指向类型、指针值、指针自身所占内存区所组成。指针类型是C语言学习及编程中最为常见的知识点,学生可以通过去除指针声明语句中所包含的指针名字来判断该指针类型,如:int*ptr、char*ptr,将指针名字ptr去掉后剩下的int*、char*即为指针类型。学生通过该技巧的使用可以在短时间内明确所有C语言指针的类型,为其应用提供了便利条件。指针指向类型相较于指针类型稍稍复杂一些,上例中去掉*后剩下的int、char等即为指针指向类型。所以指针技巧的掌握与运用主要在于学习者的耐心及细心程度,加强其主观重视程度后,学习C语言将会更加得心应手。
(二)C语言特有函数技巧的掌握于应用
C语言编程中函数的应用是实现特定功能的基础与前提,学生往往在函数的定义及使用过程中出现不同程度的问题,造成其学习效果不佳。因此,在C语言课堂教学中教师可以在函数定义所包含的名字、参数名称、类型以及函数返回值类型逐步分解并一一明确其各组成部分的功能,并且将独立的函数存储在编译系统数据库中,使用时输入#include指令即可将想要使用的头文件放入本文件中,使得C语言特有函数能够在短时间内被学生掌握及利用[2]。随着计算机技术快速发展,C语言特有函数的编写已经可以通过程序化步骤来实现,在方便了使用的同时,也降低了学生学习难度,使得C语言教学效果得到大幅提升。
(三)算法技巧的掌握与应用
算法是程序编写工作的重要组成部分,也是学习过程中花费时间较长的环节。为了能够提高学生学习效率,教师需要在课堂教学中将常用流程符号普及给学生,并且利用流程图来讲算法的应用逐一分解,向学生直观展示算法的应用。当前还可以利用自然语言来表示算法,同时与流程图讲解相结合,使得具备一定数学知识的学习者能够熟练掌握算法技巧,并运用在具体的程序编写工作中。C语言是建立在数学思想基础上的应用学科,数学思维在算法技巧掌握及应用中起到了重要的辅助所用。所以,在通过系统展示及分步讲解基础上拓展数学思维去寻找C语言程序编写规律,可以为其血气起到事半功倍的效果。
(四)位运算技巧的熟练掌握与应用
C语言之所以独立于其他计算机语言,就在于位运算使用。位运算是一种以二进制为对象、进行各种程序、数据、结果运算的一种基本算法。特别是在计算机文件中其应用更为频繁,掌握了位运算技巧,就相当于掌握了打开宝藏大门的钥匙。比如:数独时需要使用大量Hash表来统计九宫格里已经存在那些数据,如果在一个九宫格之中已经存在数字2和5,那么采用位运算后该九宫格可以使用数字18来表示;如果某一行或某一个九宫格为运算状态为511,则代表了该九宫格空间已满。要想改变其状态,只需要对其进行位操作,而省去了将数据重新转换成为二进制修改之后在转回来的步骤,使得整个C语言学习效率得到大幅提升[3]。
结论:综上所述,本文通过对当前C语言学习难点的分析得出了困扰学生的主要问题在于函数的定义及使用和编写程序的工整严谨性。并以此为依据提出了C语言编程技巧中指针、特有函数、算法、位运算等技巧熟练掌握是提高C语言学习效率的关键。希望通过本文的分析能够为我国高校改进C语言教学提供帮助,以促使C语言知识正迁移。
参考文献:
[1]段煅.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护,2010,12(20):150-151.
[2]余勍,王捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013,25(07):108.
2013至2014学年第二学期我从事了13级计算机科学与技术专业(1)班和(2)班《C语言程序设计》课程的教学工作,该课程分为实践教学和理论教学两个部分。下面就本学期本人的备课情况和这两个班学生理论和实践的学习情况作如下总结:
一、本人教学情况
每节课上课之前,本人都做了充分的准备。
该课程理论部分安排在多媒体教室教学,对于多媒体教室教学,首先,教学课件的质量直接影响着教学效果。在总结以前教学经验的基础上,本学期我制作课件的原则是在囊括所有需要掌握的知识点的情况下,课件的内容尽量简洁,力求做到言简意赅,并将程序的执行流程制作成动态的效果。一方面是避免学生看到大量文字的幻灯片而产生反感情绪,另一方面动态幻灯片不仅能够帮助学生理解同时也能够提高学生的学生兴趣;其次,为了防止学生长时间看着幻灯片听课而走神的情况,在教学中尽量引导学生互动,引导学生思考、回答问题、动笔解决问题、上黑板等;
实践教学安排在机房,在机房上课通常会出现两种主要情况。一种是学生无所事事,为了防止这种情况的发生,本人每次实践课之前都布置了充足的实践内容,让学生有事可做;另一种情况是学生层次不同,有些学生因为不会做而无所事事,针对这种情况,每节课布置的实践任务都分为基础和提高两个部分,对于特别需要提醒或提示的内容,实践之前我会进行讲解、分析 并演示,这样就满足了不同层次的学生的学习要求。
二、学生理论学习情况
这两个班都是本科班,但学生的基础和学习能力与想象的存在一定的差距,因此教学中需要根据学生的掌握情况不断调整。学生在理论学习的时候,由于C语言这门课是程序设计的第一门课,也是专业课的起点,新知识点较多,再加上由于课时的限制,学习进度较快,所以学生掌握起来有点吃力。其中一班学生纪律方面松散一些,上课迟到现象比较严重,所以学生效果相对于二班来说要差很多。二班学生上课积极性较高,听课也比较认真,能够大部分学生,尤其是女生能够积极的和老师互动,学习效果良好。
三、学生实践学习情况
该课程开始安排的机房由于机器陈旧和机器数量的限制,教学效果受到的一定的影响,但很快调整机房后,教学条件良好,教学效果有了明显的提高。实践教学中,同样二班学生积极性较高,遇到问题能够积极主动的问老师或相互讨论,实验报告完成情况良好,而一班气愤比较沉闷,学生不能够主动的问问题,实验报告相对来说不够认真。
四、意见和建议
1·C程序是由函数构成的。一个C源程序至少包含一个函数(main函数),也可以包含一个main和若干其他函数。C的函数相当于其它语言中的子程序。用函数来实现特定的功能。可以说C是函数式的语言。程序全部工作都是由函数来完成的。C的函数库十分丰富,标准C提供一百多个库函数,TurboC和MS C4.0提供三百多个库函数。
C的这种特点使得容易实现程序的模块化。2.一个函数由两部分组成:
(1)函数的说明部分。包括函数名、函数类型、函数属性、函数参数(形参)名、形式参数类型。
例如例1.3中的max函数的说明部分为。int max(x,y)函数类型 函数名 函数参数 int x,y;形参类型 形参
一个函数名后面必须跟一对圆括弧,函数参数可以没有,如main()。
(2)函数体,即函数说明部分下面的大括弧{„}内的部分。如果一个函数内有多个大括弧,则最外层的一对{
}为函数体的范围。
函数体一般包括:
①变量定义。如例1.3中main函数中的“int a,b,c”。
②执行部分。由若干个语句组成。
当然,在某些情况下也可以没有变量定义部分(例如例1.1)。甚至可以既无变量定义也无执行部分。如:
dump(){ } 它是一个空函数,什么也下干,但这是合法的。3.一个C程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何(main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前在另一些函数之后)。
4.C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上人程序没有行号,也不象FORTRAN或CoBoL那样严格规定书写格式(语句必须从某一列开始书写)。5.每个语句和数据定义的最后必须有一个分号。分号是C语句的必要组成部分。例如:
c=a十b;
分号不可少。即使是程序中最后一个语句也应包含分号(这是和PAScAL语言不同的)。
6.C语言本身没有输入输出语句。输入和输出的操作是由库函数scanf和printf等函数来完成.C对输入输出实行‘函数化'
通过一个学期的学习,c语言的学习也进入尾声了,我由以前的对C语言毫不知道逐渐转变为熟悉,也逐渐发现了其中的优势。可能是女孩子的原因,对电脑也没有太多兴趣,但是因为是专业课的而当我真正学习他的时候,却发现它并非我想象中的那么好学。刚开始学习时候,我是满怀信心的去听的,到最后却听的一头雾水。随课程的深入,我发现自己越来越跟不上老师的进度,这让我感到很心慌。但是和老师和同学的交流我发现很多同学和我遇到的差不多,老师曾说过虽然不喜欢但是不能讨厌,我就带这心态慢慢去学习。去了解c语言。
C语言是一种计算机程序设计语言。具有简单易学和可移植性好等特点,具有较强的生命力和广泛的应用前景它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言。随着计算机技术的深入发展,特别是微机的普及,越来越多的人在学习计算机知识以满足社会发展和自身的需要。C语言不仅为计算机专业人员所使用和喜爱,近年来,许多计算机应用人员也开始喜爱和使用C语言。实践证明,它是一种很好的程序设计语言。
C语言是一门实用性的课程,学校在安排课程表时应该将实验课和理论课交叉着安排,这样就可以将之前学习的课程进行复习一下,更好的掌握知识。虽然说拷贝别人的程序是不好的,不过我认为对于我们这些初学者而言,对于老师上课写的经典的程序可以选择性的拷贝给我们。对于我们初学者而言也是比较有效的。我现在发现,对于书上的代码,我能够看懂他们的意识,但当自己去编写的时候,却相当的不顺利,我觉得有很多困难:一是对于在编程的时候没有一个总体的思路,我不知道应该如何来进行一个总体的布局,还有我不知道应该如何来运用各种语句。自己写程序时能检验自己学习的情况,了解他们的规则和注意事项,怎么实现的,这样写出程序才得心应手。同样也养成良好的编写习惯。比如用缩进的方式,随时保存,程序最好简单易懂等好的习惯。让自己在以后调试程序时能节省很多时间增加工作效率。C语言是一门最基础的程序设计语言,只有学习好了C,才能更好的学习其它程序设计语言,如C++、Java。才能更好的学习之后的专业课。通过C语言的学习,也学会了一些学习方法,应该是验证了一些学习方法,课前预习,课上认真听讲,课后仔细复习,同时,实验课上将老师讲授的知识认真实践,只有这样才能将课程学习好,这也是学习每门课程最基本的学习方法。当然c语言还涉及其他学科,比如英语和数学。其是c语言的核心是运用数学。数学好才是c语言学好的关键。又因为c语言更多的是用英语表达的,如果连看都看不懂那还学什么c语言呢。所以学好c语言还要学好其他学科,为学好这门语言打下坚实的基础。
我对C语言的总体认识如下:开始,初步认识到了什么是C语言、C语言和其它程序设计语言有什么不同以及它的发展史。后几章学习到了C最基本的东西,运算符、数据类型、变量的使用等,同时也学会了C程序的基本结构,包括顺序程序设计、选择程序结构设计、循环程序设计。能够参照书上的简单例子写一些简单程序。并且我们学习了程序的控制结构,掌握了while、for、等一些循环语句同时也能够用这些结构写一些简单的程序,如求最小公倍数,数字的排序、倒序等。认识到C语言的简单用途。之后的几章学习都有点难懂,数组,函数的模式化,指针都是非常难的,很让人糊涂。几乎听不懂,这也是c语言的核心所在。同时这些地方也是我下功夫最深的。第六章学习数组,数组避免了程序的重复输入,避免了程序的冗杂。掌握了整型数据数组,学会了用数组对字符进行复制、粘贴、连接、求长度,同时也学了选择排序、冒泡排序等简单的程序。第七章是函数的调用,能很好的节省写程序的步骤和方法。但是我也只能明白一点的皮毛。第八章指针学的不是很好,只能简单的明白指针。结构体把不同类型的数据类型结合在一起,结合fopen和fclose,可以对文件进行输入和输出。这时体会到了C语言的奇妙所在。一直想把文件里面的东西用C语言操作,把C语言操作结果用文件输出,终于可以实现了。
老师给我们和自己总结的学习方法:首先,要求按照教材上的程序实例进行原样输入,运行一下程序是否正确。在这一 基本掌握C语言编程软件的使用方法 ; 然后,在第一步输入的C程序的基础上进行试验性的修改,运行一下程序看一看程序结果发了什么变化,分析结果变化的原因,加深所学知识点的理解。事实上这和第一步是同步进行的,实现“输入”加深知识的记忆,“修改”加深对知识的理解。记忆和理解是相辅相成的,相互促进。第三,还可以将教材中的正确的程序改成错误的程序,运行一下程序,看出现的错误信息提示,并记下错误信息,再将程序改成正确的,运行一下程序。这样反复修改,就能够学习C语言程序发生错误的原因和修改错误的能力。刚开始,每次只改错一个地方,目的是显示发生该错误的真正原因,避免一次改动多个地方,弄清发生错误的真正原因。其次,上机调试程序时可以带一个笔记本,记下英文错误提示信息和解决该错误问题的方法,积累程序调试经验,避免再编程时犯同样的错误。最后,就是要求不看教材,即使程序不能运行,看自己能否将其改正过来,使其能正确运行。目的是对前两步的记忆、理解进一步强化。对比前两步,设计一些相同的问题,试着自己编程,然后调试,再逐渐扩大,增加程序行,添加一些辅助功能等等。可以先做小程序,然后综合各个小程序,试着做一个稍大的程序,提高自己的综合运用能力。比如进行课程设计实训就是一种不错的选择,会对实际运用能力有较大提高,并且会对所学知识进行加深、巩固理解。在实践的同时多思考问题,多看别人优秀的解题思路与方法,多看别人优秀的代码,尝试自己去实现或者模仿着去实现,让别人对你的代码多提意见,探究别人的思维过程,增强自己的思维能力,拓展视野,经常看看自己以前写的东西,有空拿出来改良改良,我想每隔一段时间,都会有意想不到的收获。
1 C语言
1.1 C语言特点
C语言在计算机语言编程中应用最流行、最广泛, 在学习中应对C语言有一点了解, 在使用过程中, C语言具有以下的特点: (1) C语言比较紧凑、操作灵活、操作方便, 没有非常严格的语法限制, 比较自由的书写程序过程, C语言有效结合了低级语言的实用性及高级语言的结构性, 功能非常强大。 (2) C语言应用范围广泛。C语言是学习其他语言程序的基础, 可植性比较强, 在多种操作系统中, 皆适用C语言, 可以灵活使用运算符, 实现编程的高效性。 (3) C语言的语法中数据结构多种多样, 简单复杂皆有, 图形处理能力甚强。 (4) C语言可以使用数据和代码分割, 具有结构式的语言特点, 程序层次清晰, 便于维护、使用及调式进行。C语言能够对物理地址进行直接访问以及各种操作。因此, C语言是学生学习计算机课程并不可少的一门知识, 但要学好C语言, 盲目的学习是不对的。
1.2 C语言的产生背景
1970年美国的Ken Thompson, 以BCPL语言作为基础, 然后设计出简单且接近硬件的B语言, 但是B语言功能比较有限, 过于简单。1972年~1973年, 美国D·M在B语言基础之上设计出C语言, C语言的出现给程序的编写带来不少便利, 而且编写程序比较自由, 吸引许多软件使用它。C语言语法里的运算和程序非常丰富, 编写程序的运算方法很多, 拥有可以实现一些高级程序都无法实现的功能, 且C语言用起来比较灵活, 在运算各种数据结构时, 不管事简单还是复杂, 都可以简单实现。C语言不仅在运算和程序编写上更加便利, 且可以直接访问地址, 并进行操作, 较快较容易的对程序进行编译以及控制。
2 学习
虽然许多学生选择计算机专业, 努力学习C语言, 但是学生仍然很难对C语言产生兴趣。C语言是计算机专业学习的基础课程, 且功能强大, 用途广泛。随着经济迅速发展, 第三产业越发越重要, 计算机相关的产业所占比重越来越大, C语言功能强大, 在计算机中越来越受到重视。
针对C语言的学习, 仅仅是课堂的理论传授远远不够, C语言理论比较丰富, 集合众多语言特点, 通过直接的感官方式教授给学生, 学生难以完全理解。如果教师能够把内容通过直观的方式展示出来, 比如让学生上机操作, 让理论与实践相结合, 提高学生对C语言的学习兴趣。
C语言中包含比较复杂的结构和算法, 许多学生难以理解, 只能简单的记忆, 但是学习效果比较低, 且学生觉得枯燥, 没有较高的学习兴趣, 在学生学习理论的同时, 应该多上机操作, 更加容易的掌握C语言的规律和方法。教师要注意自己的教学方法, 不能简单的进行实践教学与理论教学, 要关注学生, 加强学生与教师的沟通, 帮助学生理解课堂课外的C语言相关知识, 在教授知识之外, 教师要突出C语言在计算机学习中的重要性, 让学生更容易、深入的理解及分析C语言, 增加学习兴趣。
3 C语言编程的技巧
学生觉得C语言抽象、难以理解, 归根结底是没有找到学习的技巧, 对于刚入门者说, 学习C语言比较吃力, 学习任何一项技能都需要一个过程, 关键在于掌握其精髓, 掌握其中精髓再学习这门课程就容易许多。对于C语言, 编程技巧非常重要。 (1) 指针的掌握。掌握指针是C语言中比较重要的技巧, 指针虽有消耗内存的缺点, 但指针在运算中速度加快, 编程语句也更加容易, 指针的耗内存虽大, 但对整个编程而言却是微不足道。学生在学习指针这一章节时, 需加强学习能力, 除学习课堂知识之外, 可以多在网上查询资料, 进行补充, 掌握好指针这一技巧。 (2) 掌握数学知识。在学习计算机过程中, 数学知识的重要性不容小觑, 能够解决C语言运算中的许多问题, IT界有一句话叫“数学是计算机之母”, 可见数学对计算机的重要性。在C语言学习中, 逻辑思维较好的同学可以较容易的学习C语言, 进行编程前会分析, 选择更加简单的运算方法, 因此, 数学知识对学习C语言起很大作用。 (3) 掌握位运算。位运算的使用可以方便简洁代码, 提高运算效率, 较快解决问题。在计算机程序中, 位是最小数据单位, 是所有操作和运算的基础单位, 位运算是所有操作的基础运算程序。当然具体问题需要具体分析, 提高学生兴趣和编程效率, 让C语言的应用更加广泛最为重要。
4 结语
在学习C语言的过程中, 学生应准确了解C语言的特点, 学习并掌握C语言的编程技巧, 提高学生的学习兴趣, 学习更加具有目的性, 提高C语言的学习效率以及学习质量。培养学生的编程能力, 能够更好的服务社会。
摘要:随着时代的发展, 信息技术发展迅速, 计算机人才被社会所大量需求。因此大学中大都设立计算机专业, 为社会培养所需人才, C语言是计算机专业的重要课程之一, 是大一课程学习中比较基础的一门课程, C语言功能强大, 对于学生以后专业基础起到很大的作用, 但是学生学习效果并不是很好, 即使努力学习也没有得到预期的效果。笔者对C语言编程技巧在C语言学习进行研究, 并且提出解决措施。
关键词:C语言,学习编程,语言特点
参考文献
关键词:数组;元素;数据;类型
中图分类号:TP313文献标识码:A文章编号:1007-9599 (2010) 16-0000-02
Elements of the Array in C-language
Zhang Kexing
(Foreign Language Teachers College of Taiyuan University,Taiyuan030012,China)
Abstract:The array is the most commonly used programming data st-
ructure.Array can be divided into array of values(integer group,real array),a character array and pointer array and the array of structures.
This array will be examples of various types were analyzed and explained.
Keywords:Array;Element;Data;Type
一、引言
數组是相互关联的一批数据的序列,序列中的数据称为数组的元素,可按照排列顺序编号,起始编号一般为0,前后两个数据的编号有差异,通过编号可以唯一指定数组中的数据成员。数组中的元素可以是基本类型,也可以是构造类型。按照数组元素的不同可将数组分为数值数组、字符数组、指针数组、结构数组。
二、数值数组
数值数组是指数组元素是整型、实型、及其相关类型的数据,简单说,就是元素是数字的数组。
例1:
main()
{
int i,a[10];
for(i=0;i<=9;i++)
a[i]=i;
for(i=9;i>=0;i--)
printf("%d ",a[i]);
}
在该例中,第一个for语句给数组a中的10个元素赋值为整形数据0-9,赋值以后数组中数据如下:
第二个for语句将数组a中的10个数字反序输出,即9、8、7、6、5、4、3、2、1、0
数值数组是数组中使用率最高的数组,需要注意的是一个数组中的数据必须是同一种类型的数据,
{int a[3];
a[0]=3;
a[1]=2.5;
a[2]=3.0;}
是不合法的。
三、字符数组
C语言没有专门定义字符串数据类型(如其他语言中的string),它用以' '结尾的字符数组来表示一个逻辑意义上的字符串。
字符数组主要有两种用途,(1)存储字符串,(2)存储字符或字符变量。这两个是不同的,刚开始接触时很容易混淆。下面进一步分析这两者的不同。
首先初始化时不同,用于存储字符串,例如:char str[]="Hello"; 用于存储字符或字符变量,例如:char Chars[]={‘H‘‘e‘,‘1‘‘1‘,‘o‘}。这两者的存储方式是一样的,但是存储内容稍微有所不同,那就是第一种情况会在结尾加上‘ ’,存储情况类似于{‘H‘‘e‘,‘1‘‘1‘,‘o‘,‘ ‘},存储空间会比第二种情况大一点,但是这个存在空间并不被计算进字符串(其实只是字符数组)变量中。
C语言中提供的字符串操作函数其实是针对于结尾是‘ ‘的字符数组进行的。输出函数printf中的输出参数%s也是针对于结尾是‘ ‘的字符数组。
另外,还有一种方法可以定义字符串(其实也是字符数组),声明如下:
char * string = "this is a point charArray.";字符指针指向字符数据的第一个字符的位置。
最后,有两点特别说明。
(1)字符串常量给出的是地址值。如
char *p, s[10];
p="hello";//正确
(2)不能用赋值语句给字符数组整体赋一串字符,例:
char str[10];
str = "abc";//错误
例2:
char c[10]={‘c’, ‘’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’};
赋值后数组元素如下:
四、指针数组
在C语言中,一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组说明的一般形式为:
类型说明符*数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。
例如:
int *pa[3]
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。
例3:
通常可用一个指针数组来指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。
main(){
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
int i;
for(i=0;i<3;i++)
printf("%d,%d,%dn",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%dn",*pa[i],p[i],*(p+i));
}
本例程序中,pa是一个指针数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p与a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。
在C语言中,数组元素全为指针的数组成为指针数组。
一维指针数组的定义形式为:“类型名*数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptr_array[10]。
指针数组的含义:
指针数组中的每一个元素均为指针,即有诸形如“*ptr_array[i]”的指针。
由于数组名本身也是一个指针,因此指针数组中的元素亦可以表示为“*(*(ptr_ayyry+i))”。又因为“()”的优先级较“*”高,且“*”是右结合的,因此可以写作**(ptr_array+i)。
五、结构数组
数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。
方法和结构变量相似,只需说明它为数组类型即可。
例4:
struct stu
{
int num;
char *name;
char sex;
float score;
}boy[5];
定义了一个结构数组boy,共有5个元素,boy[0]~boy[4]。每个数组元素都具有struct stu的结构形式。
例5:计算学生的平均成绩和不及格的人数。
struct stu
{
int num;
char *name;
char sex;
float score;
}boy[5]={
{101,"Li ping",'M',45},
{102,"Zhang ping",'M',62.5},
{103,"He fang",'F',92.5},
{104,"Cheng ling",'F',87},
{105,"Wang ming",'M',58},
};
main()
{
int i,c=0;
float ave,s=0;
for(i=0;i<5;i++)
{
s+=boy[i].score;
if(boy[i].score<60) c+=1;
}
printf("s=%fn",s);
ave=s/5;
printf("average=%fncount=%dn",ave,c);
}
本例程序中定义了一个外部结构数组boy,共5个元素,并作了初始化赋值。在main函数中用for语句逐个累加各元素的score 成员值存于s之中,如score的值小于60(不及格)即计数器C加1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。
六、总结
数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及指针数组和结构数组。数组可以是一维的,二维的或多维的。数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。要想将不同的数据用不同类型的数组存放,就需要深入了解每一种类型的数组及其特点,这样才能灵活运用,充分发挥每种数据类型的长处。
参考文献:
[1]谭浩强.C程序设计教程[M].北京:清华大学出版社,2007,7
[2]李岩.C语言程序设计基础与上机知道[M].北京:清华大学出版社,2006,3
[3]马秀丽等.C语言程序设计[M].北京:清华大学出版社,2008,3
[4]罗坚.C语言程序设计[M].北京:中国铁道出版社,2009,2
作者簡介:
张科星(1980-),女,山西太原人,研究生,太原大学外语师范学院,助教,研究方向:网络,计算机教育。
1、函数方法: #include
scanf(“%d”,&a[i]);sort(a,10);printf(“The sorted array:n”);for(i=0;i<10;i++)
printf(“%d ”,a[i]);printf(“n”);}
void sort(int array[],int n){int i,j,k,t;
for(i=0;i {k=i; for(j=i+1;j if(array[j] k=j; t=array[k];array[k]=array[i];array[i]=t;} } 2、数组方法:实验6_1 #include printf(“enter data:n”); for(i=1;i<=10;i++) {printf(“a[%d]=”,i); scanf(“%d”,&a[i]); } printf(“n”); printf(“The orginal numbers:n”); for(i=1;i<=10;i++) printf(“%5d”,a[i]); printf(“n”); for(i=1;i<=9;i++) {min=i; for(j=i+1;j<=10;j++)if(a[min]>a[j])min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } printf(“nThe sorted numbers:n”); for(i=1;i<=10;i++) printf(“%5d”,a[i]); printf(“n”);} 3、指针方法:(教材209 例题8.9)#include scanf(“%d”,p++);p=a;sort(p,10);for(p=a,i=0;i<10;i++) {printf(“%d ”,*p);p++;} printf(“n”);} void sort(int x[],int n){int i,j,k,t; for(i=0;i {k=i; for(j=i+1;j if(x[j]>x[k])k=j; if(k!=i) {t=x[i];x[i]=x[k];x[k]=t;} } } 二、素数算法: 1、筛选法求素数(教辅41.1题)#include for(i=1;i<=100;i++) a[i]=i; a[1]=0; for(i=2;i for(j=i+1;j<=100;j++) {if(a[i]!=0 && a[j]!=0) if(a[j]%a[i]==0) a[j]=0; } printf(“n”); for(i=2,n=0;i<=100;i++) { if(a[i]!=0) {printf(“%5d”,a[i]); n++; } if(n==10) {printf(“n”); n=0; } } printf(“n”);} 2、(1)For循环方法: #include printf(“please enter a integer number:”); scanf(“%d”,&m); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break; if(i>k)printf(“%d is a prime number.n”,m); else printf(“%d is not a prime number.n”,m);} (2)求100~200之间素数: # include for(m=101;m<=200;m=m+2) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break; if(i>=k+1) {printf(“%d ”,m); n=n+1; } if(n%10==0)printf(“n”); } printf(“n”);} 3、函数方法:实验7_1(教辅63.3题)#include int n; printf(“ninput an integer:”); scanf(“%d”,&n); if(prime(n)) printf(“n %d is a prime.n”,n); else printf(“n %d is not a prime.n”,n);} int prime(int n) {int flag=1,i; for(i=2;i if(n%i==0) flag=0; return(flag); } 三、最值问题: 1、函数方法,两个数比较大小(教材144.例题7.2)#include int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max is %dn”,c);} int max(int x,int y){ int z; z=x>y?x:y; return(z);} 2、二维数组,求出其中值最大的那个元素值:(教材123.例题6.5)#include int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; max=a[0][0]; for(i=0;i<=2;i++) for(j=0;j<=3;j++) if(a[i][j]>max) {max=a[i][j]; row=i; colum=j; } printf(“max=%d,row=%d,colum=%dn”,max,row,colum);} 3、有三个字符串,要求找出其中最大者(教材136.例题6.9)#include char string[20]; char str[3][20]; int i; for(i=0;i<3;i++) gets(str[i]); if(strcmp(str[0],str[1])>0) strcpy(string,str[0]); else strcpy(string,str[1]); if(strcmp(str[2],string)>0) strcpy(string,str[2]); printf(“nthe largest string is:n%sn”,string);} 4、函数方法,四个整数,找出最大值:(教材152.例题7.5)#include int a,b,c,d,max; printf(“Please enter 4 interger numbers:”); scanf(“%d %d %d %d”,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(“max=%d n”,max);} int max_4(int a,int b,int c,int d){int max_2(int a,int b);int m; m=max_2(a,b);m=max_2(m,c);m=max_2(m,d);return(m);} int max_2(int a,int b) 这也可以这么写 int max_2(int a,int b){return(a>b?a:b); {if(a>b)return a;} else return b;} 四、辗转相除问题:(最大公约数最小公倍数问题) 1、一般法,求最大公约数和最小公倍数(教辅26页,第一题)#include int p,r,n,m,temp; printf(“请输入两个正整数n,m:”); scanf(“%d,%d,”,&n,&m); if(n { temp=n; n=m; m=temp; } p=n*m; while(m!=0) { r=n%m; n=m; m=r; } printf(“它们的最大公约数为:%dn”,n); printf(“它们的最小公约数为:%dn”,p/n);} 2、函数法: void main(){int hcf(int,int); int lcd(int,int,int); int u,v,h,l; scanf(“%d,%d”,&u,&v); h=hcf(u,v); printf(“H.C.F=%dn”,h); l=lcd(u,v,h); printf(“L.C.D=%dn”,l);} int hcf(int u,int v){int t,r;if(v>u) {t=u;u=v;v=t;} while((r=u%v)!=0) {u=v; v=r;} return(v);} int lcd(int u,int v,int h) { return(u*v/h); } 五、有关指针的实验题: 1、实验9-1(输入3个整数,由小到大的顺序排列)(1)#include void swap(int *p1,int *p2) {int p; p=*p1;*p1=*p2;*p2=p; }(2)#include void swap(char *p1,char *p2){char p[20]; strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} 2、实验9_2(将n个数,输入时顺序的逆序排列)#include scanf(“%d”,&num[i]);p=&num[0];sort(p,n);printf(“Now,the sequence is:n”);for(i=0;i printf(“%d ”,num[i]);printf(“n”);} void sort(char *p,int m){int i;char temp, *p1,*p2;for(i=0;i {p1=p+i; p2=p+(m-1-i); temp=*p1; *p1=*p2; *p2=temp; } } 3、实验9_3(写一函数,求一个字符长度)#include int length(char *p) {int n;n=0;while(*p!=') {n++; p++;