c语言十篇

时间:2023-04-07 14:38:03

c语言

c语言篇1

关键词:Java

面向对象

c++

编程语言

中国分类号:TP312

文献标识码:A

文章编号:1002-2422(2010)03-0088-03

1 Java语言的特点

(1)简单性

Java继承了C/C++的语法,丢弃了其中不常用又容易引起混淆的功能,特别是非面向对象的内容,取消了c语言的结构、指针、#define语句、多重继承、全局变量和函数、GOTO语句、操作符重载和自动类型转换等等。

(2)面向对象

Java是一种纯面向对象的语言,具有封装、继承和多态的特性,无全局变量或函数,可以被用于面向对象这种现代软件工程。

(3)分布式

Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,象本地一样。

(4)解释型

Java写成的源代码需要被编译成高阶的字节码,其与机器架构无关。然后,这种字节码在任何Java的运行环境中由Java虚拟机解释执行。保证了Java与平台无关性和可移植性。解释执行与及时编译技术的完美结合,提供了相当高的运算性能。

(5)多态的支持

Java是一种非常注重对象形态转换的语言,所以在编译时期就会做形态转换检查,在执行时期,Java也会做一些形态上的检查。

(6)垃圾收集和异常处理

由于Java垃圾收集器会做自动的垃圾收集,这里的垃圾指一些不会被再使用的对象,所以程序设计者不需费心。内存会被自动地管理,Java本身提供了许多面向对象的异常(Exception)处理,所以程序在执行时期所发生的错误,都可以由程序自己来处理。

(7)安全性

Java设计时对系统的安全,特别是网络安全做了周密的考虑。通过字节码验证、内存调用方式、资源使用权限等进行多层次的安全管理。Java被认为是在任何系统上最安全的应用程序之一。

2 Java的技术平台

Java不仅仅是一种语言,更重要是一种区别于传统系统,遵循“网络就是计算机”信条的平台技术。Java平台将面向对象系统扩展成包括程序和数据的网络计算机,而这个平台的核心就是Java虚拟机。Java虚拟机的概念和实现使Java平台成为万能开发平台,实现了Java程序“编写一次,到处运行”。Java虚拟机是一种抽象化的计算机,可以在其上面执行Java的字节码。其本身的设计原则是“小而简单”,目的是为了尽可能在所有机器上都能安装。这样的精简原则,使得其能够在现有的各种平台上都可以顺利执行,适合各种网络的环境。Java的技术平台的工作原理:第一步Java用一个编译器将源程序代码(.java)转换成可执行程序(.class),Java编译器生成的是独立于处理器结构的字节代码。第二步字节代码用一个Java虚拟机来执行,JVM是理想化的Java处理芯片,通常是在软件上实现而不是在硬件上实现。

3 Java语言和c++语言的比较

c++和Java都属于杂合语言,允许采用多种编程风格。C++是一种杂合语言,支持与c语言的向后兼容能力。由于C++是c的一个超集,所以包含的许多特性都是c语言不具备的,这些特性使C++在某些地方显得过于复杂。但在Java中,设计者觉得这种杂合并不象在C++里那么重要。JavB保留了C++的语法,但忽略了资源引用、指针算法、操作符重载等潜在危险,是C/C++的简化版本。所以Java虽然是从C++衍生出来,Java和C++之间仍存在一些显著的差异,这些差异代表着技术的极大进步,证明了Java是一种比c++更优秀的程序设计语言。从面向对象(00)程序设计的角度,论述一下Java和C++的重要差异:

(1)单根结构

在c++中,可在任何地方启动一个新的继承树,所以最后往往看到包含了大量树的“一片森林”。在Java中,采用了一种单根式的分级结构,因此所有对象都是从根类统一继承。尽管这表面上看似乎造成了限制,但由于每个对象肯定至少有一个object接口,所以往往能获得更强大的能力,Java的强制单根结构更好地符合了面向对象(00)语言的标准。

(2)取消指针

Java和C++用new创建一个对象的时候,例如:Strings=new String(“object”):都会获得一个对象引用。然而,C++对象引用在创建时必须进行初始化,而且不可重定义到一个不同的位置。但Java对象引用并不一定局限于创建时的位置。可根据情况任意定义,这便消除了对指针的部分需求。指针通常被看作在基本变量数组中四处移动的一种有效手段。在c++里,必须用大量采用指针指向任意一个内存位置,这同时会使其变得不安全,也是Java不提供这一支持的原因。在Java里,没有象C++那样的指针,Java允许其以更安全的形式达到相同的目标。Java没有全局函数,只有类,因而可以用传递的方式实现对象的引用。

(3)自动垃圾收集机制

Java中没有C++“破坏器”,变量不存在“作用域”的问题。Java有个finalize()方法是每一个类的成员,在某种程度上类似于c++的“破坏器”。但finalize()是由垃圾收集器调用的,而且只负责释放“资源”,如打开的文件、套接字、端口、URL等。如需在一个特定的地点做某件事情,必须创建一个特殊的方法,并调用它,不能依赖finalize()方法。由Java不支持破坏器的概念,针对类内的基础类以及成员对象,Java采用垃圾收集器自动清除,所有对象都会被当作“垃圾”收集掉。自动垃圾收集意味着在Java中出现内存漏洞的情况会少得多,但也并非完全不可能。若调用一个用于分配存储空间的固有方法,垃圾收集器就不能对其进行跟踪监视。而在另一方面,C++中的所有对象必须用finalize()方法破坏,然而,内存漏洞和资源漏洞多是由于编写不当的finalize()造成的,或是由于在已分配的一个块尾释放一种资源造成的。Java垃圾收集器是在C++基础上的一种极大进步,使许多编程问题得以解决。

(4)异常控制机制

Java的异常规范比c++的出色得多。Java中的所有异常都是从基础类Throwable里继承而来的,所以可确保得到的是一个通用接口。丢弃一个错误的异常后,不是象C++那样在运行期间调用一个函数,Java异常规范是在编译期间检查并执行的。被取代的方法必须遵守那一方法的基础类 的异常规范,可丢弃指定的异常或者从那些异常衍生出来的其他异常。这样一来,最终得到的是更为“健壮”的异常控制代码。

(5)单一继承

Java中的继承具有与c++相同的效果,但采用的语法不同。Java用extends关键字标志从一个基础类的继承,并用super关键字指出准备在基础类中调用的方法,与当前所在的方法具有相同的名字。然而,Java中的super关键字只允许访问父类的方法,亦即分级结构的上一级。通过在c++中设定基础类的作用域,可访问位于分级结构较深处的方法,亦可用super关键字调用基础类构建器,所有类最终都会从Object里自动继承。和C++不同,Java不存在明确的构建器初始化列表,但Java编译器会强迫在构建器主体的开头进行全部的基础类初始化,而且不允许在主体的后面部分进行这一工作。其语法如下:

public class A extends B{public A(String msg){super(msg);∥调用基础类构建器}pubic C(int i){ super.C(i);∥调用基本方法}}

Java提供了一个interface关键字,其作用是创建抽象基础类的一个等价物。在其中填充抽象方法,且没有数据成员。这样一来,对于仅仅设计成一个接口的东西,以及对于用extends关键字在现有功能基础上的扩展,两者之间便产生了一个明显的差异。不值得用abstract关键字产生一种类似的效果,因为不能创建属于那个类的一个对象。一个抽象类可包含抽象方法,并不要求在其里面包含什么东西,但其也能包含用于具体实现的代码。因此,其被限制成一个单一的继承。通过与接口联合使用,这一方案避免了对类似于c++虚拟基础类那样的一些机制的需要。为创建一个实例的一个interface(接口),需使implements关键字。其语法类似于继承的语法,如下:

public interface Face

public void Output():}

public class C extends B implements Face{public void Output()fSystem,out,println(“an object”),}}

c语言篇2

[关键词] C++程序设计 编程语言 教学

C++程序设计语言是许多大学计算机等相关专业的核心课程。学好C++语言,对于相关专业的教学实践具有重要意义。C++程序设计语言的一个重要特点是综合性。作为C语言的扩展,它兼有高级程序设计语言的抽象性与低级程序设计语言的高度实现性。C++课程与上至软件开发方法,下至计算机组成与系统结构的许多课程存在紧密的相关性。学好C++不仅需要学习C++的语法、语义,也需要对上述课程中的许多问题有一定程度的认识。

正是因为C++语言综合性强的特点,才使得这门语言比其它许多语言更加难学。简单地向学生灌输各种语法,往往难以取得好的教学效果。必须使学生知其然,且知其所以然。为此,就需要向学生讲述一些C++中相关的其它课程方面的知识。这往往很难做到,一方面,为保证学生能掌握一门编程语言,以为后继课程奠定基础,C++课程必须尽早开设,在此之前,不可能预先开设后期的各种课程;另一方面,这些后续课程并不比C++容易,前期开设未必能取得好的教学效果。

如何在C++语言教学的同时,兼授与之相关的其它课程的内容,使学生真正把握C++的来龙去脉,更深入地理解各种语言现象,是C++教学的主要挑战之一。针对此问题,本文结合作者在教学过程中的一些经验,提出了一种整合化的教学新思路。主要的思想是在讲授C++的过程中,通过抽象、简化的方式,简明扼要地兼授其它课程中的相关内容,以方便学生对于C++的理解。

本文后继部分首先分析了C++程序设计语言与其它课程的关系,然后以此为依据提出了我们的教学新思路,并总结了全文。

一、C++课程与相关课程的关系

作为一种能够同时支持高层应用开发与底层系统开发的编程语言,C++中直接或间接的体现了计算机软硬件领域的许多概念。本章初步分析了与C++相关的课程,讨论了其中哪些内容与C++课程是紧密相关的,后续章节将基于此分析,探讨整合化教学的新思路。

与C++紧密相关的首先是硬件相关课程,包括计算机组成原理与系统结构等。组成原理中的存储器结构、数据表示、输入输出实现等对理解C++中包括变量、各种数据类型及其比较转换、输入输出流在内的许多问题有重要意义。系统结构方面,了解冯•诺依曼结构等内容,可以帮助学生更好地理解程序的运行,理解计算机计算的特点。

除了硬件类的课程外,操作系统、编译原理等系统软件相关课程也与C++教学紧密相关。理解操作系统中的进程管理、内存管理、文件管理,可以帮助学生更好地了解程序执行的过程,理解C++语言中的内存分配、文件操作等。而编译原理的相关知识贯穿于C++课程始终。C++中有许多规则看似难以消化,但如果使学生了解编译过程,就能更好地帮助他们理解C++语言中的许多设计选择,使那些看似毫无线索的语法规定,变得理所当然。

再一类与C++相关的课程是偏数学类课程,如离散数学、数据结构、算法分析与设计等。离散数学中的布尔逻辑等是理解C++中许多运算的基础,而集合、图等概念,对于理解C++教学中的许多程序实例,以及学生编程实践都具有重要意义。数据结构中的链表等也往往出现在数组、指针等内容的学习中,不了解基本的数据结构概念,将使这些问题的学习变得困难。算法分析与设计也是一个重要的相关课程。在C++语言的学习中也开始涉及一些基本的算法,如排序、查找等,给学生讲解一些经典的算法设计思想,将能使学生更容易理解相关例子,也便于培养解决问题能力。

与C++相关的重要课程还有程序设计语言原理。对于许多高校,这甚至是研究生阶段才开设的高级课程,但在讲授C++课程时,从更高的抽象层面,简要介绍程序设计语言原理中类型、面向对象、异常等重要概念,可以更好地帮助学生理解C++中的相关语法设施,使之明白C++为什么会这样,不这样将会如何等。

另有一类与C++相关的课程常常被忽略,这类课程包括软件开发方法、面向对象分析与设计等。C++课程一般开设在大学一年级,该阶段的许多学生对编程一无所知。常有些学生,对于给定的编程问题感到无法入手。如果在教C++同时向学生阐述一些软件分析设计方面的技术,就能使学生更快地解决问题。

上述课程与C++课程大多存在循环依赖的问题,理解这些课程需要具有一定的编程基础,学习C++又需要了解一些上述课程的内容。几乎不可能将这些课程开设在C++课程之前,这使得如何在C++学习中处理上述课程相关的内容,成为一大难题。

二、整合化教学

分析C++程序设计语言教学中存在的问题,我们提出了一种整合化教学的新思路,即不是单独讲授C++程序设计语言本身,而是与此同时简明扼要地兼授其它课程的相关内容。

1.在理论教学中强调整合

C++教学的整合,首先体现在理论教学方面。在这方面,我们强调抽象、简化与C++相关的内容进行讲授。对于硬件、系统等方面的课程,它们主要在概念上与C++相关,细节方面相关性相对较弱。因此,授课时主要采用的方式是将相关软硬件结构模型化,在模型层面上讲解计算机的工作方式。以内存、CPU为核心,屏蔽重要程度低的设备,重点探讨程序如何启动、运转、结束,变量在哪、如何操作,函数如何调用等;而不是深入细节,探讨存储器有多少级结构,CPU指令是什么形态等问题。刚开始学习计算机的学生,习惯从数学的角度来思考程序中的函数、赋值等概念,容易将它们与数学里的相关概念混淆。通过展示计算机的体系结构、程序流转的基本原理,可以促进学生尽早入门。当然,在抽象、简化的同时,我们尽可能地保证抽象出来的结构能够兼容后继课程,不至于使学生产生矛盾。

对于偏数学类课程,如数据结构、算法分析与设计等,C++中涉及的相关内容并不多,但这些内容往往非常关键。因此,我们选择对直接相关的内容作较为深入的探讨。比如对于链表,虽然它是数据结构课程的核心内容,但C++课程中频繁涉及此概念,因此,我们将对其作比较深入的展开,学生在理解链表的特点后,在编写与之相关的程序时,明显比之前更得心应手。算法分析与设计虽然不直接与C++课程相关,但C++教材中大量的实例都体现了各种各样的算法思想,特别地,暴力法(brute-force)、分治法、动态规划法常常出现。对此,学生往往能看懂例子,但自己编写程序时,却存在较多困难,通过向学生灌输上述算法的基本思想,对不同例子进行总结归类,学生对上述例子的消化将更加透彻。

编译原理与高级程序设计语言原理课程与C++非常相关,但难度较高,直接讲授,学生一般难以接受。对于这部分内容,我们结合了两种教学方式,一种是体验式教学,主要通过原理阐述,案例分析与感受来理解相关内容。对于函数调用、栈内存等编译原理中非常相关的内容,我们将为相关问题建立一个比较抽象的描述模型,然后据此进行较为深入的讲解。通过这种抽象但仍保持一定深度的讲解,可以给学生以更深刻的印象,避免他们犯错。

软件开发方法、面向对象分析与设计等方面的内容,主要体现在C++教学的案例与实践环节中。这里,我们主要的思路是从软件开发方法中抽象出一些基本的方法、原理,将其在案例分析中阐述给学生,使其尽可能地明白一个程序的编制由来。在理解教材中的案例时,做到先自己设计,再阅读材料,而不是直接读书,不做深入思考,不分析由来。软件开发方法中许多方法主要针对大型工程,看似与C++教学无关。但对于刚涉猎计算机领域的学生,每个小例子,都是大项目。深入地分析设计开发方法,有利于培养学生分析、解决问题的能力。

抽象、简化进行讲授的同时,我们还强调启发教学。要求学生不停留于书本内容,不停留与抽象模型,积极提出问题,利用课余时间丰富对相关模型的理解。

2.在实践教学中强调整合

除了在理论教学中整合,我们还强调同样要在实践过程中进行整合。以往C++上机实践过程中,要求学生编写的都是一些简单的控制台程序,基于与系统无关的一些函数库来实现相关功能。这些案例可以提高学生对书本知识的巩固,但是难以充分调动学生的兴趣,特别是在当今计算机如此普及的形势下。

为提高学生兴趣,我们在实践过程中,适当结合了少量超出C++教学范畴外的内容,向学生提供一些操作系统的编程接口,图形界面库等,教学生编制一些具有美观界面,甚至可以实现多媒体功能的小程序。这些小程序往往并不复杂,教师不讲解,也不强求学生掌握。只提供给学生模仿,并启发一些可以改进的点,学生通过模仿学习,即使不能充分了解背后的知识,也可以极大的提高学习热情。

三、小结

本文针对C++程序设计语言课程的一些特点,提出一种整合化的教学新思路,大部分内容来源于已有的教学实践。新思路在教学过程中取得了较好的效果,特别是对C++相关的许多问题的探讨,能启发学生积极思考,这对于培养创新型人才是有益的。

参考文献:

[1]皮德常.C++程序设计教程[M].北京:机械工业出版社,2009.

[2]B.Stroustrup(裘宗燕译).C++语言的设计和演化[M].北京:机械工业出版社,2001.

c语言篇3

程序设计就是让计算机按照一定的指令来进行工作,可以说数据的处理是程序设计的主要任务。那么数据是怎么加入到计算机的内存中呢?计算机最初的功能就是能够存储数据并处理数据的机器。那么数据是怎么加入到计算机的内存中呢?在学习程序设计之前,很多学生对计算机的硬件设施都大概已经很熟悉了。计算机的硬件设施中有一个区域是用来存储数据的,计算机在工作的过程中会频繁的从这个区域读入和读出数据。要想让计算机按照某些指令(程序)自动工作,首先必须把数据存储到计算机的存储空间中。在某种计算机语言中实现这种数据存储功能的就是变量。变量就是计算机内存中的某一个存储单元。

二、变量的定义

C语言中变量在使用之前必须先对其进行定义,变量的定义的一般形式如下:【存储类别】数据类型变量名;其中存储类别是可以省略的。

1、存储类别计算机的内存一般分为三个部分:1)程序区;2)静态存储区;3)动态存储区;为了高效的发挥计算机的功能,不同类型的变量存放在不同的内存区域。变量的存储类别决定了变量中的数据在计算机内存中的存储位置。C语言中局部变量存放在动态存储区,全局变量或者静态变量存放在静态存储区。

2、数据类型在用程序处理问题之前,首先必须确定用何种方式描述问题中所涉及到的数据。这个问题在C语言中是由数据类型来决定的。变量的本质表现为在计算机中的存在时间和存储空间。变量的数据类型是用来决定变量在计算机中占用内存空间的大小。比如:整型数据在TC编译系统中占用两个字节的存储空间。C语言变量的类型不仅确定了数据在计算机内存中的存储区域的大小,同时确定了该数据能够参与的各种运算。任何一个C语言的变量必须有确定的数据类型,不管这个变量如何变化,变量的值都必须符合该变量数据类型的规定。

c语言篇4

C语言中的语句块主要作用是实现作用域的概念。有了作用域的概念,才可以方便命名标识符。作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

(来源:文章屋网 http://www.wzu.com)

c语言篇5

关键词:C语言;技巧;应用;分析

中图分类号:TP312.1 文献标识码:A 文章编号:1007-9599 (2011) 22-0000-01

C Language Application Skills Study

Zhang Zhongsheng

(Shandong Economic Management Institute,Jinan 250014,China)

Abstract:C language contains some basic keywords,syntax and library functions such as knowledge,logical thinking programmers can knowledge of these basic functions composed of a variety of applications,abstract logical thinking ability is the C language applications and improve the key ability,one of my practical work experience with this,a brief introduction of the C language meaning,characteristics,highlighted by the example C language application skills.

Keywords:C language;Skills;Applications;Analysis

C语言是一门基础汇编语言,是在1978年由美国电话电报公司贝尔实验室宣布正式,自此以后,C语言一直在发展进步和被应用着。直到后来,由美国国家标准学会在此基础上制定了一个C语言标准,于1983年发表。早期C语言程序的主要用途是UNIX系统,随着C语言的推广应用,它的强大功能和各方面的优点逐渐为人们所认识,到了20世纪80年代,C语言开始在其它操作系统逐渐应用,并很快成为最优秀的程序设计语言之一。

一、C语言的涵义

C语言是由一个或多个源文件组成且只能有一个主函数的计算机程序设计语言。它既具有高级计算机程序语言的特点,又具有汇编语言的一些特点,由于它的应用范围非常广泛,数据处理的能力很强,所以市场潜力巨大。同时,C语言的相关程序也和一些其它编程语言嵌套应用。

二、C语言的特点

C语言可以像汇编语言一样对位、字节和地址进行操作,这就决定了C语言有很多区别于其他程序语言的优点,具体如下:

(一)丰富的数据类型

C语言的表现能力和处理能力极强,C语言具有非常丰富、适用性很强的数据类型,具体总结为:字符型、数组类型、指针类型、共用体类型、整型、实型、结构类型等。这些丰富的数据类型能够实现一些非常复杂的数据结构运算。此外,C语言引入了指针概念,可使程序效率更高,而且计算功能、逻辑判断功能也比较强大。

(二)应用非常灵活

C语言应用起来比较灵活。因为,C语言一共只有32个关键字,9种控制语句,程序书写的形式非常自由,大小写也能够区分。此外,C语言的一大特色就是语言程序的各部分除了必要的信息交流外都能够彼此独立,这种代码及数据分隔化的方式能够使程序语言的结构层次清晰明了,这给学习、使用及调试程序带来了很大的方便。C语言的使用形式是以函数形式为基础,并且,这些函数可以进行方便的调用,

(三)丰富的运算符

C语言的运算符包含的范围很广泛,它把赋值、强制类型转换、括号等都作为运算符进行处理,所有运算符加起来多达34种。从而使C语言表达式类型多样化,这些运算符的灵活运用,是C语言的一大优势,在其它高级语言中难以实现的一些运算,在C语言中可以实现。

三、C语言应用技巧分析

C语言应用过程中首先要掌握其包含的关键字、语法和库函数的一些基础知识,其次是具备逻辑思维、抽象思维能力,再次是应用思维方式将基础知识进行组合,下面结合本人的工作经验,具体介绍C语言应用过程中的一些技巧:

(一)c语言中长度为0的数组妙用分析

长度为0的数组在GNUC是可以使用的,在定义一个变长对象的结构体是非常有用的,并且使用起来非常节省空间。例如:struct line { int length; char contents[0]; };

struct line *thisline = (struct line *)

malloc (sizeof (struct line) + this_length);

thisline->length = this_length;

(二)C语言内存访问出错时的解决技巧

C语言编写的程序以其运行效率高而著称,由于C语言自身允许直接对内存进行操作,因此,一旦使用不当,程序就会出错,尤其是出错的程序比较烦琐时,此类错误非常难查,下面介绍一种简便方法,从错误的内存地址反向查找问题的程序

windows 下c 语言调试步骤:

1.release版编译/连接选项,把"generate debug info"打钩选择

2.dumpbin/DISASM/OUT:dump.out.txt.1 prep.exe可反编译exe文件

3.得到程序非法地址(可从管理工具-》事件查看器里得到),与汇编比较。

(三)C语言程序减少运算强度的技巧

C语言的位操作只需一个指令周期即可完成,而大部分C编译器的“%”运算均是调用子程序来完成,具有代码长、执行速度慢等缺点。C语言应用过程中,可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。例如:求余运算

a=a%8;可以改为:a=a&7;

(四)C语言程序从n个数中快速查找一个数的技巧

n个数用一数组a描述,查找对象用x描述。我们可以将n个数与查找对象依次比较,可能找到,这是一种顺序查找的方法,我们可以用以下简便查询方法:

查找问题转化成在区间[O,n一1]找k。先计算其中点d,如果a[d]一x,则k―d;如果a[d]>x,则查找区间缩小为[O,d];如果a[d]

参考文献:

[1]鲁沐浴.语言最新编程技巧200例[M].工业出版社,1997,1

c语言篇6

关键词:C语言;教学现状;教学误区

一教学现状

在高等学校的本科教育中,“C语言程序设计”几乎成了所有专业的必开课程,从计算机科学与技术、软件工程、网络工程等相关专业,到电子信息类理工科各专业,乃至理工科院校的所有非计算机专业,有的是专业基础课,有的是公共必修基础课,有的是“非计算机专业的计算机基础课”。只是课程名稍有差异,常见的有“C语言程序设计”、“高级语言程序设计”、“C语言”、“C程序设计”、“结构化程序设计”等。无论叫什么样的课程名,也无论是哪类专业,其课程的教学要求和教材选用却无太大差别,只是课时分配差异较大。

从网络调查的16所不同类型高校的“C语言程序设计”教学大纲看,普遍都包含“通过本课程的学习,使学生了解有关程序设计的基本概念、术语及C语言的特点,掌握C语言基本数据类型、语法规则、程序控制结构、常用的标准库函数,培养学生的程序设计技能,初步积累编程经验”的教学基本要求;约百分之八十左右的“C语言程序设计”课程都选用由谭浩强主编、清华大学出版社出版的“C程序设计”作为主教材;课时分配从30~108课时不等,其中80课时以上的多为应用型本科院校的计算机相关专业以及综合性大学的非计算机专业,理论课时与实验课时的比例一般为1:1到1:1.2。与此同时,其他专业基础课(如计算机组成原理、操作系统、数据结构等)的课时一般为54课时,最多不超过72学时。相比之下,“C语言程序设计”所占课时是其他专业基础课的1.5倍至2倍。

从教学目的看,非计算机专业的“C语言程序设计”课程主要目的是“掌握语法规则和程序结构,具备一定的程序设计能力”,而计算机相关专业的“C语言程序设计”课的教学目的则要分为三个层次,一是使学生全面理解计算机程序设计语言的基本内容和结构;二是通过算法掌握程序设计的基本方法和步骤,并具备一定的程序设计能力;三是为后续课程的算法描述和其他程序设计语言的学习奠定基础。

二教学误区

从以上的教学现状(特别是课时分配)看,长期以来,“C语言程序设计”的课程教学存在“教学内容背离教学要求和教学目的”的误区,主要表现在教材误区、讲授误区和考核误区三个方面。

(一)教材误区

国内高校的“C语言程序设计”课大多选用谭浩强主编、清华大学出版社出版的“C程序设计”[1]为主教材,目前使用的是2005年7月修订出版的第三版,教材共363页,主体内容分为14章,其中,第3章的数据类型与表达式占用30页,第4章的格式输入输出占用12页,前9章共占用218页,后5章共占用145页。占用如此大篇幅的原因是教材中除了介绍相关语法格式外,还增加了相当多“特殊格式”和“特殊情况”的解释和说明,因此,该教材的最大优点就是“内容详尽、解释清晰”。

然而,对于初学者来说,学习计算机程序设计语言就是为了“为计算机描述求解问题的过程”,过于详细但又远离现实问题的“特殊格式”和“特殊情况”的解释,使得学习内容复杂化,增加了程序设计语言学习的难度,误导了学习者的学习重点,由此也赋予了该教材无法掩饰的缺点,那就是教材编写的指导思想和教材内容的组织脱离了高校各专业“C语言程序设计”课程的教学目标,过分强调语法细节而忽略了程序设计语言的“正向表达能力”的应用,过分强调“语言的灵活性”而导致教材主体内容的“复杂化”,从而误导“C语言程序设计”课程的教学内容朝着“重语法学习、轻算法描述”的“语言研究”方向发展。

(二)讲授误区

由于教材内容的“复杂”,课堂讲授自然需要较多课时,教学重点当然也放在了“语法研究”上。从网上下载的“C程序设计(第三版)”的配套教学课件以及有关院校的“C语言程序设计”教学课件的内容组织上可以清楚的给出以上判断。“语法研究”型的课堂讲授,更加放大了教材对“C语言程序设计”课程内容的“扭曲”程度,给学生提供了错误的程序设计语言学习方法,把简单问题复杂化,更为严重的是,挫伤了学生学习计算机程序设计语言的兴趣和积极性,把本应“主动学习”的课程成引入了“被动学习”的歧途,直接导致“懂语法、会做题,但不会编程序”的教学后果。

(三)考核误区

c语言篇7

指针是C语言的一个最重要的特征,它提供了一种统一的方法,使其能访问远程的数据结构。但对C语言初学者而言,在编程过程中熟练的使用指针并不能像使用int型变量一样地轻松愉快,容易上手,往往是不得其精髓。我们知道,不论什么时候,运行一个程序A,首先都是操作系统自身的加载器把A装入内存,然后CPU才能执行。所以A程序的所有要素都会驻留在内存的某个位置。

下面我们看一段示例程序。

#include

intcmp(int first, int second)

{

return ( first > second ? first : second );

}

int main(intargc, char **argv)

{

inti = 5;

int j = 9;

returncmp(i, j);

}

首先,编译器会为变量i和j开辟内存空间,用来存储i和j的值。同时也会为函数cmp开辟空间来存放其代码。这样使得最终的可执行程序就变为了跟内存一一对应的序列。操作系统的加载器把这个可执行程序载入内存后,cpu就可以按一条条的语句顺序执行了。

既然内存空间同程序的所有要素是一一对应的,那么怎么区分各要素的存放位置呢?内存使用不同的地址存放不同的要素,如下所示。

由于变量都存放于内存地址空间,并且与地址之间是一一对应的,那么利用地址能做些什么呢?我们可以把地址存放到别的变量中,以便我们可以在以后程序的某个地方使用它。C语言有一个专门用来存储内存地址的变量,这就是指针变量,通常我们称之为指针(pointer)。它是一种变量类型,这种变量方便我们把需要操控的内存地址记忆起来。

定义指针

定义指针的运算符同乘法运算符是一样的,都用“*”表示。定义一个指针变量在语法上是简单的,同我们定义其他变量的区别是:首先规定它指向的变量类型,然后并不是立即就给出其变量的标识符,而是在变量类型同变量标识符之间插入指针运算符(星号),这样就告诉编译器这是一个指针变量。

C语言中指针可以指向任何的数据类型,包括函数。函数指针的定义是:函数返回值+(* + 函数指针变量标识符)+(函数的参数列表)。函数指针能构建出更加清晰的程序结构。编程中经常使用的指针定义就是这两种,当然有些定义可能只是语法上面有意义,但是语义上面不一定有具体的意义。例如,int *(*(*(*f)())[])()声明f是一个函数指针,该函数返回一个指针,该指针指向数组,该数组元素是指针,那些指针指向返回值类型为整型指针的函数。这样的声明可能永远也不能应用到实际的代码中。

指针和数组

数组是内存中一段连续相同类型的内存数据,这组数据的首地址以数组名字来标识。所有数组对其数据的操控都可以使用指针来实现,同理,指针指向一段内存数据时,也可以使用数组下标的方式来实现操作。

数组与指针在使用上的某些地方是非常相似的,但是数组与指针又有一些细小的区别。数组名表现为一个静态指针,也可以直接把它赋值给指针变量,但它的大小与指针通常是不同的。数组名的内涵在于其指代的实体是一种数据结构,这种数据结构就是数组。数组名可以作为参数传入一个接受参数为指针的函数内部,但是此时数组完全丢失了数组的本义,变成了完全的指针类型,其常量特性(可以作自增、自减等操作)可以被修改。并且,数组名不能再重新赋值为其他的数组名字,而指针变量是可以被重新赋值并指向一段新的内存地址的。

指针的运算

指针的运算指的是指针的--、++、-和+运算,一个指针可以加上或者减去一个整数。两个指针相减得到的是指针之间相隔的元素个数。不同的指针变量之间进行相加运算尽管在语法上是合理的,但是从语义上来讲是没有意义的。除了void型指针和函数指针以外,所有其他类型的指针都可以进行指针运算。通过指针变量的增加或减少,指针变量会指向新的内存地址。

一般来说,指针变量自身的大小在理论上是指机器的字长,但是指针变量的运算并不是按照指针变量自身的大小进行内存偏移的,而是按照指针变量指向的变量类型大小进行内存偏移的。比如,声明一个整形的指针p,假定p的地址是0x4323672,那么++p后p的值变为0x43236726。偏移的内存大小等于整形变量的内存大小4(sizeof(int))。同理,double型指针进行++运算后偏移值就是8(sizeof(double))。

指针强转

如同整形变量可以强转为浮点型变量一样,指针类型也可以通过强转变成新的指针类型,比如我们可以把整形指针强转为字符型指针。指针强转最诱人的地方就在于对内存数据进行操控就够了。指针强转使得指针对数据的操控更具有针对性,而且通过指针的默认强转可以使得函数的参数更简单,且传递的信息量是不变的。比如,void*作为参数时可以把任意的指针变量传递到函数内部进行相关的操作。

下面我们来看一个具体的例子。数据的内存布局如下图所示,首先是一个字符型数据,紧接着的是两个整形数据,最后面是三个结构体A型数据。我们需要做的就是把这些数据读出来。

我们先声明一个字符型的指针p,使其指向第一个数据的内存地址。取完第一个字符型数据后,通过p++,然后强转指针为整形指针,就可以很方便地取出整形数据,同理可取出三个结构体数据。

指针作为参数

先看一个例子,我们有两个整形变量,x的值为777,y的值为888,现在想构建一个函数用来交换两个整形变量的值,使得x的值为888,y的值为777。首先我们以传值的方式构建

voidswap_value(int Param1,int Param2)

{

int Temp = Param1;

Param1 = Param2;

Param2 = Temp;

}

我们调用函数swap_value(x,y)后,发现x、y的值并没有被交换。造成这种结果的原因是由于函数调用时,首先对传入的实参进行变量的拷贝,交换的值是形参的值,并不是实参的值。而原来的实参与拷贝后的形参变量所处的内存也不同,所以并没有交换成功。

要想实现函数内部对这两个值的交换,必须使得实参与拷贝后的形参变量所处的内存是相同的。我们知道了原理后,修正函数参数列表,以指针的方式重新构建函数如下:

voidswap_value(int*Param1,int*Param2)

{

int Temp=*Param1;

*Param1=*Param2;

*Param2=Temp;

}

这时候我们发现x、y的值被交换了。通过上面的例子可以看出,使用指针作为参数可以修改原来的变量值,使得函数实现的机能更加模块化,方便了程序的设计。

野指针

前面我们已经讨论过指针变量同内存的关系,了解了指针变量里面存放的是某个变量的内存地址,该地址可以在程序的某个位置使用,以方便我们更改或取得该变量的值。指针使得我们拥有了操控内存的利器,但同时指针也是一把双刃剑。我们必须时刻确保指针变量的值是我们意图操控的内存地址。如果指针变量的值被不受控的更改或者初始化不正确,那么我们就使用了错误的地址,从而导致程序错误,通常我们称这个导致程序错误的指针变量为野指针。由于使用了野指针而产生的程序错误大多时候是隐蔽的,难于跟踪的。野指针的产生主要是由于以下几种情况。

(1)声明了指针变量,但是没有正确的初始化就使用了该指针变量。

(2)使用指针变量之前没有对其进行安全检查。

(3)指针指向的内存变为了无效值,但没有及时对指针清零,导致程序某处引用了该指针。

(4)多个指针同时指向同一内存区域,程序某处通过某个指针释放了该内存,但是没有及时对其他的指针清零,导致程序某处进行了错误的引用。

(5)多线程时,对全局的指针变量没有进行锁处理。

多级指针

定义一级指针我们使用一个‘*’,在定义多级指针时,是几级指针我们就使用几个‘*’。例如,声明一个整型的二级指针(int ** ppVar;)。下面以这个二级指针为例说明一下二级指针的意义。

二级指针变量同样是保存了一个地址,这个地址就是某个一级指针变量的地址,而一级指针变量里面保存了最终需要操作的变量的地址,如下所示。

0x4323640 0x4323668

二级指针变量的值为0x4323640,就是一级指针变量pVar的地址,变量pVar的值为0x4323668,就是变量Var的地址。如果需要修改变量Var的值,我们可以直接修正**ppVar的值就可以了。

三级指针或者更多级指针的原理与二级指针的原理是相同的,只是需要索引的内存空间的深度增加了。在程序设计中,引入多级指针更多的时候并不仅仅是为了关注最后一级指针所能取得的变量,而更多的是为了使用和操控其中间的级数的内存值。比如利用二级指针作为函数的参数在某个函数内部对其分配内存,我们更想利用的是一级指针变量自身。当然,在进行程序设计时,有时我们要在可读性与语法有效性之间做出选择,在实现代码的过程中能用低级指针实现的尽量不要使用多级指针实现,这样的代码更利于维护。

小结

在C语言中指针的使用非常的广泛,有时指针是实现某个计算的唯一方法。同样的机能使用指针通常也可以获得更加高效、紧凑的代码。指针使得函数构建的机能更加的模块化,使得函数参数栈更加的短小。同时在操纵字符串的运算中,指针更加简单直观。

c语言篇8

C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点,能完成用户的各种任务,特别适合于进行系统程序设计和对硬件进行操作的场合。全国计算机等级考试、全国计算机应用技术证书考试和全国各地区组织的大学生计算机统一考试都将C语言列为考试范围。长期以来C语言的教学内容已经形成较为成熟的体系结构,各种教材都大同小异。通过调查我们发现,从大学到高职,大多数学生都反映C语言难学,全国二级考试的通过率也较低,尤其在高职院校,通过率基本上在10%左右。这样一来老师教学没有信心,学生学习更是没有信心与动力。针对这样的情况,我们将对高职C语言的教学进行研究并提出教学改革的思路,以期改善高职C语言的教学效果,更好地实现高职的培养目标。

2目前C语言教学现状分析

2.1C语言教学的评价标准和高职的培养目标不一致2002年教育部高教〔2002〕2号《关于加强高职高专教育人才培养工作的意见》中指出:“高职高专教育是我国高等教育的重要组成部分,培养高职C语言教学改革探索的思路拥护党的基本路线,适应生产、建设、管理、服务第一线需要的,德、智、体、美等方面全面发展的高等技术性专门人才。"2004年2月28日,教育部周济部长指出:“高等职业教育的主要任务是培养高技能人才,这类人才既不是白领,也不是蓝领,而是应用型白领,应该叫“银领”,我们培养的学生,既要能动脑,更要能动手,经过实践的锻炼,能够迅速成长为高技能人才,成为国家建设不可缺少的重要力量”。“高技能型人才”是指高职院校培养的毕业生,是技能水平较高的人才,它有别于学术型、工程型人才,也有别于一般技能型人才。

高职院校开设C语言程序设计课程的主要目的是培养学生程序分析能力,程序设计能力,以及程序调试能力,重在能力的培养,为后继专业课程的学习打下程序分析、设计和调试的基础,而不在语言本身规则的学习。过去高职C语言的教学大多采用全国二级考试的标准来进行衡量,全国二级考试分为理论与上机考试两部分,这两部分必须都通过才能拿到全国二级证书。其中理论部分包括软件工程、数据库原理、数据结构、C语言的语法规则和程序设计等知识,通过对二级理论试卷的分析与统计可见,二级考试不仅考C语言的知识,还有软件工程等内容,整个试卷中C语言相关的考题占75%左右,并且有关C语言部分考核的主要关注点是语法规则,注重细节问题,甚至是钻牛角尖的知识;上机考试部分共三道题,题量较小,每题的分值高,不能全面反映学生的能力,存在一定的偶然性。一直以来高职学校采用二级标准来评价C语言的教学,就存在评价的标准与教学内容不一致、评价的标准与高职的培养目标不一致的问题,当然就不能全面评价学生的能力。

2.2C语言本身的特点带来学习困难任何事情都是一分为二的,C语言有丰富的运算符、语法限制不严,程序设计自由度大、数据类型丰富且可由用户自定义,所有这些特点,既可看作是C语言的优点,又可认为是k-语言学习的难点。例如运算符丰富这一特点是便于已熟练掌握u语言的用户使用,可对于初学者来说,却是增加了难度,如自增/自减运算符(++/一),它可以提高运算速度,简化程序,但它只能对变量进行运算,并且运算符前置和后置的效果是不一样的,初学时往往很难注意到这些,在分析含有自增自减运算符的程序和用它写程序时往往就会出现错误,并且这样的错误有时较难发现,学生更是难以理解。再比如语法限制不严、程序设计自由度大这一特点,在使用时学生往往弄不清哪种表示是正确的,增加了程序理解的难度。所有这些都说明C语言的特点给初学者带来了较大的难度。

2.3程序设计本身比较抽象,学生相关计算机的知识不够高职C语言课程大多开设在第一学期,由于高中阶段大多数学生计算机基础知识积累不够,学生刚进校就学习C语言,感觉非常抽象,总不能理解内存中某个变量值的改变,当前某单元存储的值是什么?为什么写这样的程序就能得到需要的结果?CPU到底如何工作?学生往往思考这样的问题,但这些问题的答案通常在后续的专业课程中。这也给C语言的学习带来了较大的困难。

2.4传统的教学模式不利于发挥学生学习的主观能动性过去C语言的教学仍然沿袭课堂讲授、布置作业及实验的“教本位”的教学模式,教师是课堂的中心,注重教的原发性和主动性,把着眼点放在“教”上,忽视了学生的主体性。“我讲你听,我教你学”的这种“满堂灌”的方式,学生的学习始终处于被动状态,师生之间缺少互动,教学是单向的由教师将知识传授给学生,不利于调动学生学习的积极性与主动性,发挥不了学生的主观能动性。

2.5学习语言需要有较强的逻样思维能力高职C语言这门课程主要的教学目标是培养学生的程序分析、设计和调试能力,这要求学生具有较强的逻辑思维能力。我们的学生在高中阶段这方面能力的训练不够,因此所写的程序通常逻辑不够严密,存在各种各样的问题,并且自己还难发现与理解,这也是学生学习的障碍。

3C语言改革的措施

综上所述,我们拟对C语言教学进行改革探索。通过以上的分析,结合高职的培养目标,将采取这样一些改革措施。首先是准确地定位课程目标,然后重组课程体系结构,对知识点进行分层讲授,注重解题思路、算法实现、编程能力和创新能力的培养,进行精讲多练,淡化语法规则,采用任务驱动的教学方法,给学生提供各种自主学习的平台,最后通过考核方式的改革进一步促进学生学习积极性与主动性,实现对学生的全面评价。高职C语言教学改革探索的思路。

3.1准确地定位课程目标只有进行了准确定位,我们才能有的放矢地进行改革,寻找弱点与不足。C语言在高职计算机类专业课程中属于专业基础课,其作用是为学生将来学习专业课打下程序分析、设计和调试的基础,培养学生程序设计和逻辑思维的能力,注重的是解题思路,并不特别强调语言的语法等细节问题。对于非计算机类专业,主要是培养学生程序设计的能力。因此本课程的课程目标是使学生掌握C语言的语法规则,为后续课程的学习打下良好的程序设计分析、设计和调试基础,并且学生能够以C语言为工具分析问题、解决问题,能用C语言写出中等复杂程度的程序。

c语言篇9

关键词:运算符;赋值;C语言

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30740-02

"=" Analyse in Character in C Language

YANG Zhan-hai, YANG Xiao-yan

(Computer Center, Yan'an Uuniversity, Yan'an 716000, China)

Abstract:High-grade programming various language arithmetic magic figure has equally "=" this one fundamental arithmetic magic figure, but C language arithmetic magic figure has very big differences on function characteristic with other language. And C language assignment arithmetic "=" character the main body of a book has been introduced detailed, the induction having been in progress to common problem analyses.

Key words:Arithmetic magic figure; Assign value; C language

1 引言

运算符主要功能和特点是用它来描述某种操作,表明运算的性质。各种高级程序设计语言都有一套属于自己的表明各种操作性质的运算符集合,并且每种高级语言的运算符集并不是完全相同的,主要表现有,其一,运算符的数目多少不同,如C语言的运算符十分丰富,而Visual Basic的运算符数目相对较少;其二,运算符的种类不同,如C语言有指针运算符符,而Visual Basic没有指针运算符;其三,同类运算用不同的运算符表示,如求余数运算符C语言用%表示,而Visual Basic用Mod表示;其四,同样的运算符表示不同的运算性质,如C语言用&表示位运算,而Visual Basic用&表示字符串连接运算。

“=”运算符在各大编程语言中均有使用,但是“=”运算符在各种语言中性质千差万别。为了明辨是非,彻底搞清楚“=”运算符的在C语言中的使用细节,很有必要对“=”运算符的性质进行整理、归纳、分析。

2 “=”在C中的性质

2.1 只表示“赋值”运算

“=”运算符在C语言中只有一个性质,表示“赋值”运算。典型的赋值表达式的格式为:变量名 = 子表达式

赋值表达式的运算先是计算子表达式的值,再把运算结果赋给变量名所代表的变量。变量的值就是该赋值表达式的值。

例如有下面的赋值表达式:A = 5+15

则该表达式运算后,A变量的值为20,整个赋值表达式的值也为20。

2.2 对A=B=8的分析

有人认为A和B同时等于8。C语言中的“=”运算符只能是赋值运算符,但一部人潜意识中依然存有“等于”这一概念,所以就会说,A和B同时等于8,显然,他们的这种理解是错误的。

正确的解释应该是,“=”运算符属于右结合性的运算符,首先计算赋值表达式B = 8,计算结果为,变量B的值为8,该表达式的值也为8;接着把表达式B = 8的计算结果8赋给了变量A,则变量A的值为8,整个赋值表达式的值也为8。

由此可见,变量A和B的值都为8,但不是等于的结果,而是表达式运算的结果。

2.3 对int A = B = 8;的分析

有许多人在初始化变量时,为了同时让多个变量得到相同的初值,用下面的声明语句去实现。

int A = B = 8;

但是,编译程序时,系统会提示B变量未定义。这是为什么呢?究其原因,实际上还是对赋值这一概念理解上不够完善。C语言规定,变量必须先定义,后使用,变量可以在定义的同时赋初值,称为变量的初始化。C语言在处理声明语句int A = B = 8;是这样进行的,认为当前定义变量A,同时给A赋初值,初值由表达式B = 8计算得到,而表达式B = 8存在变量B,而B在此之前并未作过定义,违背了“变量先定义,后使用”的原则,故而产生了错误。该声明语句可以修改如下:

int A = 8, B = 8;

2.4 相等运算符为“==”

在C语言中,描述相等关系的运算符为“==”。运算符“=”不表示相等,只是赋值的性质,在使用时应该区别对待。

分析下面的两条if语句:

第一条:if(x=1) 子语句

第一条:if(x==1) 子语句

对于第一条语句而言,不论x原来的值为多少,经过表达式x=1运算后,x的值变为1,赋值表达式x=1的值也为1,所以,上面的if语句在任何情况下都会选择执行它的子语句。

对于第二条语句而言,只有当x的值为1时,关系表达式x==1的运算结果才为1,当x不为1,关系表达式x==1的值就为0。

由此可见,在C语言中,一定要严格区分“=”和“==”,否则,会产生意想不到的错误。

2.5 复合的赋值运算符

在赋值运算符“=”之前加上其它运算符,可以构成复合的赋值运算符。在使用复合的赋值运算符应该注意,复合的赋值运算符和赋值运算符一样,都是双目运算符,都是右结合性的运算符,它们的运算级别完全相同。例如当变量a的值为3时,有下面的表达式:a +=a-=a*a

这个表达式首先运算右半部分表达式,即运算求解表达式a -=a*a的值,这部分表达式可以改写为a = a-a*a,运算后,a的值为-6,这部分表达式的值也为-6。

表达式a += a-=a*a可以改写为a += (a-=a*a),进而改写为a +=-6,故而a最后的运算结果为-12,整个表达式的运算结果以为-12。

3 结束语

根据作者的经验,相当多的初学者(甚至还有不少有一定编程经验的人)对赋值运算符理解不够深刻,“等于”这样的概念根深蒂固,以至于编程时经常出错,并不能很快地找出原因。故此,本文对赋值运算符“=”做了较为详细的分析和实例说明,使得学习和使用C语言的人员在编写程序和调试程序时有所依据。

参考文献:

[1] (美)Herbert Schildt. 王子恢, 等译. 最新C语言精华(第三版)[M]. 北京:电子工业出版社,1997.

c语言篇10

表示0的意思。

在c语言中,“感叹号”代表逻辑运算符非,5 是非0 , 所以感叹号和5表示0。

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSIC,作为C语言最初的标准。

(来源:文章屋网 )