Форум программистов, компьютерный форум CyberForum.ru

Кто-нибудь может переделать задачу со структур на классы? - C++

Восстановить пароль Регистрация
 
Beatles
1 / 1 / 0
Регистрация: 18.04.2012
Сообщений: 36
28.06.2012, 11:11     Кто-нибудь может переделать задачу со структур на классы? #1
Огромное спасибо, кто откликнется.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <string.h>
 
main()
{
struct ZNAK
{
   char NAME[20],ZNAK2[15];
   unsigned BDAY[3];
}BZNAK[8],T;
 
int i,j,z,k=0; 
char Number[15];
 
 
for(i=0;i<2;i++)
{
  printf("\nFamily, Name? "); 
  gets(BZNAK[i].NAME);
  
if(strlen(BZNAK[i].NAME)==0)break;
 
  printf("Znak zodiaka? "); 
  gets(BZNAK[i].ZNAK2);
  
  printf("Birthday (YYYY MM DD)? ");
  
   for(j=0;j<3;j++)
   scanf("%u",&BZNAK[i].BDAY[j]);
   gets(Number); 
   k++;
};
 
   for(i=0;i<k;i++)
   for(j=0;j<k-i-1;j++)
   
if((long)1000*BZNAK[j].BDAY[0]+50*BZNAK[j].BDAY[1]+BZNAK[j].BDAY[2]>(long)1000*BZNAK[j+1].BDAY[0]+50*BZNAK[j+1].BDAY[1]+BZNAK[j+1].BDAY[2])
 {
  T=BZNAK[j];
  BZNAK[j]=BZNAK[j+1];
  BZNAK[j+1]=T;
 }
 printf ("Uporadochennie po date zapici\n");
 for(i=0;i<k;i++)
 printf("\nName: %s \nZnak zodiaka: %s \nBirthday: %u %u %u\n\n", BZNAK[i].NAME,  BZNAK[i].ZNAK2,   BZNAK[i].BDAY[0],   BZNAK[i].BDAY[1],   BZNAK[i].BDAY[2]);
 
 
 
    printf("\nKakaj familia? "); 
    gets(Number); 
    z=strlen(Number);
    j=0;
    
    for(i=0;i<k;i++)
    
 if(!strncmp(Number, BZNAK[i].NAME, z)) //Г±Г°Г*ГўГ*ГЁГўГ*ГҐГІ Г*ГҐ áîëåå z ñèìâîëîâ ГЁГ§ ГЄГ*æäîé ñòðîêè
   
    {
        printf("\nName: %s \nZnak zodiaka: %s \nBirthday: %u %u %u\n\n", BZNAK[i].NAME,  BZNAK[i].ZNAK2,   BZNAK[i].BDAY[0],   BZNAK[i].BDAY[1],   BZNAK[i].BDAY[2]);           
        j=1;
    };
  if(!j)printf("No such person!\n\n");
  getch();
}
 Комментарий модератора 
В языке С нет классов. Внимательнее выбирайте раздел.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2012, 11:11     Кто-нибудь может переделать задачу со структур на классы?
Посмотрите здесь:

C++ [C/C++]Компилятор g++.Странности с true и false.Кто нибудь может прокомментировать/повторить это у себя?
C++ Нужно решить задачу на языке C++, помогите пожалуйста кто чем может!
C++ неправильно работает конструктор копирования list, кто-нибудь может объяснить почему?
C++ Кто может сделать олимпиадную задачу?
C++ Преобразование времени (double. Может всё-таки кто-нибудь знает)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
28.06.2012, 15:17     Кто-нибудь может переделать задачу со структур на классы? #2
struct меняется на class и ставится public:

C++
1
2
3
4
5
6
class ZNAK
{
public:
   char NAME[20],ZNAK2[15];
   unsigned BDAY[3];
}BZNAK[8],T;
Beatles
1 / 1 / 0
Регистрация: 18.04.2012
Сообщений: 36
28.06.2012, 15:21  [ТС]     Кто-нибудь может переделать задачу со структур на классы? #3
Спасибо большое за ответ. Я так сделал, а как делать дальше? Просто она не запускается... Видимо, либо я что-то не дописываю, либо ещё что-то не так. Можно код программы накидать, пожалуйста, если вам не трудно.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,404
28.06.2012, 15:31     Кто-нибудь может переделать задачу со структур на классы? #4
А еще в языке С если явно не указан возвращаемый тип функции, то он равен int, а в языке С++ - void.
Т.е.
C++
1
main()
надо явно указать
C++
1
int main()
А вобще, тут чтобы перевести на язык С++ надо просто все стереть и написать код заново. А использовать классы наряду с printf, scanf, gets
как-то не очень.
Кто-нибудь может переделать задачу со структур на классы?
. Впрочем, брать класс и пихать все в паблик тоже не есть гуд. Инкапсуляцию придумали не просто так.

Озвучьте задание, процесс быстрее пойдет.
Beatles
1 / 1 / 0
Регистрация: 18.04.2012
Сообщений: 36
28.06.2012, 15:37  [ТС]     Кто-нибудь может переделать задачу со структур на классы? #5
А еще в языке С если явно не указан возвращаемый тип функции, то он равен int, а в языке С++ - void.
Да-да, спасибо, теперь заметил.


Само задание следующее: Описать структуру (в нашем случае, наверное, класс), содержащую поля: 1.фамилия, имя. 2.Знак зодиака. 3.Дата рождения (массив из трёх чисел).

Написать программу, выполняющую следующие действия: 1.Ввод с клавиатуры данных в массив, состоящий из 8 элементов типа ZNAK; записи должны быть упорядочены по датам рождения; 2. Вывод на экран информации о человеке, чья фамилия введена с клавиатуры.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,404
28.06.2012, 16:26     Кто-нибудь может переделать задачу со структур на классы? #6
Ну как-то так. Добавишь менюшку, проверку на корректность значений, ну и что там еще тебе надо сделать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <string>
 
class Zodiac
{
  private:
    std::string name, surname, sign;
    int day, month, year;
    bool empty;
  public:
    Zodiac(){empty = true;}
    Zodiac(std::string n, std::string s, std::string z, int a, int b, int c):
            name(n), surname(s), sign(z), day(a), month(b), year(c){empty = false; }
    void fill(std::string n, std::string s, std::string z, int a, int b, int c);
    std::string getSurname() const {return surname; }
    bool operator< (const Zodiac &);
    friend std::ostream& operator<< (std::ostream &, const Zodiac &);
};    
 
int main()
{
    const std::size_t N = 8;
    Zodiac z[N];
    std::size_t counter = 0;
    for (int i=0; i < 2; i++)
    {    
        std::string name, surname, sign;
        int day, month, year;
        std::cout<< "Enter name: "; std::cin>> name;
        std::cin.ignore();
        std::cout<< "Enter surname: "; std::cin>> surname;
        std::cin.ignore();
        std::cout<< "Enter sign: "; std::cin>> sign;
        std::cin.ignore();   
        std::cout<< "Enter DOB: "; std::cin>> day>> month>> year;
        z[counter++].fill(name, surname, sign, day, month, year);
    }
    std::string key;
    std::cout<< "Enter key: "; std::cin>> key;
    for (std::size_t i=0; i < counter; i++)
    //    std::cout<< z[i];
        if (z[i].getSurname() == key) std::cout<<z[i];    
    return 0;
}
 
void Zodiac::fill (std::string n, std::string s, std::string z, int a, int b, int c)
{
    name = n;
    surname = s;
    sign = z;
    day = a;
    month = b;
    year = c;
    empty = false;
}
 
bool Zodiac::operator< (const Zodiac &z)
{
     if (z.year != year)
         return year < z.year;
     if (z.month != month)
         return month < z.month;
     return day < z.day;
}
 
std::ostream& operator<< (std::ostream &out, const Zodiac &z)
{
    if (z.empty) return out;
    out<< "Name: "<< z.name<< std::endl
       << "Surname: "<< z.surname<< std::endl
       << "Sign: "<< z.sign<< std::endl
       << "DOB: "<< z.day<< " "<< z.month<< " "<< z.year<< std::endl<< std::endl;
    return out;
}
Да, и сортировку доделай. Я бы взял во внимание std::sort (оператор для неё уже определил). Можешь написать свою функцию.
Beatles
1 / 1 / 0
Регистрация: 18.04.2012
Сообщений: 36
28.06.2012, 16:52  [ТС]     Кто-нибудь может переделать задачу со структур на классы? #7
Огромное спасибо. От души. Вы не представляете, как меня спасаете) Можно ещё пару вопросов:
Если не сложно, можно парочку комментариев по поводу функций (за что отвечают) и некоторых переменных: counter, empty и ещё каких-нибудь, т.к. я пока разбираюсь в вашей чудесной!! программе) И вот ещё вопрос: я не уверен, но слышал, что, чтобы не писать всегда std:: можно в начале программы написать using namespace std; вроде бы...?
P.S. Ещё раз спасибо!)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,404
28.06.2012, 17:37     Кто-нибудь может переделать задачу со структур на классы? #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <string>
 
class Zodiac
{
  private:
    std::string name, surname, sign; // объявляем поля класса
    int day, month, year;
    bool empty; // это поле класса отвечает за "заполненность" Т.е. если класс проинициализирован, то она равна false, иначе true.
  public:
    Zodiac(){empty = true;} // объявляем конструктор по умолчанию
    Zodiac(std::string n, std::string s, std::string z, int a, int b, int c): // объявляем аргументированный конструктор и ицициализируем его
            name(n), surname(s), sign(z), day(a), month(b), year(c){empty = false; }
    void fill(std::string n, std::string s, std::string z, int a, int b, int c); // объявляем функцию, которая заполняет поля класса
    std::string getSurname() const {return surname; } // функция возвращает фамилию (получаем доступ)
    bool operator< (const Zodiac &); // оператор для сравнения (пригодиться в сортировке. Т.к. класс не POD тип, то компилятору нужно указать, что является больше, а что меньше)
    friend std::ostream& operator<< (std::ostream &, const Zodiac &); // дружественная функция вывода объекта в поток. Дружественные функции получают доступ к private-членам
};    
 
int main()
{
    const std::size_t N = 8; // объявляем массив размера как константу
    Zodiac z[N]; // объявляем массив объектов класса Zodiak. Но не инициализируем их.
    std::size_t counter = 0; // счетчик на 0. Будет отвечать за кол-во заполненных элементов 
    for (int i=0; i < 2; i++)
    {    
        std::string name, surname, sign;
        int day, month, year;
        std::cout<< "Enter name: "; std::cin>> name;
        std::cin.ignore(); // при нажатии Enter в потоке остается символ '/n' И если его не игнорировать, то он и запишется в переменную типа std::string при след. считывании, т.к. она ожидает этого символа в потоке.
        std::cout<< "Enter surname: "; std::cin>> surname;
        std::cin.ignore();
        std::cout<< "Enter sign: "; std::cin>> sign;
        std::cin.ignore();   
        std::cout<< "Enter DOB: "; std::cin>> day>> month>> year; // последовательно считываем день, месяц, год
        z[counter++].fill(name, surname, sign, day, month, year); // вызываем метод fill и передаем ему считаные аргументы в качестве параметра. Метод вызывается у объекта класса с индексом counter (добавление идет в конец). Увеличиваем счетчик на 1.
    }
    std::string key; // ключ, по которому будем искать нужный объект
    std::cout<< "Enter key: "; std::cin>> key;
    for (std::size_t i=0; i < counter; i++)
    //    std::cout<< z[i];
        if (z[i].getSurname() == key) std::cout<<z[i];    
    return 0;
}
 
void Zodiac::fill (std::string n, std::string s, std::string z, int a, int b, int c)
{
    name = n;
    surname = s;
    sign = z;
    day = a;
    month = b;
    year = c;
    empty = false;
}
 
bool Zodiac::operator< (const Zodiac &z)
{
     if (z.year != year) // если год нашего объекта не равен году сравниваемого
         return year < z.year;
     if (z.month != month)
         return month < z.month;
     return day < z.day; // вернет истину, если day < z.day
}
 
std::ostream& operator<< (std::ostream &out, const Zodiac &z) // возвращает ссылку на поток ostream
{
    if (z.empty) return out; // если объект не проинициализирован (или просто его поле empty == true), то возвращаем пустой поток
    out<< "Name: "<< z.name<< std::endl // формируем поток
       << "Surname: "<< z.surname<< std::endl
       << "Sign: "<< z.sign<< std::endl
       << "DOB: "<< z.day<< " "<< z.month<< " "<< z.year<< std::endl<< std::endl;
    return out; // возвращаем поток
}
можно в начале программы написать using namespace std;
лично мне это неудобно, я предпочитаю указывать полное имя функции. Впрочем, подробнее можно почитать тут: http://www.cyberforum.ru/blogs/34326/blog275.html
В малых проектах не имеет большой роли, хоть и может иногда привести к конфликту имен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 17:44     Кто-нибудь может переделать задачу со структур на классы?
Еще ссылки по теме:

Ошибка в программе. Может кто-нибудь поможет исправить ее? C++
Посмотрите,может кто-нибудь сможет что-то сделать C++
Кто может переделать код? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Beatles
1 / 1 / 0
Регистрация: 18.04.2012
Сообщений: 36
28.06.2012, 17:44  [ТС]     Кто-нибудь может переделать задачу со структур на классы? #9
Ещё раз большое спасибо Вам!) Насчёт std обязательно прочту!

Добавлено через 4 минуты
MrGluck, не сочтите за наглость, просто завтра последний день сдать задачу... У вас есть какие-нибудь идеи, как эту задачу решить? Если нету времени или желания, я всё понимаю. Вы и так мне очень помогли!)
Проверить монотонность убывания ширины уровня дерева
Yandex
Объявления
28.06.2012, 17:44     Кто-нибудь может переделать задачу со структур на классы?
Ответ Создать тему
Опции темы

Текущее время: 17:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru