zoukankan      html  css  js  c++  java
  • 小型的Unix系统字符SHELL

    // Student name :
    // Student ID   :
    
    // Submission deadline : Sunday, 8 Oct 2017, 11pm
    // Upload your .cpp file via Canvas
    // Late submission or submission by other means will not be graded
    
    
    /*
        In this tutorial, we shall use the string class in C++.
    
        The string class in C++ offers a lot more functionality than cstring.
        You can compare 2 string objects using the relational operators.
        For example,
            string s1, s2;
            ...
            if (s1 == s2)
               ...
    
            if (s1 < s2)
               ...
    
        You can use the subscript operator [] to access the char at a given index.
        For example,
           if (s1[i] == ',')  // test if char at index i is equal to ','
    
        You can use substr(start, end) to get the substring from index start to end-1
        For example,
            string sub = s1.substr(0, i); // get the substring from 0 to i-1
    
         You can find the length of the string using the function length().
    
    */
    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    #include<algorithm>
    
    using namespace std;
    
    struct telRec {
        string name;
        string tel;
    };
    
    struct chatGroup {
        string groupName;
        string *member;  // array of string storing the tel no. of group members
        int size;
    };
    
    const string NotFound = "not found";
    
    void readTelList(const string& filename, telRec*& telList, int& n)
    {
        // File format :
        // Number of records is given on the first line.
        // Each telephone record is stored in 1 line (starting from 2nd line).
        // Name is delimited by comma ',' followed by a space char, and then the telephone number.
        // Telephone records in the file are ordered by telephone number.
    
        // Read in the data from the file.
        // Create the array telList, and set the value of n (number of telRec)
    
        ifstream infile(filename);
        if (!infile.is_open())
        {
            cout << "Error: cannot open data file : " << filename << endl;
            system("pause");
            exit(0);
        }
    
        string temp;    
        infile >> temp >> n;
        telList = new telRec[n];
    
        // Use getline() to read in one line of text from the file.
        // The C++ function getline() is similar to Scanner.nextLine() in Java.
    
        string line;
        getline(infile, line);  // consume the '
    ' after the value of n
    
    
    
        // Your codes
        int k = 0;
        while (getline(infile, line))
        {
            string name = "";
            string tel = "";
            int loc = 0;
            for (int i = 0; i < line.length(); i++){
                if (line[i] == ','){
                    loc = i;
                    break;
                }
            }
            if (loc == 0) continue;
            name = line.substr(0, loc);
            tel = line.substr(loc + 2, line.length());
            telList[k].name = name;
            telList[k].tel = tel;
            k++;
        }
    
        infile.close();  // close the file after use
    }
    
    void readChatGroup(const string& filename, chatGroup*& groupList, int& g)
    {
        // File format :
        // Number of chat groups is given on the first line.
        // Each group contains:
        //    group_name size
        //    telephone numbers of the members in the chat group (not ordered)
        // Chat groups in the file are ordered by group name.
    
        // Read in the data from the file.
        // Create the array groupList, and set the value of g (number of groups)
    
        ifstream infile(filename);
        if (!infile.is_open())
        {
            cout << "Error: cannot open data file : " << filename << endl;
            system("pause");
            exit(0);
        }
    
    
        // Your codes
        string temp;
        infile >> temp >> g;
        groupList = new chatGroup[g];
        // Use getline() to read in one line of text from the file.
        // The C++ function getline() is similar to Scanner.nextLine() in Java.
    
        string line;
        getline(infile, line);  // consume the '
    ' after the value of n
        //cout << line << endl;
    
        int k = -1;
        int j = 0;
        while (getline(infile, line))
        {
            if (line.length() == 0)
                continue;
    
            istringstream is(line);
    
            if (line.find(' ', 0) == string::npos){
                is >> groupList[k].member[j++];
            }else{
                k++;
                is >> groupList[k].groupName >> groupList[k].size;
                groupList[k].member = new string[groupList[k].size];
                j = 0;
    
            }
        }
        infile.close();
    }
    
    const string& getNameByTel(const telRec *telList, int n, const string& tel)
    {
        // Return the name (by reference) that is associated with the given tel number
        // If the input tel is not found, 
        // return Notfound (the const string defined at the top of the file).
    
        // The returned string object is a const, i.e. the calling function cannot modify 
        // the returned string object.
    
        // Use binary search to find the telRec
    
    
    
        // Your codes
    
        // (a) copy data
        telRec* tmpTelList = new telRec[n];
        for (int i = 0; i < n; i++){
            tmpTelList[i] = telList[i];
        }
    
        // (b) sort 
        telRec tmp;
        for (int i = 0; i < n; i++){
            for (int j = i + 1; j < n; j++){
    
                if (tmpTelList[i].tel > tmpTelList[j].tel){
                    tmp = tmpTelList[i];
                    tmpTelList[i] = tmpTelList[j];
                    tmpTelList[j] = tmp;
                }
    
            }
        }
    
        //  (c) binary search
        int left = 0;
        int right = n;
        int mid = 0;
        while (1){
            if (left > right)
                break;
    
            mid = (left + right) / 2;
    
            if (tmpTelList[mid].tel == tel)
                return tmpTelList[mid].name;
    
            if (tmpTelList[mid].tel > tel)
                right = mid-1;
    
            if (tmpTelList[mid].tel < tel)
                left = mid + 1; 
        }
        return NotFound;
    }
    
    void printChatGroupByName(const chatGroup *groupList, int g, string gname, const telRec *telList, int n)
    {
        // Print the chat group to the standard output.
        // If the chat group is found, format of the output:
        //    Chat group : group_name
        //    Number of members :
        //    name, tel (one line per member)
    
        // If the chat group is not found, format of the output:
        //    Chat group : group_name not found
    
        // Use binary search to find the group
    
    
    
        // Your codes
    
         // (a) copy data
        chatGroup* tmpGroupList = new chatGroup[g];
        for (int i = 0; i < g; i++){
            tmpGroupList[i] = groupList[i];
        }
    
        // (b) sort
        chatGroup tmp;
        for (int i = 0; i < g; i++){
            for (int j = i + 1; j < g; j++){
    
                if (tmpGroupList[i].groupName > tmpGroupList[j].groupName){
                    tmp = tmpGroupList[i];
                    tmpGroupList[i] = tmpGroupList[j];
                    tmpGroupList[j] = tmp;
                }
    
            }
        }
    
        //  (c) binary search
        int left = 0;
        int right = g;
        int mid = 0;
    
        while (1){
            if (left > right)
                break;
    
            mid = (left + right) / 2;
    
            if (tmpGroupList[mid].groupName == gname)
                break;
    
            if (tmpGroupList[mid].groupName > gname)
                right = mid - 1;
    
            if (tmpGroupList[mid].groupName < gname)
                left = mid + 1;
        }
        // (d) not finded
        if (left > right){
            cout << "Chat group : " + gname + " not found" << endl;
            return;
        }
    
        // (e) finded
        char chTmp[512];
        sprintf(chTmp, "%d", tmpGroupList[mid].size);
        string strSize = chTmp;
        cout << "Chat group : " + tmpGroupList[mid].groupName << endl;
        cout << "Number of members : " + strSize << endl;
        for (int i = 0; i < tmpGroupList[mid].size; i++){
            cout << getNameByTel(telList, n, tmpGroupList[mid].member[i]) + ", " + tmpGroupList[mid].member[i] << endl;
        }
    }
    
    int main()
    {   
        telRec *telList;
        int n;  // number of tel records
        chatGroup *groupList;
        int g;  // number of chat groups
    
        string file1 = "tel-name.txt";    // sorted by telephone number
        string file2 = "chat-groups.txt"; // sorted by group name, tel no. within a group are not sorted
    
        readTelList(file1, telList, n);
    
        string t1 = "91765295";
        cout << "Owner of tel. no. " << t1 << " is " << getNameByTel(telList, n, t1) << endl << endl;
        // Expected output 
        // Owner of tel. no. 91765295 is WONG Kin Ho
    
        string t2 = "90001111";
        cout << "Owner of tel. no. " << t2 << " is " << getNameByTel(telList, n, t2) << endl << endl;;
        // Expected output 
        // Owner of tel. no. 90001111 is not found
    
        readChatGroup(file2, groupList, g);
    
        string gname = "group-04";
        printChatGroupByName(groupList, g, gname, telList, n);
        // Expected output
        //    Chat group : group-04
        //    Number of members : 7
        //    CHAN Wai Hang, 98512078
        //    LUI Ka Fai, 98529423
        //    TSE Tsz Hin, 95871616
        //    SIU Ka Hin, 92432172
        //    LOK Kam Hung, 93670697
        //    WAN Tsun Man, 97039667
        //    CHAN Man Hong, 92026350
    
        gname = "group-03";
        printChatGroupByName(groupList, g, gname, telList, n);  
        // Expected output
        //    Chat group : group-03 not found
    
        system("pause");
        exit(0);
    }
  • 相关阅读:
    How to get IWin32Window for Show/ShowDialog in Excel
    SSL 改变端口 ReportViewer 超级慢
    RportViewer(20121023) 参数引起的异常
    IKVM.NET[Java to C#]
    knockoutjs(03) ko + jquery ui
    我的四色
    vsto to fill data use listobject fill
    sinsspp 插件和主题安装
    自动化测试
    HTTP Error 500.19
  • 原文地址:https://www.cnblogs.com/laohaozi/p/8266497.html
Copyright © 2011-2022 走看看