實驗二 張珂瑜
實驗二
(一)實驗任務一
(程式原始碼)
#include <stdio.h> int main(int argc, const char * argv[]) { int a = 5, b = 7 ,c = 100, d,e,f; d = a / b * c; e = a * c / b; f = c / b * a; printf("d = %d,e = %d,f = %d\n",d,e,f); return 0; }
(程式執行結果截圖)
(問題回答)
1.表示式對應的數學計算式分別是什麼?
d=[a/b]*c (先計算a/b,將結果取整,然後乘以c,把值賦給d)
e=[(a*c)/b] (先計算a*c,然後把結果除以b,將結果取整,把值賦給e)
f=[c/b]*a (先計算c/b,將結果取整,然後乘以a,把值賦給f)
p.s.抱歉電腦沒有辦法輸入數學符號,所以我將計算過程在括號中備註了。
2.變數d,e,f計算結果不同的原因是?
由於表示式的結合從左到右,並且*和/的優先順序相同,因此每次都從左往右計算,運算結果不同。
(二)實驗任務二
(程式原始碼)
#include <stdio.h> int main(int argc, const char * argv[]) { int x=1234; float f=123.456; double m=123.456; char ch='a'; char a[]="Hello,world!";//定義一個數組a,存放字串常量。 int y=3, z=4; printf("%d %d\n",y,z); printf("y=%d z=%d\n",y,z); printf("%8d,%2d\n",x,x); printf("%f,%8f,%8.1f,%0.2f,%.2e\n",f,f,f,f,f); printf("%lf\n",m); printf("%3c\n",ch); printf("%s\n %15s\n %10.5s\n %2.5s\n %.3s\n",a,a,a,a,a); return 0; }
(程式執行結果截圖)
(總結程式中用到的格式符的用法)
%d~~~按十進位制格式輸出
%f~~~按單精度浮點數輸出
%lf~~~按雙精度浮點數輸出
%md~~~輸出m位,不足補空格到m位
%.mf~~~輸出m位小數
%ms~~~輸出的陣列字串佔m位,且不足的位數補在前
%.ms~~~輸出陣列字串的前m位
(三)實驗任務三
(修改語法錯誤後能正確執行的原始碼)
#include <stdio.h> int main(int argc, const char * argv[]) { double x,y; char c1,c2,c3; int a1,a2,a3; scanf("%d%d%d",&a1,&a2,&a3); printf("a1=%d,a2=%d,a3=%d\n",a1,a2,a3); scanf(" %c %c %c",&c1,&c2,&c3); printf("c1=%c,c2=%c,c3=%c\n",c1,c2,c3); scanf("%lf%lf",&x,&y); printf("x=%.1f,y=%.1lf \n",x,y); return 0; }
(根據實驗任務要求正確輸入並顯示執行結果的截圖)
(四)實驗任務四
(補充完整並能正確執行的c程式程式碼)
#include <stdio.h> int main(int argc, const char * argv[]) { char x; x=getchar(); if(x>='0' && x<='9'){ printf("%c是數字字元。\n",x); }else if((x>='a'&&x<='z')||(x>='A'&&x<='Z')){ printf("%c是英文字母。\n",x); }else{ printf("%c是其他字元。\n",x); } return 0; }
(執行測試結果截圖)
(五)實驗任務五
(補充完整並能正確執行的c程式程式碼)
#include <stdio.h> int main(int argc, const char * argv[]) { char ans1,ans2; printf("複習了沒?(輸入y或Y表示複習了,輸入n或N表示沒複習。):"); ans1 = getchar(); getchar(); printf("\n動手敲程式碼了沒?(輸入y或Y表示敲了,輸入n或N表示沒有敲程式碼。):"); ans2=getchar(); if((ans1=='n'||ans2=='N')&&(ans2=='n'||ans2=='N')){ printf("\n羅馬不是一天建成的。:)\n"); }else{ printf("\n羅馬不是一天毀滅的。:)\n"); } return 0; }
(執行測試結果截圖)
(六)實驗任務六
(c程式原始碼)
#include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) { const double num=2; double n,sum; printf("請輸入一個1~10以內的正整數:"); scanf("%lf",&n); sum = 1*(1 - pow(num,n+1))/(1-num); printf("當 n=%d時,sum=%d\n",(int)n,(int)sum); return 0; }
(執行結果截圖)
(七)實驗任務七
(1)最初不動腦子的實現方法一
(原始碼)
#include <stdio.h> int main(){ //9 printf(" o\t o\t o\t o\t o\t o\t o\t o\t o\n"); printf("<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\n"); printf("I I\tI I\tI I\tI I\tI I\tI I\tI I\tI I\tI I\n\n"); //7 printf(" \t o\t o\t o\t o\t o\t o\t o\n"); printf("\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\n"); printf("\tI I\tI I\tI I\tI I\tI I\tI I\tI I\n\n"); //5 printf(" \t \t o\t o\t o\t o\t o\n"); printf("\t \t<H>\t<H>\t<H>\t<H>\t<H>\n"); printf("\t \tI I\tI I\tI I\tI I\tI I\n\n"); //3 printf(" \t \t \t o\t o\t o\n"); printf("\t \t \t<H>\t<H>\t<H>\n"); printf("\t \t \tI I\tI I\tI I\n\n"); //1 printf(" \t \t \t \t o\n"); printf(" \t \t \t \t<H>\n"); printf(" \t \t \t \tI I\n\n"); return 0; }
(執行結果截圖)
(2)開始動腦子想是不是可以用for()迴圈
但是我還沒有很好的演算法真正實現這個程式,但是隨著學習,我會補上的。以下是我完成的部分,我只能達到這一步。
(原始碼)
#include <stdio.h> int main(int argc, const char * argv[]) { int i; for(i=5;i>=1;i--){ printf(" o\n<H>\nI I\n"); } return 0; }
(執行結果截圖)
實驗總結
(1)首先,在實踐中,我對於各個函式的呼叫以及格式符的用法有了深刻的理解。其次,在動手操作尤其是實驗六和七的思考演算法和程式碼實現中,不斷出錯修改,事實上真正鍛鍊了自己的能力。最後,從上次實驗到這次實驗,細節方面的程式碼習慣開始養成,基本不會出現scanf中忘記&,文段末尾忘記;的情況。
(2)通過本次實驗,讓我深刻認識到,掌握一門程式語言並不僅僅是掌握語法知識,用法等,最最重要的還是要學會運用。並且,演算法是可以不斷優化的,程式程式碼為什麼這樣可以實現,那樣不會報錯但是會出問題,每一步都是有章可循的,都是有原因的。去發現,去挖掘其中的原因所在,先實現程式碼,而後修改精簡程式碼,再通過學習不斷優化演算法,這是在我看來非常重要的過程。