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

У меня выводит имя и фамилия, а отчество не хочет - C++

Восстановить пароль Регистрация
 
solodchuk_olia
Сообщений: n/a
16.12.2013, 23:06     У меня выводит имя и фамилия, а отчество не хочет #1
Введите с клавиатуры терминала массив строк. Каждая строка имеет вид: "Фамилия Имя Отчество" (разделяются одним пробелом). Признак окончания ввода массива-строка, содержащая слово "exit". Программа должна возвращать новый массив, состоящий из строк вида "И.О. Фамилия".
У меня выводит имя и фамилия, а отчество не хочет, помогите
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
#include <string>
#include <iostream>
#include <vector>
#include <cctype>
using namespace std;
int main()
{
const int inizualu = 100;
vector<string> * spisok[inizualu];
 
for (int i = 0; i < inizualu; i++)
{
spisok[i] = new vector<string>;
spisok[i]->reserve(3);
}
 
int index = 0;
string fullName;
 
do 
{
getline(cin, fullName);
 
string imya;
string familiay;
string otchestvo;
size_t position = fullName.find(' ', 0);
 
while (position != std::string::npos)
{
if (position == 0)
{
fullName.erase(fullName.begin());
position = fullName.find(' ', 0);
}
else
{
familiay.assign(fullName, 0, position);
imya.assign(fullName, position + 1, fullName.length() - (position + 1));
otchestvo.assign(fullName, position + 2, fullName.length() - (position + 2));
spisok[index]->push_back(imya);
spisok[index]->push_back(familiay);
spisok[index]->push_back(otchestvo);
position = std::string::npos;
}
}
 
++index;
} 
while (fullName.compare("exit") != 0 && index < inizualu);
for (int i = 0; spisok[i]->empty() != true; i++)
{
if (islower((spisok[i]->at(0)).at(0)))
{
toupper((spisok[i]->at(0)).at(0));
}
 
if ( islower((spisok[i]->at(1)).at(0)))
{
toupper((spisok[i]->at(1)).at(0));
}
if ( islower((spisok[i]->at(5)).at(0)))
{
toupper((spisok[i]->at(2)).at(0));
}
 
cout « (spisok[i]->at(0)).at(0) « ". "«spisok[i]->at(2)«". "« spisok[i]->at(1)« endl;
}
for (int i = 0; i < inizualu; i++)
{
delete spisok[i];
}
 
getchar();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2013, 23:06     У меня выводит имя и фамилия, а отчество не хочет
Посмотрите здесь:

C++ Разработать класс: Student: Фамилия, Имя, Отчество, Дата рождения, Адрес, Средний бал , Факультет, Курс
C++ Разработка класса: Abiturient: Фамилия, Имя, Отчество, Адрес, Оценки
Структуры.Фамилия, Имя, Отчество Группа Домашний адрес, Телефон Электронная пошта C++
C++ Известны фамилия, имя и отчество пользователя. Найти его код личности
Дана строка вида «Фамилия Имя Отчество». Получить строку вида Имя Отчество C++
Сформировать из трех строк (фамилия, имя, отчество) одну строку, содержащую фамилию и инициалы C++
Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.12.2013, 00:00     У меня выводит имя и фамилия, а отчество не хочет #2
как-то запутанно все у вас. все в кучу. программу нужно бить на запчасти (хотябы функции).
вот пример-но то же самое делается:
смотрим на функцию Execute. в ней в цикле вводятся строки (эмуляция, но можно и вводить),
если строка не exit, то предполагается что это полное имя из трех слов. парсим строки. если
нужно, добавляем всякие проверки и кидаем исключения, если распарсить не получилось.
если же распарсить получилось - то передаем полученные ФИO в функцию конвертации,
которая и преобразует их в нужную строки (для простоты просто перестановка имен).
результат вставляется в контейнер, который и печатается после выхода из цикла:
Имхо такой вариант заточить под ваши нужды сильно проще. наверно только подправить
преобразование имени и все.

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
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <stdexcept>
 
 
std::string GetLine()
{
  //std::string str;
  //std::cin >> str;
  //return str;
 
  // эмулируем ввод.
  static int i = -1;
  ++i;
 
  if (i == 5)
  {
    return "exit";
  }
 
  std::ostringstream oss;
  oss << i << "_FirstName  " << i << "_SecondName       " << i << "_ThirdName  ";
  const std::string& line = oss.str();
  std::cout << "Input: " << line << std::endl;
 
  return line;
}
 
void PrintStrings(const std::string& title, const std::vector<std::string>& strings)
{
  std::cout << std::endl << title << " (" << strings.size() << "):" << std::endl;
  for (std::vector<std::string>::const_iterator it = strings.begin(), end = strings.end(); it != end; ++it)
  {
    std::cout << *it << std::endl;
  }
}
 
void ParseFullName(const std::string& fullName, std::string& firstName, std::string& secondName, std::string& thirdName)
{
  // про безопасность исключений говорить еще рано. поэтому фигачим сразу в выходные параметры.
  std::istringstream iss(fullName);
  iss >> firstName;
  iss >> secondName;
  iss >> thirdName;
  if (firstName.empty() || secondName.empty() || thirdName.empty())
  {
    throw std::runtime_error("Bad full name format (" + fullName + ")");
  }
}
 
std::string ConvertFullName(const std::string& firstName, const std::string& secondName, const std::string& thirdName)
{
  return thirdName + " " + firstName + " " + secondName;
}
 
void Execute()
{
  std::vector<std::string> convertedNames;
 
  while (true)
  {
    const std::string& line = GetLine();
    if (line == "exit")
    {
      break;
    }
 
    std::string firstName;
    std::string secondName;
    std::string thirdName;
    ParseFullName(line, firstName, secondName, thirdName);
    const std::string& convertedName = ConvertFullName(firstName, secondName, thirdName);
    convertedNames.push_back(convertedName);
  }
 
  PrintStrings("Converted names", convertedNames);
}
 
int main()
{
  try
  {
    Execute();
    std::cout << std::endl << "DONE" << std::endl;
  }
  catch (const std::exception& e)
  {
    std::cout << "Error:" << e.what() << std::endl;
  }
 
  return 0;
}
Yandex
Объявления
17.12.2013, 00:00     У меня выводит имя и фамилия, а отчество не хочет
Ответ Создать тему
Опции темы

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