Problem in c++ in writing an algorithm

Click For Summary

Discussion Overview

The discussion revolves around a C++ algorithm intended to read hotel visitor information from a file, contract similar room numbers, and calculate the total number of days for each room. Participants are addressing issues related to the algorithm's functionality and readability, as well as providing debugging assistance.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Homework-related

Main Points Raised

  • One participant describes an issue where the algorithm only counts and writes data for the first room, indicating a potential bug in the logic.
  • Another participant offers a revised version of the code, changing variable names for clarity and suggesting that the original code was difficult to read.
  • The revised code includes a different approach to checking for existing room numbers and updating the total days accordingly, which the original poster finds effective.
  • The original poster expresses gratitude for the help and notes that they are still learning and working on the program.

Areas of Agreement / Disagreement

Participants generally agree on the existence of a bug in the original algorithm and the effectiveness of the revised code. However, the discussion does not resolve all potential issues, as the original poster indicates that the program is not yet complete.

Contextual Notes

There are limitations in the original code related to variable naming and readability, which may have contributed to the difficulty in debugging. The discussion also highlights the challenges faced by new programmers in understanding and modifying existing code.

Who May Find This Useful

This discussion may be useful for beginner programmers looking to understand file input/output in C++, algorithm design for data processing, and debugging techniques.

SimonasV
Messages
6
Reaction score
0
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:
#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;
}
 

Attachments

Last edited:
Technology news on Phys.org
where is "in.txt" ?
 
zyh said:
where is "in.txt" ?

It's inserted as attachment :-)
 
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:
#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;
}
 
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:

Similar threads

  • · Replies 5 ·
Replies
5
Views
3K
Replies
10
Views
2K
  • · Replies 22 ·
Replies
22
Views
4K
  • · Replies 25 ·
Replies
25
Views
3K
Replies
20
Views
2K
  • · Replies 4 ·
Replies
4
Views
6K
  • · Replies 66 ·
3
Replies
66
Views
6K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 2 ·
Replies
2
Views
12K