prof編程
① 計算機界的諾貝爾獎頒給誰了
計算機科學界的諾貝爾獎是圖靈獎,就是說諾貝爾獎沒有設立「計算機」方面的獎項。
1966 A. J. Perlis --- PhD, MIT; Prof, Yale (was Prof at CMU) (deceased)
因在新一代編程技術和編譯架構方面的貢獻而獲獎.
1967 Maurice V. Wilkes --- PhD, Cambridge; Prof, Cambridge
因設計出第一台程序實現完全內存的計算機而獲獎.
1968 Richard W. Hamming --- PhD, UIUC; Prof, Naval Postgraate School
(was at Bell) (deceased)
因在計數方法、自動編碼系統、檢測及糾正錯碼方面的貢獻被授予圖靈獎.
1969 Marvin Minsky --- PhD, Princeton, Prof, MIT
因對人工智慧的貢獻被授予圖靈獎.
1970 J.H. Wilkinson --- BS, Cambridge; staff, National Physical
Laboratory, London
因在利用數值分析方法來促進高速數字計算機的應用方面的研究而獲獎.
1971 John McCarthy --- PhD, Princeton; Prof, Stanford
因對人工智慧的貢獻被授予圖靈獎.
1972 Edsger W. Dijkstra --- PhD, U Amsterdam; Prof, UT Austin
因在編程語言方面的出眾表現而獲獎.
1973 Charles W. Bachman --- staff, Honeywell
因在資料庫方面的傑出貢獻而獲獎.
1974 Donald E. Knuth --- PhD, Caltech; Prof, Stanford
因設計和完成TEX(一種創新的具有很高排版質量的文檔製作工具)而被授予該獎.
1975 Allen Newell --- PhD, Stanford; Prof, CMU (deceased)
and Herbert A. Simon --- PhD, Chicago; Prof, CMU (deceased)
因在人工智慧、人類識別心理和表處理的基礎研究而獲獎.
1976 Michael O. Rabin --- PhD, Princeton; Prof, Harvard
and Dana S. Scott --- PhD, Princeton; Prof, CMU
因他們的論文"有限自動機與它們的決策問題"中所提出的非決定性機器這一很有價
值的概念而獲獎.
1977 John Backus --- BS, Columbia; staff, IBM
因對可用的高級編程系統設計有深遠和重大的影響而獲獎.
1978 Robert W. Floyd --- BS, Chicago; Prof, Stanford
因其在軟體編程的演算法方面的影響,並開創了包括剖析理論、編程語言的語義、自
動程序檢驗、自動程序合成和演算法分析在內的多項計算機子學科而被授予該獎.
1979 Kenneth E. Iverson
因對程序設計語言理論、互動式系統及APL的貢獻被授予該獎.
1980 C. Anthony R. Hoare --- Prof, Oxford(now at Microsoft)
因對程序設計語言的定義和設計所做的貢獻而獲獎.
1981 Edgar F. Codd --- PhD, Michigan; staff, IBM
因在數椐庫管理系統的理論和實踐方面的貢獻而獲獎.
1982 Steven A. Cook --- PhD, Harvard; Prof, U Toronto
因奠定了NP-Completeness理論的基礎而獲獎.
1983 Ken Thompson --- MS, Berkeley; staff, Bell-Labs
and Dennis M. Ritchie --- PhD, Harvard; staff, Bell-Labs
因在類屬操作系統理論,特別是UNIX操作系統的推廣而獲獎.
1984 Niklaus Wirth --- PhD, Berkeley; Prof, ETH Zurich
因開發了EULER、 ALGOL-W、 MODULA和PASCAL一系列嶄新的計算語言而獲獎.
1985 Richard M. Karp --- PhD, Harvard; Prof, Berkeley
因對演算法理論的貢獻而獲獎.
1986 John E. Hopcroft --- PhD, Stanford; Prof, Cornell
and Robert E. Tarjan --- PhD, Stanford; Prof, Princeton
因在演算法及數據結構的設計和分析中所取得的決定性成果而獲獎.
1987 John Cocke --- staff, IBM
因在面向對象的編程語言和相關的編程技巧方面的貢獻而獲獎.
1988 Ivan E. Sutherland --- PhD, MIT; staff, Sun
因在計算機圖形學方面的貢獻而獲獎.
1989 William V. Kahan --- PhD, U Toronto; Prof, Berkeley
因在數值分析方面的貢獻而獲獎,他是是浮點計算領域的專家.
1990 Fernando J. Corbato --- PhD, MIT; Prof, MIT
因在開發大型多功能、可實現時間和資源共享的計算系統,如CTSS和Multics方面
的貢獻而獲獎.
1991 Robin Milner --- Prof, Cambridge (was at U Edinburgh)
因在可計算的函數的邏輯(LCF)、ML和並行理論(CCS)這三個方面的貢獻而獲獎.
1992 Butler Lampson --- PhD, Berkeley; staff, Microsoft
因在個人分布式計算機系統(包括操作系統)方面的貢獻而獲獎.
1993 Juris Hartmanis --- PhD, Caltech; Prof, Cornell
and Richard E. Stearns --- PhD, Princeton; Prof, SUNY Albany
因奠定了計算復雜性理論的基礎而獲獎.
1994 Raj Reddy --- PhD, Stanford; Prof, CMU
and Edward Feigenbaum (PhD, CMU; Prof, Stanford)
因對大型人工智慧系統的開拓性研究而獲獎.
1995 Manuel Blum --- PhD, MIT; Prof, Berkeley
因奠定了計算復雜性理論的基礎和在密碼術及程序校驗方面的貢獻而獲獎.
1996 Amir Pnueli --- PhD, Weizmann Institute; Prof, NYU
因在計算中引入Temporal邏輯和對程序及系統檢驗的貢獻被獲獎.
1997 Douglas Engelbart --- PhD, Berkeley; staff, SRI
因提出互動式計算概念並創造出實現這一概念的重要技術而獲獎.
1998 James Gray --- PhD, Berkeley; staff, Microsoft
因在資料庫和事務處理方面的突出貢獻而獲獎.
1999 Frederick P. Brooks, Jr.--- PhD, Harvard; Prof, UNC
因對計算機體系結構和操作系統以及軟體工程做出了里程碑式的貢獻.
2000 Andrew Chi-Chih Yao --- PhD, UIUC; Prof, Princeton (姚期智,首位華
人獲獎者)
因對計算理論做出了諸多根本性的重大貢獻.
2001 Ole-Johan Dahl, and Kristen Nygaard --- Profs, U Oslo
因他們在設計編程語言SIMULA I 和SIMULA 67時產生的基礎性想法,這些想法是面
向對象技術的肇始.
2002 Ronald L. Rivest --- PhD, Stanford; MIT;
and Adi Shamir --- PhD, Weizmann;
and Leonard M. Adelman --- PhD, Berkeley; USC
因他們在公共密匙演算法上所做的傑出貢獻(RSA演算法是當前在互聯網傳輸、銀行以及
信用卡產業中被廣泛使用的安全基本機制).
2003 Alan Kay --- PhD, Utah; HP Labs (was at Xerox PARC)
因發明第一個完全面向對象的動態計算機程序設計語言Smalltalk.
2004 Vinton G. Cerf、Robert E. Kahn
因在互聯網方面開創性的工作,這包括設計和實現了互聯網的基礎通訊協議,
TCP/IP,以及在網路方面卓越的領導。
2005 Peter Naur
因在設計Algol 60語言上的貢獻。由於其定義的清晰性,Algol 60成為了許多現代
程序設計語言的原型。
2006 Frances Allen(首位女性獲獎者)
因對於優化編譯器技術的理論和實踐做出的先驅性貢獻,這些技術為現代優化編譯
器和自動並行執行打下了基礎。
2007 Edmund M. Clarke、 E Allen Emerson和Joseph Sifaki
表彰他們開發模型檢測技術,並使之成為一個廣泛應用在硬體和軟體工業
中非常有效的演算法驗證技術所做的奠基性貢獻。
1981年在美國工作的Edmund Clarke和Allen Emerson以及在法國的Sifakis分別提
出了模型檢測(Model Checking)的最初概念,並且他們開發了一套用於判斷硬體
和軟體設計的理論模型是否滿足規范的方法,此外,當系統檢測失敗時,還能利用
它確定代碼中問題存在的位置。
② 西門子300軟體編程軟體哪裡有免費版下載支持window7 64位的
300要支持64位的話有2種!
1、STEP 7 5.5 SP3支持64位!但是只有英文版,中文沒有!中文只有32位!這個一般雲盤里有!
2、博圖(TIA)TIA是西門子最新的集成化編程軟體,支持300、400、1200和1500!支持64位WIN7!不過界面和STEP 7有很大的不同!也有好幾個版本!基礎版只支持1200!所以你需要專業版!這個軟體官方有的下載!當然其他雲盤也有!
http://support.automation.siemens.com/CN/llisapi.dll?func=cslib.csinfo&lang=zh&siteid=cseus&aktprim=0&extranet=standard&viewreg=CN&objid=29157783&treeLang=zh這是官方地址!
③ C++簡單編程題!
#include<iostream>
#include<string>
using namespace std;
#define PROF_LEN 10
#define STU_LEN 30
class Person
{
protected:
int maxLength;
int curLength;
public:
virtual void InPutData(){}
virtual void OutPutData(int index){}
};
class Professor:protected Person
{
protected:
string name[PROF_LEN];
char c;
public:
Professor(){maxLength=PROF_LEN;curLength=0;c='c';}
void InPutData()
{
while(c=='c')
{
cout<<"請輸入教授姓名:";
cin>>name[curLength];
curLength++;
if(curLength>maxLength)
{
cout<<"已達到最大人數。"<<endl;
break;
}
else
{
cout<<"繼續輸入請按c...";
cin>>c;
}
}
}
void OutPutData(int index)
{
cout<<"教授姓名:"<<name[index]<<endl;
}
int getCurLength()
{
return curLength;
}
};
class Student:protected Person
{
protected:
char c;
int i,j;
int classNum[STU_LEN];
string name[STU_LEN];
string direction[STU_LEN];
string pname[STU_LEN];
public:
Student(){maxLength=STU_LEN;c='c';curLength=0;i=0;j=0;}
void InPutData()
{
while(c=='c')
{
cout<<"請輸入姓名,研究方向,班號數據,導師姓名(用空格隔開):";
cin>>name[curLength]>>direction[curLength]>>classNum[curLength]>>pname[curLength];
curLength++;
if(curLength>maxLength)
{
cout<<"已達到最大人數。"<<endl;
break;
}
else
{
cout<<"繼續輸入請按c...";
cin>>c;
}
}
}
void OutPutData(int index)
{
cout<<"姓名:"<<name[index]<<",研究方向:"<<direction[index]<<",班號數據:"<<classNum[index]<<endl;
}
bool cmpName(string proName,string stuPname)
{
if(proName==stuPname)
{
return true;
}
else
{
return false;
}
}
void getStu()
{
string proName;
cout<<"請輸入教授姓名:";
cin>>proName;
while(i<curLength)
{
string stuPname(pname[i]);
if(cmpName(proName,stuPname))
{
OutPutData(i);
}
i++;
}
}
int getCurLength()
{
return curLength;
}
};
void Menu(Professor professor,Student student)
{
int c=0;
int x=0;
int proCurLen=professor.getCurLength();
int stuCurLen=student.getCurLength();
system("cls");
while(x==0)
{
cout<<"1.添加教授"<<endl;
cout<<"2.顯示現有教授"<<endl;
cout<<"3.添加研究生"<<endl;
cout<<"4.查找一位教授的所有研究生"<<endl;
cout<<"5.顯示現有研究生"<<endl;
cout<<"6.退出"<<endl;
cout<<"---------------------------"<<endl;
cout<<"選擇你需要的操作:";
cin>>c;
switch(c)
{
case 1:
professor.InPutData();
Menu(professor,student);
break;
case 2:
for(int i=0;i<proCurLen;i++)
{
cout<<i+1<<".";
professor.OutPutData(i);
cout<<endl;
}
cout<<"按任意鍵返回菜單"<<endl;
cin.get();
cin.get();
Menu(professor,student);
break;
case 3:
student.InPutData();
Menu(professor,student);
break;
case 4:
student.getStu();
Menu(professor,student);
break;
case 5:
for(int i=0;i<stuCurLen;i++)
{
cout<<i<<".";
student.OutPutData(i);
}
Menu(professor,student);
break;
case 6:
x=1;
exit(1);
break;
default:
Menu(professor,student);
break;
}
}
}
void main()
{
Professor professor;
Student student;
Menu(professor,student);
}
④ 西門子PLC編程軟體200或者300系列的,誰有能給我一個,謝謝了,網上下載的都用不了
這是200的!300的有點大,不好傳!可以去網上找找!STEP 7 V5.5 SP3 或者博圖!
⑤ linux 的多線程編程中,如何給線程發信號
不管是在進程還是線程,很多時候我們都會使用一些定時器之類的功能,這里就定時器在多線程的使用說一下。首先在linux編程中定時器函數有alarm()和setitimer(),alarm()可以提供一個基於秒的定時功能,而setitimer可以提供一個基於微妙的定時功能。
alarm()原型:
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
這個函數在使用上很簡單,第一次調用這個函數的時候是設置定時器的初值,下一次調用是重新設置這個值,並會返回上一次定時的剩餘時間。
setitimer()原型:
#include <sys/time.h>
int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
這個函數使用起來稍微有點說法,首先是第一個參數which的值,這個參數設置timer的計時策略,which有三種狀態分別是:
ITIMER_REAL:使用系統時間來計數,時間為0時發出SIGALRM信號,這種定時能夠得到一個精準的定時,當然這個定時是相對的,因為到了微秒級別我們的處理器本身就不夠精確。
ITIMER_VIRTUAL:使用進程時間也就是進程分配到的時間片的時間來計數,時間為0是發出SIGVTALRM信號,這種定時顯然不夠准確,因為系統給進程分配時間片不由我們控制。
ITIMER_PROF:上面兩種情況都能夠觸發
第二個參數參數value涉及到兩個結構體:
struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
在結構體itimerval中it_value是定時器當前的值,it_interval是當it_value的為0後重新填充的值。而timeval結構體中的兩個變數就簡單了一個是秒一個是微秒。
上面是這兩個定時函數的說明,這個函數使用本不是很難,可以說是很簡單,但是碰到具體的應用的時候可能就遇到問題了,在多進程編程中使用一般不會碰到什麼問題,這里說的這些問題主要體現在多線程編程中。比如下面這個程序:
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
void sig_handler(int signo)
{
alarm(2);
printf("alarm signal\n");
}
void *pthread_func()
{
alarm(2);
while(1)
{
pause();
}
}
int main(int argc, char **argv)
{
pthread_t tid;
int retval;
signal(SIGALRM, sig_handler);
if((retval = pthread_create(&tid, NULL, pthread_func, NULL)) < 0)
{
perror("pthread_create");
exit(-1);
}
while(1)
{
printf("main thread\n");
sleep(10);
}
return 0;
}
這個程序的理想結果是:
main thread
alarm signal
alarm signal
alarm signal
alarm signal
alarm signal
main thread
可事實上並不是這樣的,它的結果是:
main pthread
alarm signal
main pthread
alarm signal
main pthread
⑥ 用C++編程怎樣實現對數據的存儲和刪除,求一個實例
---------------------------------------輸出----------------------------------------
#include<fstream>
//實現文件儲存和讀取的頭文件
#include<iostream>
using
namespace
std;
int
main()
{
int
a[5]={1,2,3,4,5};
//加入要儲存的是這些數據
ofstream
output;
//輸出流
output.open("test.txt");
//打開test.txt,若沒有,則自動創建
for(int
i=0;i<5;++i)
output<<a[i]<<endl;
//輸出數據,兩個數據間用分隔符換行,進行分隔
output.close();
//輸出完畢,關閉文件
return
0;
}
-----------------------------讀取--------------------------------
#include<fstream>
#include<iostream>
using
namespace
std;
int
main()
{
int
readin[5];
//儲存數據的數組
ifstream
input;
//輸入流
input.open("test.txt");
//打開文件,若文件不存在,那麼input.fail()會返回true
此處不進行判斷是因為上面已經創建了test.txt
for(int
i=0;i<5;++i)
input>>readin[i];
for(int
i=0;i<5;++i)
cout<<readin[i]<<"
";
cout<<endll
input.close();
return
0;
}
這是一個簡單的實例,具體的你需要可以再問我
⑦ Visual Studio 2015 各個版本有什麼區別
Visual Studio 2015有三個版本:社區版、Professional、企業版。接下來詳細介紹一下三個版本的區別:
1、社區版不支持企業使用,兩外兩個版本支持所有主體使用
⑧ 問一道c語言編程中鏈表的題目
#include <time.h>
time_t timer;
time(&timer);
struct tm *tm_val = gmtime( const time_t *timer);
char * stra = ctime(&timer);
char * strb = asctime(tm_val);
time_t 與系統實現有關,一般為long,自1970-01-01 00:00:00(Epoch)到現在的秒數
struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday; //本月的第[1, 31]天
int tm_mon; //本月第[0, 11]月
int tm_year; //該值為 實際年份-1900
int tm_wday; //周[0, 6] 周日為0
int tm_yday; //是本年的第[0, 365]天
int tm_isdst; //夏令時標志
};
其它類似 localetime(), strftime(), 以及寬字元版的wcsftime()都只是輸出變體
*除了time(),其它函數都不是線程安全的, POSIX擴展指定了相對應的線程安全函數
時鍾
struct timespec tpstart;
int err = clock_gettime(CLOCK_REALTIME, &tpstart); //獲取系統時鍾
struct timespec{
time_t tv_sec; //秒
long tv_nsec; //納秒(1微秒=1000納秒)
};
int err = nanosleep(……); //可替代sleep(), usleep(), 且不會影響包括SIGALRM在內的任何信號的使用
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
#include <sys/time.h>
struct timeval{
time_t tv_sec; //存儲秒
time_t tv_usec; //存儲微秒 (1秒=1000毫秒=1000000微秒)
};
struct timeval *now;
int err = gettimeofday(now, NULL);
此時,now->tv_sec 表示自Epoch以來的秒數,now->tv_usec 表示自Epoch以來的微秒數
要記錄進程運行的時間
clock_t times(struct tms *buffer); //buffer中詳細記錄了進程的各項詳細時間
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
間隔計時器:
「過1個小時後吃第一次葯,然後每隔4個小時吃一次葯。」
struct itimerval{ //itimerval
struct timeval it_value; //初始間隔
struct timeval it_interval; //重復間隔
};
int ret = setitimer(int which, const struct itimerval *newval, struct itimerval *oldval);
getitimer(……);
which: ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF //進程常備的三個時鍾
Example: CPU時間每過2s,列印一個數字
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
enum { MAX_VALUE = 20 };
int main(){
int setupinterrupt(void);
int setupitimer(void);
if(setupinterrupt() == -1){
perror("setupinterrupt error");
return 1;
}
if(setupitimer() == -1){
perror("setupitimer error");
return 1;
}
while(1); //不好的代碼,僅僅演示
}
/* 發生CPU時鍾信號時,列印數字*/
static void handler(int signo){
static int tick = MAX_VALUE;
int err = errno;
fprintf(stderr, "%d. ", tick);
errno = err;
if(tick <= 0){
write(STDERR_FILENO, "Done.", strlen("Done."));
exit(0);
}
}
/* 安裝CPU時間中斷信號 */
int setupinterrupt(){
struct sigaction act;
act.sa_handler = handler;
act.sa_flags = 0;
return (sigemptyset(&act.sa_mask) && sigaction(SIGPROF, &act, NULL));
}
/* 設置間隔時間計時器為2.0ss,初始間隔等於重復間隔*/
int setupitimer(){
struct itimerval tm;
tm.it_interval.tv_sec = 2;
tm.it_interval.tv_usce = 0;
tm.it_value = tm.it_interval;
return setitimer(ITIMER_PROF, &tm, NULL);
}
-------------------------------------------------------------------------------------------------MR_Computer
⑨ 如何學好一門編程語言
學好一門編程語言是十分不容易的,但是如果學會了,它的實用性是很強的,下面我為大家整理了學好一門編程語言的辦法,大家可以參考借鑒。
如何學好一門編程語言?
一、多總結
多總結才能加深理解、增強記憶。舉例,Go 中有 slice、map、channal 類型,它們都可以用 make 生成實例,但 slice 和 map 還可以用以下形式初始化,也是編程規范中建議的初始化方式:
colors := map[string]string{}
slice := []int{}
但注意了,channal 則沒有這樣的語法:msg := chan string{}
上面兩句是生成實例,表示空集合,但下面兩句則表示實例不存在,值為 nil
var colors map[string]string
var slice []int
另外,結構體指針 slice 還可以象下面這樣初始化,結構體實例不用明確地指定類型(使用了類型推導)、不用明確地取地址運算(&)。
type Proct struct {
name string
price float64
}
procts := []*Proct{{"Spanner", 3.99}, {"Wrench", 2.49}, {"Screwdriver", 1.99}}
看到沒有,如果不經常總結,這一圈學下來會把你整的稀里糊塗的。
二、多比較
學一門新語言一定要與你之前已經熟悉的語言經常作比較,找出它們的相同與不同,這樣才能加深記憶和理解,否則學完之後腦子里會一片混亂,搞不清誰是誰非了。
就拿數組來說吧,在 Java、Scala、Go 中定義、實例化、賦值是不一樣的。
//Java
int[] arr;//定義數組,不可以指定數組長度
arr = new int[5];//創建數組對象(實例化),指定數組長度
arr[1] = 8;//賦值
//Scala
val arr = new Array[Int](5) //數組在Scala里用的是泛型類,構造函數參數指定數組大小
arr(1) = 8 //賦值,注意用的是括弧
//Go
arr := [5]int{} //創建數組,初始化5個元素都為0,注意如果不指定數組長度,則是另外一種類型Slice
arr[1] = 8 //賦值
再比如 Map 在 Scala 與 Go 語言里定義、初始化、訪問也是不同的,作了以下比較後印象會非常深刻,把它們記下來,這樣以後使用就不會搞混了。
//Scala
val capital = Map("France" -> "Paris", "Japan" -> "Tokyo")
println(capital.get("France"))
//Go
capital := map[string]string{"France": "Paris", "Japan": "Tokyo"}
fmt.Println(capital["France"])
Go 同時給多個變數賦值在 Scala 里可以用模式匹配做到,如下:
//Scala(使用樣本類的模式匹配)
case class Tao(name: String, age: Int);
val Tao(myName, myAge) = Tao("taozs", 18);
println(myName)
println(myAge)
//Go
myName, myAge := "taozs", 18
fmt.Println(myName)
fmt.Println(myAge)
//Scala(使用元組的模式匹配)
val (myNumber, myString) = (123, "abe")
println(myNumber)
println(myString)
//Go
myNumber, myString := 123, "abe"
fmt.Println(myNumber)
fmt.Println(myString)
以下是 Scala 和 Go 定義和實現函數的區別:
//Scala
val increase: Int => Int = (x: Int) => x + 1
println(increase(8))
//Go
var increase func(int) int = func(x int) int { return x + 1 }
fmt.Println(increase(8))
除了在 Scala 和 Go 里都可以類型推導外,在 Scala 里還可以這樣定義函數:
//Scala
val increase = (_: Int) + 1
為方便自己將來隨時查閱,可以建立下面這樣的對比表格,描述不一定要求規范,自己能看懂就行。
三、轉變思維方式,
學會用這門語言去思考
學會用語言去思考是關鍵。如果你以前是學 C 的,轉學 Java,你一定要改變以前面向過程的思維,學會用面向對象的思維去分析問題;以前學 Java 的,轉學 Scala 則要學會用函數式的編程思維解決問題。
舉一個函數式編程的例子,以下是 Java 語言常用的 for 循環,循環變數從 1 到 10 執行 10 次循環體:
// 命令式編程
for (int i = 1; i < 10; i++) {
// 此處是循環體做10次
}
這被稱為命令式編程 (Imperative Programming),但學了 Scala 的函數式編程 (Functional Programming) 後,解決同樣的問題,我們可以換一種思維:構建 1 到 10 的列表序列,針對列表中的`每個元素分別執行函數,如下:
//函數式編程
val autoList = (1 to 10).map(i => /*此處是函數體,針對1到10的每一個分別調用 1次*/)
已經習慣了 Java 編程的,對 Scala 的函數式編程、樣本類、模式匹配、不可變對象、隱式轉換等需要一個逐步適應的過程,要漸漸學會用它們思考和解決問題。
再舉個 Scala 與 Go 思維方式不同的例子,要實現對一個字元串里的每個字元加 1 的操作,Scala 里可以這樣:
"abc".map(cc => cc + 1)
"abc"是一個字元串對象,調用它的方法 map,這是純面向對象的思維,但在 Go 里就要轉變為面向過程的思維:
name := "abc"
second := strings.Map(func(x rune) rune {
return x + 1
}, name)
注意,這里的 strings 是包 (package),調用它的公共函數 Map,被人操作的對象 name 字元串作為函數參數傳入。Go 提供的函數 len、cap、append、 等其實都是面向過程的,雖然 Go 也提供有面向對象的支持,已經習慣了面向對象編程的,剛開始學 Go 語言需要特別留意這一點。
四、多看開源代碼
學一門語言就是學一種思維方式,如今 GitHub 上可下載的開源代碼海量級,通過看別人的代碼,學習別人是如何解決問題的,養成用該語言思考的習慣,另外還能學習到一些非常有用的技巧,比如我在看一個 Go 語言性能測試框架代碼時看到有以下寫法:
func main() {
defer profile.Start().Stop()
...
}
這個意思是指剛進入程序時執行 Start( ) 函數,程序退出前調用 Stop( ) 函數,非常好的技巧啊!可以用於需要在程序執行前和程序完成後分別執行一段邏輯的場景。再看 Start( ) 函數是怎麼實現的:
func Start(options ...func(*Profile)) interface {
Stop()
} {
...
return &prof
}
該函數返回了一個實現了含有 Stop( ) 函數介面的對象,如此才能在調用 Start 調用後連調 Stop。
五、優先學會使用代碼分析工具
代碼分析的工具包括靜態檢查、測試、測試覆蓋率分析、性能分析(內存、CPU)、調試工具等,工具的價值在於它可以有效幫我們發現代碼問題,這在我們剛開始學一門編程語言時意義尤其重大。
例如,以下這句 Java 賦值語句估計沒有哪本教科書會告訴你有性能問題:
String sb = new String(「Hello World」);
以下這段 Java 代碼你也不一定能意識到有多線程問題:
synchronized public void send(authuserPacket pkt, Thread t, String flowNo) throws IOException
{
logger.info("start");
//連接不可用,直接拋出異常,等待接收線程連接伺服器成功
if (!this.avaliable)
{
try
{
//如果連接不可用,則等待2S,然後重新檢測
Thread.sleep(2000);
}
... ...
如果我們及時用 FindBugs 工具檢查就會發現上面這些問題,進而你會去分析研究為什麼,如此,你對這門語言的了解也會越來越多。
另外,Go 語言自帶的 vet/test/cover/pprof/trace 都是非常有用的工具,一邊學一邊使用這些工具分析代碼,能加深對語言的理解。
六、多練習、多實踐
就象學自然語言一樣,如果只知道語法不去練是沒有任何效果的,只有反復地練習,慢慢才能變成自己的一項技能。書本上的例子代碼最好能從頭到尾親自敲一遍,多運行、多嘗試,另外再找一些題目來練習,如能有機會參與項目開發則更好啦,勤動手、勤實踐是最好的學習方法。
其它的方法還有:
做好筆記,把學習中遇到的關鍵點和自己的思考記下來,便於後面復習和對比;
復習,學習一定要重復、重復、再重復;
學習貴在堅持,每天學一點(比如堅持每天學 1 小時),日積月累。
⑩ C++編程題
哇,這么巧?我今天剛做了這個題目微。。。
#include <iostream.h>
#include <iomanip.h>
class Person
{
public:
void input()
{
cout << "number:";
cin >> number;
cout << "name:";
cin >> name;
}
void display()
{
cout << "number" << number << endl;
cout << "name" << name << endl;
}
private:
int number;//編號
char name[100];//姓名
};
class Student : public Person
{
public:
void input()
{
cout << "depart:";
cin >> depart;
cout << "degree:";
cin >> degree;
}
void display()
{
cout << "depart" << depart << endl;
cout << "degree" << degree << endl;
}
private:
int degree;//班級號
int depart;//成績
};
class Teacher : public Person
{
public:
void input()
{
cout << "prof:";
cin >> prof;
cout << "depart:";
cin >> depart;
}
void display()
{
cout << "prof" << prof << endl;
cout << "depart" << depart << endl;
}
private:
char prof[100];//職稱
char depart[100];//部門
};
int main()
{
Student s1;
Teacher t1;
cout << "Input a student data:\n";
s1.Person::input();
s1.input();
cout << "Input a teacher data:\n";
t1.Person::input();
t1.input();
cout << "Output a student data:\n";
s1.Person::display();
s1.display();
cout << "Output a teacher data:\n";
t1.Person::display();
t1.display();
return 0;
}