《構建之法(第三版)》第一章
1.軟件=程序(程序=算法+數據結構)+軟件工程
一個復雜的軟件不但要有合理的軟件架構、軟件設計與實現,還要有各種文件和數據來描述各個程序文件之間的依賴關系、編譯參數、鏈接參數等。這些都是軟件的構建過程。
和軟件開發活動(構建管理、源代碼管理、軟件設計、軟件測試、項目管理)用關的內容是軟件工程的核心部分,由此推論軟件企業 = 軟件+商業模式。
程序(算法、數據結構)是基本功(即使算法別人都已經實現只需調用即可,數據結構和算法還是要掌握,對代碼的改進很有幫助。看到一個比喻:寫程序和開車一樣,經驗可以起到很大作用,但如果不知道底層是怎麽工作的,就永遠只能開車,既不會修車,也不能造車),但是在算法和數據結構之上,軟件工程決定了軟件的質量;商業模式決定了一個企業的成敗。
2.軟件工程
軟件工程是把系統的、有序的、可量化的方法應用到軟件的開發、運營和維護上的過程。包括軟件需求分析、軟件設計、軟件構建、軟件測試和軟件維護領域。
軟件開發具有復雜性、不可見性(沒辦法看到機器內部怎麽運行的)、易變性(正確修改軟件很困難)、服從性(服從硬件,服從用戶需求)、非連續性(輸入很小的變化,會引起輸出上極大的變化)。
計算機科學中的理論研究部分,大多可以從形式上證明,與數學、離散數學、數理邏輯密切相關;計算機科學中與時間相關的部分,都和數據以及其他學科發生關系;軟件工程則和人的行為、現實社會社會的需求息息相關。
計算機理論的進展會幫助軟件工程(例如對程序正確性的分析);軟件工程的進展(更好的工具,更多的應用領域)會幫助計算機科學家更有效地進行實驗和探索。
軟件工程的目標是創造“足夠好”的軟件,在時間、成本等多種約束條件下決定一個軟件在什麽時候能“足夠好”,可以發布。
3.簡單的四則運算
隨機出30道題,因為是二年級,所以加法不過百,減法不變負,乘數除數不過十。提到隨機數我就想到了rand(),去搜了一下該函數產生的數的範圍,rand()%m可以產生從0~m-1,所以現在想產生100以內的數,就應該用rand()%100。但是在實踐中雖然使用了rand(),每次生成的隨機數都是一樣的,查後知道了需要提供一個種子,相同的種子會產生相同的隨機數,因此在rand()前添加srand(time(NULL))
就可以了。實踐代碼如下:
#include<stdio.h> #include<time.h> #include<stdlib.h> int main ( int argc, char *argv[] ) { int Questions(); Questions(); return 0; } int Questions() { srand(time(NULL)); int t=0; for (int i = 0; i < 30; i++) { printf("%d.",i+1); int x=rand()%100; int y=rand()%100; int z=rand()%4; if(z==0) { x=x%10; y=y%10;//個位數相乘 printf("%d×%d=\n",x,y) ; } if(z==1) { y=(y%10)+1;//除數不能為0 printf("%d÷%d=\n",x,y) ; } if(z==2) { if((x+y)>100) { x=x/2; y=y/2;//和不大於100 } printf("%d+%d=\n",x,y) ; } if(z==3) { if(x<y){ t=y; y=x; x=t;//差不能是負數 } printf("%d-%d=\n",x,y) ; } } }
如果支持真分數(分子小於分母)四則運算,代碼改為以下:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main ( int argc, char *argv[] )
{
int Questions();
Questions();
return 0;
}
int Questions()
{
srand(time(NULL));
int t;
for (int i = 0; i < 30; i++) {
printf("%d.",i+1);
int x1=rand()%100;
int x2=rand()%100;
int y1=rand()%100;
int y2=rand()%100;
if(x2<=x1){
t=x2;
x2=x1;
x1=t;
if(x1==x2) {
x1=x1-1;//保證分子比分母小
}
}
if(y2<=y1){
t=y2;
y2=y1;
y1=t;
if(y1==y2 ) {
y1=y1-1;
}
}
int z=rand()%4;
if(z==0) {
printf("%d/%d × %d/%d=\n",x1,x2,y1,y2) ;
}
if(z==1) {
x2=(x2%10)+1;
y2=(y2%10)+1;
printf("%d/%d ÷ %d/%d=\n",x1,x2,y1,y2) ;
}
if(z==2) {
printf("%d/%d + %d/%d=\n",x1,x2,y1,y2) ;
}
if(z==3) {
if(x1/x2>y1/y2) {
t=x1;
x1=y1;
y1=t;
t=x2;
x2=y2;
y2=t;
}
printf("%d/%d - %d/%d=\n",x1,x2,y1,y2) ;
}
}
}
《構建之法(第三版)》第一章