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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить, сколько раз в заданном предложении встречается сочетание 'А+В’. (C++) http://www.cyberforum.ru/cpp-beginners/thread1036042.html
Помогите с заданием, программа нужна на языке C++. Задание: Определить, сколько раз в заданном предложении встречается сочетание 'А+В’. Предложение вводится с клавиатуры. Добавлено через 6 минут Помогите, программа нужна в самое ближайшее время!!! Добавлено через 50 минут Пожалуйста, срочно нужно)
C++ селективная обработка матрицы пожалуйста, помогите! совсем не получается( Кол-во строк и столбцов вводится пользователем, а затем генерируется матрица. В ней нужно найти: 1) кол-во отрицательных четных элементов 2)сумму отрицательных чет. элементов, находящихся на главной диагонали 3) сумму нечетных элементов 3го столбца и произведение отрицательных кратных 3 элементов второй строки матрицы А Матрицу создать могу, а... http://www.cyberforum.ru/cpp-beginners/thread1036041.html
C++ 23. Упорядочить данные в порядке убывания значений рабочего стажа. (C++)
Помогите с заданием, программа нужна на языке C++. По данным таблицы, содержащей информацию о работниках предприятия, провести упорядочивание данных по возрастанию или убыванию значения реквизита, указанного в варианте. Вывести на печать исходную таблицу и упорядоченную таблицу. Упорядочить данные в порядке убывания значений рабочего стажа. Таблица 6 № Фамилия И. О. Пол Год...
C++ Посмотрите программу пожайлуста!
В С++ еще новичок посмотрите пожалуйста где я делаю ошибку. //Квадратное уравнение #include "stdafx.h" #include <iostream> #include <math.h> using namespace std; int main() { setlocale(LC_ALL,"Russian"); int a,b,c;
C++ подскажите пожалуйста в чем ошибка) http://www.cyberforum.ru/cpp-beginners/thread1036036.html
при написании программы вылезла ошибка "...Возможно, вы забыли добавить директиву "#include "stdafx.h"" в источник" - добавил #include "stdafx.h" вылезло еще куча ошибок. в чем дело, подскажите?
C++ Задачи на функции и массив Задача №1 по теме Функции Задача №2 по теме Расчет суммы или количества элементов массива, удовлетворяющих некоторому условию Задача №3 по теме Двумерный массив Помогите с решением, заранее огромное спасибо! подробнее

Показать сообщение отдельно
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
14.12.2013, 00:10     Программа должна возвращать новый массив, состоящий из строк вида "И. Фамилия"
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;
}
Получилось не совсем кратко, но я думаю, от таких коментариев пользы будет больше.
 
Текущее время: 13:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru