1 C语言
1954年,第一个完全脱离机器硬件的高级语言FORTRAN问世了。随后40多年来,共有几百种高级语言出现,有重要意义的有几十种,影响较大、使用较普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、JAVA等。
高级语言的发展也经历了从早期语言到结构化程序设计语言、从面向过程到非过程化程序语言的过程。
软件的开发也经历了由最初的个体手工作坊式的封闭式生产发展为产业化、流水线式的工业化生产。
60年代中后期,软件越来越多,规模越来越大,而软件的生产基本上是人自为战,缺乏科学规范的系统规划与测试、评估标准,其恶果是大批耗费巨资建立起来的软件系统,由于含有错误而无法使用,甚至带来巨大损失,软件给人的感觉是越来越不可*,以致几乎没有不出错的软件
这一切,极大地震动了计算机界,史称“软件危机”。
人们认识到大型程序的编制不同于写小程序,它应该是一项新的技术,应该像处理工程一样处理软件研制的全过程。程序的设计应易于保证正确性,也便于验证正确性
1969年,提出了结构化程序设计方法
1970年,第一个结构化程序设计语言:Pascal语言出现,标志着结构化程序设计时期的开始
C是那时结构化语言的集大成者
C语言的特点之一就是结构化,结构化语言的显著特征是代码和数据的分离。这种语言能够把执行某个特殊任务的指令和数据利用函数从程序的其余部分分离出去;结构化语言比非结构化语言更易于程序设计,用结构化语言编写的程序的清晰性使得它们更易于维护。
C语言的特点之二就是兼有高级语言和低级语言的特点,和高级和低级语言兼容,称为中级语言。C允许对位、字节和地址进行操作,不是强类型语言,同时C程序允许几乎所有的类型转换,如字符型和整型数据能够自由混合在大多数表达式中进行运算。强类型高级语言是不允许这样的
C语言的另一个重要特点是简洁,它仅有32个关键字,和IBM PC的BASIC相比,后者关键字达159个
2 C++语言
80年代初开始,软件设计产生了一次革命,即面向对象的程序设计,C++、VB、Delphi就是典型代表
C++语言由AT&T贝尔实验室的Bjarne Stroustrup开发,从C语言派生的,与C语言是兼容的
下面看一个C语言的程序
#include "stdio.h"
main()
{
int hour;
int minute;
int second;
printf("input hour:\n");
scanf("%d",&hour);
printf("input minute:\n");
scanf("%d",&minute);
printf("input second:\n");
scanf("%d",&second);
printf("Your time is\n%d:%d:%d\n",hour,minute,second);
}
这是一个典型的C语言程序,实现对时间的输入和输出。
若想进一步实现两次输入和输出,简单的做法是重复代码。
例子为:
#include "stdio.h"
main()
{
int hour;
int minute;
int second;
//第一次输入和输出
printf("input hour:\n");
scanf("%d",&hour);
printf("input minute:\n");
scanf("%d",&minute);
printf("input second:\n");
scanf("%d",&second);
printf("Your time is\n%d:%d:%d\n",hour,minute,second);
//第二次输入和输出
printf("input hour:\n");
scanf("%d",&hour);
printf("input minute:\n");
scanf("%d",&minute);
printf("input second:\n");
scanf("%d",&second);
printf("Your time is\n%d:%d:%d\n",hour,minute,second);
}
上述做法的缺点为代码体与数据关系紧密,不易复用;软件维护性差,不易修改;代码重复罗索,理解不易。
进一步的改进是使用结构体对功能相关的变量进行封装,从逻辑上构成更有意义的数据类型;同时使用函数对功能重复的代码进行封装,通过调用来运行。
#include "stdio.h"
struct Time
{
int hour;
int minute;
int second;
}t1;
void TimeFunc()
{
printf("input hour:\n");
scanf("%d",&t1.hour);
printf("input minute:\n");
scanf("%d",&t1.minute);
printf("input second:\n");
scanf("%d",&t1.second);
printf("Your time is\n%d:%d:%d\n",t1.hour,t1.minute,t1.second);
}
main()
{
TimeFunc();
TimeFunc();
}
然而上述做法也有缺点,如结构体的数据与功能代码联系不紧密,无初始化语句,无法有效检验(用户可以输入非法的时间,即使TimeFunc函数可以检验控制,用户也能绕过函数,直接操纵结构体变量来赋值),同时修改不易(一旦修改结构,导致所有程序皆要修改)
一个想当然的方法是进一步把函数也放到结构体定义中去,访问函数必须通过结构体变量,如
#include "stdio.h"
struct Time
{
int hour;
int minute;
int second;
void settime()
{
printf("input hour:\n");
scanf("%d",&hour);
printf("input minute:\n");
scanf("%d",&minute);
printf("input second:\n");
scanf("%d",&second);
}
void printtime()
{
printf("Your time is\n%d:%d:%d\n",hour,minute,second);
}
};
main()
{
Time t1;
t1.settime();
t1.printtime();
t1.settime();
t1.printtime();
}
然而这在C语言中并不可能。C++语言允许相类似的定义,即允许把功能相近的变量和代码函数块放在同一个数据结构体中,外界必须通过数据结构体变量才能访问此中的变量和函数,这种数据结构称为类。
#include "stdio.h"
class Time
{
public:
int hour;
int minute;
int second;
void settime()
{
printf("input hour:\n");
scanf("%d",&hour);
printf("input minute:\n");
scanf("%d",&minute);
printf("input second:\n");
scanf("%d",&second);
};
void printtime()
{
printf("Your time is\n%d:%d:%d\n",hour,minute,second);
}
};
main()
{
Time t1;
t1.settime();
t1.printtime();
t1.settime();
t1.printtime();
}
类的优点在于实现了数据与功能代码紧密联系,代码也能复用,修改也较简单;当然缺点仍然是无初始化语句,无法对数据进行有效检验(用户可以直接设置内容变量),不过,使用构造函数和访问修饰符就能克服这一缺点。所以,完整的代码应该是
#include "stdio.h"
class Time
{
private:
int hour;
int minute;
int second;
public:
Time(int h,int m,int s)
{
hour=(h>=0 && h<24)?h:0;
minute=(m>=0 && m<60)?m:0;
second=(s>=0 && s<60)?s:0;
}
void settime()
{
printf("input hour:\n");
scanf("%d",&hour);
hour=(hour>=0 && hour<24)?hour:0;
printf("input minute:\n");
scanf("%d",&minute);
minute=(minute>=0 && minute<60)?minute:0;
printf("input second:\n");
scanf("%d",&second);
second=(second>=0 && second<60)?second:0;
}
void printtime()
{
printf("Your time is\n%d:%d:%d\n",hour,minute,second);
}
};
main()
{
Time t1(1,2,3);//利用构造函数进行简单有效的初始化
t1.printtime();
t1.settime();
t1.printtime();
//t1.hour=-1;//此语句不正确,因为外界不能访问类中的private(私有)成员
}
3 Java语言
1990年Sun公司James Gosling等人开始开发名称为Oak的语言,希望用于控制嵌入在有线电视交换盒、PDA等的微处理器。
1993年交互式电视和PDA市场开始滑坡,而Internet正处于增长时期,因此Sun公司将目标市场转向Internet应用程序。
1994年将Oak语言更名为Java。
现在的Java程序开发分为三种系列:其一为Java 2 Standard Edition,简称为J2SE,包括常见Java客户端程序,Applet等;其二为Java 2 Enterprise Edition,简称为J2EE,包括Servlet,Java Servlet Pages,Enterprise Java Beans等;最后为Java 2 Micro Edition,简称为J2ME,专为移动设备提供访问网络的编程方法。
完全可以将上述时间类的C++代码写成Java的版本,如
public class Time
{
private int hour;
private int minute;
private int second;
public Time(int h,int m,int s)
{
settime(h,m,s);
}
public void settime(int h,int m,int s)
{
hour=(h>=0 && h<24)?h:0;
minute=(m>=0 && m<60)?m:0;
second=(s>=0 && s<60)?s:0;
}
public void printtime()
{
System.out.println("Your time is\n"+hour+":"+minute+":"+second);
}
public static void main(String args[])
{
Time t1=new Time(1,2,3);
t1.printtime();
t1.settime(4,500,6);
t1.printtime();
}
}
Java语言的特点:纯粹的面向对象(一切都是类的成员),安全稳健,可移植性好(平台无关性),等等。
4 .NET
2000年6月微软正式推出.NET,其目的是编写基于网络的应用程序,不再基于单机;实现应用程序的平台无关性;直接抗衡Java。
.NET的特点:其一是没有指明基于哪个操作系统,因为可以跨平台;其二是没有限制开发的应用程序类型,因为包含多种类型,如windows应用程序,web应用程序,web服务和其他类型;最后是没有指明使用什么语言,因为除了主要的C#语言外,还可以支持其他语言。
C#是第一流的面向组件的语言,由Turbo Pascal,Delphi,Visual J++首席设计师Anders Hejlsberg倾心3年设计,所有的语言元素都是真正的对象,开发强壮和可重用的软件
上述时间类的C#版本为
class Time
{
private int hour;
private int minute;
private int second;
public Time(int h,int m,int s)
{
settime(h,m,s);
}
public void settime(int h,int m,int s)
{
hour=(h>=0 && h<24)?h:0;
minute=(m>=0 && m<60)?m:0;
second=(s>=0 && s<60)?s:0;
}
public void printtime()
{
System.Console.WriteLine("Your time is\n"+hour+":"+minute+":"+second);
}
public static void Main()
{
Time t1=new Time(1,2,3);
t1.printtime();
t1.settime(4,500,6);
t1.printtime();
}
}