问题 A 实验12_1_初识ASCII码文件
题目描述
已知一个ASCII码文件,文件名为dict.dic,该文件中只包含ASCII码中的字符,即可对应整数0—127。我们将ASCII码中的字符分为4类,第一类为大写字母“A—Z”、第二类为小写字母“a—z”、第三类为数字字符“0—9”、第四类为其他字符“!@#KaTeX parse error: Expected 'EOF', got '#' at position 554: …TUVWXYZ ~!@#̲%^&*()_+`1234567890- =][’;/.,<>?":{}|
则三个任务的输出分别如下: (注意:Task1、2、3等也需要输出)
Task1:
capital: 26
lowercase: 26
digit: 10
others: 35
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
样例输入 Copy
1
样例输出 Copy
Task1:
capital: 26
lowercase: 26
digit: 10
others: 36
/* for ASCII
@author: CangCheng
@date: 4/4/2021
*/
#include<stdio.h>
void task1(FILE *fp);
void printTask1(FILE *fp, int capital, int lowercase, int digit, int others);
void task2(FILE *fp);
void printTask2(int line, int max, int min);
void task3(FILE *fp);
void printTask3(int eachCapitalNum[], int eachLowercaseNum[]);
int main() {
FILE *fp = fopen("dict.dic", "r");
int n;
scanf("%d", &n);
if (n == 1) {
task1(fp);
} else if (n == 2) {
task2(fp);
} else if (n == 3) {
task3(fp);
}
fclose(fp);
return 0;
}
//任务一
void task1(FILE *fp) {
rewind(fp);
int ch = fgetc(fp);
int capital = 0, lowercase = 0, digit = 0, others = 0;
while (!feof(fp)) {
if (ch >= 'A' && ch <= 'Z') {
capital++;
ch = fgetc(fp);
} else if (ch >= 'a' && ch <= 'z') {
lowercase++;
ch = fgetc(fp);
} else if (ch >= '0' && ch <= '9') {
digit++;
ch = fgetc(fp);
} else {
others++;
ch = fgetc(fp);
}
}
printTask1(fp, capital, lowercase, digit, others);
}
void printTask1(FILE *fp, int capital, int lowercase, int digit, int others) {
printf("Task1:\n");
printf("capital: %d\n"
"lowercase: %d\n"
"digit: %d\n"
"others: %d\n", capital, lowercase, digit, others);
}
//任务二
void task2(FILE *fp) {
rewind(fp);
int ch = fgetc(fp);
int line = 0, c, max = 0, min, thisLineNumber = 0;
if (ch == 10) {
min = 0;
c = ch;
ch = fgetc(fp);
line++;
} else {
c = ch;//c为前一个数
thisLineNumber++;
ch = fgetc(fp);
}
while (!feof(fp)) {
if (ch != 10) {
thisLineNumber++;
c = ch;
ch = fgetc(fp);
} else {
if (c == 10) {
min = 0;
} else {
if (thisLineNumber > max) {
max = thisLineNumber;
if (line == 0) {
min = thisLineNumber;
}
}
if (thisLineNumber < min) {
min = thisLineNumber;
}
thisLineNumber = 0;
}
c = ch;
ch = fgetc(fp);
line++;
}
}
printTask2(line, max, min);
}
void printTask2(int line, int max, int min) {
printf("Task2:\n"
"line: %d\n"
"%d characters in max line.\n"
"%d characters in min line.\n", line, max, min);
}
//任务三
void task3(FILE *fp) {
int eachCapitalNum[26] = {0};
int eachLowercaseNum[26] = {0};
int ch = fgetc(fp);
while (!feof(fp)) {
if (ch >= 'A' && ch <= 'Z') {
eachCapitalNum[ch - 'A']++;
} else if (ch >= 'a' && ch <= 'z') {
eachLowercaseNum[ch - 'a']++;
}
ch = fgetc(fp);
}
printTask3(eachCapitalNum, eachLowercaseNum);
}
void printTask3(int eachCapitalNum[], int eachLowercaseNum[]) {
printf("Task3:\n"
"CAPITAL:\n");
char n = 'A';
for (int i = 0; i < 26; i++) {
printf("%c:%d\n", n, eachCapitalNum[i]);
n++;
}
printf("LOWERCASE:\n");
n = 'a';
for (int i = 0; i < 26; i++) {
printf("%c:%d\n", n, eachLowercaseNum[i]);
n++;
}
}