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

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

Восстановить пароль Регистрация
 
 
Sabi_na
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 20
11.12.2013, 17:05     Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия" #1
Всем привет.
Помогите пожалуйста, написать код, так как сама не разбираюсь, а нужно сделать эту задачу)
Всем буду очень благодарна за помощь.

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

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

Rudenok Sabina
Polishchuk Tanya
Kharchenko Julia
Tymoshenko Dasha

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

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


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

C++ Что означает "Программа "[4872] laba!.exe: Машинный код" завершилась с кодом 3 (0x3)."?
C++ Unicode, UTF-8 и ANSI в одном консольном приложении. Можно ли "на лету" конвертировать массив строк?
C++ я задал произвольный текст длинной 5 строк, и допустим что я ввел 5 раз букву "П" , какой цикл нужно создать чтобы пометять букву "П" на букву "Р" ?
При сокращении "Фамилия Имя Отчество" к "Фамилия И.О." пропадают "И.О." C++
C++ Программа должна удалять из строки все символы, что стоят на чётных местах после буквы "а"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
12.12.2013, 18:08     Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия" #21
Sabi_na, вы читали своё собственное задание? Так вот, там сказано:
-ввести в терминале фамилию и имя, разделённые одним пробелом.
-продолжать до тех пор, пока не встретится строка exit.

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

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

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


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

Не по теме:

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

StackOverflow
All rights reserved.
91 / 81 / 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;
}
Получилось не совсем кратко, но я думаю, от таких коментариев пользы будет больше.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 00:14     Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия"
Еще ссылки по теме:

C++ Функция должна возвращать новый массив, состоящий из отрицательных элементов исходного массива
C++ Класс "Телефонная станция". Массив символов и массив строк - в чем разница?
C++ При вводе определенных переменных программа должна возвращать пользователя обратно к первому шагу

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

Или воспользуйтесь поиском по форуму:
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;
}
Получилось не совсем кратко, но я думаю, от таких коментариев пользы будет больше.

спасибо, все понятно)
Yandex
Объявления
14.12.2013, 00:14     Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия"
Ответ Создать тему
Опции темы

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