首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将任务拆分为函数

将任务拆分为函数
EN

Stack Overflow用户
提问于 2014-04-21 02:54:49
回答 2查看 113关注 0票数 0

我需要在这段代码中包含4个带有参数的函数,但我不能在我的一生中考虑一种合并任何有参数的函数的方法。函数参数不常与整数一起用于计算吗?我可以为这段代码创建哪些函数?如果这很容易的话,请原谅我是新来的。

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

ofstream outFile;
ifstream inFile;

const int MAXCHAR = 101;
const int MAXLINE = 256;



struct task
{
    char course[MAXCHAR];
    char desc[MAXCHAR];
    char date[MAXCHAR];
};

int main()
{

    task track[MAXLINE];
    bool quit = false;
    while (quit == false)
    {

        char choice;
        cout << "Welcome to my Task List: \n";
        cout << "<a> to add task\n";
        cout << "<s> to show the task list\n";
        cout << "<f> to find a task by course name\n";
        cout << "<q> to quit\n";
        cin >> choice;
        cin.ignore(100, '\n');

        if (choice == 'a' || choice == 'A')
        {
            int count = 0;
            outFile.open("tasks.txt", fstream::app);

            cout << "Enter Course Name (less than 101 characters): ";
            cin.get(track[count].course, MAXCHAR, '\n');
            cin.clear();
            cin.ignore(100, '\n');

            cout << "Enter Task Description (less than 101 characters): ";
            cin.get(track[count].desc, MAXCHAR, '\n');
            cin.clear();
            cin.ignore(100, '\n');

            cout << "Enter due date (mm/dd/yyyy): ";
            cin.get(track[count].date, MAXCHAR, '\n');
            cin.clear();
            cin.ignore(100, '\n');

            char confirm;
            cout << "\nAre you sure you want to add " << track[count].course << ";" << track[count].desc << ";" 
                 << track[count].date << "? (y/n)";
            cin >> confirm;
            if (confirm == 'y' || confirm == 'Y')
            {
                cin.clear();
                cin.ignore(100, '\n');
                outFile << track[count].course << ";" << track[count].desc << ";" << track[count].date << "\n";
                cout << "Task has been added\n";
                count++;
            }
            else if (confirm == 'n' || confirm == 'N')
            {
                cin.clear();
                cin.ignore(100, '\n');
            }
            outFile.close();
        }
        else if (choice == 's' || choice == 'S')
        {
            int count = 0;
            inFile.open("tasks.txt");

            while (inFile)
            {
                inFile.getline(track[count].course, MAXLINE, ';');
                inFile.getline(track[count].desc, MAXLINE, ';');
                inFile.getline(track[count].date, MAXLINE, '\n');
                if (inFile)
                {
                    cout << track[count].course << ";" << track[count].desc << ";" 
                         << track[count].date << "\n";
                    count++;
                }
            }

            inFile.close();
            cin.clear();

        }

        else if (choice == 'f' || choice == 'F')
        {
        int count = 0;
            char course[MAXCHAR];
            cout << "Enter Course Name: ";
            cin >> course;

            inFile.open("tasks.txt");
            while (inFile)
            {
                inFile.getline(track[count].course, MAXLINE, ';');
                inFile.getline(track[count].desc, MAXLINE, ';');
                inFile.getline(track[count].date, MAXLINE, '\n');
                if (strcmp(track[count].course, course) == 0)
                {
                    cout << track[count].course <<  ";" << track[count].desc 
                         << track[count].date << "\n";

                    count++;
                }


            }
            inFile.close();

        }
        else if (choice == 'q' || choice == 'Q')
        {
            quit = true;
        }

    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-21 03:43:55

“a”和“A”、“s”和“S”、“f”和“F”的情况没有多少共同之处。因此,我不认为您可以编写一个函数来将它们的所有功能合并到一个函数中,然后根据一个参数执行一个操作。但是,您可以通过将所有3种不同的情况封装在一个不接受参数并返回void的函数中,从而提高代码的可读性:

代码语言:javascript
复制
void Case_s_S()
{
    int count = 0;
    inFile.open("tasks.txt");

    while (inFile)
    {
        inFile.getline(track[count].course, MAXLINE, ';');
        inFile.getline(track[count].desc, MAXLINE, ';');
        inFile.getline(track[count].date, MAXLINE, '\n');
        if (inFile)
        {
            cout << track[count].course << ";" << track[count].desc << ";" 
                 << track[count].date << "\n";
            count++;
        }
    }

    inFile.close();
    cin.clear();
}

我还可以给您一个建议,让您的“主”保持更整洁,就是使用函数指针。中定义的std::函数。您可以做的是有一个chars和std::函数的映射,它看起来像std::map>。然后,您可以将'a‘和'A’的键分配到函数Case_a_A等的值,以此类推。这样,当用户按下键时,您只需转到该键并调用它的值,这将是函数。

票数 0
EN

Stack Overflow用户

发布于 2014-04-21 03:40:04

方法的重点在于很多方式来分割您的代码,这样就更容易阅读了。考虑您的代码中可以自我包含的部分,然后将其分离为它们自己的函数。

代码的一个基本示例可能是:

代码语言:javascript
复制
if (choice == 'a' || choice == 'A')
   DoStuff_a(<params>);
else if (choice == 's' || choice == 'S')
   DoStuff_s(<params>);    

        //...

else if (choice == 'f' || choice == 'F')
   DoStuff_f(<params>);  
else if (choice == 'q' || choice == 'Q')
   quit = true;

有许多方法来隔离您的代码(例如,GetInput()GetFileData()等)--对此可以be found here进行相当不错的讨论。请记住,功能设计是(a)在很大程度上取决于个人喜好,(b)应该考虑,即使是main()

许多开发人员坚信main()应该是95%+函数调用,很少有“工作代码”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23190112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档