Составление алгоритма решения. Математическая формулировка задачи и выбранный детализированный метод ее решения позволяют создать одношаговую схему алгоритма решения (рис

Математическая формулировка задачи и выбранный детализированный метод ее решения позволяют создать одношаговую схему алгоритма решения (рис. 9.16).

Вывод исходной и получаемой сортировкой строки предусматривается отдельными последовательно выполненными циклами.

Рис. 9.16. Схема алгоритма сортировки символьной строки модифицированным методом «всплывающего пузырька»

üВнимание! Алгоритм универсален – пригоден для ранжирования строки символов любого алфавита или совокупности алфавитов.

Программирование задачи

Особенность программирования сортировки символьных строк – необходимость предварительного определения реальной длины обрабатываемой символьной строки (фактического размера символьного массива), а не планируемого описателем размера. Операцию определения длины введенной строки в языке Си/Си++ выполняет функция strlen().

Функция определения длины символьной строки strlen( )

Функция предназначена для определения длины символьной строки с указанным именем. Структура функции:

strlen( buf )

где strlen – обозначение функции;

buf – имя анализируемой символьной строки;

( ) – ограничители аргумента.

Функция располагается в библиотеке string.h.

Правила записи и использования

1. Функция применяется для определения длины символьной строки в буфере.

2. Размер буфера – целое число, задается в описателе и определяет максимальную длину анализируемой строки.

3. Функция понимает под символом любой знак (включая пробелы и знаки пунктуации) за исключением окончания строки «\0».

4. Функция используется как операнд арифметического выражения или операнд присваивания (определение значения целой переменной).

Общий вид фрагмента программы определения длины n символьной строки str:

#include <string.h> /* директива препроцессора*/

char str[10]; /*описатель символьного массива (строки) str */

int n;/*описатель длины строки*/

gets(str); /*ввод символов с клавиатуры в массив str*/

n = strlen(str); /*определение фактической длины строки*/

Описатель типа определяет массив str как символьный, максимальной длины 10 символов. Оператор gets(str); предписывает ввод символов строки str (включая пробелы) с клавиатуры до нажатия клавиши «Enter». Оператор n = strlen(str); определяет значение целой переменной n как фактической длины строки.

Таблица идентификации переменных алгоритма и создаваемой программы представлена в табл. 9.6.

Таблица 9.6.

Обозначение в алгоритме bufпр n i j bufi bufj
Обозначение в программе bufpr n i j buf[i] buf[j]

Классический вариант программирования задачи

#include<stdio.h>

#include<stdlib.h>

#include<windows.h>

#include<conio.h>

main()

{

int i,j,n; /* описание локальных переменных */

char bufmes[50], buf[30], bufpr; /*описание символьных массивов и промежуточной переменной*/

clrscr();

CharToOem("Введите исходную символьную строку", bufmes);

printf("\n %s \n", bufmes); /* ввод*/

gets(buf); /*исходной строки*/

n = strlen(buf); /* определение длины строки*/

CharToOem(" \n\n Исходная строка \n", bufmes);

printf("%s %s",bufmes, buf); /* вывод исходной строки*/

for (i=0; i< n-1; i++)/* заголовок внешн. цикла сортировки */

for(j=i+1; j<n; j++) /* заголовок внутр. цикла сортировки */

if(buf[i] > buf[j])

{

bufpr= buf[i];

buf[i]= buf[j];

buf[j]=bufpr;

}

CharToOem(" \n\n Отсортированная строка \n", bufmes);

printf("%s %s", bufmes, buf);/*вывод отсортированной строки*/

getch();

}

барракуда

Под закрывающей скобкой приведена исходная строка для решения задачи.

Результаты решения представлены в приложении 9.11.

Программирование задачи с графическим интерфейсом

Программирование задачи при использовании графического интерфейса предварим его разработкой.

Для ввода строки планируем однострочное поле редактирования (EditBuf). Для вывода элементов отсортированной строки – многострочное поле (EditSortBuf).

Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.

С учетом планируемого интерфейса выполним программирование задачи.

#include<stdio.h>

#include<stdlib.h>

#include <string.h>

void TVrDlgClient::BNClickedOk()

{

// INSERT>> Your code here.

int i,j,n; /* описание локальных переменных */

char buf[30], bufpr; /*описание символьного массива*/

EditBuf->GetText(buf,30); /* ввод символьной строки*/

n = strlen(buf); /*определение длины строки*/

for (i=0; i< n-1; i++)/* заголовок внешн. цикла сортировки */

for(j=i+1; j<n; j++) /* заголовок внутр. цикла сортировки */

if(buf[i] > buf[j])

{

bufpr= buf[i];

buf[i]= buf[j];

buf[j]=bufpr;

}

EditSortBuf->SetText(buf); /* вывод отсортированной строки*/

}

барракуда

Под закрывающей скобкой приведена исходная строка для решения задачи.

Результаты решения представлены в приложении 9.12.