1. 程式人生 > 實用技巧 >實驗二 張珂瑜

實驗二 張珂瑜

實驗二

(一)實驗任務一

(程式原始碼)

#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)通過本次實驗,讓我深刻認識到,掌握一門程式語言並不僅僅是掌握語法知識,用法等,最最重要的還是要學會運用。並且,演算法是可以不斷優化的,程式程式碼為什麼這樣可以實現,那樣不會報錯但是會出問題,每一步都是有章可循的,都是有原因的。去發現,去挖掘其中的原因所在,先實現程式碼,而後修改精簡程式碼,再通過學習不斷優化演算法,這是在我看來非常重要的過程。