Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 1
Регистрация: 01.01.2017
Сообщений: 20
1

ООП С++: Построить класс для работы со строками ФИО

03.05.2018, 17:30. Показов 3618. Ответов 13

Author24 — интернет-сервис помощи студентам
Выполняю задание: Построить класс для работы со строками ФИО, включить функции для:
1) Ввода данных в строку;
2) Вывода данных;
3) Вывода данных - только инициалы;
4) Смена имени/фамилии.
Посмотрите пожалуйста на то что я накодил, не знаю правильно ли все сделал. Например, из уроков видел что в классе нужен конструктор, создал его, но не понимаю его необходимость здесь. С функциями вроде проблем не возникло? Прокомментируйте пожалуйста работу. Спасибо!

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
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <string>
 
using namespace std;
 
class Student
{
private:
    string surname;
    string name;
    string patronymic;
public:
    Student(string familiya,string imya,string otchestvo)
    {
        surname = familiya;
        name = imya;
        patronymic = otchestvo;     
    }
 
    void SetFIO() // функция для ввода данных в строку
    {
        cout << "Введите фамилию: " << endl;
        getline(cin, surname);
        cout << "Введите имя: " << endl;
        getline(cin, name);
        cout << "Введите отчество: " << endl;
        getline(cin, patronymic);
    }
 
    void PrintFull() // функция вывода данных
    {
        cout << endl << "Полные данные: " << surname << " " << name << " " << patronymic << endl;
    }
    void PrintFIO() // функция вывода только инифиалов
    {
        cout << endl << "ФИО: " << surname[0] << name[0] << patronymic[0] << endl;
    }
 
    void ChangeNameSurname() // функция смены фамилии, имени
    {
        cout << "Введите фамилию: " << endl;
        getline(cin, surname);
        cout << "Введите имя: " << endl;
        getline(cin, name);
    }
};
    
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251); // русский язык в консоли
 
    Student TheFirst("Фамилия", "Имя", "Отчество");
    
    TheFirst.SetFIO();
    TheFirst.PrintFull();
    TheFirst.PrintFIO();
 
    TheFirst.ChangeNameSurname();
    TheFirst.PrintFull();
    TheFirst.PrintFIO();
    
    system("Pause");
    return 0;
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2018, 17:30
Ответы с готовыми решениями:

Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и почтового ад
Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения...

Класс для работы сo строками
Помогите пжл разработать следующие элементы класса: Конструктор, позволяющий создать строку из n...

Класс для работы сo строками
Помогите пжл разработать следующие элементы класса: Конструктор, позволяющий создать строку из n...

Класс для работы со строками
Нужно написать класс работы со строками и один метод (сложение строк). Помогите пожалуйста сделать,...

13
0 / 0 / 1
Регистрация: 01.01.2017
Сообщений: 20
07.05.2018, 16:08  [ТС] 2
Вопрос актуален
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
07.05.2018, 16:38 3
Цитата Сообщение от kirillisreal Посмотреть сообщение
Построить класс для работы со строками ФИО, включить функции для:
1) Ввода данных в строку;
2) Вывода данных;
3) Вывода данных - только инициалы;
бред сумасшедшего...
Цитата Сообщение от kirillisreal Посмотреть сообщение
Student(string familiya,string imya,string otchestvo) { surname = familiya; name = imya; patronymic = otchestvo; } void SetFIO() // функция для ввода данных в строку { cout << "Введите фамилию: " << endl; getline(cin, surname); cout << "Введите имя: " << endl; getline(cin, name); cout << "Введите отчество: " << endl; getline(cin, patronymic); }
реализация бреда сумасшедшего...
вас хайпят, молодой человек, недалекие люди, возомнившие себя преподами. Ибо вот это вот - прямое нарушение принципов ООП. Это чистой воды процедурщина.
0
133 / 53 / 43
Регистрация: 09.05.2015
Сообщений: 565
07.05.2018, 16:50 4
В идеале функции члены надо определять в другом файле. А определение класса в заголовочный. Ну и сам мейн в третий файл.

Добавлено через 2 минуты
Цитата Сообщение от vlisp Посмотреть сообщение
бред сумасшедшего...
Интересно почему?) Я вот Пратта читаю, тут есть такие задания. Он сумасшедший получается?))) Реализация кода в книге конечно не такая тарабарщина в один файл.
1
0 / 0 / 1
Регистрация: 01.01.2017
Сообщений: 20
07.05.2018, 19:51  [ТС] 5
Я текст задания скопировал дословно, а код плод чисто моего больного воображения) подскажите в чем ошибка? И что нужно сделать? (Учусь на дистанционном, теорию беру из онлайн курсов/интернета)

Добавлено через 19 минут
Если я сдам этот код приправленный теорией, можно считать что я задание выполнил или как?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
07.05.2018, 21:00 6
Цитата Сообщение от Bring Посмотреть сообщение
Я вот Пратта читаю, тут есть такие задания.
Насколько я помню у него нету книжек по ООП..

Не по теме:

И незнаю почему так все читают его, как по мне он сам не далек от студента, ИМХО личное мое мнение


Цитата Сообщение от Bring Посмотреть сообщение
Реализация кода в книге конечно не такая тарабарщина в один файл.
Это вообще не в тему
Цитата Сообщение от Bring Посмотреть сообщение
Интересно почему?)
Это скорее не просто ООП, а уже задаток к ООД и имелось ввиду что за вывод должна отвечать другая сущность
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
07.05.2018, 21:10 7
Цитата Сообщение от Bring Посмотреть сообщение
Интересно почему?)
Объекты инициализируются конструктором и существуют автономно друг от друга. Тогда зачем создавать студента с ФИО "Фамилия Имя Отчество"? Тебе не было бы обидно, если б препод тебе сказал: эй ты, имярек, объясни мне теорему Бернулли!"?

Ситуация, когда объект инициализируется не полностью, ведет обычно к ошибкам и проблемам, типа, "у меня не работает". Так работает например устаревшая технология COM. И работает она через пень-колоду!

Дальше больше. И так мы знаем, что объект рождается конструктором и существует сам по себе. Но тогда зачем эта дурацкая функция setFIO? Она что делает? типа устанавливает имяреку ФИО? ОК, зачем нам конструктор?! А как она Это делает? и что она вообще делает? Как это узнать? Курить маны часами? а что будет если понадобится перейти с консольного интерфейса, на оконный? А не проще ли не выпендриваться и объявить поля публичными, и просто заполнить поля, олдфаги будут рады такому повороту?

И вообще, кто дал право имяреку себя создавать? Его дело малое: носить гордо имя и сдавать сессию. а может он еще и под юбку системе залез? нет! так не пойдет. так можно только преподу сдать сессию на трешку.

Посмотри фильм терминатор 4, там скайнет создал целую фабрику студентов, полностью исключая малейшую вероятность сбоя.

Логика должна быть простой: если получили данные, то создаем объект, пользуем и убиваем. А не как у тебя - создали франкенштейна, а он такой: "а как меня зовут?" и т.д. по цепочке, в итоге подгорит у самого крайнего и никто не поймет почему.

Что если надо изменить имя и отчество? или просто имя? или любую комбинацию полей... Для каждой создавать отдельную функцию? или все таки поля публичными или для каждого поля создать set-функцию. Правила ООП предписывают объекту получать данные, только через аргументы функций и нигде не гадить своими данными

пс если код собирается и даже правильно работает, не факт, что он написан правильно. Чтоб понять на сколько правильный код может быть нелеп, сравни код на турбо бейсик и код на VB.NET.

ппс. твое задание дурацкое, и потому твой код выглядит по-дурацки, не запускал, возможно он даже правильно работает.
Итак, две основные ошибки:
- дезориентация объектной модели (фактически это автоматическая дисквалификация сферического коня в вакууме)
- игнорирование принципов ООП (с отягчающими обстоятельствами)
0
369 / 310 / 65
Регистрация: 14.10.2014
Сообщений: 1,318
07.05.2018, 22:44 8
Лучший ответ Сообщение было отмечено kirillisreal как решение

Решение

kirillisreal, Добавлю от себя (если не против ) - конструктор по умолчанию оставить (это тот, который без параметров) так, на всякий случай. Сделал конструктор - сделай и деструктор - тоже без параметров. Тоже думаю, что лишним не будет. Конструктор, который ты используешь в этом коде - это правильный подход с точки зрения программирования, но полный бред с точки зрения логики и здравого смысла. Причина - создавая объект, ты уже должен знать, чем инициализировать закрытые поля этого объекта. Тогда на кой... ему (объекту) нужны функции ввода данных ?
У тебя в коде есть функция
Цитата Сообщение от kirillisreal Посмотреть сообщение
SetFIO()
её вполне достаточно для инициализации данных.

Добавлено через 5 минут
Но лучше всего сделать так:

Кликните здесь для просмотра всего текста

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
void setName() 
    {
        cout << "Введите фамилию: " << endl;
        getline(cin, surname);        
    }
    
    void setPatronymic() 
    {
        cout << "Введите имя: " << endl;
        getline(cin, surname);        
    }
    
    void setSurname() 
    {
        cout << "Введите отчество: " << endl;
        getline(cin, surname);        
    }
    
    string getName()
    {
        return name;
    }
    
    string getPatronymic()
    {
        return patronymic;
    }
    
    string getSurname()
    {
        return surname;
    }


Добавлено через 7 минут
Всё, что я написал - основано на моём (крайне малом и скудном) опыте программирования. Готов выслушать любую критику в свой адрес. И Последнее - в классах, доступ к данным только через гетеры - сетеры и никак иначе. Функции смены имени и вывода данных я бы оставил такими, как у тебя. Ну в общем как-то так ...

Добавлено через 3 минуты
kirillisreal, Коллега vlisp, кстати написал тоже, что и я только более красочно
1
133 / 53 / 43
Регистрация: 09.05.2015
Сообщений: 565
08.05.2018, 00:29 9
Цитата Сообщение от Azazel-San Посмотреть сообщение
И незнаю почему так все читают его, как по мне он сам не далек от студента, ИМХО личное мое мнение
А что читает о-мудрейший?
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
08.05.2018, 01:38 10
Цитата Сообщение от Recrut_rf Посмотреть сообщение
void setName()
* * {
* * * * cout << "Введите фамилию: " << endl;
* * * * getline(cin, surname); * * * *
* * }
вообще-то я говорил о том, чтоб передавать данные через параметры

C++
1
2
3
4
void setName(string _name) { 
    //// тут какой-то вирусный код
    name = _name;
}
таким образом класс не привязан к консоли, а создание нескольких объектов в цикле стоит совсем чуть больше, чем если описать то же самое в классе
1
369 / 310 / 65
Регистрация: 14.10.2014
Сообщений: 1,318
08.05.2018, 09:19 11
vlisp, Я просто подумал, что если передавать данные через параметры, то тогда где то ещё в коде нужно будет инициализировать эти параметры (просить пользователя ввести имя например) и только потом передавать эти данные в сетер. Получается код больше и возможно (я в этом деле не специалист) более медленный, потому как вместо одного вызова функции имеем как минимум два вызова функции.

Но сейчас я понимаю, что скорее всего был не прав.

Цитата Сообщение от vlisp Посмотреть сообщение
таким образом класс не привязан к консоли, а создание нескольких объектов в цикле стоит совсем чуть больше, чем если описать то же самое в классе
спасибо за объяснение
1
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
08.05.2018, 10:45 12
Цитата Сообщение от Recrut_rf Посмотреть сообщение
где то ещё в коде нужно будет инициализировать эти параметры
на уровне сдал и забыл, нет ничего криминального в использовании методов класса для диалога с пользователем через консоль. Но гораздо лучше выглядит, если перенести такой код в main. Она может исполнять роль фабричного метода, делая код более читаемым. В реальных же приложениях все намного сложнее. Проблемы начинаются, когда начинается разделение кода. Такой класс, скомпилированный в библиотеке, может запросто оказаться бесполезным.
0
0 / 0 / 1
Регистрация: 01.01.2017
Сообщений: 20
12.05.2018, 12:29  [ТС] 13
Так стало лучше?)
Миниатюры
ООП С++: Построить класс для работы со строками ФИО   ООП С++: Построить класс для работы со строками ФИО   ООП С++: Построить класс для работы со строками ФИО  

0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
12.05.2018, 16:21 14
Цитата Сообщение от kirillisreal Посмотреть сообщение
Так стало лучше?)
нет, нужно еще курс вазелина...
читай внимательно, что выше написали тебе я и Recrut_rf
0
12.05.2018, 16:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2018, 16:21
Помогаю со студенческими работами здесь

Класс для работы со строками
Вот мой класс: public class stroka { string Line; int n; public...

Создать класс для работы сo строками
Создать класс для работы сo строками. Разработать элементы класса: a. Поля: * указатель на char...

Создать класс для работы с строками
Всем привет, начал изучать яву и у меня возникли трудности вот с этим заданием Создать класс для...

Написать класс для работы со строками
помогите пожалуйста написать класс для работы со строками.


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru