概述
目录
第一题:文件内容复制
第二题:分析学生成绩
第三题:统计文本中每个字母出现的次数
第一题:文件内容复制
首先在自己编辑器目录下手动创建一个txt文件并命名为 input_1.txt ,文件内容如下:
轻轻的我走了,
正如我轻轻的来;
我轻轻的招手,
作别西天的云彩。
那河畔的金柳,
是夕阳中的新娘;
波光里的艳影,
在我的心头荡漾。
???? 题目要求:通过代码将创建 output_1.txt ,并使用文件操作函数将刚才手动创建的 input_1.txt 文件中的所有内容复制到 output_1.txt 中。
???? 参考答案:
#include <stdio.h>
int main() {
// 读取刚才创建的文件
FILE* input_1 = fopen("input_1.txt", "r");
if (input_1 == NULL) {
perror("fopen");
return 1;
}
// 创建文件(拷贝目标)
FILE* output_1 = fopen("output_1.txt", "w");
if (input_1 == NULL) {
perror("fopen");
return 1;
}
// 开始操作
char ch = 0;
while (1) {
// 复制
ch = fgetc(input_1);
if (ch == EOF) {
break;
}
// 粘贴
fputc(ch, output_1);
}
// 关闭文件
fclose(input_1);
fclose(output_1);
input_1 = NULL;
output_1 = NULL;
return 0;
}
???? 完成结果:
第二题:分析学生成绩
首先在自己编辑器目录下手动创建一个txt文件并命名为 input_2.txt ,文件内容如下:
Hellen 90 89.2
Amy 100 52
Jack 22.3 64
Gordon 47.2 100
Brian 56 25.3
???? 题目要求:通过代码将创建 output_2.txt ,并且根据 input_2.txt 中的内容生成下图所示的内容,第一行由学生姓名、平均分、是否合格 构成。算出他们的平均分并且判断是否合格,展现在 output_2.txt 中,要求达到上图所示的效果(缩进随意)。
如果学生的期中期末成绩的平均分高于或等于全班平均分则为 pass,低于全班平均分则为 fail 。
学生的姓名长度限制最多15个字符。
???? 参考答案:
#include <stdio.h>
int main(void) {
char name[15] = { 0 }; // 学生姓名(长度限制15)
float mid; // 期中考试成绩
float final; // 期末考试成绩
float sum = 0.0; // 总合
float avg = 0.0; // 平均分
float class_avg = 0.0; // 班级平均分
int cnt = 0; // 统计
int res = 0;
// 读取刚才创建的文件
FILE* input_2 = fopen("input_2.txt", "r");
if (input_2 == NULL) {
perror("fopen");
return 1;
}
// 创建文件(目标)
FILE* output_2 = fopen("output_2.txt", "w");
if (output_2 == NULL) {
perror("fopen");
return 1;
}
// 读取学生姓名、期中成绩和期末成绩
while (1) {
res = fscanf(input_2, "%s%f%f", name, &mid, &final);
if (res == EOF) {
break;
}
sum += mid + final;
cnt += 2;
}
// 关闭文件
fclose(input_2);
// 再次打开
input_2 = fopen("input_2.txt", "r");
if (input_2 == NULL) {
perror("fopen");
return 1;
}
// 计算班级平均分
class_avg = sum / cnt;
// 写入第一行标题
fprintf(output_2, "strudent average graden");
// 写入数据
while (1) {
res = fscanf(input_2, "%s%f%f", name, &mid, &final);
if (res == EOF) {
break;
}
// 计算个人平均分
avg = (mid + final) / 2;
// 判断是否合格 pass or fail
if (avg >= class_avg) {
fprintf(output_2, "%-10s %.2f passn", name, avg);
} else {
fprintf(output_2, "%-10s %.2f failn", name, avg);
}
}
fprintf(output_2, "Class average: %.2f", class_avg);
// 关闭文件
fclose(input_2);
fclose(output_2);
input_2 = NULL;
output_2 = NULL;
return 0;
}
???? 完成结果:
第三题:统计文本中每个字母出现的次数
首先在自己编辑器目录下手动创建一个txt文件并命名为 input_3.txt ,文件内容如下:
Overwatch is a multiplayer team-based first-person shooter developed and published by Blizzard Entertainment.
In a time of global crisis, an international task force of heroes banded together to restore peace to a war-torn world.
This organization, known as Overwatch, ended the crisis and helped maintain peace for a generation,
inspiring an era of exploration, innovation, and discovery. After many years, Overwatch's influence waned and it was eventually disbanded.
Now in the wake of its dismantling, conflict is rising once again. Overwatch may be gone... but the world still needs heroes.
Choose A Hero: Overwatch features a wide array of unique Heroes, ranging from a time-jumping adventurer, to an armored,
rocket-hammer-wielding warrior, to a transcendent robot monk. Every hero plays differently,
and mastering their Abilities is the key to unlocking their potential.No two heroes are the same.
???? 题目要求:读取 input_3.txt ,统计整个文本中英文字母A~Z分别出现了几次,无视大小写且只统计字母,并打印(格式不要求)。输出结果如下所示:
???? 参考答案:
① 直接用库函数进行大小写转换:
#include <stdio.h>
#include <ctype.h>
int main(void) {
int alp[26] = { 0 }; // 字母表
// 读取刚才创建的文件
FILE* input_3 = fopen("input_3.txt", "r");
if (input_3 == NULL) {
perror("fopen");
return 1;
}
int ch = 0;
while (ch = fgetc(input_3), ch != EOF) {
// 大小写转换(题目要求无视大小写)
if (isupper(ch)) {
ch = tolower(ch);
}
if (islower(ch)) {
alp[ch - 'a'] += 1;
}
}
//打印结果
int i = 0;
for (i = 0; i < 26; i++) {
printf("[%c]:%dt", 'A' + i, alp[i]);
}
// 关闭文件
fclose(input_3);
input_3 = NULL;
return 0;
}
② 用 ASCII 码的特性进行大小写转换:
#include <stdio.h>
int main(void) {
int alp[26] = { 0 }; // 字母表
// 读取刚才创建的文件
FILE* input_3 = fopen("input_3.txt", "r");
if (input_3 == NULL) {
perror("fopen");
return 1;
}
int ch = 0;
while (ch = fgetc(input_3), ch != EOF) {
// 大小写转换(题目要求无视大小写)
if ('A' <= ch && ch <= 'Z') {
ch -= 'A' - 'a';
}
if ('a' <= ch && ch <= 'z') {
alp[ch - 'a'] += 1;
}
}
//打印结果
int i = 0;
for (i = 0; i < 26; i++) {
printf("[%c]:%dt", 'A' + i, alp[i]);
}
// 关闭文件
fclose(input_3);
input_3 = NULL;
return 0;
}
参考资料:
Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .
百度百科[EB/OL]. []. https://baike.baidu.com/.
???? 笔者:王亦优
???? 更新: 2021.12.13
❌ 勘误: 无
???? 声明: 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正。
最后
以上就是调皮白开水为你收集整理的【C基础练习题】Week5:文件操作 | 内容复制 | 学生成绩分析 | 统计字母个数的全部内容,希望文章能够帮你解决【C基础练习题】Week5:文件操作 | 内容复制 | 学生成绩分析 | 统计字母个数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复