|   Войти

Сортировка строковых массивов

В одном из предыдущих уроков мы рассматривали один из методов сортировки массивов по возрастанию или убыванию методом Sort Selection. Подобным методом можно отсортировать текстовую информацию, например, строки содержащие фамилии, имена и отчества учеников в классном журнале.

Повторите тему «СОРТИРОВКА МАССИВОВ».

Для работы программы нам потребуются следующие функции, содержащиеся в модуле string.h:

strcpy(строка1, строка2);  - данная функция копирует в строку1 значение строки2. После этого строка1 и строка2 будут равны.

ПРИМЕР 1:

char str1[10]=”Hello!”;

char str2[10];

strcpy(str2,str1); - после данной команды строка str2  будет также, как и str1, равна Hello!”.

Следующая функция нам потребуется для сравнения строк по алфавиту.

strcmp(строка1, строка2); - данная функция сравнивает две строки и возвращает значение больше 0, если строка1 больше строки2, 0 - если они равны, и значение меньше 0, если строка1 меньше строки2. Сравнение происходит посимвольно по номеру символа в таблице символов. Например, если есть две строки «Иванов Иван» и «Иванов Алексей», то строка «Иванов Алексей» будет меньше, чем строка «Иванов Иван», потому что отличия в этих строках начинаются с 8-го символа, а символ «A» имеет меньший номер, чем символ «И».

Скачайте эту программу, поместите скачанный файл STR02.CPP в папку C:\TCPP\BIN\.

Запустите DOSBox (Как настроить эту программу можно посмотреть ЗДЕСЬ).

Нажмите клавишу F3. Выберите файл STR02.CPP и нажмите клавишу Enter.

На экране появится текст программы:

Рассмотрим эту программу подробнее:

include<iostream.h>

#include<conio.h>

#include<string.h>  - подключаем модуль string.h, чтобы использовать некоторые функции для работы со строками.

void main(){

  clrscr(); - очистка экрана.

  char str[5][50]; - объявляем массив состоящий из 5 строк, максимальная длина которых не превышает 49 символов (+1 символ признак конца строки).

  for(int i=0;i<5;i++){ - переменная пройдет значения от 0 до 4

    cout<<"Введите ФИО ученика №"<<i+1<<": "; - для каждого значения i, просим ввести Фамилию, имя и отчества ученика.

    cin.getline(str[i],50); - Вводим с клавиатуры ФИО ученика, после нажатия клавиши Enter данная строка запишется в массив str. Параметр 50 задает максимально возможное количество символов, которое можно сохранить в одной строке.  Эта функция похожа на фукнцию cin, но она позволяет вводить строки, содержащие пробелы. Функция cin, прерывает строку, если встречается пробел.

  }

  clrscr(); - снова очищаем экран.

  cout<<"Вы ввели:\n"; - выводим фразу «Вы ввели».

  for(i=0;i<5;i++)cout<<i+1<<". "<<str[i]<<"\n"; - Выводим на экран 5 строк, которые мы ввели до этого без сортировки.

 

  int lastIndex=4,n; - создаем две переменные.  Переменная lastIndex – содержит индекс максимального элемента массива, до которого будет производиться поиск максимального элемента массива. Сначала это элемент с индексом 4 – последний элемент массива, затем этот параметр будет уменьшаться – будем искать до элемента с индексом 3, затем 2 и т.д. В переменной n будем сохранять индекс элемента, содержащего максимальную строку.

  while (lastIndex>0){ - пока есть хотя бы два элемента для сравнения (элемент 0 и элемент 1) будем выполнять следующие действия

    char maxStr[50]=""; - создаем строку, в которой будем сохранять максимальную строку.

    for(i=0;i<=lastIndex;i++){ - «проходим» по массиву по элементам с 0-го до элемента с номером lastIndex.

      if (strcmp(str[i],maxStr)>0){ - если текущий элемент массива содержит строку большую, чем maxStr

        strcpy(maxStr,str[i]); - …то сохраняем текущий элемент массива в переменную maxStr

       n=i;  - … и сохраняем индекс элемента массива, содержащий максимальную строку, в переменную n.

      } – конец оператора if.

    } – конец оператора for.

   char tempStr[50]; - создаем временную переменную для хранения в ней строки.

   strcpy(tempStr,str[lastIndex]); - копируем последний элемент массива, до которого осуществлялся поиск, в переменную tempStr.

   strcpy(str[lastIndex],str[n]); - копируем в последний элемент массива, до которого осуществлялся поиск, элемент массива, содержащий максимльную строку.

   strcpy(str[n],tempStr); - копируем сохраненную в переменную tempStr строку в элемент массива, который содержал максимальную строку. Этими тремя командами мы поменяли местами последний элемент массива, до которого осуществлялся поиск, с элементом, содержащим максимальную строку.

   lastIndex--; - уменьшаем значение максимального индекса элемента, до которого осуществляется поиск. Когда lastIndex станет равным 0, цикл while закончит свою работу.

  } – конец цикла while.

  cout<<"\nСортировка...\n";

  for(i=0;i<5;i++)cout<<i+1<<". "<<str[i]<<"\n"; - выводим строки после сортировки.

  getch(); - ждем нажатия любой клавиши, чтобы выйти из программы.

} – конец функции main и всей программы.

Чтобы запустить программу, нажимаем комбинацию клавиш Alt+R, выбираем в появившемся меню пункт Run и нажимаем клавишу Enter. Ни в коем случае не нажимайте для запуска программы комбинацию клавиш Ctrl+F9 – это закроет DOSBox!

Программа предлагает ввести фамилию, имя и отчество для каждого из 5-ти учеников. Вводим эти данные с клавиатуры, каждый раз нажимая клавишу Enter:

Программа выводим ФИО пяти учеников без сортировки, а затем после сортировки:

При нажатии на любую клавишу программа закроется.

ЗАДАНИЕ: В рассмотренной программе, увеличьте количество учеников с 5-ти до 10 и измените порядок сортировки, чтобы сортировка была не от А до Я, а от Я до А (в обратном порядке).