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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
danzer
Сообщений: n/a
#1

Структуры и использования сравнения strcmp - C++

07.09.2009, 19:51. Просмотров 1600. Ответов 6
Метки нет (Все метки)

Как правильно написать ?
дана часть кода:
Код C++

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
using namespace std 
 
main()
{stract znak{char fam
                char imy
                char znakz
                int d[3]}z1;
znak sp[8];
int x=0;
cout<<'введите данные';
for (int j=0, x<9, j++)
cin>>z1.fam>>z1.imy>>z1.znakz>>z1.d[3];
x=x+1;
end;
     return 0;
}
Задача:
1. Определить класс с именем ZNAK, содержащий следующие поля:
- фамилия, имя;
- знак Зодиака;
- день рождения (массив Р13 трех чисел).
2. Написать методы, выполняющие следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми объектов типа ZNAK; - вывод на экран информации о людях, родившихся под знаком, наименование которого введено с клавиатуры; если таких нет, выдать на дисплей соответствующее сообщение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2009, 19:51     Структуры и использования сравнения strcmp
Посмотрите здесь:
C++ Правильность использования strcmp
Написать функцию сравнения двух структур (шаблон структуры задается произвольно) C++
Написать функцию сравнения двух структур (шаблон структуры задается произвольно) C++
C++ Структуры. Вычислить лучшего нападающего футболиста посредством сравнения значений ratio
Стек без использования классов- только структуры C++
Strcmp C++
C++ strcmp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
07.09.2009, 20:03     Структуры и использования сравнения strcmp #2
Ваш код абсолютно не правильный! В задаче написано
Определить класс с именем ZNAK
У вас его нет. Есть только что-то отдаленно похожее на struct, которое написано как stract.
И функций членов тоже нет

Добавлено через 5 минут
Примерный класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class znak
{
private:
    char lastName; // фамилия
    char name;      // имя
    char znakz;     // знак зодиака
    int d[3];         // можно оставить массив целых
public:
    void setLastName();
    void setName();
    void setZnakZ();
    void setD();
};
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
07.09.2009, 21:43     Структуры и использования сравнения strcmp #3
В общем, основную идею RazorQ уже подсказал. пара замечаний:
1. Под имя, фамилию, знак зодиака надо выделить память (массив из char) - ведь не будут же эти члены содержать только по одному символу, не так ли?
2. Вместе с функциями setXXX() нужно добавить функции getXXX() - для симметрии )
3. Неплохо бы добавить friend istream& operator>>(istream& is, znak& z) и friend ostream& operator<<(ostream& os, const znak& z).
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
08.09.2009, 12:24     Структуры и использования сравнения strcmp #4
Считаю, что в некотором- только некотором- смысле автору повезло, нашёлся я, который только всё это дело изучает и поэтому мне интересно. Буду тык скыть благодарен всем за критику.

Защиты от дураков нет. Вводи латынью, по другому не тестировал
Количество людей можно менять в макросах.
В планах извратиться и написать заполнение объектов в конструкторе.

Автор, один вопрос: это что?
#include &quot;stdafx.h&quot;

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <windows.h>
 
 
#define max_razmer_stroki 81
#define kolichestvo_chelovek 5
using namespace std; 
 
//Это вот вспомогательная функция, чтобы русские буквы печатались
char* fRusYazik (const char* str){
 char* buffer = new char[strlen(str)];
 CharToOemA(str, buffer);
 return buffer;
}
 
 
int kolichestvo_chelovek_s_zadannim_znakom= 0;
 
//Это вот значит класс
class znak {
       char fam [max_razmer_stroki];//Массив под фамилию
       char ima [max_razmer_stroki]; //Массив под  имя
       char znakz [max_razmer_stroki]; //Массв под знак зодиака
       int P13[3];//Три числа, дата рождения
 
 public:
 
 //Прототипы функций ввода-вывода
 void vvod_fam ();       
 void vvod_ima ();       
 void vvod_znakz ();       
 void vvod_P13 ();       
 
 //Вывод, если есть человек с таким знаком зодиака
 void vivod_esli_est (char*); 
 };
 
 //Это определения функций-методов для ввода имени, фамилии и знака зодиака
 void znak::vvod_fam () {
  cin.getline(fam, max_razmer_stroki);
 } 
 void znak::vvod_ima () {
  cin.getline(ima, max_razmer_stroki);
 } 
 void znak::vvod_znakz () {
  cin.getline(znakz, max_razmer_stroki);
 } 
 void znak::vvod_P13 () {
  cout<< fRusYazik("вводи число\n");
  cin>> P13 [0];
  cout<< fRusYazik("вводи месяц\n");
  cin>> P13 [1];
  cout<< fRusYazik("вводи год\n");
  cin>> P13 [2];
 } 
 
//Это прототип для функции вывода человека с таким знаком зодиака
 void znak::vivod_esli_est (char* ukaz_na_znakz) {
  if (!strcmp(ukaz_na_znakz, znakz)) {
   cout<< fRusYazik("Держи человека\n");
   cout<<endl<< fam<< endl;                         
   cout<< ima<< endl;                         
   cout<< znakz<< endl;                         
   cout<< P13 [0]<< " "<< P13 [1]<<" "<< P13 [2]<< endl;                         
   kolichestvo_chelovek_s_zadannim_znakom++;
  }  
 }
 
 
int main() {
 
//Объявили массив chelovek из трёх объектов типа znak 
znak chelovek [kolichestvo_chelovek];
 
char suda__vvodim_znak [81];
 
cout<< fRusYazik("введите данные\n");
//Попробуем заполнить
int i;
for (i= 0; i< kolichestvo_chelovek; i++) {
 cout<< fRusYazik("человек номер ")<<i+ 1<<endl;
 getchar ();
 chelovek [i].vvod_fam (); 
 chelovek [i].vvod_ima (); 
 chelovek [i].vvod_znakz (); 
 chelovek [i].vvod_P13 (); 
}
 
cout<< fRusYazik("Заполнили, вводи знак\n");
 
//Вводим рзнак зодиака
 getchar ();
 cin.getline (suda__vvodim_znak, max_razmer_stroki);
 
 
//Вызываем функцию vivod Если понадобится, сколько-то там раз раз 
for (i= 0; i< kolichestvo_chelovek; i++) {
 chelovek [i].vivod_esli_est (suda__vvodim_znak); 
}
 
if (!kolichestvo_chelovek_s_zadannim_znakom) {
 cout<< fRusYazik("Нет таких людей\n");
}
 
 getchar ();
 return 0;
}
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
08.09.2009, 15:13     Структуры и использования сравнения strcmp #5
После долгих размышлений на лоне природы, я пришёл к выводу, что заполнение объектов, правильно будет осуществить именно с помощью конструктора.

Ибо имеем: объявляем, допустим, 9 объектов- 9 раз вызывается конструкторы по умолчанию.
А потом ещё каждый объект наполняем данными.

В общем, решил я совместить конструктор и заполнятель анкеты.
Автор, лови код!

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <windows.h>
 
 
#define max_razmer_stroki 81
#define kolichestvo_chelovek 5
using namespace std; 
 
//Это вот вспомогательная функция, чтобы русские буквы печатались
char* fRusYazik (const char* str){
 char* buffer = new char[strlen(str)];
 CharToOemA(str, buffer);
 return buffer;
}
 
 
int kolichestvo_chelovek_s_zadannim_znakom= 0;
 
//Это вот значит класс
class znak {
       static int nomercheloveka; 
       char fam [max_razmer_stroki];//Массив под фамилию
       char ima [max_razmer_stroki]; //Массив под  имя
       char znakz [max_razmer_stroki]; //Массв под знак зодиака
       int P13[3];//Три числа, дата рождения
 
 public:
 
 //Это прототип конструктора и одновременно заполнятеля анкеты!
 znak ();
 
 //Вывод, если есть человек с таким знаком зодиака
 void vivod_esli_est (char*); 
 };
 
 //Инициализируем эту штуку один раз, фактически это количество классов, которые будут заполнены.
 int znak::nomercheloveka= 1;
 
 //Вот определение конструктора-заполнятеля анкеты
 znak::znak () {
  cout<< fRusYazik("человек номер ")<<nomercheloveka++<<endl;
  cout<< fRusYazik("вводи фамилию\n");
 
  //Каюсь, не вникал подробно, зачем эта штука нужна. Но если её не будет, в буфере почему-то 10
  //и срабатывает функция  cin.getline(fam, max_razmer_stroki), считывая вместо
  //фамилии эту злополучную десятку!
  getchar ();
  cin.getline(fam, max_razmer_stroki);
  cout<< fRusYazik("вводи имя\n");
  cin.getline(ima, max_razmer_stroki);
  cout<< fRusYazik("вводи знак зодиака\n");
  cin.getline(znakz, max_razmer_stroki);
  cout<< fRusYazik("вводи число\n");
  cin>> P13 [0];
  cout<< fRusYazik("вводи месяц\n");
  cin>> P13 [1];
  cout<< fRusYazik("вводи год\n");
  cin>> P13 [2];
 };
 
 
 
//Это определение для функции вывода человека с таким знаком зодиака
 void znak::vivod_esli_est (char* ukaz_na_znakz) {
  if (!strcmp(ukaz_na_znakz, znakz)) {
   cout<< fRusYazik("Держи человека\n");
   cout<<endl<< fam<< endl;                         
   cout<< ima<< endl;                         
   cout<< znakz<< endl;                         
   cout<< P13 [0]<< " "<< P13 [1]<<" "<< P13 [2]<< endl;                         
   kolichestvo_chelovek_s_zadannim_znakom++;
  }  
 }
 
 
int main() {
 
cout<< fRusYazik("введите данные\n");
 
 
//Объявили массив chelovek из трёх объектов типа znak 
//И вот в процессе объявления идёт оодновременно и инициализация объектов конструктором.
znak chelovek [kolichestvo_chelovek];
 
 
char suda__vvodim_znak [81];
 
 
cout<< fRusYazik("Заполнили, вводи знак\n");
 
//Вводим рзнак зодиака
 getchar ();
 cin.getline (suda__vvodim_znak, max_razmer_stroki);
 
 
//Вызываем функцию vivod Если понадобится, 8 раз 
for (int i= 0; i< kolichestvo_chelovek; i++) {
 chelovek [i].vivod_esli_est (suda__vvodim_znak); 
}
 
if (!kolichestvo_chelovek_s_zadannim_znakom) {
 cout<< fRusYazik("Нет таких людей\n");
}
 
 getchar ();
 return 0;
}
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
08.09.2009, 15:28     Структуры и использования сравнения strcmp #6
Цитата Сообщение от kravam Посмотреть сообщение
После долгих размышлений на лоне природы, я пришёл к выводу, что заполнение объектов, правильно будет осуществить именно с помощью конструктора.

Ибо имеем: объявляем, допустим, 9 объектов- 9 раз вызывается конструкторы по умолчанию.
А потом ещё каждый объект наполняем данными.

В общем, решил я совместить конструктор и заполнятель анкеты.
Должен честно сказать, что идея совместить конструктор и заполнятель анкеты мне совершенно не нравится. Конструктор должен делать именно то, для чего он и предназначен - т.е. конструировать объект с заданными свойствами, и ничего больше. Это называется Single Responsibility Principle.
Кроме этого, почему ты уверен, что данные всегда-всегда будут вводиться пользователем с клавиатуры? Они могут быть жестко заданы в программе, могут прийти по сети, могут прийти от другого приложения..... вариантов - масса. И как тогда конструировать объекты?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2009, 16:01     Структуры и использования сравнения strcmp
Еще ссылки по теме:
strcmp C++
C++ strcmp()
C++ STRCMP
strcmp C++
C++ реализация strcmp

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
08.09.2009, 16:01     Структуры и использования сравнения strcmp #7
Просто у тредстартера сказано

"ввод с клавиатуры"

...Я понимаю, там много чего сказано. Но это утверждение ОПРЕДЕЛЁННО.

Насчёт всего остального- не знаю.
У разных авторов не нашёл каких-то ограничений по поводу использования конструкторов.
В, общем, не берусь спорить. Хотя мой конструктор именно коструирует объект. Именно с заданными свойствами.
Не знаю я, в общем.
Yandex
Объявления
08.09.2009, 16:01     Структуры и использования сравнения strcmp
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru