Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Выбор порядка сортировки динамически




Порядок сортировки может быть разным. В предыдущем примере сортировка осуществлялась либо в алфавитном порядке, либо согласно длине. В алфавитном порядке отсортировать также можно двумя способами: по возрастанию и по убыванию. Если же мы будем работать не с массивом строк или чисел, а с массивом записей, каждая из которых состоит из нескольких полей, то типов сортировки может быть еще больше. Вопрос заключается в следующем: «Для каждой сортировки нужно писать свою функцию, или, все-таки, можно обойтись одной?»

В рассмотренном выше примере сортировка по алфавиту и сортировка по длине отличается лишь условием, поэтому неразумно делать две функции, которые почти одинаковы. Хорошим решением является передача типа сортировки в качестве аргумента. Но какого? Однозначного ответа нет, поскольку вариантов сортировки может быть много, поэтому давайте положим, что требуется реализовать сортировку либо по возрастанию, либо по убыванию. Для этого сойдет параметр логического типа, который принимает значение true, если требуется обратный порядок, и false – прямой. Чтобы не было путаницы эти значения лучше задать именованными константами REVERSE_ORDER и STRAIGHT_ORDER.

Ниже приведена программа, которая определяет порядок сортировки массива согласно выбору в меню.

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

//Размер списка

#define N_CITIES 12

//Максимальная длина названия

#define MAX_LENGTH 15

//Обратный порядок сортировки

#define REVERSE_ORDER true

//Прямой порядок сортировки

#define STRAIGHT_ORDER false

 

//Список городов

char cities[N_CITIES][MAX_LENGTH] = {

"Новосибирск", "Москва", "Цюрих",

"Нью Йорк", "Мадрид", "Париж",

"Барселона", "Лондон", "Токио",

"Монте-Карло", "Глазго", "Каир"

};

 

//Прототипы используемых функций

void printCities();

void sortCities(bool order);

void printMenu();

int getChoice();

 

int main() {

while (true) {

printMenu();

switch(getChoice()) {

case 1 :

sortCities(STRAIGHT_ORDER);

printCities();

break;

case 2 :

sortCities(REVERSE_ORDER);

printCities();

break;

case 0 :

exit(EXIT_SUCCESS);

default :

exit(EXIT_FAILURE);

}

//Подождать, пока пользователь

//нажмет любую клавишу

system("pause");

}

return 0;

}

 

//Вывод списка городов

void printCities() {

for (int i=0; i<N_CITIES; i++) {

puts(cities[i]);

}

}

 

//Сортировка списка городов

//(метод прямого выбора)

//Аргумент order может равняться

//STRAIGHT_ORDER или REVERSE_ORDER

void sortCities(bool order) {

for (int i=0; i<N_CITIES-1; i++) {

int min=i;

for (int j=i+1; j<N_CITIES; j++) {

if (order ^

strcmp(cities[min], cities[j])>0) {

min=j;

}

}

char temp[MAX_LENGTH];

strcpy(temp, cities[min]);

strcpy(cities[min], cities[i]);

strcpy(cities[i], temp);

}

}

 

//Вывод меню на экран

void printMenu() {

//Очистка экрана

system("cls");

printf("---МЕНЮ---\n");

printf("1-Прямой порядок\n");

printf("2-Обратный порядок\n");

printf("0-Выход\n");

printf("Ваш выбор - ");

}

 

//Выбор пункта меню и

//проверка его правильности (0, 1 или 2)

int getChoice() {

int choice;

scanf("%d", &choice);

if (choice<0 || choice>2) {

printf("Нет такого пункта\n");

printf("Выберите еще раз - ");

//Если выбор неверный,

//то предлагаем попробовать еще раз

return getChoice();

}

return choice;

}

 


Поделиться:

Дата добавления: 2015-08-05; просмотров: 78; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты