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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2014, 18:35   #21
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Попробуйте ввести имя длиннее, чем 10 символов

Забегая вперёд, хочу отметить, что надо заменить массивы символов:
Код:
char name [LEN];
На объекты класса std::string:
Код:
std::string name;
Этот объект сможет вместить имя любой длины

Со статическими объектами вы перемудрили, как и с именем класса. Надо было назвать его Person

Вы хотели применить паттерн Singleton?
8Observer8 вне форума Ответить с цитированием
Старый 07.10.2014, 19:17   #22
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
Радость

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Вы хотели применить паттерн Singleton?
Я даже не знаю что это)
А почему со статическими элементами намудрил?
igoreshka3333 вне форума Ответить с цитированием
Старый 07.10.2014, 23:08   #23
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Скиньте текущий код. Я завтра в течении дня отвечу на вопрос
8Observer8 вне форума Ответить с цитированием
Старый 07.10.2014, 23:30   #24
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Код:
#include <iostream>
#include <fstream>
#include <process.h>
using namespace std;
const int MAX = 10;
const int LEN = 10;

class Name
{
private:
    char name [LEN];
    char surname [LEN];
    int age;
    static int n;
    static Name* arname [];
public:
    void getName (){
        cout << "\nEnter the name: "; cin >> name;
        cout << "Enter the surname: "; cin >> surname;
        cout << "Enter the age of the person: "; cin >> age;
    }
    void showName (){
        cout << "\nName: " << name;
        cout << "\nSurname: " << surname;
        cout << "\nAge: " << age;
    }
    static void add ();
    static void diskIn ();
    static void diskOut (int);
};

int Name::n;
Name* Name::arname[MAX];
//-----------------------------------------------------------
void Name::add ()
{
    arname[n] = new Name;
    arname[n++]->getName();
}
//-----------------------------------------------------------
void Name::diskIn ()
{
    ofstream ofile;
    ofile.open("EX.TXT", ios::trunc);
    if (!ofile) cout << "\nThe file can not be opened!";
    cout <<"\nThere is a record of " << n <<" men!\n";
    for (int i=0; i<n; i++){
        ofile << arname[i]->name << ' '
              << arname[i]->surname << ' '
              << arname[i]->age;
    }
    ofile.close();
}
//-----------------------------------------------------------
void Name::diskOut (int t)
{
    ifstream ifile;
    ifile.open("EX.TXT");
    if (!ifile) cout << "\nThe file can not be opened!";
    cout << "\nThere is reading of the " << t << " man!\n";
    ifile >> arname[t-1]->name >> arname[t-1]->surname >> arname[t-1]->age;
    cout << arname[t-1]->name << endl
                              << arname[t-1]->surname << endl
                              << arname[t-1]->age;
    arname[t-1]->showName();
}
//-----------------------------------------------------------
int main ()
{
    Name N;
    int ch;
    int number;
    while (true){
        cout << "Choose an action: \n1)Enter information;\n"
             << "2)Write information to a file;\n"
             << "3)Read information from a file;\n"
             << "4)Exit;\n";
        cin >> ch;
        switch (ch){
        case 1: N.add(); break;
        case 2: Name::diskIn (); break;
        case 3:{
            cout << "\nNumber of man: ";
            cin >> number; Name::diskOut (number); break;
        }
        case 4: exit (1);
        }
    }
    return 0;
}
)
igoreshka3333 вне форума Ответить с цитированием
Старый 08.10.2014, 10:01   #25
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

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

Имя класса очень неудачное. Что за тип "Name"? Почему у объектов типа "Name" есть имя и возраст? Просто с ума можно сойти от таких абстракций.

Имя и возраст может быть у объекта типа "Человек":

Код:
#include <string>
#include <iostream>

class Person
{
public:
    std::string name;
    int age;
};

int main()
{
    Person ivan;
    ivan.name = "Ivan";
    ivan.age = 27;

    std::cout << "Name: " << ivan.name << std::endl;
    std::cout << "Age: " << ivan.age << std::endl;

    return 0;
}
Функцию getName() надо сделать свободной, то есть не принадлежащей классу "Person". И назвать её не getName, а getPerson(). Функция getPerson() возвращает объект типа "Person":

Код:

#include <string>
#include <iostream>
#include <fstream>

class Person
{
public:
    std::string name;
    std::string surname;
    int age;
};

Person getPerson();

int main()
{
    Person ivan;
    ivan = getPerson();

    std::cout << "Name: " << ivan.name << std::endl;
    std::cout << "Surname: " << ivan.name << std::endl;
    std::cout << "Age: " << ivan.age << std::endl;

    return 0;
}

Person getPerson()
{
    Person person;

    std::cout << "\nEnter the name: "; std::cin >> person.name;
    std::cout << "Enter the surname: "; std::cin >> person.surname;
    std::cout << "Enter the age of the person: "; std::cin >> person.age;

    return person;
}
8Observer8 вне форума Ответить с цитированием
Старый 08.10.2014, 10:20   #26
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Теперь убираем код из main, который выводит на экран, в функцию showPerson()

Код:

#include <string>
#include <iostream>
#include <fstream>

class Person
{
public:
    std::string name;
    std::string surname;
    int age;
};

Person getPerson();
void showPerson( Person person );

int main()
{
    Person ivan;

    ivan = getPerson();
    showPerson( ivan );

    return 0;
}

Person getPerson()
{
    Person person;

    std::cout << "\nEnter the name: "; std::cin >> person.name;
    std::cout << "Enter the surname: "; std::cin >> person.surname;
    std::cout << "Enter the age of the person: "; std::cin >> person.age;

    return person;
}

void showPerson( Person person )
{
    std::cout << "\nName: " << person.name;
    std::cout << "\nSurname: " << person.surname;
    std::cout << "\nAge: " << person.age << "\n";
}
8Observer8 вне форума Ответить с цитированием
Старый 08.10.2014, 10:43   #27
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Откажитесь от статического массива в этой задаче, и используйте класс std::vector. Он выполняет функции массива и в него можно добавлять элемент неограниченно

Ещё я добавил возможность для пользователя "Показать информацию", то есть всех людей из массива

Код:

#include <string>
#include <iostream>
#include <fstream>
#include <vector>

class Person
{
public:
    std::string name;
    std::string surname;
    int age;
};

Person getPerson();
void showPersons( const std::vector<Person> &persons );

int main()
{
    std::vector<Person> arrayOfPersons;

    while ( true ) {
        std::cout << "\nChoose an action: \n1)Enter information;\n"
             << "2)Show information;\n"
             << "3)Write information to a file;\n"
             << "4)Read information from a file;\n"
             << "5)Exit;\n";

        int ch;
        std::cout << "\n> "; std::cin >> ch;
        switch ( ch ) {
        case 1: {
            Person person;
            person = getPerson();
            arrayOfPersons.push_back( person );
            break;
        }
        case 2: {
            showPersons( arrayOfPersons );
            break;
        }
        case 5: exit (1);
        }
    }

    return 0;
}

Person getPerson()
{
    Person person;

    std::cout << "\nEnter the name: "; std::cin >> person.name;
    std::cout << "Enter the surname: "; std::cin >> person.surname;
    std::cout << "Enter the age of the person: "; std::cin >> person.age;

    return person;
}

void showPersons( const std::vector<Person> &persons )
{
    for ( int i = 0; i < persons.size(); i++ ) {
        std::cout << "\nName: " << persons[i].name;
        std::cout << "\nSurname: " << persons[i].surname;
        std::cout << "\nAge: " << persons[i].age << "\n";
    }
}
8Observer8 вне форума Ответить с цитированием
Старый 08.10.2014, 10:48   #28
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Осталось реализовать две последнии функции:
Код:
std::vector<Person> diskOut();
void diskIn( const std::vector<Person> &persons );
Ещё вам на будущее такое задание. Допустим заказчик хочет, чтобы он мог вводить не имена, возраст и т.д., а чтобы он мог ввести id из vk.com

P.S. Для Qt могу дать заготовку, а для Builder погуглите. Ну если конечно интересно

У вас в этой строке ошибка:
Код:
if (!ofile) cout << "\nThe file can not be opened!";
Вы когда не смогли открыть файл, то надо выходить, а не продолжать выполнение. Выходить так:
Код:
    if ( !ofile ) {
        std::cout << "\nThe file can not be opened!";
        return;
    }

Последний раз редактировалось Stilet; 18.10.2014 в 11:22.
8Observer8 вне форума Ответить с цитированием
Старый 08.10.2014, 11:28   #29
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Спасибо) Чувствуется рука мастера! С вектором, правда, пока не знаком...

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Ещё вам на будущее такое задание. Допустим заказчик хочет, чтобы он мог вводить не имена, возраст и т.д., а чтобы он мог ввести id из vk.com

P.S. Для Qt могу дать заготовку, а для Builder погуглите. Ну если конечно интересно
Та ну даже не знаю! Я далек от этого) Это уже работа с интерфейсом?

Последний раз редактировалось Stilet; 18.10.2014 в 11:23.
igoreshka3333 вне форума Ответить с цитированием
Старый 08.10.2014, 11:34   #30
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Это уже работа с интерфейсом?
Всё ещё консоль. Просто имя, возраст и т.д. будет из vk.com браться по введёному id

Цитата:
Сообщение от igoreshka3333 Посмотреть сообщение
Спасибо) Чувствуется рука мастера! С вектором, правда, пока не знаком...
На здоровье! Да, так уж и мастера А что с вектором то знакомиться? Неужели из кода непонятно, как с ним работать? Воспринимайте его как обычный массив, в котором можно хранить объекты любого типа:

Код:
#include <iostream>
#include <vector>
#include <string>

class Person
{
public:
    Person( std::string n, int a ) :
        name( n ), age( a )
    {

    }

    std::string name;
    int age;
};

int main()
{
    std::vector<int> arrayOfInts = { 1, 2, 3 };
    std::vector<double> arrayOfDoubles = { 1.5, 2.5, 3.5 };
    std::vector<Person> arrayOfPersons = { Person( "Ivan", 27 ),
                                           Person( "Igor", 28 ) };

    for( int i = 0; i < arrayOfInts.size(); i++ ) {
        std::cout << arrayOfInts[i] << std::endl;
    }

    return 0;
}

Последний раз редактировалось Stilet; 18.10.2014 в 11:23.
8Observer8 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
описать класс в с# volkodinocka Помощь студентам 0 09.11.2013 22:05
Описать класс С# NeoX_2011 Помощь студентам 1 19.03.2012 00:10
C# исправление ошибки. Описать класс, реализующий шестнадцатеричный счетчик PROkaZZZniK Помощь студентам 7 09.02.2012 16:29
Описать класс-родитель и класс-потомок. Delphi 7 Andrew_M Помощь студентам 0 15.01.2011 14:42
Описать класс. Telec Общие вопросы C/C++ 1 30.04.2010 18:43