1. 程式人生 > 實用技巧 >實驗二10.31

實驗二10.31

  • EX1

//ex1
#include <stdio.h>
#include <stdlib.h>
int main()
{
    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);
    system("pause");

    return 0;
}

line6運算:d=①a/b=5/7=0 ②0*c=0*100=0 ∴d=0

line7運算:e=①a*c=5*100=500 ②500/b=500/7=71 ∴e=71

line8運算:f=①c/b=100/7=14 ②14*a=14*5=70 ∴f=70

結果不同原因:1)abcdef均為int型,所得商均為整數 2)運算順序不同 3)運算方向為從左到右

  • EX2
// ex2

#include <stdio.h>
int main() 
{
    int x = 1234;
    float f = 123.456;
    double m = 123.456;
    char ch = 'a';
    char a[] = "Hello, world!";
    int y = 3, z = 4;

    printf("%d %d\n
", y, z); printf("y=%d, z=%d\n", y, z); printf("%7.6d,%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; }

格式符用法總結(%[<修飾符>]<格式字元>):

1)%d

①%d→按十進位制整數輸出

②%md→當資料長度x≥m時,無論m取小數、負數、0等資料皆輸出原資料;

當x<m且m為整數時,m限制資料總長度,不夠時左補空格

2)%f

①%f→按單精度浮點數輸出,無修飾符時小數按6位小數輸出;

注:實驗中輸出123.456001而不是123.456000,因為在計算機內部資料以二進位制表示,輸出時要經過十進位制到二進位制的轉換,小數部分×2直到結果為0或指定精度時結束,不是所有小數都能或能在指定精度前達到結果為1,所以產生資料損失,如果要求前六位都是完全精確的值,可以使用double雙精度浮點,輸出用%lf而不是%f

②%mf→按單精度浮點數輸出,資料長度(資料長度為整數位數+小數6位+小數點1位)<m時,左補空格,否則按實際輸出,小數按6位小數輸出;

③%m.nf→按單精度浮點數輸出,資料長度(資料長度為整數位數+小數n位+小數點1位)<m時,左補空格,否則按實際輸出,小數按n位輸出(四捨五入);

④%.nf→按浮點數輸出,對整數部分長度無要求按實際輸出,小數部分保留n位(四捨五入);

⑤%.nef→整個資料留小數點後n位,且以指數形式輸出;

⑥%lf→按雙精度浮點數輸出,無其他修飾符時小數按6位小數輸出

3)%c

①%c→按字元輸出;

②%mc→按m位字元輸出;

4)%s

①%s→輸出字串;

②%ms→輸出佔m位的字串,資料長度<m時,左補空格,否則按實際輸出;

③%m.ns→保留n位字串,然後輸出佔m位的字串,n<m時,左補空格,否則按實際輸出

  • EX3
// ex3
#include <stdio.h>
int main()
{
double x, y; char c1, c2, c3; int a1, a2, a3; scanf_s("%d%d%d", &a1, &a2, &a3); printf("a1=%d,a2=%d,a3=%d\n", a1, a2, a3); scanf_s("%c%c%c", &c1,2, &c2,2, &c3,2); printf("c1=%c,c2=%c,c3=%c\n", c1, c2, c3); scanf_s("%lf,%lf", &x, &y); printf("x=%f,y=%lf\n", x, y); return 0; }

  • EX4

// ex4-判斷字元型別 
#include <stdio.h>
int main()
{
char x; x = getchar(); if (x>=48&&x<=57) printf("%c是數字字元\n", x); else if (x>=65&&x<=122) printf("%c是英文字母\n", x); else printf("%c是其它字元\n", x); return 0; }

  • EX5

// ex5
#include <stdio.h>
int main() 
{
    char ans1, ans2;

    printf("複習了沒? (輸入y或Y表示複習了,輸入n或N表示沒複習) :  ");
    ans1 = getchar();

    getchar(); 

    printf("\n動手敲程式碼了沒? (輸入y或Y表示敲了,輸入n或N表示木有敲) :  ");
    ans2 = getchar();

    if (ans1=='y'||ans1=='Y'&&ans2=='y'||ans2=='Y')
        printf("\n羅馬不是一天建成的:)\n");
    else
        printf("\n羅馬不是一天毀滅的。。。\n");

    return 0;
}

getchar();單獨成行原因:消除緩衝區的字元

比如輸入ans1=getchar()後按下了回車,此時回車符會存在於緩衝區中,
這時繼續輸輸入ans2=getcha()的時候
此時這個gets()會把那個緩衝區的回車讀入到ans2(如下圖)


ans2還未輸入就自動判定為回車且輸出了結果。

所以在之前,我們可以用單獨的getchar()接收掉這個回車符,那麼就可以正確輸入了

  • EX6

//ex6-等比數列前n項和
#include <stdio.h>
#include <math.h>
int main()
{
    int n, sum;
    
    printf("輸入1-10之間的整數n\n");
    
    scanf_s("%d", &n);
    
    sum = pow(2, n)+1;

    printf("當n=%d時,sum=%d",n,sum);
    
        
    
        return 0;

}

實驗總結:遇到bug一定要深究,徹底搞懂,不留隱患。