实验一 计算器设计与实现
一、实验目的与要求
- 实验目的
锻炼可视化编程能力 - 实验要求
- 熟悉可视化编程环境(不限编程工具可使用Visual Studio、Java等)。
- 运用面向对象程序设计知识对实验题目进行分析和设计。
- 进行程序编写和调试工作。
二、实验内容
使用可视化编程环境下编写一个简易的计算器,能实现简单的加、减、乘、除四则运算,并加入特定的一些效果,如使计算器的颜色在红色,绿色和蓝色之间轮流变换等。完成诸如计算器对话框的创建、控件编辑、界面设计、关键功能的实现等工作。
三、实验方法
1、设计界面。创建一个对话框,在对话框中添加文本框用来显示计算结果,按钮:0-9、小数点、+、-、*、/、=等。
2、实现各个按钮的功能。
3、实现简单的算术四则运算语法分析,保证正确的计算结果。
4、实现颜色的变换。
四、详细的设计、调试和运行结果
-
实验设计
应用的软件工具是vs2017,分析过程见模块分析部分。 -
界面设计
-
模块设计
private void Textnum1(object sender, EventArgs e)
{
this.textBox1.Text += "1";
}
private void Textnum2(object sender, EventArgs e)
{
this.textBox1.Text += "2";
}
private void Textnum3(object sender, EventArgs e)
{
this.textBox1.Text += "3";
}
private void Textnum4(object sender, EventArgs e)
{
this.textBox1.Text += "4";
}
private void Textnum5(object sender, EventArgs e)
{
this.textBox1.Text += "5";
}
private void Textnum6(object sender, EventArgs e)
{
this.textBox1.Text += "6";
}
private void Textnum7(object sender, EventArgs e)
{
this.textBox1.Text += "7";
}
private void Textnum8(object sender, EventArgs e)
{
this.textBox1.Text += "8";
}
private void Textnum9(object sender, EventArgs e)
{
this.textBox1.Text += "9";
}
private void Textnum0(object sender, EventArgs e)
{
this.textBox1.Text += "0";
}
private void op_add(object sender, EventArgs e)
{
this.textBox1.Text += "+";
}
private void op_sub(object sender, EventArgs e)
{
this.textBox1.Text += "-";
}
private void op_mul(object sender, EventArgs e)
{
this.textBox1.Text += "*";
}
private void op_div(object sender, EventArgs e)
{
this.textBox1.Text += "/";
}
private double caculate(string op,string num)
{
double result = 0;
Stack numstack = new Stack();
Stack opstack = new Stack();
string[] numarray = Regex.Split(num, " ");
string[] oparray = Regex.Split(op, " ");
double n;
numstack.Push(Convert.ToDouble(numarray[0]));
int opindex = 0;
for(int numindex=1;numindex<numarray.Length;numindex++)
{
switch(oparray[opindex])
{
case "+":
opstack.Push(oparray[opindex]);
break;
case "-":
opstack.Push(oparray[opindex]);
break;
case "*":
n = Convert.ToDouble(numstack.Pop()) * Convert.ToDouble(numarray[numindex]);
numstack.Push(n);
opindex++;
continue;
case "/":
n = Convert.ToDouble(numstack.Pop()) / Convert.ToDouble(numarray[numindex]);
numstack.Push(n);
opindex++;
continue;
}
opindex++;
numstack.Push(Convert.ToDouble(numarray[numindex]));
}
//反转栈的存储顺序,以便进行从左到右的计算
Stack tnumstack = new Stack();
Stack topstack = new Stack();
double n1 = 0;
while(numstack.Count!=0)
{
tnumstack.Push(Convert.ToDouble(numstack.Pop()));
}
while (opstack.Count != 0)
{
topstack.Push(Convert.ToString(opstack.Pop()));
}
while(topstack.Count!=0)
{
if (Convert.ToString(topstack.Pop()) == "+")
{
n1 = Convert.ToDouble(tnumstack.Pop()) + Convert.ToDouble(tnumstack.Pop());
tnumstack.Push(n1);
}
else
{
n1 = (Convert.ToDouble(tnumstack.Pop()) - Convert.ToDouble(tnumstack.Pop()));
tnumstack.Push(n1);
}
}
result = Convert.ToDouble(tnumstack.Pop());
return result;
}
private void op_equ(object sender, EventArgs e)
{
string op = string.Empty, num = string.Empty;
char text;
//异常情况:两符号相邻和除号后面是0
for(int index=0;index<this.textBox1.Text.Length - 1;index++)
{
if((this.textBox1.Text[index]<'0'||this.textBox1.Text[index]>'9')&&
(this.textBox1.Text[index+1]<'0'||this.textBox1.Text[index+1]>'9'))
{
this.textBox1.Text = "输入错误";
return;
}
if(this.textBox1.Text[index]=='/'&&this.textBox1.Text[index+1]=='0')
{
if (index + 2 < this.textBox1.Text.Length && this.textBox1.Text[index + 2] == '.')
continue;
this.textBox1.Text = "输入错误";
return;
}
}
//异常情况:字符串最后一个字母是符号
if(this.textBox1.Text[this.textBox1.Text.Length-1]<'0'||
this.textBox1.Text[this.textBox1.Text.Length-1]>'9')
{
this.textBox1.Text = "输入错误";
return;
}
int flag = 0;
for (int index = 0; index < this.textBox1.Text.Length; index++)
{
text = this.textBox1.Text[index];
//特殊情况处理:字符串首字母是符号
if(index==0&&(text=='+'||text=='-'))
{
num += "0";
}
//异常情况:字符串开头是乘号或除号
if(index==0&&(text=='*'||text=='/'))
{
this.textBox1.Text = "输入错误";
return;
}
if (text >= '0' && text <= '9' || text == '.')
{
num += text.ToString();
}
else
{
op += text.ToString() + " ";
num += " ";
}
}
num = num.TrimEnd();
op = op.TrimEnd();//去掉末尾空格
double result = caculate(op, num);
this.textBox1.Text = result.ToString();
}
private void Textdot(object sender, EventArgs e)
{
this.textBox1.Text += ".";
}
private void conver_red_Click(object sender, EventArgs e)
{
this.num1.BackColor = System.Drawing.Color.Red;
this.num2.BackColor = System.Drawing.Color.Red;
this.num3.BackColor = System.Drawing.Color.Red;
this.num4.BackColor = System.Drawing.Color.Red;
this.num5.BackColor = System.Drawing.Color.Red;
this.num6.BackColor = System.Drawing.Color.Red;
this.num7.BackColor = System.Drawing.Color.Red;
this.num8.BackColor = System.Drawing.Color.Red;
this.num9.BackColor = System.Drawing.Color.Red;
this.num0.BackColor = System.Drawing.Color.Red;
this.add.BackColor = System.Drawing.Color.Red;
this.sub.BackColor = System.Drawing.Color.Red;
this.mul.BackColor = System.Drawing.Color.Red;
this.div.BackColor = System.Drawing.Color.Red;
this.equ.BackColor = System.Drawing.Color.Red;
this.dot.BackColor = System.Drawing.Color.Red;
this.back.BackColor = System.Drawing.Color.Red;
this.clear.BackColor = System.Drawing.Color.Red;
this.conver_blue.BackColor = System.Drawing.Color.Red;
this.conver_red.BackColor = System.Drawing.Color.Red;
this.conver_green.BackColor = System.Drawing.Color.Red;
}
private void conver_green_Click(object sender, EventArgs e)
{
this.num1.BackColor = System.Drawing.Color.Green;
this.num2.BackColor = System.Drawing.Color.Green;
this.num3.BackColor = System.Drawing.Color.Green;
this.num4.BackColor = System.Drawing.Color.Green;
this.num5.BackColor = System.Drawing.Color.Green;
this.num6.BackColor = System.Drawing.Color.Green;
this.num7.BackColor = System.Drawing.Color.Green;
this.num8.BackColor = System.Drawing.Color.Green;
this.num9.BackColor = System.Drawing.Color.Green;
this.num0.BackColor = System.Drawing.Color.Green;
this.add.BackColor = System.Drawing.Color.Green;
this.sub.BackColor = System.Drawing.Color.Green;
this.mul.BackColor = System.Drawing.Color.Green;
this.div.BackColor = System.Drawing.Color.Green;
this.equ.BackColor = System.Drawing.Color.Green;
this.dot.BackColor = System.Drawing.Color.Green;
this.back.BackColor = System.Drawing.Color.Green;
this.clear.BackColor = System.Drawing.Color.Green;
this.conver_blue.BackColor = System.Drawing.Color.Green;
this.conver_red.BackColor = System.Drawing.Color.Green;
this.conver_green.BackColor = System.Drawing.Color.Green;
}
private void conver_blue_Click(object sender, EventArgs e)
{
this.num1.BackColor = System.Drawing.Color.Blue;
this.num2.BackColor = System.Drawing.Color.Blue;
this.num3.BackColor = System.Drawing.Color.Blue;
this.num4.BackColor = System.Drawing.Color.Blue;
this.num5.BackColor = System.Drawing.Color.Blue;
this.num6.BackColor = System.Drawing.Color.Blue;
this.num7.BackColor = System.Drawing.Color.Blue;
this.num8.BackColor = System.Drawing.Color.Blue;
this.num9.BackColor = System.Drawing.Color.Blue;
this.num0.BackColor = System.Drawing.Color.Blue;
this.add.BackColor = System.Drawing.Color.Blue;
this.sub.BackColor = System.Drawing.Color.Blue;
this.mul.BackColor = System.Drawing.Color.Blue;
this.div.BackColor = System.Drawing.Color.Blue;
this.equ.BackColor = System.Drawing.Color.Blue;
this.dot.BackColor = System.Drawing.Color.Blue;
this.back.BackColor = System.Drawing.Color.Blue;
this.clear.BackColor = System.Drawing.Color.Blue;
this.conver_blue.BackColor = System.Drawing.Color.Blue;
this.conver_red.BackColor = System.Drawing.Color.Blue;
this.conver_green.BackColor = System.Drawing.Color.Blue;
}
private void clear_Click(object sender, EventArgs e)
{
this.textBox1.Text = "";
}
private void back_Click(object sender, EventArgs e)
{
string t = string.Empty;
char text;
for(int i=0;i<this.textBox1.Text.Length-1;i++)
{
text = this.textBox1.Text[i];
t += text.ToString();
}
this.textBox1.Text = t;
}
- 实现的主要功能或特色
- 本系统实现了如下功能:
- 简单的运算
- 连续相同运算
- 四则混合运算
- 小数点的处理
- 异常情况处理: 除数为0 运算式以乘除号开头 两个运算符相邻 运算式以符号结束
- 按键颜色变换(红绿蓝)
- 退格
- 清除
五.实验总结
资料:老师提供的Winform资料,以及微软提供的官方文档,MSDN
选择的工具是可视化的,对用户友好且直观。方便打包发布。
遇到过问题,主要是因为在实验设计的过程中,有些情况没有考虑进来和有一些逻辑错误。我通过画出模拟计算机计算过程图和单步调试解决。
收获:设计思路是关键,设计时考虑到各种情况将在实现时节省大量时间。实现完成后要进行各种情况的测试,若结果错误,要借助调试的方法找到问题所在。
实验二 通讯录管理程序设计与实现
一、实验目的与要求
1、熟悉可视化编程语言的程序设计方法(不限编程工具可使用Visual Studio、Java等)。
2、运用面向对象知识对实验题目进行分析和设计。
3、进行程序编写和调试工作。
二、实验内容
设计、实现一个具有通讯信息插入、修改、删除、显示、查询和统计功能的通讯录管理程序。程序设计功能及要求:
1、 人数不定,数据使用文件存放。
2、 记录每位同学的学号、姓名、性别、工作单位、电话号码和E-mail地址建立单独的条目,存入数据文件。
3、 可对记录中的姓名和电话号码等进行修改。
4、 可增加或删除记录。
5、 可显示所有保存的记录。
6、 可以统计男女同学或总人数。
7、 通过姓名、学号或电话号码查询到同学的条目。
8、 在开始画面加入简单的菜单便于选择功能。
9、 储存数据文件格式:
学号 姓名 性别 工作单位 电话号码 E-mail
1 李四 …. …. ….
四、实验方法
1、通讯录的录入:从键盘接收输入的通讯录信息,将其存储到通讯录文件中。
2、通讯录信息的修改:从键盘接收输入的需要修改通讯录的姓名,在文件中查找是否存在相应记录,如果存在,则从键盘输入修改后的信息,并保存在文件中。
3、通讯录信息的删除:从键盘接收输入的需要删除的通讯录的姓名,在通讯录文件中进行查找,如果存在这样的记录,则在文件中将记录删除。
4、通讯录信息的增加:从键盘接收要增加的通讯录信息,并与通讯录文件中已存在的信息进行比对,如果存在这样的记录,且前后信息不符,则更新该记录,如果不存在该条记录,则将新录入的通讯录信息保存到通讯录文件中。
5、显示所有保存的记录:能显示出所有通讯录文件的所有记录。
6、统计男女生人数或总人数。
7、通讯录的查询功能:从键盘接收要查询的姓名、学号或电话号码,对通讯录文件进行查询,并将查询到整条记录显示出来。
8、该通讯录可以采用字符界面,也可以在开始画面加入简单的菜单便于选择功能。
五、详细的设计、调试和运行结果
-
实验设计
用了vs2017,实验设计过程中分解了通讯录所实现的功能,提前构思好需要实现的函数功能及分类。如模块分析部分所示。 -
界面设计
-
模块设计
File_change.h
#pragma once
void Modify();
void Delete();
void Append();
File_change.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
#include<string>
#include<string.h>
#include"File_change.h"
#include"To_All.h"
#include"Search.h"
using namespace std;
void Modify()
{
cout << endl;
cout << "请输入您将要修改联系人的姓名" << endl;
char* info = new char[20];
cin >> info;
if (!bool_Search_name(info))
{
cout << endl;
cout << "修改联系人的姓名不存在!" << endl;
return;
}
fstream file;
file.open("adress_book.txt", ios::in);
char* str = new char[500];
char* token = new char[20];
char* id = new char;
while (!file.eof())
{
file.getline(str, 500);
token = strtok(str, " ");
strcpy(id, token);
token = strtok(NULL, " ");
if (strcmp(info, token) == 0)
break;
}
//进行信息分割
char* name= token;
token = strtok(NULL, " ");
char* sex = token;
token = strtok(NULL, " ");
char* workplace = token;
token = strtok(NULL, " ");
char* phone = token;
token = strtok(NULL, " ");
char* email = token;
file.close();
file.open("adress_book.txt", ios::in);
char str1[500] = "";
char* token1 = NULL;
char buffer[10000] = "";
token1 = new char;
int n = allnum();
int flag = 1;
int n2 = 0;
while (!file.eof())//检查是否修改的是文件最后一行的信息
{
file.getline(str1, 100);
token1 = strtok(str1, " ");
token1 = strtok(NULL, " ");
if (strcmp(token1, info) == 0)
{
if (n2 == n - 1)
flag = 0;
continue;
}
n2++;
}
file.close();
file.open("adress_book.txt", ios::in);
for(int i=0;i<n;i++)
{
file.getline(str1, 100);
char* str2 = new char[strlen(str1) + 1];
strcpy(str2, str1);
token1 = strtok(str1, " ");
token1 = strtok(NULL, " ");
if (strcmp(token1, info) == 0)
{
continue;
}
if (flag == 0)//如果修改的是文件最后一行的信息,则倒数第二行不用加换行符
{
if (i == n - 2)
strcat(buffer, str2);
}
if (i == n - 1)
strcat(buffer, str2);
else
{
if (flag == 0 && i == n - 2)
continue;
strcat(buffer, str2);
strcat(buffer, "\n");
}
}
file.close();
file.open("adress_book.txt", ios::out);
cout << endl;
cout << "请问您将修改该联系人的哪项信息." << endl <<
"(学号请按1,姓名请按2,性别请按3,工作单位请按4 ,电话请按5,电子邮箱请按6,退出请按0" << endl;
int judge1;
judge1 = 1;
while (judge1 != 0)
{
cin >> judge1;
switch (judge1)
{
case 1:
cout << endl;
cout << "请输入更改后联系人的学号" << endl;
cin >> id;
cout << endl;
cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
break;
case 2:
cout << endl;
cout << "请输入更改后的联系人姓名" << endl;
cin >> name;
cout << endl;
cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
break;
case 3:
cout << endl;
cout << "请输入更改后的联系人的性别" << endl;
cin >> sex;
cout << endl;
cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
break;
case 4:
cout << endl;
cout << "请输入更改后的联系人工作单位" << endl;
cin >> workplace;
cout << endl;
cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
break;
case 5:
cout << endl;
cout << "请输入更改后的联系人电话" << endl;
cin >> phone;
cout << endl;
cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
break;
case 6:
cout << endl;
cout << "请输入更改后的联系人电子邮箱" << endl;
cin >> email;
cout << endl;
cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
break;
case 0:
cout << endl;
cout << "联系人信息修改即将结束" << endl;
cout << "联系人信息修改结束" << endl;
break;
default:
cout << endl;
cout << "请输入0-6选项进行联系人信息的修改" << endl;
break;
}
}
char result[10000] = "";
strcat(result, id);
strcat(result, " ");
strcat(result, name);
strcat(result, " ");
strcat(result, sex);
strcat(result, " ");
strcat(result, workplace);
strcat(result, " ");
strcat(result, phone);
strcat(result, " ");
strcat(result, email);
strcat(result, "\n");
strcat(result, buffer);
file << result;
file.close();
return;
}
void Delete()
{
char name[20] = "";
cout << endl;
cout << "请输入将要删除联系人的姓名:" << endl;
cin >> name;
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败" << endl;
return;
}
char info[500] = "";
char* token = NULL;
char buffer[10000] = "";
int flag = 0;//用来表示是否搜索到了联系人
int n = allnum();
int flag2 = 1;//用来表示是否是最后一行的信息
int n2 = 0;
while (!file.eof())//检查是否修改的是文件最后一行的信息
{
file.getline(info, 500);
token = strtok(info, " ");
token = strtok(NULL, " ");
if (strcmp(token, name) == 0)
{
if (n2 == n - 1)
flag2 = 0;
continue;
}
n2++;
}
file.close();
file.open("adress_book.txt", ios::in);
for(int i=0;i<n;i++)
{
file.getline(info, 500);
char* str = new char[strlen(info) + 1];
strcpy(str, info);
token = strtok(info, " ");
token = strtok(NULL, " ");
if (strcmp(token, name) == 0)
{
flag = 1;
continue;
}
if (flag2 == 0)
{
if (i == n - 2)
{
strcat(buffer, str);
}
}
if (i == n - 1)
{
strcat(buffer, str);//若删除的不是最后一条数据,则在拼接最后一条时,不能加换行符
}
else
{
if (flag2 == 0 && i == n - 2)
continue;
strcat(buffer, str);
strcat(buffer, "\n");
}
}
file.close();
if (flag == 0)
{
cout << endl;
cout << "未找到您删除的联系人的信息,请检查信息输入是否正确!" << endl;
return;
}
file.open("adress_book.txt", ios::out);
if (!file.is_open())
{
cout << endl;
cout << "文件打开失败" << endl;
return;
}
file << buffer;
file.close();
cout << endl;
cout << "删除成功!请选择下一步操作:" << endl;
return;
}
void Append()
{
char info[500] = "";
char name[20] = "";
char id[20] = "";
char sex[5] = "";
char workplace[50] = "";
char phone[30] = "";
char email[30] = "";
cout << endl;
cout << endl;
cout << "请输入增加联系人的姓名" << endl;
cin >> name;
if (bool_Search_name(name))
{
cout << endl;
cout << "通讯录中已存在该联系人的信息" << endl;
cout << "即将进入修改联系人程序,请稍后---------" << endl;
Modify();
return;
}
cout << endl;
cout << "请输入联系人学号" << endl;
cin >> id;
cout << endl;
cout << "请输入联系人性别" << endl;
cin >> sex;
cout << endl;
cout << "请输入联系人工作单位" << endl;
cin >> workplace;
cout << endl;
cout << "请输入联系人电话号码" << endl;
cin >> phone;
cout << endl;
cout << "请输入联系人E-mail" << endl;
cin >> email;
strcat(info, "\n");
strcat(info, id);
strcat(info, " ");
strcat(info, name);
strcat(info, " ");
strcat(info, sex);
strcat(info, " ");
strcat(info, workplace);
strcat(info, " ");
strcat(info, phone);
strcat(info, " ");
strcat(info, email);
fstream file;
file.open("adress_book.txt", ios::app);
file << info;
file.close();
cout << endl;
cout << "联系人增加完成!请选择下一步操作" << endl;
return;
}
Search.h
#pragma once
void Search_menu();//查找选项
//查找输出
void Search_name();
void Search_id();
void Search_phone();
//查找判断是否存在
bool bool_Search_name(char* name);
Search.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
#include<string.h>
#include<string>
#include"Search.h"
using namespace std;
void Search_menu()
{
cout <<">>>>>>"<< "您将按照哪种信息进行查找?" << endl;
cout <<">>>>>>"<< "1(按姓名查找)" << endl;
cout <<">>>>>>"<< "2(按学号查找)" << endl;
cout <<">>>>>>"<< "3(按电话查找)" << endl;
cout <<">>>>>>"<< "0(结束查找)" << endl;
int n;
while (true)
{
cout << endl;
cout << "请输入查找选项:" << endl;
cin >> n;
if (n == 0)
{
cout << "----------" << endl;
break;
}
switch (n)
{
case 1:
Search_name();
break;
case 2:
Search_id();
break;
case 3:
Search_phone();
break;
default:
cout << endl;
cout << "输入错误!请检查输入序号是否正确!请重新输入" << endl;
continue;
}
}
}
void Search_name()
{
cout << endl;
cout << "请输入您要查找联系人的姓名:" << endl;
char name[20] = "";
cin >> name;
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
char info[500] = "";
char* token = NULL;
while (!file.eof())
{
file.getline(info, 500);
char* str2 = new char[strlen(info) + 1];
strcpy(str2, info);
token = strtok(info, " ");
token = strtok(NULL, " ");
if (strcmp(name, token) == 0)
{
cout << str2 << endl;
cout << endl;
cout << "查找成功!请选择下一步操作:" << endl;
file.close();
return;
}
}
cout << endl;
cout << "查找失败!请选择下一步操作:" << endl;
file.close();
return;
}
void Search_id()
{
cout << endl;
cout << "请输入您要查找联系人的学号:" << endl;
char id[20] = "";
cin >> id;
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
char info[500] = "";
char* token = NULL;
while (!file.eof())
{
file.getline(info, 500);
char* str2 = new char[strlen(info) + 1];
strcpy(str2, info);
token = strtok(info, " ");
if (strcmp(id, token) == 0)
{
cout << str2 << endl;
cout << endl;
cout << "查找成功!请选择下一步操作:" << endl;
file.close();
return;
}
}
cout << endl;
cout << "查找失败!请选择下一步操作:" << endl;
file.close();
return;
}
void Search_phone()
{
cout << endl;
cout << "请输入您要查找联系人的电话:" << endl;
char code[30] = "";
cin >> code;
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
char info[500] = "";
char* token = NULL;
while (!file.eof())
{
file.getline(info, 500);
char* str2 = new char[strlen(info) + 1];
strcpy(str2, info);
token = strtok(info, " ");//id
token = strtok(NULL, " ");//name
token = strtok(NULL, " ");//sex
token = strtok(NULL, " ");//workplace
token = strtok(NULL, " ");//phone
//token = strtok(NULL, " ");//email
if (strcmp(code, token) == 0)
{
cout << str2 << endl;
file.close();
cout << endl;
cout << "查找成功!请选择下一步操作:" << endl;
return;
}
}
cout << endl;
cout << "查找失败!请选择下一步操作:" << endl;
file.close();
return;
}
bool bool_Search_name(char* name)
{
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败!" << endl;
return false;
}
char info[500] = "";
char* token = NULL;
while (!file.eof())
{
file.getline(info, 500);
token = strtok(info, " ");
token = strtok(NULL, " ");
if (strcmp(name, token) == 0)
{
file.close();
return true;
}
}
file.close();
return false;
}
To_All.h
#pragma once
void Display();
void Statistics();
int allnum();
To_All.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string.h>
#include<string>
#include<fstream>
#include"To_All.h"
using namespace std;
void Display()
{
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
char info[500] = "";
char* token = NULL;
while (!file.eof())
{
file.getline(info, 500);
cout << info << endl;
}
file.close();
cout << endl;
cout << "输出完成!请选择下一步操作:" << endl;
cout << "-------" << endl;
return;
}
void Statistics()
{
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
char info[500] = "";
char* token = NULL;
int mennum = 0;
int womennum = 0;
int allnum = 0;
while (!file.eof())
{
file.getline(info, 500);
token = strtok(info, " ");
token = strtok(NULL, " ");
token = strtok(NULL, " ");
allnum++;
if (strcmp(token, "男") == 0)
mennum++;
if (strcmp(token, "女") == 0)
womennum++;
}
cout << "男生人数为:" << mennum << endl;
cout << "女生人数为:" << womennum << endl;
cout << "总人数为:" << allnum << endl;
cout << "统计完成!请选择下一步操作:" << endl;
cout << "------";
cout << endl;
file.close();
}
int allnum()
{
fstream file;
file.open("adress_book.txt", ios::in);
if (!file.is_open())
{
cout << "文件打开失败!" << endl;
}
char info[500] = "";
int allnum = 0;
while (!file.eof())
{
file.getline(info, 500);
allnum++;
}
file.close();
return allnum;
}
Main_menu.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<fstream>
#include<string.h>
#include"Search.h"
#include"To_All.h"
#include"File_change.h"
using namespace std;
void Menu()
{
int n;
cout << "功能菜单:" << endl;
cout <<">>>>>> " <<"1(信息的增加)" << endl;
cout <<">>>>>> "<< "2(信息的删除)" << endl;
cout <<">>>>>> "<< "3(信息的修改)" << endl;
cout <<">>>>>> "<< "4(信息的查找)" << endl;
cout <<">>>>>> "<< "5(信息的输出)" << endl;
cout <<">>>>>> "<< "6(统计人数信息)" << endl;
cout <<">>>>>> "<< "0(结束选择,退出程序)" << endl;
while (true)
{
cout << endl;
cout << "请输入您想要执行的功能序号:" << endl;
cin >> n;
switch (n)
{
case 1:
Append();
break;
case 2:
Delete();
break;
case 3:
Modify();
break;
case 4:
Search_menu();
break;
case 5:
Display();
break;
case 6:
Statistics();
break;
case 0:
cout << endl;
cout << "通讯录应用即将退出!" << endl;
cout << "应用关闭成功!" << endl;
cout << "------" << endl;
exit(0);
default:
cout << "输入错误,请检查选择是否正确,重新输入!" << endl;
break;
}
}
}
int main()
{
Menu();
return 0;
}
- 实现的主要功能或特色
本系统实现了如下功能:
- (1) 主菜单进行功能选择,直到退出(错误选择提示)
- (2) 多种搜索方式(按照学号姓名电话,并通过菜单选择搜索方式,选择错误提示)
- (3) 展示文件所有信息
- (4) 统计男女生及总人数
- (5) 通过姓名修改联系人信息
- (6) 通过姓名删除联系人信息
- (7) 增加联系人信息(先确定联系人姓名是否存在,若存在进行修改,不存在进行增加)
六、实验总结
我选择的工具是C++易于调试。
遇到过删除后产生空行,导致再次遍历文件时出现异常的情况。我进行了调试和不同情况的测试,查看了产生空行的原因和一些特殊情况。
对于一个具有多种功能的项目来说,应该在实现前将功能分类编入不同的文件,避免结构混乱,一个文件中代码冗长。在这个项目中我按照不同功能分类,编写了三个头文件和四个cpp文件,如上结构图。
实验三 超市选址问题
一、实验目的与要求
1.实验目的
锻炼数据结构、算法设计与实现能力
2.实验要求
1熟悉数据结构、离散数学、算法设计等课程。
2对实验题目进行分析,选取适当的数据结构和算法设计方法。
3进行程序编写和调试工作。
二、实验内容
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。街区中任意两点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。居民们希望在城市中选择建立超市的最佳位置,使n个居民点到超市的距离总和最小。
编程任务:给定n个居民点的位置,编程计算n个居民点到超市的距离总和的最小值。
输入:输入由多组测试数据组成。每组测试数据输入的第1行是居民点数n,接下来n行是居民点的位置,每行两个整数x和y。
输出:对应每组输入,输出数据是n个居民点到超市距离总和的最小值。
输入示例:5 居民点到超市最小距离和:10
1 2
2 2
1 3
3 -2
3 3
五、实验方法
超市选址问题的核心可以看成是求中值的问题,即n个居民点的横、纵坐标值的中位数就是最优解。为此可先求出n个居民点的x坐标值和y坐标值的中位数,然后由此求得n个居民点到超市距离总和的最小值。
本实验需完成算法设计、数据结构的选择、运行结果分析以及相关内容的说明等。例如,求中位数的过程可用快速排序等算法将n个居民点的x和y坐标分别排序后,计算出中位数。程序的编写可以参考以下步骤:
1、输入居民点位置文件,或用随机数发生器得到各居民点位置坐标(x,y)。
2、将输入的二维数组(x,y)转化为两个一维数组(x)、(y)。
3、计算横坐标和纵坐标数组的中位数。
4、求n个居民点到超市距离总和的最小值,并输出此值,并以图示的方式显示居民点与超市的位置分布。
五、详细的设计、调试和运行结果
-
界面设计
-
模块设计
-
实现的主要功能或特色
- 计算居民点到超市的总距离
- 展示居民点到超市的相对距离
- 可视化实现展示
六、实验总结
在完成项目时,也要学会搜索和整理转化应用新的知识,实现特定的功能,比如该项目的可视化过程。