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

Сортировка фамилий по алфавиту - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как реализовать поиск минимального и максимального элемента в двух объектах класса сразу?? http://www.cyberforum.ru/cpp-beginners/thread411856.html
Т.е. один минимальный на два объекта, объекты - одномерные массивы
C++ Листание текстового файла в консоле На экран выводится файл, который можно листать вперед или назад. // Прототип функции вывода части матрицы, в которую переписан листаемый файл void matr_part_out(char matr, int icur, int... http://www.cyberforum.ru/cpp-beginners/thread411845.html
Вопрос насчёт чтения файла C++
Добрый вечер. у меня имеется файл, в котором данные расположены не в одной строке. Для чтения я использую функцию fgets, и вот такая проблема возникает: мне необходимо, чтобы каждая следующая...
C++ Наследование. Иерархия и контейнерные классы
Создать класс студент, имеющий имя (указатель на строку), курс и идентификационный номер. Определить конструкторы, деструктор и функцию печати. Создать public-производный класс – студент-дипломник,...
C++ Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. http://www.cyberforum.ru/cpp-beginners/thread411817.html
С++. Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. Сложновато :sorry:
C++ вывод всех N значных чисел, сумма цифр которых = данному числу Составить программу вывода всех N значных десятичных чисел, сумма цифр которых равна введённому с клавиатуры целому числу (<50). подробнее

Показать сообщение отдельно
Barrent
244 / 120 / 41
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
22.09.2015, 01:09
ServerCydia,
Сделал без файлов - их сами уже добавите.
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
bool Compare(const string &left, const string &right);
size_t FindSurnameIndex(const string  &fio);
 
int main()
{
    vector<string> names;   
    //вводим данные
    names.push_back("J.X.Smith");
    names.push_back("B.A. Weiter");
    names.push_back("A.C. Johnes");
    //сортировка
    std::sort(names.begin(), names.end(), Compare);
    //вывод на экран
    for (auto name = names.begin(); name != names.end(); name++){
        cout << *name << endl;
    }
    system("pause");
    return 0;
}
 
//Сравнение 2-х ФИО
bool Compare(const string &left, const string &right){
    //Находим индексы начала фамилий
    size_t left_index_dot = FindSurnameIndex(left);
    size_t right_index_dot = FindSurnameIndex(right);
 
    //Сравниваем фамилии
    for (size_t i = left_index_dot, j = right_index_dot; i < left.length(), j < right.length(); i++, j++){
 
        if (left[i] < right[j])
            return true;
 
        if (left[i] > right[j])
            return false;
 
        if ((i + 1 == left.length()) && (j + 1 < right.length()))
            return true;
 
        if ((i + 1 < left.length()) && (j + 1 == right.length()))
            return false;
 
        if ((i + 1 == left.length()) && (j + 1 == right.length()))
            return true;
    }
    return true;
}
 
//Возвращает позицию фамилии
size_t FindSurnameIndex(const string  &fio){
    //находим позицию первой точки
    size_t first_dot = fio.find('.');
    size_t non_space;
    //если точки нет, то возвращаем позицию первого не пробела (или 0 если все пробелы)
    if (first_dot == string::npos){
        non_space = fio.find_first_not_of(' ');
        if (non_space == string::npos)
            return 0;
        return non_space;
    }
        
    //находим позицию второй точки  
    size_t second_dot = fio.find('.', first_dot + 1);
    //если точки нет, то возвращаем позицию первого не пробела (или 0 если все пробелы) после первой точки
    if (second_dot == string::npos){
        non_space = fio.find_first_not_of(' ', first_dot + 1);
        if (non_space == string::npos)
            return 0;
        return non_space;
    }
    
    //возврат позиции не пробела после второй точки
    non_space = fio.find_first_not_of(' ', second_dot + 1);
    if (non_space == string::npos)
        return second_dot + 1;
    return non_space;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru