1. 程式人生 > 實用技巧 >本文將大資料學習門檻降到了地平線

本文將大資料學習門檻降到了地平線

實驗二

1.實驗任務1


#include <stdio.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); return 0; }

6.(5/7)*100

7.(5*100)/7

8.(100/7)*5

*和/都是左結合,從左向右運算,而a,b,c,d,e,f都是整型變數,進行/運算時只會保留整數部分,所以d,e,f三個值不同

2.實驗任務2

#include <stdio.h>
int
main() { int x=1234; float f=123.456; double m = 123.456; char ch = 'a'; char a[] = "Hello, world!"; // 定義一個數組a,陣列中存放字串常量hello,world! 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; }

printf()中

(1.%d:以十進位制輸出

%nd:輸出n列十進位制數,不足n列左邊用空格補齊,足夠n列則正常輸出(n為數字)

%-nd:輸出n列十進位制數,不足n列從右邊用空格補齊

(2.%f:以小數形式輸出,預設保留六位小數(單精度)

%.nf:保留小數點後n位

%.e:以指數形式輸出

%lf:以雙精度輸出

(3.%c:以字元輸出

%nc:輸出n列,不足n列左邊用空格補齊

(4.%s:以字串輸出

%.ns:輸出字串前n位(n為數字)

%ns:輸出n列字串,不足在左邊用空格補齊,足夠則正常輸出

3.實驗任務3

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

4.實驗任務4

// ex4.cpp
// 判斷字元型別 
#include <stdio.h>
int main() 
{
    char x;

    x = getchar();

    if (x>='0'&&x<='9') // 判斷x是數字字元表示式 
        printf("%c是數字字元\n", x);
    else if ((x>='a'&&x<='z')||(x>='A'&&x<='Z')) // 判斷x是大寫或小寫英文字母的表示式 
        printf("%c是英文字母\n", x);
    else
        printf("%c是其它字元\n", x);


    return 0;

5.實驗任務5

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

    printf("複習了沒? (輸入y或Y表示複習了,輸入n或N表示沒複習) :  ");
    ans1 = getchar();  // 從鍵盤輸入一個字元,賦值給ans1

    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;
}

6.實驗任務6

#include<stdio.h>
#include<math.h>
int main() 
{
    int sum, n;
    scanf("%d", &n);
    if(n>=1&&n<=10)
    {
    sum = (1 - pow(2,n)) /(1 - 2);
    printf("n=%d,sum=%d",n,sum);
    }
    else
    printf("n³¬³öÏÞ¶¨·¶Î§");
    return 0;
}

7.實驗任務7

#include <stdio.h>
void print(char*,int,int);
int main()
{    
    int n=5,i,layer=1;
    char head[] =" O",body[] = "<H>", leg[] = "I I";
    for (i = n;i>0;i--)
    {
            print(head, 2 * i - 1,layer);
            print(body, 2 * i - 1,layer);
            print(leg, 2 * i - 1,layer);
            printf("\n");
            layer++;
    }
    return 0;
}
void print(char*string, int i,int n)
{
    for (;n - 1 > 0;n--)
        printf("%10s"," ");
    for (int j = 0;j < i;j++)
        printf("%-10s",string);
    printf("\n");
}

實驗總結

1.實驗任務5中getchar()的作用是清除緩衝區中的‘\n’字元。用鍵盤輸入時,輸入的字元會儲存在緩衝區內,按下enter後緩衝區清空,但是保留著'\n'而getchar()是從緩衝區讀取字元,如果不加上一行getchar,ans2=getchar()會直接把'\n'賦值給ans2。同樣的,scanf函式也是從緩衝區讀取,實驗任務3中如果在輸入a1,a2,a3的值後換行那麼c1就會為'\n',如果想要換行輸入可以新增一行getchar()或者fflush(stdin)來達到清空緩衝區的目的,也可以在scanf中"和第一個%c之間加上\n。

但是,為什麼'\n'不會被整型和浮點型讀取?

於是我找到了這樣的一篇文章,裡面解釋了C語言中scanf函式與函式空格

http://blog.csdn.net/xia7139/article/details/14522493

在VS2019中,scanf_s函式有三個引數scanf_s( , , )最後一個是所分配記憶體的大小.

2.實驗任務7中,因為小人是重複的,可以用到迴圈。我的思路是先打印出頭再換行打印出身體最後再換行打印出腿,然後把這個過程放入另一個迴圈中。考慮到列印頭、身體和腿的步驟實際上是相同的,於是我寫了個函式print,有三個引數,第一個是列印的字串,第二個是列印的次數,第三個是小人所處的層數。一共五層,小人從上向下每次在兩邊各減少一個,很容易歸納出規律,下面為第一排,上面為最後一排,若小人處在第x排,則此排小人的數量為(2x-1)。最後,小人前面的空格符也需要考慮進去,在列印小人身體前先列印空格,而空格符的數量和小人所處的層數是相關的,所以print函式的最後一個引數就是用來打印出空格的。