Консультация № 162215
06.03.2009, 18:07
0.00 руб.
0 7 1
Здравствуйте Уважаемые эксперты!!! Необходима ваша помощь в исправлении программы(код приведен ниже, программу делал на с++ в Visual studio)
Задание:
Класс “Записная книжка” с полями: ФИО, номер телефона, день рождения (массив из 3-х чисел).
− Программа должна осуществлять:
− ввод с клавиатуры с проверкой данных и из файла в динамический массив не менее 8 за-писей;
− сортировку записей по дням рождения;
− вывод в файл и на дисплей ФИО и номер телефона человека, дата дня рождения которого вводится с клавиатуры.
(программа работает так :вводим имя файла например d:\1.txt а дальше выбираем действие)
Проблема с программой такая: Неправильно работает метод SORT- неправильно сортирует введенные данные по дням рождения(дата состоит из число месяц год)
Вот например ввел произвольные 4 записи и вот как она их отсортировала
Medvedev 11111 28 12 2000
Sidorov 99999 5 6 1998
Petrov 66666 3 4 1789
Ivanov 55555 1 2 1999
И еще проблема не пойму почему метод FIND не всегда правильно выдает нужную запись по введенной дате рождения(иногда выдает сразу несколько записей)
Очень прошу помогите :)


Приложение:
#include <stdafx.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>

using namespace std;

class MyRecord;
typedef vector <MyRecord> Base; //вектор записная книжка
vector <MyRecord>::iterator index;//определение итератора index

class FileError{};
class InputStrError{};// класс исключений при ошибке ввода
class InputNumError{};
class MyRecord{
public:

string Fio; //фамилия
string Ntel; // номер телефона
int Data[3]; //дата прождения-массив из 3-х эелементов
//Метод задания значений элементов
void InputRecord(string Fi, string Nt, int Dt[3]){
Ntel=Nt;
Fio=Fi;

Data[0]=Dt[0];
Data[1]=Dt[1];
Data[2]=Dt[2];
}//InputRecord ввод записи

// +++ Перегрузим оператор сравнения "<" для класса MyRecord
// чтобы использовать его в методе Sort()

bool operator <(const MyRecord &right);

void ShowRecord(){
//вывод записи на экран
Printf("<<|<<Familia<<|<< Nomer telefona<<|<< Data rogdenia<<|<<");
cout<<Fio<<" "<<Ntel<<" "<< Data[0]<<"."<<Data[1]<<"."<<Data[2]<<endl;
}//ShowRecord

//Метод сортировки записей в векторе по дате
bool sort_funk(const MyRecord& left,const MyRecord& right){
return left.Data.compare(right.Data)<0; //сортировка по дате
}

//Перегрузка операции >> для ввода записи из файла
friend ifstream& operator >> (ifstream& s, MyRecord& obj)
{
s>>obj.Ntel>>obj.Fio>>obj.Data[0]>>obj.Data[1]>>obj.Data[2];
return s;
}


// --- Перегрузка вставки и извлечения для файловых объектов и класса Myrecord

friend ofstream& operator << (ofstream& s, MyRecord& obj)
{
s<<obj.Ntel<<" "<<obj.Fio<<" "<<" "<<obj.Data[0]<<" "<<" "<<obj.Data[1]<<" "<<obj.Data[2]<<" ";
return s;
}
}; //MyRecord

bool MyRecord::operator <(const MyRecord &right){
return (this->Data < right.Data);
}

class MyBase{ //вектор записная книжка
Base bs;
public:
void InputBase(MyRecord mcl){bs.push_back(mcl);}

//Метод вывода записей вектора на экран
void ShowBase()
{
int n=bs.size();
for(int i=0; i<n; i++)
bs[i].ShowRecord();
}//ShowBase

//метод очистки вектора
void ClearBase() {bs.clear();}

MyRecord& operator [](int i) {return bs[i];}

//метод поиска записи по введенной дате
void Find(int Dt1, int Dt2, int Dt3){
ofstream inf("find.txt");
for (index=bs.begin(); index!=bs.end(); index++)
{
if((*index).Data[0]>Dt1)
{
(*index).ShowRecord();
inf<<(*index);
}
if((*index).Data[0]==Dt1)
{if ((*index).Data[1]>=Dt2){
(*index).ShowRecord();
inf<<(*index);
/////////////////////////////////////
if((*index).Data[1]==Dt2)
{if ((*index).Data[2]>=Dt3){
(*index).ShowRecord();
inf<<(*index);
//////////////////////////////////*/
}
}
}//Find
void Sort(){
sort(bs.begin(), bs.end());
}
};//MyBase

int menu();

int menu()
{
int choose;
bool b=0;
cout<<endl;
cout<<"Viberite punkt menu:"<<endl;
cout<<"1: Vvod dannih s klaviaturi"<<endl;
cout<<"2: Vivod iz faila"<<endl;
cout<<"3: Poisk zapisi po date rojdenia"<<endl;
cout<<"4: Vihod"<<endl;
do
{
if(b==1) cout<<"Chislo mojet Bblt ot 1 do 4"<<endl;
b=1;
cin>>choose;
} while (choose<1 || choose>4);
return choose;
}

int main()
{char i;
int zap=-1, Dt1, Dt2, Dt3, a;
char Fail[81], Fail2[81];
MyRecord my1;
MyBase mb;
bool b;

cout<<"Vvedite imya faila:"<<endl;
cin>>Fail2;
ofstream onf(Fail2);

do{
a=menu();
switch (a)
{
case 1:
do
{
zap+=1;
string Ntf, Fam;// номер телефона и фамилия
char Data1[10];// дата рождения
int Datar[3]; //массив :день- месяц -год

try
{
cout<<"vvedite nomer tel:"<<endl;
cin>>Ntf;
cout<<endl;
for(int pos=0; pos<Ntf.length(); pos++)
if(isdigit(Ntf[pos])==0)throw InputNumError();

cout<<"vvedite FIO:"<<endl;
cin>>Fam;
cout<<endl;
for(int pos=0; pos<Fam.length(); pos++)
if(isdigit(Fam[pos])!=0)throw InputStrError();


cout<<"Vvedite datu rojdenia:"<<endl;
do{
cout<<"Den:"<<endl;
b=1;
cin>>Data1;
for(int pos=0; pos<strlen(Data1);pos++)
if(isdigit(Data1[pos])==0) throw InputNumError();
Datar[0]=atoi(Data1);
if(Datar[0]<0 || Datar[0]>31)//проверяем колличество дней
{
cout<<"Neverno vveden den"<<endl;
b=0;
}
}while(b!=1);

do{
cout<<"Mesyac:"<<endl;
b=1;
cin>>Data1;
for(int pos=0; pos<strlen(Data1);pos++)
if(isdigit(Data1[pos])==0) throw InputNumError();

Datar[1]=atoi(Data1);
if(Datar[1]<0 || Datar[1]>12)
{
cout<<"Nepravilno!Pojaluysta, vvedite eshe raz!"<<endl;

b=0;
}
//вводим год рождения
}while(b!=1);
do{
cout<<"GOD:"<<endl;
b=1;
cin>>Data1;
for(int pos=0; pos<strlen(Data1);pos++)
if(isdigit(Data1[pos])==0) throw InputNumError();

Datar[2]=atoi(Data1);
if(Datar[2]<0 || Datar[1]>2009)
{
cout<<"Nepravilno!Pojaluysta, vvedite eshe raz!"<<endl;

b=0;
}

}while(b!=1);


my1.InputRecord(Ntf, Fam, Datar);
mb.InputBase(my1);

cout<<"Dobavit eshe odnu zapis?(y/n)"<<endl;
cin>>i;
}
catch(InputStrError)
{
cout<<"Nelzya vvodit cifrbl!Poprobuite eshe raz!"<<endl;
}

catch(InputNumError)
{
cout<<"Nelzya vvodit bukvbl!Poprobuite eshe raz!"<<endl;
}

} while (i!='n');

mb.Sort();
mb.ShowBase();
for(int pos=0; pos<zap+1;pos++)
onf<<mb[pos];

onf.close();
break;

case 2:
{
try
{
cout<<"Vvedite imya faila:"<<endl;
cin>>Fail;
ifstream inf(Fail);
if(!inf) throw FileError();
while (1)
{
inf>>my1;
if(inf.eof()) break;
mb.InputBase(my1);
}
mb.ShowBase();
inf.close();
}
catch(FileError)
{
cout<<"Net takogo faila!!!"<<endl;
}

}
break;

case 3:
cout<<" Vvedite den"<<endl;
cin>>Dt1;
cout<<" Vvedite mecyac "<<endl;
cin>>Dt2;
cout<<" Vvedite GOD "<<endl;
cin>>Dt3;

mb.Find(Dt1,Dt2,Dt3);
break;

}
}while(a!=4);

return 0;
}

Обсуждение

Неизвестный
06.03.2009, 18:27
общий
А это ничего, что метод Find(), например, имеет большее количество открывающихся скобок {, чем закрывающихся }? И это не единственная синтаксическая ошибка. Как же оно может вообще что либо выдавать, если не компилируется?
И где этот PrintF()?
И что такое left.Data.compare() где Data это int?
Неизвестный
06.03.2009, 18:54
общий
Micren
Странно у меня запустилась-не выдало ошибок
Я скопировал тест программы прям с окна запущенной студии,Делал программу не я , я взял готовую программу похожую на мою и немного изменил под свой вариант
"И что такое left.Data.compare() где Data это int?"-затрудняюсь ответить так программу изначально не я писал, да здесь действительно ошибка
так как в той программе где я это взял была объявлена переменная string Punkt; и было написано так left.Punkt.compare(right.Punkt)<0;( да в ней сортировка была по переменной Punkt)
Если вы знаете как исправить пожалуйста помогите

Неизвестный
06.03.2009, 19:03
общий
Вы лучше выложите весь проект(т.е. всю папку). Запакуйте его в архив и на какой нибудь обменник его. Например, www.rapidshare.com

А насчет того, что Вы скопировали. То попробуйте теперь скопировать с формы в вашем вопросе и вставить в VS в новый проект и посмотрите, что получится.
Неизвестный
06.03.2009, 19:18
общий
Micren вот весь проект(запускал в Visual studio 2005)
http://rapidshare.com/files/206076852/LAB_3.rar.html

если что вот еще сюда залил http://slil.ru/27028766
Неизвестный
06.03.2009, 19:32
общий
Результат тот же самый. Завтра напишу весь код с нуля.
Неизвестный
06.03.2009, 19:46
общий
Micren
Если сможете написать это хорошо, но просто в начале лабораторной написано так:
" Цель работы - ознакомление с классами – контейнерами библиотеки STL, библиотечным классом string, файловой системой и обработкой исключений.
Классы – контейнеры.
В нижеследующих вариантах разработать классы с использованием контейнера, разработать методы ввода данных с клавиатуры в контейнер, сохранение элементов в файле, поиск или сор-тировку элементов в массиве и вывод на экран результатов, удаление элементов.
Предусмотреть обработку исключительной ситуации, возникающей при вводе данных с кон-соли и работе с файлом; обработчик данных должен указывать на место возникновения ситуа-ции и предлагать способ ее преодоления."
То есть программа нужна в такой форме как та что скинул я (т. е. с использованием контейнера vector)
давно
Старший Модератор
17042
808
06.03.2009, 22:30
общий
это ответ
Здравствуйте, Иванов Руслан Иванович!
На мой взгляд Вы несколько усложняете в общем-то тривиальную задачу. Ошибки Вашего кода уже освещены в мини-форуме.
Попробуем решить приведённую задачу заново. Для хранения каждой отдельной записи данных о человеке будем использовать экземпляр класса TNote. Он будет включать два метода: GetData(); - для получения данных с клавиатуры и ShowInfo(); - для отображения данных человека. Для облегчения работы объявим все члены класса открытыми. Чтение данных из файла будем осуществлять в главной функции приложения непосредственно в вектор объектов класса TNote. Там же будет происходить и сортировка (по году рождения). Отсортированные данные будкт записываться в файл. Подробнее - см. приложение (код комментирован).

Приложение:
//----------------------------------------------------------
// Файл TNote.h
//----------------------------------------------------------
#ifndef _TNote_h_
#define _TNote_h_
//----------------------------------------------------------
#include <string>
using namespace std;
//----------------------------------------------------------
class TNote
{
public:
TNote();

string sName;
string sLastName;
int iPhone;
short nDateOfBirth[3];

void GetData();
void LoadData();
void ShowInfo();
};
//----------------------------------------------------------
#endif
//----------------------------------------------------------
// Файл TNote.cpp
//----------------------------------------------------------
#include <iostream>
using namespace std;
//----------------------------------------------------------
#include "TNote.h"
//----------------------------------------------------------
TNote::TNote()
{
iPhone = 0;
}
//----------------------------------------------------------
void TNote::GetData()
{
cout << "Введите данные о человеке." << endl;
cout << "Имя: ";
cin >> sName;
cout << "Фамилия: ";
cin >> sLastName;
cout << "Введите дату рождения (цифрами)" << endl;
cout << "Число: ";
cin >> nDateOfBirth[0];
cout << "Месяц: ";
cin >> nDateOfBirth[1];
cout << "Год: ";
cin >> nDateOfBirth[2];
cout << "Телефон: ";
cin >> iPhone;
cout << "****" << endl;
}
//----------------------------------------------------------
void TNote::ShowInfo()
{
cout << "Имя: " << sName << endl;
cout << "Фамилия: " << sLastName << endl;
cout << "Дата рождения: " << nDateOfBirth[0] << "." << nDateOfBirth[1] << "." << nDateOfBirth[2] << endl;
}
//----------------------------------------------------------
// Файл main.cpp
//----------------------------------------------------------
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
//----------------------------------------------------------
#include "TNote.h"
//----------------------------------------------------------
const int iMAX_NOTES = 8;
//----------------------------------------------------------
int main()
{
vector<TNote> Persons; // Массив из объектов класса TNote
TNote Buffer;

short nAnswer; // Ответ

cout << "Вы желаете:" << endl;
cout << "1. Ввести данные с клавиатуры." << endl;
cout << "2. Загрузить данные из файла." << endl;
cout << "Введите свой выбор цифрой: ";
cin >> nAnswer;

if(nAnswer == 1)
{
for(int i = 0; i < iMAX_NOTES; i++)
{
Buffer.GetData(); // Ввод данных с клавиатуры
Persons.push_back(Buffer); // Добавляем данные о человеке в динамический массив
}
}
else if(nAnswer == 2)
{
string sTmpString;
ifstream ifPersonsBase("Base.txt", ios::in); // Чтение из файла...
if(!ifPersonsBase.is_open())
{
cout << "Ошибка чтения из файла!" << endl;
return 1;
}

for(int i = 0; i < iMAX_NOTES; ) // Читаем
{
getline(ifPersonsBase, Buffer.sName);
getline(ifPersonsBase, Buffer.sLastName);
getline(ifPersonsBase, sTmpString);
Buffer.iPhone = atoi(sTmpString.c_str());
getline(ifPersonsBase, sTmpString);
Buffer.nDateOfBirth[0] = atoi(sTmpString.c_str());
getline(ifPersonsBase, sTmpString);
Buffer.nDateOfBirth[1] = atoi(sTmpString.c_str());
getline(ifPersonsBase, sTmpString);
Buffer.nDateOfBirth[2] = atoi(sTmpString.c_str());
getline(ifPersonsBase, sTmpString);
if(sTmpString == "***") i++;
else break;
cout << "Запись " << i << " считана успешно." << endl;
Persons.push_back(Buffer);
}
ifPersonsBase.close(); // Конец чтения.
}

// Сортируем список по году рождения (старшие - вперёд)...
for(int i = 0; i < (iMAX_NOTES - 1); i++)
{
for(int j = 0; j < (iMAX_NOTES - 1); j++)
{
if(Persons[j].nDateOfBirth[2] > Persons[j + 1].nDateOfBirth[2]) // Если старше...
{
Buffer = Persons[j]; // ...производим обмен
Persons[j] = Persons[j + 1];
Persons[j + 1] = Buffer;
}
}
}

ofstream ofPersonsBase("Base.txt", ios::out); // Запись в файл...
if(!ofPersonsBase)
{
cout << "Ошибка записи в файл!" << endl;
return 1;
}
for(int i = 0; i < iMAX_NOTES; i++)
{
ofPersonsBase
<< Persons[i].sName << endl
<< Persons[i].sLastName << endl
<< Persons[i].iPhone << endl
<< Persons[i].nDateOfBirth[0] << endl
<< Persons[i].nDateOfBirth[1] << endl
<< Persons[i].nDateOfBirth[2] << endl
<< "***" << endl;
}
ofPersonsBase.close(); // Конец записи.

int iSeekingNumber; // Номер телефона для поиска
bool bIsFound = false; // пока не найден

cout << "Введите номер телефона для поиска: ";
cin >> iSeekingNumber;

for(int i = 0; i < iMAX_NOTES; i++)
{
if(Persons[i].iPhone == iSeekingNumber)
{
cout << "Номер (" << iSeekingNumber << ") найден: " << endl;
Persons[i].ShowInfo();
bIsFound = true;
break;
}
}

if(bIsFound == false) cout << "Телефонный номер не найден." << endl;

return 0;
}
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа