定義操做數num1,num2,結果result=0.運算符ch。 輸入num1 while (ch=getchar())!='=' 輸入num2 switch(ch) + 運算 result=num1+num2 break - 運算 result=num1-num2 break * 運算 result=num1*num2 break / if num2==0,輸出錯誤 break else 運算 result=num1/num2 break default 輸出錯誤 break num1=result 再下一次循環 輸出num1
1. 部分正確 :討論ch等於'/'及非法符號時答案錯誤
錯誤代碼:數組
case '/': //當運算符爲'/'時分出數位0的特殊狀況 if(num2==0){ printf("ERROR\n");//若分母爲0,輸出錯誤 ,並跳出循環 break; } else{ result=num1/num2;break; //不然正常運算 default: printf("ERROR\n"); break; //除以上狀況所有輸出錯誤
我發現:當switch判斷到是'/'號而且除數爲0時,儘管已經輸出錯誤信息「ERROR,但break只能結束上面的while循環,循環外面的輸出num1的語句仍是會執行,致使答案錯誤。函數
- 測試非法符號:
我發現:和上面那個是同樣的,當輸出錯誤信息「ERROR後,程序還在繼續執行,並無要中止致使答案錯誤。性能
2. 部分正確 :最小表達式錯誤,即只有一個操做數並沒有運算的狀況。
學習
錯誤代碼:測試
num1=result;//把每一次的結果放入num1中進行下一次的運算 } printf("%d",result); //輸出結果 return 0;
調試過程:
即當沒有運算符時,程序不會進入進入while循環,致使輸出result時結果爲result的初始值0.spa
解決辦法:原本想在循環再加一句將num1的值賦給result的語句,後來想到既然num1裏每次都存放着result來進入每一次的運算,那麼結束時直接輸出num1也是同樣的效果。設計
3. 本題小結 :
return語句做用:3d
return 0放在main函數裏頭的中間,程序就提早結束不執行日後的代碼了;
return語句在函數中的功能就是退出當前函數並提供一個返回值,函數被終止了,後面的語句就不會被執行了;
若是主函數的類型是 int main(){},那麼就須要 return 0;
若是主函數的類型是 void main(){},那麼就不須要返回值 ;
上面的狀況一樣也適用於自定義的函數,可是自定義函數是返回一個具體變量或值。調試
-- 引用自百度知道code
同時也搞清楚break的做用範圍:
break語句的調用,起到跳出循環或者分支語句做用。
也就是說,break只有兩種使用環境:
1 用於循環體內,包括for, while和do-while循環,做用爲跳出break所在循環體。注意,若是是循環嵌套,而break出如今內層,那麼只能跳出內層循環,沒法跳出外層循環。
2 用於開關語句,即switch - case語句,起到跳出開關語句做用。用於switch嵌套時,與上述循環嵌套效果相同,只能夠跳出所在開關語句。
-- 引用自百度知道
主函數: 定義數組a[80].i循環變量,repeat次數。 輸入repeat for i=1 to i<=repeat 共repeat次 gets()讀入一行字符串。 調用all(a) if 返回值爲1 輸出YES else 輸出NO int all(char a[ ])自定義判斷函數: 定義m循環變量 if (a[0] !(下劃線,字母)) 返回0 else for i=1 to a[i]!='\000' if (a[i] !(下劃線,字母,數字) 返回0 i++ 直到a[i]='\000' 返回1
1. 運行超時:剛開始沒用數組,感受是由於這個致使沒在規定時間內運行結束,因此後面使用了數組。
2. 答案錯誤:其實這題兜兜轉轉用了好多種方法,最後我使用了數組與函數結合的方法解決,這裏面最複雜的問題是討論遇到空格時的狀況。
錯誤緣由:當我輸入有空格的字符時,它進入函數直到讀到空格時返回0,輸出了No,可是它下一次讀入的是空格後的字符。
解決辦法:當得知是%s的問題之後,我去百度查資料怎樣解決%s遇空格結束的問題,因此我將字符串的讀取改成gets(),解決了這個問題。
用scanf只能錄入連續的字符串,遇到空格就結束,若是你要把空格也吞了,推薦用gets()就可把接收帶空格的字符串,它遇回車才結束的。
定義n,i放循環變量,space放空格,xing放* for i=1 to n/2+1 上半部分 for space=1 to space<=n/2+1-i 輸出空格。space++,end for xing=1 to xing<=2i-1 輸出*空格。xing++,end 換行i++,end for i=1 to i<=n/2 下半部分 for space=1 to space<=i 輸出空格。space++,end for xing=1 to xing<=n-2i 輸出*空格。xing++,end 換行i++,end
1. 部分正確 :圖形不對稱,只關注到星號後面要有空格,忽略了前面的空格並非以一個爲單位輸出的
解決辦法:將每次輸出的空格改爲兩個空格。
類型名 數組名 [數組長度];
類型名 數組名[數組長度] = {初值表};
1.定義循環變量i,j和總個數n,以及中間量k,temp.數組a[n] 2.進入for(i = 0; i < n-1; i++)控制循環次數,n個數須要n-1次循環。 3.k賦值爲i,在進入內循環for (j=i+1; j < n; j++) ,循環內判斷a[j] < a[k],如果則賦值k等於j. 4.重複第3步,直到j=n. 5.若k != i,temp賦值爲a[k],a[k]賦值爲a[i],a[i]賦值爲temp,來交換a[k],a[i]的值。 6.重複第2步,直到i=n-1,結束循環。
1.定義循環變量i,j,總個數n和數組a[n].中間量temp 2.進入for(i=0;i<10-1;i++)控制循環次數,n個數須要n-1次循環。 3.在進入內循環for(j=0;j<9-i;j++)每次比較n-i次,if判斷a[j]>a[j+1],若爲真,temp賦值爲a[j],a[j]賦值爲a[j+1],a[j+1]賦值爲temp,來交換a[j],a[j+1]的值。 4.重複第3步,直到j=9-i.結束內循環。 5.重複第2步,直到i=10-i.結束循環輸出數組內的數
1.從第一個元素開始,temp=a[i],i爲循環變量表示不斷日後取數,並賦值給temp 2.取出下一個元素,在已經排序的元素序列中從後向前判斷,並利用j==1標記它的初始位置 3.找到新元素小於已排序的元素,即temp<a[j-1],就將已排序的該元素移到下一位置 ,將新元素插進去,j-- 4.重複步驟3,直到找到新元素大於或者等於已排序的元素的位置,即temp>=a[j-1] 5.將新元素插入到該位置中,將a[j-1]的值賦給a[j],將temp的值賦給a[j] 6.重複步驟2,直至將全部數據取完
類型名 數組名 [行長度] [列長度];
類型名 數組名 [行長度] [列長度] = { {初值表0},······,{初值表k},······};
類型名 數組名 [行長度] [列長度] = {初值表};
int main() { int i, j, b[3][3]; int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; printf("矩陣原型:\n"); for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { b[j][i] = a[i][j]; printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); printf("矩陣轉置後:\n"); for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { printf("%d ", b[i][j]); } printf("\n"); } getchar(); return 0; }
與矩陣有關的運算
詳細羅列不明白地方,包括課堂派錯題、PTA錯題。
D選項錯誤:初始化列表的元素數目超過數組長度
B選項中\x是輸出16進制的標識
1.static有什麼做用
1、定義全局靜態變量 :在全局變量前面加上關鍵字static,該全局變量變成了全局靜態變量。全局靜態變量有如下特色:
(1)在全局數據區內分配內存
(2) 若是沒有初始化,其默認值爲0
(3)該變量在本文件內從定義開始到文件結束可見
2、定義局部靜態變量:在局部靜態變量前面加上關鍵字static,該局部變量便成了靜態局部變量。靜態局部變量有如下特色:
(1)該變量在全局數據區分配內存
(2) 若是不顯示初始化,那麼將被隱式初始化爲0
(3) 它始終駐留在全局數據區,直到程序運行結束
(4)其做用域爲局部做用域,當定義它的函數或語句塊結束時,其做用域隨之結束。