Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Sabi_na
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 20
#1

Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия" - C++

11.12.2013, 17:05. Просмотров 1007. Ответов 25
Метки нет (Все метки)

Всем привет.
Помогите пожалуйста, написать код, так как сама не разбираюсь, а нужно сделать эту задачу)
Всем буду очень благодарна за помощь.

Условие задачи:
Введите с клавиатуры терминала массив строк. Каждая строка имеет вид:" Фамилия Имя" (разделяются одним пробелом). Признак окончания ввода массива - строка, содержащая слово "exit". Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия".

Вот для примера используйте пожалуйста эти имена и фамилии:

Rudenok Sabina
Polishchuk Tanya
Kharchenko Julia
Tymoshenko Dasha

а выводить должно:
S. Rudenok
T. Polishchuk
J. Kharchenko
D. Tymoshenko

Добавлено через 5 часов 18 минут


Добавлено через 18 часов 20 минут
может кто-то делал похожий пример ? помогите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2013, 17:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия" (C++):

Функция должна возвращать новый массив, состоящий из отрицательных элементов исходного массива - C++
У меня есть задание: написать функцию (процедуру) с параметрами для обработки одномерного массива целочисленных данных (количество...

При сокращении "Фамилия Имя Отчество" к "Фамилия И.О." пропадают "И.О." - C++
Подскажите, в чём может быть ошибка? Процедура сама по себе работает правильно, а в таком виде нет. ...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес" - C++
Здравствуйте. Проходим тему Структуры, не могу понять, как определить количество, само задание: #include <iostream> #include...

Написать функцию поиска человека по полю "фамилия" в массиве структур "Note" ("Персональная информация") - C++
Вывести из структуры информацию о человеке, чья фамилия введена с клавиатуры #include <iostream> #include <locale> #include...

Запросить у пользователя имя, фамилию, а затем вывести строку вида "фамилия, имя" - C++
С. Прата, "Язык программирования С++", 4 глава, задача 3. Напишите программу, которая запрашивает у пользователя имя, фамилию, а затем...

25
Sabi_na
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 20
12.12.2013, 17:28  [ТС] #16
Цитата Сообщение от StackOverflow Посмотреть сообщение
Sabi_na, всё работает прекрасно. А тестовую информацию вы уже сами вводите. Если не работает, то пишите сюда сообщения компилятора, на какие ошибки он ссылается. Повторюсь, перепроверил, всё работает как часы.
1> Создание каталога "c:\users\sabina\documents\visual studio 2010\Projects\oq\Debug\".
1>InitializeBuildStatus:
1> Создание "Debug\oq.unsuccessfulbuild", так как было задано "AlwaysCreate".
1>ClCompile:
1> oq.cpp
1>c:\users\sabina\documents\visual studio 2010\projects\oq\oq\oq.cpp(21): error C3861: getline: идентификатор не найден
1>c:\users\sabina\documents\visual studio 2010\projects\oq\oq\oq.cpp(61): error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "std::basic_string<_Elem,_Traits,_Ax>" (или приемлемое преобразование отсутствует)
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(679): может быть "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(726): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(764): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(811): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(937): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(944): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(951): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(958): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(968): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,std::basic_string<_Elem,_Traits,_Ax>>(std::basic_ostream<_Elem,_Traits> &&,_Ty)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>,
1> _Ty=std::basic_string<char,std::char_traits<char>,std::allocator<char>>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(1085): или "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(186): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(192): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(199): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(206): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(226): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(260): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(280): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(305): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(325): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(345): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(366): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(386): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(407): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(427): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(447): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(467): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(487): или "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> при попытке сопоставить список аргументов "(std::basic_ostream<_Elem,_Traits>, std::basic_string<_Elem,_Traits,_Ax>)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:02.62
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========



вот смотри что пишет (
0
StackOverflow
All rights reserved.
92 / 82 / 5
Регистрация: 03.08.2013
Сообщений: 258
12.12.2013, 17:45 #17
Sabi_na, он ругается на 24 и 64 строчки моего кода, но они совершенно тривиальны. Даже не знаю, в чём дело у этого продукта от майкрософт. Попробуйте добавить директиву #include <string> в самом начале.
0
Sabi_na
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 20
12.12.2013, 17:51  [ТС] #18
Цитата Сообщение от StackOverflow Посмотреть сообщение
Sabi_na, он ругается на 24 и 64 строчки моего кода, но они совершенно тривиальны. Даже не знаю, в чём дело у этого продукта от майкрософт. Попробуйте добавить директиву #include <string> в самом начале.
добавила, теперь ошибки нет, запустила в окне ничего не выводит, можешь мне для примера в этот код вставить одну Фамилию и Имя, остальные уже по примеру сама буду как-то вставлять)
0
StackOverflow
All rights reserved.
92 / 82 / 5
Регистрация: 03.08.2013
Сообщений: 258
12.12.2013, 17:56 #19
Sabi_na, так вы начинайте данные вводить. Он и не будет вам ничего выводить, пока вы сами, ручками, не пропишите Фамилию Имя и не нажмёте Enter. Потом введите exit, нажмите Enter и вуаля!
И, да, условие в 49 строчке исправьте на:
C++
1
fullName.compare( "exit" ) != 0 && index < capacity
Так надёжнее и правильнее. Потом уже собирайте.
0
Sabi_na
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 20
12.12.2013, 18:05  [ТС] #20
Цитата Сообщение от StackOverflow Посмотреть сообщение
Sabi_na, так вы начинайте данные вводить. Он и не будет вам ничего выводить, пока вы сами, ручками, не пропишите Фамилию Имя и не нажмёте Enter. Потом введите exit, нажмите Enter и вуаля!
И, да, условие в 49 строчке исправьте на:
C++
1
fullName.compare( "exit" ) != 0 && index < capacity
Так надёжнее и правильнее. Потом уже собирайте.

#include <string>
#include <iostream>
#include <vector>
#include <cctype>
using namespace std;

int main()
{
const int capacity = 50;
vector<string> * catalog[ capacity ];

for ( int i = 0; i < capacity; i++ )
{
catalog[ i ] = new vector<string>;
catalog[ i ]->reserve( 2 );
}

int index = 0;
string fullName;

do {
getline( cin, fullName );

string name;
string surname;
size_t position = fullName.find( ' ', 0 );

while ( position != std::string::npos )
{
if ( position == 0 )
{
fullName.erase( fullName.begin() );
position = fullName.find( ' ', 0 );
}
else
{
surname.assign( fullName, 0, position );
name.assign( fullName, position + 1, fullName.length() - ( position + 1 ) );
catalog[ index ]->push_back( name );
catalog[ index ]->push_back( surname );
position = std::string::npos;
}
}

++index;

} while ( fullName.compare( "exit" ) != 0 && index < capacity );


for ( int i = 0; catalog[ i ]->empty() != true; i++ )
{
if ( islower( ( catalog[ i ]->at( 0 ) ).at( 0 ) ) )
{
toupper( ( catalog[ i ]->at( 0 ) ).at( 0 ) );
}

if ( islower( ( catalog[ i ]->at( 1 ) ).at( 0 ) ) )
{
toupper( ( catalog[ i ]->at( 1 ) ).at( 0 ) );
}

cout << ( catalog[ i ]->at( 0 ) ).at( 0 ) << ". " << catalog[ i ]->at( 1 ) << endl;
}


for ( int i = 0; i < capacity; i++ )
{
delete catalog[ i ];
}


return 0;
}


ты наверно с меня гонишь там)))
ладно вообщем исправила я вот так как ты и говорил.
потом запускаю программу, пишу в этом окне Rudenok Sabina, нажимаю enter и просто переводит на нижнюю строку, ничего оно мне не выводит(
0
StackOverflow
All rights reserved.
92 / 82 / 5
Регистрация: 03.08.2013
Сообщений: 258
12.12.2013, 18:08 #21
Sabi_na, вы читали своё собственное задание? Так вот, там сказано:
-ввести в терминале фамилию и имя, разделённые одним пробелом.
-продолжать до тех пор, пока не встретится строка exit.

Так вот, вы этот самый exit введите, пожалуйста, если хотите, чтобы результат появился.
1
Sabi_na
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 20
12.12.2013, 18:16  [ТС] #22
Цитата Сообщение от StackOverflow Посмотреть сообщение
Sabi_na, вы читали своё собственное задание? Так вот, там сказано:
-ввести в терминале фамилию и имя, разделённые одним пробелом.
-продолжать до тех пор, пока не встретится строка exit.

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

1. Организован циклический ввод данных для обработки, т.е. программа должна работать (запрашивать данные, считать и выводить результат ) до тех пор, пока пользователь не введет признак окончания работы (либо встретится конец файла)
2. Признаком окончания работы программы может быть : слово «done»


помоги это доделать и напиши мне плиз свой номер моб, или карточки я тебя отблагодарю, ты реально очень мне помог)
0
StackOverflow
All rights reserved.
92 / 82 / 5
Регистрация: 03.08.2013
Сообщений: 258
12.12.2013, 18:22 #23
Sabi_na, для благодарности есть "спасибо" или "отзыв". Никаких материальных вознаграждений я не принимаю.
А то, что вам прислал преподаватель, уже реализовано в вашей программе, когда вы вводите имена и признак конца ввода "exit". Если вам необходимо что-то подсчитать таким образом, то напишите здесь, что должно выполняться: какие данные нужно вводить, как их обрабатывать и т.д. А я потом посмотрю. А сейчас, извините, но мне нужно бежать.
1
gray_fox
13.12.2013, 14:34
  #24

Не по теме:

Цитата Сообщение от StackOverflow Посмотреть сообщение
P.S. Кстати, а как сделать, чтобы сообщение 'Не по теме' автоматически делалось, вот как у тебя. А то мне приходится вручную текст красить
код off; в редакторе сообщений есть кнопка OFF.

0
StackOverflow
All rights reserved.
92 / 82 / 5
Регистрация: 03.08.2013
Сообщений: 258
14.12.2013, 00:10 #25
Sabi_na, выкладываю ответ на вашу просьбу здесь, чтобы и другие смогли прочесть и покритиковать.
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*Здесь мы подключаем все необходимые библиотеки для того, чтобы наш код смог скомпилироваться.
В этих библиотеках содержатся определения многочисленных функций для ввода/вывода и обработки строк и многое другое.
Без этих определений компилятор, к примеру, не поймёт, что значит выражение vector<string>*/
 
#include <string>
#include <iostream>
#include <vector>
#include <cctype>
using namespace std;
 
//Я полагаю, вы в курсе, что каждая программа, написанная на языке С++, начинается с функции main().
 
int main()
{
 
/*Основная идея моей реализации этого задания заключается в том, что для хранения имен используется
класс-контейнер vector. Почему я выбрал его? Потому что мне просто захотелось его сипользовать. Можно
было запросто обойтись использованием только одного класса string. Но реализация - дело вкуса.
Чтобы вы могли понять, как это все представлено на концептуальном уровне, я приведу вам простой пример.
Представьте себе обычную таблицу со строками и столбцами. Здесь const int capacity = 50 означает, что
максимальное число строк в нашей таблицы не привысит 50. Вы можете запросто изменить это значение,
указав вместо 50, к примеру, 100, или даже 1000 и больше.*/
 
    const int capacity = 50;
 
/*Итак, у нас есть 50 строк. Но строки ли это на самом деле? Очевидно, нет. Это только указатели на различные
области в памяти, куда будут помещаться наши строки, а catalog - это главный указатель на область памяти, где
хранятся указатели на области, где будут хранится строки. Понимаю, слегка запутанно, но на самом деле всё
просто. Указатель хранит адрес памяти, по которму можно отыскать данные (строку, число, отдельный символ 
и т.д.). У нас таких указателей 50, для 50 будущих строк. Все они расположено ПОСЛЕДОВАТЕЛЬНО, друг за
другом. А наш главный указатель catalog хранит адрес, по которому расположен первый указатель на будущую
строку. Таким образом мы в будущем сможем перемещаться по этой последовательности из указателей, используя имя главного указателя и смещение.*/
 
    vector<string> * catalog[ capacity ];
    
/*Начнём формировать нашу будущую "таблицу". Сформируем 50 строк в нашей таблице и
зарезервируем место для двух полей в каждой строке. На самом деле мы создаём 50 "двухместных" объектов
класса-контейнера vector и привязываем их к указателям. Таким образом мы построим "скелет" 
нашей будушей таблицы. Каждый объект vector'а будет хранить два объекта класса string. Первый объект
класса string будет хранить имя, а второй - фамилию.*/
 
    for ( int i = 0; i < capacity; i++ )
    {
        catalog[ i ] = new vector<string>;
        catalog[ i ]->reserve( 2 );
    }
 
    int index = 0;
    string fullName; //объект fullName типа string нужен для того, чтобы принимать входную строку (данные,
                           //которые вы будете печатать в терминале).
 
/*Теперь, когда "таблица" готова, можем приступать к её заполнению*/
 
    do {
        getline( cin, fullName ); //сохраняем входной поток символов при помощи функции getline, которая
                                         // принимает в качестве параметров два аргумента: объект класса istream - cin,
                                         // и объект класса string - fullName, где будет сохранён входной поток.
 
/*Итак, входной поток сохранён. Теперь нам нужно извлечь из него имя и фамилию, и убрать  всё ненужное
(к примеру, пробелы). Когда мы их извлекём, их нужно будет где-то сохранить, логично? Что для этого сделать?
Ответ прост - создать два объекта класса string, один для имени, а другой для фамилии. Сделаем это:*/
 
        string name; 
        string surname;
 
/*Объекты сохданы. Можно начинать извлекать из нашей строки fullName имя и фамилию. А как их различить?
Я полагаюсь на то, что при вводе пользователь разделит имя от фамилии пробелом/-ами. Этим я и воспользовался. В классе string есть замечательная функция find, которая в качестве параметров принимает
символ, которы необходимо найти (на самом деле эта функция перегружена по параметрам, поэтому она 
может принимать различные комбинации аргументов, за подробностями сюда [URL="http://www.cplusplus.com/reference/string/string/find/"]string::find[/URL] ), и индекс, с которого необходимо начать поиск в строке.*/
 
        size_t position = fullName.find( ' ', 0 ); //возвращает эта функция индекс позиции, в которой найден пробел.
                                                              //а если искомый символ не найден, то функция возвратит -1.
 
/*Далее, когда мы нашли позицию, по которой рапологается пробел, можно начать отделение имени от фамилии.
Но что, если вы случайно нажали пробел до ввода имени? Тогда наша программа будет работать некорректно.
Она ничего не запишет в первый столбик, где хранятся наши имена, и запишет целую строку в столбик, где
хранятся наши фамилии. Такое поведение нам не нужно, поэтому нужно предусмотреть такое развитие событий
и подстраховаться дополнительным условием, а именно:*/ 
        while ( position != std::string::npos ) //npos - это элемент данных класса string, который хранит значение -1.
        {                                                  //Мы его используем, чтобы проверить, найдены ли пробелы.
           
            if ( position == 0 ) //Если пробел найден в самой первой позиции
            {
                fullName.erase( fullName.begin() ); //удаляем из строки fullName первую позицию.
                position = fullName.find( ' ', 0 ); //Начинаем поиск пробела с самого начала.
            }
            else
            {
                surname.assign( fullName, 0, position ); //иначе, копируем в строку surname символы из строки
                                                                        // fullName, начиная с нулевого и заканчивая последним
                                                                        // символом до позиции, где был найден пробел.
 
                name.assign( fullName, position + 1, fullName.length() - ( position + 1 ) ); //проделываем ту же операцию
 
// для строки name, копируя оставшиеся символы, начиная с позиции, следующей за позицией, где был найден
// пробел, и до самого конца. 
                                                                                                                       
                catalog[ index ]->push_back( name ); //помещаем объект name на первую позицию в контейнере
                catalog[ index ]->push_back( surname ); //а объект surname - на вторую. Получились как бы два
                                                                         // поля в одной строке таблицы.
                position = std::string::npos; //прекращаем дальнейший поиск и операции копирования. Хотя, если
                                                        //пользователь вводил ещё пробелы во входной строке, то все они оста-
                                                        //нутся в строке, хранящей фамилию. При желании, можно провести
                                                        //более комплексный анализ входных данных и убрать/изменить лишнее.
            }
        }
        
        ++index;
 
    } while ( fullName.compare( "exit" ) != 0 && index < capacity ); //Ввод, редактирование, копирование и 
 
//размещение строк в контейнере будет происходить до тех пор, пока пользователь не введёт и слово "exit" и
// пока в нашей "таблице" есть ещё незаполненные "строки" (есть место, куда можно записать имя и фамилию).
// Если хотя бы одно из этих условий нарушено, цикл немедленно прекратится.
 
/*Далее идёт довольно простая проверка того, как написаны имя и фамилия (со строчной, или с прописной
буквы, и если со строчной, то необходимо первый строчный символ в строке превратить в прописной.
Для этого есть множество функции в библиотеке cctype, которую мы подключили в самом начале.*/
    
    for ( int i = 0; catalog[ i ]->empty() != true; i++ ) //пока обе строки не проверены
    {
        if ( islower( ( catalog[ i ]->at( 0 ) ).at( 0 ) ) ) //если первый символ в строке Имя - строчный
        {
            toupper( ( catalog[ i ]->at( 0 ) ).at( 0 ) ); //заменяем его на прописной.
        }
 
        if ( islower( ( catalog[ i ]->at( 1 ) ).at( 0 ) ) ) // то же самое проделываем и для фамилии.
        {
            toupper( ( catalog[ i ]->at( 1 ) ).at( 0 ) );
        }
 
        cout << ( catalog[ i ]->at( 0 ) ).at( 0 ) << ". " << catalog[ i ]->at( 1 ) << endl; //выводим на экран наши имен
 
// и фамилии в виде _первый_символ_в_имени_._фамилия_
 
    }
 
 
    for ( int i = 0; i < capacity; i++ ) //освобождаем память перед выходом из программы.
    {
        delete catalog[ i ];
    }
 
 
    return 0;
}
Получилось не совсем кратко, но я думаю, от таких коментариев пользы будет больше.
1
Sabi_na
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 20
14.12.2013, 00:14  [ТС] #26
Цитата Сообщение от StackOverflow Посмотреть сообщение
Sabi_na, выкладываю ответ на вашу просьбу здесь, чтобы и другие смогли прочесть и покритиковать.
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*Здесь мы подключаем все необходимые библиотеки для того, чтобы наш код смог скомпилироваться.
В этих библиотеках содержатся определения многочисленных функций для ввода/вывода и обработки строк и многое другое.
Без этих определений компилятор, к примеру, не поймёт, что значит выражение vector<string>*/
 
#include <string>
#include <iostream>
#include <vector>
#include <cctype>
using namespace std;
 
//Я полагаю, вы в курсе, что каждая программа, написанная на языке С++, начинается с функции main().
 
int main()
{
 
/*Основная идея моей реализации этого задания заключается в том, что для хранения имен используется
класс-контейнер vector. Почему я выбрал его? Потому что мне просто захотелось его сипользовать. Можно
было запросто обойтись использованием только одного класса string. Но реализация - дело вкуса.
Чтобы вы могли понять, как это все представлено на концептуальном уровне, я приведу вам простой пример.
Представьте себе обычную таблицу со строками и столбцами. Здесь const int capacity = 50 означает, что
максимальное число строк в нашей таблицы не привысит 50. Вы можете запросто изменить это значение,
указав вместо 50, к примеру, 100, или даже 1000 и больше.*/
 
    const int capacity = 50;
 
/*Итак, у нас есть 50 строк. Но строки ли это на самом деле? Очевидно, нет. Это только указатели на различные
области в памяти, куда будут помещаться наши строки, а catalog - это главный указатель на область памяти, где
хранятся указатели на области, где будут хранится строки. Понимаю, слегка запутанно, но на самом деле всё
просто. Указатель хранит адрес памяти, по которму можно отыскать данные (строку, число, отдельный символ 
и т.д.). У нас таких указателей 50, для 50 будущих строк. Все они расположено ПОСЛЕДОВАТЕЛЬНО, друг за
другом. А наш главный указатель catalog хранит адрес, по которому расположен первый указатель на будущую
строку. Таким образом мы в будущем сможем перемещаться по этой последовательности из указателей, используя имя главного указателя и смещение.*/
 
    vector<string> * catalog[ capacity ];
    
/*Начнём формировать нашу будущую "таблицу". Сформируем 50 строк в нашей таблице и
зарезервируем место для двух полей в каждой строке. На самом деле мы создаём 50 "двухместных" объектов
класса-контейнера vector и привязываем их к указателям. Таким образом мы построим "скелет" 
нашей будушей таблицы. Каждый объект vector'а будет хранить два объекта класса string. Первый объект
класса string будет хранить имя, а второй - фамилию.*/
 
    for ( int i = 0; i < capacity; i++ )
    {
        catalog[ i ] = new vector<string>;
        catalog[ i ]->reserve( 2 );
    }
 
    int index = 0;
    string fullName; //объект fullName типа string нужен для того, чтобы принимать входную строку (данные,
                           //которые вы будете печатать в терминале).
 
/*Теперь, когда "таблица" готова, можем приступать к её заполнению*/
 
    do {
        getline( cin, fullName ); //сохраняем входной поток символов при помощи функции getline, которая
                                         // принимает в качестве параметров два аргумента: объект класса istream - cin,
                                         // и объект класса string - fullName, где будет сохранён входной поток.
 
/*Итак, входной поток сохранён. Теперь нам нужно извлечь из него имя и фамилию, и убрать  всё ненужное
(к примеру, пробелы). Когда мы их извлекём, их нужно будет где-то сохранить, логично? Что для этого сделать?
Ответ прост - создать два объекта класса string, один для имени, а другой для фамилии. Сделаем это:*/
 
        string name; 
        string surname;
 
/*Объекты сохданы. Можно начинать извлекать из нашей строки fullName имя и фамилию. А как их различить?
Я полагаюсь на то, что при вводе пользователь разделит имя от фамилии пробелом/-ами. Этим я и воспользовался. В классе string есть замечательная функция find, которая в качестве параметров принимает
символ, которы необходимо найти (на самом деле эта функция перегружена по параметрам, поэтому она 
может принимать различные комбинации аргументов, за подробностями сюда [URL="http://www.cplusplus.com/reference/string/string/find/"]string::find[/URL] ), и индекс, с которого необходимо начать поиск в строке.*/
 
        size_t position = fullName.find( ' ', 0 ); //возвращает эта функция индекс позиции, в которой найден пробел.
                                                              //а если искомый символ не найден, то функция возвратит -1.
 
/*Далее, когда мы нашли позицию, по которой рапологается пробел, можно начать отделение имени от фамилии.
Но что, если вы случайно нажали пробел до ввода имени? Тогда наша программа будет работать некорректно.
Она ничего не запишет в первый столбик, где хранятся наши имена, и запишет целую строку в столбик, где
хранятся наши фамилии. Такое поведение нам не нужно, поэтому нужно предусмотреть такое развитие событий
и подстраховаться дополнительным условием, а именно:*/ 
        while ( position != std::string::npos ) //npos - это элемент данных класса string, который хранит значение -1.
        {                                                  //Мы его используем, чтобы проверить, найдены ли пробелы.
           
            if ( position == 0 ) //Если пробел найден в самой первой позиции
            {
                fullName.erase( fullName.begin() ); //удаляем из строки fullName первую позицию.
                position = fullName.find( ' ', 0 ); //Начинаем поиск пробела с самого начала.
            }
            else
            {
                surname.assign( fullName, 0, position ); //иначе, копируем в строку surname символы из строки
                                                                        // fullName, начиная с нулевого и заканчивая последним
                                                                        // символом до позиции, где был найден пробел.
 
                name.assign( fullName, position + 1, fullName.length() - ( position + 1 ) ); //проделываем ту же операцию
 
// для строки name, копируя оставшиеся символы, начиная с позиции, следующей за позицией, где был найден
// пробел, и до самого конца. 
                                                                                                                       
                catalog[ index ]->push_back( name ); //помещаем объект name на первую позицию в контейнере
                catalog[ index ]->push_back( surname ); //а объект surname - на вторую. Получились как бы два
                                                                         // поля в одной строке таблицы.
                position = std::string::npos; //прекращаем дальнейший поиск и операции копирования. Хотя, если
                                                        //пользователь вводил ещё пробелы во входной строке, то все они оста-
                                                        //нутся в строке, хранящей фамилию. При желании, можно провести
                                                        //более комплексный анализ входных данных и убрать/изменить лишнее.
            }
        }
        
        ++index;
 
    } while ( fullName.compare( "exit" ) != 0 && index < capacity ); //Ввод, редактирование, копирование и 
 
//размещение строк в контейнере будет происходить до тех пор, пока пользователь не введёт и слово "exit" и
// пока в нашей "таблице" есть ещё незаполненные "строки" (есть место, куда можно записать имя и фамилию).
// Если хотя бы одно из этих условий нарушено, цикл немедленно прекратится.
 
/*Далее идёт довольно простая проверка того, как написаны имя и фамилия (со строчной, или с прописной
буквы, и если со строчной, то необходимо первый строчный символ в строке превратить в прописной.
Для этого есть множество функции в библиотеке cctype, которую мы подключили в самом начале.*/
    
    for ( int i = 0; catalog[ i ]->empty() != true; i++ ) //пока обе строки не проверены
    {
        if ( islower( ( catalog[ i ]->at( 0 ) ).at( 0 ) ) ) //если первый символ в строке Имя - строчный
        {
            toupper( ( catalog[ i ]->at( 0 ) ).at( 0 ) ); //заменяем его на прописной.
        }
 
        if ( islower( ( catalog[ i ]->at( 1 ) ).at( 0 ) ) ) // то же самое проделываем и для фамилии.
        {
            toupper( ( catalog[ i ]->at( 1 ) ).at( 0 ) );
        }
 
        cout << ( catalog[ i ]->at( 0 ) ).at( 0 ) << ". " << catalog[ i ]->at( 1 ) << endl; //выводим на экран наши имен
 
// и фамилии в виде _первый_символ_в_имени_._фамилия_
 
    }
 
 
    for ( int i = 0; i < capacity; i++ ) //освобождаем память перед выходом из программы.
    {
        delete catalog[ i ];
    }
 
 
    return 0;
}
Получилось не совсем кратко, но я думаю, от таких коментариев пользы будет больше.

спасибо, все понятно)
0
14.12.2013, 00:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 00:14
Привет! Вот еще темы с ответами:

Программа должна удалять из строки все символы, что стоят на чётных местах после буквы "а" - C++
Программа должна удалять из строки все символы, что стоят на чётных местах после буквы &quot;а&quot;. Сделал программу которая это делает, но только...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Класс "Телефонная станция". Массив символов и массив строк - в чем разница? - C++
Всем привет. Не могу исправить в программе пункт корректировки. Весь проект прикрепляю к сообщению. ...

При вводе определенных переменных программа должна возвращать пользователя обратно к первому шагу - C++
Здравствуйте. Хочу сделать так, чтобы при вводе любых чисел кроме 1 и 2, программа выдавала сообщение об ошибке и не закрывалась (так как...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

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