Ⅰ 求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++語言本身將會變得更強有力。