Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Problem in c++ in writing an algorithm

  1. Nov 20, 2008 #1
    Hello,
    please help me to find the problem in algorithm. My task is to read from file hotel visitor's info (name/surname, date of arrival, date of departure, room number). Than, to contract similar room numbers and write near the overall number of days in particular room. So everything is good except my algorithm which should contract and write down the overall number of days. Instead of this, it writes and counts correctly just first rooms data... (I have attached the input file) and my code bellow: (and sorry for perhaps inaccurate language)...

    Code (Text):

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <iomanip>
    #define MAX 30
    using namespace std;

    int main(int argc, char *argv[])
    {//description of structures----------------------------------------------------------------      
               
        struct viesbutis {
               char id[MAX];
               int ma, da; //arrive
               int mi, di; //leave
               int nr; //room number
               int paru; //days in hotel
    }A[MAX]; int n;      
       
        struct lygina {
               int nr1;
               int paru1;
               }B[MAX];  

     //data input----------------------------------------------------------
        ifstream fd ("in.txt");
        if(!fd) {
                 cout<<"Error with \"in.txt\" file."<<endl;
                 system("PAUSE");
                 return 0;
        }
        else cout<<"Data loaded to \"out.txt\""<<endl;
        n=0;
        while(!fd.eof() ) {
                        fd.get(A[n].id, sizeof A[n].id);
                        fd>>A[n].ma>>A[n].da>>A[n].mi>>A[n].di>>A[n].nr;
                        fd.ignore();
                        A[n].paru=((A[n].mi)-(A[n].ma))*30+((A[n].di)-(A[n].da));
                        n++;
                        }
                        fd.close();

     //data output------------------------------------------------------------

       ofstream fr("out.txt", ios::app);
       
       fr<<"-------------------------------------------------------------------"<<endl;
       fr<<" Hotel \"Smart house\" visitors information (2008)   "<<endl;
       fr<<"-------------------------------------------------------------------"<<endl;
       fr<<"room nr.  days "<<endl;
       fr<<"-------------------------------------------------------------------"<<endl;
       fr.setf(ios::fixed);
       
       //Algorithm-------------------------
       
       int k=0;  
       int size = 0;
       int i;
       B[0].nr1=0;
       for(int m=0;m<n;m++)
          { k = 0;
          for ( i=0;i<size;i++)
              {
                   if(A[m].nr==B[i].nr1 )
                      B[i].paru1 += A[m].paru;
                      k++; }
           if(k==0)
                   {    
                   B[size].nr1=A[m].nr;
                   B[size].paru1=A[m].paru;
                   size++;
                   }
                   cout<<"galas"<<" k "<<k<<" m "<<m<<" i "<<i<<" size "<<size<<endl;
    }

       for(i=0;i<size;i++){
       fr<<setw(8)<< B[i].nr1 <<setw(8) << B[i].paru1 <<setw(8)<<endl;}
       fr<<"-------------------------------------------------------------------"<<endl;
       fr.close();
                       
    system("PAUSE");
    return EXIT_SUCCESS;
    }
     

    Attached Files:

    • in.txt
      in.txt
      File size:
      468 bytes
      Views:
      57
    Last edited: Nov 21, 2008
  2. jcsd
  3. Nov 20, 2008 #2

    zyh

    User Avatar

    where is "in.txt" ?
     
  4. Nov 21, 2008 #3
    It's inserted as attachment :-)
     
  5. Nov 21, 2008 #4

    zyh

    User Avatar

    This works fine for me, since you code is VERY HARD to read. I change the variable names. And it take me 30 minutes to find your bug through debugging in the code:cry:.
    Code (Text):

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <iomanip>
    #define MAX 30
    using namespace std;

    int main(int argc, char *argv[])
    {//description of structures----------------------------------------------------------------      
               
        struct CPerson {
               char name[MAX];
               int monthArrive, dayArrive;  //arrive
               int monthLeave, dayLeave;    //leave
               int roomNumber;      //room number
               int days;    //days in hotel
        }A[MAX]; int numberPerson;      
       
        struct CRecord {
               int roomNumber;
               int days;
        }B[MAX];
       

       
        //data input----------------------------------------------------------
        ifstream fd ("in.txt");
        if(!fd) {
            cout<<"Error with \"in.txt\" file."<<endl;
            system("PAUSE");
            return 0;
        }
        else cout<<"Data loaded to \"out.txt\""<<endl;
        numberPerson=0;
        while(!fd.eof() ) {
            fd.get(A[numberPerson].name, sizeof A[numberPerson].name);
            fd>>A[numberPerson].monthArrive>>A[numberPerson].dayArrive>>A[numberPerson].monthLeave>>A[numberPerson].dayLeave>>A[numberPerson].roomNumber;
            fd.ignore();
            A[numberPerson].days=((A[numberPerson].monthLeave)-(A[numberPerson].monthArrive))*30+((A[numberPerson].dayLeave)-(A[numberPerson].dayArrive));
            numberPerson++;
        }
        fd.close();
       
        //data output------------------------------------------------------------
       
        ofstream fr("out.txt", ios::app);
       
        fr<<"-------------------------------------------------------------------"<<endl;
        fr<<" Hotel \"Smart house\" visitors information (2008)   "<<endl;
        fr<<"-------------------------------------------------------------------"<<endl;
        fr<<"room roomNumber.  days "<<endl;
        fr<<"-------------------------------------------------------------------"<<endl;
        fr.setf(ios::fixed);
       
        //Algorithm-------------------------
       
        int matchNumbers=0;  
        int recordSize = 0;
        int i;
        B[0].roomNumber=0;

        for(int m=0;m<numberPerson;m++) {
            matchNumbers = 0;

            //check the current room number has been recorded.
            for ( i=0;i<recordSize;i++) {
                if(A[m].roomNumber==B[i].roomNumber ){
                    B[i].days += A[m].days;
                    matchNumbers++;
                    break;//You just break the loop, because there is no match anymore.
                }
                   
            }


            //If there is no record, add a new record.
            if(matchNumbers==0){    
                B[recordSize].roomNumber=A[m].roomNumber;
                B[recordSize].days=A[m].days;
                recordSize++;
            }
           
            cout<<"galas"<<" matchNumbers "<<matchNumbers<<" m "<<m<<" i "<<i<<" recordSize "<<recordSize<<endl;
        }
       
        for(i=0;i<recordSize;i++){
            fr<<setw(8)<< B[i].roomNumber <<setw(8) << B[i].days <<setw(8)<<endl;
        }
        fr<<"-------------------------------------------------------------------"<<endl;
        fr.close();
       
        system("PAUSE");
        return EXIT_SUCCESS;
    }

     
     
  6. Nov 21, 2008 #5
    Thank you very much. It's working!!! It was difficult to read because I'm new and i use Lithuanian language to identify my variables cause I'm Lithuanian :-) By the way, it's not the end of this program but I hope to understand it by miself... :-) Thank you once again!!!
     
    Last edited: Nov 21, 2008
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Problem in c++ in writing an algorithm
  1. C++ Digit algorithm (Replies: 10)

  2. Writing a program in C (Replies: 8)

Loading...