学生通讯系统课程设计

学生通讯系统课程设计

1.本课程设计的目的
(1)熟练掌握C语言的基本知识和技能;
(2)掌握线性表的链式存储结构;
(3)掌握结构体相关操作;
(4)熟悉链式结构的查询,插入,删除功能;
(5)培养分析、解决问题的能力;提高学生的科技论文写作能力。

2.课程设计的任务及要求
1)基本要求:
(1)设计一个的菜单将在实现的功能显示出来,并有选择提示
(2)能够查询全部成员清单;
(3)能够按号码或姓名查询某一个成员的信息
(4)能够增加、删除、修改某一个成员的信息
(5)要求有错误提示功能,例如性别只能输入F,M,输入错误提示重新输入

2)创新要求:
将通讯录信息保存为文件,能够写入与读出。

问题描述
(描述要求编程解决的问题)

  1. 实现学生通讯系统的主界面,并且能够动态刷新。
  2. 实现学生通讯系统的增加通讯信息的操作,能够提示输入,并且在添加完一个学生的信息后提示是继续添加还是退出添加界面,并在添加完成后退出此界面。
  3. 实现学生通讯系统的删除学生通讯信息的操作,能够提示输入要删除的学生的姓名,并且在屏幕上输出要删除学生的全部信息,以防止删错人,并且能在当前系统学生信息为空时提示当前通讯录为空,而且还可以在删除完毕后提示是否退出此界面。
  4. 实现学生通讯系统的修改学生信息的操作,能够提示输入要修改学生的姓名,并在屏幕上输出该学生的全部信息,并且能在当前系统学生信息为空时提示当前通讯录为空,而且还可以在修改完毕后显示修改后的该学生的全部信息并提示是否退出此界面。
  5. 实现学生通讯系统的查询学生信息的操作,能够提示输入要查询学生的姓名或者手机号,并在屏幕上输出该学生的全部信息,以及提示查询成功。
  6. 实现学生通讯系统的输出全部学生的全部信息的功能,通过对单链表的遍历一一输出各个学生的全部信息。
  7. 实现学生通讯系统的文件操作,能够将学生通讯系统内的所有学生信息输出到文件中,并能在进入学生通讯系统时自动导入文件中的学生信息,且能动态实时刷新——在增删改操作后文件中的学生信息能够做出同时的改变。
    内容简介
    2.1 基本要求:
    (给出程序要达到的具体的要求。)
  8. 学生通信系统具有显示本系统的所有功能的菜单,能够增加、删除、修改某一个成员的信息。
  9. 学生通信系统能够查询全部成员清单,能够按号码或姓名查询某一个成员的信息
  10. 设计一个的菜单将在实现的功能显示出来,并有选择提示,并且有错误提示功能,例如性别只能输入F,M,输入错误提示重新输入。
  11. 本系统采用了文件操作,将所有的学生信息存入文件中,尽可能确保学生信息保存的完整性,
  12. 本系统调用了windows 的API函数去对使用本系统的客户进行提示,尽极大可能的增加客户的使用舒适度

源代码如下:

#include<iostream>
#include<graphics.h>
#include<fstream>
#include<string>
using namespace std;

typedef struct _T_data {
	char name[12];
	char sex;
	char tel[12];
}T_data;
typedef T_data* Pt_data;

typedef struct _T_students {
	T_data data;
	struct _T_students * pt_next;
}T_student;
typedef T_student* Pt_student;

char MyName[12];
char MySex;
char MyTel[12];

void AddStudnet(Pt_student &head);//增添学生
bool DelStudent(Pt_student &head);//删除学生
bool UpdateStudent(Pt_student &head);//修改学生
bool Querystudent(Pt_student &head);//查询学生
bool ClearListStudent(Pt_student &head);//清除链表学生
void ClearFileStudent();//清除文件中的学生信息
bool Query(Pt_student &head, int choice);//查询学生实现
bool DisplayStudent(Pt_student &head);//展示链表中的所有学生信息
void LoadStudent(Pt_student &head);//从文件中导入学生信息
void Input(int flag);//输入学生信息
void Output(Pt_student &head);//输出学生信息
void Menu();//程序界面主菜单

void Menu()
{
	cout << "****************************************************" << endl;
	cout << "\t\t欢迎来到学生通讯系统" << endl;
	cout << "****************************************************" << endl;
	cout << "\t\t1.添加联系人" << endl;
	cout << "\t\t2.删除联系人" << endl;
	cout << "\t\t3.修改联系人" << endl;
	cout << "\t\t4.查找联系人" << endl;
	cout << "\t\t5.清空通讯录" << endl;
	cout << "\t\t6.显示通讯录" << endl;
	cout << "\t\t7.退出通讯录" << endl;
	cout << "____________________________________________________" << endl;
}

void Input(int flag)
{
	switch (flag)
	{
	case 1:
			cout << "请输入学生姓名:";
			cin >> MyName;
			break;
	case 2:
		while (1)
		{
			cout << "请输入学生性别(F或M):";
			cin >> MySex;
			if (MySex != 'F' && MySex != 'M')
			{
				MessageBox(0, _T("输入错误,请重新输入"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
				continue;
			}
			break;
		}
		break;
	case 3:
		cout << "请输入学生电话:";
		cin >> MyTel;
		break;
	}
}
void AddStudnet(Pt_student &head)
{
	while (1)
	{
		cout << "****************************************************" << endl;
		Pt_student temp;
		temp = (Pt_student)malloc(sizeof(T_student));
		temp->pt_next = NULL;
		Input(1);
		strcpy(temp->data.name,MyName);
		Input(2);
		strcpy(&temp->data.sex, &MySex);
		Input(3);
		strcpy(temp->data.tel, MyTel);
		temp->pt_next = head->pt_next;
		head->pt_next = temp;
		cout << "\t添加成功" << endl;
		if (MessageBox(0, _T("是否继续添加联系人"), _T("请选择"), MB_YESNO|MB_ICONQUESTION) == IDNO)
			break;
	}
}

void Output(Pt_student &head)
{
	cout << "****************************************************" << endl;
	cout << "\tname" << "\t\tsex" << "\t\ttel" << endl;
	cout << "\t" << head->data.name << "\t\t" << head->data.sex << "\t\t" << head->data.tel << endl;
}

bool Query(Pt_student &head,int choice)
{   
	bool flag = false;
	Pt_student temp = NULL;
	if (1 == choice)
	{
		Input(1);
		for (temp = head; temp->pt_next != NULL; temp = temp->pt_next)
			if (!strcmp(temp->pt_next->data.name,MyName))
			{
				Output(temp->pt_next);
				flag = true;
			}			
	}
	else 
	{
		Input(3);
		for (temp = head; temp->pt_next != NULL; temp = temp->pt_next)
			if (!strcmp(temp->pt_next->data.tel,MyTel))
			{
				Output(temp->pt_next);
				flag = true;
			}
	}
	return flag;
}
bool Querystudent( Pt_student &head)
{
	bool flag = false;
	if (head->pt_next == NULL)
	{
		MessageBox(0, _T("当前通讯录为空,请先添加"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
		return false;
	}
	int choice = 1;
	cout << "****************************************************" << endl;
	cout << "\t1.学生姓名查询" << endl;
	cout << "\t2.学生手机号查询" << endl;
	cout << "----------------------------------------------------" << endl;
	while (1)
	{
		cout << "\t请输入你选择的查询方式(1或2):";
		cin >> choice;
		if (choice != 1 && choice != 2)
		{
			MessageBox(0, _T("输入错误,请重新输入"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
			continue;
		}		
		break;
	}
	if (!Query(head, choice))
		MessageBox(NULL, _T("查无此人,是否退出"), _T("提示"), MB_OK | MB_ICONQUESTION);
	else
		MessageBox(NULL, _T("查找成功,是否退出"), _T("提示"), MB_OK | MB_ICONQUESTION);
	return true;
}

bool DelStudent(Pt_student &head)
{
	if (head->pt_next == NULL)
	{
		MessageBox(0, _T("当前通讯录为空,请先添加"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
		return false;
	}	
	Pt_student pretemp,temp;
	cout << "----------------------------------------------------" << endl;
    cout << "\t请输入你要删除的学生信息:" << endl;
	Input(1);
	for (pretemp = head; pretemp->pt_next != NULL; pretemp = pretemp->pt_next)
		if (!strcmp(pretemp->pt_next->data.name , MyName))
		{
			cout << "要删除的学生的信息如下" << endl;
			Output(pretemp->pt_next);
			break;
		}
	if (pretemp->pt_next== NULL)
	{
		MessageBox(0, _T("查无此人,无法删除,是否退出"), _T("警告"), MB_OK | MB_ICONEXCLAMATION);
		return false;
	}
	temp = pretemp->pt_next;
	pretemp->pt_next = temp->pt_next;
	delete temp;
	MessageBox(NULL, _T("删除成功,是否退出"), _T("提示"), MB_OK | MB_ICONQUESTION);
	return true;
}
bool UpdateStudent(Pt_student &head)
{
	bool flag = false;
	if (head->pt_next == NULL)
	{
		MessageBox(0, _T("当前通讯录为空,请先添加"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
		return false;
	}
	Pt_student temp;
	cout << "----------------------------------------------------" << endl;
	cout << "\t请输入你要修改的学生信息:" << endl;
	Input(1);
	for (temp = head->pt_next; temp!= NULL; temp = temp->pt_next)
		if (!strcmp(temp->data.name , MyName))
		{
			cout << "\t修改之前的学生信息" << endl;
			Output(temp);
			break;
		}
	if (temp == NULL)
	{
		MessageBox(0, _T("查无此人,无法修改,是否退出"), _T("警告"), MB_OK | MB_ICONEXCLAMATION);
		return false;
	}
	cout << "\t请输入修改后的学生信息" << endl;
	Input(1);
	strcpy(temp->data.name, MyName);
	Input(2);
	strcpy(&temp->data.sex, &MySex);
	Input(3);
	strcpy(temp->data.tel, MyTel);
	cout << "\t修改之后的学生信息" << endl;
	Output(temp);
	MessageBox(NULL, _T("修改成功,是否退出"), _T("提示"), MB_OK | MB_ICONQUESTION);
	return true;
}
bool ClearListStudent(Pt_student &head)
{
	bool flag = false;
	if (head->pt_next == NULL)
	{
		MessageBox(0, _T("当前通讯录为空,请先添加"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
		return false;
	}
	Pt_student temp,tempnext;
	for (temp = head->pt_next; temp != NULL; temp = tempnext)
	{
		tempnext = temp->pt_next;
		delete temp;
	}
	head->pt_next = NULL;
	cout << "\t\t清空完毕" << endl;
	return true;
}
void ClearFileStudent()
{
	ofstream fout("students.txt", ios::trunc);
	fout.close();
}
bool DisplayStudent(Pt_student &head)
{
	
	bool flag = false;
	if (head->pt_next == NULL)
	{
		MessageBox(0, _T("当前通讯录为空,请先添加"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
		return false;
	}
	Pt_student temp = head->pt_next;
	for (; temp != NULL; temp = temp->pt_next)
		Output(temp);
	MessageBox(NULL, _T("全部信息以显示,是否退出"), _T("提示"), MB_OK | MB_ICONEXCLAMATION);
	return true;
}

//保存记录
void SaveStudent(Pt_student &head)
{
	Pt_student temp = head->pt_next;
	ofstream fout("students.txt");
	while (temp)
	{
		fout << temp->data.name << "\t" << temp->data.sex << "\t" << temp->data.tel <<"\n";
		temp = temp->pt_next;
	}
	fout.close();
	cout << "\t数据保存完毕!\n";
}
//读取记录
void LoadStudent(Pt_student &head)
{
	ifstream fin("students.txt");
	int i = 0;
	while (fin >>MyName>>MySex>>MyTel)
	{
		Pt_student temp = (Pt_student)malloc(sizeof(T_student));
		strcpy(temp->data.name, MyName);
		strcpy(&temp->data.sex, &MySex);
		strcpy(temp->data.tel, MyTel);
		temp->pt_next = head->pt_next;
		head->pt_next = temp;
		i++;
	}
	if (i == 0)
	{
		cout << "加载失败,目前文档内没有数据!" << endl;
		fin.close();
	}
	else
	{
		fin.close();
		cout << "已成功加载" << i << "行数据" << endl;
	}

}

int main()
{
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取当前窗口句柄
	SMALL_RECT rc;          //矩形结构体赋值
	rc.Left = 30;
	rc.Top = 30;
	rc.Right = 80;
	rc.Bottom = 70;
	//此时窗口的宽度为50,高度为20
	SetConsoleWindowInfo(hOut, TRUE, &rc);//窗口属性
	int choice;
	//构建一个带头结点的单链表
	Pt_student head;
	head = (Pt_student)malloc(sizeof(T_student));
	head->pt_next = NULL;

	LoadStudent(head);	//导入文件中的通信信息
	while (1)
	{
		system("cls");
		Menu();
		cout << "\t请输入你的选择(1-7):";
		cin >> choice;
		if (!(0==choice || 1==choice ||2==choice||3==choice||4==choice||5==choice||6==choice))
		{
			MessageBox(0, _T("输入错误,请重新输入"), _T("警告"), MB_OK|MB_ICONEXCLAMATION);
			continue;
		}	
		switch (choice)
		{
		case 1:
			system("cls");
			AddStudnet(head);
			ClearFileStudent();
			SaveStudent(head);
			break;
		case 2:
			system("cls");
			DelStudent(head);
			ClearFileStudent();
			SaveStudent(head);
			break;
		case 3:
			system("cls");
			UpdateStudent(head);
			ClearFileStudent();
			SaveStudent(head);
			break;
		case 4:
			system("cls");
			Querystudent(head);
			break;
		case 5:
			system("cls");
			ClearFileStudent();
			ClearListStudent(head);
			break;
		case 6:
			system("cls");
			DisplayStudent(head);
			break;
		case 7:
			system("cls");
			CloseHandle(hOut);
			exit(0);
		default:
			break;
		}
	}
	CloseHandle(hOut);
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值