1. 程式人生 > 實用技巧 >C語言綜合研究與高強度程式設計訓練綜合研究0

C語言綜合研究與高強度程式設計訓練綜合研究0

第一題

分別定義 char 型、int 型、long 型、float 型、double 型資料,並打印出各型別資料的值。

程式碼

void test01() {
    int i_num = 1;
    char c_num = 'H';
    long l_num = 327688;
    float f_num = 1.0e9;
    double d_num = 2.4e9;

    printf("\nint num : %d", i_num);
    printf("\nchar num : %d", c_num);
    printf("\nlong num : %ld", l_num);
    printf("\nfloat num : %f", f_num);
    printf("\ndouble num : %e", d_num);
}

結果:

第二題

題目

閱讀以下材料,按步驟進行實踐:
C 語言整合開發環境 Tc.exe 自帶有除錯功能。除錯方法如下:
(1)表示式檢視(快捷鍵 Ctrl+F7)在 Tc.exe 開發環境中的 Break/watch 選單中新增
或者刪除表示式檢視。

(2)斷點操作(快捷鍵 Ctrl+F8)在 Tc.exe 開發環境中的 Break/watch 選單中新增或
者刪除斷點。
(3)單步執行—不進入函式(快捷鍵 F8)。
(4)單步執行—進入函式(快捷鍵 F7)。
(5)執行到斷點處(快捷鍵 Ctrl+F9)。
程式一實現的功能:從 0 到 19 中依次找到所有偶數並將這個偶數乘以 2 後得到的結果
列印到螢幕上。

過程

對於程式一進行如下除錯:

(1)新增對 i,result,i%2==0 的值的檢視,然後用單步除錯(F7,F8)檢視這三者的值,
觀察是否和自己預判的一樣。

可以看到和預測結果一致

(2)在(1)中表達式檢視的基礎上,在 printf("%d ", result)和 i++兩行處處新增斷點(光
標置於這一行按下 Ctrl+F8 即可),然後按 Ctrl+F9 進行斷點除錯。檢視 i,result,i%2==0
的值是否和自己預判的一樣。

通過下圖可以知道可自己預判的一致

新增完檢視和斷點

斷點除錯

第三題

題目

給定的一個班的 C 語言成績為:
short results[] = {55, 80, 71, 72, 87, 90, 95, 100, 96, 87,
76, 100, 50, 83, 80, 65, 70, 69, 80, 88,
91, 98, 96, 76, 89};
將這些成績進行統計,90 ~ 100 的為 A,80 ~ 89 的為 B,70 ~ 79 的為 C,60 ~ 69 的為
D,60 以下的為 E。
在螢幕上列印輸出每個成績段的人數,即最終輸出應該為:
A:8
B:8
C:5
D:2
E:2
注:分別使用“if...else 語句”與“swith...case 語句”實現。

程式碼

void test03() {
    short results[] = {55, 80, 71, 72, 87, 90, 95, 100, 96, 87,
                       76, 100, 50, 83, 80, 65, 70, 69, 80, 88,
                       91, 98, 96, 76, 89};
    int res[5]={0};

    //switch...case
    for(int i = 0 ; i<(sizeof(results)/sizeof(results[0])) ; i++){
        switch (results[i]/10) {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:res[4]++;break;
            case 6:res[3]++;break;
            case 7:res[2]++;break;
            case 8:res[1]++;break;
            case 9:
            case 10:res[0]++;break;
            default:printf("error val");
        }
    }

    printf("\n switch...case");
    for (int i = 0; i < 5; ++i) {
        printf("\n %c : %d",'A'+i,res[i]);
        res[i]=0;
    }

    //if...else
    for (int i = 0; i <(sizeof(results)/sizeof(results[0])) ; ++i) {
        if((results[i]/10)<=5){
            res[4]++;
        } else if ((results[i]/10)<=6){
            res[3]++;
        } else if ((results[i]/10)<=7){
            res[2]++;
        } else if ((results[i]/10)<=8){
            res[1]++;
        } else if ((results[i]/10)<=10){
            res[0]++;
        } else{
            printf("error val");
        }
    }

    printf("\n if...else");
    for (int i = 0; i < 5; ++i) {
        printf("\n %c : %d",'A'+i,res[i]);
        res[i]=0;
    }
};

結果

第四題

題目

在螢幕上輸出一個九九乘法表。

注:分別使用 for 迴圈和 while 迴圈實現。

程式碼

void test04() {

    printf("\n ***************** for ***************** \n");
    for (int i = 1; i <= 9; ++i) {
        for (int j = 1; j <= i; ++j) {
            printf("%d*%d=%d \t",j,i,i*j);
        }
        printf("\n");
    }
    printf("\n ***************** while ******************* \n");
    int i = 1;
    while (i<=9){
        int j = 1;
        while (j<=i){
            printf("%d*%d=%d \t",j,i,i*j);
            ++j;
        }
        printf("\n");
        ++i;
    }
}

結果

第五題

題目

用 if...else 語句與 goto 語句分別構造 while 迴圈結構和 do...while 迴圈結構。

while 迴圈結構:
int count = 0;
while(count < 10)
{
printf("%d ", count);
count++;
}
do...while 迴圈結構:
int count = 0;
do
{
count++;
printf("%d ", count++);
}
while(count < 10)

分析

do while 先執行一次迴圈,然後判斷是否滿足條件再決定是否 goto

while 先 goto 到 判斷語句 然後判斷是否滿足條件再決定是否 goto

程式碼

void test05() {

    printf("do..while\n");
    int count = 0;

    do_while_loop:
    count++;
    printf(" %d ", count++);

    if (count < 10) {
        goto do_while_loop;
    }

    printf("\n");

    printf("while\n");
    count = 0;

    goto while_bg;
    while_loop:
    printf(" %d ", count++);

    while_bg:
    if (count < 10) {
        goto while_loop;
    }
}

結果

第六題

題目

改正程式二中出現的所有語法錯誤,讓程式沒有任何的錯誤和警告。

程式二:

void func1(char);
int func2(char);
main()
{
int c = 0;
for(c = 1; c <= 9; c++)
{
func1(c);
printf("%d ", c);
}
printf("\n");
func2(c);
}
int fun1(char x)
{
retrun x+0x30;
}
int fun2(int x) {
x = fun1(x);
printf("%x");
}

結果

  1. fun1(char)->func1(int)
  2. fun2->func2
  3. retrun->return
  4. fun2 中的 printf("%x")改為 printf("%x",x);

第七題

設計一個子函式,實現交換兩個變數的值。
注意:指標(*,&,...)的運用。

程式碼

void test07_subfun(int *a,int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void test07(){
    int a=1,b=2;
    printf("before exchange\n");
    printf("a=%d , b=%d",a,b);
    test07_subfun(&a,&b);
    printf("\nafter exchange\n");
    printf("a=%d , b=%d",a,b);
}

結果

第八題

設計一個包含學生語、數、外三科成績的結構體。定義 3 個此型別的結構體變數來儲存
下列資料:
Tom: 語文 109, 數學 120, 外語 130;
Jack: 語文 95, 數學 140, 外語 99;
Mary: 語文 130, 數學 100, 外語 140;
通過呼叫結構體變數的各個資料項來計算出他們每一個人的總分,並打印出來。
注意:結構體(struct,...)的運用。

程式碼

typedef struct{
    float chinese;
    float math;
    float english;
}score;

void test08(){
    score Tom={109,120,130},Jack={95,140,99},Mary={130,100,140};
    printf("Tom: %f\n",Tom.chinese+Tom.english+Tom.math);
    printf("Jack: %f\n",Jack.chinese+Jack.english+Jack.math);
    printf("Mary: %f\n",Mary.chinese+Mary.english+Mary.math);
}

結果

第九題

char daytable[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
以上定義的是一年 12 個月每個月的天數,其中 daytable[0]表示平年每個月的天數,
daytable[1]表示閏年每個月的天數。
設計一個子函式:int day_of_year(int year, int month, int day){}將給定的 x 年 x 月 x 日轉
化為 x 年中的第幾天的表示形式。
提示:閏年判定公式(year%4 == 0 && year%100 !=0) || (year %400 == 0)
此判定公式為“真(1)”時是閏年,“假(0)”時為平年。
注意:陣列、運算子(+,-,*,/,%,&&,||,...)的運用。

程式碼

int day_of_year(int year, int month, int day) {
    char daytable[2][13] = {
            {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
            {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    if (month > 12 || day > 31 || day < 0 || year < 0) {
        return 0;
    } else {
        //閏 平 年
        // 1 閏
        if ((year%4 == 0 && year%100 !=0) || (year %400 == 0)){
            for (int i =0 ; i< month ; i++){
                day += daytable[1][i];
            }
        } else{        // 0 平
            for (int i =0 ; i< month ; i++){
                day += daytable[0][i];
            }
        }
    }
    return day;
}

void test09() {
    int day = day_of_year(2020,3,0);
    printf("the %d day of %d",day,2020);
}

結果

第十題

運用 Turbo C 的除錯方法找出程式三中存在的錯誤,並修正程式。
程式三定義了一個新的結構體型別 struct Date。功能實現為使用者輸入時間修改指令來修
改對應的年、月、日的值。

實驗過程

  1. 在TC 中編譯完後執行
    1. 可以看到與預期結果不相符
  2. 新增斷點 和 對 data 的檢視
  3. 執行到斷點後,接著輸入 m 10 然後觀察 data 的值是否正確
    1. 可以看到data的值為10表示輸入資料正確
  4. 接下來看處理資料是否正確
    1. 可以發現data在傳參是就發生錯誤
  5. 觀察 setDate(&date, type, (int)&data);
  6. 可以看到傳遞的為data的地址而不是data 修改 為 setDate(&date, type,data); 然後在執行
    1. 可以看到值傳遞正確
  7. 編譯連結生成可執行檔案後執行可以正確執行預期功能