20201022-成信大-C語言程式設計-20201學期《C語言程式設計B》C-trainingExercises26

風車車的大表哥發表於2020-11-25

20201022-成信大-C語言程式設計-20201學期《C語言程式設計B》C-trainingExercises26

本次練習用到的資料檔案

Comp.txt for P320

123 + 556

Comp.txt for P321

123 + 556
300 - 215
1001 - 18976
9123 + 5156

Comp.txt for P324

123
300
1001
9123
9000    

CompA.txt

+
-
-
+

compB.txt

556
215
18976
5156

P320

在這裡插入圖片描述

/* 
    讀檔案,完成運算
編寫一程式P320.C實現以下功能
  在文字檔案Comp.txt裡有需要計算結果的整數算式,每個算式佔一行且檔案中只有一個算式,運算型別只有“加法(+)”或者“減法(-)”且運算子前後至少有一個空格。
計算該算式的結果並在螢幕上顯示。
  單擊此處下載程式執行時測試用的算式檔案Comp.txt(加法示例,程式設計時還應考慮算式為減法的情況)並儲存到程式P320.C所在的資料夾且檔名保持不變。
程式設計可用素材:
printf("%d + %d = %d\n");
printf("%d - %d = %d\n");
  程式的執行效果應類似地如圖1和圖2所示。

123 + 556 = 679
圖1 程式執行效果示例(測試用算式檔案Comp.txt內容為整數加法算式)

123 - 556 = -433    
 */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int data1, data2;
    int result;
    char ch;    
    FILE *fp;

    // open file
    if ((fp = fopen("Comp.txt", "r")) == NULL)
    {
        printf("Open file failure.\n");
        exit(0);
    }
    // read data
    // 只有一行資料,直接格式化讀取,注意,%c前有一個空格
    fscanf(fp, "%d %c %d", &data1, &ch, &data2);
    if ('+'==ch)
    {
        result = data1 + data2;
        printf("%d + %d = %d\n", data1, data2, result);
    }
    else
    {
        result = data1 - data2;
        printf("%d - %d = %d\n", data1, data2, result);
    }
    //close file
    fclose(fp);

    return 0;
}

P321

在這裡插入圖片描述

/* 
編寫一程式P321.C實現以下功能
  在文字檔案Comp.txt裡有需要計算結果的整數算式,每個算式佔一行且檔案中有多個(數量不確定)算式,運算型別只有“加法(+)”或者“減法(-)”且運算子前後至少有一個空格。
計算這些算式的結果並在螢幕上顯示。
  單擊此處下載程式執行時測試用的算式檔案Comp.txt並儲存到程式P321.C所在的資料夾且檔名保持不變。
程式設計可用素材:
printf("Line %03d:  %5d + %-5d = %-6d\n");
printf("Line %03d:  %5d - %-5d = %-6d\n");
  程式的執行效果應類似地如圖1所示。

Line 001:    123 + 556   = 679
Line 002:    300 - 215   = 85
Line 003:   1001 - 18976 = -17975
Line 004:   9123 + 5156  = 14279
圖1 程式執行效果示例(使用系統提供的測試用算式檔案Comp.txt)
 */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int data1, data2;
    int result;
    char ch;
    int i = 1;
    FILE *fp;

    // open file
    if ((fp = fopen("Comp.txt", "r")) == NULL)
    {
        printf("Open file failure.\n");
        exit(0);
    }

    // read data
    while (!feof(fp))
    {
        fscanf(fp, "%d %c %d", &data1, &ch, &data2);
        if (!('+' == ch || '-' == ch)) // 如果讀出來的不是運算子號,就終止
        {
            break;
        }

        if ('+' == ch)
        {
            result = data1 + data2;
            printf("Line %03d:  %5d + %-5d = %-6d\n", i, data1, data2, result);
        }
        else
        {
            result = data1 - data2;
            printf("Line %03d:  %5d - %-5d = %-6d\n", i, data1, data2, result);
        }
        ch = '\0';  // 每一次用完之後,就將運算子清空
        i++;
    }

    // close file
    fclose(fp);

    return 0;
}
/* 
    另一種思路,就是將fscanf的返回值拿來判斷
    程式中用到fscanf、fprintf,為了判斷異常,需要知道兩個函式的返回值含義

    原型:int fscanf(FILE* stream, const char* format, [argument...]);

            1.fscanf正常情況下返回從檔案中讀出的引數個數
                fscanf返回的是實際讀取的資料個數,出錯或者到結尾返回EOF。
            2.fprintf正常情況下返回寫入檔案的位元組數
    注意細節:
            1. 在空白符這個意義上來講,fscanf 對空格、製表符、換行符是一視同仁的,不加區分的;%s會跳過前面的空白符,但是不會跳過後面的空白符;%c不會跳過空白符。
            2. *表示讀取一個域,但是不賦值給變數。
            3. []表示只讀取中括號內的字元,[]表示不讀取中括號內的字元,值得注意的是%[]s將不會跳過前面的空白符。
            4. 如果還沒有任何一個域匹配成功或者任何一個匹配失敗發生之前,就達到了檔案流末尾,就算出錯;或者讀取檔案流出錯。這兩種情況下,fscanf 返回EOF。
 */

P324

在這裡插入圖片描述

/* 
編寫一程式P324.C實現以下功能
  在文字檔案Comp.txt、CompA.txt、CompB.txt裡有需要計算結果的整數算式,檔案Comp.txt提供參加運算的第一個數,檔案CompA.txt提供進行運算的運算子(只有“加法(+)”或者“減法(-)”),檔案CompB.txt提供參加運算的第二個數,每個數或運算子均佔一行,組合起來成為一個算式,遇到無法組成一個完整算式時即結束運算。這樣的算式有多個(數量不確定)。計算這些算式的結果並在螢幕上顯示。
  單擊下載程式執行時測試用的算式檔案Comp.txt、CompA.txt、CompB.txt並儲存到程式P324.C所在的資料夾且檔名保持不變。
程式設計可用素材:
printf("Line %03d:  %5d %c %-5d = %-6d\n");
  程式的執行效果應類似地如圖1所示。

Line 001:    123 + 556   = 679
Line 002:    300 - 215   = 85
Line 003:   1001 - 18976 = -17975
Line 004:   9123 + 5156  = 14279
圖1 程式執行效果示例
*/
#include <stdio.h>

int main(void)
{
    int a1, a2, n = 1;
    char ch;
    FILE *fp1, *fp2, *fp3;
    fp1 = fopen("Comp.txt", "r");
    fp2 = fopen("CompA.txt", "r");
    fp3 = fopen("CompB.txt", "r");

    // 賦值後再判斷,語句更簡單一些
    if (fp1 == NULL || fp2 == NULL || fp3 == NULL)
    {
        printf("error\n");
        return 0;
    }

    while (!feof(fp2))  // 運算完成,首先要有運算子
    {
        // 充分利用返回值判斷讀取是否成功,三個資料要同時都有,才可以完成運算
        if ((fscanf(fp1, "%d", &a1) == 1) && (fscanf(fp2, " %c", &ch) == 1) && (fscanf(fp3, "%d", &a2) == 1))
        {
            if (ch == '+')
            {
                printf("Line %03d:  %5d %c %-5d = %-6d\n", n, a1, ch, a2, a1 + a2);
            }
            else
            {
                printf("Line %03d:  %5d %c %-5d = %-6d\n", n, a1, ch, a2, a1 - a2);
            }
            n++;    // 計數器
        }
        else        // 如果讀取失敗【即兩個運算元和一個操作符,只要有一個未讀到資料,就不再處理】
        {
            break;
        } 
    }

    // 要記得關閉檔案
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    
    return 0;
}

P325

在這裡插入圖片描述

/* 
編寫一程式P325.C實現以下功能
  在文字檔案Comp.txt、CompA.txt、CompB.txt裡有需要計算結果的整數算式,
檔案Comp.txt提供參加運算的第一個數,
檔案CompA.txt提供進行運算的運算子(只有“加法(+)”或者“減法(-)”),
檔案CompB.txt提供參加運算的第二個數,每個數或運算子均佔一行,組合起來成為一個算式,遇到無法組成一個完整算式時即結束運算。
這樣的算式有多個(數量不確定)。計算這些算式的結果並將結果以文字檔案格式儲存到程式P325.C所在的資料夾中且檔名命名為CompC.txt。
  單擊下載程式執行時測試用的算式檔案Comp.txt、CompA.txt、CompB.txt並儲存到程式P325.C所在的資料夾且檔名保持不變。
程式設計可用素材:
fprintf(…"Line %03d:  %5d %c %-5d = %-6d\n");
  程式執行後生成的檔案CompC.txt的內容應類似地如圖1所示。

圖1 程式執行效果示例(生成的檔案CompC.txt之內容)
 */
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    int data1, data2, result;
    char ch;
    int i = 1;
    int r1, r2, r3; // 檔案讀取返回值

    FILE *fp1, *fp2, *fp3, *fp4;

    // 檔案正常開啟
    if ((fp1 = fopen("Comp.txt", "r"))==NULL)
    {
        printf("open file Comp.txt failure.\n");
        exit(0);
    }
    if ((fp2 = fopen("CompA.txt", "r"))==NULL)
    {
        printf("open file CompA.txt failure.\n");
        exit(0);
    }
    if ((fp3 = fopen("CompB.txt", "r"))==NULL)
    {
        printf("open file CompB.txt failure.\n");
        exit(0);
    }
    // 注意:這個檔案是寫資料
    if ((fp4 = fopen("CompC.txt", "w"))==NULL)
    {
        printf("open file CompC.txt failure.\n");
        exit(0);
    }

    while (!feof(fp2))   // 要有運算子號,才可以運算
    {
        r1 = fscanf(fp2, " %c", &ch);
        r2 = fscanf(fp1, "%d", &data1);
        r3 = fscanf(fp3, "%d", &data2);
        if ((r1 == 1) && (r2 == 1) && (r3 == 1))    //是否都成功讀取了資料
        {
            if ('+' == ch)
            {
                result = data1 + data2;
                fprintf(fp4, "Line %03d:  %5d %c %-5d = %-6d\n", i, data1, ch, data2, result);
            }
            else
            {
                result = data1 - data2;
                fprintf(fp4, "Line %03d:  %5d %c %-5d = %-6d\n", i, data1, ch, data2, result);
            }
            i++;    // 計數器
        }
        else
        {
            break;
        }
    }

    // 關閉檔案
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    fclose(fp4);

    return 0;
}

相關文章