指針是C的靈魂 1.沒學指針以前用數組比較多,調用函數時直接把整個數組傳過去,可是這樣對性能影響比較大,學了指針直接傳地址就能夠了。 2.指針還能夠實現子函數返回多個值;還能夠利用指針能夠實現動態內存分配。 3.指針直接對內存操做 ,效率高,指針還用於表示和實現各類複雜的結構,從而爲編寫出更加高質量的程序奠基基礎。 4.可是指針編寫的程序也更容易隱含各式各樣的錯誤,一不當心就有可能引發程序崩潰。
PTA總分:110 分
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。
輸入格式:
測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,
其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。
輸出格式:
每一個測試用例的輸出佔一行,輸出倒序後的句子,而且保證單詞間只有1個空格。
輸入樣例:
Hello World Here I Come
輸出樣例:
Come I Here World Hello算法
void strput(char *str) 定義輸出函數 定義靜態變量flag=0 定義字符指針temp = strchr(str,' ') //尋找空格地址 if temp 等於 NULL then if strlen(str)不爲0 then //str長度爲零不輸出 flag=1; //若是字符串長度不爲零 flag=1 輸出str end if else strput(temp + 1) //遞歸 *temp = '\0' //把空格改成\0 if strlen(str)不爲0而且flag等於1 then //若是字符串爲0不輸出 並根據flag的值選輸出方式 輸出" str" else 輸出str end if end if 主函數 定義字符數組 str[500011] gets(str) //讀取字符數組 strput(str) //調用輸出函數
聲明全局變量 n //n與難度有關 void CreateExp(int *result) { srand(time(NULL)) //隨機種子 int ret //中轉變量 char tistr[40]={0} //放式子 int num1,num2,num3 //放隨機數 char ch1,ch2 //放運算符 隨機數num1生成 //第一個數 itoa(num1, tistr, 10)//把num1接到tistr 運算符生成ret switch(ret) { case 0:ch1='+';break; case 1:ch1='-';break; case 2:ch1='*'; if(n==1000) ch1='+'; //爲了給小學生減小壓力,第三級沒有乘除 break; case 3:ch1='/'; if(n==1000) ch1='-'; //爲了給小學生減小壓力,第三級沒有乘除 break; } tistr[strlen(tistr)]=ch1; //放運算符 do { num2=rand()%n; //第二個數 if(num2!=0&&ch1=='/'&&num1!=0) //對除法作處理 (至關於第二個函數) { if(((num1%num2)!=0||num1<num2)) { num2=0; } } } while(num2==0); 而後重複生成 *(tistr+strlen(tistr))='=' *(tistr+strlen(tistr))=0 //式子生成結束 輸出tistr } //結束函數
void ComputeExp(char *tistr,int *result) { 定義整型 num[3]={0} j=0 i 定義字符 ch1 ch2 for i=0 直到 tistr[i] 等於 '=' i++ //把放運算式子的字符串解開 { if tistr[i]>='0'&&tistr[i]<='9' then num[j]=tistr[i]-'0'+num[j]*10 //數字放到num數組 else then if(j==0) ch1=tistr[i]; //運算符放到 ch1 ,ch2 if(j==1) ch2=tistr[i]; j++; end if } end for switch(ch1) //對運算符進行判斷 { case '+':*result=num1+num2;break; //進行對應的計算 case '-':*result=num1-num2;break; case '*':*result=num1*num2;break; case '/':*result=num1/num2;break; } switch(ch2) //解決優先級問題 (枚舉) { case '+':*result=*result+num3;break; case '-':*result=*result-num3;break; case '*': if(ch1=='+') *result=num1+num2*num3; if(ch1=='-') *result=num1-num2*num3; if(ch1=='*') *result=*result*num3; if(ch1=='/') *result=*result*num3;break; //若是第一步是加或減,第二步的乘或除要先算 case '/': if(ch1=='+') *result=num1+num2/num3; if(ch1=='-') *result=num1-num2/num3; if(ch1=='*') *result=*result/num3; if(ch1=='/') *result=*result/num3; break; }
1.傳的參數少了不用返回值; 2.處理除數更全面。 3.以前都是一個函數,封裝以後更加容易理解,整個結構更加靈活。
1.包裝後各個函數的干擾減小,代碼結構也更加清晰,移值性強。 2.經過找百度學會了用箭頭來選擇,佈局也更加協調。 3.以前我是不怎麼細分函數的,就是以爲比較方便,寫起來也快,而後聽取老師建議分裝,而後發現分裝好的函數沒有以前這麼繞,什麼函數什麼功能一目瞭然,對於寫代碼的人,找錯只需盯一小函數,而不是一片代碼,還要一條條理清楚,對於讀代碼的人,就是不用本身推理代碼的功能,一個函數一個功能,條理清晰。(很差的習慣儘可能糾正,畢竟一個大項目不可能一我的完成,團隊合做對代碼的分裝要求就比較高了) * 最後上幾個截圖