Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream> // Для ВЫВОДА (и ввода)
- #include <string> // Для СТРОК
- #include <fstream> // Для ФАЙЛОВ
- #include <ctime> // Для ВРЕМЕНИ
- #include <iomanip> // Для форматирования потока
- #include "stdafx.h"
- using namespace std;
- // Возвращает размер строки (символьного массива (строки))
- int size_string(char * string) {
- int count = 0;
- while(string[count] != 0) {
- count++;
- }
- return count;
- }
- // Меняем местами строки (текущию и next)
- void swap_string_bool(char ** name, char ** birthday, char ** city, int i) {
- char * str = new char[1];
- str = name[i];
- name[i] = name[i + 1];
- name[i + 1] = str;
- str = birthday[i];
- birthday[i] = birthday[i + 1];
- birthday[i + 1] = str;
- str = city[i];
- city[i] = city[i + 1];
- city[i + 1] = str;
- }
- // Сравнение строк
- bool comparison_string(char ** string, int i, int j) {
- // строка_i > строка_j == true
- // строка_i < строка_j == false
- // строка_i = строка_j == true
- int size_i = size_string(string[i]);
- int size_j = size_string(string[j]);
- int k = 0;
- while(true) {
- if (string[i][k] == 0) {
- return true;
- } else if (string[j][k] == 0) {
- return false;
- }
- if (string[i][k] > string[j][k]) {
- return true;
- } else if (string[i][k] < string[j][k]) {
- return false;
- }
- k++;
- }
- return 0;
- }
- int main() {
- string line; // Хранит текущую строку (для записи в весь текст)
- string text; // Хранит весь текст файла
- int count_line = 0; // Хранит кол-во строк
- int timer; // Таймер для посчета времени выполнения алгоритмов
- char ** name = new char * [30000]; // Двумерный массив для хранения ИМЕНИ
- char ** birthday = new char * [30000]; // Двумерный массив для хранения ДР
- char ** city = new char * [30000]; // Двумерный массив для хранения ГОРОДА
- string name_file;
- cout << "Введите название файла (имя.расширение): ";
- cin >> name_file;
- ifstream myfile (name_file);
- // Подсчет и запись строк
- while (! myfile.eof() ) {
- getline(myfile, line); // Чтение строки
- text += line + " "; // Запись в одну переменную
- }
- myfile.close(); // Закрытие файла
- ofstream F (name_file, ios::out); F.close(); // Очистка файла
- // ПАРСИНГ (операторы)
- int k = 0; // СЧЕТЧИК для записи в массивы
- char flag = 0; // ФЛАГ для парсинга
- name[count_line] = new char [25]; // Для первой записи
- // ПАРСИНГ (цикл)
- for (int i = 0; text[i] != 0; i++) {
- // Если обноружен пробел
- if (text[i] == 32) {
- // То устанавливаем конец значения
- if (flag == 0) {
- name[count_line][k] = 0;
- birthday[count_line] = new char [16];
- } else if (flag == 1) {
- birthday[count_line][k] = 0;
- city[count_line] = new char [40];
- } else if (flag == 2) {
- city[count_line][k] = 0;
- }
- flag++; // Меняем (увеличиваем) флаг
- k = 0; // Обнуляем счетчик для записи строки
- // Если последним значением было City
- if (flag == 3) {
- count_line++;
- flag = 0;
- name[count_line] = new char [1];
- }
- continue;
- }
- if (flag == 0) {
- name[count_line][k] = text[i];
- } else if (flag == 1) {
- birthday[count_line][k] = text[i];
- } else if (flag == 2) {
- city[count_line][k] = text[i];
- }
- k++;
- }
- // Запуск таймера
- timer = time(NULL);
- // СОРТИРОВКА ПУЗЫРЬКОМ
- for (int i = 0; count_line > i; i++) {
- for (int j = 0; count_line - i - 1 > j; j++) {
- // v~~~~~~~ Изменить, для другого столбца (не работает для даты рождения)
- if (comparison_string(name, j, j + 1)) {
- swap_string_bool(name, birthday, city, j);
- } else {
- continue;
- }
- }
- }
- // Остановка и выпуск таймера
- cout << "Сортировка ПУЗЫРЬКОМ: " << time(NULL) - timer << "сек." << endl;
- // ПЕРЕЗАПИСЬ массивов (операторы)
- k = 0;
- flag = 0;
- count_line = 0;
- // ПЕРЕЗАПИСЬ массивов (цикл)
- for (int i = 0; text[i] != 0; i++) {
- if (text[i] == 32) {
- if (flag == 0) {
- name[count_line][k] = 0;
- } else if (flag == 1) {
- birthday[count_line][k] = 0;
- } else if (flag == 2) {
- city[count_line][k] = 0;
- }
- flag++;
- k = 0;
- if (flag == 3) {
- count_line++;
- flag = 0;
- }
- continue;
- }
- if (flag == 0) {
- name[count_line][k] = text[i];
- } else if (flag == 1) {
- birthday[count_line][k] = text[i];
- } else if (flag == 2) {
- city[count_line][k] = text[i];
- }
- k++;
- }
- // Запуск таймера
- timer = time(NULL);
- // СОРТИРОВКА ВСТАВКОЙ
- for (int i = 1; count_line > i; i++) {
- // Изменить, для другого столбца ~~~~~~~v
- for (int j = i; j > 0 && comparison_string(name, j - 1, j); j--) {
- swap_string_bool(name, birthday, city, j - 1);
- }
- }
- // Остановка и выпуск таймера
- cout << "Сортировка ВСТАВКОЙ: " << time(NULL) - timer << "сек." << endl;
- // ЗАПИСЬ в файл
- ofstream out;
- out.open(name_file);
- for (int i = 0; count_line > i; i++) {
- out << setw(14) << name[i]
- << setw(14) << birthday[i]
- << setw(20) << city[i] << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement