通讯录实训实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实训报告
题目:通讯录
院系:信息科技学院
专业:计算机科学与技术姓名: ***
学号: ****
指导教师: ******
日期: 2012年1月7日
电子科技大学信息科技学院
目录
1 问题定义 (4)
2 系统设计 (4)
2.1 总体设计 (4)
2.2 详细设计 (6)
2.2.3 输入记录模块 (7)
2.2.4 查询记录模块 (8)
2.2.5 更新记录模块 (8)
2.2.6 统计记录模块 (8)
3 系统实现 (9)
3.1 编码 (9)
3.1.1 程序预处理 (9)
3.1.2 主函数main() (9)
3.1.3 主菜单界面 (9)
3.1.4 表格形式显示记录 (10)
3.1.5 记录查找定位 (10)
3.1.6 格式化输入数据 (10)
3.1.7 增加记录 (10)
3.1.8 查询记录……………………………………………………………………10…
3.1.9 删除学生记录 (11)
3.1.10 修改记录 (11)
3.1.11 插入记录 (12)
3.1.12 统计记录 (12)
3.1.13 排序记录 (13)
3.1.14 存储记录 (13)
3.1.15 截图 (17)
前言
课程设计环节是应用型本科院校非常重要的一个教学环节,是学完一门课后应用本课知识及以前的知识积累而进行的综合性、开放性的训练。

通过课程设计,不仅能够使学生得到系统的技能训练,巩固和加强所学得专业理论知识,而且能够培养学生工程意识、创新能力、团队精神等综合素质,培养学生的设计能力和解决实际问题的能力。

C语言由于其强大的功能,丰富的表达能力,高效的代码,良好的移植性和灵活性,自1972年问世以来,经久不衰,即使现在出现了面向对象的程序设计方法和开发工具,但它仍然是人们学习程序设计的首选语言,用它训练和提高编程技术,以及开发应用程序等。

我们通过《C语言程序设计》这门课程的学习,已经能编写解决小问题的程序,对程序的开发也有了初步的认识,还掌握了C 语言的基本语法,这一过程确确实实令我们感到欣喜,有点计算机可以完成自我任务的成就感。

但是,对于程序设计而言,学习C 的步伐不应该停留于此。

我们最终的目的应该是掌握开发大型综合程序的方法,即遵循软件工程的开发步骤和结构化程序设计思想,用C 语言开发出解决复杂问题的大型综合程序。

可是对于多数学生来说,学习了C语言后,除了应付各种考试之外,别无它用,对Turbo C语言丰富的函数知之甚少,加上DOS环境所限,因而对C语言兴趣不大,也感到C语言比较难以掌握。

本实训就是为了让学生在学完C语言后进一步了解C语言的知识,掌握C语言在软件开发方面的使用方法,希望通过此次实训,不仅能提高学生学习C语言的兴趣,更为今后学习其它专业知识及开发程序打下坚实的基础。

本指导书中有些容借鉴了互联网上相关程序的设计思想,在此对相关者表示衷心的感。

由于时间、经验及水平的原因,不当、不足之处,请大家提出宝贵意见。

编者
通讯录系统
本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C 语言的文件和单链表的各种基本操作。

本程序中涉及结构体、单链表、文件等方面的知识。

通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用单链表存储结构实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。

1、问题定义
创建一个通讯录管理系统。

假设系统中每个人录只包括、,如下图所示,选择任意菜单后,实现相应功能。

在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。

2、系统设计
2.1 总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。

需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。

可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。

本通讯录系统要求采用数组实现,它由如下五大功能模块组成:
●输入记录模块:完成将数据存入文件的工作。

记录可以从以二进制形式存储的数据文件
中读入,也可从键盘逐个输入学生记录。

学生记录由学生的基本信息和成绩信息字段构成。

当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到数组中。

●查询记录模块:逐一查找文件名对应文件,打开读数。

●更新记录模块:打开相应文件,对其中数据更改。

●输出记录模块:重文件中读出数据,转出存入数组中,再由数组输出。

2.2 详细设计
2.2.1数据结构设计
●通讯录结构体
直接由外部文件分隔储存,进行文件建立,结合外部搜索完成基本结构。

2.2.2 定义数组函数执行流程
// 通讯录Dlg.h : header file
//
#if !defined(AFX_DLG_H__37C8ABEA_DB2A_4346_9B9E_B2B26BE0014A__IN CLUDED_)
#define
AFX_DLG_H__37C8ABEA_DB2A_4346_9B9E_B2B26BE0014A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
class CMyDlg : public CDialog
{
// Construction
public:
struct student
{
CString csCode; //学号
CString csName; //
}structStudent[20];
int nStudentNum;
int nAccordNum;
int nAccordItem[20];
int number;
CMyDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CMyDlg)
enum { IDD = IDD_MY_DIALOG };
CString m_csCode;
CString m_csName;
CString m_csSearchCode;
CString m_csSearchName;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMyDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
afx_msg void OnButton2();
afx_msg void OnButton3();
afx_msg void OnButton4();
afx_msg void OnButton5();
virtual void OnOK();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif
// !defined(AFX_DLG_H__37C8ABEA_DB2A_4346_9B9E_B2B26BE0014A__INC LUDED_)
public:
struct student
{
CString csCode; //定义
CString csName; //定义以结构体完成
}structStudent[10];
int nStudentNum; //定义数组的位置标记的,用于录入时移动数组
int nAccordNum; //查询时,用于找到数组位置
int nAccordItem[10];
int number;
将其都定义在主界面PUBLIC之中。

2.2.3输入记录模块
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //刷新提取数据
structStudent[nStudentNum].csCode = m_csCode; //录入数据
structStudent[nStudentNum].csName = m_csName;
nStudentNum++;
m_csCode=""; //将输入栏变空
m_csName="";
UpdateData(FALSE);//刷新录入数据
}
2.2.4查询记录模块
2.2.5BOOL bAccordCode = FALSE; //用于判断对错
2.2.6BOOL bAccordName = FALSE;
2.2.7CString csBuffer;
2.2.8nAccordNum = 0; //附初值
2.2.9UpdateData(TRUE);
2.2.10for(int i=0;i<nStudentNum;i++) //for循环查询
2.2.11{
2.2.12if(m_csSearchCode==""||m_csSearchCode==structStudent[i].csCode) //判断是否符
合,查询数据。

2.2.13{ bAccordCode = TRUE; }
2.2.14else { bAccordCode = FALSE;}
2.2.15if(m_csSearchName==""||m_csSearchName==structStudent[i].csName)
2.2.16{ bAccordName = TRUE;}
2.2.17else { bAccordName = FALSE;}
2.2.18if(bAccordCode==TRUE&&bAccordName==TRUE)
2.2.19{ nAccordItem[nAccordNum] = i; nAccordNum++; }
2.2.20}
2.2.21if(nAccordNum>0) //确定存在时进行输出2.2.22{m_csSearchCode = structStudent[nAccordItem[0]].csCode;
2.2.23m_csSearchName = structStudent[nAccordItem[0]].csName;
2.2.24UpdateData(FALSE);
2.2.25}
2.2.26
2.2.27}
2.2.28
2.2.29
2.2.30}更新记录模块
2.2.31void CMyDlg::OnButton3()
2.2.32{UpdateData(TRUE);
2.2.33// TODO: Add your control notification handler code here
2.2.34number=0;
2.2.35for(int i=0;i<nStudentNum;i++) //重复查找功能
2.2.36{
2.2.37if(m_csSearchName==""||m_csSearchName==structStudent[i].csName)
2.2.38number=i;
2.2.39structStudent[number].csCode=m_csSearchCode; //重新赋值
2.2.40structStudent[number].csName=m_csSearchName;
2.2.41
2.2.42}
2.2.43m_csSearchCode="";
2.2.44m_csSearchName="";
2.2.45UpdateData(FALSE);
2.2.46函数功能描述
void CMyDlg::OnButton1() 录入
void CMyDlg::OnButton2() 查询
void CMyDlg::OnButton3() 修改
void CMyDlg::OnButton4() 删除
void CMyDlg::OnButton5() 对话框转接
完成在上述系统设计后,即可着手进行系统实现的工作,开始程序代码的编写。

3、系统实现
3.1 编码
class CMyDlg : public CDialog
{
// Construction
public:
struct student
{
CString csCode; //定义
CString csName; //定义以结构体完成
}structStudent[10];
int nStudentNum; //定义数组的位置标记的,用于录入时移动数组int nAccordNum; //查询时,用于找到数组位置
int nAccordItem[10];
int number;
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
structStudent[nStudentNum].csCode = m_csCode;
structStudent[nStudentNum].csName = m_csName;
nStudentNum++;
m_csCode="";
m_csName="";
UpdateData(FALSE);
}
void CMyDlg::OnButton2()
{
// TODO: Add your control notification handler code here
BOOL bAccordCode = FALSE;
BOOL bAccordName = FALSE;
CString csBuffer;
nAccordNum = 0;
UpdateData(TRUE);
for(int i=0;i<nStudentNum;i++)
{
if(m_csSearchCode==""||m_csSearchCode==structStudent[i].csCode) { bAccordCode = TRUE; }
else { bAccordCode = FALSE;}
if(m_csSearchName==""||m_csSearchName==structStudent[i].csName) { bAccordName = TRUE;}
else { bAccordName = FALSE;}
if(bAccordCode==TRUE&&bAccordName==TRUE)
{ nAccordItem[nAccordNum] = i; nAccordNum++; }
}
csBuffer.Format("你查询的信息在左边显示,如过没有显示信息既则没此人记录。

",nAccordNum);
MessageBox(csBuffer,"Attention",MB_OK|MB_ICONINFORMA TION);
if(nAccordNum>0)
{m_csSearchCode = structStudent[nAccordItem[0]].csCode;
m_csSearchName = structStudent[nAccordItem[0]].csName;
UpdateData(FALSE);
}
}
void CMyDlg::OnButton3()
{UpdateData(TRUE);
// TODO: Add your control notification handler code here
number=0;
for(int i=0;i<nStudentNum;i++)
{
if(m_csSearchName==""||m_csSearchName==structStudent[i].csName)
number=i;
structStudent[number].csCode=m_csSearchCode;
structStudent[number].csName=m_csSearchName;
}
m_csSearchCode="";
m_csSearchName="";
UpdateData(FALSE);
}
void CMyDlg::OnButton4()
{
UpdateData(TRUE);
// TODO: Add your control notification handler code here
number=0;
for(int i=0;i<nStudentNum;i++)
{
if(m_csSearchName==""||m_csSearchName==structStudent[i].csName)
number=i;
structStudent[number].csCode="";
structStudent[number].csName="";
}
m_csSearchCode="";
m_csSearchName="";
UpdateData(FALSE);
}
void CMyDlg::OnButton5()
{
// TODO: Add your control notification handler code here
jj a;
a.DoModal();
}
// 通讯录Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "通讯录.h"
#include "通讯录Dlg.h"
#include "jj.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
m_csCode = _T("");
m_csName = _T("");
m_csSearchCode = _T("");
m_csSearchName = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Text(pDX, IDC_csCode1, m_csCode);
DDX_Text(pDX, IDC_csName1, m_csName);
DDX_Text(pDX, IDC_csSearchCode, m_csSearchCode);
DDX_Text(pDX, IDC_csSearchName, m_csSearchName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
nStudentNum=0;
nAccordNum=0;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
#if !defined(AFX_JJ1_H__6B15ED22_1E33_4C03_BC92_B4C82ADABF2B__INCLUDED_) #define AFX_JJ1_H__6B15ED22_1E33_4C03_BC92_B4C82ADABF2B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// jj1.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// jj dialog
class jj : public CDialog
{
// Construction
public:
jj(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(jj)
enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(jj)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(jj)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCA TION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif
// !defined(AFX_JJ1_H__6B15ED22_1E33_4C03_BC92_B4C82ADABF2B__INCLUDED_) 3.1.15 程序截图
此图为主界面,看一看到该程序实现了增删改查四个功能,左上为增加信息操作的部分,左下是删除、修改和查询操作的部分。

1、
此图为增加功能,输入想添加的信息再按增加按钮则可以实现增加通讯录信息。

2、此图为查询功能,上图我们添加了一个为1 为123的通讯录信息,
我们可以通过查询,
3、按下查询按钮后即可查出所需的信息。

当然我们也可以通过查询。

此图为删除功能,将上面增加的信息由:1 :123 改为
:1 :456
将改为456后按下修改按钮,即可完成修改。

下图为修改后再次查询的图片。

4、此图为删除功能,将上面增加的信息删除,我们只需要将要删除的信息通过查询技能查出来后,按下删除按钮,即可完成删除功能。

下图为删除后再次查询的图片。

相关文档
最新文档