课设:通讯录

news2024/10/2 12:20:26

一.实验目的

1、进一步掌握和利用C语言进行程设计的能力;

2、进一步理解和运用结构化程序设计的思想和方法;

3、初步掌握开发一个小型实用系统的基本方法;

4、学会调试一个较长程序的基本方法;

5、掌握书写程序设计开发文档的能力。

二、实验内容

(1)信息维护:联系人信息数据要以文件的形式保存,能实现联系人信息数据的维护。此模块包括子模块有:增加联系人信息、删除联系人信息、修改联系人信息。

(2)信息查询:要求:查询时可实现按姓名查询。

(3)信息全展示:要求显示全部联系人信息

(4)排序:按姓名排序

三、系统设计

包括系统功能框架、数据结构设计、函数说明、运行界面、测试数据等

1.运用while循环使用户可以持续操作,直至用户输入‘0’退出通讯录

2.menu函数声明

void menu()

{

printf("******************************************************\n");

    printf("****     1.添加联系人        2. 删除联系人        ****\n");

    printf("****     3.查找联系人        4. 修改联系人        ****\n");

    printf("****     5.显示全部联系人    6. 按姓名排序联系人  ****\n");

    printf("****                     0.退出                   ****\n");

    printf("******************************************************\n");

}

3.运用switch对用户输入的数据进行分类并使用通讯录的不同功能

4.

链表的初始化:(1)采用带头的单链表存储数据

(2)SLinit函数声明

先打开文件data.txt

再从文件中读取数据存储至链表直至文件中的数据全部读取完毕

5.用户操作

(1)“添加联系人”

Slpushback函数声明

即尾插,将用户输入的联系人信息尾插入链表

(2)“删除联系人”

Sldelete函数声明

设置tail变量存储要删除的联系人所在节点的地址;

设置prevtail存储要删除的联系人的前一个结点的地址

prevtail->next = tail->next;

删除联系人节点

(3)“查找联系人”

Slfind函数声明

设置tail变量,遍历链表直至找到节点并打印该节点内容

(4)“修改联系人”

设置tail变量,遍历链表直至找到节点并改变除名字的其他信息

(5)“显示全部联系人”

设置tail变量,遍历链表的同时打印每一节点的内容。

(6)“按姓名排序联系人”

Slsort函数声明

//本质是冒泡排序

1.先设定min[10],运用strcpy函数将第一节点的姓名复制到min上,再遍历链表,运用strcmp函数比较min与当前节点,若结果<0,再将当前节点复制到min

再用flag存储当前节点的地址,

2.一轮循环结束后用slswap函数交换flag和这一轮循环的初节点

3.重新设置下一轮循环的初节点,flag,min,进行下一次循环,直至初节点的next为空

 

(7)退出

退出之后,再程序终止之前需要打开文件,写入这次更改添加的数据,最后关闭文件。

四、总结 

 

主要问题出现在文件的读写和slsort函数的声明上,

(1)

在函数读入上学会了fscanf函数的使用并了解其返回值为读取成功的数据个数,若读取失败则返回-1,可用于while循环进行连续读取

(2)slsort函数

采用带头的单链表可以防止交换节点后找不到头节点,导致读取乱序。

需要考虑多种情况,若需要交换的节点为尾节点怎么办?,若循环一轮后不需要交换怎么办?交换后如何让链表重新链接起来?这些问题都通过不断调试才得以解决。

五.代码全览 

1. contact.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct SListnode
{
	char name[10];
	int age;
	char number[20];
	char place[10];
	struct SListnode* next;
}SLnode;

void SLinit(SLnode* phead);//初始化
void add(SLnode* head);

void prSLpushback(SLnode* head, int x, char na[], char nu[], char p[]);    //初始添加
void SLpushback(SLnode* head);                                            //插入
SLnode* SLcreat(int x, char na[], char nu[], char p[]);
void SLdelete(SLnode* head);                                              //删除
void SLfind(SLnode* head);                                                //查找
void SLalter(SLnode* head);                                               //修改
void SLprint(SLnode* head);                                               //打印
void SLsort(SLnode* phead);                                               //排序
void SLswap(SLnode* head, SLnode* flag);                                  //交换
void SLsave(SLnode* head);                                                //保存数据至文档

 2.contact.c

#include"contact.h"

void prSLpushback(SLnode* head, int x, char na[], char nu[], char p[])
{
	SLnode* newnode = SLcreat(x, na, nu, p);
	SLnode* tail = head;
	while (tail->next != NULL)
		tail = tail->next;
	tail->next = newnode;
}

void SLinit(SLnode* phead)
{
	SLnode* tail = (SLnode*)malloc(sizeof(SLnode));
	FILE* pf = fopen("data.txt", "r");
	int flag=0;
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	flag =fscanf(pf,"%s %d %s %s", tail->name, &tail->age, tail->number, tail->place);
	while(flag>=0)
	{
		prSLpushback(phead,tail->age,tail->name,tail->number,tail->place);
		flag = (fscanf(pf, "%s %d %s %s", tail->name, &tail->age, tail->number, tail->place));
	}
	fclose(pf);
	pf = NULL;
}

void SLpushback(SLnode* head)
{
	int age;
	char name[10];
	char number[20];
	char place[10];
	printf("请输入姓名:> ");
	scanf("%s", name);
	printf("请输入年龄:> ");
	scanf("%d", &age);
	printf("请输入电话号码:> ");
	scanf("%s", number);
	printf("请输入住址:> ");
	scanf("%s", place);
	SLnode* newnode = SLcreat(age,name,number,place);
	SLnode* tail = head;
	while (tail->next != NULL)
		tail = tail->next;
	tail->next = newnode;
}

SLnode* SLcreat(int x, char na[], char nu[], char p[])
{
	SLnode* head = (SLnode*)malloc(sizeof(SLnode));
	head->age = x;
	strcpy(head->number, nu);
	strcpy(head->name, na);
	strcpy(head->place, p);
	head->next = NULL;
	return head;
}

void SLdelete(SLnode* head)
{
	char n[10];
	printf("输入要删除的联系人的姓名:> ");
	scanf("%s", n);
	SLnode* tail = head->next;
	SLnode* prevtail = head;
	while (strcmp(n, tail->name) != 0 && tail->next != NULL)
	{
		tail = tail->next;
	}
	if (strcmp(n, tail->name) != 0)
		printf("输入错误");
	else
	{
		while (prevtail->next != tail)
			prevtail = prevtail->next;
		if (tail->next == NULL)
			prevtail->next = NULL;
		else
		{
			prevtail->next = tail->next;
			free(tail);
		}
	}
}

void SLfind(SLnode* head)
{
	char n[10];
	printf("输入要查找的联系人的姓名:> ");
	scanf("%s", n);
	SLnode* tail = head->next;
	while (strcmp(n, tail->name) != 0 && tail->next != NULL)
	{
		tail = tail->next;
	}
	if (strcmp(n, tail->name) != 0)
		printf("查无此人");
	else
	{
		printf("姓名:%s ", tail->name);
		printf("年龄:%d ", tail->age);
		printf("电话号码:%s ", tail->number);
		printf("住址:%s ", tail->place);
		printf("\n");
	}
}

void SLalter(SLnode* head)
{
	char n[10];
	char a[10];
	printf("输入要修改的联系人的姓名:> ");
	scanf("%s", n);
	SLnode* tail = head->next;
	while (strcmp(n, tail->name) != 0 && tail->next != NULL)
	{
		tail = tail->next;
	}
	if (strcmp(n, tail->name) != 0)
		printf("查无此人");
	else 
	{
		printf("输入修改后的联系人的姓名:> ");
		scanf("%s", a);
		strcpy(tail->name, a);
	}
}

void SLprint(SLnode* head)
{
	SLnode* tail = head->next;
	while (tail!= NULL)
	{
		printf("姓名:%s ", tail->name);
		printf("年龄:%d ", tail->age);
		printf("电话号码:%s ", tail->number);
		printf("住址:%s ", tail->place);
		printf("\n");
		tail = tail->next;
	}
}

void SLswap(SLnode* head, SLnode* flag)
{
	SLnode* tail = head;
	while (tail->next != flag)
		tail = tail->next;
	if (flag->next != NULL)
	{
		SLnode* ptail = flag->next;
		flag->next = head->next;
		tail->next = head;
		head->next = ptail;
	}
	else
	{
		if (head->next == flag)
		{
			flag->next = head;
			head->next = NULL;
		}
		else
		{
			flag->next = head->next;
			tail->next = head;
			head->next = NULL;
		}
	}
}

void SLsort(SLnode* phead)
{
	SLnode* qhead = phead;
	SLnode* head = phead->next;
	SLnode* tail = phead->next;
	SLnode* flag = NULL;
	char min[10];
	strcpy(min, phead->next->name);
	while (head->next != NULL)
	{
		while (tail->next != NULL)
		{
			tail = tail->next;
			if (strcmp(min, tail->name)>=0)
			{
				strcpy(min,tail->name);
				flag = tail;
			}
		}
		if (flag != NULL)
		{
			SLswap(head, flag);
			qhead->next = flag;
			qhead = qhead->next;
			head = flag->next;
			tail = head;
			flag = NULL;
			strcpy(min,head->name);
		}
		else
		{
			head = head->next;
			tail = head;
			qhead = qhead->next;
			strcpy(min, head->name);
		}
	}
}

void SLsave(SLnode* head)
{
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	SLnode* tail = head->next;
	while (tail != NULL)
	{
		fprintf(pf,"%s %d %s %s\n",tail->name,tail->age,tail->number,tail->place);
		tail = tail->next;
	}
	fclose(pf);
	pf = NULL;
}

3.test.c 

#include"contact.h"
void menu()
{
	printf("******************************************************\n");
	printf("****     1.添加联系人        2. 删除联系人        ****\n");
	printf("****     3.查找联系人        4. 修改联系人        ****\n");
	printf("****     5.显示全部联系人    6. 按姓名排序联系人  ****\n");
	printf("****                     0.退出                   ****\n");
	printf("******************************************************\n");
}

int main()
{
	int flag = 1;
	SLnode* sl = (SLnode*)malloc(sizeof(SLnode));
	sl->age = 1;
	strcpy(sl->number,"110");
	strcpy(sl->name,"wang");
	strcpy(sl->place,"beijing");
	sl->next = NULL;
	SLinit(sl);
	while (flag)
	{
		menu();
		printf("请选择> ");
		scanf("%d", &flag);
		switch (flag)
		{
		case 1:     SLpushback(sl);   //添加
			break;
		case 2:     SLdelete(sl);     //删除
			break;
		case 3:     SLfind(sl);       //查找
			break;
		case 4:     SLalter(sl);      //修改
			break;
		case 5:    SLprint(sl);       //打印
			break;
		case 6:    SLsort(sl);        //排序
			break;
		case 0:    SLsave(sl); 
			//存储
			break;
		default:
			break;
		}
	}
	return 0;
}

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

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

相关文章

iPhone/iPad技巧:如何解锁锁定的 iPhone 或 iPad

“在我更新 iPhone 上的软件后&#xff0c;最近我遇到了iPhone 被锁定到所有者的消息&#xff0c;该如何解决&#xff1f;” 根据我们的研究&#xff0c;许多用户在 iOS 18 更新或恢复出厂设置后都会遇到同样的问题。只要出现问题&#xff0c;您就无法使用 iPhone 或 第 1 部分…

jenkins微服务

如果vim进去某个文件里&#xff0c;可以按键盘的向下键查阅其它部分 记得每天备份虚拟机的项目 一.在linux安装jenkins 1.上传文件 我们采用安装包的方式安装。 先用SShclient在/usr/local/下创建jenkins文件夹&#xff0c;然后向其中导入两个包 2.安装jenkins 再在控制…

「STL::queue」标准库适配器:priority_queue(优先队列)介绍|自定义比较运算(C++)

目录 概述 创建销毁 内部理解 构造析构 自定义比较 赋值重构 数据访问 内存管理 数据控制 Tips 概述 priority_queue 是一种C标准模板库STL中定义的一种序列容器&#xff0c;它允许你在运行时动态地进行堆操作。 priority_queue 可以自动管理内存&#xff0c;这意味…

使用阿里云试用资源快速部署web应用-dofaker为例

本文介绍使用阿里云的试用资源部署dofaker的方法&#xff0c;本教程主要作学习在阿里云部署web应用之用&#xff0c;部署好应用之后&#xff0c;可以在任何地点通过公网ip访问web应用。 一、创建云主机 登录阿里云账户之后&#xff0c;点击控制台&#xff1a; 点击云服务器EC…

基于SSM的大学生心理素质测评及咨询平台系统设计与实现(源码+定制+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

vscode中配置python虚拟环境

python虚拟环境作用 Python虚拟环境允许你为每个独立的项目创建一个隔离的环境&#xff0c;这样每个项目都可以拥有自己的一套Python安装包和依赖&#xff0c;不会互相影响。实际使用中&#xff0c;可以在vscode或pycharm中使用虚拟环境。 1.创建虚拟环境的方法&#xff1a; …

天呐!关于PyCharm你竟然一无所知?

PyCharm 是一种专为 Python 开发而设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由 JetBrains 开发。 以下是 PyCharm 的一些主要特点和常见的使用方法&#xff1a; 特点&#xff1a; 智能代码编辑&#xff1a;具有智能代码补全、语法检查、代码重构等功能&…

HISTCITE分析进阶

不可否认histcite是一个很好的文献分析的工具,他能很好的找到最重要的那几篇文章,同时也能找到研究的发文趋势、研究机构和著名的研究学者等。但是它是一个很老的软件,因而很多东西都没能跟上下载的分析。我在使用过程中,尝试做一些改变使其更好用,同时也做一些记录。 1.…

ROS学习笔记(三):VSCode集成开发环境快速安装,以及常用扩展插件配置

文章目录 前言VSCode集成开发环境1 安装VSCode2 VSCode扩展插件2.1 VSCode扩展插件模块介绍2.1 常用扩展插件配置一、语言支持类插件二、智能辅助类插件三、科学计算与数据分析类插件四、ROS开发相关插件 3 总结相关链接 前言 关于Ubuntu与ROS的常规安装&#xff0c;可以看这几…

数字经济与新质生产力:地理信息与遥感视角下的深度分析

在数字化浪潮的推动下&#xff0c;我们正见证着生产力的一次历史性飞跃。数字经济如何重塑生产力的三大要素&#xff1a;劳动对象、劳动资料和劳动者&#xff1f;让我们来深度分析数字经济如何推动新质生产力的发展。 一、数字经济与地理信息的融合 地理信息与遥感技术是数字…

如何在 Windows 10 上恢复未保存/删除的 Word 文档

您是否整夜都在处理重要的 word 文件&#xff0c;但忘记保存它&#xff1f;这篇文章是给你的。在这里&#xff0c;我们将解释如何恢复未保存的 word 文档。除此之外&#xff0c;您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生&#xff0c;每个人都了解丢失重要 W…

【Android 14源码分析】WMS-窗口显示-流程概览与应用端流程分析

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

资源《Arduino 扩展板1-LED灯》说明。

资源链接&#xff1a;Arduino 扩展板1-LED灯 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件主要有…

Pytorch实现RNN实验

一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络&#xff08;RNN&#xff09;的基本原理&#xff1a;通过构建一个基于RNN的诗歌生成模型&#xff0c;学会RNN是如何处理序列数据的&#xff0c;以及如何在…

计算机毕业设计Spark+PyTorch股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《SparkPyTorch股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣&#xff0c;股票投资已成为广大投资者的重要选择之一。然而&#xff0c;股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票分析方…

防sql注入的网站登录系统设计与实现

课程名称 网络安全 大作业名称 防sql注入的网站登录系统设计与实现 姓名 学号 班级 大 作 业 要 求 结合mysql数据库设计一个web登录页面密码需密文存放&#xff08;可以采用hash方式&#xff0c;建议用sha1或md5加盐&#xff09;采用服务器端的验证码&#…

今天推荐一个文档管理系统 Dorisoy.Pan

Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统&#xff0c;它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术&#xff0c;以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端&#xff0c;包括网站、Android、iO…

PID控制原理:看下这三个故事,你就明白了

一、PID的故事 小明接到这样一个任务&#xff1a;有一个水缸点漏水(而且漏水的速度还不一定固定不变)&#xff0c;要求水面高度维持在某个位置&#xff0c;一旦发现水面高度低于要求位置&#xff0c;就要往水缸里加水。 小明接到任务后就一直守在水缸旁边&#xff0c;时间长就觉…

Python | Leetcode Python题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; class Solution:def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:cur, curParent root, Nonewhile cur and cur.val ! key:curParent curcur cur.left if cur.val > key else cur.rightif cur i…

Linux学习笔记(四):组与权限、任务调度、磁盘管理、网络配置、进程管理

Linux学习笔记&#xff08;四&#xff09;&#xff1a;组与权限、任务调度、磁盘管理、网络配置、进程管理 1. 组与权限 1.1 文件所有者 查看文件所有者&#xff1a; 使用 ls -ahl 或 ll 命令可以查看文件的详细信息&#xff0c;其中包括文件所有者。 修改文件所有者&…