2015-02-09 75 views
0

我需要一些COBOL作業的幫助。我做了一些嘗試,他們似乎並沒有像我希望的那樣工作。順序文件輸出計算GPA

我需要製作一個程序,用一些學生信息讀取輸入文件,然後將其輸出到終端和輸出文件。

我還需要根據所獲得的小時數和質量點來計算GPA。

我目前在創建列標題方面存在問題,並且還增加了值以獲取獲取GPA的累積值以及其他一些內容。我有輸入文件和我附帶的代碼。

IDENTIFICATION DIVISION. 
PROGRAM-ID. TEST3. 
ENVIRONMENT DIVISION. 
INPUT-OUTPUT SECTION. 
FILE-CONTROL. 
    SELECT StudentFile ASSIGN TO "P2In.dat" 
      ORGANIZATION IS LINE SEQUENTIAL. 
    SELECT OutputFile ASSIGN TO "Report.dat" 
      ORGANIZATION IS LINE SEQUENTIAL. 


DATA DIVISION. 
FILE SECTION. 
FD StudentFile. 

*>Student details will only be printed once 
01 StudentDetails. 
    05 STUDENT-NAME   PIC X(16). 
    05 STUDENT-ID   PIC X(9). 

*>Semester info that will be on one line and not repeated 
01 SemesterDetails. 
    05 SEMESTER    PIC X(9). 

*> Details in the class that need to be seperate 
01 ClassDetails. 
    05 CLASS-NAME   PIC X(32). 
    05 GRADE    PIC X(2). 
    05 HOURS    PIC X(4). 
    05 POINTS    PIC X(2). 

*>values that need to be calculated 
01 CalculatedValues. 
    05 CUMULATIVE-GPA-IN PIC 99v99 VALUE ZERO. 
    05 CUMULATIVE-QP-IN  PIC 99v99 VALUE ZERO. 
    05 CUMULATIVE-HOURS-IN PIC 99v99 VALUE ZERO. 

FD OutputFile. 
01 PrintLine     PIC X(70). 

WORKING-STORAGE SECTION. 

01 SWITCHES. 
    05 EOF-SWITCH   PIC X VALUE "N". 
01 COUNTERS. 
    05 REC-COUNTER   PIC 9(3) VALUE 0. 
01 CUMULATIVE. 
    05 CUMULATIVE-QP  PIC ZZ.99. 

PROCEDURE DIVISION. 
*>main paragraph, everything starts here 
Main. 
    PERFORM Begin. 
    PERFORM ProcessData. 
    PERFORM PrintLines 
      UNTIL EOF-SWITCH = "Y". 

*>opening read 
Begin. 
    OPEN INPUT StudentFile 
    OPEN OUTPUT OutputFile 

    READ StudentFile 
      AT END 
        MOVE "Y" TO EOF-SWITCH 
      NOT AT END 
        COMPUTE REC-COUNTER = REC-COUNTER + 1 
    END-READ. 

ProcessData. 
    READ StudentFile 
    AT END 
      MOVE "Y" TO EOF-SWITCH 
    NOT AT END 
      IF GRADE = 'A' 
        COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 4 
      ELSE 
      IF GRADE = 'B' 
COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 3 
      ELSE 
      IF GRADE = 'C' 
        COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 2 
      ELSE 
      IF GRADE = 'D' 
        COMPUTE CUMULATIVE-QP = CUMULATIVE-QP + 1 
      END-IF. 


*>printing out our lines to terminal 
PrintLines. 

    READ StudentFile 
    AT END 
      MOVE "Y" TO EOF-SWITCH 

    NOT AT END 
      DISPLAY CUMULATIVE-QP 
    END-READ. 

和輸入文件看起來像這樣

TERRY ETHELBERT W1234567 FALL2014 CMPS161 ALGORITHM DSGN/IMPLMNT A 3.00 12.00 
TERRY ETHELBERT W1234567 FALL2014 CMPS280 ALGORITHM DSGN/IMPLMNTII B 3.00 9.00 
TERRY ETHELBERT W1234567 FALL2014 CMPS431 OPERATING SYSTEMS   C 3.00 6.00 
TERRY ETHELBERT W1234567 FALL2014 ENG322 TECHNICAL WRITING   A 3.00 12.00 
TERRY ETHELBERT W1234567 SPNG2015 MATH380 STATISTICS    B 3.00 9.00 
TERRY ETHELBERT W1234567 SPNG2015 HIST202 HISTORY     B 3.00 9.00 
TERRY ETHELBERT W1234567 SPNG2015 BIOL152 GENERAL BIOLOGY   A 3.00 12.00 
TERRY ETHELBERT W1234567 SPNG2015 MATH200 CALCULUS I    C 5.00 10.00  

一開始會是不錯的地方。

回答

1

第一個問題是讓您的輸入記錄正確。所述FD必須行佈局相匹配,所以它應該是類似

01 StudentDetails. 
    05 STUDENT-NAME   PIC X(16). 
    05 STUDENT-ID   PIC X(9). 
*> Details in the class that need to be seperate 
*01 ClassDetails. 
    05 CLASS-NAME   PIC X(32). 
    05 GRADE    PIC X(1). 
    05 FILLER    PIC X(1). 
    05 HOURS. 
     07 HOURS-9   PIC 9.99. 
    05 FILLER    PIC X(2). 
    05 POINTS. 
     07 POINTS-X   PIC X(1) OCCURS 5. 
    05 POINTS-9-99 REDEFINES POINTS. 
     07 POINTS-9-99  PIC 9.99. 
    05 POINTS-99-99 REDEFINES POINTS. 
     07 POINTS-99-99  PIC 99.99. 

注意GRADE是X(1),後面跟着一個FILLER也X(1)來表示下面的grade-的空間信。 HOURS隱含地是X(4); HOURS-9允許該字段被讀作9.99

再就是2位 - 另一種填料

最後,還有點。這是一個包含2個佈局的5個字符的字段。我們通過查看POINTS-X(2)確定要使用哪種佈局(POINTS-9-99或POINTS-99-99) - 點意味着使用POINTS-9-99,否則使用POINTS-99-99。

我不知道Semesterdetails是什麼。

您的計算值應該在工作存儲;在FD中不能有VALUE子句。

接下來,你應該考慮你的過程。想想Michael Jackson。認真。哦 - 不是歌手,計算機科學家。

你的過程:

開始用含SPACES一個CURRENT-STUDENT

閱讀每條記錄。如果學生姓名不等於CURRENT-STUDENT(和AT END),那麼(生成一個報告行,將您的累加器歸零並將STUDENT-NAME存儲到CURRENT-STUDENT中)並使用當前記錄中的字段累積所需的數據。

請注意,生成您的報告行只是將各種累積字段構建到輸出記錄中並執行一些數學體操來計算平均值。當然,如果當前學生包含空間,請不要打擾。

因此,要領是

READ studentfile 
    at end perform write-report-line 
    not at end 
     if student-name is not equal to current-student 
      perform write-report-line 
     end-if 
     perform accumulate-data. 

write-report-line

if current-student is not equal to spaces 
    calculate and move name, average, etc. to output-record 
    and write it 
end-if 
move student-name to current-student 
move zero to rec-counter etc, etc. 
+0

感謝您的幫助!這肯定會幫助我在這方面取得更多進展。 – 2015-02-10 06:45:42

0

脫線作爲已經指出的那樣,你需要得到你的記錄清晰筆直。當您將每個邏輯塊定義爲單獨的01級別時,您定義了單獨的記錄。這與您的數據不符(目前我們認爲這是正確的)。目前還不清楚POINTS是什麼,但您的定義與數據不符。

01 RecordDetails. 
    03 StudentDetails. 
    05 STUDENT-NAME   PIC X(16). 
    05 STUDENT-ID   PIC X(9). 
    03 SemesterDetails. 
    05 SEMESTER    PIC X(9). 
    03 ClassDetails. 
    05 CLASS-NAME   PIC X(32). 
    05 GRADE    PIC X(2). 
    05 HOURS    PIC X(4). 
    05 POINTS    PIC X(2). 

這點你已經定義從屬於FD,所以它作爲您的文件中的記錄:

01 CalculatedValues. 
    05 CUMULATIVE-GPA-IN PIC 99v99 VALUE ZERO. 
    05 CUMULATIVE-QP-IN  PIC 99v99 VALUE ZERO. 
    05 CUMULATIVE-HOURS-IN PIC 99v99 VALUE ZERO. 

這可能不是你想要的。

查看文檔並瞭解在SELECT上使用FILE STATUS可以獲得什麼。每個IO都應該有它(每個文件分開)FILE STATUS字段選中。然後,您可以使用FILE STATUS字段(通過一個值爲「10」的88級)來檢查文件結束,從而減少READ ... AT END ... NOT AT END的曲折用法。 ..

88's對你的成績好,而不是文字。請注意,如果添加「4」,最好添加一個VALUE爲4的有名字段,以便讀者知道要添加的內容(4的含義)。

除非你有一個複雜的計算,你可能想要ADD 1 TO field-name優於COMPUTE field-name = field-name + 1

如果你有你的成績測試,你會發現EVALUATE比嵌套或順序IF更清晰。

您還沒有任何輸出,文件或屏幕。看看這裏和其他地方的例子,看看這是怎麼回事。如果您遇到問題,最好問一個新問題,否則答案會變得太複雜。一心一意。

+0

你說的沒錯,我需要看看更多的例子和文檔,然後再跳進這個。我認爲這從一開始就讓我困惑,將來會做。感謝您的幫助! – 2015-02-10 06:46:27