SCAU 高程綜合實驗 檔案操作與字元處理

2021-10-13 01:47:52 字數 3976 閱讀 2093

在當前目錄中存在檔名為"case1.in"(其中case後為數字1,不是字母l,寫錯提交後會判錯)的文字檔案,

其內容為一篇英文文章(以eof作為結束標誌)。現要求讀取該文字檔案內容,統計文章中每個單詞出現的次數,

並輸出出現次數最多的前5個單詞及其出現次數(按出現次數由多到少的順序輸出,次數相同時按字典順序輸出,

不足5個單詞時,按序輸出全部單詞)。程式中注意如下細節:

(1) 空格、標點符號與回車符起到分隔單詞的作用。

(2) 文章一行的末尾可能有連字元,出現連字元時,該行最末的字串與下行最先出現的字串構乙個單詞;

(3) 名詞縮寫算乙個單詞;

(4) 數字不算單詞;

(5) 單詞不區分大小寫;

(6) 輸出時單詞全使用小寫;

#include 「stdio.h」

#include 「math.h」

#include 「string.h」

#include 「stdlib.h」

main()

輸入格式

檔案case1.in中一篇英文文章,包含多段文字,單詞數不超過10000,每個單詞不超過20個字元

輸出格式

按題意輸出答案

輸入樣例

(如case1.in內容如下)

i am a student. my school is scau. it is a beau-

tiful university. i like it.

輸出樣例

a 2i 2

is 2

it 2

am 1

解題思路分析:

按照解題順序,分析一下幾個重要的點:

第乙個考點是檔案操作,檔案的開啟關閉和讀寫。題目中說掃瞄單詞,又由於有字串的特殊要求,所以使用fscanf有點小困難,還是使用fgetc逐字掃瞄、判斷。

第二個考點是單詞的判斷,也是這道題的核心,這個和前面oj上一題對單詞的判斷讀寫幾乎相同,只是多了個連字元的問題。當掃瞄到有單詞結束的符號(空格、標點等),打上標記,有連字元+換行的話,另作標記。

第三個考點是字串的存放以及字串的排序,當然其中也不可避免的有string庫中函式的運用。由於掃瞄完單詞後便存入陣列,自然要用到字串陣列,其中也變相的考察了學生位址(指標)的概念。排序的話自然是字典序,由於能力有限,使用冒泡+strcpy進行排序。

下面貼一下我的**(含詳註)。

#

include

"stdio.h"

#include

"math.h"

#include

"string.h"

#include

"stdlib.h"

char sto[

10005][

25];//字串陣列,無重複

int num=0;

//字串陣列下標

int count[

10005];

//每個單詞出現的次數

intisalpha

(char ch)

//判斷是否為字母(函式庫裡竟然沒有isalpha)

intrepeat

(char

*s)//判斷單詞是否重複

//查到重複的單詞,則返回單詞第一次出現的下標

}return0;

//沒查到,則返回0

}main()

while

((ch=

fgetc

(fp))!=

eof)

//由於有連字元,用fscanf有點困難,所以開始逐字掃瞄操作,

//新單詞的情況,更新連字元、回車、單詞結束的標記,建立新一行陣列記錄下乙個單詞

elseif(

isalpha

(ch)

&&endflag==0&&

!lianflag&&

!enter)

//同乙個單詞的情況,即單詞續寫

else

if(ch==

' '||

(lianflag==

0&&ch==

'\n')||

((ch!=

'-')&&(

(ch>=

32&&ch<=47)

||(ch>=

49&&ch<=64)

||(ch>=

91&&ch<=96)

||(ch>=

123&&ch<=

126)))

)//單詞結束,檢索到符號、換行,就換單詞

}elseif(

isalpha

(ch)

&&lianflag&&

!enter)

//有連字元但無回車的特殊情況,算新單詞的出現,也標誌著連字元前乙個單詞的結束,對前乙個單詞進行查重計數,然後進行新單詞建立的操作

enter=

0;endflag=

0;lianflag=

0;j=

0;num++

;sto[num]

[j++

]=ch;

}else

if(ch==

'-'&&endflag==0)

//檢索到連字元標記一下

else

if(ch==

'\n'

)//檢索到換行標記一下

else

if(lianflag&&

isalpha

(ch)

&&!endflag&&enter)

//有連字元+回車的情況,是原來的單詞,進行單詞的續寫

else

}//其餘情況(包括數字)算作無單詞,進行標記的清除

}fclose

(fp)

;//檔案掃瞄結束,關閉檔案

char t[25]

;//下面將用到冒泡,建立第三方變數

int t2=0;

//同理,計數器也要用到冒泡

for(i=

0;i1;i++

)//將字串陣列按照字典序排序,使用氣泡排序

for(j=

0;j1-i;j++)if

(strcmp

(sto[j]

,sto[j+1]

)>0)

int p=0;

//掃瞄次數前五的單詞,如果不足五個就直接return 0

int max1=

0,max2=

0,max3=

0,max4=

0,max5=0;

//由於只有五個,就不對次數進行排序了,直接比較依次求最多次數就好,比完把最多的次數清零

for(i=

0;i<=num;i++)if

(max1) count[p]=0

;printf

("%s %d\n"

,sto[p]

,max1)

;for

(i=0

;i<=num;i++)if

(max2(max2==0)

return0;

else

for(i=

0;i<=num;i++)if

(max3(max3==0)

return0;

else

for(i=

0;i<=num;i++)if

(max4(max4==0)

return0;

else

for(i=

0;i<=num;i++)if

(max5(max5==0)

return0;

else

return0;

}

總結與心得:

綜合性實驗主要考查本學期c語言所學語法的綜合運用,靈活多變,思維量不大,實驗過程中細節和注意點較多。

python檔案操作與檔案的綜合應用

在python,使用open函式,可以開啟乙個已經存在的檔案,或者建立乙個新檔案 open 檔名,訪問模式 示例如下 f open test.txt w 說明 訪問模式說明r 以唯讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。w開啟乙個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該...

Linux作業系統綜合實驗

管理員需每天做一定的重複工作,請按照下列要求編制乙個解決方案,並程式設計實現該方案。1 在下午6 30刪除 home stu abc目錄下的全部子目錄和全部檔案 2 從早8 00 下午6 00每小時把 home stu xyz目錄下x1檔案的全部資料加入到 home stu backup目錄下的ba...

SCAU高階語言程式設計 實驗3 基本輸入與輸出

scau高階語言程式設計 實驗3 基本輸入與輸出 一 堂上限時習題 1.字元的輸入與輸出 版本1 includeint main 版本2 includeint main 2.計算加法 includeint main 可參考書本p48 3.求圓面積 include define pi 3.14159 ...