Составление алгоритма решения. Математическая формулировка задачи и выбранный детализированный метод ее решения позволяют создать одношаговую схему алгоритма решения (рис
Математическая формулировка задачи и выбранный детализированный метод ее решения позволяют создать одношаговую схему алгоритма решения (рис. 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.