| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8451 人关注过本帖
标题:如果想不直接结束程序,输入一个提示,返回主菜单,应该怎么设计呢
只看楼主 加入收藏
lin471306489
Rank: 4
等 级:业余侠客
帖 子:136
专家分:247
注 册:2011-8-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
如果想不直接结束程序,输入一个提示,返回主菜单,应该怎么设计呢
ATM.zip (418.12 KB)


希望查询完余额之后能返回以下,而不是直接结束呢:
请选择交易代码:
G(取钱)
C(查询余额)
S(存钱)
U(修改密码)
程序代码:
// 建立一个账户对象数组,并存储到文件中
#include<iostream.h>
#include<fstream.h>
#include"vector.h"
#include"strclass.h"
#include"accitem.h"
#include"common.h"
#include "Acctbook.h"
int main()
{
        // 打开文件
    ifstream InputStream("Account");
    string AccountNo;
    string AccPassword;
    string NewPassword1;
    string NewPassword2;
    double AccountCount;
    string ItemName;
    double OldAccountbook;
    //double NewAccountbook;
    Accountbook MyAccountnook;
    AccountItem FoundItem;
    string TransactionCode;
    string Count;
    double SaveCount;

    // 读入帐目本
    MyAccountnook.LoadAccountbook(InputStream);
    cout << "请输入帐号:";
    cin >> AccountNo;
    // 在帐目本中查询
    FoundItem = MyAccountnook.FindItem(AccountNo);
    if(FoundItem.IsNull() == true)
    {
        cout << "帐号不存在." << endl;
        return 0;
    }
    // 读入口令
    cout << "请输入口令:";
    cin >> AccPassword;
    // 判断口令是否正确
    if(FoundItem.GetPassword() != AccPassword)
    {
        cout << "口令错误!" << endl;
        return 0;
    }
    // 取原存款余额
    OldAccountbook = FoundItem.GetBalance();
    // 请客户选择交易代码
    cout<< "请选择交易代码:" << endl;
    cout<< "G(取钱)" << endl;
    cout<< "C(查询余额)" << endl;
    cout<< "S(存钱)" << endl;
    cout<< "U(修改密码)" << endl;
    cin >> TransactionCode;
    // 判断用户需要做什么
    if(TransactionCode == "C" || TransactionCode == "c")
    {
        // 查询存款余额
        cout << "余额是:" << FoundItem.GetBalance() << endl;
    }
    else if(TransactionCode == "G" || TransactionCode == "g")
    {
        // 取款
        cout<< "请选择取钱的数量:" << endl;
        cout<< "1(取100)" << endl;
        cout<< "2(取200)" << endl;
        cout<< "5(取500)" << endl;
        cout<< "A(取1000)" << endl;
        cout<< "B(取2000)" <<endl;
        cin >> Count;
        if(Count == "1") AccountCount = 100.;
        else if(Count == "2") AccountCount = 200.;
        else if(Count == "5") AccountCount = 500.;
        else if(Count == "A") AccountCount = 1000.;
        else if(Count == "B") AccountCount = 2000.;
        else
        {
            cout<< "选择错误" << endl;
            return 0;
        }
        // 判断存款余额是否足够
        if(OldAccountbook < AccountCount)
        {
            cout<< "存款余额不够!" << endl;
        }
        else
        {        // 修改对象的存款余额
            FoundItem.DeductBalance(AccountCount);
            // 修改帐目本
            MyAccountnook.UpdateItem(FoundItem);
            cout<< "请取钱!" << endl;
            // 将修改后的账目本写到文件中
            ofstream OutputStream("Account");
            MyAccountnook.StoreAccountbook(OutputStream);
        }
    }
    else if (TransactionCode == "S" || TransactionCode == "s")
    {
        cout<< "请输入存钱数量:";
        cin >>SaveCount;
        FoundItem.SaveAccount(SaveCount);
        MyAccountnook.UpdateItem(FoundItem);
        ofstream OutputStream("Account");
        MyAccountnook.StoreAccountbook(OutputStream);
    }
    else if (TransactionCode == "U" || TransactionCode == "u")
    {
        cout<< "请输入修改后的密码:";
        cin >>NewPassword1;
        cout<< "请再次输入修改后的密码:";
        cin >>NewPassword2;
        if (NewPassword1 == NewPassword2)
        {
            FoundItem.UpdatePassword(NewPassword1);
            MyAccountnook.UpdateItem(FoundItem);
            ofstream OutputStream("Account");
            MyAccountnook.StoreAccountbook(OutputStream);
            cout<< "密码修改成功!";
        }
        else
        {
            cout<< "密码修改失败!";
        }
    }
    return 0;

大家尝试下,多谢啦!
}
搜索更多相关主题的帖子: 菜单 修改密码 include 
2011-10-12 00:11
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:4 
if()goto;

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-10-12 00:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
整个程序应处于主菜单死循环状态下运行,主菜单上设退出按钮。而且你的程序各功能应分开函数写,不要全挤在一起,主程序就是一个主菜单循环,其余都分别在函数中处理。

授人以渔,不授人以鱼。
2011-10-12 00:39
糖傻猫
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:142
注 册:2011-8-9
收藏
得分:4 
- -.初学者。。不知道你们是用什么编写的。- -如果的我的话、因为是用VC++6.0、所以我认为在里面加多一个do...while循环吧。。操作第一次之后询问是否返回主菜单、是就返回、否就结束。
2011-10-12 00:47
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:4 
单片机上面的程序就是这样的,用循环来轮询按键状态

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-10-12 04:38
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
回复 楼主 lin471306489
好,这个问题提得好。
如果要做好这个课题,并且考虑比较全面,有三点建议:
1、需要有个总控,控制事件流向,数据流向,这两点处理清楚了,再大的项目也会逻辑清晰;
2、添加各个事件处理模块;
3、需要有事件触发机制。在单片机上,有人用一个大的loop来做,这也是一种可行的办法。
   另一种办法采用系统自带的软中断触发机制,可以节约cpu时间;这种机制在应用层的体现是select函数。
至于具体的实现,你做的相当不错了。有不清楚的地方,欢迎讨论。
2011-10-12 09:51
lin471306489
Rank: 4
等 级:业余侠客
帖 子:136
专家分:247
注 册:2011-8-16
收藏
得分:0 
其实,我想用 goto语句应该能实现的。、但是楼上:
需要有事件触发机制。在单片机上,有人用一个大的loop来做,这也是一种可行的办法。
另一种办法采用系统自带的软中断触发机制,可以节约cpu时间;这种机制在应用层的体现是select函数。
至于具体的实现,你做的相当不错了。有不清楚的地方,欢迎讨论。
这种方法我就不怎么明白,希望能尝试下,实现出来。

我也正用goto 语句尝试中
2011-10-12 10:23
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:4 
这种方法是利用socket建立一个内部事件通道;
由于你这儿事件单一化,并且采用键盘阻塞输入,这种方法在这儿退化为一个大的loop。
即while(1){
     sleep(1);
}
的模式。
select模式,适合于外部事件多样化的情况,如:键盘事件,触摸屏时间,网络事件等等事件。
2011-10-12 10:43
lin471306489
Rank: 4
等 级:业余侠客
帖 子:136
专家分:247
注 册:2011-8-16
收藏
得分:0 
怎么还没有人实现啊!
要是没有,我就结贴啦
2011-10-12 21:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
给你一个例子:


用类似如下的代码实现:


下面是菜单的代码:
程序代码:
#include <Windows.h>
#include <string>
#include <Console.h>
#include <Menu.h>

using std::wstring;

extern Console console;

// 取菜单项数
size_t Get_Bar_Number(const MENU menu[])
{
    size_t number(0);
    while (!menu[number].Bar.empty())
    {
        ++number;
    }
    return number;
}

// 取菜单键清单
wstring Get_Key_List(const MENU menu[])
{
    wstring key_list;
    size_t index(0);
    while (!menu[index].Bar.empty())
    {
        key_list.push_back(menu[index].key);
        ++index;
    }
    return key_list;
}

int Menu(MENU menu[], COORD pos, const WORD text_attr, const WORD get_attr)
{
    size_t bar_number(Get_Bar_Number(menu));
    wstring key_list(Get_Key_List(menu));

    SMALL_RECT rect;
    rect.Top = 2;
    rect.Left = 2;
    rect.Bottom = rect.Top + bar_number + 3;
    rect.Right = rect.Top + menu[0].Bar.size();

    console.SetTextAttribute(text_attr);
    console.Box(rect);

    pos.X = rect.Left + 2;
    pos.Y = rect.Top + 1;
    for (size_t index = 0; index != bar_number; ++index)
    {
        console.Goto(pos);
        console.WriteText(menu[index].Bar);
        ++pos.Y;
    }

    pos.Y = rect.Bottom - 1;
    console.Goto(pos);
    console.WriteText(L"选择:");
    console.SetTextAttribute(get_attr);
    console.WriteText(L' ');
    pos.X = console.ScreenInfo.dwCursorPosition.X - 1;
    pos.Y = console.ScreenInfo.dwCursorPosition.Y;
    WCHAR choice;
    BOOL finish(false);
    do
    {
        console.Goto(pos);
        choice = console.ReadKey();
        if (key_list.find(choice) < key_list.size())
        {
            console.WriteText(choice);
            finish = true;
        }
    } while(!finish);
   
    return choice - L'0';
}



[ 本帖最后由 TonyDeng 于 2011-10-12 22:40 编辑 ]

授人以渔,不授人以鱼。
2011-10-12 22:21
快速回复:如果想不直接结束程序,输入一个提示,返回主菜单,应该怎么设计呢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020596 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved