版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第十二套3.在“產(chǎn)品銷售匯總表”中,分別計算各型號產(chǎn)品的一、二季度銷量、銷售額及合計數(shù),填入相應(yīng)列中。所有銷售額均設(shè)為數(shù)值型、小數(shù)位數(shù)0,使用千位分隔符,右對齊。步驟2:在C2單元格中插入公式“=SUMIF(一季度銷售情況表!$B$2:$B$44,B2,一季度銷售情況表!$D$2:$D$44)”,按Enter鍵,雙擊右下角的填充柄自動填充。第十三套2.利用“成績單”、“小分統(tǒng)計”和“分值表”工作表中的數(shù)據(jù),完成“按班級匯總”和“按學(xué)校匯總”工作表中相應(yīng)空白列的數(shù)值計算。具體提示如下:“考試學(xué)生數(shù)”列必須利用公式計算, “平均分”列由“成績單”工作表數(shù)據(jù)計算得出;“分值表”工作表中給出了本次考試
2、各題的類型及分值。(備注:本次考試一共50道小題,其中【1】至【40】為客觀題,【41】至【50】為主觀題);“小分統(tǒng)計”工作表中包含了各班級每一道小題的平均得分,通過其可計算出各班級的“客觀題平均分”和“主觀題平均分”。(備注:由于系統(tǒng)生成每題平均得分時已經(jīng)進行了四舍五入操作,因此通過其計算“客觀題平均分”和“主觀題平均分”之和時,可能與根據(jù)“成績單”工作表的計算結(jié)果存在一定誤差);利用公式計算“按學(xué)校匯總”工作表中的“客觀題平均分”和“主觀題平均分”,計算方法為:每個學(xué)校的所有班級相應(yīng)平均分乘以對應(yīng)班級人數(shù),相加后再除以該校的總考生數(shù);計算“按學(xué)校匯總”工作表中的每題得分率,即:每個學(xué)校所
3、有學(xué)生在該題上的得分之和除以該??偪忌鷶?shù),再除以該題的分值。所有工作表中“考試學(xué)生數(shù)”、“最高分”、“最低分”顯示為整數(shù);各類平均分顯示為數(shù)值格式,并保留2位小數(shù);各題得分率顯示為百分比數(shù)據(jù)格式,并保留2位小數(shù)。(2)【解題步驟】步驟1:切換至“按班級匯總”工作表中,選擇C2單元格,在該單元格中輸入“=COUNTIFS(成績單!$A$2:$A$950,按班級匯總!$A2,成績單!$B$2:$B$950,按班級匯總!$B2)”公式,按Enter鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。提示:多條件計數(shù)函數(shù)COUNTIFS(Criteria_range1,Criteria1,Criteria_ran
4、ge2,Criteria2)主要功能:統(tǒng)計指定單元格區(qū)域中符合多組條件的單元格的個數(shù)。參數(shù)說明:Criteria_range1必需的參數(shù)。第1組條件中指定的區(qū)域。Criteria1必需的參數(shù)。第1組條件中指定的條件,條件的形式可以為數(shù)字、表達式、單元格地址或文本。Criteria_Range2,Criteria2可選參數(shù)。第2組條件,還可以有其他多組條件。本題中公式表示統(tǒng)計同時滿足以下條件的單元格的個數(shù):成績單工作表A2:A950區(qū)域中等于按班級匯總工作表A2單元格內(nèi)容(即濱海市第一中學(xué)),并且成績單工作表B2:B950區(qū)域中等于按班級匯總工作表B2單元格內(nèi)容(即1班)。步驟2:在工作表中選擇
5、D2單元格,在該單元格中輸入公式“=MAX(成績單!$A$2:$A$950=按班級匯總!$A2)*(成績單!$B$2:$B$950=按班級匯總!$B2)*成績單!$D$2:$D$950)”,按Ctrl+Shift+Enter組合鍵完成輸入。提示:最大值函數(shù)MAX(number1,number2,)主要功能:返回一組值或指定區(qū)域中的最大值參數(shù)說明:參數(shù)至少有一個,且必須是數(shù)值,最多可以有255個。本題中:成績單!$A$2:$A$950=按班級匯總!$A2返回值為邏輯值(True或False),成績單!$B$2:$B$950=按班級匯總!$B2返回值也為邏輯值(True或False),將兩個表達式
6、進行乘運算時,邏輯值True轉(zhuǎn)換為1,邏輯值False轉(zhuǎn)換為0參加運算。也即,同時滿足兩個條件時,MAX中的求值區(qū)域才為非0數(shù),最終形成的表達式只有是MAX(1*1*成績單!$D$2:$D$950),才會統(tǒng)計這個區(qū)域的最大值。當(dāng)編輯完第一個公式后,此時注意,必須同時按下Ctrl+Shift+Enter組合鍵,才能顯示出統(tǒng)計結(jié)果,之后就可以使用填充柄進行公式填充。步驟3:選擇E2單元格,在該單元格中輸入公式“=MIN(IF(成績單!$A$2:$A$950=按班級匯總!$A2)*(成績單!$B$2:$B$950=按班級匯總!$B2),成績單!$D$2:$D$950)”,按Ctrl+Shift+En
7、ter組合鍵完成輸入。提示:最小值函數(shù)MIN(number1,number2,)主要功能:返回一組值或指定區(qū)域中的最小值參數(shù)說明:參數(shù)至少有一個,且必須是數(shù)值,最多可以有255個邏輯判斷函數(shù)IF(logical_test,value_if_true,value_if_false)主要功能:如果指定條件的計算結(jié)果為TRUE,IF函數(shù)將返回某個值;如果該條件的計算結(jié)果為FALSE,則返回另一個值。參數(shù)說明: logical_test必須的參數(shù),作為判斷條件的任意值或表達式 value_if_true可選的參數(shù)。Logical_test參數(shù)的計算結(jié)果為TRUE時所要返回的值 value_if_fal
8、se可選的參數(shù)。Logical_test參數(shù)的計算結(jié)果為FALSE時所要返回的值本題中:成績單!$A$2:$A$950=按班級匯總!$A2返回值為邏輯值(True或False),成績單!$B$2:$B$950=按班級匯總!$B2返回值也為邏輯值(True或False),將兩個表達式進行乘運算時,邏輯值True轉(zhuǎn)換為1,邏輯值False轉(zhuǎn)換為0參加運算。也即,同時滿足兩個條件時,IF函數(shù)中的條件表達式為TRUE,才能返回表達式“成績單!$D$2:$D$950”,此時使用MIN函數(shù)統(tǒng)計指定區(qū)域中的最小值步驟4:選擇F2單元格,在該單元格中輸入公式“=AVERAGEIFS(成績單!$D$2:$D$9
9、50,成績單!$A$2:$A$950,按班級匯總!$A2,成績單!$B$2:$B$950,按班級匯總!$B2)”,按Enter鍵完成輸入。提示:多條件平均值函數(shù)AVERAGEIFS(average_range,criteria_range1,criteria1,criteria_range2,criteria2,)主要功能:對指定區(qū)域中滿足多個條件的所有單元格中的數(shù)值求算數(shù)平均值。參數(shù)說明: average_range必需的參數(shù)。要計算平均值的實際單元格區(qū)域 criteria_range1,criteria_range2在其中計算關(guān)聯(lián)條件的區(qū)域 criteria1,criteria2求平均值的
10、條件 其中每個criteria_range的大小和形狀必須與average_range相同本題中公式表示對成績單D2:D950區(qū)域中符合以下條件的單元格的數(shù)值求平均值:成績單工作表A2:A950區(qū)域中等于按班級匯總工作表A2單元格內(nèi)容(即濱海市第一中學(xué)),并且成績單工作表B2:B950區(qū)域中等于按班級匯總工作表B2單元格內(nèi)容(即1班)。步驟5:選擇G2單元格,在該單元格中輸入公式“=SUM(小分統(tǒng)計!$C2:$AP2)”,按Enter鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。步驟6:選擇H2單元格,在該單元格中輸入公式“=SUM(小分統(tǒng)計!$AQ2:$AZ2)”,按Enter鍵完成輸入,雙擊右下
11、角的填充柄填充數(shù)據(jù)。步驟7:選擇C、D、E列,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇【設(shè)置單元格格式】選項,在彈出的對話框中選擇【分類】列表中選擇【數(shù)值】選項,將【小數(shù)位數(shù)】設(shè)置為0,設(shè)置完成后,單擊“確定”按鈕即可。按同樣的方式,將F、G、H列【小數(shù)位數(shù)】設(shè)置為2。步驟8:切換至“按學(xué)校匯總”工作表中,選擇B2單元格,在該單元格中輸入公式“=COUNTIF(成績單!$A$2:$A$950,按學(xué)校匯總!$A2)”,按Enter鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。提示:條件計數(shù)函數(shù)COUNTIF(range,criteria)主要功能:統(tǒng)計指定區(qū)域中滿足單個指定條件的單元格的個數(shù)參數(shù)說明: r
12、ange必需的參數(shù)。計數(shù)的單元格區(qū)域 criteria必需的參數(shù)。計數(shù)的條件,條件的形式可以為數(shù)字、表達式、單元格地址或文本本題中公式表示統(tǒng)計成績單工作表A2:A950區(qū)域中,等于A2單元格內(nèi)容(即濱海市第一中學(xué))的單元格的個數(shù)。步驟9:選擇C2單元格,在該單元格中輸入“=MAX(成績單!$A$2:$A$950=按學(xué)校匯總!$A2)*成績單!$D$2:$D$950)”,按Ctrl+Shift+Enter鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。在D2單元格中輸入“=MIN(IF(成績單!$A$2:$A$950=按學(xué)校匯總!$A2,成績單!$D$2:$D$950)”,按Ctrl+Shift+Ent
13、er鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。在E2單元格中輸入“=AVERAGEIFS(成績單!$D$2:$D$950,成績單!$A$2:$A$950,按學(xué)校匯總!$A2)”,按Enter鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。步驟10:在F2單元格中輸入“=SUM(按班級匯總!$A$2:$A$33=按學(xué)校匯總!$A2)*(按班級匯總!$C$2:$C$33)*(按班級匯總!$G$2:$G$33)/$B2”,按Ctrl+Shift+Enter鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。在G2單元格中輸入“=SUM(按班級匯總!$A$2:$A$33=按學(xué)校匯總!$A2)*(按班級匯總!$C$2:$C$
14、33)*(按班級匯總!$H$2:$H$33)/$B2”,按Ctrl+Shift+Enter鍵完成輸入,雙擊右下角的填充柄填充數(shù)據(jù)。提示:本題中按班級匯總!$A$2:$A$33=按學(xué)校匯總!$A2返回的值為邏輯值(TRUE和FALSE),參加運算時,TRUE轉(zhuǎn)換為1,F(xiàn)ALSE轉(zhuǎn)換為0。即統(tǒng)計指定學(xué)校的學(xué)生,使用SUM函數(shù)將數(shù)組按班級匯總!$C$2:$C$33與數(shù)組按班級匯總!$G$2:$G$33對應(yīng)位置的數(shù)據(jù)進行乘運算,然后求出乘積的和,最后將得到的總成績與學(xué)生人數(shù)相除,求得平均分。步驟11:在H2單元格中輸入“=SUM(小分統(tǒng)計!$A$2:$A$33=$A2)*小分統(tǒng)計!C$2:C$33*按
15、班級匯總!$C$2:$C$33)/$B2/分值表!B$3”,按Ctrl+Shift+Enter鍵完成輸入,拖動填充柄,橫向填充到BE2單元格,緊接著從BE2單元格,拖動填充句柄,縱向填充到BE5單元格。步驟12:選擇B、C、D列,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇【設(shè)置單元格格式】選項,在彈出的對話框中選擇【分類】列表中選擇【數(shù)值】選項,將【小數(shù)位數(shù)】設(shè)置為0,設(shè)置完成后,單擊“確定”按鈕。按同樣的方式,將E、F、G列【小數(shù)位數(shù)】設(shè)置為2。步驟13:選擇H列到BE列,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇【設(shè)置單元格格式】選項,在彈出的對話框中選擇【分類】列表中選擇【百分比】選項,將【小數(shù)位數(shù)
16、】設(shè)置為2,設(shè)置完成后,單擊“確定”按鈕即可。第14套第15套2.在“停車收費記錄”表中,涉及金額的單元格格式均設(shè)置為保留2位的數(shù)值類型。依據(jù)“收費標(biāo)準(zhǔn)”表,利用公式將收費標(biāo)準(zhǔn)對應(yīng)的金額填入“停車收費記錄”表中的“收費標(biāo)準(zhǔn)”列;利用出場日期、時間與進場日期、時間的關(guān)系,計算“停放時間”列,單元格格式為時間類型的“XX時XX分”。步驟4:計算停放時間,首先利用DATEDIF計算日期的差值,乘以24;再加上進場時間和出場時間的差值。即在J2單元格中輸入“=DATEDIF(F2,H2,”YD”)*24+(I2-G2)”,按Enter,并向下拖動將數(shù)據(jù)進行填充。說明:DATEDIF(start_dat
17、e,end_date,unit),返回兩個日期之間的年月日間隔數(shù)。Start_date為一個日期,它代表時間段內(nèi)的第一個日期或起始日期。參數(shù)End_date為一個日期,它代表時間段內(nèi)的最后一個日期或結(jié)束日期。參數(shù)Unit為所需信息的返回類型。當(dāng)單位代碼為”YD”時,計算結(jié)果是兩個日期間隔的天數(shù).忽略年數(shù)差。注:結(jié)束日期必須大于起始日期。3.依據(jù)停放時間和收費標(biāo)準(zhǔn),計算當(dāng)前收費金額并填入“收費金額”列;計算擬采用的收費政策的預(yù)計收費金額并填入“擬收費金額”列;計算擬調(diào)整后的收費與當(dāng)前收費之間的差值并填入“差值”列。(3)【解題步驟】考點提示:本題主要考核公式和函數(shù)的使用。步驟1:計算收費金額,在
18、K2單元格中輸入公式“=ROUNDUP(HOUR(J2)*60+MINUTE(J2)/15,0)*E2”,并向下自動填充單元格。步驟2:計算擬收費金額,在L2單元格中輸入公式“=INT(HOUR(J2)*60+MINUTE(J2)/15)*E2”,并向下自動填充單元格。步驟3:計算差值,在M2單元格中輸入公式“=K2-L2”,并向下自動填充單元格。說明:1.Roundup函數(shù)表示:向上舍入數(shù)字,跟四舍五入不一樣,不管舍去的首位數(shù)字是否大于4,都向前進1。2.Roundup函數(shù)的語法格式=Roundup(number,num_digits)Number表示:用來向上舍入的數(shù)字。Num_digit
19、s舍入后的數(shù)字的小數(shù)位數(shù)(即保留幾位小數(shù))。3.當(dāng)Roundup函數(shù)中參數(shù)num_digits大于0時,則表示向上舍入到指定的小數(shù)位(這里保留一位小數(shù))。第17套3.課時費統(tǒng)計表中的F至I列中的空白內(nèi)容必須采用公式的方式計算結(jié)果。根據(jù)教師基本信息工作表和課時費標(biāo)準(zhǔn)工作表計算職稱和課時標(biāo)準(zhǔn)列內(nèi)容,根據(jù)授課信息表和課程基本信息工作表計算學(xué)時數(shù)列內(nèi)容,最后完成課時費列的計算?!咎崾荆航ㄗh對授課信息表中的數(shù)據(jù)按姓名排序后增加學(xué)時數(shù)列,并通過VLOOKUP查詢課程基本信息表獲得相應(yīng)的值。】(3)【解題步驟】步驟1:選擇F3單元格,單擊【公式】|【函數(shù)庫】組中的“插入函數(shù)”按鈕,彈出“插入函數(shù)”對話框,在
20、“選擇函數(shù)”下拉列表中找到VLOOKUP函數(shù),單擊“確定”按鈕,彈出“函數(shù)參數(shù)”對話框。步驟2:在第1個參數(shù)框中用鼠標(biāo)選擇“E3”;第2個參數(shù)框中選擇“教師基本信息”工作表中的D3:E22區(qū)域;第3個參數(shù)框中輸入“2”;第4個參數(shù)框中輸入“FALSE”或者“0”;單擊“確定”按鈕即可。步驟3:本題也可直接在“課時費統(tǒng)計表”工作表的F3單元格中輸入公式“=VLOOKUP(E3,教師基本信息!$D$3:$E$22,2,FALSE)”,按Enter鍵,雙擊F3單元格右下角的填充柄完成職稱的自動填充。步驟4:同理,使用VLOOKUP函數(shù)計算“課時標(biāo)準(zhǔn)”。第1個參數(shù)框中用鼠標(biāo)選擇“G3”;第2個參數(shù)框中
21、選擇“課時費標(biāo)準(zhǔn)”工作表中的A3:B6區(qū)域;第3個參數(shù)框中輸入“2”;第4個參數(shù)框中輸入“FALSE”或者“0”;單擊“確定”按鈕即可。步驟5:本題也可直接在“課時費統(tǒng)計表”工作表的G3單元格中輸入公式“=VLOOKUP(F3,課時費標(biāo)準(zhǔn)!$A$3:$B$6,2,FALSE)”,按Enter鍵,雙擊G3單元格右下角的填充柄完成課時標(biāo)準(zhǔn)的自動填充。步驟6:根據(jù)題目提示,先在“授課信息表”中增加“學(xué)時數(shù)”列。在“授課信息表”的F2單元格輸入“學(xué)時數(shù)”,回車選擇“F3”,同理使用VLOOKUP函數(shù)計算“學(xué)時數(shù)”。第1個參數(shù)框中用鼠標(biāo)選擇“E3”;第2個參數(shù)框中選擇“課程基本信息”工作表中的B3:C1
22、6區(qū)域;第3個參數(shù)框中輸入“2”;第4個參數(shù)框中輸入“FALSE”或者“0”;單擊“確定”按鈕,雙擊F3單元格右下角的填充柄完成學(xué)時數(shù)的自動填充。步驟7:根據(jù)題目提示,再計算“課時費統(tǒng)計表”中的“學(xué)時數(shù)”列。切換到“課時費統(tǒng)計表”工作表,選擇H3單元格,單擊【公式】|【函數(shù)庫】組中的“插入函數(shù)”按鈕,彈出“插入函數(shù)”對話框,在“選擇函數(shù)”下拉列表中找到SUMIF函數(shù),單擊“確定”按鈕,彈出“函數(shù)參數(shù)”對話框。步驟8:在第1個參數(shù)框中用鼠標(biāo)選擇“授課信息表”的“D3:D72”數(shù)據(jù)區(qū)域;第2個參數(shù)框中輸入“E3”;第3個參數(shù)框中輸入選擇“授課信息表”的“F3:F72”數(shù)據(jù)區(qū)域;單擊“確定”按鈕,雙
23、擊H3單元格右下角的填充柄自動填充到最后一行。步驟9:在I3單元格中輸入公式“=G3*H3”完成課時費的計算。第18套2.輸入并填充公式:在余額列輸入計算公式,余額=上期余額+本期借方-本期貸方,以自動填充方式生成其他公式。 3.方向列中只能有借、貸、平三種選擇,首先用數(shù)據(jù)有效性控制該列的輸入范圍為借、貸、平三種中的一種,然后通過IF函數(shù)輸入方向列內(nèi)容,判斷條件如下所列: 余額大于0等于0小于0 方向借平貸第20套4.學(xué)號第4、5位代表學(xué)生所在的班級,例如:C120101代表12級1班。請通過函數(shù)提取每個學(xué)生所在的專業(yè)并按下列對應(yīng)關(guān)系填寫在班級列中: 學(xué)號的4、5位對應(yīng)班級 011班 022班
24、 033班第22套2.根據(jù)身份證號,請在員工檔案表工作表的出生日期列中,使用MID函數(shù)提取員工生日,單元格式類型為yyyy年m月d日。3.根據(jù)入職時間,請在員工檔案表工作表的工齡列中,使用TODAY函數(shù)和INT函數(shù)計算員工的工齡,工作滿一年才計入工齡。4.引用工齡工資工作表中的數(shù)據(jù)來計算員工檔案表工作表員工的工齡工資,在基礎(chǔ)工資列中,計算每個人的基礎(chǔ)工資。(基礎(chǔ)工資=基本工資+工齡工資)新1套(4)在“按月統(tǒng)計”工作表中,利用公式計算1月6月的銷售達標(biāo)率,即銷售額大于60000元的人數(shù)所占比例,并填寫在“銷售達標(biāo)率”行中。要求以百分比格式顯示計算數(shù)據(jù),并保留2位小數(shù)。(5)在“按月統(tǒng)計”工作表
25、中,分別通過公式計算各月排名第1、第2和第3的銷售業(yè)績,并填寫在“銷售第一名業(yè)績”、“銷售第二名業(yè)績”和“銷售第三名業(yè)績”所對應(yīng)的單元格中。要求使用人民幣會計專用數(shù)據(jù)格式,并保留2位小數(shù)。新2套(6)在“銷售記錄”工作表的F4:F891中,計算每筆訂單記錄的金額,并應(yīng)用貨幣格式,保留零位小數(shù),計算規(guī)則為:金額=價格數(shù)量(1-折扣百分比),折扣百分比由訂單中的訂貨數(shù)量和產(chǎn)品類型決定,可以在“折扣表”工作表中進行查詢,例如某個訂單中產(chǎn)品A的訂貨量為1510,則折扣百分比為2%(提示:為便于計算,可對“折扣表”工作表中表格的結(jié)構(gòu)進行調(diào)整)?!?D4*E4*(1-VLOOKUP(C4,折扣表!$B$9
26、:$F$11,IF(D41000,2,IF(D41500,3,IF(D42000,4,5)”,錯誤版本上圖新4套身份證號的倒數(shù)第2位用于判斷性別,奇數(shù)為男性,偶數(shù)為女性;工齡工資的計算方法:本公司工齡達到或超過30年的每滿一年每月增加50元、不足10年的每滿一年每月增加20元、工齡不滿1年的沒有工齡工資,其他為每滿一年每月增加30元。附錄資料:不需要的可以自行刪除C語言編譯器的設(shè)計與實現(xiàn) 我們設(shè)計的編譯程序涉及到編譯五個階段中的三個,即詞法分析器、語法分析器和中間代碼生成器。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表、狀態(tài)棧分析過程顯示及四元式序列程序,整個編譯程序分為三部分:(1
27、) 詞法分析部分(2) 語法分析處理及四元式生成部分 (3) 輸出顯示部分一詞法分析器設(shè)計 由于我們規(guī)定的程序語句中涉及單詞較少,故在詞法分析階段忽略了單詞輸入錯誤的檢查,而將編譯程序的重點放在中間代碼生成階段。詞法分析器的功能是輸入源程序,輸出單詞符號。我們規(guī)定輸出的單詞符號格式為如下的二元式: (單詞種別,單詞自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#def
28、ine e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#define EA 12#define EO 13#define plus 14#define times 15#define becomes 16#define op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 24函數(shù)說明 讀取函數(shù) readline( )、read
29、ch( )詞法分析包含從源文件讀取字符的操作,但頻繁的讀文件操作會影響程序執(zhí)行效率,故實際上是從源程序文件” source.dat ”中讀取一行到輸入緩沖區(qū),而詞法分析過程中每次讀取一個字符時則是通過執(zhí)行 readch( )從輸入緩沖區(qū)獲得的;若緩沖區(qū)已被讀空,則再執(zhí)行readline( )從 source.dat 中讀取下一行至輸入緩沖區(qū)。掃描函數(shù) scan( ) 掃描函數(shù) scan( )的功能是濾除多余空格并對主要單詞進行分析處理,將分析得到的二元式存入二元式結(jié)果緩沖區(qū)。變量處理 find( )變量處理中首先把以字母開頭的字母數(shù)字串存到 spelling 數(shù)組中,然后進行識別。識別過程是先
30、讓它與保留關(guān)鍵字表中的所有關(guān)鍵字進行匹配,若獲得成功則說明它為保留關(guān)鍵字,即將其內(nèi)碼值寫入二元式結(jié)果緩沖區(qū);否則說明其為變量,這時讓它與變量名表中的變量進行匹配( 變量匹配函數(shù) find( ) ),如果成功,則說明該變量已存在并在二元式結(jié)果緩沖區(qū)中標(biāo)記為此變量( 值填為該變量在變量名表中的位置),否則將該變量登記到變量名表中,再將這個新變量存入二元式緩存數(shù)組中。數(shù)字識別 number( ) 數(shù)字識別將識別出的數(shù)字填入二元式結(jié)果緩存數(shù)組。顯示函數(shù) 顯示函數(shù)的功能在屏幕上輸出詞法分析的結(jié)果( 即二元式序列程序),同時給出二元式個數(shù)及源程序行數(shù)統(tǒng)計。二語法分析器設(shè)計 語法分析器的核心是三張 SLR
31、分析表以及針對這三張 SLR 分析表進行語義加工的語義動作。編譯程序中語法分析處理及四元式生成部分主要是以二元式作為輸入,并通過 SLR 分析表對語法分析處理過程進行控制,使四元式翻譯的工作有條不紊的進行,同時識別語法分析中的語法錯誤。在處理 if 和 while 語句時,需要進行真值或假值的拉鏈和返填工作,以便轉(zhuǎn)移目標(biāo)的正確填入。1. 控制語句的 SLR 分析表1 設(shè)計過程如下: 將擴展文法GS S1)S if e S else S2)S while e S3)S L 4)S a;5)L S6)L SL用_CLOSURE方法構(gòu)造LR(0)項目規(guī)范簇為:I0: S SS if e S else
32、 SS while e S S L S a ;I1: S SI2: S ife S else SI3: S while e SI4: S L L S L SL S if e S else SS while e S S L S a ; I5: S a; I6: S if e S else S S if e S else SS while e S S L S a ; I7: S while e S S if e S else SS while e S S L S a ; I8: S L I9: L S L SL L SL L S S if e S else SS while e S S L S a
33、 ; I10: S a ; I11: S if e S else SI12: S while e S I13: S L I14: S SL I15: S if e S else S S if e S else SS while e S S L S a ; I16: S if e S else S 構(gòu)造文法G中非終結(jié)符的FOLLOW集如下:FOLLOW(S) = # S if e S else S得FOLLOW(S) = else S L 得FOLLOW(L) = 3) S S 得FOLLOW(S) = else , # L S 因為FIRST(S) = ,所以FOLLOW(S) = else
34、, #, 在()項目規(guī)范簇中,只有9有“移進歸約”沖突,L SL SL因為FOLLOW(L) FIRST(L) = 所以可以用方法解決以上沖突,最后我們得到的分析表如下:ACTIONGOTO ifElsewhilea;e#SL0S2S3S4S511ACC2S63S74S2S3S4S5985S106S2S3S4S5117S2S3S4S5128S139S2S3S4R5S591410R4R4R4111512R2R2R213R3R3R314R615S2S3S4S51616R1R1R1static int action2011=/* 0 */ 2, -1, 3, 4, -1, 5, -1, -1, -1
35、, 1, -1,/* 1 */ -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1,/* 2 */ -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1,/* 3 */ -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1,/* 4 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8,/* 5 */ -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1,/* 6 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -
36、1,/* 7 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1,/* 8 */ -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1,/* 9 */ 2, -1, 3, 4,105, 5, -1, -1, -1, 9, 14,/* 10*/ -1,104, -1, -1,104, -1, -1, -1,104, -1, -1,/* 11*/ -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 12*/ -1,102, -1, -1,102, -1, -1, -1,102, -1, -1,/
37、* 13*/ -1,103, -1, -1,103, -1, -1, -1,103, -1, -1,/* 14*/ -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1,/* 15*/ 2, -1, 3, 4, -1, 5, -1, -1, -1, 16, -1,/* 16*/ -1,101, -1, -1,101, -1, -1, -1,101, -1, -1;其中,前 9 列為 action 值,后 2 列為 goto 值;016 表示 17 個移進狀態(tài)( 即 Si);-1表示出錯;ACC 表示分析成功;而 100106 對應(yīng) 7 個歸約產(chǎn)生式:S SS i
38、f e S else SS while e SS L S a;L SL SL2. 算術(shù)表達式的 LR 分析表 2 設(shè)計如下:S EE E+EE E*EE (E)E i (過程略)ACTIONGOTOI+*()#E0S3S211S4S5ACC2S3S263R4R4R4R44S3S275S3S286S4S5S97R1R5R1R18R2R2R2R29R3R3R3R3static int action1107=/* 0 */ 3, -1, -1, 2, -1, -1, 1,/* 1 */ -1, 4, 5, -1, -1,ACC, -1,/* 2 */ 3, -1, -1, 2, -1, -1, 6,
39、/* 3 */ -1,104,104, -1,104,104, -1,/* 4 */ 3, -1, -1, 2, -1, -1, 7,/* 5 */ 3, -1, -1, 2, -1, -1, 8,/* 6 */ -1, 4, 5, -1, 9, -1, -1,/* 7 */ -1,101, 5, -1,101,101, -1,/* 8 */ -1,102,102, -1,102,102, -1,/* 9 */ -1,103,103, -1,103,103, -1;3.布爾表達式的 SLR 分析表3 設(shè)計如下:(過程略)S BB iB i rop iB ( B )B ! BA B &B ABO
40、 B |B OBACTIONGOTOiRop()!&|#BAO0S1S4S513781S2R1R1R1R12S33R2R2R2R24S1S4S511785S1S4S56786R4S9S10R47S1S4S514788S1S4S515789R5R5R510R7R7R711S12S9S1012R3R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8static int action21611=/* 0 */ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8,/* 1 */ 1, 2, -1,101, -1,101,101,101, -1, -1,
41、-1,/* 2 */ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 3 */ -1, -1, -1,102, -1,102,102,102, -1, -1, -1,/* 4 */ 1, -1, 4, -1, 5, -1, -1, -1, 11, 7, 8,/* 5 */ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8,/* 6 */ -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1,/* 7 */ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8,/* 8 */ 1
42、, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8,/* 9 */ 105, -1,105, -1,105, -1, -1, -1, -1, -1, -1,/*10 */ 107, -1,107, -1,107, -1, -1, -1, -1, -1, -1,/*11 */ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1,/*12 */ -1, -1, -1,103, -1,103,103,103, -1, -1, -1,/*13 */ -1, -1, -1, -1, -1, 9, 10,ACC, -1, -1, -1,/*14 */
43、-1, -1, -1,106, -1, 9, 10,106, -1, -1, -1,/*15 */ -1, -1, -1,108, -1, 9, 10,108, -1, -1, -1;LR 分析表控制語義加工的實現(xiàn):當(dāng)掃描 LR 分析表的當(dāng)前狀態(tài)為歸約狀態(tài)時,則在調(diào)用與該狀態(tài)對應(yīng)的產(chǎn)生式進行歸約的同時,調(diào)用相應(yīng)的語義子程序進行有關(guān)的翻譯工作?,F(xiàn)在對 LR 分析器的分析棧加以擴充,使得每個文法符號之后都跟著它的語義值。為了清晰起見,我們把這個棧的每一項看成由三部分組成:狀態(tài) state ,文法符號 syl 和語義值 val。編譯程序?qū)崿F(xiàn)算術(shù)表達式、布爾表達式及程序語句的語義加工時,都是按這種狀態(tài)
44、棧加工方式進行的。例如:( 5 + 3 ) * 6的分析過程序號STATEValsylinput10-#( 5 + 3 ) * 6 #202-#(5 + 3 ) * 6 #3023-#(5+ 3 ) * 6 #4026-5#(E+ 3 ) * 6 #50264-5-#(E+3 ) * 6 #602643-5-#(E+3 ) * 6 #702647-5-3#(E+E) * 6 #8026-8#(E) * 6 #90269-8-#(E)* 6 #1001-8#E* 6 #11015-8-#E* 6 #120153-8-#E*6#130158-8-6#E*E#1401-48#E#15ACC在分析過程
45、中,第(3)步操作后的狀態(tài)棧為 023,根據(jù)棧頂狀態(tài)“ 3”和現(xiàn)行輸入符號“ +”( input 欄字符串的第一個字符)查分析表 ACTION3,+=R4,即按第(4)個產(chǎn)生式 En 來進行歸約;由于產(chǎn)生式右部僅含一項,故去掉狀態(tài)棧棧頂“3”;此時 2 變?yōu)樾碌臈m敔顟B(tài),再查( 2,E)的下一狀態(tài) s:GOTO2,E=6,即將狀態(tài) 6 和文法符號 E 壓棧,最后得到第( 4)步的狀態(tài)。第( 7)步操作后也是如此,當(dāng)前狀態(tài)棧為 02647,根據(jù)棧頂狀態(tài) 7 和現(xiàn)行輸入符號“ )”查分析表 ACTION7,)=R1,即按第(1)個產(chǎn)生式 EE1+E2進行歸約;由于產(chǎn)生式右部有三項,故去掉狀態(tài)棧棧頂
46、的 647 三項;此時 2 變?yōu)樾碌臈m敔顟B(tài),再查( 2,E)的下一狀態(tài) s:GOTO2,E=6,即將狀態(tài) 6 和文法符號 E 壓棧,最后得到第(8)步的狀態(tài)。三中間代碼生成器設(shè)計:布爾表達式 布爾表達式在程序語言中有兩個基本作用:一是用作控制語句( 如 if -else 或 while語句)的條件式;二是用于邏輯演算,計算邏輯值。布爾表達式是由布爾算符( &、| 、?。┳饔糜诓紶栕兞浚?或常數(shù))或關(guān)系表達式而形成的。關(guān)系表達式的形式是 E1 rop E2,其中 rop 是關(guān)系符( 如或),E1和 E2是算術(shù)式。在這里,我們只考慮前面給定文法所產(chǎn)生的布爾表達式:BB &B | B | B |
47、! B | (B) | i rop i | i遵照我們的約定,布爾算符的優(yōu)先順序( 從高到低)為:!、&、|,并假定&和|都服從左結(jié)合規(guī)則。所有關(guān)系符的優(yōu)先級都是相同的,而且高于任何布爾算符,低于任何算術(shù)算符,關(guān)系算符不得結(jié)合。表達式的真、假出口的確定:考慮表達式 B1 | B2 ,若 B1為真,則立即知道 B 也為真;因此,B1的真出口也就是整個 B 的真出口。若 B1?為假,則 B2必須被計值,B2的第一個四元式就是 B1的假出口。當(dāng)然,B2的真、假出口也就是整個 B的真、假出口。類似的考慮適用于對 B1 & B2的翻譯,我們將 B1 | B2和 B1 & B2 的翻譯用下圖表示,在自下而
48、上的分析過程中,一個布爾式的真假出口往往不能在產(chǎn)生四元式的同時就填上。我們只好把這種未完成的四元式的地址( 編號)作為 B 的語義值暫存起來,待到整個表達式的四元式產(chǎn)生完畢之后再來回填這個未填入的轉(zhuǎn)移目標(biāo)。條件語句對條件語句 if e S1 else S2 中的布爾表達式 e,其作用僅在于控制對 S1和 S2的選擇。因此,作為轉(zhuǎn)移條件的布爾式e,我們可以賦予它兩種“ 出口”:一是“ 真”出T口,出向 S1;一是“ 假”出口,出向 S2。于是,e的代碼F條件語句可以翻譯成如圖的一般形式。非終結(jié)符 e 具有兩項語義值 e _TC 和e_FC,它們分別指出了尚待回填真、S2的代碼假出口的四元式串。e
49、 的“ 真”出口只有在往回掃描到if時才能知道,而它圖 3-2 條件語句的代碼結(jié)構(gòu) 的“ 假”出口則需到處理過 S1并且到達 else 才能明確。這就是說,必須把 e_FC 的值傳下去,以便到達相應(yīng)的 else時才進行回填。另外,當(dāng) S1語句執(zhí)行完時意味著整個 if-else 語句也已執(zhí)行完畢;因此,在 S1的編碼之后應(yīng)產(chǎn)生一條無條件轉(zhuǎn)移指令。這條轉(zhuǎn)移指令將導(dǎo)致程序控制離開整個 if-else 語句。但是,在完成 S2的翻譯之前,這條無條件轉(zhuǎn)移指令的轉(zhuǎn)移目標(biāo)是不知道的。甚至,在翻譯完 S2之后,這條轉(zhuǎn)移指令的轉(zhuǎn)移目標(biāo)仍無法確定。這種情形是由于語句的嵌套性所引起的。例如下面的語句:if e1 i
50、f e2 S1 else S2 else S3 在 S1的代碼之后的那條無條件轉(zhuǎn)移指令不僅應(yīng)跨越 S2而且應(yīng)跨越 S3。這也就是說,轉(zhuǎn)移目標(biāo)的確定和語句所處的環(huán)境密切相關(guān)。條件循環(huán)語句條件循環(huán)語句 while e S 通常被翻譯成圖的代碼結(jié)構(gòu)。布爾式 e 的“ 真”出口出向 S 代碼段的第一個四元式。緊接 S 代碼段之后應(yīng)產(chǎn)生一條轉(zhuǎn)向測試 e 的無條件轉(zhuǎn)移指令。e 的“ 假”出口將導(dǎo)致程序控制離開整個 while 語句。e 的“ 假”出口目標(biāo)即使在整個 while 語句翻譯完之后也未必明確。例如: if e1 while e2 S1 else S2這種情況仍是由于語句的嵌套性引起的。所以,我們
51、只好把它作為語句的語義值 SCHAIN 暫留下來,以便在處理外層語句時再伺機回填。語法翻譯實現(xiàn)方法 將上述語法翻譯付諸實現(xiàn)過程中,我們僅保留了算術(shù)表達式和布爾表達式翻譯的文法和語義動作;面對程序語句的翻譯,由于改造后含有較多的非終結(jié)符且語義動作又相對簡單,故仍恢復(fù)為改造之前的程序語句文法。由于總體上構(gòu)造一個 SLR 分析表來實現(xiàn)語法分析及語義加工將使得所構(gòu)造的 SLR 分析表過大,所以將其分為下面三部分處理:對算術(shù)表達式單獨處理,即為算術(shù)表達式構(gòu)造一個 SLR 分析表,并將賦值語句A=E 與算術(shù)表達式歸為一類處理,處理之后的賦值語句僅看作為程序語句文法中的一個終結(jié)符 a。對布爾表達式也單獨處理
52、,并為其構(gòu)造一個 SLR 分析表,經(jīng) SLR 分析表處理后的布爾表達式看作為程序語句文法中的一個終結(jié)符 e。程序語句文法此時變?yōu)椋篠 if e S else S | while e S | L | a;L SL | S此時為程序語句構(gòu)造相應(yīng)的 SLR 分析表就簡單多了。前面的程序語句文法中所添加的非終結(jié)符是為了能及時回填有關(guān)四元式轉(zhuǎn)移目標(biāo)而引入的,在取消了這些非終結(jié)符后又如何解決及時回填轉(zhuǎn)移目標(biāo)的問題呢?我們采取的解決方法是增加兩個數(shù)組 labelmark 和 labeltemp 來分別記錄語句嵌套中每一層布爾表達式( 如果有的話)e 的首地址以及每一層else( 如果有的話)之前的四元式地址( 即無條件轉(zhuǎn)出此層 if 語句的四元式)。也即,對程序語句的翻譯來說:在處理完布爾表達式 e 后,回填 if 或 while 語句的真值鏈;在歸約完每一個語句 S 之后檢查符號棧,看在 S 之前的文法符號是否 if 或 while,若是則回填假值鏈( 假值入口為語句 S 所對應(yīng)的四元式序列之后;對 if 語句,此時已在該序列之后加入了一條無條件轉(zhuǎn)移的四元式);在 if 語句中,else 前面要加入一個無條件轉(zhuǎn)移的四元式轉(zhuǎn)向 if 語句末尾;在 while語句尾要有一個無
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)員工借用設(shè)備使用期限合同3篇
- 2025年度定制家具行業(yè)競業(yè)禁止模板木方買賣合同3篇
- 2025年度農(nóng)村自建房合同協(xié)議書(含智能安防監(jiān)控)
- 養(yǎng)殖場土地租賃合同(二零二五年度)農(nóng)業(yè)科技創(chuàng)新3篇
- 二零二五年度個人施工安全責(zé)任協(xié)議書范本3篇
- 2025年度農(nóng)村自建房工程承包合同
- 2025年度全新官方版二零二五年度離婚協(xié)議書與房產(chǎn)分割執(zhí)行細則3篇
- 二零二五年度特色農(nóng)業(yè)農(nóng)田承包合作協(xié)議
- 2025年度出租車位充電樁安裝工程驗收及質(zhì)保合同
- 二零二五年度全新寫字樓轉(zhuǎn)租協(xié)議合同:商務(wù)樓租賃權(quán)轉(zhuǎn)讓專案2篇
- 《中國制造業(yè)的崛起》課件
- (正式版)HGT 20656-2024 化工供暖通風(fēng)與空氣調(diào)節(jié)詳細設(shè)計內(nèi)容和深度規(guī)定
- 護士年終總結(jié)個人個人
- 切爾諾貝利核電站事故工程倫理分析
- 單證管理崗工作總結(jié)與計劃
- 安全安全隱患整改通知單及回復(fù)
- 國有檢驗檢測機構(gòu)員工激勵模式探索
- 采購部年終總結(jié)計劃PPT模板
- CDI-EM60系列變頻調(diào)速器使用說明書
- 【匯總】高二政治選擇性必修三(統(tǒng)編版) 重點知識點匯總
- 材料表面與界面考試必備
評論
0/150
提交評論