已知一个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(“file.txt”,“r”);//fp即为文件指针,"file.txt"为待打开的文件名,此时应与该程序在一个目录下,"r"为以只读方式打开ASCII码文件。
2.int ch=fgetc(fp);//从fp指向的文件中读取一个字节(字符),存入变量ch内。
3.fclose(fp);//关闭fp指向的文件。
注:第一题,情况比较多所以也没有坑。
#include<stdio.h>
#include<string.h>
#define MAXLINE 1000
#define NUM 26
typedef struct chars//四种字符
{
int capital;//大写字母
int lower;//小写字母
int number;//数字
int other;//其他
int cap[NUM];//大写字母
int low[NUM];//小写字母
}chars;
typedef struct line
{
int numline;//行数量
int maxline;//行最大长度
int mineline;//行最小长度
}line;
void statis(char ch, chars* p, line* q)//统计各种数量函数
{
if ('A' <= ch && ch <= 'Z')
{
p->capital++;
p->cap[ch - 'A']++;
}
else if ('a' <= ch && ch <= 'z')
{
p->lower++;
p->low[ch - 'a']++;
}
else if ('0' <= ch && ch <= '9')
p->number++;
else p->other++;
if (ch == '\n')
{
if ((p->capital + p->lower + p->number + p->other) - q->numline > q->maxline)
q->maxline = (p->capital + p->lower + p->number + p->other) - q->numline;
if ((p->capital + p->lower + p->number + p->other) - q->numline < q->mineline)
q->mineline = (p->capital + p->lower + p->number + p->other) - q->numline;
q->numline = (p->capital + p->lower + p->number + p->other);
}
}
//void ststis(char ch, chars* p, line* q);//统计各种数量函数
int main()
{
int ch, i = 0, count = 0;
FILE* fptr;
chars fourchar;
fourchar.capital = 0;
fourchar.lower = 0;
fourchar.number = 0;
fourchar.other = 0;
line lineinfo;
lineinfo.maxline = 0;
lineinfo.mineline = 99999;
lineinfo.numline = 0;
for (i = 0; i < NUM; i++)
{
fourchar.cap[i] = 0;
fourchar.low[i] = 0;
}
if ((fptr = fopen("dict.dic", "r")) == NULL)
printf("Open dict.dic error!\n");
else
{
ch = fgetc(fptr);
while (!feof(fptr))
{
statis(ch, &fourchar, &lineinfo);
if (ch == '\n')
count++;
ch = fgetc(fptr);
}
}
lineinfo.maxline--;
lineinfo.mineline--;
lineinfo.numline = count;
int a = 0;
scanf("%d", &a);
if (a == 1)
{
printf("Task1:\n");
printf("capital: %d\n", fourchar.capital);
printf("lowercase: %d\n", fourchar.lower);
printf("digit: %d\n", fourchar.number);
printf("others: %d\n", fourchar.other);
}
else if (a == 2)
{
printf("Task2:\n");
printf("line: %d\n", lineinfo.numline);
printf("%d characters in max line.\n", lineinfo.maxline);
printf("%d characters in min line.\n", lineinfo.mineline);
}
else
{
printf("Task3:\n");
printf("CAPITAL:\n");
char c = 'A';
for (count = 0; count < NUM; count++)
{
printf("%c:%d\n", c + count, fourchar.cap[count]);
}
c = 'a';
printf("LOWERCASE:\n");
for (count = 0; count < NUM; count++)
{
printf("%c:%d\n", c + count, fourchar.low[count]);
}
}
return 0;
}