Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2009, 20:39   #1
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию Классы в С++

Здраствуйте,помогите пожалуста с курсовой. Задание такое:

Программный проект представляет собой автоматизированную версию телефонной книги. Структура данных в телефонной книге имеет следующие поля:
• фамилия, имя, отчество абонента;
• адрес абонента;
• год установки телефона;
• номер телефона.
Телефонная книга содержит не более 5000 записей и сохраняется в файле telefon.fam.
Прикладная программа содержит следующие процедуры и функции:
• Добавить (добавляет данные о новом абоненте в телефонную книгу);
• Удалить (удаляет сведения о выбывшем абоненте из телефонной книги);
• НайтиПоИмени (по введенной фамилии, инициалам и адресу ищет и выводит на экран телефон абонента. Если адрес абонента не введен ,и абонентов с указанной фамилией несколько, выводятся сведения обо всех таких абонентах);
• Анализ (провести анализ о количестве установленных телефонов в определенном году);
• Конец (выход из программы).

Ввод данных в программу осуществляется в диалоге по запросам программы. Оператор программы инициирует запуск той или иной процедуры нажатием функциональных клавиш.

Вывод результатов выполнения программы осуществляется согласно описаниям процедур, приведенным выше..

ОШИБКИ
Ошибки ввода при диалоге должны приводить к повторению диалога.
Если при поиске абонент с указанной фамилией не найден, то выдается сообщение "Абонент не найден" и процедура поиска завершается без выхода из программы.
Alik-Soldier вне форума Ответить с цитированием
Старый 26.05.2009, 20:39   #2
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

вот мой код:
Код:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;
void Choice();
char buff[5000];
FILE *f=fopen("telephon.txt", "a");		//Открыть файл для дозаписи
class Telephon								//Создаю свой класс
{
public:
    Telephon();					//Конструктор	
    //~Telephon();				//Деструктор
	void LoadFile();			//Функция для считывания информации из файла
    void Dobavit();				//Функция для добавления экземпляра структуры
    void Ydalit();				//Функция для удаления экземпляра структуры
    void Naity();				//Функция для поиска по адресу/фамилии	
    void Analiz();				//Функция печатает количество телефонов,установленных в определенном году
private:
    struct FIO					//Структура для ФИО абонента
    {
        char surname[50];		//Фамилия 
        char name[50];			//Имя
        char second_name[50];	//Отчество
    };
    FIO fio;					//Экземпляр структуры
    char adress[100];			//Адрес абонента
    int year;					//Год установки телефона
    int number;					//Номер телефона
};
Telephon tel;					//Экземпляр класса
Telephon::Telephon()			//Инициализация конструктора
{
    year=number=0;
}
/*Telephon::~Telephon()			//Инициализация деструктора
{
    return 0;
}*/
void Telephon::LoadFile()
{
	FILE *f=fopen("telephon.txt", "r");
	if((f=fopen("telephon.txt","r"))==NULL)
        cout<<"Cannot open file"<<endl;
	int i=0;
	for(;;)
	{
		char c=fgetc(f);
		buff[i]=c;
		i++;
		if(feof(f))break;
	}
}
void Telephon::Dobavit()		
{
    fprintf(f,"\n************************\n");
	cout<<"Enter telephone subscriber surname, name and second name"<<endl; //ФИО абонента
	cin.getline(tel.fio.surname,sizeof(tel.fio.surname),32);				
    cin.getline(tel.fio.name,sizeof(tel.fio.name),32);
    cin.getline(tel.fio.second_name,sizeof(tel.fio.second_name));
	cout<<"Enter telephone subscriber adress:"<<endl;						//Адрес абонента
    cin.getline(tel.adress,sizeof(tel.adress));
	cout<<"Enter year of telephon installation"<<endl;						//Год установки телефона
    cin>>tel.year;
	cout<<"Enter telephone number:"<<endl;									//Номер телефона
    cin>>tel.number;
    fprintf(f,"%s %s %s\n",tel.fio.surname,tel.fio.name,tel.fio.second_name);//...
    fprintf(f,"%s\n",tel.adress);											//...
    fprintf(f,"%d\n",tel.year);												//...
    fprintf(f,"%d\n",tel.number);											//запись в файл экзмепляра структуры							
}
void Telephon::Ydalit()
{
}
void Telephon::Naity()
{
    bool find=0;
    char surname[50];
    cout<<"Enter telephone subscriber surname"<<endl;					//Ввести фамилию нужного абонента
	cin.getline(surname,sizeof(surname),32);
	FILE *f=fopen("telephon.txt","r");									//Открытие файла для чтения 
    for(;;)																//Выполняется, пока не достигнет конца файла
    {
		if(strcmp(tel.fio.surname,surname)==0)							//Сравнение строк, если найдена нужная фамилия - печать всей структуры на экран
        {																	
        printf("%s %s %s\n %d\n",tel.fio.surname,tel.fio.name,tel.fio.second_name,tel.number);
        find = 1;
		break;
        }
		if(feof(f))break;												//Условие конца файла		
    }
	if(find==0)
		cout<<"Telephone subscriber dont't find"<<endl;					//если абонент не найден - соответуствующее сообщение															//закрытие файла
}
void Telephon::Analiz()
{ 
    int year,c=0;
	cout<<"Enter year of telephon installation"<<endl;			//Вводится год установки телефона
	cin>>year;
	FILE *f=fopen("telephon.txt", "r");							//открываем файл для чтения
	for(;;)														//Выполняется, пока не достигнет конца файла
	{	
		if(year==tel.year)										//Если найден искомый год - инкремент переменной с
			c++;
		if(feof(f))
			break;
	}
	cout<<c<<"Telephon installed in "<<year<<" year"<<endl;		//Вывод на экран количество телефонов, установленных в нужном году	
	fclose(f); 
}
int main()
{
	tel.LoadFile();
    Choice();
    fclose(f); 
    return 0;
}

void Choice()
{
	int control;												//Переменная для реакции на клавиатуру
	cout<<"Choose menu position"<<endl;							//Выбрать позицию из меню
    cout<<"\nMENU:\n1.Add telephone subscriber \n2.Find telephone subscriber \n3.Remove telephone subscriber \n4. Analysis \n5. Exit\n"<<endl;
    cin>>control;
    for(;;)
    {
        if(control==1)
            tel.Dobavit();
		else
        if(control==2)
            tel.Naity();
		else
		if(control==4)
			tel.Analiz();
		else
        if(control==5)break;
		else
			cout<<"You press incorrect button. Please repeat"<<endl;	//Нажата неверная клавиша, повторить
		cout<<"Choose menu position"<<endl;
        cin>>control;
	}
}
Alik-Soldier вне форума Ответить с цитированием
Старый 26.05.2009, 20:39   #3
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Объясните пожалуста,почему не работает поиск по фамилии,году установки...
Функция поиска не выполняется так как надо (если есть одинаковые фамилии,при ее вводе фамилии выводит только последнюю фамилию и телефон),а когда фамилии такой в структуре нет-просто дальше не работает.
И как написать функцию удаления,подскажите идею...
Alik-Soldier вне форума Ответить с цитированием
Старый 26.05.2009, 21:26   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вы хотите сказать, что у вас функции поиска вообще как-то работают? У меня они виснут.
В функции Naity вообще не вижу, чтобы что-то из файла читалось.
С функцией Analiz аналогичная ситуация.

Функция LoadFile считывает данные из файла? В массив символов?
Может, все-таки лучше сделать массив структур? Тогда и искать будет легче.

И с удалением проблем не будет. Просто убираем (можно даже просто смещением остальных) удаляемый элемент и перезаписываем файл.

Еще замечу, что у вас в файле много "мусора" в виде символов перевода строк и звездочек.

-----------
Итог. Раз вы все равно собираетесь считывать в память весь файл, то сделайте лучше в классе массив (можно динамический) структур. Туда загрузите данные. Можно и списком сделать.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 26.05.2009, 21:33   #5
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Спасибо за совет...Но...
Цитата:
Итог. Раз вы все равно собираетесь считывать в память весь файл, то сделайте лучше в классе массив (можно динамический) структур. Туда загрузите данные. Можно и списком сделать.
А как такое можно сделать?мы не проходили,а в инете полазил-не нашел...
Цитата:
И с удалением проблем не будет. Просто убираем (можно даже просто смещением остальных) удаляемый элемент и перезаписываем файл.
Это уже когда массив структур будет,то можно будет удалить элемент структуры и перезаписать все в файл?
Alik-Soldier вне форума Ответить с цитированием
Старый 26.05.2009, 21:44   #6
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Цитата:
В функции Naity вообще не вижу, чтобы что-то из файла читалось.
С функцией Analiz аналогичная ситуация.
я и не пытаюсь найти фамилию или год в файле,я их ищу в структурах которые я сам ввожу с клавиатуры,когда нажимаю добавить...
Alik-Soldier вне форума Ответить с цитированием
Старый 26.05.2009, 21:44   #7
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

и вот если ввел 2 одинаковые фамилии,но дааные остальные разные,выводится лиш последняя фамилия,а не обе...
Alik-Soldier вне форума Ответить с цитированием
Старый 26.05.2009, 21:48   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Alik-Soldier
А как такое можно сделать?
Вынесите структуру (где ФИО, телефон и прочее) из класса.
Пусть будет что-то вроде:

Код:
struct FIO //Структура для ФИО абонента
{
 char surname[50];		//Фамилия 
 char name[50];			//Имя
 char second_name[50];	//Отчество
 char adress[100];			//Адрес абонента
 int year;				//Год установки телефона
 int number;				//Номер телефона
};
ФИО можно, конечно, оставить во вложенной структуре. Но это для примера.

Далее в классе, в паблике (например), объявляете массив структур.
Код:
FIO mas[500]; // массив из 500 структур.
Если выделять динамически, то нужно будет потом пробежаться по файлу, чтобы выяснить, сколько всего структур там находится.
Ну, или, как я уже сказал, делать динамический список.

-----
Вот есть у вас массив.
Далее заполняете его из файла. (там еще нужно объявить переменную, где запишем количество структур).

И потом обращаетесь к любой записи примерно так:
Код:
mas[i].name  - имя человека под номером i в массиве.
Цитата:
Это уже когда массив структур будет,то можно будет удалить элемент структуры и перезаписать все в файл?
Да. Просто ищете человека в массиве и выкидываете оттуда. А потом перезаписываете файл.

===================================
Цитата:
я и не пытаюсь найти фамилию или год в файле,я их ищу в структурах которые я сам ввожу с клавиатуры,когда нажимаю добавить...
Я просто так и не смог уловить, где у вас там данные хранятся и где вы ищете то, что нужно найти.

Цитата:
и вот если ввел 2 одинаковые фамилии,но дааные остальные разные,выводится лиш последняя фамилия,а не обе...
Если вы сделаете через массив структур, то достаточно будет пройтись по массиву и сравнивать нужное поле. И при совпадении выводить все данные.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 26.05.2009, 22:01   #9
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Цитата:
Вот есть у вас массив.
Далее заполняете его из файла. (там еще нужно объявить переменную, где запишем количество структур).
Как заполнять если у миня файл написан в столбик как структура?Например:

Фамилия Имя отчество
Адрес
Год установки
телефон

Через fgetc?и если например переход на новую строку(то есть нажали enter- элемент 13)то это например mas[i].adress?
Alik-Soldier вне форума Ответить с цитированием
Старый 26.05.2009, 22:03   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Не надо через fgetc.
Вы же на C++ пишете. Вместо stdio используйте fstream.
И с помощью getline считывайте файл построчно.

Ну или fgets, на крайний случай.

----------

А вообще с помощью оператора '>>' можно читать.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы в С++ S2S Общие вопросы C/C++ 0 15.03.2009 13:25
Классы bondik Общие вопросы C/C++ 1 14.12.2008 14:19
Классы MaxiMILLION Помощь студентам 4 12.10.2008 14:05
классы ShenDy Общие вопросы C/C++ 1 12.04.2008 14:01