1、学生活动管理系统:管理员能够登录该系统,可以设计学生活动基本信息,对学生活动信息能够进行录入、浏览、修改、删除、查找、退出系统等的操作,系统以菜单方式进行工作。学生活动信息应包括:活动时间、活动内容、活动场地等信息。学生可以登录该系统,显示的界面不同,学生可以进行浏览活动信息、报名参加活动、退出系统的操作。
2、程序编写可以两个文件,myList.h作为头文件,在这个头文件使用链表,指针实现数据元素的存储(按一定顺序存储),并编写一些函数,实现菜单里的功能;源.cpp进行调用myList.h里的函数,实现功能。
长久保存数据需要在编写程序时,进行文件的写入与读取。
3、代码实现。
myList.h 头文件
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
struct activity
//创建一个结构体,加入活动名字,时间,地点。内容。
{
char name[20];
char time[20];
char place[20];
char detail[20];
};
//结构分结构去写
struct Node
{
struct activity data;
struct Node* next;
};
//创建一个链表
struct Node* creatList()
{
//用一个结构体变量表示表头
//指针变成结构体变量,用动态内存申请,让指针能够表示变量
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
headNode->next = NULL;//表头做差异化处理,对指针域进行初始化
return headNode;
}
//创建结点
struct Node* createNode(struct activity data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
//newNode表示新的结点
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//插入结点
void insertNodeByHead(struct Node* headNode, struct activity data)
{
struct Node* newNode = createNode(data);//创建的结点加入到creatNode()中
//头插法,每一个新结点的next始终指向头节点的next;头节点的next始终指向新结点。
newNode->next = headNode->next;
headNode->next = newNode;
}
//指定位置删除活动;
void deleteAppoinNode(struct Node* headNode, char* name)
{
struct Node* posNode = headNode->next;
//posNode 表示为 指定结点,
//posFrontNode 表示为 指定删除节点的前面结点;
struct Node* posFrontNode = headNode;
if (posNode == NULL)
{
cout << "没有该项活动!\n";
return;
}
while (strcmp(posNode->data.name,name))
{
posFrontNode = posNode;
posNode = posFrontNode->next;
if (posNode == NULL)
{
cout << "未找到该活动!\n";
return;
}
}
posFrontNode->next = posNode->next;
free(posNode);//释放指定位置的结点。
}
//查找活动信息;
struct Node* searchInfoByData(struct Node* headNode, char* name) {
//只能以数据进行查找用 利用活动名称查找。
struct Node* posNode = headNode->next;
//posNode 表示为 指定结点,
//posFrontNode 表示为 指定删除节点的前面结点;
struct Node* posFrontNode = headNode;
if (posNode == NULL)
{
cout << "没有该项活动!\n";
return NULL;
}
while (strcmp(posNode->data.name, name))
{
posFrontNode = posNode;
posNode = posFrontNode->next;
if (posNode == NULL)
{
cout << "未找到该活动!\n";
return 0;
}
}
//return pmove;
return posNode;
}
//打印链表(浏览活动信息);
void printList(struct Node* headNode)//打印的是用headNode做表头的表示的链表
{
ofstream fout;
fout.open("test.txt");
//第一个结点没有做初始化数据,从第二个结点开始
struct Node* pmove = headNode->next;
cout << " 活动名字\t 时间\t 地点\t 内容\n";
while (pmove)
{
cout << pmove->data.name << "\t"<< pmove->data.time <<"\t"<<pmove->data.place<<"\t"<<pmove->data.detail<< endl;
fout<< "活动名字: \t 时间: \t 地点: \t 内容: ";
fout << pmove->data.name << "\t" << pmove->data.time << "\t" <<pmove-> data.place << "\t" <<pmove-> data.detail << endl;
//将活动的信息写入文件中
pmove = pmove->next;
}
cout << "\n";
fout.close();
}
源文件
#include<iostream>
#include"myList.h"
#include<fstream>
#include<string>
using namespace std;
struct Node* list = creatList();
void menu()//管理员菜单设计
{
cout << "------------【活动管理】---------------\n";
cout << "\t\t0、退出系统\n";
cout << "\t\t1、活动信息录入\n";
cout << "\t\t2、增加活动信息\n";
cout << "\t\t3、浏览活动内容\n";
cout << "\t\t4、修改活动信息\n";
cout << "\t\t5、删除活动信息\n";
cout << "\t\t6、查找活动信息\n";
cout << "------------------------------------------\n";
}
void menu1()//学生菜单设计
{
cout << "------------【活动管理】---------------\n";
cout << "\t\t0退出系统\n";
cout << "\t\t1浏览活动内容\n";
cout << "\t\t2报名参加活动\n";
}
void activities()
{
cout << "登录成功!\n";
string actname;
string b;
ifstream fin;
int choice = 0;
int s;
cin >> choice;
switch (choice) {
case 0:
cout << "正常退出系统!\n";
exit(0);
break;
case 1:
fin.open("test.txt", ios::in);
cout << "***********浏览活动的信息**********\n";
while (getline(fin, b)) {
cout << b << endl;
}
fin.close();
break;
case 2:
cout << "***********报名参加活动*************\n";
cout << "想报名参加活动的名称\n";
cin >> actname;
cout << "do you want to participat the activity? (yes=1||no=0)\n";
cin >> s;
if (s == 1)
{
cout << "报名" << actname << "成功,请按时参加活动\n";
}
else {
cout << "不报名参加活动\n";
}
break;
default:
cout << "输入错误,请重新选择!\n";
break;
}
}
void keyDown()//根据所选的菜单选项,做相应的事。
{
cout << "登陆成功!\n";
struct Node* pmove = NULL;//动态指针pmove 初始化
int choice = 0;
struct activity data;
cin >> choice;
//fout.open("test.txt",'w');
switch(choice)
{
case 0:
cout << "正常退出!\n";
exit(0);
break;
case 1:
//fout.open("test.txt",'w');
cout << "***********录入活动信息**********\n";
//即插入链表
cout << "请输入活动的名称,时间,地点,内容。\n";
fflush(stdin);//清空处理
cin >> data.name;
cin >> data.time;
cin >> data.place;
cin >> data.detail;
//调用myList.h里面的插入函数;
insertNodeByHead(list, data);
break;
case 2:
//fout.open("test.txt");
cout << "***********增加活动信息****\n";
//即插入链表
cout << "请输入活动的名称,时间,地点,内容。\n";
fflush(stdin);//清空处理
cin >> data.name;
cin >> data.time;
cin >> data.place;
cin >> data.detail;
insertNodeByHead(list, data);
break;
case 3:
cout << "***********浏览活动信息**********\n";
//打印链表
printList(list);
break;
case 4:
cout << "***********修改活动信息**********\n";
cout << "输入你要修改的信息\n";
cin >> data.name;
deleteAppoinNode(list, data.name);
cout << "请输入你要修改的信息:\n";
cin >> data.name;
cin >> data.time;
cin >> data.place;
cin >> data.detail;
insertNodeByHead(list, data);
break;
case 5:
cout << "***********删除活动信息**********\n";
cout << "输入你要删除的活动名称\n";
cin >> data.name;
deleteAppoinNode(list,data.name);
break;
case 6:
cout << "***********查找活动信息**********\n";
cout << "输入要查找的活动名称:\n";
cin >> data.name;
pmove = searchInfoByData(list, data.name);
//pmove初始化
if (pmove == NULL)
{
//cout << "未找到该活动!\n";
system("pause");
}
else {
cout << "活动名字: \t时间: \t地点: \t内容: \n";
cout << pmove->data.name <<"\t"<<pmove->data.time<<"\t"<<pmove->data.place<<"\t"<<pmove->data.detail<< endl;
}
break;
default:
cout << "输入错误!请重新输入\n";
break;
}
}
int main()
{
char a[20] = "score.txt";
struct activity data;
int adnum=2233,stnum=1122,zhanghao;
int password1 = 123, password2 = 456,password;
cout << "请输入账号、密码。\n";
cin >> zhanghao;
cin >> password;
switch(zhanghao)
{
case 2233:
if (password == 123)
{
cout << "管理员身份登陆成功\n";
while (1)
{
menu();
keyDown();
system("pause");
system("cls");
}
}
else {
cout << "登录失败!\n";
}
break;
case 1122:
if (password == 456)
{
cout << "学生身份登录成功!\n";
while (1)
{
menu1();
activities();
system("pause");
system("cls");
}
}
else {
cout << "登录失败!\n";
}
break;
default:
cout << "登陆失败!\n";
break;
}
return 0;
}