河北工业大学 综合程序设计课程 实验报告

本文介绍了使用可视化编程实现计算器及通讯录管理程序的过程。包括功能设计、代码实现及调试经验分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验一 计算器设计与实现

一、实验目的与要求

  1. 实验目的
    锻炼可视化编程能力
  2. 实验要求
    1. 熟悉可视化编程环境(不限编程工具可使用Visual Studio、Java等)。
    2. 运用面向对象程序设计知识对实验题目进行分析和设计。
    3. 进行程序编写和调试工作。

二、实验内容

使用可视化编程环境下编写一个简易的计算器,能实现简单的加、减、乘、除四则运算,并加入特定的一些效果,如使计算器的颜色在红色,绿色和蓝色之间轮流变换等。完成诸如计算器对话框的创建、控件编辑、界面设计、关键功能的实现等工作。

三、实验方法

1、设计界面。创建一个对话框,在对话框中添加文本框用来显示计算结果,按钮:0-9、小数点、+、-、*、/、=等。
2、实现各个按钮的功能。
3、实现简单的算术四则运算语法分析,保证正确的计算结果。
4、实现颜色的变换。

四、详细的设计、调试和运行结果

  1. 实验设计
    应用的软件工具是vs2017,分析过程见模块分析部分。

  2. 界面设计

  3. 模块设计

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、该通讯录可以采用字符界面,也可以在开始画面加入简单的菜单便于选择功能。

五、详细的设计、调试和运行结果

  1. 实验设计
    用了vs2017,实验设计过程中分解了通讯录所实现的功能,提前构思好需要实现的函数功能及分类。如模块分析部分所示。

  2. 界面设计

  3. 模块设计

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. 实现的主要功能或特色
    本系统实现了如下功能:
  • (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个居民点到超市距离总和的最小值,并输出此值,并以图示的方式显示居民点与超市的位置分布。

五、详细的设计、调试和运行结果

  1. 界面设计

  2. 模块设计
    在这里插入图片描述

  3. 实现的主要功能或特色

  • 计算居民点到超市的总距离
  • 展示居民点到超市的相对距离
  • 可视化实现展示

六、实验总结

在完成项目时,也要学会搜索和整理转化应用新的知识,实现特定的功能,比如该项目的可视化过程。

实验1 Java语言基础 4 一、实验目的 4 二、实验要求 4 三、实验内容 4 (一) 声明不同数据类型的变量 4 (二) 了解变量的使用范围 5 (三) 使用关系运算符和逻辑运算符 5 (四) 使用表达式语句与复合语句 6 (五) 使用选择语句 6 (六) 使用循环语句 8 实验2 面向对象编程 11 一、实验目的 11 二、实验要求 11 三、实验内容 11 (一)创建 Applet 应用小程序 11 (二)创建对象并使用对象 12 (三)编写显示当前日期和时间的程序 13 (四)使用修饰符 14 (五)方法中参数传递 15 (六)类的继承性 16 (七)类的多态性 18 实验3 包、接口与异常处理 22 一、实验目的 22 二、实验要求 22 三、实验内容 22 (一)了解并使用 Java 的系统包 22 (二)创建并使用自定义包 22 (三)使用接口技术 24 (四)了解异常处理机制 25 实验4 常用系统类的使用 27 一、实验目的 27 二、实验要求 27 三、实验内容 27 (一)了解 Applet 的生命周期 27 (二)使用数学函数类 28 (三)使用日期类 29 实验5 建立图形用户界面 32 一、实验目的 32 二、实验要求 32 三、实验内容 32 (一)创建图形用户界面 32 (二)了解事件处理机制 34 (三)建立独立运行的窗口界面并使用匿名类 36 (四)使用 Swing 组件 39 (五)使用自定义对话框与内部类 41 实验6 图形处理 44 一、实验目的 44 二、实验要求 44 三、实验内容 44 (一)使用图形类 Graphics 44 实验7图形处理(二) 47 一、实验目的 47 二、实验要求 47 三、实验内容 47 (一)幻灯机效果——连续显示多幅图像 47 (二)使用滚动条改变背景颜色 48 (三)Applet 与 Application 合并运行 49 (四)创建电闪雷鸣的动画 50 实验8 流与文件 53 一、实验目的 53 二、实验要求 53 三、实验内容 53 (一)使用标准数据流的应用程序 53 (二)使用文件输入输出流的应用程序 54 (三)使用随机文件类的应用程序 54 (四)使用数据输入输出流与文件输入输出流类的应用程序 55 (五)使用对象输入输出流的应用程序 56 实验9 线程 58 一、实验目的 58 二、实验要求 58 三、实验内容 58 (一)Thread子类的方法实现多线程 58 (二)实现Runnable接口的方法实现多线程 59 实验10 数据库的连接:JDBC 61 一、实验目的 61 二、实验要求 61 三、实验内容 61 (一)配置ODBC数据源 61 (二)编写程序,按照下表的结构建立"student"表 61 (三)编写程序,完成填写功能 62 (四)编写程序,完成查询功能 62
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian圣楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值