news 2026/4/17 14:31:42

作业实验4

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
作业实验4

1./*
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.

/*
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;
}

3.

/*
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;
}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:51:07

C++虚函数表:多态背后的魔法

C 多态底层机制&#xff1a;虚函数与虚函数表 (vtable)1. 核心矛盾&#xff1a;静态绑定 vs 动态绑定要理解虚表&#xff0c;首先要理解编译器面临的困境。&#x1f170;️ 静态绑定 (Static Binding / Early Binding)场景&#xff1a;普通函数&#xff08;非 virtual&#xff…

作者头像 李华
网站建设 2026/4/18 3:49:41

助力电工电子实验:multisim14.2安装详细说明

从零搭建电路仿真环境&#xff1a;Multisim 14.2 安装实战全记录你有没有过这样的经历&#xff1f;实验课要做一个滤波器频率响应测试&#xff0c;结果在面包板上连错一根线&#xff0c;整个波形乱成一团&#xff1b;或者调试放大电路时&#xff0c;示波器探头一碰上去就自激振…

作者头像 李华
网站建设 2026/3/14 21:56:16

JLink驱动安装简明教程:聚焦关键配置节点

JLink驱动安装实战指南&#xff1a;从零打通调试链路在嵌入式开发的世界里&#xff0c;最令人沮丧的不是代码写不出来&#xff0c;而是明明逻辑无误&#xff0c;程序却“烧不进去”——J-Link插着&#xff0c;线连着&#xff0c;目标板也供电了&#xff0c;可IDE就是报错&#…

作者头像 李华
网站建设 2026/4/18 5:42:52

【2025最新】基于SpringBoot+Vue的企业内管信息化系统管理系统源码+MyBatis+MySQL

摘要 随着信息技术的快速发展&#xff0c;企业内管信息化已成为提升管理效率、降低运营成本的重要手段。传统的手工管理模式已无法满足现代企业对数据实时性、准确性和安全性的需求&#xff0c;亟需通过信息化手段实现业务流程的数字化和智能化。企业内管信息化系统能够整合人力…

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

Java Web 三国之家网站系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着信息技术的快速发展&#xff0c;互联网已成为人们获取信息、交流互动的重要平台。三国文化作为中国传统文化的重要组成部分&#xff0c;具有深厚的历史底蕴和广泛的群众基础。然而&#xff0c;目前专门针对三国文化的综合性网站较少&#xff0c;且功能单一&#xff0c…

作者头像 李华
网站建设 2026/4/18 3:10:42

基于SpringBoot+Vue的社区帮扶对象管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着社会经济的快速发展&#xff0c;社区帮扶工作成为基层社会治理的重要组成部分。传统的帮扶对象管理多依赖人工记录和纸质档案&#xff0c;存在效率低下、信息更新不及时、数据易丢失等问题。尤其在人口流动性增强的背景下&#xff0c;精准识别帮扶对象、动态跟踪帮扶进…

作者头像 李华