Ⅰ 求c语言编程很长的程序100多行的
C语言写的21点程序!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NULL 0
int compare(char sum1,char sum2)
{
if(sum1>=sum2)
return 1;
else
return 0;
}
int breakal(int sum)
{
if(sum>21)
return 0;
else
return 1;
}
char change(int card)
{
char ch,n,m,x;
switch(card)
{
case 1: ch='A';
break;
case 10:
{
n=1+int(rand()/(RAND_MAX+1.0));
if(n==1)
ch='K';
else
{
m=1+int(rand()/(RAND_MAX+1.0));
if(m==1)
ch='Q';
else
{
x=1+int(rand()/(RAND_MAX+1.0));
if(x==1)
ch='J';
}
}
break;
}
} //以上switch语句用于将数字转换成字符
return ch;
}
void game()
{
int i,k,n;
char host_ch,player_ch,host_card[15],player_card[15];
int host_sum=0,player_sum=0;
srand(time(NULL));
for(i=0;i<2;i++)
{
int (10.0*rand()/(RAND_MAX+1.0));
player_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
player_ch=change(player_card[i]);
if(player_card[i]>1 && player_card[i]<10) //输出玩家抽到的牌的点数
printf("您抽到的第%d张牌是%d\n",i+1,player_card[i]);
else if(player_card[i]==10)
printf("您要到的第%d张牌是%c\n",i+1,player_ch);
else
printf("您要到的第%d张牌是A\n",i+1);
if(player_ch=='A') //询问判断玩家的A的点值为1或11
{
printf(" 您有一张A,您想要A作1还是11?\n");
printf(" 1. 1\n" );
printf(" 2. 11\n");
if(scanf("%d",&n) && n==1)
player_card[i]=1;
else
player_card[i]=11;
}
host_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
host_ch=change(host_card[i]);
if(host_ch=='A') //电脑自动判断庄家的A的点值为1或11
{
k=1+int(rand()/(RAND_MAX+1.0));
if(k==1)
host_card[i]=11;
else
host_card[i]=1;
}
player_sum+=player_card[i]; //分别对庄家和玩家的点数求和
host_sum+=host_card[i];
}
printf("您现在的总面值为%d\n",player_sum);//输出玩家的总面值
for(i=2;i<5;i++)
{
if(host_sum<18 && host_sum>0)//电脑自动判断庄家是否要牌
{
host_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
host_ch=change(host_card[i]);
if(host_ch=='A') //电脑自动判断庄家的A的点值为1或11
{
k=1+int(rand()/(RAND_MAX+1.0));
if(k==1)
host_card[i]=11;
else
host_card[i]=1;
}
host_sum+=host_card[i];
}
printf("您还要继续要牌吗?\n");
printf(" 1.要\n");
printf(" 2.不要\n");
scanf("%d",&k);
if(k==1)
{
{
player_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
player_ch=change(player_card[i]);
if(player_ch=='A') //询问判断玩家的A的点值为1或11
{
printf("您有一张A,您想要A作1还是11?\n");
printf(" 1. 1\n" );
printf(" 2. 11\n");
if(scanf("%d",&n) && n==1)
player_card[i]=1;
else
player_card[i]=11;
printf("您要到的第%d张牌是A\n",i+1);
}
else
printf("您要到的第%d张牌是%d\n",i+1,player_card[i]);
player_sum+=player_card[i];
if(i==4)
printf("您手中已有5张牌,一决胜负的时刻到啦!\n");
if(breakal(host_sum)==0)
{
if(breakal(player_sum)==0)
{
printf("庄家爆牌了,您也爆牌了!庄家的牌面值是%d,您的牌面值是%d\n",host_sum,player_sum);
printf("\nYou lose..\n");
break;
}
}
else
if(breakal(player_sum)==0)
{
printf("您爆牌了!您的牌面值是%d\n \nYou lose..\n",player_sum);
break;
}
}
if(breakal(host_sum)==0)
{
printf("庄家爆牌了!庄家的牌面值是%d\n",host_sum);
printf("\nCongratulations! YOu win!\n");
break;
}
}
else
{
printf("庄家的牌面值是%d,您的牌面值是%d\n",host_sum,player_sum);
if(compare(host_sum,player_sum)==1)
printf("\nYou lose..\n");
else
printf("\nCongratulations! You win!\n");
break;
}
}
}
int main()
{
kaishi:
int n;
printf(" 欢迎进入21点游戏!\n");
printf(" ************************************\n");
printf(" 1.开始游戏\n");
printf(" 2.退出游戏\n");
printf(" ************************************\n");
if(scanf("%d",&n)&&n==1)
game();
else if(n==2)
{
printf(" ******************************\n");
printf(" 游戏结束!祝您愉快!\n");
printf("\n\n");
printf(" 再见!\n");
printf(" ******************************\n");
return 0;
}
goto kaishi;
}
Ⅱ 为什么c语言是高级程序
有些教材也称c语言为中级语言,因为它既有高级语言的特点,也有低级语言的特点。
低级语言并不是说它不好,只是它跟硬件关系紧密,如果换台机器,可能代码就不同了。
而高级语言,则跟具体硬件无关,程序员只要用编译器编译就行了,前台都一样,后台编译器自己根据不同的机器,编译连接生成exe。
Ⅲ C语言蛮复杂的程序,高手进!!!
不知道计算什么,但程序是错误的可以肯定。
例如:
printf("Please print the degree\n");
scanf("%d",°ree);
print -- 大概想说 input or enter
°ree -- 大概想写 °ree
printf("Please print the coef\n");
for(k=0;k<degree;k++) scanf("%f",&coef[k]);
print -- 大概想说 input or enter
degree -- 如果小于0或大于16 就错了,键盘输入16个数也很费力。
po=(float)pow(x,k); 这句在循环语句之外,k等于几? 可能等于 degree,如果等于 degree,就别写 k,出了循环语句的循环变量的值,不同系统可能不一样,直接写 degree 好。
f=po*coef[k]; 这句不在循环体内, k等于几? 如果等于 degree,数组下标已超界。输入的 degree 个系数没派用场,用了一个下标超界的数组元素。
for(k=0;k<degree;k++) P=P+f;
这个循环无意义,f 是 固定值(等于 下标超界的数组元素 的值),直接写 P = f * degree; 就可以了。
Ⅳ 【C语言超级菜鸟】这个程序如何调试
你的程序没有错,不过你得改一下 :
scanf("t = %d", &t);
如果你这样输入的话,你在控制台必须这么输入: t = 3
这样也不能得到你想要的结果,你可以这么改:
for(l = 1; l<=t; l+=2) // < 改成 <=
Ⅳ 经典C语言程序例子
题目01:在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同的单词。
(5)c语言超级程序扩展阅读:
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
Ⅵ 求 一个超简单的C语言程序代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void
main()
{
int
a,b,d,f;
char
c[4],e[5]="EXIT";
while(true)
{printf("BEGIN(开始)EXIT(退出):");
scanf("%s",c);
while(strcmp(c,e)!=0)
{printf("请输入a和b:");
scanf("%d
%d",&a,&b);
d=a+b;
printf("%d\n",d);
printf("是否继续[1.是;0.否]:");
scanf("%d",&f);
if(f==0)
break;
else
continue;
}
if(strcmp(c,e)==0)
printf("结束\n");
printf("按回车返回开头");
fflush(stdin);
getchar();
system("cls");
}
}
你题意不是太明确,我随意编了一个不知道是不是你想要的。
Ⅶ 给我一个较复杂的C语言程序
好,给你一个有趣的程序,下面程序的作用是,输入一个4位数,之后将这个数分解成4个数字,并将这4个数字组合成一个最大数和一个最小数,并将两者相减,结果作为新的4位数,重复前面的步骤,最后的结果是什么?自己测试一下。
#include <stdio.h>
void mysort(int *a, int size)
{
int i, j, k, t;
for (i = 0; i < size - 1; ++i)
{
k = i;
for (j = i; j < size; ++j)
{
if (a[k] > a[j])
k = j;
}
if (k != i)
{
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
void main()
{
int num, a[4], max, min;
do
{
scanf("%d", &num); /* 输入最初的4位数 */
} while (num < 1000 || num > 9999);
while (num)
{
/* 将4位数分解成4个独立的数字,并保存在a数组中 */
a[0] = num % 10;
num /= 10;
a[1] = num % 10;
num /= 10;
a[2] = num % 10;
num /= 10;
a[3] = num;
/* 排序数组元素 */
mysort(a, 4);
/* 从数组的4个元素中产生最大数字和最小数字 */
max = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
min = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
/* 产生新的4位数 */
num = max - min;
printf("%d\n", num);
if (num == 6174)
break;
}
printf("The magic number is: %d\n", num);
}
Ⅷ 求一个C语言大程序
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
int num;
char name[10];
int score;
struct student *next;
};
int n;
struct student *creat()
{
struct student *head;
struct student *p1,*p2;
p1=p2=(struct student *)malloc(LEN);
printf("请输入数据:\n");
printf("-学号---姓名---成绩-\n");
scanf("%d%s%d",&p1->num,p1->name,&p1->score);
head=NULL;
n=0;
while(p1->num!=NULL)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%d%s%d",&p1->num,p1->name,&p1->score);
}
p2->next=NULL;
return(head);
}
void print(struct student *head)
{
struct student *p;
p=head;
if(head!=NULL)
{
printf("-学号---姓名---成绩-\n");
while(p!=NULL)
{
printf("%d %s %d\n",p->num,p->name,p->score);
p=p->next;
}
}
else printf("没有数据 !\n");
}
struct student *del(int num,struct student *head)
{
int a=0;
struct student *p1,*p2;
do
{
p1=head;
if(head==NULL)
{
printf("没有数据 !\n");
goto end;
}
while(p1->num!=num&&p1->next!=NULL)
{
p2=p1;p1=p1->next;
}
if(p1->num==num)
{
if(p1==head) head=p1->next;
else p2->next=p1->next;
printf("删除记录学号为N0.%d\n",num);
n=n-1;
a++;
}
}while(p1->next!=NULL);
if(a==0)
printf("学号未找到 !\n");
end:
return(head);
}
struct student *add(int num,char name[],int score,struct student *head)
{
struct student *p0,*p1,*p2;
p0=(struct student *)malloc(LEN);
p0->num=num,strcpy(p0->name,name),p0->score=score;
p1=head;
if(num==0)
return(head);
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
while(p0->num>p1->num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(p1==head) head=p0;
else p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
printf("增加记录学号为:%d\n",num);
n=n+1;
return(head);
}
void num(struct student *head)
{
int num,a=0;
struct student *p;
printf("------请输入 \"0\" 结束输入--------\n");
do
{
p=head;
printf("请输入要查找的学号:");
scanf("%d",&num);
if(num!=0)
printf("-学号---姓名---成绩-\n");
while(p!=NULL)
{
if(p->num==num)
{
printf("%d %s %d\n",p->num,p->name,p->score);
a++;
}
p=p->next;
}
if(a==0&num!=0)
printf("学号没找到!\n");
a=0;
}while(num!=0);
system("cls");
}
void name(struct student *head)
{
char name[10],a=0;
struct student *p;
printf("------请输入 \"0\" 结束输入------\n");
do
{
p=head;
printf("请输入要查找的名字:");
scanf("%s",name);
if(name[0]!='0')
printf("-学号---姓名---成绩-\n");
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
printf("%d %s %d\n",p->num,p->name,p->score);
a++;
}
p=p->next;
}
if(a==0&&name[0]!='0')
printf("名字未找到 !\n");
a=0;
}while(name[0]!='0');
system("cls");
}
void search(struct student *head)
{
int a;
struct student *p;
p=head;
do
{
printf("1.按学号查找\n2.按名字查找\n3.退出\n");
scanf("%d",&a);
system("cls");
switch(a)
{
case 1:num(p);break;
case 2:name(p);break;
}
}while(a!=3);
}
struct student *sort(struct student *head)
{
struct student *p1,*p2;
int i,j;
int num0,score0;
char string[10];
for(i=0;i<n-1;i++)
{
p1=head;
for(j=n-1;j>0;j--)
while(p1->next!=NULL)
{
p2=p1;p1=p1->next;
if(p2->score>p1->score)
{
num0=p1->num;
p1->num=p2->num;
p2->num=num0;
strcpy(string,p1->name);
strcpy(p1->name,p2->name);
strcpy(p2->name,string);
score0=p1->score;
p1->score=p2->score;
p2->score=score0;
}
}
}
return(head);
}
void main()
{
struct student *head=NULL;
int num,score,a;
char name[10];
do
{
printf("1.创建记录\n2.删除记录\n3.增加记录\n4.查找记录\n5按成绩排序\n6.显示当前记录\n7.退出\n");
scanf("%d",&a);
system("cls");
switch(a)
{
case 1:printf("------请输入 \"0 0 0\" 结束输入------\n");head=creat();print(head);getch();system("cls");break;
case 2:printf("------请输入 \"0\" 结束输入--------\n");do{printf("请输入要删除记录的学号:");scanf("%d",&num);head=del(num,head);print(head);}while(num!=0);system("cls");break;
case 3:printf("------请输入 \"0 0 0\" 结束输入------\n");do{printf("请输入要增加的记录数据:\n");printf("-学号---姓名---成绩-\n");scanf("%d%s%d",&num,name,&score);head=add(num,name,score,head);print(head);}while(num!=0);system("cls");break;
case 4:search(head);break;
case 5:head=sort(head);print(head);getch();system("cls");break;
case 6:print(head);getch();system("cls");break;
}
}while(a!=7);
以前C语言作业课程设计,希望认真仔细看后反复自己思考,这个只是参考!C语言程序设计大作业
1题目:学生信息管理系统
2 程序要求:
(1)学生信息录入功能
1)用户从键盘输入每个学生的信息:学号、姓名、性别、数学、英语、政治、语文四门课成绩。
2)可插入一个或多个学生信息到当前编辑的班级数据中。
(2)文件保存功能
1)学生信息每一班存为一个数据文件,数据文件可在程序中打开、编辑和重新保存;
2)用户输入学生信息可随时保存数据文件。
(3)文件打开功能
1)程序只能对当前打开的数据文件进行编辑。
(4)查询功能
1)浏览所有学生信息;
2)按学号查询学生信息;
3)按姓名查询学生信息;
4) 查询一个班总成绩和平均成绩;
5) 查询一个班某一门课总成绩和平均成绩;
6)查询某一门课分数段(<60,60-69,70-79,80-89,>90)学生数。
(5)报表输出功能
1) 按学号输出一个班学生信息:学号、姓名、性别、数学、英语、政治、语文成绩、总成绩,到屏幕和文件。
2) 按总成绩输出从高到低输出学号、姓名信息。
注:以上功能以菜单形式供用户使用,并有一定的容错功能。
3 开发语言环境:
Macrosoft VC++6.0或Turbo C2.0
4 数据结构:
数组或链表
5 程序源代码要求:
(1)函数名、变量名采用英文缩写,使用匈牙利命名法进行自说明;
(2)源代码的书写采用递进格式;
(3)程序行和程序段须有注释。
Ⅸ 为什么c语言是高级程序
Microsoft公司的Visual C++是个信号,C++语言开始取代C语言,这可能已成必然趋势。在此之前,高级语言的编译软件开发公司例如Microsoft和Borland所开发出来的MS C/C++7.0,BC/C++ 3.0、4.0等都同时包含两个编译器,C编译器和作为语言扩集的C++语言编译器,两种编译器经过一个此消波长的竞争过程,最后是C++占了上风,越来越多的用户选择了C++语言,这可能将成为最重要的、最受欢迎的软件开发语言。 C语言是一个成功的语言 如果C++语言真能取代C,首先应归功于它是作为C语言的扩展而出现,这一点使得C的设计者和大批以C为主要开发工具的程序员能够接受C++。换句话说,C++的成功是在C的成功基础上实现的。 尽管大多数程序设计方法学和程序设计语言专家对C语言一直持保留态度(他们对C语言的批评是有根据的),但C语言在过去的十几年中成功地在软件开发领域占据主导地位却是个事实。C语言的成功并非偶然。 C语言与Pascal大致产生于同一时期,它接受了结构程序设计的思想,有比较现代的数据结构和控制结构,这一点使得它不但相对于低级语言,而且相对于某些同样有强大生命力的高级语言,如Fortran、Basic等也具有一定的优势。目前在国内外,采用Basic或Fortran语言编程的确实大有人在,不过使用这类语言的多数都是具有计算机专业以外的其它专业背景的编程人员,他们所编的程序一般规模较小,主要是难度较低的应用软件开发。 C语言的"类汇编语言"特征,例如它的位操作和直接访问内存地址以及CPU寄存器的能力,使得人们称它为"中级语言",不过这一点却奠定了它在系统软件开发中不可替代的优势地位。虽然Pascal语言也可以胜任编译系统的编程,但从编程手段来看显然弱于C。另一方面,C语言的出现,大大降低了汇编语言在系统软件开发领域的重要性,用C语言编程比汇编语言效率高得多,而目标代码质量也完全可以接受。 C语言程序简洁,目前已形成了一种独特的C程序员引以自豪的风格。造成C程序简短、高效、巧妙、精致(当然有时也很难读)的原因是C的一些独有的语法特征,例如: C语言不像Pascal语言那样设独立的布尔类型,使布尔表达式的逻辑值与整型、浮点型和字符型的数值相混淆; C语言虽然分别设置了整数类型和字符类型,但在实际运行中这两种类型的数据却几乎完全通用; C语言的重复控制结构,特别是for语句具有极大的灵活性,有时令人眼花缭乱; C语言提供了大量的运算符,特别是那些包括多种操作含意的综合运算符(例如,运算符"++"就包含着三种操作含义); C语言提供了多种指针(如变量指针、文件指针、函数指针等)及指针丰富的运算能力; C语言为程序员提供了可直接干予内存分配等系统功能的手段,等等。 这些特征一方面使得人们感到C语言难于掌握,但也使得那些深谙其中奥妙的C程序员感到用任何其它语言都难于写出C语言程序的那种风格和"味道"。 C语言的设计极为重视易于编译实现。一般编译系统的质量主要由三项指标来衡量,即编译时间、执行文件长度和执行速度。 这三项指标中第一项是编译的代价,第二、三项则代表目标代码的质量,二者是矛盾的对立面。不过相对于其它高级语言的实现来说,C编译器在三个方面都是令人满意的。大多数坚持采用C语言的软件开发公司的主要理由是:C程序的目标代码质量接近于汇编结果。 在C语言的成功过程中,除了技术因素之外还有一种心理因素在起作用。C和Pascal虽然产生于同一时期,然而其产生背景却不相同,Pascal可以说是以Digkstra、Hoare、Wirth等人为代表的"结构程序设计"思想的 充分体现,其重要的观点之一是宁可牺牲一部分效率,也要保证程序的正确和可靠性,无疑这种思路是正确的,然而,明智的程序设计语言的设计者与聪明的程序设计者的想法是不一致的。前者必须假定使用语言的程序员只有一般的能力,通过规范化的语言规则保证程序统一的结构,因为这样有利于易读、可靠、不易出错和便于连接。然而对于水平较高的程序员来说,这样的程序好象是八股文味的公文,冗长、乏味,无法显示自己的才华,无法利用自己关于系统的知识,C语言是程序员自己设计的语言,虽然它不很"高级",不很"结构",但它反映了能力强的程序员的心态和要求,采用C语言编程反而成了编程水平高的某种象征。 高级语言的升级换代 高级程序设计语言已经经历了几代的发展过程,随着软件开发的规模越来越大,功能越来越复杂,语言本身也在不断地改进和完善,以适应飞速发展的计算机科学与计算机产业的需要。 笔者认为,高级程序设计语言的改变可以分为三个阶段,即初期阶段、结构程序设计阶段和面向对象程序设计(OOP)阶段。目前则正处于后两个阶段的过渡时期。 高级语言的初级阶段实际上是从低级语言(机器语言和汇编语言)向高级语言的过渡,其代表是第一个高级语言Fortran语言,初期高级语言中的问题是表达式处理,这一点从Fortran名称的含义(FORmula TRANsformation language)可以看出,Fortran、Basic语言引入了变量、表达式、语句等概念,由于当时计算机应用的重点是数值计算,所以它与低级语言的主要区别也体现在表达式计算的自动处理上,而且把表达式的计算进一步引入到重复语句的控制和数组下标,更体现出"高级"编程的特征。早期的高级语言已经有子程序的概念,但应该说它们还只是"萌芽"状态的函数和过程,到结构程序设计阶段,语言中的函数和过程是最重要的设施。 第二阶段我们称之为结构程序设计阶段,结构程序设计语言的主要特征就是两点,一个是清清楚楚的数据类型说明和检查,另一个是以过程和函数为主要形式的层次编程方法。它强调的是程序自身的结构。其代表语言首先当推Pascal语言。 有了高级语言,才有了大量比较大规模程序编制的需要,其中高级语言的编译系统本身也是一种大规模程序。面对大程序的设计,初级阶段的高级语言及其编程方法不适应了,于是,60年代末的"软件危机"出现了,由Digkstra发起的"Goto语句有害"的讨论导致了Pascal、C等语言和软件工程思想及结构程序设计方法。当代的大多数程序员都是在这样的理论指导下培养出来,并创造了当今软件产业如此辉煌发展的局面。也可以说结构程序设计语言及其设计方法学,是初期阶段高级语言产生后发展的必然的、合乎逻辑的结果。 在这一时期,可以说从开始就已经孕育着一些向下一阶段发展的原始思想。例如,在C和Pascal语言中,允许把函数或过程像数据那样作为函数或过程的参数来处理。而ALGOL68、Simula67、Mola-2等语言也设置了类(class)或类似的语法成分。在数据和函数(过程)组成的模块之间由"移入表"、"移出表"来规定相互间的调用关系。在Kanth、Aho、Hopcroft、Ullman等人的数据结构与算法文献中,明确指出抽象数据类型的概念,这些都是OOP的原始思想。 以面向对象程序设计(OOP)为主要特征的第三阶段,可以认为是程序设计方法学发展的成熟期,公认的第一个面向对象语言是Smalltalk。以类(class)和对象(object)为主要语法成分,从抽象数据类型的思想出发,把数据和代码作为一体封装,如同客观事物的物质存在和它的行为功能形成的一个统一体,这样的对象之间的继承关系及行为描述的多态性,构成了OOP的基本特征。 目前,面向对象设计技术已从方法学的研究领域进入软件产业界的实际开发环境,它已不仅是一种玄妙的理论,而成为程序员必须掌握的技术。 虽然,Smalltalk最早为人们所接受,有些报导认为这种语言已为许多用户掌握和使用,然而实际的情况是,能够取代C语言,并可以成为主要软件开发语言的只能是C++。 以改良的方式实现语言的升级换代早已不是新鲜事。加强了数据类型概念和过程函数功能的Fortran、Basic的一些新版本;带有类和对象的Pascal语言(如Turbo Pascal 5.5,6.0版本)等都是按照这种方式开发出的新成果。但与C++语言相比,都不能算是成功。 C++为什么会成为主流语言 面向对象程序设计技术的完美,意味着软件开发技术的成熟,另一方面,软件技术发展到今天,OOP对于它已经不是可有可无的、用来绵上添花的改进措施,而是没有其它选择的唯一出路。 与六、七十年代相比,当今的软件产业可以说已不可同日而语,这种差别,不仅体现在软件产品的数量、品种、规模和功能结构的复杂性上,而且也体现在软件产品本身的内在特征上,程序设计的观念逐渐发生了本质的变化,这种变化使得面向过程的结构化设计方法已经不再适用。 例如,大多数软件产品(包括系统软件和应用软件)都是事件驱动的,程序设计者无法控制事件发生的顺序,换句话说,程序员编程序的概念已经发生变化。现在的编程目标已经不能简单地理解为告诉机器先做什么,然后再做什么,一项软件开发工作,实际上是对于程序员所选择的或自己设计的若干功能模块的组装。所谓组装,主要是规定模块间消息的传送关系,所谓模块的功能,就是程序模块接收、处理和发送消息的特征。显然OOP方法可以说是唯一适用的技术。 另一方面,现代软件由于面对问题的复杂性和对用户界面的方便性要求,具有许多新特征,如窗口、对话框、滚动条等图形用户界面,自动内存管理、模块动态联接、动态数据交换等等都不得不以一种可重用模块的方式为程序员利用,传统的库标准函数的形式已不能解决问题,因为窗口、对话框之类的对象已不可能以标准(带参数)函数的形式来描述,类和对象则是唯一适当的形式,过去C语言丰富而功能强大的库函数是其受到程序开发者欢迎的重要原因,现在,C++语言则以其标准类库(如Borland公司的WOL和Microsoft公司的MFC库)作为击败其它面向对象语言的手段之一。 应该说是现代软件程序的结构组织形式以及程序的保存和重用形式,决定了C语言必然要被面向对象语言所取代。哪一种面向对象语言能够取代C语言在开发领域的地位,这并不是某一个人或一些人可以决定的事情,单从支持OOP方法这一点来衡量,第一个OOP语言Smalltalk当然是有力的竞争者,在软件界有重大影响的Ada语言、Pascal语言(它们的一些新版本如Turbo Pascal 5.5、6.0)同样可以担当重任。然而,以越来越明朗的形势看,C++语言已处于最有利的地位,这并非偶然。下面几方面将是其成功的原因: ·C++语言的前身称为C with class,但不能把C++理解为C语言与OOP的简单嫁接,C++语言有其自己的发展和完善的历史。自1980年至今,经不断修订已形成完备的有机整体。这一点和"带过程的Basic"和"带类的Pascal"等情况是不同的。 ·C++的效率,主要指目标代码的效率和编译的效率。显然,语法规则的复杂性必然导致效率的下降,把C语言作为自己子集的C++语言自然效率低于C语言,但在这点上它又明显高于其它候选者。而且到目前为止,最新版本的C++编译系统(如Visual C++的新版本)的目标码质量已能为开发者所接受。而且由于有条件投入人力、物力,C++编译器的水平还可进一步提高。 ·C++语言的编程环境与工具,主要是市场因素的影响,越来越方便和丰富的环境与工具,特别是标准类库的完备化,使C++语言的优势更为明显。 ·C++语言的一个成功策略是把C语言作为自己的子集,这就把大多数中高级程序员争取到自己的阵营中来,继承C语言的一切优秀特征,逐渐消化掉它的某些不足,可能是它成功的关键。 C++语言的发展前景 C++语言是强有力的软件开发语言,但它绝对不是完美的,或者说是相当不完美的,无论大家期待的C++语言的国际标准内容如何,都必然不断地被改进。 随着C++语言在软件开发领域的地位越来越重要,与其有关的研究、开发工作必须获得越来越多的人力和资金。它的改进是必然的。 从C语言继承下来的语法规则,将逐渐从庞杂走向精减,而且日益清晰。 作为语言实现的编译系统水平和效率将不断提高。 与其相关的编程环境将越来越方便、简化。与此同时,C++语言本身将会变得更强有力。