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();
}
目录
相关文章
|
8月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
167 19
|
8月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
204 13
|
8月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
178 5
|
8月前
|
存储 C++
【C++面向对象——输入输出流】处理二进制文件(头歌实践教学平台习题)【合集】
本任务要求使用C++读取二进制文件并在每行前添加行号后输出到控制台。主要内容包括: 1. **任务描述**:用二进制方式打开指定文件,为每一行添加行号并输出。 2. **相关知识**: - 流类库中常用的类及其成员函数(如`iostream`、`fstream`等)。 - 标准输入输出及格式控制(如`cin`、`cout`和`iomanip`中的格式化函数)。 - 文件的应用方法(文本文件和二进制文件的读写操作)。 3. **编程要求**:编写程序,通过命令行参数传递文件名,使用`getline`读取数据并用`cout`输出带行号的内容。 4. **实验步骤**:参考实验指
198 5
|
8月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
128 5
|
8月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
131 4
|
8月前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
176 3
|
11月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
176 11
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
208 3
|
存储 安全 编译器
【C++核心】一文理解C++面向对象(超级详细!)
这篇文章详细讲解了C++面向对象的核心概念,包括类和对象、封装、继承、多态等。
179 2