總分:110
7-2 說反話-增強版 : 給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。 輸入格式: 測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。
定義i,j,k爲循環變量,num1爲爲計算字符中空格的數目 ,num爲計算字符的長度 定義a數組爲要求輸入的數組 ,b爲倒序輸出 num=strlen(a); //計算總共有多少字符 if num等於1 then 輸出這個字符 返回0 end if for i=0 to a[i] do if a[i]等於' ' num1++ // 計算空格數目 if num1等於num then//全是空格的數組 返回0 end if for i=num-1 to 0 do if a[i]不等於' ' then b[j++]=a[i] //將a數組反着輸入到b中 end if else if a[i-1]等於' ' then //若是下一個仍是空格則繼續循環 continue end if if num1等於1 then //解決一個單詞後面一個一個空格 continue for k=j-1 to 0 do //輸出 倒序輸出b數組 end for j=0 end for if i==-1 for k=j-1 to 0 do 倒序輸出b數組 end for
Q1:一開始各類錯誤,有超時啊,有格式錯誤啊,有答案錯誤。。。 A1:才發現我把循環的位置弄錯了,把循環包括的範圍直接連最後的輸出也包括進去了 Q2:最後輸出的時候仍是錯了。。。全是格式錯誤,並且改了特別久都是格式錯誤。。。 A2:再定義了個變量num1,經過num1計算空格有多少就能夠來分別控制到底該怎麼輸出了,經過判斷num1與num的關係來看是否全是空格 Q2:最後一個測試點一直過不去:是不是一個單詞後面接一個空格這種狀況,調了好多種辦法,試過再新增一個變量還有其餘方法 A3:最後仍是用了num1的做用,若是num1等於1,證實只出現一個空格並且仍是在末尾部分
函數1構造字符數組存放算數表達式而且還包含了對於不合法或者超出該級別小學生學習範圍的表達式的處理;函數3計算出表達式的結果並將結果返回
算法分析:(對於計時函數等就不介紹了) void CreateExp(char *exp,int level,int number) 定義字符數組Ch爲[-,+,*,/] 定義Flag爲判斷可否整除 定義answer爲讀者輸入的答案,i爲循環變量初值爲1, flag爲是否繼續學習,result正確結果,count爲題目數量 for i=1 to number do switch level do case 1 do exp[0]=rand()%10+'0' exp[1]=Ch[rand()%4] exp[2]=rand()%9+'1' if exp[1]等於'/' then //當爲除法運算時候,要給小學生考慮下給它能夠整除的狀況 Flag=(exp[0]-'0')%(exp[2]-'0') //判斷能不能整除的狀況 while(Flag不等於0)do //不能整除的時候 exp[2]=rand()%9+'1' Flag=(exp[0]-'0')%(exp[2]-'0') end while end if break case 2 do exp[0]=Rand(2) exp[1]=Rand(1) exp[2]=Ch[rand()%4] ......exp[8]='\0' //參照等級一,把等級二的7位字符分別存進字符數組exp中 break case 3 do exp[0]=Rand(2) exp[1]=Rand(1) exp[2]=Rand(1) exp[3]=Ch[rand()%4] ......exp[11]='\0' //參照等級一,把等級二的10位字符分別存進字符數組exp中 break
改進這段代碼是真的痛苦啊。。。改特別久絕望的啊,一直以爲語法沒錯,但是就是隨機數這裏一直錯誤,我一開始把隨機計算運算符號的也弄一個函數,後來好像就由於這樣,致使隨機數輸出的時候出錯了,還有各類死循環,狀況見下圖
隨機數一點都不隨機。。。
萬惡的不知道怎麼的就死循環了。。。算法
在函數1中就包括有函數2的要求內容,因此在這裏就不介紹了
(PS:我將exp[2]的值直接不包含0這樣子就能夠不用擔憂除數爲0的狀況了)數組
算法分析: 定義字符ch爲存放計算符號 定義循環變量I,result爲計算結果,sum爲每位數,flag爲控制變量 for i=0 to exp[i] do if exp[i]>='0'&&exp[i]<='9' //將不是運算符號的字符一個個變成數字 then sum=sum*10+exp[i]-'0' //將每個字符除了運算符號外轉化爲數字存在sum裏 if level==1&&i==2||level==2&&i==7||level==3&&i==10 //當將最後一個運算符號存給ch時候下一循環是不會在進入到計算循環裏面的 switch(ch) //判斷最後一個運算符號是什麼 ,而且計算出最後結果 case '+': result+=sum break case '-': result-=sum break case '*': result*=sum break case '/': result/=sum break end switch end if end if else if flag等於0 then //當遇到第一個運算符號時候,再將計算符號存到ch中 result=result+sum flag++ ch=exp[i] sum=0 continue end if else switch ch //計算結果 case '+': result+=sum break case '-': result-=sum break case '*': result*=sum break case '/': result/=sum break end switch ch=exp[i]; sum=0; end else end for return result
原有函數的截圖(特別長只截取了難度爲1級的代碼其他兩個等級也是差很少的)
函數
原有函數的截圖
學習
1. 二級三級的難度乘除法中一開始改寫改着。。。隨機數全都不隨機了。。。三個數中必定有兩個數是相同,改了特別久,原本是將隨機數的出現放在一個函數中,運算符號也放在一個函數中,後來我參考了秋斌的代碼還有一隻調試,才發現是*exp[+(i++)]錯誤了,我就直接用數組方法和將計算符號的函數去掉不用函數了,這樣才解決了 2.我一開始在書寫計算函數的時候也是參照老師所給的代碼寫的,寫着在和本身原本的代碼進行對比,而後。。。新代碼最後算出來的result是一個數的值,這就絕了啊,最後仍是給寫出來了。。。改了好久的代碼。。。真的好久 3.經過指針改進代碼仍是用得少不習慣不熟悉,仍是許多不懂,有時候寫完一段一編譯各類編譯錯誤,函數的封裝仍是很重要的,各類銜接都很關鍵,若是用得好能夠減小不少工做量,代碼看起來也會很精簡 4.不少功能若是同樣的話能夠再把它封裝一下,在以前也有這個想法,但是一直沒實現由於函數傳遞參數的緣由致使要改得面目全非。如今學了指針能夠直接經過改內容就能夠將各類功能封裝成一個函數 5.大做業仍是有些bug沒能處理,就是要判斷整除的方法,我是經過Flag這個變量來判斷是否能夠整除,但是這樣耗時就有點久了,有時候devc直接卡住了 6.做業不能再拖了…不能再拖下去拖到最後一天才寫了,根本沒時間去改大做業啊,好不容易改了也是不少bug…之後不能再將做業拖着了……