在當前目錄中存在檔名為"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 ...