实验12_1_初识ASCII码文件
实验12_1_初识ASCII码⽂件
题⽬描述
已知⼀个ASCII码⽂件,⽂件名为dict.dic,该⽂件中只包含ASCII码中的字符,即可对应整数0—127。我们将ASCII码中的字符分为4类,第⼀类为⼤写字母“A—Z”、第⼆类为⼩写字母“a—z”、第三类为数字字符“0—9”、第四类为其他字符“!@#$%^&*” 等等(不属于前三类的字符即为第四类)。
要求:
1.统计出这四类字符在该⽂件中的数量。
2.统计出该⽂件的⾏数、⾏最⼤长度、⾏最⼩长度。这⾥要注意,虽然⽂件的换⾏符确实为⼀个字符,ASCII码为10,但在统计⾏长度时,⽂件中的换⾏符并不统计在内。
3.输出具体的⼤⼩写字母的统计信息,每⾏⼀个字母。
4.处理完成后,关闭⽂件。
内容提⽰:在本题对⽂件的操作内容中,会⽤到三个新的C语⾔⽂件操作函数,⼀种新的打开⽂件的⽅式,如下:
1.FILE *fp=fopen(“”,“r”);//fp即为⽂件指针,""为待打开的⽂件名,此时应与该程序在⼀个⽬录下,"r"为以只读⽅式打开ASCII码⽂件。
2.int ch=fgetc(fp);//从fp指向的⽂件中读取⼀个字节(字符),存⼊变量ch内。
3.fclose(fp);//关闭fp指向的⽂件。
输⼊
只可能是1,2,3三个整数之⼀,其输出分别对应输出中的Task1,Task2,Task3。
输出
如果dict.dic⽂件内容如下: (⽂件每⾏都有换⾏符,且前边⽆空格)
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
~!@#$%^&*()_+`1234567890- =][’;/.,<>?":{}|
则三个任务的输出分别如下: (注意:Task1、2、3等也需要输出)
Task1:
capital: 26
lowercase: 26
digit: 10
others: 36
Task2:
line: 3
43 characters in max line.
26 characters in min line.
Task3: CAPITAL:
A:1
B:1
C:1
D:1
E:1
F:1
G:1
H:1
I:1
J:1
K:1关于劳动的优美句子
L:1
M:1
N:1
O:1
P:1
Q:1
R:1
S:1
T:1
U:1
V:1
W:1
后会无期 徐良
X:1
Y:1
Z:1 LOWERCASE: a:1
b:1
c:1
d:1
e:1
f:1
反犬
g:1
h:1
i:1
j:1
k:1
l:1
m:1
n:1
o:1
p:1
q:1
r:1
s:1
t:1
u:1
v:1
w:1
x:1
y:1
z:1
源代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int count;
struct node * nextPtr;
}LISTNODE,* LISTNODEPTR;
void createListHead(LISTNODEPTR *,LISTNODEPTR *);
void insertEnd(int,LISTNODEPTR *);
void countPlus(int,LISTNODEPTR);
void printList(LISTNODEPTR,int);
void destroyList(LISTNODEPTR headPtr);
int main(){
FILE * fp =fopen("dict.dic","r");
LISTNODEPTR capitalHeadPtr,capitalLastPtr,lowercaseHeadPtr,lowercaseLastPtr;
createListHead(&capitalHeadPtr,&capitalLastPtr);
createListHead(&lowercaseHeadPtr,&lowercaseLastPtr);
int letter =26;
while(letter--){
insertEnd(0,&capitalLastPtr);
insertEnd(0,&lowercaseLastPtr);
}
int mode;
scanf("%d",&mode);
int ch =fgetc(fp);
int capitalCount =0,lowercaseCount =0,digitCount =0,othersCount =0,lineCount =0,lineMax,lineMin,flag =0,temp; while(ch !=EOF){
if(ch !='\n'){
lineCount++;
if(ch >='A'&& ch <='Z'){
capitalCount++;
countPlus(ch-'A'+1,capitalHeadPtr);
}
else if(ch >='a'&& ch <='z'){
lowercaseCount++;
countPlus(ch-'a'+1,lowercaseHeadPtr);
}
else if(ch >='0'&& ch <='9') digitCount++;
else othersCount++;
}
else{
娄艺潇整容flag++;
othersCount++;
if(flag ==1){
lineMax = lineCount;
lineMin = lineCount;
}
else if(lineCount > lineMax) lineMax = lineCount;
else if(lineCount < lineMin) lineMin = lineCount;
lineCount =0;
}
temp = ch;
ch =fgetc(fp);
}
if(temp !='\n'){
flag++;
othersCount++;
王者荣耀娜可露露if(flag ==1){
lineMax = lineCount;
lineMin = lineCount;
}
else if(lineCount > lineMax) lineMax = lineCount;
else if(lineCount < lineMin) lineMin = lineCount;
lineCount =0;
lineCount =0;
ch =fgetc(fp);
}
switch(mode)
{
case1:
printf("Task1:\ncapital: %d\nlowercase: %d\ndigit: %d\nothers: %d\n",capitalCount,lowercaseCount,digitCount,othersCount);
break;
case2:
printf("Task2:\nline: %d\n%d characters in max line.\n%d characters in min line.",flag,lineMax,lineMin);
break;
case3:
printf("Task3:\nCAPITAL:\n");
printList(capitalHeadPtr,1);
printf("LOWERCASE:\n");
printList(lowercaseHeadPtr,0);
break;
default:
printf("??");
break;
}
destroyList(capitalHeadPtr);
destroyList(lowercaseHeadPtr);
fclose(fp);
return0;
}
void createListHead(LISTNODEPTR * headPtrPtr,LISTNODEPTR * lastPtrPtr){
(*headPtrPtr)=malloc(sizeof(LISTNODE));
if((*headPtrPtr)!=NULL){
(*headPtrPtr)->nextPtr =NULL;
(*lastPtrPtr)=(*headPtrPtr);
}
else{
printf("Error! -101");
}
}
void insertEnd(int data,LISTNODEPTR * lastPtrPtr){
LISTNODEPTR newPtr =malloc(sizeof(LISTNODE));
if(newPtr !=NULL){
newPtr->count = data;
newPtr->nextPtr =NULL;
(*lastPtrPtr)->nextPtr = newPtr;
(*lastPtrPtr)= newPtr;
}
else{
printf("Error! -102");
}
}
void countPlus(int num,LISTNODEPTR headPtr){
while(num--){
headPtr = headPtr->nextPtr;
}
(headPtr->count)++;
}
void printList(LISTNODEPTR headPtr,int mode){
int num =0;
while(headPtr->nextPtr !=NULL)
{
headPtr = headPtr->nextPtr;
if(mode){
printf("%c:%d\n",'A'+num,headPtr->count);
}
else{
printf("%c:%d\n",'a'+num,headPtr->count);
diy手工制作发夹}
num++;
}
}
void destroyList(LISTNODEPTR headPtr){
LISTNODEPTR tempPtr =NULL;
while(headPtr !=NULL){
tempPtr = headPtr;
headPtr = headPtr->nextPtr;
free(tempPtr);
}
}
整体思路
其实挺⽆脑的,题⽬让你⼲啥你就⼲啥的类型。。。存放⼤⼩写数据⽤的链表,⽤数组貌似会更简单。。。注意事项
最后⼀⾏只有⽂件结束符(EOF)时不能把它看作⼀⾏!!要特殊处理

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。