当前位置: 首页 > news >正文

7.2 项目2 学生通讯录管理:文本文件增删改查(C 版本)(自顶向下设计+断点调试) (A)

C++自学精简教程 目录(必读)

该作业是 作业 学生通讯录管理:文本文件增删改查(C++版本) 的C 语言版本。

具体的作业题目描述,要求,可以参考 学生通讯录管理:文本文件增删改查(C++版本)。

为何要有这个作业

这个作业同时提供C++和C两个版本,是我精心设计的。

很多人不清楚到底C和C++ 有何区别。

这两个作业的输入一模一样,输出也一模一样。

本文为了对比C和C++两种语言,特意使用C重新原样实现了一遍。

让学生对面向对象和面向过程的的不同有一个直观的认识。

启动代码

下面是C 语言版本的代码完整实现,比C++ 版本多了10行代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
#define bool int
#define true 1
#define false 0
#define NAME_LENGTH 30
#define TEL_LENGTH 15typedef struct _Person
{int m_id;char m_name[NAME_LENGTH];char m_tel[TEL_LENGTH];
} Person;
void print_person(Person* person)
{//-表示左对齐,默认右对齐printf("%-5d%-15s%-20s\n", person->m_id, person->m_name, person->m_tel);
}
//返回 bool 表示读取到了文件的末尾
bool read_person(FILE* fp, Person* person)
{bool result = false;if (fscanf(fp, "%d %s %s", &person->m_id, &person->m_name, &person->m_tel) > 0){result = true;}else{result = false;}return result;
}
void write_person(FILE* fp, Person* person)
{// 就像read_person 是从文件里读取内容,使用的是fscanf// 写入文件使用fprintf ,语法类比printf//(1) your code}
typedef struct _PersonManager
{Person m_allPerson[100];int size;
} PersonManager;
void InitPersonMgr(PersonManager* personMgr)
{//(2) your code}
void push_back(PersonManager* personMgr, Person* person)
{personMgr->m_allPerson[personMgr->size++] = *person;
}
void erase_person(PersonManager* personMgr, int index)
{assert(index >= 0 && index < personMgr->size);for (int i = index; i < personMgr->size - 1; i++){//(3) your code}personMgr->size -= 1;
}
void InputOnePerson(PersonManager* personMgr);
bool DeletePerson(PersonManager* personMgr)
{printf("Please input person id for delete:");int id;scanf("%d", &id);for (int i = 0; i < personMgr->size; i++){if (personMgr->m_allPerson[i].m_id == id){//(4) your codereturn true;}}return false;
}
bool QueryPersonByName(PersonManager* personMgr)
{printf("Please input name for query:");char name[NAME_LENGTH];scanf("%s", name);for (int i = 0; i < personMgr->size; i++){if (strcmp( personMgr->m_allPerson[i].m_name, name) == 0){printf("Find:\n");//(5) your code return true;}}printf("not found %s\n", name);return false;
}
bool QueryPersonByTel(PersonManager* personMgr)
{printf("Please input tel for query:");char tel[TEL_LENGTH];scanf("%s", tel);for (int i = 0; i < personMgr->size; i++){if (strcmp(personMgr->m_allPerson[i].m_tel, tel) == 0){printf("Find:\n");print_person(&personMgr->m_allPerson[i]);return true;}}printf("not found %s\n", tel);return false;
}
void ShowAllPerson(PersonManager* personMgr)
{printf("All Person:\n");printf("id   name           tel\n");for (int i = 0; i < personMgr->size; i++){print_person(&personMgr->m_allPerson[i]);}
}
bool SaveAllPersonToFile(PersonManager* personMgr)
{FILE* fp = fopen("data_saved.txt", "w");//以写方式打开文件if (fp == NULL){printf("can not open file data_saved.txt for write data.\n");return false;}for (int i = 0; i < personMgr->size; i++){//(6) your code}fclose(fp);return true;
}
bool LoadAllPersonFromFile(PersonManager* personMgr, const char* fileName)
{FILE* fp = fopen(fileName, "r");//只读方式打开文本文件if (fp == NULL){printf("load data failed . file %s not exits.\n", fileName);return false;}Person person;while (read_person(fp, &person)){push_back(personMgr, &person);}printf("load data from file success.\n");fclose(fp);return true;
}
void InputOnePerson(PersonManager* personMgr)
{printf("Please input one person:\n");printf("Please input id:");int id;scanf("%d", &id);Person person;memset(&person, 0, sizeof(Person));person.m_id = id;for (int i = 0; i < personMgr->size; i++){if (personMgr->m_allPerson[i].m_id == id){printf("%d already existed! Save failed.\n", id);return;}}printf("Please input name:");scanf("%s", person.m_name);printf("Please input tel:");scanf("%s", person.m_tel);printf("Input finished, save successed.\n");//(7) your code}
int main(int argv, char* argc[])
{PersonManager personMgr;InitPersonMgr(&personMgr);LoadAllPersonFromFile(&personMgr, "input_data.txt");ShowAllPerson(&personMgr);while(true){printf("input a commond : \n");printf("1 [AddPerson]\n");printf("2 [ShowAllPerson]\n");printf("3 [QueryPerson by name]\n");printf("4 [QueryPerson by tel]\n");printf("5 [SaveAllPersonToFile]\n");printf("6 [DeletePerson]\n");printf("0 [ExitAndSaveChange]\n");int commond;scanf("%d", &commond);switch(commond){case 1: { InputOnePerson(&personMgr); break;}case 2: { ShowAllPerson(&personMgr); break;}case 3: { QueryPersonByName(&personMgr); break;}case 4: { QueryPersonByTel(&personMgr); break;}case 5: { SaveAllPersonToFile(&personMgr); break;}case 6: { DeletePerson(&personMgr); break;}case 0: { SaveAllPersonToFile(&personMgr); return 0;}default:{ printf("System Exit.\n"); return 0;}}}return 0;
}

运行结果

和C++ 一模一样:

load data from file success.
All Person:
id   name           tel
2    zhangsan2      13788889992
3    zhangsan3      13788889993
4    zhangsan4      13788889994
5    wanger         13333333333
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
2
All Person:
id   name           tel
2    zhangsan2      13788889992
3    zhangsan3      13788889993
4    zhangsan4      13788889994
5    wanger         13333333333
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
1
Please input one person:
Please input id:1
Please input name:zhangsan
Please input tel:13344445555
Input finished, save successed.
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
2
All Person:
id   name           tel
2    zhangsan2      13788889992
3    zhangsan3      13788889993
4    zhangsan4      13788889994
5    wanger         13333333333
1    zhangsan       13344445555
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
3
Please input name for query:zhangsan
Find:
1    zhangsan       13344445555
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
3
Please input name for query:zhang
not found zhang
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
4
Please input tel for query:13344445555
Find:
1    zhangsan       13344445555
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
4
Please input tel for query:1334444
not found 1334444
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
6
Please input person id for delete:4
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
2
All Person:
id   name           tel
2    zhangsan2      13788889992
3    zhangsan3      13788889993
5    wanger         13333333333
1    zhangsan       13344445555
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
5
input a commond :
1 [AddPerson]
2 [ShowAllPerson]
3 [QueryPerson by name]
4 [QueryPerson by tel]
5 [SaveAllPersonToFile]
6 [DeletePerson]
0 [ExitAndSaveChange]
0

最终保存数据到文件 data_saved.txt

文件 data_saved.txt 的内容为:

2 zhangsan2 13788889992
3 zhangsan3 13788889993
5 wanger 13333333333
1 zhangsan 13344445555

你的结果也是这样吗?

答案在此

C++自学精简教程 全部答案

学生代码的运行结果

相关文章:

7.2 项目2 学生通讯录管理:文本文件增删改查(C 版本)(自顶向下设计+断点调试) (A)

C自学精简教程 目录(必读) 该作业是 作业 学生通讯录管理&#xff1a;文本文件增删改查&#xff08;C版本&#xff09; 的C 语言版本。 具体的作业题目描述&#xff0c;要求&#xff0c;可以参考 学生通讯录管理&#xff1a;文本文件增删改查&#xff08;C版本&#xff09;。…...

excel怎么设置任意选一个单元格纵横竖横都有颜色

有时excel表格内容过多的时候&#xff0c;我们通过excel设置任意选一个单元格纵横&#xff0c;竖横背景颜色&#xff0c;这样会更加具有辨识度。设置方式截图如下 设置成功后&#xff0c;预览的效果图...

期货-股票交易规则

交易时间 港股&#xff1a;9:00~9:20 集合竞价&#xff0c;9:3012:00&#xff0c;13:0016:00 持续交易&#xff0c;16:00~16:10 随机收市竞价沪股&#xff1a;9:00~9:25 集合竞价&#xff0c;9:3011:30&#xff0c;13:0015:00 持续交易&#xff0c;11:30~12:00 交易申报深股&a…...

Makefile一些语法

ifneq($(filter true,$(xxx)), )的含义 filter 是过滤的意思&#xff0c;它的原型是&#xff1a;$(filter PATTERN…,TEXT)&#xff0c; 意义为&#xff1a;过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词&#xff0c;保留所有符合此模式的单词做返回值。 结合前面的if…...

0基础可以转行编程行业么

在2022年分行业门类分岗位就业人员年平均工资中&#xff0c;信息传输、软件和信息技术服务业的薪资遥遥领先其他行业&#xff0c;为全国平均薪资水平的 1.78 倍&#xff0c;远超第二名金融行业&#xff0c;其年增长率在9.4%&#xff0c;并成为年收入首个过20 万门槛的行业&…...

【spark】dataframe慎用limit

官方&#xff1a;limit通常和order by一起使用&#xff0c;保证结果是确定的 limit 会有两个步骤&#xff1a; LocalLimit &#xff0c;发生在每个partitionGlobalLimit&#xff0c;发生shuffle&#xff0c;聚合到一个parttion 当提取的n大时&#xff0c;第二步是比较耗时的…...

基于OpenCV+LPR模型端对端智能车牌识别——深度学习和目标检测算法应用(含Python+Andriod全部工程源码)+CCPD数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境OpenCV环境Android环境1. 开发软件和开发包2. JDK设置3. NDK设置 模块实现1. 数据预处理2. 模型训练1&#xff09;训练级联分类器2&#xff09;训练无分割车牌字符识别模型 3. APP构建1&#xff09;导入OpenCV库…...

C++学习6

C学习6 基础知识std::thread 实战boost domain socket server 基础知识 std::thread std::thread是C11标准库中的一个类&#xff0c;用于创建并发执行的线程。它的详细用法如下&#xff1a; 头文件 #include <thread>创建线程 std::thread t(func, args...);其中&am…...

bazel使用中存在的问题

只开远端缓存时。kernel采用的bazel编译&#xff0c;遇到如下问题&#xff1a; 1、Action 详情二进制文件解析为文本文件时报错&#xff0c;无法进一步比较分析导致缓存不命中的原因。--- JDK版本的问题 2、远端缓存全部命中时间收益不明显 ---需分析是否为网络原因 3、$HOM…...

svn软连接和文件忽略

软连接 1)TortoiseSVN->Properties->New->Externals->New 2)填入软连接信息 Local path: 写下软连接后的文件夹的名字 URL: 想要软连接的牡蛎->TortoiseSVN->Repo-browser 复制下填入 文件忽略 以空格隔开就行...

自动驾驶攻城战,华为小鹏先亮剑

点击关注 文&#xff5c;刘俊宏 编&#xff5c;苏扬、王一粟 本文为光锥智能x腾讯科技联合出品 2023年过半&#xff0c;城市NOA&#xff08;城市领航辅助驾驶&#xff09;的元年如预期中到来了吗&#xff1f; 8月25日&#xff0c;成都车展开幕&#xff0c;与4个月之前的上海…...

企业供应链数字化怎么做?企业数字化供应链流程落地方式

什么是供应链&#xff1f;简单来说&#xff0c;供应链是围绕客户需求&#xff0c;以提高产品流通各个环节的效率为目标&#xff0c;通过资源整合的方式来实现产品从设计、生产到销售、服务整个环节的组织形态。如同人工智能、区块链、5G等技术的发展带来的各种行业变化&#xf…...

java八股文面试[多线程]——synchronized 和lock的区别

其他差别&#xff1a; synchronized是隐式的加锁,lock是显式的加锁; synchronized底层采用的是objectMonitor,lock采用的AQS; synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列, lock有一个同步队列,可以有多个等待队列; synchronized使用了object类的wait和noti…...

实现一个简单的控制台版用户登陆程序, 程序启动提示用户输入用户名密码. 如果用户名密码出错, 使用自定义异常的方式来处理

//密码错误异常类 public class PasswordError extends Exception {public PasswordError(String message){super(message);} }//用户名错误异常类 public class UserError extends Exception{public UserError(String message){super(message);} }import java.util.Scanner;pu…...

Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

面试专题-设计模式 前言 在平时的开发中&#xff0c;涉及到设计模式的有两块内容&#xff0c;第一个是我们平时使用的框架&#xff08;比如spring、mybatis等&#xff09;&#xff0c;第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#xff…...

Anaconda Prompt输入jupyter lab无反应

问题&#xff1a;Anaconda Prompt界面输入指令无反应 原因&#xff1a;公司电脑勒索病毒防御工具阻止了进程 解决&#xff1a;找到黑名单恢复进程...

JavaScript Web APIs - 05 Window对象 、本地存储

Web APIs - 05 文章目录 Web APIs - 05js组成window对象定时器-延迟函数location对象navigator对象histroy对象本地存储&#xff08;今日重点&#xff09;localStorage&#xff08;重点&#xff09;sessionStorage&#xff08;了解&#xff09;localStorage 存储复杂数据类型 综…...

Ansible学习笔记6

stat模块&#xff1a;获取文件的状态信息&#xff0c;类似Linux的stat状态。 获取/etc/fstab文件的状态。 [rootlocalhost tmp]# ansible group1 -m stat -a "path/etc/fstab" 192.168.17.106 | SUCCESS > {"ansible_facts": {"discovered_inter…...

Linux挖矿程序清除

1. 找到挖矿进程 2.找到病毒的文件地址 ls -l /proc/进程ID/exe3.删除文件命令 rm -rf 文件地址4.杀死挖矿进程 kill -9 进程ID...

使用Git和Github上传代码文件

1. 先检查是否安装好git git --version2. 输入你的github用户名 git config --global user.name "用户名"3. 输入你的github邮件 git config --global user.email "邮件地址"4. 设定git推送本地仓库中与远程仓库中具有相同名称的所有分支。 git config…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...

【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境

如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境&#xff1f; 在 Python 开发中&#xff0c;为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具&#xff0c;能高效创建不同 Python 版本的 Poetry 虚拟环境&#xff0c;接下来…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解​

阅读时长​​ | 8分钟 ​​适用读者​​ | 需要跨境调用OpenAI等AI服务的开发者/企业 ​​一、问题背景&#xff1a;为什么需要代理&#xff1f;​​ 最近在技术社区看到这样的求助&#xff1a; "公司服务器在国内&#xff0c;但业务需要调用OpenAI接口&#xff0c;直接访…...