第一篇:8通讯录管理系统C#编程_课程设计_图文.
福建工程学院
课程名称:C#.NET程序设计 设计题目:通讯录管理系统 学生班级: 学生姓名: 指导教师: 完成日期:
一、设计目的(1
二、需求分析(2 2.1设计题目(2 2.2设计构思(2 2.3运行界面需求(3 2.4开发及运行环境(3 2.5程序文件清单(3 2.5.1数据库模块(3
三、模块分析及设计(4 3.1系统功能结构图(4 3.2系统数据流程图(4
四、数据库设计(5
4.1数据库需求分析(5 4.2E-R图(6 4.3数据表设计(6 4.3.1登录用户信息表(Users(6 4.3.2通讯录信息表(Contact(7
五、制作过程及要点(7 5.1IsExist类(7 5.2用户登录与注册模块详细设计(8 5.3系统主界面设计(14 5.4通讯录“显示全部”模块(15 5.5通讯录“添加”模块(17 5.6通讯录“查找”模块(18 5.7通讯录“修改”模块(20 5.8通讯录“删除”模块(22
六、设计总结(24
七、主要参考书及手册(25
一、设计目的
日益繁多的人际交往使得我们很难搞清楚与每个人之间的联系方式,特别是对于做经常出差的人来说更是难,所以通讯录能够便捷的给我们带来所需要的相关信
息。而随着计算机的普及,人们的生活摆脱了传统式的记事本、电话簿,越来越多的靠计算机来帮助人们记住这些事情,极其简便。这就需要有一个使用的通讯录管理系统,用户可以方便的通过自己电脑的通讯录管理系统,来随时查阅自己所需要的信息,而不必再大费周折去翻开那繁琐的记事本。
通讯录管理系统是一个专门针对储存用户联系方式以及一些简单个人信息的实用管理系统,它方便了用户对众多客户、朋友、同事等个人信息的储存和快速查阅的功能,大大减少了查找过程的时间。
二、需求分析 2.1设计题目 通讯录管理系统 2.2设计构思
通讯录管理系统功能需求分析: 通讯录管理系统主要功能分为五个模块:用户登录与注册、用户查询、添加记录、修改记录、删除记录。
用户登录与注册:实现不同用户的注册跟登录通讯录
显示全部:实现用户对所有存在于数据库中的数据的显示,方便用户了解数据存储的情况。
查找记录:实现用户在本软件数据库中查找自己需要的数据功能。添加记录:实现用户添加一条完整的记录,包括姓名、生日、电话、邮箱、地址。
修改记录:用户对数据库中已存在的记录进行修改,然后保存已经修改过的数据
删除记录:用户对数据库中已经存在的记录进行行删除操作,然后保存修改过的数据
2.3运行界面需求 界面应简洁,使用者易操作 2.4开发及运行环境
本系统开发平台及运行环境如下: 系统开发平台:Microsoft Visual Studio2008 系统开发语言:C# 数据库管理软件:SQL Server2005 运行平台:Windows XP(SP2/Windows2000(SP4/Windows Server 2003(SP1 运行环境:Microsoft.NET Framework SDK v3.0 分辨率:最佳效果1024×768像素
说明:SP(Service Pack为Windows操作系统补丁。2.5程序文件清单 2.5.1数据库模块
数据库名运行平台编程语言简要描述 TongXunLu Sql2005SQL Contact表跟Users表
三、模块分析及设计 3.1系统功能结构图
通讯录管理系统 注册侧 登录 显示全部 添加查找修改删 除 退出系统
3.2系统数据流程图 用户 注册登录 通讯录管理系统 通讯录管理系统主界面 显示全部查 找 记 录 修 改 记
录 删 除 记 录 退 出 系 统
四、数据库设计 4.1数据库需求分析
1针对通讯录管理系统,分别对用户登录、添加通讯录和查找、删除以及修改数据进行详细的调研和分析,总结出如下的需求信息: 1.每条原始记录要有姓名、生日、电话、邮箱、地址信息,其中姓
名不能为空。
2.保证查询到的数据与姓名相一致 3.根据相应姓名删除对应的全部数据
2本数据用于登录用户实体以及通讯录信息实体 4.2E-R 图
用户 用户名密码 信息 操作 N 1 姓名 生日 邮箱 电话 地址
4.3数据表设计
·数据库名称:TongXunLu,共有2个表:
1、用户表(Users
2、通讯录联系表(Contact 4.3.1登录用户信息表(Users
4.3.2通讯录信息表(Contact
五、制作过程及要点 5.1IsExist类
开发项目时,以类的形式来组织、封装一些常用的方法和事件,以便提高代码的重用率,大大方便了代码的管理。本系统中创建了一个公共类:IsExist.cs,主要是用来判断后台数据库里是否存在用户输入 的内容如果存在就返回true,否则返回false。using System;using System.Collections.Generic;using System.Text;using System.Data.SqlClient;namespace TongXun { class IsExist { public bool isNameExist(string str { string checkString=“select*from Contact where姓名='”+str+“'”;SqlConnection sqlcon=new SqlConnection(;sqlcon.ConnectionString=“Initial Catalog=TongXunLu;Data Source=(local;Integrated Security=true”;SqlCommand sqlcmd=new SqlCommand(;
sqlcon.Open(;sqlcmd.CommandText=checkString;sqlcmd.Connection=sqlcon;SqlDataReader dr=sqlcmd.ExecuteReader(;if(dr.HasRows { return true;} else return false;} } } 5.2用户登录与注册模块详细设计 初始登录注册界面 以下为初始界面:
主要代码实现如下: namespace TongXun { public partial class Login:Form { private Input_Check ckInput=new Input_Check(;public Login({ InitializeComponent(;}
private void Form1_Load(object sender,EventArgs e { } private void register_btn_Click(object sender,EventArgs e { Register_Form reg=new Register_Form(;reg.Show(;this.Hide(;} private void login_btn_Click(object sender,EventArgs e { if(!ckInput.UserNameCheck(textBox_name.Text||!ckInput.PassWordCheck(textBox_pwd.Text { MessageBox.Show(“您输入的用户名或密码格式错误!请查正后输入。”;return;}
string checkString=“select*from Users where UsersName='”+textBox_name.Text+“'and UsersPwd='”+textBox_pwd.Text+“'”;try { SqlConnection sqlcon=new SqlConnection(;sqlcon.ConnectionString=“Initial Catalog=TongXunLu;Data Source=(local;Integrated Security=true”;SqlCommand sqlcmd=new SqlCommand(;sqlcon.Open(;sqlcmd.CommandText=checkString;sqlcmd.Connection=sqlcon;SqlDataReader dr=sqlcmd.ExecuteReader(;if(dr.HasRows { Home HomePage=new Home(;HomePage.Show(;this.Hide(;} else
{ MessageBox.Show(“用户名或密码错误!”;} } catch(Exception error { MessageBox.Show(error.ToString(;} } //检验输入数据正确性 public class Input_Check { public bool UserNameCheck(string strInput { Regex re=new Regex(@“^[a-zA-Z]w{0,15}$”;if(!re.IsMatch(strInput { return false;}
return true;} public bool PassWordCheck(string strInput { Regex re=new Regex(@“^{0,20}$”;if(!re.IsMatch(strInput { return false;} return true;} } private void textBox_pwd_KeyPress(object sender,KeyPressEventArgs e { if(e.KeyChar==13 { if(!ckInput.UserNameCheck(textBox_name.Text ||!ckInput.PassWordCheck(textBox_pwd.Text {
MessageBox.Show(“您输入的用户名或密码格式错误!请查正后输入。”;return;} string checkString=“select*from Users where UsersName='”+ textBox_name.Text+“'and UsersPwd='”+textBox_pwd.Text+“'”;try { SqlConnection sqlcon=new SqlConnection(;sqlcon.ConnectionString=“Initial Catalog=TongXunLu;Data Source=(local;Integrated Security=true”;SqlCommand sqlcmd=new SqlCommand(;sqlcon.Open(;sqlcmd.CommandText=checkString;sqlcmd.Connection=sqlcon;SqlDataReader dr=sqlcmd.ExecuteReader(;if(dr.HasRows { Home HomePage=new Home(;HomePage.Show(;
this.Hide(;} else { MessageBox.Show(“用户名或密码错误!”;} } catch(Exception error { MessageBox.Show(error.ToString(;} } } } } 注册中显示的界面:
主要代码实现如下: namespace TongXun { public partial class Register_Form:Form { public Input_Check ckInput=new Input_Check(;public Register_Form({ InitializeComponent(;} private void button_confirm_Click(object sender,EventArgs e {
if(!ckInput.UserNameCheck(textBox_name.Text { MessageBox.Show(“请输入合法用户名!”;textBox_name.Focus(;return;} else if(!ckInput.PassWordCheck(textBox_pwd.Text { MessageBox.Show(“请输入符合要求的密码!”;return;} else if(textBox_pwd.Text!=textBox_ensurePwd.Text { MessageBox.Show(“两次密码输入不同,请重新输入!”;textBox_ensurePwd.Focus(;textBox_pwd.Focus(;} //若输入无误,则与后台数据库同步 SqlConnection conn=new SqlConnection(;
conn.ConnectionString=“initial catalog=TongXunLu;Data Source=(local;integrated security=true;”;conn.Open(;SqlCommand cmd=conn.CreateCommand(;string RegisterString=“INSERT INTO Users(UsersName,UsersPwd VALUES('”+textBox_name.Text+“','”+textBox_pwd.Text+“'”;cmd.CommandText=RegisterString;cmd.ExecuteNonQuery(;MessageBox.Show(“注册成功!”;this.Close(;Login log=new Login(;log.Show(;} //检验输入数据正确性 public class Input_Check { public bool UserNameCheck(string strInput { Regex re=new Regex(@“^[a-zA-Z]w{0,15}$”;
if(!re.IsMatch(strInput { return false;} return true;} public bool PassWordCheck(string strInput { Regex re=new Regex(@“^{0,20}$”;if(!re.IsMatch(strInput { return false;} return true;} } private void button_cancel_Click(object sender,EventArgs e { Login L=new Login(;L.Show(;
this.Hide(;} } } 5.3系统主界面设计 主界面运行截图如下:
主要代码实现如下: private void button_cancel_Click(object sender,EventArgs e { this.panel_Delete.Show(;
this.panel_WeIcome.Show(;} 5.4通讯录“显示全部”模块
用户进入主界面之后,点击显示全部按钮,则系统将数据库中数存储的所有联系人的记录显示到dataGridView2界面中,按照一定的规格排列。其中各项中的数据则严格按照数据库中的要求排列显示。
显示全部功能截图如下:
主要代码实现如下: private void button_ShowAll_Click(object sender,EventArgs e {
this.panel_ShowAll.Show(;this.panel_add.Hide(;this.panel_Search.Hide(;this.panel_Modify.Hide(;this.panel_Delete.Hide(;this.panel_WeIcome.Hide(;SqlConnection conn=new SqlConnection(;conn.ConnectionString=“initial catalog=TongXunLu;Data Source=(local;integrated security=true;”;conn.Open(;//创建SqlDataAdapter对象实例
SqlDataAdapter dataSelect=new SqlDataAdapter(“select*from Contact ”,conn;//创建DataTable对象实例 DataTable dt=new DataTable(;dataSelect.Fill(dt;//填充控件
dataGridView2.DataSource=dt.DefaultView;this.dataGridView2.RowHeadersVisible=true;conn.Close(;
} 5.5通讯录“添加”模块
用户进入通讯录系统主界面,点击添加,进行通讯录的添加操作,填写相应的内容,系统会自动判定是否符合规定要求,例如姓名、生日、年龄、电话号码、地址不能为空,相应属性的字段长度不能超出范围,邮箱格式要符合要求。可用已定义的Input_Check类中EmailCheck(方法进行检验。相关运行界面如下:
主要代码实现如下: private void button_add_Click(object sender,EventArgs e { if(textBox_Name.Text==“" {
MessageBox.Show(”请确认姓名输入是否正确!“;return;} else if(!ckInput.PassWordCheck(textBox_birth.Text { MessageBox.Show(”请确认生日日期是否正确!“;return;} else if(!ckInput.PassWordCheck(textBox_phoneNum.Text { MessageBox.Show(”请确认电话号码是否正确!“;return;} else if(!ckInput.EmailCheck(textBox_Mail.Text { MessageBox.Show(”请确认电子邮箱格式是否正确!“;return;} else if(textBox_Address.Text==”“
{ MessageBox.Show(”地址不能为空!“;} else { SqlConnection conn=new SqlConnection(;conn.ConnectionString=”initial catalog=TongXunLu;Data Source=(local;integrated security=true;“;conn.Open(;SqlCommand cmd=conn.CreateCommand(;string AddString=”INSERT INTO Contact(姓名,生日,电话,邮箱,地址
VALUES('“+textBox_Name.Text+”','“+textBox_birth.Text+”','“+textBox_phoneNum.Text+ ”','“+textBox_Mail.Text+”','“+textBox_Address.Text+”'“;cmd.CommandText=AddString;cmd.ExecuteNonQuery(;MessageBox.Show(”添加联系人成功!“;conn.Close(;textBox_Name.Clear(;textBox_birth.Clear(;textBox_phoneNum.Clear(;
textBox_Mail.Clear(;textBox_Address.Clear(;} 5.6通讯录“查找”模块
按姓名查找,若数据库中有要查找的记录则通过dataGridView1显示
出来,若不存在该记录则返回“没有您要查找的内容!”的消息框。相关截图如下:
主要代码实现如下: private void button_Search_Click(object sender,EventArgs e { try
{ if(textBox_SearchName.Text==”“ { MessageBox.Show(”查找的姓名不能为空!“;} else if(textBox_SearchName.Text!= ”“&&ise.isNameExist(textBox_SearchName.Text { string searchString=”select*from Contact where姓名='“+ textBox_SearchName.Text+”'“;SqlConnection conn=new SqlConnection(;conn.ConnectionString=”initial catalog=TongXunLu;Data Source=(local;integrated security=true;“;conn.Open(;//创建SqlDataAdapter对象实例
SqlDataAdapter dataSelect=new SqlDataAdapter(searchString,conn;//创建DataTable对象实例 DataTable dt=new DataTable(;dataSelect.Fill(dt;//填充控件
dataGridView_Search.DataSource=dt.DefaultView;this.dataGridView_Search.RowHeadersVisible=true;conn.Close(;textBox_SearchName.Clear(;} else { MessageBox.Show(”没有您要查找的内容!“;textBox_SearchName.Text=”“;textBox_SearchName.Focus(;} } catch(Exception exc { MessageBox.Show(exc.ToString(;} } 5.7通讯录“修改”模块
要修改的记录必需是数据库中已存在的记录。
主要代码实现如下: private void button_Modify_Click(object sender,EventArgs e { if(textBox_ModName.Text==”“ { MessageBox.Show(”请输入要修改的姓名!“;} else if(textBox_ModName.Text!=”“&& ise.isNameExist(textBox_ModName.Text { SqlConnection conn=new SqlConnection(;
conn.ConnectionString=”initial catalog=TongXunLu;Data Source=(local;integrated security=true;“;conn.Open(;SqlCommand cmd=conn.CreateCommand(;string ModifyString=”UPDATE Contact SET姓名='“+ textBox_ModName.Text+”',“+”生日='“+textBox_ModBirthDay.Text+”',“+”电话='“+ textBox_ModPhone.Text+”',“+”邮箱='“+textBox_ModMail.Text+”',“+”地址='“+ textBox_ModAddress.Text+”'where姓名='“+textBox_ModName.Text+”'“;cmd.CommandText=ModifyString;cmd.ExecuteNonQuery(;MessageBox.Show(”修改成功!“;textBox_ModName.Clear(;textBox_ModBirthDay.Clear(;textBox_ModPhone.Clear(;textBox_ModMail.Clear(;textBox_ModAddress.Clear(;} else { MessageBox.Show(”您要修改的记录不存在!“;
textBox_ModName.Clear(;textBox_ModBirthDay.Clear(;textBox_ModPhone.Clear(;textBox_ModMail.Clear(;textBox_ModAddress.Clear(;} } 5.8通讯录“删除”模块
在TextBox中输入要删除的记录的姓名,确认删除后连接数据库进行删除记录。若该记录不存在则返回提示信息,若操作成功,则返回“删除成功”的信息框提示。“返回首页”按钮则实现返回到登录时的界面。
主要代码实现如下: private void button_delete_Click(object sender,EventArgs e { if(textBox_deleName.Text==”“ { MessageBox.Show(”请输入要删除的姓名!“;} else if(textBox_deleName.Text!=”“&& ise.isNameExist(textBox_deleName.Text { SqlConnection conn=new SqlConnection(;
conn.ConnectionString=”initial catalog=TongXunLu;Data Source=(local;integrated security=true;“;conn.Open(;SqlCommand cmd=conn.CreateCommand(;string ModifyString=”DELETE FROM Contact WHERE姓名='“+ textBox_deleName.Text+”'“;cmd.CommandText=ModifyString;cmd.ExecuteNonQuery(;MessageBox.Show(”删除成功!“;textBox_deleName.Text=”“;} else {MessageBox.Show(”您输入的姓名不存在!“;textBox_deleName.Text = ”";} }
六、设计总结 这次的课程设计是对我们这学期 c#学习的一次大检验。自己动 手,自己发现和解决问题。发现了自己的许多不足。平时没有掌握好 的知识在这次课程设计中彻底暴露出来,经过不断思考,不断查阅资 料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。当然从这次课程设计使我们学 到了以前没有学过的很多知识,在具体的程序实践中主要是对数据库 连接和一些控件的应用有了更深的认识。使我们对 VS 程序设计有了 更深层次的认识和理解,懂得了 VS 窗体应用程序基本设计流程和 SQL Server 2000 数据库设计。这次我们是小组作业,为了使各自做的界面能够更
好的结合到一 起,我们这次设计的数据库比较简单。我们分工合作最后共同努力把 程序的基本功能基本上都实现了。我们通过对课本的研究,通过几天 的努力终于将已经完成了的程序在界面是进行了美化,可以使用户在 使用的时候能够赏心悦目。最后,在此由衷的向我的指导老师们表示衷心的感谢,是他们的 悉心指导和严格要求,才使我的课程设计有了较为完善的一面,才有
5-了我能力的提高,得到了充分的锻炼。
七、主要参考书及手册 [1] 李海涛,Visual Studio.NET 2008 开发一册通。化学工业出版社,2010 年 [2] 江维华,江维清,C#.NET 程序设计使用教程,人民邮电出版社,2007 年 [3] 明日科技,Visual C#开发技术大全,人民邮电出版社,2007 年 [4](美James Foxall,Visual C# 2008 入门经典,人民邮电出版社,2009 年
第二篇:数据结构课程设计—java通讯录管理系统
import java.io.*;import java.util.*;public class LittleProgram {
static boolean isDelete = true;
static boolean isFind = true;
public static void main(String [] args)//主方法,程序从这里开始运行
throws IOException,NumberNotFoundException
{
int choice=-1;
do{
LittleProgram lp = new LittleProgram();
System.out.println();
System.out.println(“t
#”);
System.out.println();
System.out.println(“tt通訊錄管理系统”);
System.out.println(“t
请用号码插入,查找,修改,删除数据”);
System.out.println();
System.out.println(“t
#n”);
System.out.print(“1.增加号码:n”+
“2.查找号码:n”+
“3.删除号码:n”+ “4.清除所有号码:n”+ “5.把号码全部打印到屏幕n”+ “6.把通讯录按号码排序n”+
“7.修改号码n”+
“8.统计通码讯录的总人数n”+
“9.关于作者n”+
“0.退出程序.n” +
“输入:”);
BufferedReader in =
//从终
new BufferedReader(//端接
new InputStreamReader(System.in));//收数
String inputLine = in.readLine();
//字选
choice= Integer.valueOf(inputLine).intValue();//项;
switch(choice)
{
case 1: {//1.增加号码
String str = lp.inputData();
lp.addData(str);
System.out.println(“增加号码成功.”);
timeOut(1);
}break;
case 2: {//2.查找号码
long find = 0;
System.out.print(“请输入你要查找的号码:”);
BufferedReader inn =
new BufferedReader(new InputStreamReader(System.in));
String inputLi = inn.readLine();
find = Integer.valueOf(inputLi).longValue();
lp.findData(find);
timeOut(2);
}break;
case 3: {//3.删除号码
long deleteNumber = 0;
System.out.print(“请输入你想删除号码:”);
BufferedReader bf =
new BufferedReader(new InputStreamReader(System.in));
String inputL = bf.readLine();
deleteNumber = Integer.valueOf(inputL).longValue();
lp.deleteData(deleteNumber);
if(isDelete)
System.out.println(“删除号码成功!”);
timeOut(1);
}break;
case 4: {
lp.clearData();//4.清除所有号码
timeOut(1);
}break;
case 5: {
print();//5.把号码全部打印到屏幕
timeOut(2);
}break;
case 6: {
lp.numSort();//6.把号码按号码排序
System.out.println(“按照号码从小到大排序成功!n”+
“排序后:n”);
print();
timeOut(2);
}break;
case 7: {
lp.rewrite();//7.修改号码
timeOut(2);
}break;
case 8: {
int count = lp.count();
System.out.println(“共有”+count+“个号码记录.”);
timeOut(2);
}break;
case 9: {
System.out.print(“tt李雪萍n”+
“tt安徽理工大學理學院n”+
“ttQQ:1154646392n”);
timeOut(4);
}break;
}}while(choice!= 0);
System.out.println(“Bye!^-^”);
System.exit(0);
}
public String inputData()//从终端接收数据的方法,返回字符串
throws IOException,NumberFormatException
{
System.out.print(“请依次输入 :号码 姓名 地址 生日n” +
“每项数据请用空格隔开:”);
String all = “";
try{
BufferedReader in =
//从终
new BufferedReader(//端接
new InputStreamReader(System.in));
//收数
String inputLine = in.readLine();
//据
StringTokenizer str =
new StringTokenizer(inputLine,” “);//接收的数据用空格隔开,这个类用来提取每个字符串
long num = Integer.valueOf(str.nextToken()).longValue();//号码
String name =(String)str.nextToken();
//姓名
String add =(String)str.nextToken();
// 地址
String birth =(String)str.nextToken();//出生年月
all = String.valueOf(num)+” , “+
name +” , “+
add +” , “+
String.valueOf(birth);//把所有的数据用” , “隔开然后在连起来放进字符串all
}catch(IOException e){}
catch(NumberFormatException e){}
return all;//返回字符串all
}
public void addData(String str)//增加号码的方法
throws IOException
{
String s1 =”“,s2=”“ ,s3= ”“;
File file = new File(”c:data.txt“);
if(file.exists())//如果文件data.txt存在 {
try{
BufferedReader in =
new BufferedReader(new FileReader(file));
while((s1=in.readLine())!=null)
s2+=s1+”n“;//把文件中的每行数据全部放进一个字符串s2
s2+=str+”n“;
//再把s2于形参str相连放进s2
BufferedReader in2 =
//把字符
new BufferedReader(//串s2也
new StringReader(s2));
//就是原
PrintWriter out =
//文件+
new PrintWriter(//形参str(新输入的一行数据)
new BufferedWriter(//重新写进data.txt
new FileWriter(file)));
//覆盖原来的数据
while((s3=in2.readLine())!= null)
{
out.println(s3);
}
out.close();
//System.out.println(”write data true.“);
}catch(IOException e){}
}else{
System.err.println(”File “data” Missing!“);
}
}
public void clearData()//清除data.txt的所有数据的方法
throws IOException
{
File file = new File(”c:data.txt“);
if(file.exists())//如果文件在{
try{
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(file)));
out.print(”“);//在文件data.txt里写进一个空字符,所以清除了原来的内容
out.close();//关闭文件
System.out.println(”clear data true!“);
}catch(IOException e){}
}else{
System.err.println(”File “data” Missing!“);
}
}
public void deleteData(long deleteNumber)//删除某条号码数据
throws IOException,FileNotFoundException
{
isDelete = true;
try{
DataMap mp = new DataMap();//生成一个自己编写的容器
long j=0;
String s1=”“,s2=”“,s3=”“;
BufferedReader in =
new BufferedReader(new FileReader(”c:data.txt“));
while((s1=in.readLine())!=null)
{
j=numberTokenizer(s1);
mp.put(j,s1);
}
try{
if(mp.containsKey(String.valueOf(deleteNumber).toString()))
{
mp.remove(deleteNumber);
}else
throw new NumberNotFoundException();
Collection c = mp.values();
Iterator iter = c.iterator();
while(iter.hasNext())
{
s1 =(String)iter.next();
s3 +=s1+”n“;
}
BufferedReader in2 =
new BufferedReader(new StringReader(s3));
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(”c:data.txt“)));
//System.out.println(”delete No“+deleteNumber);
while((s1 = in2.readLine())!=null)
{
out.println(s1);
} out.close();}catch(NumberNotFoundException e){
isDelete = false;
System.out.println(deleteNumber+” no found :(“);
}
}catch(IOException e){}
}
public long numberTokenizer(String s)
throws IOException
{
StringTokenizer st =
new StringTokenizer(s,” “);
return Integer.valueOf((st.nextToken())).longValue();
}
public void findData(long find)//查找数据
throws IOException,NumberNotFoundException
{
isFind = true;
String s = ”“,findString =”“;long i;DataMap dm = new DataMap();BufferedReader in =
new BufferedReader(new FileReader(”c:data.txt“));
while((s=in.readLine())!=null)
{
i=numberTokenizer(s);
dm.put(i,s);
}
//in.close();
try{
if(dm.containsKey(String.valueOf(find).toString()))
{
findString = dm.get(find);
System.out.println(”学号“+find+”学生的资料是:“);
System.out.println(findString);
}else
throw new NumberNotFoundException();
}catch(NumberNotFoundException e){
System.out.println(find+” no found :(“);
isFind = false;
}
}
public static void print()//读取文本文件把数据打印到终端的方法
throws IOException
{
try{
BufferedReader in =
new BufferedReader(new FileReader(”c:data.txt“));
String read = ”“;
while((read = in.readLine())!=null)
System.out.println(read);
}catch(IOException e){}
}
public static void timeOut(double sec)//停顿短暂时间的一个方法完全可以不要这个功能
{
double seconds = sec;
long t = System.currentTimeMillis()+(int)(seconds*1000);
while((System.currentTimeMillis()) ; } public void numSort()//按学号排序 throws IOException { long i = 0; String s = ”“; try{ DataArrayList dal = new DataArrayList(); BufferedReader in = new BufferedReader(new FileReader(”c:data.txt“)); while((s=in.readLine())!=null) { i=numberTokenizer(s); dal.add(i); } Collections.sort(dal); DataMap dm = new DataMap(); BufferedReader in2 = new BufferedReader(new FileReader(”c:data.txt“)); while((s=in2.readLine())!=null) { i=numberTokenizer(s); dm.put(i,s); } PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(”c:data.txt“))); Iterator it = dal.iterator(); long temp = 0; String tempStr = ”“; while(it.hasNext()) { temp = Integer.valueOf((String)it.next()).longValue(); tempStr = dm.get(temp); out.println(tempStr); } out.close(); }catch(IOException e){} } public void rewrite() throws IOException,NumberNotFoundException { try{ System.out.print(”请输入你要修改的学生号码:“); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String inputLine = in.readLine(); long num = Integer.valueOf(inputLine).longValue(); findData(num); if(isFind) { deleteData(num);System.out.print(”请重新输入该号码:“);String str = inputData(); addData(str); System.out.println(”rewrite true!“); } }catch(IOException e){} catch(NumberNotFoundException e){} } public int count() throws IOException { DataArrayList dal = new DataArrayList(); try{ String s = ”“; long i =0; BufferedReader in = new BufferedReader(new FileReader(”c:data.txt“)); while((s=in.readLine())!=null) { i=numberTokenizer(s); dal.add(i); } }catch(IOException e){} return dal.size(); } } /* * * @author RangWei * TODO 这是个写的一个容器,继承公共类HashMap * 大概的功能就相当一个数组 * */ class DataMap extends HashMap//一个存储数据的Map { public void put(long i,String str)//把学号和数据放进这个Map { //以后一个学号(key)对应的是一个人的数据(value) put(String.valueOf(i).toString(),str); } public void remove(long i)//接收学号,然后删除学号(key)和它对应的数据(value) { remove(String.valueOf(i).toString().toString()); } public String get(long i)//接收一个学号,然后返回这个key对应的value { String s = String.valueOf(i).toString(); if(!containsKey(s)) { System.err.println(”Not found Key: "+s); } return(String)get(s); } } /* * * @author RangWei * * TODO 这个类继承ArrayList * 用来按数字排序,在用号码排序时要用到它 * */ class DataArrayList extends ArrayList { public void add(long num) { String numToString = String.valueOf(num).toString(); add(numToString); } } /* * * @author RangWei * * TODO 增加的一个Exception,主要是在文件里没有要找 * 的号码就抛出 * */ class NumberNotFoundException extends Exception { public NumberNotFoundException() {} } 信息科学与技术学院 程序设计基础课程设计报告 题目名称: 通信管理系统 学生姓名: 学 号: 专业班级: 指导教师: 2016年 12月 31日 目录 1.课程设计题目与要求........................1 1.1设计题目..........................................1 1.2设计要求..........................................1 2.总体设计..................................2 2.1 总体功能框架......................................2 2.2 数据结构概要设计..................................2 3.详细设计..................................3 3.1 数据结构详细设计..................................3 3.2 系统功能详细设计.................................10 4.运行结果.................................16 5.课程设计总结.............................20 5.1 编程中的问题及解决方法...........................20 5.2 小结.............................................20 5.3 心得体会.........................................20 5.4 程序设计方法.....................................20 参考文献...................................21 1.课程设计题目与要求 1.1设计题目 通信管理系统 1.2设计要求 用C/C++设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。 (一)功能要求 (1)查看功能:选择此功能时,列出下列三类选择。 A 办公类 B 个人类 C 商务类,当选中某类时,显示出此类所有数据中的姓名和电话号码) (2)增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件)。例如 杨春 *** 商务类 Chuny@126.C++om 当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。 (3)拔号功能:能显示通信录中所有人姓名,当选中某个姓名时,屏幕上模拟打字机的效果依次显示此人电话号码中的各个数字,并伴随相应的拔号声音。 (4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改(5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。 (二)其它要求: (1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)(3)建议使用结构和链表等数据结构 (4)学生可自动增加新功能模块(视情况可另外加分)2.总体设计 2.1 总体功能框架 新增联系人查看通信录拨号 功能模块 修改信息删除联系人导入通信录导出通信录 退出系统 图 2-1 总体功能框架图 2.2 数据结构概要设计 本通信管理系统采用的数据结构为线性表中的链表。链表的结构体成员分为数据域和指针域。数据域为联系人(contacts)结构体,成员有联系人姓名(name)、联系人电话号码(teleNum)、联系人类别(classes)、电子邮件(email)四个。 图 2-2 数据结构组成 3.详细设计 3.1 数据结构详细设计 结构体名称:contact,LNode,*LinkList typedef struct { string name;//姓名 string teleNum;//电话号码 int classes;//分类 string email;//电子邮件 }contacts; typedef struct LNode { contacts data;//数据域 struct LNode* next;//指针域 }LNode,*LinkList; 具体操作: InitList(&L)操作结果:初始化链表 具体代码: int InitList(LinkList &L){ L = new LNode;L->next = NULL;return 0;} CreateList_H(&L,n)操作结果:前插法创建一个链表 具体代码: void CreateList_H(LinkList &L,int n){ LinkList p;for(int i = 0;i < n;i++)//根据联系人个数创建链表 { p = new LNode;cout <<“请输入联系人的姓名:”; cin >> p->data.name;cout <<“请输入联系人的电话号码:”;cin >> p->data.teleNum;cout <<“请输入联系人的分类(分类如下,输入相应序号即可)”<< endl;cout <<“1 办公类 2 个人类 3 商务类”<< endl;cin >> p->data.classes;cout <<“请输入联系人的电子邮件:”;cin >> p->data.email;p->next = L->next;L->next=p;} } CheckAll(L,c) 操作结果:显示类别为c的联系人姓名和电话号码 具体代码: void CheckAll(LinkList L,int c)//c是联系人类别 { LinkList p; p = L->next; cout <<“姓名tt”<<“电话号码”<< endl;//表头 while(p)//当链表没到尾部时 { if(p->data.classes==c)//若符合类别则输出联系人姓名和电话号码 { cout << p->data.name <<“tt”<< p->data.teleNum << endl; } p=p->next; } } CheckAll(L) 操作结果:显示已有联系人的姓名 具体代码: void CheckAll(LinkList L){ LinkList p;p=L->next;while(p) { cout << p->data.name << endl;p=p->next;} } Search(L, name) 操作结果:找到名为name的联系人位置 具体代码: LinkList Search(LinkList L,string name){ LinkList p;p=L->next;while(p&&p->data.name!=name)//当链表没到尾部且没找到联系人时 { p=p->next;} return p;} IfExist(L, c)操作结果:判断是否存在联系人contacts 具体代码: char IfExist(LinkList L,contacts c){ LinkList p;p=L->next;while(p&&p->data.name!=c.name)//根据姓名查找是否存在该联系人 { p=p->next;} if(!p)//若到达链表尾部,则不存在 return 'n';if(p->data.teleNum==c.teleNum)//若找到联系人姓名 if(p->data.classes==c.classes)//依次判断电话号码、类别、电子邮件是否相同 if(p->data.email==c.email)return 'y';return 'n';} Length(L) 操作结果:获取链表的长度 具体代码: int Length(LinkList L){ int i=0;LinkList p=L->next;while(p){ ++i;p=p->next;} return i;} Add(&L, c)操作结果:把contacts添加到链表中 具体代码: int Add(LinkList &L,contacts c){ LinkList p,s;if(Length(L)>=MAXSIZE)//判断链表长度是否达到最大值 { cout <<“存储空间已满,无法新增联系人!”<< endl;return 0;} if(IfExist(L,c)=='y')//判断输入的联系人是否已经存在 { cout <<“对不起,您输入的联系人已存在!”<< endl;return 0;} //若通讯录中不存在该联系人,则增加到通信录 p=L;s=new LNode;s->data=c;s->next=p->next;p->next=s;return 0;} Dail(L,name) 操作结果:拨打姓名为name的联系人的电话 具体代码: void Dail(LinkList L,string name){ LinkList p,s;p=L->next;s=Search(L,name);//根据姓名查找联系人所在 //模拟打字机效果,输出联系人电话号码 string tele=s->data.teleNum;for(int i=0;i cout << endl;//播放声音 PlaySound(“E:670.wav”,NULL,SND_FILENAME|SND_ASYNC);} ChangeInfo(&L,name)操作结果:修改姓名为name的联系人的信息 具体代码: void ChangeInfo(LinkList &L,string name){ LinkList p;p=Search(L,name);//找到联系人的位置所在 cout <<“ 请输入要修改的信息(输入对应序号即可):”<< endl;cout <<“1 姓名”<< endl;cout <<“2 电话号码”<< endl;cout <<“3 分类”<< endl;cout <<“4 电子邮件”<< endl; //根据选择修改联系人信息 int elec;cin >> elec;switch(elec){ case 1: { cout <<“姓名改为:”<< endl;string newName;cin >> newName;p->data.name=newName;break;} case 2: { cout <<“电话号码改为:”< cout <<“分类改为(分类如下,输入相应序号即可)”;cout <<“1 办公类 2 个人类 3 商务类”<< endl;int newCalsses;cin >> newCalsses;p->data.classes=newCalsses;break;} case 4: { cout <<“电子邮件改为:”<< endl;string newEmail;cin >> newEmail;p->data.email=newEmail;break;} } } Delete(&L,name)操作结果:删除姓名为name的联系人 具体代码: void Delete(LinkList &L,string name){ LinkList p=L,s;//找到需删除联系人的前一个位置 while(p->next&&p->next->data.name!=name){ p=p->next;} s=p->next;p->next=s->next;delete s;//删除联系人 } Read(L)操作结果:从文件中读入信息到链表 具体代码: void Read(LinkList L){ LinkList p; //打开文件导入通信录 ifstream fin;fin.open(“通信录.txt”,ios::in);string s1,s2,s3,s4;fin >> s1 >> s2 >> s3 >> s4; while(!fin.eof())//当没有到文件尾时 { string s5; contacts c; fin >> c.name >> c.teleNum >> s5 >> c.email; if(s5.compare(“办公类”)==0) c.classes=1; if(s5.compare(“个人类”)==0) c.classes=2; if(s5.compare(“商务类”)==0) c.classes=3; Add(L,c);//将联系人c增加到链表中 } fin.close();} 操作结果:将所有联系人导出到文件里保存 具体代码: void Write(LinkList L)Write(L){ endl; } LinkList p=L->next;int l=Length(L);//打开文件写入通信录 ofstream fout(“通信录.txt”,ios::out|ios::trunc);fout <<“姓名t”<<“电话号码t”<<“分类t”<<“电子邮件 ”<< for(int i=0;i case 1: { fout <<“办公类”; break; } case 2: { fout <<“个人类”; break; } case 3: { fout <<“商务类”; break; } } fout <<“t”<< p->data.email;if(i<(l-1)) fout << endl;p=p->next;} fout.close();3.2 系统功能详细设计 3.2.1 文件数据读出(1)函数原型: void CreateList_H(LinkList &L,int n)(2)函数功能: 创建链表,给链表增加n个联系人 (3)函数形参: CreateList_H(&L,n),其中L是链表指针,n是增加的联系人的数目 (4)函数算法流程:如图3-1所示 3-1算法流程图1 3.2.2 文件数据读出 (1)函数原型: int Add(LinkList &L,contacts c)(2)函数功能: 单个增加联系人 (3)函数形参: Add(&L, c),其中L是链表指针,c是具体的联系人(4)函数算法流程:如图3-2所示 3-2算法流程图2 3.2.3 文件数据读出 (1)函数原型:void Dail(LinkList L,string name)(2)函数功能: 拨打姓名为name的联系人的电话,在拨打时依次显示此人电话号码中的各个数字,并伴随相应的拔号声音 (3)函数形参: Dail(L, name),其中L为链表指针,name为拨号的联系人的姓名 (4)函数算法流程:如图3-3所示 3-3 算法流程图3 3.2.4 文件数据读出 (1)函数原型: void ChangeInfo(LinkList &L,string name)(2)函数功能: 修改姓名为name的联系人的信息 (3)函数形参: ChangeInfo(&L,name),其中L为链表指针,name为将要修改信息的联系人的姓名 (4)函数算法流程:如图3-4所示 3-4 算法流程图4 3.2.5 文件数据读出 (1)函数原型: void Delete(LinkList &L,string name)(2)函数功能: 从链表中删除姓名为name的联系人 (3)函数形参: Delete(&L,name),其中L为链表指针,name为将要删除的联系人的姓名 (4)函数算3-5所示 法流程:如图 3-5 算法流程图5 3.2.6 文件数据读出 (1)函数原型: void Read(LinkList L)(2)函数功能: 将文件中的联系人信息导入通信管理系统中(3)函数形参:Read(L),其中L为链表指针(4)函数算法流程:如图3-6所示 3-6 算法流程图6 3.2.7 文件数据读出 (1)函数原型: void Write(LinkList L)(2)函数功能: 将通信管理系统中所有联系人的各项信息有序的导出,保存在文件里 (3)函数形参: Write(L),其中L为链表指针(4)函数算法流程:如图3-7所示 3-7 算法流程图7 4.运行结果 (1)打开系统,显示主菜单界面,如图4-1所示: 图4-1 主菜单界面 (2)输入数字1,进行新增联系人的操作。接着输入1选择批量增加,输入数字2选择单个增加。批量增加如图4-2所示,单个增加如图4-3所示: 图4-2 批量增加联系人 图4-3 单个增加联系人 (3)输入数字2,进行查看通信录的操作,然后选择联系人的类别,查看此类中的所有联系人姓名及电话号码,如图4-4所示: 图4-4 按类别查看联系人 (4)输入数字3,进行拨号操作,如图4-5所示: 图4-5 拨号 (5)输入数字4,进行修改信息操作,然后输入将要修改信息的联系人姓名,再选择学要修改的信息项,如图4-6所示: 图4-6 修改联系人信息 (6)输入数字5,然后输入将要删除的联系人姓名,进行删除联系人的操作,如图4-7所示: 图4-7 删除联系人 (7)输入数字6,进行导入通信录操作,将文件“通讯录.txt”中的联系人信息导入通讯管理系统,如图4-8所示: 图4-8 导入通信录 (8)输入数字7,进行导出通信录操作,如图4-9所示;导出的通信录如图4-10所示: 图4-9 导出通信录 图4-10 已导出通信录列表 (9)输入数字0,退出通信管理系统,如图4-11所示: 图4-11 退出通信管理系统 5.课程设计总结 5.1 编程中的问题及解决方法 在本次程序设计过程中,遇到的主要问题是模拟打字机效果输出联系人电话号码以及从导入通信录。 前者是由于对字符串的理解不到位,后来查阅了相关资料后意识到可以将字符串看作字符数组,从而获取单个的字符,然后在每个字符的输出后利用系统的休眠函数Sleep设置停顿,从而达到想要的效果。 后者是因为在导出通信录的时候多输出了一个回车换行符,导致在进行文件读入时多读入一个回车换行符,以至于总是多一个联系人。然后便在导出文件时,不再在末尾输出回车换行符,从而解决了该问题。5.2 小结 总的来说这次课程设计完成总体较好。首先在已经学习了的数据结构基础上,我很快的想出了具体的设计思路,接着利用课余时间写出了大体的框架。再写出大题框架后随即进行了细节的完善,最后大概用了两天时间进行各项功能的调试。在代码的编写过程中并未产生太大瓶颈,遇到问题在查阅相关资料以及仔细调试后也得到了很好地解决,这是一次能好的体验,也是对自己能力的一次考验。5.3 心得体会 经过这次课程设计,我对数据结构这门课程有了更深刻的了解,不再仅仅是书本上抽象的代码,还对如和将数据结构应用到具体的实例中有了更好的认识。编程不仅需要对理论知识的理解,更重要的是它实际的应用,只有具体地进行过程序的设计,才能有更深刻的记忆和领会。同时通过查阅资料和读别人的代码,我也学会到一些新的内容和一些巧妙的思想。5.4 程序设计方法 本程序设计主要采用的方法是利用结构体进行编程,而采用的数据结构是线性表中的链表结构。参考文献 [1] 严蔚敏,吴伟民.数据结构(c语言版)[M].2.北京:清华大学出版社,2016 [2] 陈维新,林小茶.c++面向对象课程设计教程[M].清华大学出版社 目录 一、设计目的.............................................1 二、需求分析.............................................2 2.1系统需求简介.......................................2 2.1.1系统目标......................................2 2.1.2功能需求分析..................................2 2.1.3性能需求分析..................................2 2.2系统业务功能分析...................................2 2.2.1具体分析有两个角色:老师和学生................3 2.2.2流程图.......................................3 三、模块分析及设计.......................................3 四、数据库设计...........................................4 4.1数据字典..........................................4 4.1.1数据流.......................................4 4.1.2 数据存储.....................................4 4.2 E-R图...........................................5 4.3系统数据库的设计...................................6 五、设计过程及要点.......................................9 5.1数据库及窗体设计...................................9 5.2 主要代码........................................11 六、设计总结............................................12 七、参考资料............................................12 一、设计目的 为了提高高校学生成绩信息的管理效率,方便学生和教师对学生成绩信息进行查询、方便学校里面管理员去管理和查询学生信息,建立一个学生成绩管理系统,使学生信息管理工作规范化,系统化,程序化,避免学生成绩管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改学生信息是必须而且十分迫切的工作。本次课程设计题目为《学生成绩管理系统》,涉及成绩管理系统的登录界面、老师对学生成绩的查询、学生对学生成绩的查询、以及老师对学生成绩的增删改查分析统计等内容。本功能实现对学生信息、教师信息情况信息的管理和统计、课程信息和成绩信息查看及维护。 本课程设计的目的是使学生能熟练掌握简单的简单Windows窗体应用程序的设计和数据库的应用,希望通过本次课程设计锻炼学生使用C#语言解决实际问题的能力。本系统后台数据库采用Microsoft SQL Server 数据库,该数据库系统在安全性、准确性和运行速度方面有绝对的优势,并且处理数据量大,效率高;前台采用Microsoft 公司的Visual Studio 2008作为主要开发工具,可与SQL Server 2005数据库无缝链接。本报告详细的介绍了学生信息管理系统的开发过程,主要涉及到的工作如下:设计目的、需求分析、模块分析及设计、数据库设计、制作过程及要点、设计总结。 二、需求分析 2.1系统需求简介 2.1.1系统目标 根据查询条件实现学生信息的查询 学生选课信息查询、成绩信息的查询 (3)学生信息、课程信息、成绩信息的增加、删除、修改(4)对基本信息完成增加、删除、修改时,需注意表与表之间的关联 2.1.2功能需求分析 本系统的功能需求分析如下: 学生信息查询:学生可以根据学号、姓名、专业进行查询.学生信息管理:主要是用于学生信息更新、插入、删除; 学生成绩录入:用于学生成绩管理,录入学生成绩,也可以更新。 2.1.3性能需求分析 (1)登录、用户界面需求:简洁、易懂、易用、友好的用户界面。(2)安全保密性需求:只有凭借用户名和密码登陆系统,才能进行信息的管 理等。 2.2系统业务功能分析 2.2.1具体分析有两个角色:老师和学生 学生只能有查询的权利,其中包括按学号查询,按姓名查询和按课程号查询; 而老师则有查询以及对学生成绩增删改查分析统计功能,而分析主要是分析每一课程的及格人数,不及格人数和及格率等,统计则是统计各个班级和课程成绩的升序排序等。 2.2.2流程图 图一 总流程图 三、模块分析及设计 《学生成绩管理系统》包括 5个模块:登录及主界面,成绩添加,成绩查询,成绩增删改,成绩分析与统计。登陆及主界面:用户人员在登录界面中输入用户名与密码。通过用户名与数据库里的用户表相比配,将学生与教师区分开,二者各自进入自己的页面。二者拥有各自权限,分别拥有不同的功能。 成绩添加:主要实现学生成绩的添加功能,将学生的各种信息添加到数据库中。 成绩查询:主要三种方式,按学号,按姓名,按课程号查询学生的成绩。 成绩增删改:主要是老师对学生的各项信息或成绩的修改,删除,添加等,以实现学生成绩管理系统的及时更新。 成绩分析统计:对学生成绩的分析统计包括各个学生或课程的及格人数,不及格人数,及格率,学生成绩的排序等等。 四、数据库设计 4.1数据字典 4.1.1数据流 课程信息:课程号,课程名称,学期,课程时间,学分等信息 学生信息:学号,姓名,专业,性别,生日,年龄,现状等信息 教师信息:教师编号,姓名等信息 4.1.2 数据存储 成绩表:包括学生姓名,学号,课程号,成绩等信息 登录信息表:包括学生学号,密码及教师编号,密码等信息 4.2 E-R图 图二 学生信息E-R图 图三 课程信息E-R图 图四 教师信息E-R图 图五 总E-R图 4.3系统数据库的设计 综合以上分析,要实现系统功能,应该建立如下表: 表一 课程表 表二 学生表 表三 成绩表 表四 教师表 表五 用户表 五、设计过程及要点 这次课程设计我主要做数据库和登陆界面的设计并实现该系统的登录功能。 5.1数据库及窗体设计 其中数据库我一共设计了五个表,分别是学生表,课程表,成绩表,教师表和用户表,这些表的详细信息已经在上面有了介绍。 然后就是登录功能的实现。 图六 登录窗体 登录窗体主要用了3个label控件,2个textbox控件,2个radioButton控件,2个button控件,实现了教师跟学生的登录,用户名跟密码输入正确后,选择老师或者学生后分别进入各自的主界面,在主界面中可以对学生的成绩进行查询,删除等等操作。老师和学生的主界面分别如下图: 图七 学生主界面 图八 教师主界面 5.2 主要代码 namespace WindowsFormsApplication1 { public partial class 登录 : Form { public 登录(){ InitializeComponent();sqlhelper = new Sqlhelper(“server=.;database=xscj;integrated security=true”);} Sqlhelper sqlhelper private void button1_Click(object sender, EventArgs e){ string sn;string str = “server=.;database=xscj;integrated security=true”;SqlConnection conn = new SqlConnection(str);conn.Open(); if(radioButton1.Checked){ textBox1.Text.Trim()+ “'and password='” +textBox2.Text.Trim()+ “'”;SqlCommand comm = new SqlCommand(cstr, conn);SqlDataReader dr = comm.ExecuteReader();if(dr.Read()){ sn = textBox1.Text.Trim();教师界面 f1 = new 教师界面();f1.Show();this.Visible = false;} else { MessageBox.Show(“输入有误,请重新输入!”);textBox1.Text = “";textBox2.Text = ”“;} } if(radioButton2.Checked){ string cstr = ”select * from [user] where type='教师'and uid='“ + 11 string cstr = ”select * from [user] where type='学生'and uid='“ +textBox1.Text.Trim()+ ”'and password='“ + textBox2.Text.Trim()+ ”'“;SqlCommand comm = new SqlCommand(cstr, conn);SqlDataReader dr = comm.ExecuteReader();if(dr.Read()){ sn = textBox1.Text.Trim();学生界面 f2 = new 学生界面();f2.Show();this.Visible = false;} else { MessageBox.Show(”输入有误,请重新输入!“);textBox1.Text = ”“;textBox2.Text = ”";} } conn.Close();conn.Dispose();} } } 六、设计总结 为期一周的课程设计结束了,在老师和同学的帮助下,我基本完成系统的设计。我们小组按照系统工程软件设计的要求,从设计目的、需求分析、模块分析及设计、数据库设计等各个步骤,分步完成系统的各项任务,实现了系统中的学生信息查询,学生信息增删改,学生信息添加等模块的功能。 在这短短的五天里收获如下: 巩固和加深了对C#的理解,提高综合运用本课程所学知识的能力。 2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。 3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。 4、更加深刻的了解了小组团队协作的重要性,只有整个小组的人通力合作才可能会完成一个项目并且进步。 根据我在课程设计中遇到的问题,我将在以后的学习当中注意以下几点: 认真上好专业实验课,多在实践中锻炼自己。 2、写程序的过程中要考虑周到,严密。 3、在做设计的时候要有信心,有耐心,切勿浮躁。 4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。 5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。 七、参考资料 [1] 钱能.C++程序设计,2008,16(2):233-237 [2] 钱能.C++程序设计试验指导,2008.34(3):35-38 [3] 谭浩强.C程序设计.北京:清华大学出版社,2001 13 课 程 设 计 任 务 书 题 目 C语言课程设计 系 (部) 专 业 班 级 学生姓名 学 号 06 月 信息科学与电气工程学院 计算机科学与技术 计职141 王雪 140819139 日至 07 月 04 日 共 周 指导教师 院 长 2015 年 6月 23日 一、课程设计目的 将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。通过课程设计,学生在下述各方面的能力应该得到锻炼: (1)进一步巩固、加深学生所学专业课程《C++程序设计语言》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。 (2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。 (3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。 (4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 (5)掌握结构化程序设计方法,熟悉面向对象程序设计方法。(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。(7)进一步掌握在集成环境下如何调试程序和修改程序。设计功能 录入联系人信息(包括姓名、电话号码、地址等信息);通讯录管理系统要求实现以下功能: 1、输入每一位联系人记录,将其信息存入文件中。 2、查询所有联系人的信息,并按可选的自定义规则进行排序; 3、记录修改,将修改的记录信息保存于文件中。设计要求 1、设一个通信录由以下几项数据信息构成: 数据项 类型 姓名 字符串 地址 字符串 邮政编码 字符串 电话号码 字符串 试为通信录数据定义类型和定义通信录变量,实现功能:存取、显示、删除记录、查询记录等功能。 2、要求:界面友好,易于操作 总体设计 系统功能模块图: 添加:可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱等后,会提示是否继续添加。 显示:可以以表格形式输出所有通讯录里的记录 删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容 查询:可以选择用姓名、电话、地址三种方式查询 修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱即可完成修改 保存:,输入文件名(带后缀名)后,即可将通讯录信息保存到文件 课程设计名称及内容 课程设计名称:单项选择题标准化考试系统 设计内容:设计并实现一个单项选择题标准化考试系统。该系统可以完成试题录入、试题抽取、自动判卷等功能。 任务和要求 功能要求: (1)用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)(2)试题录入:可随时增加试题到试题库中 (3)试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)(4)答题:用户可实现输入自己的答案 (5)自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。 (二)其它要求: (1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)(3)学生可自动增加新功能模块(视情况可另外加分) 主要知识点 l 面向对象程序设计方法 l 界面制作,switch的应用。l 类和对象。l 动态数组(链表)类模板。l 文件的读写。 五、其他 程序设计可在Microsoft VC++6.0、Borland C++ Builder环境下进行。 六、参考资料 【1】《C语言程序设计》,谭浩强编,清华大学出版社,2008年 出版 【2】《C语言程序设计》,吴明发编,北京理工大学出版社,2007年出版 【3】《C语言参考手册》邱仲潘 机械工业出版社,2004年出版 【4】《C语言课程设计案例精编》 姜灵之 清华大学出版社 2008年出版 详细设计(1).通讯录: 主要代码 #include //结构体 { };class inter { private: student st[35];char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40];public: void add(char no[13],char name[20],char address[100],char tel_no[12],char post_code[7],char e_mail[40]); void del(char name[20]);void find1(char no[13]);void find2(char name[20]);void list1();void list2();int correct(char name[20]);void read();void write();void format();int back(){ cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; } void print(int i){ cout<<“学号:”< }; } cout<<“电话号码:”< inter a;a.format();char select1;cout< 计职141 ” < <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < ※” < 通 迅 录 ※” < ※” < ※” < ※” < ※” < <<“tt ”< <<“ttt选择 :”;cin>>select1; switch(select1){ case '1':cout<<“ (1)添加:”< cout<<“ (2)删除:”< (3)修改:”< 请选择:”< 输入添加的资料:”< char name[20]; char address[100]; char tel_no[12]; char post_code[7]; char e_mail[40]; cout<<“ 输入学号:”< 输入姓名:”< 输入地址:”< 输入电话号码:”< 输入邮编:”< cout<<“ 输入E_mail:”< cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_add;cin>>back_add;if(back_add=='R'||back_add=='r')goto top;else goto bottom;break;case '2':cout<<“ 输入要删除人的姓名:”< char name2[20];cin>>name2;a.del(name2); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_del;cin>>back_del;if(back_del=='R'||back_del=='r')goto top;else goto bottom;break;case '3':cout<<“ 输入需要修改人的姓名:”< char name3[20];cin>>name3;if(a.correct(name3)) } goto top;else goto bottom;break;break;case '2':cout<<“ (1)根据姓名查找”< cout<<“ (2)根据学号查找”< 请选择: ”;cin>>select3;switch(select3){ case '1':char name4[20]; cout<<“ 输入姓名: ”;cin>>name4;a.find2(name4); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_f1;cin>>back_f1;if(back_f1=='R'||back_f1=='r')goto top;else goto bottom;break;case '2':char no4[13];cout<<“ 输入学号: ”;cin>>no4; a.find1(no4); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; } break;char back_f2;cin>>back_f2;if(back_f2=='R'||back_f2=='r')goto top;else goto bottom;break;case '3':a.write();cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_w;cin>>back_w;if(back_w=='R'||back_w=='r')goto top;else goto bottom;break;case '4':cout<<“ (1)按学号排序:”< cout<<“ (2)按姓名排序:”< 请选择:”;char select4;cin>>select4;switch(select4){ case '1':a.list1(); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back;cin>>back;if(back=='R'||back=='r')goto top;else goto bottom;break;case '2':a.list2(); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; } break;char back1;cin>>back1;if(back1=='R'||back1=='r')goto top;else goto bottom;break;case '5':a.read();cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_r;cin>>back_r;if(back_r=='R'||back_r=='r') goto top;else goto bottom;break;case '6':cout<<“ 请确认删除所有资料!(Y/N) ”; char select5;cin>>select5;if(select5=='Y'||select5=='y')a.format();cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; } char back_f;cin>>back_f;if(back_f=='R'||back_f=='r')goto top;else goto bottom;break;bottom:cout<<“ ★★★★★★★★★★★★欢迎使用本软件!★★★★★★★★★★★ ”< void inter::add(char no[13],char name[20],char address[100],char tel_no[12],char post_code[7],char e_mail[40]){ int x=1;for(int i=0;i<35;i++)return 0; } { } if(!strcmp(st[i].no,“0”)){ } if(x==0)break;strcpy(st[i].address,address);strcpy(st[i].e_mail,e_mail);strcpy(st[i].name,name);strcpy(st[i].no,no);strcpy(st[i].post_code,post_code);strcpy(st[i].tel_no,tel_no);x=0;//删除联系人 void inter::del(char name[20]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)){ strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”);strcpy(st[i].name,“0”);strcpy(st[i].no,“0”);strcpy(st[i].post_code,“0”);strcpy(st[i].tel_no,“0”); } } } else x=0;if(x==0)cout<<“ error:输入姓名错误!”< int inter::correct(char name[30]){ int x;for(int i=0;i<35;i++){ } char select;cout<<“ (1)修改姓名:”< (2)修改学号:”< (3)修改地址:”< (4)修改邮编:”< (5)修改电话号码:”< (6)修改E_MAIL:”< 请选择:”;cin>>select;switch(select){ case '1':cout<<“ 输入要修改的姓名:”;char name1[30];if(!strcmp(st[i].name,name))x=i; cin>>name1;strcpy(st[x].name,name1);cout<<“ 修改成功!”< 输入要修改的学号:”; char no1[13];cin>>no1;strcpy(st[i].no,no1);cout<<“ 修改成功!”< 输入要修改的地址:”; char address1[100];cin>>address1;strcpy(st[x].address,address1);cout<<“ 修改成功!”< 输入要修改的邮编:”; char post_code1[7];cin>>post_code1;strcpy(st[x].post_code,post_code1);cout<<“ 修改成功!”< 输入要修改的电话号码:”;char tel_no1[12]; cin>>tel_no1;strcpy(st[x].tel_no,tel_no1);cout<<“ 修改成功!”< 输入要修改的E_MAIL:”; char e_mail1[40]; cin>>e_mail1; strcpy(st[x].e_mail,e_mail1); cout<<“ 修改成功!”< return back(); break;} } //按学号查询联系人 void inter::find1(char no[13]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,no)) { x=i; z=0; } else y=0; if(z==0)break; } if(y==0)cout<<“ 输入的学号查找不到!!”< print(x);} //按姓名查询联系人 void inter::find2(char name[20]){ } //读取文件 void inter::read(){ int x,y=1,z=1;for(int i=0;i<35;i++){ } if(y==0)cout<<“ 输入的姓名查找不到!!”< } else y=0;if(z==0)break;x=i;z=0; print(x); char name1[20];cout<<“ 输入你要导入的文件名: ”;cin>>name1;strcat(name1,“.txt”);ifstream file(name1);char line[120];char no[120];char name[120];char address[120];char post_code[120];char tel_no[120];char e_mail[120];int time=0;file.getline(line,120);while(!file.eof()){ for(int k=0;k<35;k++){ if(time==0){ strcpy(no,line);time=1;for(int i=0;i<120;i++){ if(no[i]==':'){ i++;for(int j=0;j<13;j++) } } { } st[k].no[j]=no[i];i++;file.getline(line,120,'n');} if(time==1){ } if(time== 2){ strcpy(name,line);time=2; for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(name[i]==':'){ } i++;for(int j=0;j<20;j++){ } st[k].name[j]=name[i];i++; } strcpy(address,line);time=3;for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(address[i]==':'){ } i++;for(int j=0;j<100;j++){ } st[k].address[j]=address[i];i++;if(time==3){ strcpy(tel_no,line);time=4;for(int i=0;i<120;i++){ if(tel_no[i]==':'){ i++;for(int j=0;j<12;j++){ st[k].tel_no[j]=tel_no[i]; } } } } i++;file.getline(line,120,'n'); if(time==4){ } if(time==5){ strcpy(e_mail,line);strcpy(post_code,line);time=5;for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(post_code[i]==':'){ } i++;for(int j=0;j<7;j++){ } st[k].post_code[j]=post_code[i];i++; } } } } time=0;for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(e_mail[i]==':'){ } i++;for(int j=0;j<40;j++){ } st[k].e_mail[j]=e_mail[i];i++; file.close();//写入文件 void inter::write(){ char name[20];cout<<“ 输入要保存的文件名 ”;cin>>name;strcat(name,“.txt”);ofstream savefile(name);for(int i=0;i<35;i++) } { } savefile.close();savefile << “学号:”< savefile << “姓名:”< savefile << “地址:”< savefile << “电话号码:”< savefile << “邮编:”< savefile << “E_MAIL:”< strcpy(no,st[j].no);strcpy(st[j].no,st[j+1].no);for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++){ if(strcmp(st[j].no,st[j+1].no)>0){ char no[13]; char name[20]; char address[100]; char tel_no[12]; char post_code[7]; char e_mail[40]; strcpy(st[j+1].no,no); strcpy(name,st[j].name);strcpy(st[j].name,st[j+1].name);strcpy(st[j+1].name,name); strcpy(address,st[j].address); } for(int k=0;k<35;k++){ int x=0;if(strcmp(st[k].no,“0”)) } } strcpy(st[j].address,st[j+1].address);strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no);strcpy(st[j].tel_no,st[j+1].tel_no);strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code);strcpy(st[j].post_code,st[j+1].post_code);strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail);strcpy(st[j].e_mail,st[j+1].e_mail);strcpy(st[j+1].e_mail,e_mail); { } if(x==1){ cout< } } } //按姓名排序 void inter::list2(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++){ if(strcmp(st[j].name,st[j+1].name)>0){ char no[13]; char name[20]; char address[100]; char tel_no[12]; char post_code[7]; char e_mail[40]; strcpy(no,st[j].no);strcpy(st[j].no,st[j+1].no);strcpy(st[j+1].no,no); strcpy(name,st[j].name);strcpy(st[j].name,st[j+1].name);strcpy(st[j+1].name,name); strcpy(address,st[j].address); } for(int k=0;k<35;k++){ } } strcpy(st[j].address,st[j+1].address);strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no);strcpy(st[j].tel_no,st[j+1].tel_no);strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code);strcpy(st[j].post_code,st[j+1].post_code);strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail);strcpy(st[j].e_mail,st[j+1].e_mail);strcpy(st[j+1].e_mail,e_mail); } } int x=0;if(strcmp(st[k].no,“0”)){ } if(x==1){ } cout< void inter::format(){ } for(int i=0;i<35;i++){ } strcpy(st[i].address,“0”);strcpy(st[i].e_mail,“0”);strcpy(st[i].name,“0”);strcpy(st[i].no,“0”);strcpy(st[i].post_code,“0”);strcpy(st[i].tel_no,“0”); (2).工作流程图: 1.通讯录主界面 2.添加:添加通讯录记录 3.显示:查询通讯录记录 4.删除:删除通讯录记录 5.修改:修改通讯录记录 小结(收获和建议)这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验,面对许多不懂得知识,通过他人的帮助,以及参考他人的成果,自己动手尝试,修改等,才完成。这个课程设计,花费了我近两个星期的时间,这也是因为书本不熟悉。通过这次设计,使我对《C语言》这门课程有了更深一步的了解。它不仅是计算机程序设计的重要理论技术基础,也在我们电子与信息专业的学习中占据着十分重要的地位。同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。利用计算机来编写程序,也让我感受到了编程的乐趣,极大的激发了我的兴趣。第三篇:通讯录管理系统-数据结构课程设计报告
第四篇:C#学生成绩管理系统课程设计剖析
第五篇:通讯录管理系统