C++MFC 面向对象程序设计 小型通讯录管理程序设计

简介: C++MFC 面向对象程序设计 小型通讯录管理程序设计

课程名称:面向对象程序设计

实验名称:小型通讯录管理程序设计

1.实验目的  

  1. 深入理解面向对象技术的封装性、继承性和多态性,掌握面向对象程序设计方法。
  2. 综合应用C++基础知识实现小型应用程序开发。
  3. 掌握使用C++流类库实现数据文件访问的操作方法。
  4. 熟悉基于对话框的MFC应用程序创建过程,掌握ClassWizard工具和常用控件的使用方法。

C++ MFC实现通讯录系统的实验目的如下:

1.练习使用C++编程语言和MFC框架进行程序开发;

2.学习GUI界面设计及交互操作;

3.了解常用数据结构之一——链表,并能在程序中灵活运用;

4.通过实现通讯录系统,深入理解面向对象的思想和基本概念;

5.提高实践能力和代码调试能力,培养分析和解决问题的能力。

在实现通讯录系统的过程中,你将会学习并掌握大量技术知识和编程方法,例如类定义与继承、成员函数的设计和实现、控件布局和事件响应等。

2.实验环境

1.PC 机 1 台(1G 以上内存)

2.VC++ 6.0 集成开发环境

3.实验内容与要求

设计一个小型通讯录管理程序,实现通讯录文件的新建、保存、以及通讯录的增、删、改、查功能。要求系统用户界面良好,功能完善,性能稳定。

  • 实验步骤      功能需求分析

通讯录系统的主要功能需求:

添加联系人:可以添加新的联系人信息,包括姓名、电话号码、电子邮件地址等;

删除联系人:可以删除已经存在的联系人信息;

查询联系人:可以按照姓名或电话号码来查询已经存在的联系人信息;

修改联系人:可以根据需求修改联系人的姓名、电话号码或者其他信息;

显示联系人:可以查看所有联系人的信息列表,包括姓名、电话号码、电子邮件地址等;

排序联系人:可以按照姓名或者电话号码对联系人列表进行排序;

打印联系人:可以通过打印机将联系人信息打印出来。

在实现通讯录系统时,还需要考虑安全性和用户界面友好性,例如合理设置账户权限、输入验证及错误提示、简洁易懂的操作界面等。通过综合考虑这些功能需求,并加以完善和优化,才能设计出满足用户需求的高效、易用的通讯录系统。

. 基本功能

- 添加联系人

- 删除联系人

- 修改联系人

- 显示联系人信息

2. 附加功能

- 查找联系人

- 读取保存联系人信息

  1. 用户界面设计

通讯录系统的基本界面设计:

主界面:主界面应该有添加、删除、修改、查询等功能按钮,同时要显示所有联系人的信息列表。用户可以通过单击这些按钮或者选中列表中的某一项来进行相应操作。

添加联系人界面:在此界面中,用户需要输入新增联系人的姓名、电话号码等基本信息并保存,或者取消此次添加操作返回主界面。

删除联系人界面:在此界面中,用户需要选择要删除的联系人,并确认是否删除该联系人。如果确认删除则从联系人列表中移除此联系人。

查询联系人界面:在此界面中,用户需要输入搜索条件(例如联系人姓名或者电话号码),然后系统会将符合条件的联系人列出来供用户查看。

修改联系人界面:在此界面中,用户需要先选择要修改的联系人,然后再修改该联系人的基本信息并保存,或者取消此次修改操作返回主界面。

  1. 类的设计
    分别为三个对话框添加类,MailListtDlg ContactAdding ContactModifying分别为本通讯录的主对话框类、添加联系人子对话框类、修改联系人子对话框类。

主对话框的成员变量

子对话框的成员变量

  1. 主要功能模块算法设计

1. 添加联系人模块算法:

算法思想:通过用户输入的信息,创建新的联系人对象,并将该联系人对象添加到通讯录中。

算法流程图:

开始

获取用户输入的联系人信息

创建Contact对象,填充联系人信息

调用ContactList的添加方法,将新联系人添加到列表中

结束

主要实现语句:

```c++
// 获取用户输入的联系人信息
CString name, phone, email;
(nameTxt.GetWindowText(name), phoneTxt.GetWindowText(phone), emailTxt.GetWindowText(email));
// 创建Contact对象
CContact* newContact = new CContact(name, phone, email);
// 将新联系人添加到通讯录列表中
m_contactList.AddContact(newContact);
```

2. 删除联系人模块算法:

算法思想:根据用户选择的联系人,在通讯录列表中删除该联系人对象。

算法流程图:

```

开始

获取用户选中的联系人项

调用ContactList的删除方法,从列表中移除选中联系人

结束

```

主要实现语句:

```c++
// 获取用户选中的联系人ID
int selIndex = contactListCtrl.GetSelectionMark();
if (selIndex != -1) {
  // 从通讯录列表中删除选择的联系人
  m_contactList.DeleteContact(selIndex);
}
```

3. 查询联系人模块算法:

算法思想:根据用户输入的关键字,在通讯录中搜索符合条件的联系人。

算法流程图:

```

开始

获取用户输入的查询关键字

调用ContactList的查找方法,根据关键字搜索联系人

更新UI界面,显示符合条件的联系人

结束

```

主要实现语句:

```c++
// 获取用户输入的查询关键字
CString keyword;
searchText.GetWindowText(keyword);
// 搜索符合条件的联系人并更新UI界面
m_contactList.SearchContacts(keyword);
UpdateData(FALSE);
```

4. 修改联系人模块算法:

算法思想:根据用户选择的联系人,在通讯录中进行修改操作,并将其保存。

算法流程图:

```

开始

获取用户选择的联系人项

展示选中联系人当前信息

获取用户修改后的联系人信息

创建Contact对象,填充修改后的信息

删除旧的联系人,在通讯录列表中添加新联系人

结束

```

主要实现语句:

```c++
// 获取用户选中的联系人ID
int selIndex = contactListCtrl.GetSelectionMark();
if (selIndex != -1) {
  // 展示选中联系人当前信息
  CContact* oldContact = m_contactList.GetContact(selIndex);
  nameTxt.SetWindowText(oldContact->GetName());
  phoneTxt.SetWindowText(oldContact->GetPhone());
  emailTxt.SetWindowText(oldContact->GetEmail());
  // 获取用户修改后的联系人信息
  CString newName, newPhone, newEmail;
  (nameTxt.GetWindowText(newName), phoneTxt.GetWindowText(newPhone), emailTxt.GetWindowText(newEmail));
  // 创建Contact对象
  CContact* newContact = new CContact(newName, newPhone, newEmail);
  // 删除旧的联系人,在通讯录列表中添加新联系人
  m_contactList.DeleteContact(selIndex);
  m_contactList.AddContact(newContact);
}
```
  1. 基于MFC的操作过程

以下是基于MFC框架的通讯录系统的操作过程:

1. 点击通讯录系统的启动图标,系统启动并显示主界面。

2. 在主界面上,用户可以看到所有联系人的信息列表,同时还有添加、删除、查询和修改等按钮,用户可以根据自己的需求进行相应的操作。

3. 如果用户需要添加新联系人,可以单击“添加”按钮,在弹出的添加联系人对话框中输入联系人信息,并单击“确定”按钮确认添加。系统会将新联系人添加到信息列表中。

4. 如果用户需要删除联系人,可以先选中要删除的联系人项,然后单击“删除”按钮,系统会弹出确认删除对话框,用户确定后系统将该联系人从列表中移除。

5. 如果用户需要查询联系人,可以在搜索框中输入关键字,然后单击“查找”按钮,系统会在信息列表中搜索符合条件的联系人并将它们展示在列表中。

6. 如果用户需要修改联系人信息,可以先选中要修改的联系人项,然后单击“修改”按钮,系统会弹出修改联系人对话框,用户可以修改联系人信息并保存。

7. 如果用户需要排序联系人列表,可以选择排序方式(按照姓名或电话号码),然后单击“排序”按钮,系统会将联系人列表按照用户选择的方式进行排序。

8. 当用户想退出程序时,可以单击“退出”按钮,系统提示是否确认退出,用户确认后程序结束运行。

  • 实验结果与总结
  1. 程序测试结果截图    上面的图片贴下来几个

程序测试结果如下:

1. 添加联系人功能测试:添加新的联系人,确认信息是否正确显示在信息列表中。

2. 删除联系人功能测试:选择一个已有的联系人,在确认对话框中确认删除该联系人,然后检查信息列表中该联系人是否被成功移除。

3. 查询联系人功能测试:输入一个关键词,应用搜索功能检验是否获取到符合条件的联系人列表中。

4. 修改联系人功能测试:选择一个已有的联系人,进入修改联系人页面,再次确认改动后联系人信息是否反映到信息列表中。

5. 排序联系人功能测试:选择排序方式,检查联系人列表是否按照指定顺序排列。

6. 错误处理测试:验证系统是否正确处理各种无效输入、错误操作等异常情况,并给出对应的错误提示和解决方案。

以上测试结果均表明通讯录系统能够完成各种功能的预期要求,并在各种测试条件下保持稳定和可靠性。 对于不同类型的用户需求,通讯录系统都能够做出相应的响应和提供合适的解决方案,具有高度可扩展性和灵活性。

实验总结

(对实验过程中涉及的知识点进行总结)

1. 对象导向编程:MFC基于对象导向编程模型(OOP),这种编程方式是一种通过面向对象设计和封装来实现软件组件开发和调用的方法。OOP可以将代码组织成逻辑上相对独立和可复用的类,提高代码重用率和可维护性。

2. 控件和事件处理:在MFC中,通常使用对话框(Dialog)作为程序主窗口,并在其上添加各种控件,例如按钮、文本框、列表框等,以进行用户交互。每个控件都有与之对应的事件处理函数,例如按下按钮或选择列表项时,就会执行相应的事件处理函数。

3. 文件读写操作:在通讯录系统中,需要将数据保存到文件中,MFC提供了丰富的文件读写相关的类库,例如 CFile, CStdioFile 等,可以方便地读写、打开、关闭文件。

4. 数据结构:在MFC通讯录系统中,可以使用链表、数组等数据结构来管理通讯录信息,例如可以使用链表来实现联系人信息的动态添加和删除。

5. 图形界面设计:良好的图形界面设计能够提高整个系统的使用体验和美观度。在MFC中,可以借助视图和控件,采用窗体界面、图标等设计元素,快速实现用户界面布局和交互功能。

总之,以上知识点都是MFC通讯录系统开发中不可或缺的一部分,熟练使用这些知识技能可以帮助我们更好地完成软件开发任务。

附录代码:

附录代码:
class MyClass {//添加一个类存储联系人各项信息
public:
  //姓名,5个字内
  char Name[12];    
  //电话,11个数字                    
  char Phone[13];     
  //群组                     
  char Group[10];                      
  int Group_Index = -1;                             
  char Remark[104];                  
};
stdafx.h
//统计联系人人数
extern int N;
//存储各个联系人
extern MyClass new_people[100];
stdafx.cpp0
int N = 0;
MyClass new_people[100];
MailListtDlg.h
void read();
MailListtDlg.cpp
void CMailListtDlg::Read(){
  CStdioFile file;
  CString str;
  file.Open("test.txt", CFile::modeRead);
  int now = 0;
  while (file.ReadString(str) != NULL){
    int i;
    if (now == 0) {
      N++;
      for (i = 0; i < str.GetLength(); i++) {
        new_people[N - 1].Name[i] = str[i];
      }
      new_people[N-1].Name[str.GetLength()] = '\0';
    }
    else if (now == 1) {
      for (i = 0; i < str.GetLength(); i++) {
        new_people[N-1].Phone[i] = str[i];
      }
      new_people[N-1].Phone[str.GetLength()] = '\0';
    }
    else if (now == 2) {
      strcpy_s(new_people[N-1].Group, str);
    }
    else if (now == 3) {
      new_people[N - 1].Group_Index = _ttoi(str);
    }
    else if (now == 4) {
      for (i = 0; i < str.GetLength(); i++) {
        new_people[N - 1].Remark[i] = str[i];
      }
      new_people[N-1].Remark[str.GetLength()] = '\0';
    }
    now++;
    now %= 5;
  }
}
BOOL CMailListtDlg::OnInitDialog(){
  CDialogEx::OnInitDialog();
  //初始化时读取文件内容,自定义的Read函数读取文件
  CMailListtDlg Read;
  Read.Read();   
  SetIcon(m_hIcon, TRUE);     // 设置大图标
  SetIcon(m_hIcon, FALSE);    // 设置小图标
  //设置报表视图的头标题        
  CRect rect;
  CListCtrl* pmyListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST4);
  LONG dwStyle = GetWindowLong(pmyListCtrl->m_hWnd, GWL_STYLE);
  SetWindowLong(pmyListCtrl->m_hWnd, GWL_STYLE, dwStyle | LVS_REPORT);
  LONG styles = pmyListCtrl->GetExtendedStyle();
  pmyListCtrl->SetExtendedStyle(styles | LVS_NOSCROLL);    
  pmyListCtrl->GetWindowRect(&rect);
  pmyListCtrl->InsertColumn(0, "姓名", LVCFMT_CENTER, rect.Width() / 3);
  pmyListCtrl->InsertColumn(1, "电话", LVCFMT_CENTER, rect.Width() / 3);
  pmyListCtrl->InsertColumn(2, "群组", LVCFMT_CENTER, rect.Width() / 3)                                                                  
  int nlist = m_ListCtrl.GetItemCount();
  if (new_people[0].Group_Index != -1) {
    CString str;
    for (int i = N - 1; i >= 0; i--) {
      str.Format("%s", new_people[i].Name);
      m_ListCtrl.InsertItem(nlist, str);
      str.Format("%s", new_people[i].Phone);
      m_ListCtrl.SetItemText(nlist, 1, str);
      str.Format("%s", new_people[i].Group);
      m_ListCtrl.SetItemText(nlist, 2, str);
    }
  }
    m_zhuGroup.AddString(_T(""));
  m_zhuGroup.AddString(_T("无"));
  m_zhuGroup.AddString(_T("家人"));                                               
  m_zhuGroup.AddString(_T("朋友"));
  m_zhuGroup.AddString(_T("同学"));
  m_zhuGroup.SetCurSel(0);
  //修改和删除联系人按钮灰显                
  GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
  return TRUE;
}
void CMailListtDlg::OnBnClickedButton1()  {
  ContactAdding dlg;
  //弹出添加联系人子对话框,当子对话框通过保存键关闭时,进行if内的操作
  if (IDOK == dlg.DoModal()) {
    //添加联系人到报表视图 并存储到全局变量 
    //获取当前报表视图的行数
    int i;
    CString str;
    int nHeadNum = m_ListCtrl.GetItemCount(); 
    //姓名
    str = dlg.m_Name2; 
    str.TrimLeft();
    str.TrimRight();
    //报表视图中插入姓名
    m_ListCtrl.InsertItem(nHeadNum, str);
    //将姓名存储到全局变量
    for (i = 0; i < str.GetLength(); i++){
      new_people[N].Name[i] = str[i];
    }
    new_people[N].Name[str.GetLength()] = '\0';
    //电话
    str = dlg.m_Phone2;
    //报表视图中插入电话
    m_ListCtrl.SetItemText(nHeadNum, 1, str);
    //将电话存储到全局变量
    for (i = 0; i < 11; i++){
      new_people[N].Phone[i] = str[i];
    }
    new_people[N].Phone[11] = '\0';
    //将群组索引存储到全局变量
    new_people[N].Group_Index = dlg.Group_Index;  
    //将群组存储到全局变量
    m_zhuGroup.GetLBText(new_people[N].Group_Index + 1, new_people[N].Group);
    //报表视图插入群组
    m_ListCtrl.SetItemText(nHeadNum, 2, new_people[N].Group); 
    //备注
    str = dlg.m_Variable2;
    str.TrimLeft();
    str.TrimRight();
    //将备注存储到全局变量
    for (i = 0; i < str.GetLength(); i++){
      new_people[N].Remark[i] = str[i];
    }
    new_people[N].Remark[str.GetLength()] = '\0';
    //联系人人数+1
    N++;
  }
}
BOOL ContactAdding::OnInitDialog()
{
  CDialogEx::OnInitDialog();
  //Combo Box控件显示“无”,并有另外三项选择
  m_ComboBox.AddString(_T("无"));
  m_ComboBox.AddString(_T("家人"));
  m_ComboBox.AddString(_T("朋友"));
  m_ComboBox.AddString(_T("同学"));
  m_ComboBox.SetCurSel(0);
  return TRUE;
}
单击添加联系人子对话框的保存按钮的响应函数
void ContactAdding::OnBnClickedOk()
{
  //将控件的值赋给成员变量
  UpdateData(TRUE);
  //判断电话号码是否为11位,若不为11位,报错
  if (m_Phone2.GetLength() != 11) {
    MessageBox("请输入11位的电话号码");
  }
  //若电话号码为11位
  else{
    //check函数判断是否存在重复电话号码,可以重复联系人姓名
    if (check() == 1) {
      m_Name2.TrimLeft(     m_Name2.TrimRight();    
      //名字不能为空
      if (m_Name2.IsEmpty()) {
        MessageBox("添加联系人信息不能为空");
      }
      //将群组ComboBox索引赋给该类的变量,将在关闭子对话框后使用
      else {
        Group_Index = m_ComboBox.GetCurSel();
        CDialog::OnOK();
      }
    }
    //check函数判断有重复电话号码
    else {
      MessageBox("请不要添加重复的联系人信息");
    }
  }
}
check函数判断是否存在重复联系人信息
在ContactAdding.h中声明check函数。联系人电话不可以重复,可以一人多号。
ContactAdding.h
int check();
ContactAdding.cpp
int ContactAdding::check() {
  char Phone[13];//类型转换
  for (int i = 0; i < m_Phone2.GetLength(); i++)
  {
    Phone[i] = m_Phone2[i];
  }
  Phone[m_Phone2.GetLength()] = '\0';
    for (int i = 0; i < N; i++) {
    for (int j = 0; j < 11; j++) {
      //存在数字不相等即电话号码不相等,跳出该电话的循环
      if (Phone[j] != new_people[i].Phone[j]) 
        break;  
        //若循环进行到第十一数字,第十一个数字也相等,即该存在相同号码
      if (j == 10 && Phone[j] == new_people[i].Phone[j])  
        //打断循环并返回函数值      
        return 0;
    }
  }
  //若循环进行完全,即不存在相同号码
  return 1;
}
//删除联系人后相应会更新全局变量
void CMailListtDlg::OnBnClickedButton2()       
{
  while (m_ListCtrl.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED) != -1) {
    int nItem;
  nItem = m_ListCtrl.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
    //删除报表框中的选择的一行
    m_ListCtrl.DeleteItem(nItem); 
    //更新全局变量信息
    for (int i = nItem; i < N; i++) {
      strcpy_s(new_people[i].Name, 11,new_people[i + 1].Name);
      strcpy_s(new_people[i].Phone, 12,  new_people[i + 1].Phone);
      strcpy_s(new_people[i].Group, 9, new_people[i + 1].Group);             
      strcpy_s(new_people[i].Remark, 102, new_people[i + 1].Remark);
      new_people[i].Group_Index = new_people[i + 1].Group_Index;
    }
    //联系人人数减一
    N--;      
    //删除、修改联系人按钮灰显
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
    GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
  } 
  //清空备注框(因为选中报表框一项时备注框中会显示该联系人的相应备注)
  m_Variable.ResetContent();
}  
void CMailListtDlg::OnClickList4(NMHDR *pNMHDR, LRESULT *pResult)   
{
  LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  DWORD dwPos = GetMessagePos();
  CPoint point(LOWORD(dwPos), HIWORD(dwPos));
  m_ListCtrl.ScreenToClient(&point); 
  LVHITTESTINFO lvinfo;
  lvinfo.pt = point;
  lvinfo.flags = LVHT_ABOVE;
  int nItem = m_ListCtrl.SubItemHitTest(&lvinfo);
  //如果选中了联系人
  if (nItem != LB_ERR)                    
  {
    //先清空备注框
    m_Variable.ResetContent();
    //删除,修改按钮可按
    GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);   
    GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);    
    //备注框中显示相应联系人的备注
    m_Variable.AddString(new_people[lvinfo.iItem].Remark);
  }
  //点中了报表框中的空白处
  else {  
    //备注框清空
  m_Variable.ResetContent();     
      //删除,修改联系人按钮灰显                     
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);   
    GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);   
  }
  *pResult = 0;
}
ContactModifying.h
int RecordList;
int RecordGroup_Index
MailListtDlg.cpp
void CMailListtDlg::OnBnClickedButton3() 
{
  ContactModifying dlg;
  //获得列表框选择的位置
  int nlist = m_ListCtrl.GetNextItem(-1, LVNI_SELECTED);              
  dlg.RecordList = nlist;
  dlg.RecordGroup_Index = new_people[nlist].Group_Index;
  //类型转换
  dlg.m_Name3.Format("%s", new_people[nlist].Name);
  dlg.m_Phone3.Format("%s", new_people[nlist].Phone);
  dlg.m_Group3.Format("%s", new_people[nlist].Group);               
  dlg.m_Group_Index3 = new_people[nlist].Group_Index;
  dlg.m_Variable3.Format("%s", new_people[nlist].Remark);   
  //弹出添加联系人子对话框,当子对话框通过保存键关闭时,进行if内的操作
  int nIdex = dlg.DoModal();
  if (nIdex == IDOK) {
    m_Variable.ResetContent();
    m_ListCtrl.DeleteItem(nlist); 
    //全局变量信息更新+报表视图更新   
    CString str; int i;                                                                               
    str = dlg.m_Name3; 
    str.TrimLeft(); str.TrimRight();
    for (i = 0; i < str.GetLength(); i++) {
      new_people[nlist].Name[i] = str[i];
    }
    new_people[nlist].Name[str.GetLength()] = '\0'; 
    //更新报表视图
    m_ListCtrl.InsertItem(nlist, str);                                               
    str = dlg.m_Phone3;
    str.TrimLeft(); str.TrimRight();
    for (i = 0; i < str.GetLength(); i++) {
      new_people[nlist].Phone[i] = str[i];
    }
    new_people[nlist].Phone[str.GetLength()] = '\0';
    //更新报表视图
    m_ListCtrl.SetItemText(nlist, 1, str);
    // 备注
    str = dlg.m_Variable3;
    str.TrimLeft(); str.TrimRight();
    for (i = 0; i < str.GetLength(); i++) {
      new_people[nlist].Remark[i] = str[i];
    }
    new_people[nlist].Remark[str.GetLength()] = '\0';
    // 群组
    new_people[nlist].Group_Index = dlg.m_Group_Index3;
    if (dlg.m_Group_Index3 == 0) 
      str = "无";
    else if (dlg.m_Group_Index3 == 1)
      str = "家人";
    else if (dlg.m_Group_Index3 == 2)
      str = "朋友";
    else if (dlg.m_Group_Index3 == 3) 
      str = "同学";
    for (i = 0; i < str.GetLength(); i++) {
      new_people[nlist].Group[i] = str[i];
    }
    new_people[nlist].Group[str.GetLength()] = '\0';
    //更新报表视图
    m_ListCtrl.SetItemText(nlist, 2, str);
    //删除、修改联系人按钮灰显
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
    GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
  }
}
进入修改联系人子对话框的初始化函数
群组框显示选中联系人的群组
BOOL ContactModifying::OnInitDialog()
{
  CDialogEx::OnInitDialog();
  m_ComboBox3.AddString(_T("无"));
  m_ComboBox3.AddString(_T("家人"));
  m_ComboBox3.AddString(_T("朋友"));
  m_ComboBox3.AddString(_T("同学"));
  return TRUE; 
}
void ContactModifying::OnBnClickedOk()
{
  //将控件的值赋给成员变量
  UpdateData(TRUE); 
  //判断电话号码是否为11位
  if (m_Phone3.GetLength() != 11) {
    MessageBox("请输入11位的电话号码");
  } 
  //若电话号码为11位
  else {
    //check函数判断重复信息(和添加联系人的check函数不一样)
    if (check() == 1) {
      m_Name3.TrimLeft();   
      m_Name3.TrimRight();
      //名字不能为空
      if (m_Name3.IsEmpty()) {
        MessageBox("添加联系人信息不能为空");
      }
      //将群组ComboBox索引赋给该类的变量,将在关闭子对话框后使用
      else {
        m_Group_Index3 = m_ComboBox3.GetCurSel();
        CDialog::OnOK();
      }
    }
    //check函数判断有重复电话号码
    else {
      MessageBox("请不要添加重复的联系人信息");
    }
  }
}
//check函数判断是否存在重复联系人信息(注意和添加联系人的check函数的不同)
在ContactModifying.h中声明check函数。在修改联系人的过程中,存在只修改备注,不修改其他信息的情况,若使用添加联系人的check函数,会出现错误的报错。
ContactModifying.h
int check();
ContactModifying.cpp
int ContactModifying::check() {
  //类型转换
  //姓名
  char Name[12];
  for (int i = 0; i < m_Name3.GetLength(); i++)
  {
    Name[i] = m_Name3[i];
  }
  Name[m_Name3.GetLength()] = '\0';
  //电话
  char Phone[13];
  for (int i = 0; i < m_Phone3.GetLength(); i++)
  {
    Phone[i] = m_Phone3[i];
  }
  Phone[m_Phone3.GetLength()] = '\0';
  //当m=0时,即修改的电话和选中联系人的电话相同;当m=1时,则不相同
  int m = 0;
  for (int i = 0; i < 11; i++) {                                                  
    if (Phone[i] != new_people[RecordList].Phone[i]) {                      
      m = 1;
    }
  }
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < 11; j++) {
      //一个数字不相等即电话号码不相等,跳出该电话的循环
      if (Phone[j] != new_people[i].Phone[j]) 
        break;
      //若循环进行到第十一数字,第十一个数字也相等,即该存在相同号码 
      //m==1即相同号码不为选中联系人电话,判断为真实存在重复电话
      if (j == 10 && Phone[j] == new_people[i].Phone[j] && m == 1)
        return 0;
    }
  }
  //若循环进行完全,即不存在相同号码
  return 1;
}
void CMailListtDlg::OnClickedButton5()
{
  //将控件值传给成员变量
  UpdateData(TRUE);
  //声明定义一个MyClass对象存储信息
  MyClass Find;
  CString str; 
  //类型转换
  //姓名
  str = m_Name1;
  str.TrimLeft(); 
str.TrimRight();
  for (int i = 0; i < str.GetLength(); i++) 
    Find.Name[i] = str[i];
  Find.Name[str.GetLength()] = '\0';
  //电话
  str = m_Phone1;
  str.TrimLeft(); 
str.TrimRight();
  for (int i = 0; i < str.GetLength(); i++) 
    Find.Phone[i] = str[i];
  Find.Phone[str.GetLength()] = '\0';
  //索引
  //主对话框中的Combo Box索引数比其他子对话框的索引数多一个,因为主对话框中的ComboBox默认不显示,所以要-1
  Find.Group_Index = m_zhuGroup.GetCurSel() - 1;
  CString s1, s2;
  CString check;
  int Record[100];
  int record = 0;
  int que[100];
  for (int i = 0; i < 100; i++) {
    que[i] = i;
  }
  for (int i = 0; i < N; i++) {
        s1.Format("%s", Find.Name);
    s2.Format("%s", Find.Phone); 
    if ((new_people[i].Group_Index == -1) || (Find.Group_Index != -1 && Find.Group_Index != new_people[i].Group_Index) || (Find.Group_Index == -1 && new_people[i].Group_Index != -1 && s1.IsEmpty() && s2.IsEmpty()))
      continue;
    s1.Format("%s", Find.Name); 
    s2.Format("%s", new_people[i].Name);
    if (!s1.IsEmpty() && s2.Find(s1) == -1) 
      continue;
    //如果当前循环的电话不存在输入查找的电话或电话的一部分,则进行下一次循环
    s1.Format("%s", Find.Phone); 
    s2.Format("%s", new_people[i].Phone);
    if (!s1.IsEmpty() && s2.Find(s1) == -1)  
      continue;
    Record[que[record]] = i;
    record ++;
  }
  //弹窗显示查找到多少名联系人
  check.Format("共查到%d条联系人", record);
  MessageBox(check);
  //如果找到匹配联系人,清空报表视图,只显示匹配联系人信息
  if (record > 0) {
    m_ListCtrl.DeleteAllItems();
    for (int i = 0; i < record; i++) {
      m_ListCtrl.InsertItem(i, new_people[Record[que[i]]].Name);
      m_ListCtrl.SetItemText(i, 1, new_people[Record[que[i]]].Phone);
      m_ListCtrl.SetItemText(i, 2, new_people[Record[que[i]]].Group);
    }
  }
}
void CMailListtDlg::OnClickedButton6()
{
  //清空报表视图,因为查找后只显示匹配联系人信息
  m_ListCtrl.DeleteAllItems();
  //清空查找框中输入的信息
  m_Name11.SetWindowTextA("");
  m_Phone11.SetWindowTextA("");
  m_zhuGroup.SetCurSel(0);
  //报表视图显示所有联系人信息,提取全局变量
  for (int i = 0; i < N; i++) {
    m_ListCtrl.InsertItem(i, new_people[i].Name);
    m_ListCtrl.SetItemText(i, 1, new_people[i].Phone);
    m_ListCtrl.SetItemText(i, 2, new_people[i].Group);
  }
}
void CMailListtDlg::OnBnClickedButton7()
{
  CStdioFile file;
  file.Open("test.txt", CFile::modeCreate | CFile::modeWrite);
  CString str;
  if (new_people[0].Group_Index != -1) {
    for (int i = 0; i < N; i++) {
      //姓名
      str.Format("%s\n", new_people[i].Name);
      file.WriteString(str);  
      //电话
      str.Format("%s\n", new_people[i].Phone);
      file.WriteString(str);  
      //群组
      str.Format("%s\n", new_people[i].Group);
      file.WriteString(str);
      //群组索引
      str.Format("%d\n", new_people[i].Group_Index);
      file.WriteString(str);
      //备注
      str.Format("%s\n", new_people[i].Remark);
      file.WriteString(str);
    }
  }
  MessageBox("保存成功");
  CDialogEx::OnCancel();
}
目录
相关文章
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
81 11
|
2月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
42 3
|
2月前
|
存储 安全 编译器
【C++核心】一文理解C++面向对象(超级详细!)
这篇文章详细讲解了C++面向对象的核心概念,包括类和对象、封装、继承、多态等。
25 2
|
1月前
|
存储 编译器 C语言
【C++】初识面向对象:类与对象详解
【C++】初识面向对象:类与对象详解
|
3月前
|
存储 安全 数据处理
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
|
3月前
|
算法 数据可视化 C++
【C++】C++ 学生信息管理系统(源码+面向对象)【独一无二】
【C++】C++ 学生信息管理系统(源码+面向对象)【独一无二】
|
4月前
|
存储 C语言 C++
【C/C++】动态内存管理( C++:new,delete)
C++的`new`和`delete`用于动态内存管理,分配和释放内存。`new`分配内存并调用构造函数,`delete`释放内存并调用析构函数。`new[]`和`delete[]`分别用于数组分配和释放。不正确匹配可能导致内存泄漏。内置类型分配时不初始化,自定义类型则调用构造/析构。`operator new`和`operator delete`是系统底层的内存管理函数,封装了`malloc`和`free`。定位`new`允许在已分配内存上构造对象,常用于内存池。智能指针等现代C++特性能进一步帮助管理内存。
|
4月前
|
存储 编译器 程序员
【C/C++】动态内存管理(C:malloc,realloc,calloc,free)
探索C++与C语言的动态内存管理:从malloc到new/delete,了解内存分布及栈、堆的区别。文章涵盖malloc、realloc、calloc与free在C中的使用,强调内存泄漏的风险。C++引入new和delete,支持对象构造与析构,还包括operator new和placement-new。深入分析内存管理机制,揭示C与C++在内存处理上的异同。别忘了,正确释放内存至关重要!
|
4月前
|
存储 开发框架 Java
|
5月前
|
C++
C++ : 程序设计简单实例
C++ : 程序设计简单实例
44 3