数据结构-课程设计-职工管理系统

职工管理管理系统--课程设计

本次课程设计,我还挺幸运的,抽到一道这么简单的题,思路很简单,但拓展很强,相比其他同学的,我这个简直是。。。,真是运气太好了,
代码写了1500多行吧,做课程设计中,我也学到了很多东西,代码太多,就放到了github上了

下面是一个总体概述,和一个README.md
其中README中以前分开写过,这次把他都写到了一起,所以就有点多~~~

先来一个总体概述:
1.fstream的使用

  1. 字符串使用

3.排序的实现

排序使用的选择排序,采用的存储方式为链式结构,根据对象的age进行排序参考的代码为运用链表进行选择排序

  1. 1:加入对年纪的判断,确保输入的年纪在正确范围内
    2:加入对电话号码的判断,保证格式正确

5.实现文件分离

6.添加若文件里没有数据显示没有数据

  1. 添加退出选择功能
  2. 添加学历选择功能

9.添加性别选择功能,若选择错误需进行重新选择

  1. 添加id排除重复功能 ,输入重复的需进行重新选择
  2. 修改数据是所有的查找不到的会提示没有此人,并进行重新输入,直到输入的id号存在;

12.日期函数

13.使用结构 tm 格式化时间

14.#include <sstream>时间的格式化

15.名字按字典排序,升序和降序;

16每次添加新员工,默认按名字字典升序写入文件;

17.增加修改成员界面的返回上一页功能;

18.美化界面

19.自动生成排序数据

20.不写了,好好复习下周的期末考试~~~~~~~~~!

fstream的使用

  • ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息。
  • ifstream 该数据类型表示输入文件流,用于从文件读取信息。
  • fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 和 。

打开文件

在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。

下面是 open() 函数的标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void open(const char *filename, ios::openmode mode);

在这里,open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。
模式标志 描述

ios::app ---- 追加模式。所有写入都追加到文件末尾。

ios::ate ---- 文件打开后定位到文件末尾。

ios::in ---- 打开文件用于读取。

ios::out ---- 打开文件用于写入。

ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。

您可以把以上两种或两种以上的模式结合使用。例如,如果您想要以写入模式打开文件,并希望截断文件,以防文件已存在,那么您可以使用下面的语法:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

类似地,您如果想要打开一个文件用于读写,可以使用下面的语法:

ifstream  afile;
afile.open("file.dat", ios::out | ios::in );

关闭文件

当 C++ 程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。但程序员应该养成一个好习惯,在程序终止前关闭所有打开的文件。

下面是 close() 函数的标准语法,close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void close();

写入文件

在 C++ 编程中,我们使用流插入运算符( << )向文件写入信息,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里您使用的是 ofstream 或 fstream 对象,而不是 cout 对象。

读取文件

在 C++ 编程中,我们使用流提取运算符( >> )从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里您使用的是 ifstream 或 fstream 对象,而不是 cin 对象。

读取 & 写入实例

下面的 C++ 程序以读写模式打开一个文件。在向文件 afile.dat 写入用户输入的信息之后,程序从文件读取信息,并将其输出到屏幕上:
实例

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{

   char data[100];

   // 以写模式打开文件
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: ";
   cin.getline(data, 100);

   // 向文件写入用户输入的数据
   outfile << data << endl;

   cout << "Enter your age: ";
   cin >> data;
   cin.ignore();

   // 再次向文件写入用户输入的数据
   outfile << data << endl;

   // 关闭打开的文件
   outfile.close();

   // 以读模式打开文件
   ifstream infile;
   infile.open("afile.dat"); 

   cout << "Reading from the file" << endl;
   infile >> data; 

   // 在屏幕上写入数据
   cout << data << endl;

   // 再次从文件读取数据,并显示它
   infile >> data;
   cout << data << endl; 

   // 关闭打开的文件
   infile.close();

   return 0;
}

当上面的代码被编译和执行时,它会产生下列输入和输出:

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

上面的实例中使用了 cin 对象的附加函数,比如 getline()函数从外部读取一行,ignore() 函数会忽略掉之前读语句留下的多余字符。

文件位置指针

istream 和 ostream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数包括关于 istream 的 seekg("seek get")和关于 ostream 的 seekp("seek put")。

seekg 和 seekp 的参数通常是一个长整型。第二个参数可以用于指定查找方向。查找方向可以是 ios::beg(默认的,从流的开头开始定位),也可以是 ios::cur(从流的当前位置开始定位),也可以是 ios::end(从流的末尾开始定位)。

文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。下面是关于定位 "get" 文件位置指针的实例:
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg( n );

// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );

// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );

// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );

C++ 字符串

  • C++ 提供了以下两种类型的字符串表示形式:

    • C 风格字符串
    • C++ 引入的 string 类类型

C 风格字符串

C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0‘ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个。

char greeting[6] = {‘H‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘, ‘\0‘};

依据数组初始化规则,您可以把上面的语句写成以下语句:

char greeting[] = "Hello";

C/C++ 中定义的字符串

不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 ‘\0‘ 放在字符串的末尾

实例

#include <iostream>

using namespace std;

int main ()
{
   char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

   cout << "Greeting message: ";
   cout << greeting << endl;

   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Greeting message: Hello

C++ 中有大量的函数用来操作以 null 结尾的字符串:

strcpy(s1, s2);----复制字符串 s2 到字符串 s1。

strcat(s1, s2);----连接字符串 s2 到字符串 s1 的末尾。

strlen(s1);----返回字符串 s1 的长度。

strcmp(s1, s2);----如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。

strchr(s1, ch);----返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

strstr(s1, s2);----返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

C++ 中的 String 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:

现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看下这个实例,等理解了面向对象的概念之后再回头来理解这个实例。

实例

#include <iostream>
#include <string>

using namespace std;

int main ()
{
   string str1 = "Hello";
   string str2 = "World";
   string str3;
   int  len ;

   // 复制 str1 到 str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;

   // 连接 str1 和 str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;

   // 连接后,str3 的总长度
   len = str3.size();
   cout << "str3.size() :  " << len << endl;

   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

str3 : Hello
str1 + str2 : HelloWorld
str3.size() :  10

排序的实现

排序使用的选择排序,采用的存储方式为链式结构,根据对象的age进行排序参考的代码为运用链表进行选择排序,参考的代码如下:

这段代码为实验课上所写代码

void LinkedListSelectSort(LinkList head){
    LinkList save,r,p,q,s; //list指向头结点
        save = head;
        while(save->next){
                q = save->next;
                r=q;
                p=q->next;
                while(p){
                    if (p->data < q->data) //寻找值最小结点与其前驱结点
                    {
                        s = r;
                        q=p;
                    }
                    r = p;
                    p=p->next;
                }
                if (q!=save->next) //若最小结点不是第一个未排序结点
                {
                    s->next = q->next;
                    q->next = save->next;
                    save->next = q;
                } //将最小结点与前面一个链结点交换位置
                save = q;
        }
}

根据定义的对象进行适当的修改,即可实现升序与降序。
因为每次执行while函数是会进行文件的读,排序结束是也会对文件进行写,所以test.txt里的内容也会跟着改变;

加入一些判断

1:加入对年纪的判断,确保输入的年纪在正确范围内
2:加入对电话号码的判断,保证格式正确

实现文件分离

1.头文件中不要使用using namespace,由于c++编译的特性,由于初学还没深入了解,不做具体编译的解释
2.由于没有了命名空间,所以string定义要写成std::string
3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h

main.cpp

#include <iostream>
#include <string>
#include <fstream>

#include "staff.cpp"

staff.cpp

#include <iostream>
#include <string>
#include <fstream>
#include "staff.h"

using namespace std;

这样就可以通过编译了

第二次上机试验

添加若文件里没有数据显示没有数据

添加退出选择功能

添加学历选择功能

添加性别选择功能,若选择错误需进行重新选择

添加id排除重复功能 ,输入重复的需进行重新选择

修改数据是所有的查找不到的会提示没有此人,并进行重新输入,直到输入的id号存在;

学习日期函数

C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 头文件。

有四个与时间相关的类型:clock_t、time_t、size_t 和 tm。类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。

结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:

struct tm {
  int tm_sec;   // 秒,正常范围从 0 到 59,但允许至 61
  int tm_min;   // 分,范围从 0 到 59
  int tm_hour;  // 小时,范围从 0 到 23
  int tm_mday;  // 一月中的第几天,范围从 1 到 31
  int tm_mon;   // 月,范围从 0 到 11
  int tm_year;  // 自 1900 年起的年数
  int tm_wday;  // 一周中的第几天,范围从 0 到 6,从星期日算起
  int tm_yday;  // 一年中的第几天,范围从 0 到 365,从 1 月 1 日算起
  int tm_isdst; // 夏令时
}

当前日期和时间

下面的实例获取当前系统的日期和时间,包括本地时间和协调世界时(UTC)。
实例

#include <iostream>
#include <ctime>

using namespace std;

int main( )
{
   // 基于当前系统的当前日期/时间
   time_t now = time(0);

   // 把 now 转换为字符串形式
   char* dt = ctime(&now);

   cout << "本地日期和时间:" << dt << endl;

   // 把 now 转换为 tm 结构
   tm *gmtm = gmtime(&now);
   dt = asctime(gmtm);
   cout << "UTC 日期和时间:"<< dt << endl;
}

当上面的代码被编译和执行时,它会产生下列结果:


本地日期和时间:Sat Jan  8 20:07:41 2011

UTC 日期和时间:Sun Jan  9 03:07:41 2011

使用结构 tm 格式化时间

tm 结构在 C/C++ 中处理日期和时间相关的操作时,显得尤为重要。tm 结构以 C 结构的形式保存日期和时间。大多数与时间相关的函数都使用了 tm 结构。下面的实例使用了 tm 结构和各种与日期和时间相关的函数。

在练习使用结构之前,需要对 C 结构有基本的了解,并懂得如何使用箭头 -> 运算符来访问结构成员。
实例

#include <iostream>
#include <ctime>

using namespace std;

int main( )
{
   // 基于当前系统的当前日期/时间
   time_t now = time(0);

   cout << "1970 到目前经过秒数:" << now << endl;

   tm *ltm = localtime(&now);

   // 输出 tm 结构的各个组成部分
   cout << "年: "<< 1900 + ltm->tm_year << endl;
   cout << "月: "<< 1 + ltm->tm_mon<< endl;
   cout << "日: "<<  ltm->tm_mday << endl;
   cout << "时间: "<< ltm->tm_hour << ":";
   cout << ltm->tm_min << ":";
   cout << ltm->tm_sec << endl;
}

当上面的代码被编译和执行时,它会产生下列结果:

1970 到目前时间:1503564157
年: 2017
月: 8
日: 24
时间: 16:42:37

时间的格式化

用到了#include <sstream>
c++ int i,j,k; stringstream s;//包含在sstream头文件里 s<<1234; string ch = s.str(); cout<<ch<<endl; while(1); return 0;

具体怎么用的在代码中有所体现;

出生日期的计算:根据年龄,月份和日子自己输入;

第三次实验课

完成名字按字典排序,整段程序默认按字典写入文件中,每次排序完毕显示排序过后的数据

优化了界面,增加了修改界面可以返回上一界面

自动生成排序数据

原文地址:https://www.cnblogs.com/ygjzs/p/12142660.html

时间: 2024-10-06 20:55:41

数据结构-课程设计-职工管理系统的相关文章

数据结构课程设计论文--学生信息管理系统

数据结构课程设计论文--学生信息管理系统 1.学生成绩分析问题 (1)问题描述.录入并保存一个班级学生多门课程的成绩,并对成绩进行分析. (2)基本要求.a)通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat.b)对文件input.dat中的数据进行处理,要求具有如下功能:按各门课程成绩排序,并生成相应的文件输出:计算每个人的平均成绩,按平均成绩排序,并生成文件:求出各门课程的平均成绩.最高分.最低分.不及格人数.60~69分人数.70~79分人数.80~89分人数.90分以上

数据结构——课程设计

  <数据结构课程设计>   课程题目 模拟电话客服管理系统 课程编号 j1620102 学生姓名 吴佳煜 所在专业 信息管理与信息系统 所在班级 信管1133 任课老师 易学明 实习时间 二〇一四年十二月二十五日 设计成绩 老师评语 一.课程设计题目 赵斌是一个信管专业的学生,大学四年顺利毕业了.在毕业季,他也像其他学子一样,投身于求职大军,投出一份又一份求职简历,在苦苦地等待之后,他接到了中国移动通信公司广东分司的面试通知书,通知他于本月1号10点到公司面试.当天,晴空万里,艳阳高照,他身

数据结构课程设计题目四_二叉树

本文出自:http://blog.csdn.net/svitter 题目4:二叉树 给出一颗无线的二叉树.树的每一个结点用一整数对标识.二叉树构造如下 树根被标识为(1, 1): 如果一个结点被标识为(a, b), 则其左孩子被标识为(a+b,b),右孩子被标识为(a, a+b).现在给出某一结点(a, b),求树根到该结点的最短路径,并且同时求出从树根出发向左走和向右走的次数.建议完成人数1人. 注:此处使用了STL_stack库函数,是不允许的,我图方便. //===============

数据结构课程设计

20. 公交线路上优化路径的查询  问题描述 最短路径问题是图论中的一个经典问题,其中的Dijkstra算法一直被认为是图论中的好算法,但有的时候需要适当的调整Dijkstra算法才能完成多种不同的优化路径的查询. 对于某城市的公交线路,乘坐公交的顾客希望在这样的线路上实现各种优化路径的查询.设该城市的公交线路的输入格式为: 线路编号:起始站名(该站坐标):经过的站点1名(该站坐标):经过的站点2名(该站坐标):--:经过的站点n名(该站坐标):终点站名(该站坐标).该线路的乘坐价钱.该线路平均

数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)

本文出自:http://blog.csdn.net/svitter 题目12:计算机学院学生会的打印机(优先队列) 小明抱怨学生会的打印机不符合FIFO的原则,看到很多在他后面来打印的同学比他先打印出来.五分钟前,小明的文件就是下一个候选的,如今小明的文件又排到了后面.学生会的同学给小明解释说,学生会的打印机不是採用传统的队列方式,而是採用一种自定义的优先队列方式:每一个要打印的文件被赋予了一个从1到9的优先级(9最高,1最低).打印规定例如以下: 将队列中要打印的文件f从队列中拿出来: 假设在

数据结构课程设计之一元多项式的计算

数据结构不是听会的,也不是看会的,是练会的,对于写这么长的代码还是心有余也力不足啊,对于指针的一些操作,也还是不熟练,总出现一些异常错误,对于数据结构掌握还是不够啊,还是要多练,这个课程设计做的还是有点粗糙,还有待改进啊!! 对代码有进行了一下改进,增加了排序的模块:可能还存在着一下小bug,发现了再更新:减法还可以写的更简便一点. <pre name="code" class="cpp">#include <stdio.h> #includ

数据结构课程设计《稀疏矩阵运算器》

最近正在弄数据结构课程设计内容,说实话,感觉自己数据结构学的就是渣,好多东西都不会.还是要多学点东西啊.现在暂且贴点之前写完的东西吧,到时候也好有个总结. 1 诸论 1.1 问题描述 稀疏矩阵是指那些多数元素为零的矩阵.利用"稀疏"特点进行存储和计算可以大大节省存储空间,提高计算准备效率.实现一个能进行稀疏矩阵基本运算的运算器. 1.2 基本要求 以"带行逻辑链接信息"的三元组顺序表示稀疏矩阵,实现两个稀疏矩阵相加.相减.相乘和求逆的运算.稀疏矩阵的输入形式采用三元

背单词系统 数据结构课程设计

     数据结构     课程设计说明书           题目:          轻松背单词   学生姓名:       啦啦啦 学    号:    201406060306      院 (系):    电气与信息工程 专    业:   计算机科学与技术 指导教师: 2016  年  1 月 15 日 目 录 1.设计任务 1 2. 需求分析 1 3. 概要设计 1 3.1 基本功能 1 3.2 函数说明 1 3.3 变量和结构体说明 2 3.4 单词存储简要分析 2 3.5 功能

课程设计选题管理系统

#include<fstream> #include<cstring> #include<stdio.h> #include<iostream> #include<stdlib.h> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define List_INIT_SPACE 100 //存储空间初始分配量 #define List_INC_SPACE