课程设计

<img src="https://img-blog.csdn.net/20150114220838234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcW1qMzE0MTU5MjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20150114220801921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcW1qMzE0MTU5MjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />#include<iostream.h> 
#include<fstream.h> 
#include<string.h> 
#include<stdlib.h> 
#include<iomanip.h> 
struct data			//数据
{      
	char name[20];   //姓名
	char tel[20];   //电话
	int age;       //年龄
}; 
class node	//节点
{		
	friend class link; //友远类
	private:		
	data person;    //数据
	node * next; 
	node * pre; 
	public: 
	void show()		//显示数据信息 
	{ 
		cout<<"姓名:"<<setw(20)<<person.name<<endl; 
		cout<<"电话:"<<setw(20)<<person.tel<<endl; 
		cout<<"年龄:"<<setw(3)<<person.age<<endl<<endl; 
	} 
	node(char*name0="",char*tel0="",int age0=0)		//构造函数
	{ 
	strcpy(person.name,name0); 
	strcpy(person.tel,tel0); 
	person.age=age0; 
	next=NULL; 
	pre=NULL; 
	}
	node(node&n)		拷贝构造
	{ 
		strcpy(person.name,n.person.name); 
		strcpy(person.tel,n.person.tel); 
		person.age=n.person.age; 

	} 
}; 
class link{		//双向链表
	node * head;	//头指针
	node * rear;	//尾指针
	node * findbyname(char*name0,node *temp )		//查找姓名返回地址
	{ 
		temp=head;
		if(!head)		//空链表
		{
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return NULL; 
		}
		node * p=head; 
		while(p){ 
		if(strcmp(p->person.name,name0)==0)		//已找到
		return p; 
		p=p->next; 
		} 
		while(temp){
		if(Cmpstr(temp->person.name,name0))
		{
			cout<<endl<<"符合条件的记录,如下: "<<endl;
			temp->show();
		}
		temp=temp->next;
		}
			//if(temp)
			//	cout<<"查无此人"<<endl<<endl;//未找到}
		return temp; 
	}
		node * findbyname(char*name0)		//查找姓名返回地址
	{ 
		if(!head)		//空链表
		{
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return NULL; 
		}
		node * p=head; 
		while(p){ 
		if(strcmp(p->person.name,name0)==0)		//已找到
		return p; 
		p=p->next; 
		} 
		if(!p)
	    cout<<"查无此人"<<endl<<endl;

		return NULL;//未找到
		}
	int length()	//返回链表长度
	{ 
		if(!head) 
			return 0; 
		node*p; 
		int n=1; 
		p=head; 
		if(p->next)
		{ 
			p=p->next; 
			n++; 
		} 
		return n; 
	} 
	node * findbynum(int num)	//根据序号查找
	{ 
		int l=length();			//l为总长
		if(!head)			//空链表
		{ 
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return NULL; 
		}
		if(num>l)		//数据越界
		{
			cout<<"通讯录里没有"<<num<<"条信息"<<endl<<endl; 
			return NULL; 
		}
		node * p=head; 
		while(--num) 
			p=p->next; 
		return p;		//返回指针
} 
void change(node*p)//修改对应指针信息
{
	char tel0[20]; 
	int age0,cho; 
	cout<<"请输入新的电话号码"<<endl; 
	cin>>tel0; 
	cout<<"请输入新的年龄"<<endl; 
	cin>>age0; 
	cout<<"姓名:"<<p->person.name<<endl; 
	cout<<"原电话号码:"<<setw(20)<<p->person.tel<<endl; 
	cout<<"原年龄:"<<setw(3)<<p->person.age<<endl<<endl; 
	cout<<"新电话号码:"<<setw(20)<<tel0<<endl; 
	cout<<"新年龄:"<<setw(3)<<age0<<endl<<endl; 
	cout<<"1.确认		2.取消"<<endl;
	cin>>cho;
	if(cho==1)
	{
		strcpy(p->person.tel,tel0); 
		p->person.age=age0; 
		cout<<"已修改成功"<<endl;
	}
}
void del(node *p)	//删除一个节点
{
	if(!head)		//空链表
		{
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return ; 
		}
	if(p==head)			//删除头结点
	{	
		p->next->pre=NULL; 
		head=p->next; 
		delete p; 
		return; 
	} 
	if(p==rear)		//删除尾节点
	{ 
		p->pre->next=NULL; 
		rear=p->pre; 
		delete p; 
		return; 
	} 
	p->next->pre=p->pre;	//删除中间节点
	p->pre->next=p->next; 
	delete p; 
} 
void delall()		//删除整个链表
{ 
	node*p; 
	while(head)
	{ 
		p=head; 
		head=head->next; 
		delete p; 
	} 
	head=rear=NULL; 
} 
public: 
	link()		//构造函数
	{ 
		head=rear=NULL; 
	} 
	~link(){		//析构函数,同时释放链表空间
	delall(); 
	} 
	node * cinnode()		//从键盘输入生成一个节点
	{ 
		char name[20],tel[20]; 
		int age; 
		node*p; 
		p=new node; 
		cout<<"请输入姓名"<<endl; 
		cin>>name; 
		cout<<"请输入电话号码"<<endl; 
		cin>>tel; 
		cout<<"请输入年龄"<<endl; 
		cin>>age; 
		*p=node(name,tel,age); 
		return p; 
	}
	void insert(node *p)		//将节点插入链表
	{ 
		node *p1,*p2; 
		if(head==0)			//空链表
		{   
			p->next=0; 
			p->pre=0; 
			head=rear=p; 
			return; 
	} 
	if(strcmp(head->person.name,p->person.name)>0)
	{ 
		p->next=head; 
		head->pre=p; 
		p->pre=0; 
		head=p; 
		return; 
	} 
	if(strcmp(rear->person.name,p->person.name)<0)
	{ 
		p->pre=rear; 
		rear->next=p; 
		p->next=0; 
		rear=p; 
		return ; 
	} 
	p1=p2=head; 
	while(strcmp(p2->person.name,p->person.name)<0)
	{ 
		p1=p2; 
		p2=p2->next; 
	} 
	p->next=p2;			//插入链表中间
	p2->pre=p; 
	p1->next=p; 
	p->pre=p1; 
}
void showfromhead()		//从前向后输出链表
{ 
	if(!head)				//空链表
		cout<<"通讯录无信息"<<endl;
	else{ 
		int c=0; 
		node *p; 
		p=head; 
		while(p)
		{ 
			p->show();		//调用函数显示信息 
			p=p->next; 
			c++; 
			//if(c%5==0)		//控制每输出 5 个暂停一次 
			//system("pause"); 
		} 
		cout<<"所有信息输出完成"<<endl; 
		
	} 
} 
void showfromrear()		//从后向前输出链表 
{
	if(!rear) 
		cout<<"通讯录无信息"<<endl; 
	else
	{ 
		int c=0; 
		node*p; 
		p=rear; 
		while(p)
		{ 
			p->show(); 
			p=p->pre; 
			c++; 
			if(c%6==0) 
				system("pause"); 
		} 
		cout<<"所有信息输出完成"<<endl; 
	} 
}

void showbyname(node *temp)	//根据姓名显示信息
{ 
	char name[20]; 
	cout<<"请输入欲查找的姓名"<<endl; 
	cin>>name; 
	node *p; 
	p=findbyname(name,temp);		//查找姓名所对应的指针
	if(p) 
		p->show(); 

} 
void changebyname()		//根据姓名修改信息
{ 
	char name[20]; 
	cout<<"请输入欲修改的姓名"<<endl; 
	cin>>name; 
	node*p; 
	p=findbyname(name); 
	if(p) 
		change(p); 
} 
void delbyname()		//根据姓名删除信息
{ 
	char name[20]; 
	if(!head)		//空链表
		{
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return ; 
		}
	cout<<"请输入欲删除的姓名"<<endl; 
	cin>>name; 
	node*p; 
	p=findbyname(name); 
	if(p) 
		del(p); 
	cout<<"已删除选定信息"<<endl; 
}
void showbynum()	//根据序号显示信息 
{ 
	int num; 
	if(!head)		//空链表
		{
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return ; 
		}
	cout<<"请输入欲查找编号"<<endl; 
	cin>>num; 
	node*p; 
	p=findbynum(num);	//根据序号查找指针
	if(p) 
		p->show(); 
} 
void delbynum()			//根据序号删除信息
{ 
	int num; 
	if(!head)		//空链表
		{
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return ; 
		}
	cout<<"请输入欲删除编号"<<endl; 
	cin>>num; 
	node*p; 
	p=findbynum(num); 
	if(p) 
		del(p); 
	cout<<"已删除选定信息"<<endl;
} 
void changebynum()	//根据序号修改信息
{ 
	int num;
	if(!head)		//空链表
		{
			cout<<"通讯录中没有信息"<<endl<<endl; 
			return; 
		}
	cout<<"请输入欲修改编号"<<endl; 
	cin>>num; 
	node*p; 
	p=findbynum(num); 
	if(p) 
		change(p);  
}
  bool Cmpstr(char*name_node,char*name_search)// 
	{
		if(name_search[0]=='*')  
			return true;
		char name1[20],name2[20]; 
		strncpy(name1,name_node,20);
		strncpy(name2,name_search,20);
		int size1=strlen(name1),size2=strlen(name_search);
		for(int i=0;i<size2;i++)
		{
			if(name2[i]>='A'&&name2[i]<='Z') 
				name2[i]+=32;
		}
		for(int i1=0;i1<size1;i1++)
		{
			if(name1[i1]>='A'&&name1[i1]<='Z') 
				name1[i1]+=32;
		}
				for(int i2=0;i2<size1;i2++)
		{
			if(name_search[i2]=='*')//通配符*,通配任意字符串,
			{
				for(int j=0;j<i2;j++)
				{
					if(name1[j]!=name2[j])
						return false;
				}
				return true;
			}
		}
		if(size1!=size2) 		{
			return false;
		}
		for(int i3=0;i3<size1;i3++)
		{
			if(name2[i3]=='?')/ 
				continue;
			if(name1[i3]!=name2[i3])
				return false;
		}
		return true;
	}

};
主函数:
#include "node.h"
void main();
char buffer[100];

void show_data(link &a){
	    char c;
		cout<<"查看全部数据"<<endl; 
		cout<<"1.顺序    2.逆序"<<endl;
		cin>>c; 
		if(c=='1')
		{  
			a.showfromhead(); 
			system("pause"); 
			cout<<endl<<endl;
 			system("cls");
			return;
			
		} 
		if(c=='2')
		{ 
			a.showfromrear(); 
			system("pause"); 
			cout<<endl<<endl; 
			system("cls");
		    return;
		}
		if(c!='1'&&c!='2')
		{
			cout<<"input error"<<endl;
			system("pause"); 
			cout<<endl<<endl;
			system("cls");
			void show_data(link &a);
	       	return;
		}
};
void delet_data(link &a){
	    char c;
		cout<<"删除数据"<<endl; 
		cout<<"1.根据序号删除数据	2.根据姓名删除数据"<<endl; 
		cin>>c; 
		if(c=='1')
		{ 
			a.delbynum(); 
			system("pause"); 
			cout<<endl<<endl;
			system("cls");
			
		} 
		if(c=='2')
		{ 
			a.delbyname(); 
			system("pause"); 
			cout<<endl<<endl; 
			system("cls");
			
		} 
		if(c!='1'&&c!='2')
		{
			cout<<"input error"<<endl;
			system("pause"); 
			cout<<endl<<endl;
			system("cls");
	void delet_data(link &a);
		}
};
void insert_data(link &a){
	    cout<<"添加数据"<<endl; 
		a.insert(a.cinnode()); 
		system("pause"); 
		cout<<endl<<endl; 
		system("cls");
};
void updata(link &a){
	    char c;
	    cout<<"修改数据"<<endl; 
		cout<<"1.根据序号修改数据	2.根据姓名修改数据"<<endl;
		cin>>c;
		if(c=='1')
		{ 
		a.changebynum(); 
		system("pause"); 
		cout<<endl<<endl; 
		system("cls");

		} 
		if(c=='2')
		{ 
			a.changebyname(); 
			system("pause"); 
			cout<<endl<<endl;
			system("cls");

		}
	    if(c!='1'&&c!='2')
		{
			cout<<"input error"<<endl;
			system("pause"); 
			cout<<endl<<endl;
			system("cls");
		void updata(link &a);
		}

};
void search_data(link &a){ 
	    char c;
		node *temp;
	    cout<<"查找数据"<<endl; 
		cout<<"1.根据序号查找数据	2.根据姓名查找数据(支持*与?的通配)"<<endl;
		cin>>c; 
		if(c=='1')
		{ 
			
			a.showbynum(); 
			system("pause"); 
			cout<<endl<<endl;
			system("cls");

		} 
		if(c=='2')
		{ 
			a.showbyname(temp);
			system("pause"); 
			cout<<endl<<endl; 
			system("cls");
		} 
		if(c!='1'&&c!='2')
		{
			cout<<"input error"<<endl;
			system("pause"); 
			cout<<endl<<endl;
			system("cls");
		void search_data(link &a);
	
		}

};
 
link a;
void menu(){
	
	char c;
	cout<<"\t\t 通讯录管理系统"<<endl; 
	cout<<"1.查看全部数据"<<endl; 
	cout<<"2.删除数据"<<endl; 
	cout<<"3.添加数据"<<endl; 
	cout<<"4.修改数据"<<endl; 
	cout<<"5.查找数据"<<endl; 
	cout<<"请输入您需要的功能"<<endl; 
	cin>>c; 
	
	switch(c)
	{ 
	case '1': 
		 show_data(a);
		 	menu();
			break;
	case '2': 
		 delet_data(a);
		 	menu();
			break;
	case '3': 
		 insert_data(a);
		 	menu();
			break;
	case '4': 
		 updata(a);
		 	menu();
			break;
	case '5': 
	     search_data(a);
		 	menu();
	    	break;
	case '6': 
		cout<<"从文件输入数据"<<endl; 
		a.inputnode(); 
		system("pause"); 
		cout<<endl<<endl; 
		system("cls");
		menu();
			break;
	case '7': 
		 output_data(a);
		 	menu();
	    	break;
	case '8': 
		cout<<"谢谢使用"<<endl; 
		return ; 
	default:{
	cin.clear();
		cin.getline(buffer,100);
	  cout<<"input error  "<<endl;
	  system("pause");
	  system("cls");
	  menu();
		
		}
	}
return;
}

void main()		//显示菜单,并调用对应函数
{

    menu();	
}

第一部分  绪论

1.1  课程设计的目的

通过设计一个较为简单的管理系统,进一步熟悉数据结构的概念实现方式。了解系统开发的需求分析、类层次设计、模块分析、编码测试、模块组装与整体调试的全过程,加深对C++的理解与Visual C++环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。

 

1.2  课程设计的背景与意义

    数据结构是一门实践性很强的学科,光靠读书听课是学不好的。衡量学习好坏的标准并不是听不听得懂,因此在强调多编程多实践。所以课程设计的目的,要熟练掌握数据结构的知识,C++语言的知识和基本技能,利用所学的知识解决面向对象的基本问题,这也是一个巩固基本知识的好的途径。

    

1.3  课程设计的环境

     本次课程设计采用的是Microsoft Visual C++6.0 编写程序。

 

 

第二部分  需求分析

2.1   问题论述

     为方面大家整理自己的联系人,告别杂乱无章的生活。简单整洁的通讯录是现在大众所需的必要产品。

   

2.2   功能要求

通讯录要求简单易用,所以通讯录应该有简单的输入、查删除的功能。

 

 第三部分   系统设计

 

3.1 项目说明

 

(1)技术可行性:处理速度快、准确通过权限的设置,数据的安全性好、方便查询、借阅管理等。   

(2)经济可行性:系统建设不需要很大的投入、可缩减人力投入。

(3)运行上可行性 

(4)从各种社会因素可行性分析:可降低工作人员工作强度,提高效率,会

得到学校工作人员的一致同意的。

综上所述通过可行性分析认为新系统的开发方案切实可行,可进行开发。

 

3.2 设计的思路和关键数据结构

 .程序流程

系统的执行应从功能菜单选择开始,依据用户的选择来进行后续的处理,直到用户选择退出系统为止,其间应对用户的选择做出判断及异常处理。系统的流程图如图所示:

 

 第四部分   实现功能

 

学校图书管理系统的开发主要要实现的目标有以下几个方面:

(1)界面设计友好、美观。

(2)数据存储安全、可靠。

(3)信息分类清晰、准确。

(4)强大的查询功能,保证数据查询的灵活性。

(5)提供灵活、方便的权限设置功能,使整个系统的管理分工明确。

(6)具有易维护性和易操作性。

 



  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值