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

news2024/11/16 9:44:24

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 15

typedef 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 code

            return 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++自学精简教程 全部答案

学生代码的运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试有哪些常见的测试指标?

一、什么是性能测试 先看下百度百科对它的定义 <font size"3">性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。</font> 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进…

【数据结构】栈---C语言版(详解!!!)

文章目录 &#x1f438;一、栈的概念及结构&#x1f344;1、栈的概念定义&#x1f344;2、动图演示&#x1f332;入栈&#x1f332;出栈&#x1f332;整体过程 &#x1f438;二、栈的实现&#x1f438;三、数组结构栈详解&#x1f34e;创建栈的结构⭕接口1&#xff1a;定义结构…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉师大图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉师大图书馆

配置keil生成asm汇编文件

简介&#xff1a;ASM是汇编语言源程序的扩展名&#xff1b;程序在编译的过程中&#xff0c;会将源代码编译会汇编代码&#xff0c;一步步生成可执行文件&#xff1b; 1&#xff1a;keil中options的配置 这个语法应该是根据工程工程哪里的配置名称来的&#xff0c;也可以使用固…

历史库存储成本节约至少 50% ,OceanBase数据压缩核心技术解读

“数据是二十一世纪的石油”&#xff0c;这个观点正在逐渐成为现实&#xff0c;现在我们有各种各样的 IT 系统不断地生产着数据&#xff0c;这些数据累积起来为我们的生产生活带来了很多便利。但在挖掘这些数据价值的同时&#xff0c;大量数据的存储与计算也带来了巨大的成本&a…

TCP和UDP通信

1.通信过程 UDP 服务器sever绑定IP地址&#xff0c;关闭套接字 TCP socket套接字&#xff08;网络通信&#xff09;

站在大数据行业山顶看风景

大家好&#xff0c;我是你们的朋友王知无。 从2022年开始应很多小伙伴的邀请和咨询&#xff0c;我以个人的名义开了自己的《面向国内Top企业的大数据训练营》。最初这个过程我的内心非常忐忑&#xff0c;从备课、直播、答疑、1对1指导&#xff0c;再到同学们找工作的过程中Offe…

制造费用分摊可参考本量利分析模型!(ODOO16/15演示)

本量利分析法&#xff08;CVP&#xff09;是管理会计的一项基本管理工具&#xff0c;能比较准确地揭示成本、业务量和利润之间的数量关系​。简单理解就是把产品&#xff08;或业务&#xff09;成本分为变动成本和固定成本&#xff0c;例如&#xff1a;生产一件衣服&#xff0c…

Langchain使用介绍之outparser 和memory

上一篇博客中对Langchain中prompt进行了详细的介绍&#xff0c;此篇博客将介绍Langchain中的outparser和memory。当调用大模型生成内容时&#xff0c;返回的内容默认是string类型&#xff0c;这对于我们获取response中的某些内容信息可能会带来障碍&#xff0c;例如返回的内容本…

YOLOv8目标检测实战:TensorRT加速部署(视频教程)

课程链接&#xff1a;https://edu.csdn.net/course/detail/38956 PyTorch版的YOLOv8是先进的高性能实时目标检测方法。 TensorRT是针对英伟达GPU的加速工具。 本课程讲述如何使用TensorRT对YOLOv8目标检测进行加速和部署。 •采用改进后的tensorrtx/yolov8的代码&#xff0c;…

阻塞/非阻塞、同步/异步(网络IO)

1.阻塞/非阻塞、同步/异步(网络IO) 【思考】典型的一次 IO 的两个阶段是什么&#xff1f; 数据就绪 和 数据读写 数据就绪 &#xff1a;根据系统 IO 操作的就绪状态 阻塞 非阻塞 数据读写 &#xff1a;根据应用程序和内核的交互方式 同步 异步 陈硕&#xff1a;在处理 IO …

3D点云处理:获取最高层范围内的点(附源码)

文章目录 0. 测试效果1. 基本内容2. 代码实现文章目录:3D视觉个人学习目录微信: dhlddxB站: Non-Stop_目标:仅获取最高层范围内的点云用于后续处理0. 测试效果 红色为提取的最高层范围内的点云 1. 基本内容 要获取点云中特定高度范围内的点云,可以使用高度条件过滤的原理。…

超越编辑器的边界:掌握 Vs Code + Vim 最强操作技巧

看完这篇文章&#xff0c;从此刻开始你将成为一名真正的 “键盘侠” 作为程序员我们知道&#xff0c;当我们编写代码的时候频繁的操作鼠标是一件非常费劲的一件事&#xff0c;我们的很多时间都会浪费到去使用鼠标定位光标选中文本等等&#xff0c;要知道使用快捷键肯定是比我们…

力扣:83. 删除排序链表中的重复元素(Python3)

题目&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚…

Jenkins自动构建(Gitee)

Gitee简介安装JenkinsCLI https://blog.csdn.net/tongxin_tongmeng/article/details/132632743 安装Gitee jenkins-cli install-plugin gitee:1.2.7 # https://plugins.jenkins.io/gitee/releases获取安装命令(稍作变更) JenkinsURL Dashboard-->配置-->Jenkins Locatio…

【LLM】chatglm-6B模型训练和推理

本篇文章记录下 chatglm-6B 训练和推理过程 环境&#xff1a;Ubuntu 20.04 1.13.0cu116 chatglm-6B 源代码仓库&#xff1a;链接 chatglm-6B 模型权重&#xff1a;链接 源代码及模型 clone 到本地 这里使用的是 THUDM 在 hugging face 开源的模型。 因为模型比较大&#xff…

软考高级架构师——6、软件架构设计

像学写文章一样&#xff0c;在学会字、词、句之后&#xff0c;就应上升到段落&#xff0c;就应追求文章的“布局谋 篇”&#xff0c;这就是架构。通俗地讲&#xff0c;软件架构设计就是软件系统的“布局谋篇”。 人们在软件工程实践中&#xff0c;逐步认识到了软件架构的重要性…

英码深元“三位一体”AI场景化解决方案,助力多地化工园区快速实现智慧化转型!

我国是世界公认的化工大国&#xff0c;同时也是崛起中的化工强国。近年来多起重大爆炸事故暴露出我国化工园区安全问题突出&#xff0c;特别是在安全风险管控数字化转型、智能化升级方面存在明显短板和不足&#xff0c;尤其突出的痛点&#xff1a;化工园区的日常管理方式较为粗…

安卓 tcp 客户端

安卓 tcp 客户端 Server:8888 是Qt 写的Tcp 服务器 ip 是 192.168.2.103 port是8888 安卓手机运行 kotlin 语法的Tcp Client &#xff0c;连接&#xff0c;收发数据 效果如下图 Tcpclient package com.example.myapplicationimport android.os.Handler import android.os.Loo…

Xilinx UltraScale架构之可配置逻辑块CLB

目录 一、概览 二、UltraScale架构 2.1 UltraScale/UltraScale特点 2.2 与7系列CLB差异 三、 CLB结构 3.1 LUT 3.2 FF 3.3 多路选择器Multiplexers 3.4 进位链Carry Chain 四、应用 4.1 分布式RAM 4.2 移位寄存器 4.3 进位链Carry Chain 五、参考资料 一、概览 二…