news 2026/4/16 12:10:07

C语言最后一次作业

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言最后一次作业
题⽬1:数据持久化——增加与保存
【任务】:编写程序,从控制台输⼊5个廉江红橙产地的信息,将其存⼊结构体数组中,并
使⽤fprintf函数将数组内容持久化存储到名为farms.txt的⽂本⽂件中。
⽂件操作重点:使⽤"w"模式打开⽂件,掌握fprintf的格式化写⼊。
要求:每⾏存储⼀个产地的信息,字段间⽤空格分隔。
代码1project1_add.cpp
/* project1_add. 增加数据 */ #include <stdio.h> #include <stdlib.h> typedef struct { int id; // 产地ID char name[50]; // 产地名称 int yield; // 产量(吨) } OrangeFarm; int main() { OrangeFarm new_farm; // 本次只需定义⼀个结构体变量⽤于追加 FILE* fp; // 1. 从控制台录⼊单条需要追加的数据 printf("--- 廉江红橙产地数据追加 ---\n"); printf("请输⼊新增产地信息(格式:ID 名称 产量):\n"); if (scanf("%d %s %d", &new_farm.id, new_farm.name, &new_farm.yield) != 3) { printf("输⼊格式错误。\n"); return 1; } // 2. 以追加模式("a")打开⽂件 // "a" 代表 append。如果⽂件不存在会创建;如果存在,指针直接指向⽂件末尾 fp = fopen("farms.txt", "a"); // 检查⽂件打开是否成功 if (fp == NULL) { printf("错误:⽆法打开⽂件进⾏追加!\n"); return 1; } // 3. 使⽤ fprintf 写⼊新数据 // 务必保留末尾的 \n,确保下⼀条追加的数据能另起⼀⾏ fprintf(fp, "%d %s %d\n", new_farm.id, new_farm.name, new_farm.yield); // 4. 关闭⽂件 fclose(fp); printf("\n新记录已成功追加⾄ farms.txt 末尾。\n"); return 0; }
题⽬2:数据过滤——读取与删除
【任务】:先将farms.txt中的所有数据加载到结构体数组中。⽤户输⼊⼀个要删除的产地
ID”,程序在数组中剔除该条⽬后,将剩余数据重新覆盖写⼊farms.txt
⽂件操作重点:使⽤
"r"
模式读取,
feof()
fscanf() != EOF
判断⽂件结尾。
删除逻辑:在内存(数组)中完成删除,再通过重新打开⽂件并写⼊来实现物理删
/* project2_delete. 删除信息 */ #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { int id; char name[50]; int yield; } OrangeFarm; int main() { OrangeFarm farms[100]; // 假设最多存储100个产地 int count = 0; int deleteId; char confirm; FILE *fp; // 1. 读取⽂件内容到内存数组 fp = fopen("farms.txt", "r"); if (fp == NULL) { printf("错误:⽆法打开 farms.txt,请确保⽂件已存在。\n"); return 1; } // 循环读取直到⽂件末尾 while (fscanf(fp, "%d %s %d", &farms[count].id, farms[count].name, &farms[count].yield) == 3) { count++; } fclose(fp); if (count == 0) { printf("数据库为空,⽆数据可删除。\n"); return 0; } // 2. 像题⽬3⼀样,先展⽰当前所有数据,每⾏3个并对⻬ printf("\n--- 当前廉江红橙产地列表 ---\n"); for (int i = 0; i < count; i++) { printf("[%d] %-12s", farms[i].id, farms[i].name); if ((i + 1) % 3 == 0) { printf("\n"); // 每⾏输出3个后换⾏ } } printf("\n---------------------------\n"); // 3. ⽤户输⼊要删除的 ID printf("请输⼊要删除的产地 ID: "); scanf("%d", &deleteId); // 查找该 ID 所在的索引 int targetIndex = -1; for (int i = 0; i < count; i++) { if (farms[i].id == deleteId) { targetIndex = i; break; } } if (targetIndex == -1) { printf("错误:未找到 ID 为 %d 的记录。\n", deleteId); return 0; } // 4. 显⽰具体信息并进⾏确认 printf("\n拟删除记录详情:\n"); printf("ID: %d | 名称: %s | 产量: %d 吨\n", farms[targetIndex].id, farms[targetIndex].name, farms[targetIndex].yield); printf("警告:此操作不可撤回!确定删除吗?(y/n): "); getchar(); // 清除之前输⼊的换⾏符,防⽌ scanf 直接读取回⻋ scanf("%c", &confirm); if (confirm != 'y' && confirm != 'Y') { printf("操作已安全取消。\n"); return 0; } // 5. 在数组中进⾏“逻辑删除” // 将⽬标位置之后的元素全部向前移动⼀位 for (int i = targetIndex; i < count - 1; i++) { farms[i] = farms[i + 1]; } count--; // 总数减1 // 6. 重新写回⽂件(覆盖模式) fp = fopen("farms.txt", "w"); if (fp == NULL) { printf("系统错误:⽆法更新⽂件数据。\n"); return 1; } for (int i = 0; i < count; i++) { fprintf(fp, "%d %s %d\n", farms[i].id, farms[i].name, farms[i].yield); } fclose(fp); printf("成功:ID 为 %d 的记录已从系统中彻底移除。\n", deleteId); return 0; }
题⽬3:精准更新——加载与修改
【任务】:实现交互式修改。
1.程序打开⽂件并加载所有ID供⽤户预览。
2.⽤户输⼊⽬标ID
3.程序提⽰⽤户选择修改项(1.修改名称2.修改产量)。
4.⽤户输⼊新值后,程序更新数组并同步回⽂件。
⽂件操作重点:掌握内存加载->修改->重新回写的完整链路。
要求:利⽤
switch-case
结构处理⽤户的修改选择
/* project3_alter. 修改信息 */ #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { int id; char name[50]; int yield; } OrangeFarm; int main() { OrangeFarm farms[100]; int count = 0; int targetId, choice; FILE *fp; // 1. 加载数据到内存 fp = fopen("farms.txt", "r"); if (fp == NULL) { printf("错误:⽆法打开 farms.txt,请确保⽂件已存在。\n"); return 1; } while (fscanf(fp, "%d %s %d", &farms[count].id, farms[count].name, &farms[count].yield) == 3) { count++; } fclose(fp); if (count == 0) { printf("数据库为空,请先添加数据。\n"); return 0; } // 2. 展⽰已有 ID,每⾏ 3 个并对⻬ printf("--- 当前系统内的产地 ID 列表 ---\n"); for (int i = 0; i < count; i++) { printf("[%d] %-12s", farms[i].id, farms[i].name); // %-12s 保证名称左对⻬ if ((i + 1) % 3 == 0) { printf("\n"); // 每⾏输出3个后换⾏ } } printf("\n-------------------------------\n"); // 3. ⽤户选择要修改的 ID printf("请输⼊您想要修改的产地 ID: "); scanf("%d", &targetId); int index = -1; for (int i = 0; i < count; i++) { if (farms[i].id == targetId) { index = i; break; } } if (index == -1) { printf("未找到 ID 为 %d 的记录。\n", targetId); return 0; } // 4. 选择修改项 printf("\n已锁定产地: %s (产量: %d 吨)\n", farms[index].name, farms[index].yield); printf("1. 修改产地名称\n"); printf("2. 修改预计产量\n"); printf("3. 取消修改\n"); printf("请选择操作 (1-3): "); scanf("%d", &choice); switch (choice) { // 使⽤ switch-case 处理多选项 case 1: printf("请输⼊新的名称: "); scanf("%s", farms[index].name); break; case 2: printf("请输⼊新的产量 (吨): "); scanf("%d", &farms[index].yield); break; case 3: printf("操作已取消。\n"); return 0; default: printf("⾮法输⼊,操作终⽌。\n"); return 0; } // 5. 写回⽂件 fp = fopen("farms.txt", "w"); if (fp == NULL) { printf("回写⽂件失败!\n"); return 1; } for (int i = 0; i < count; i++) { fprintf(fp, "%d %s %d\n", farms[i].id, farms[i].name, farms[i].yield); } fclose(fp); printf("ID 为 %d 的记录已成功更新。\n", targetId); return 0; }
题⽬4:条件检索——读取与查询
【任务】:编写⼀个查询⼯具。⽤户输⼊⼀个产量阈值,程序打开⽂件读取数据,通过遍
历结构体数组,筛选并打印出所有产量⼤于该阈值的产地信息。
⽂件操作重点:使⽤循环配合
fscanf
逐⾏解析数据。
逻辑重点:考查结构体成员的访问与逻辑判断表达式。
/* project4_search. 查询信息 */ #include <stdio.h> #include <stdlib.h> typedef struct { int id; char name[50]; int yield; } OrangeFarm; int main() { FILE *fp; OrangeFarm temp; int threshold; int foundCount = 0; // 1. 打开⽂件进⾏读取 fp = fopen("farms.txt", "r"); if (fp == NULL) { printf("错误:⽆法打开数据⽂件 farms.txt,请确保⽂件已存在。\n"); return 1; } // 2. 获取⽤户查询条件 printf("----------- 廉江红橙产量筛选系统 -----------\n"); printf("请输⼊产量阈值(吨):"); if (scanf("%d", &threshold) != 1) { printf("输⼊⽆效。\n"); fclose(fp); // 记得关闭⽂件 return 1; } printf("\n正在查询产量⼤于 %d 吨的产地...\n", threshold); printf("-------------------------------------------\n"); printf("%-10s %-20s %-10s\n", "ID", "产地名称", "预计产量(吨)"); printf("-------------------------------------------\n"); // 3. 循环逐⾏解析数据 // fscanf 返回成功读取的项⽬数,若达到⽂件末尾则返回 EOF while (fscanf(fp, "%d %s %d", &temp.id, temp.name, &temp.yield) == 3) { // 4. 执⾏逻辑判断与成员访问 if (temp.yield > threshold) { printf("%-10d %-20s %-10d\n", temp.id, temp.name, temp.yield); foundCount++; } } // 5. 结果汇总 if (foundCount == 0) { printf("未找到产量超过 %d 吨的记录。\n", threshold); } else { printf("-------------------------------------------\n"); printf("查询完毕,共找到 %d 条记录。\n", foundCount); } // 6. 必须执⾏的⽂件关闭操作 fclose(fp); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 12:20:38

[Windows] MusicPlayer2 V2.78

[Windows] MusicPlayer2 V2.78 链接&#xff1a;https://pan.xunlei.com/s/VOhndZkhaG1s-y4Lv-J0il7GA1?pwdv6pr# MusicPlayer2是一款功能强大的本地音乐播放软件&#xff0c;旨在为用户提供最佳的本地音乐播放体验。它支持歌词显示、歌词卡拉OK样式显示、歌词在线下载、歌词…

作者头像 李华
网站建设 2026/4/4 1:22:09

YOLOv8训练时如何调整学习率和批量大小?

YOLOv8训练时如何调整学习率和批量大小&#xff1f; 在目标检测的实际项目中&#xff0c;模型能否高效收敛、稳定泛化&#xff0c;往往不只取决于网络结构本身。即便是像YOLOv8这样设计精良的现代架构&#xff0c;如果训练策略不当&#xff0c;也可能导致性能大幅下降——比如l…

作者头像 李华
网站建设 2026/4/15 3:45:24

Linux 在 2026 年将势不可挡,但一个开源传奇可能难以为继

显然&#xff0c;AI 将在明年的 Linux 和开源领域发挥更大作用&#xff0c;但这对几乎所有技术都是如此。然而&#xff0c;虽然 AI 将被用来帮助开发 Linux 内核&#xff0c;但没有人预测会像 Windows 那样&#xff0c;在 2030 年前使用 AI 重写整个代码库。也就是说&#xff0…

作者头像 李华
网站建设 2026/4/16 2:30:13

谷歌发布JAX-Privacy 1.0:大规模差分隐私机器学习工具库

我们宣布发布JAX-Privacy 1.0&#xff0c;这是一个基于高性能计算库JAX构建的差分隐私机器学习工具库。从个性化推荐到科学进步&#xff0c;AI模型正在帮助改善生活并改变各个行业。但这些AI模型的影响力和准确性往往取决于其使用的数据质量。大规模、高质量的数据集对于开发准…

作者头像 李华
网站建设 2026/4/15 17:28:17

YOLOv8告警系统集成:显存溢出自动通知

YOLOv8告警系统集成&#xff1a;显存溢出自动通知 在工业质检车间的边缘服务器上&#xff0c;一台搭载Jetson AGX Xavier的设备正持续运行YOLOv8目标检测模型。突然&#xff0c;视频流中断&#xff0c;日志中只留下一行冰冷的 CUDA out of memory 错误。运维人员赶到现场时&…

作者头像 李华
网站建设 2026/4/15 4:26:17

【PHP分布式缓存实战】:Redis集群适配的5大核心难题与解决方案

第一章&#xff1a;PHP分布式缓存与Redis集群的适配背景在现代高并发Web应用架构中&#xff0c;单一服务器的性能瓶颈促使系统向分布式架构演进。PHP作为广泛使用的后端语言&#xff0c;其传统文件或内存缓存机制已难以满足大规模请求下的性能需求。引入分布式缓存成为提升系统…

作者头像 李华