Member 13523944 Ответов: 1

В этом коде есть логическая ошибка, которую я не могу понять. Код написан на языке turbo c++.


#include<fstream.h>
#include<process.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>


class address
{	int hno;
	char street[30];
	long int pin;
     public:
	void geta()
	{
		cout<<"Enter the house number ";
		cin>>hno;
		cout<<"Enter the street ";
		gets(street);
		cout<<"Enter the pin ";
		cin>>pin;
	}
	void showa()
	{
		cout<<"\nThe houseno"<<hno;
		cout<<"\nThe street ";
		puts(street);
		cout<<"\nThe pin "<<pin;
		cout<<endl;
	}
};


class voter
{
	char name[30];
	int age;
	long int vid;
	char gender;
	address a;
	int lastvote;
	public:
	void getdata()
	{
		cout<<"Enter name"<<endl;
		gets(name);


		ifstream f2("Voter.dat" , ios::binary|ios::in);
		f2.read((char *) this , sizeof(voter));
		f2.seekg(0,ios::end);
		vid = 1 + f2.tellg()/sizeof(voter) ;

		cout << "Your voter id is" << vid<<endl ;
		f2.close();

		cout<<"Enter age (should be greaterthan or equal to 18)"<<endl;
		cin>>age;
		cout<<"Enter address"<<endl;
		a.geta();
		cout<<"Enter gender (M / F)"<<endl;
		cin>>gender;
		cout<<"Enter the year when last voted (between 1900 and 2014;0 for never)"<<endl;
		cin>>lastvote;
	}

	void putdata()
	{	cout<<"Name:"<<endl;
		puts(name);
		cout<<"Voter ID:"<<endl;
		cout<<vid << endl;
		cout<<"Age:"<<endl;
		cout<<age << endl ;
		cout<<"Address:"<<endl;
		a.showa() ;
		cout<<"Gender:"<<endl;
		cout<<gender << endl ;
		cout<<"Last time voted in the year:"<<endl;
		if (lastvote<1900 || lastvote>2014 || lastvote%5 !=4)
		cout<<"Inavlid input" << endl ;
		else if (lastvote==0)
		cout<<"Never casted a vote"<<endl;
		else
		cout<<lastvote  << endl;
	}
	int ret()
	{
		return vid;
	}
	int retvote()
	{
		return lastvote;
	}
	void modify(void );
}v;

void voter::modify(void )
{

	cout<<"Enter new data:"<<endl;
       cout<<"Enter name "<<endl;
		gets(name);

		cout<<"Enter age (should be greaterthan or equal to 18)"<<endl;
		cin>>age;
		cout<<"Enter address"<<endl;
		a.geta();
		cout<<"Enter gender (M \ F)"<<endl;
		cin>>gender;
		cout<<"Enter the year when last voted (between 1900 and 2014;0 for never)"<<endl;
		cin>>lastvote;	;
}
void main()
{
	clrscr();
	int sw,pos,count,voted,p;
	int s,d,m;
	char test='n';
	count=0;
	voted=0;
	fstream file;
	file.open("Voter.dat",ios::in|ios::app|ios::binary);
	file.close();
	char ch='y';
	cout<<"Enter a choice(1-7)"<<endl;
	do
	{
		cout<<"1.Register"<<endl;
		cout<<"2.View detials of a voter"<<endl;
		cout<<"3.View details of all the  voters"<<endl;
		cout<<"4.Modify data"<<endl;
		cout<<"5.Delete data of a voter"<<endl;
		cout<<"6.Display percentage of people who voted in a particular year"<<endl;
		cout<<"7.Exit"<<endl;
		cin>>sw;
		switch(sw)
		{
			case 1:
				file.open("Voter.dat",ios::in|ios::out|ios::binary);
				v.getdata();
				file.write((char*)&v,sizeof(v));
				file.close();
				break;

			case 2:
				file.open("Voter.dat",ios::in|ios::out|ios::binary);
				cout<<" Voter id : " << endl;
				cin >> s;

				file.seekg(0,ios::beg);
				while(!file.eof())
				{
					file.read((char*)&v,sizeof(v));
					if(v.ret()==s)
					{
						v.putdata();
						test='y';
						break;
					}
				}
				if(test=='n')
				{
					cout<<"Voter ID not found"<<endl;
				}
				file.close();
				break;

			case 3:
				file.open("Voter.dat",ios::in|ios::out|ios::binary);
				file.seekg(0,ios::beg);
				while(!file.eof())
				{
					file.read((char*)&v,sizeof(v));
					if(file.eof())
					break;
					v.putdata();
				}
				file.close();
				break;

			case 4:
				file.open("Voter.dat",ios::in|ios::out|ios::binary);
				cout<<"Enter the voter ID of record to be edited: "<<endl;
				cin>>m;
file.read((char*)&v,sizeof(v));
file.seekg(0,ios::end);
if(file.tellg() >= sizeof(voter) * m)
					{
						pos = (m-1)*sizeof(voter);
file.seekp(pos);
						v.modify();
						file.write((char*)&v,sizeof(v));
						test='y';

					}

				if (test=='n')
				{
					cout<<"Record with voter ID:"<<m<<"not found"<<endl;
				}
				cout<<"Now the file contains"<<endl;
				file.seekg(0,ios::beg);
				while(!file.eof())
				{
					file.read((char*)&v,sizeof(v));
					v.putdata();
				}
				file.close();

				break;

			case 5:
				file.open("Voter.dat",ios::in|ios::out|ios::binary);
				cout<<"Enter the voter ID ofrecord to be deleted"<<endl;
				cin>>d;
				file.seekg(0,ios::beg);
				fstream filetemp;
				filetemp.open("Temp.dat",ios::out || ios::binary);
				while(!file.eof())
				{

					file.read((char*)&v,sizeof(v));
					if(v.ret()==d)
					{
						test='y';
					}
					else
					{
						filetemp.write((char*)&v,sizeof(v));
					}
				}
				if(test=='n')
				cout<<"Record not found"<<endl;
				file.close();
				filetemp.close();
				remove("Voter.dat");
				rename("Temp.dat","Voter.dat");
				file.open("Voter.dat",ios::in|ios::out|ios::binary);
				cout<<"Now the file contains"<<endl;
				file.seekg(0,ios::beg);
				while(!file.eof())
				{
					file.read((char*)&v,sizeof(v));
					v.putdata();
				}
				file.close();
				break;

			case 6:
				file.open("Voter.dat",ios::in|ios::out|ios::binary);
				cout<<"Enter the year to display percentage voters of that	year"<<endl;
				cin>>p;
				file.seekg(0,ios::beg);
				while(!file.eof())
				{
					file.read((char*)&v,sizeof(v));
					if(v.retvote()==p)
					{
						count++;
						voted++;
					}
					else
					count++;
				}
				cout<<"Percentage voters is : "<<(voted/count)*100<<endl;
				file.close();
				break;

			case 7:
				exit(0);
				break;
default :
cout<<"Invalid input"<<endl;
break;
}
		cout<<"Do you want to continue?(Y/N)"<<endl;
		cin>>ch
;}while ( ch=='y' || ch=='Y' );
getch();}


Что я уже пробовал:

Я думал об этом в течение нескольких недель, но я не в состоянии понять свою ошибку. Было бы очень хорошо, если бы вы могли помочь. Код написан с использованием обработки файлов данных и является моим проектом для класса 12. Так что это действительно важно для меня.

CPallini

И что же это за дурное поведение?

Richard MacCutchan

Почему вы смешиваете cin/gets и cout/puts? Используйте одно или другое. Что касается вашей логической ошибки, вам нужно объяснить, где она находится, мы не можем догадаться, что должен делать весь этот код.

И то, что вы говорите нам, что это важно для вас, не оставляет никаких сомнений. Проблемы каждого важны для них, но не для волонтеров здесь - которые предоставляют эту услугу бесплатно для вас.

1 Ответов

Рейтинг:
1

Patrice T

Вы только забыли сказать нам, как ваш код пошел не так.

Цитата:
Я думал об этом в течение нескольких недель, но я не в состоянии понять свою ошибку.

Вы знаете, как должен работать ваш код, используя отладчик, вы увидите, как он выполняется, когда он начнет вести себя иначе, чем ожидалось, вы нашли, где находится ваша ошибка.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

Используйте отладчик, встроенный в Turbo C++.