Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 03.11.2010
Сообщений: 6
1

Сортировка строки

23.11.2010, 03:06. Показов 2128. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй всем ночи!
Скажите, пожалуйста, как можно реализовать сортировку введённой пользователем строки, т.е. переместить гласные буквы в левую часть, а согласные в правую часть?

Добавлено через 29 минут
забыл написать, запрос строки у пользователя через printf...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2010, 03:06
Ответы с готовыми решениями:

Не работает сортировка строки. Сортировать строку по возрастанию длины строки
Нужно, чтобы слова входной строки( разделенные пробелами) сортировались по возрастанию длины и...

Строки и сортировка
В тексте найти и вывести фамилии заканчивающиеся на "ко". Фамилиями считаются слова начинающиеся с...

Строки.Сортировка
Значит задание такое: Записати в реченні символи найкоротшого слова(першого з найкоротших,якщо їх...

Сортировка строки
Добрый день уважаемые читатели. У меня проблема с такой задачей: нужно ввести строчку и получить...

5
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.11.2010, 09:07 2
Все очень просто, нужно ввести функцию-компаратор и воспользоваться функцией qsort:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define SIZE 80
 
int cmp (const void* a, const void* b)
{
    static const char* vowels = "aeiouy";
    
    int isVowel(char c)
    {
        return strchr(vowels, (int) c) != NULL;
    }
    
    int A = isVowel(*(char*) a);
    int B = isVowel(*(char*) b);
    if((A && B) || (!A && !B))
        return 0;
    else if(A && !B)
        return -1;
    else
        return 1;
}
 
int main()
{
    char* str = NULL;
    int len = 0;
    ssize_t num;
    printf("Input string: ");
    if((num = getline(&str, &len, stdin)) != -1)
    {
        str[--num] = '\0';
        qsort(str, num, sizeof(char), cmp);
        printf("Sorted string: \'%s\'\n", str);
    }
    else
    {
        perror("Error");
        return 1;
    }
    if(str)
        free(str);
    return 0;
}
Цитата Сообщение от Kardinal264 Посмотреть сообщение
забыл написать, запрос строки у пользователя через printf...
Вот это очень важно замечание, ага

Добавлено через 1 час 42 минуты
18 строку лучше переписать так:
C
1
if(A == B)
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12737 / 7567 / 1764
Регистрация: 25.07.2009
Сообщений: 13,957
23.11.2010, 09:16 3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <string.h>
 
#define VOWELS "AaEeIiOoUuYy"
    
// ANSI C 99
// скомпилируется только gcc
// чтобы компилировалось чем попало - 
// нужно в функции динамически выделять память
// и удалять перед выходом
char * separate(char * buf, int len){
    char vowels[len + 1], nevowels[len + 1]; // ;)
    char * pb = buf, * pv = vowels, * pn = nevowels;
    
    while ( *pb && len-- ){
        if ( strchr(VOWELS, *pb) )
            *pv++ = *pb;
        else
            *pn++ = *pb;
        ++pb;
    }
    *pv = 0;
    *pn = 0;
    strcpy(buf, vowels);
    strcat(buf, nevowels);
    
    return buf;
}
 
int main(void){
    char buf[BUFSIZ];
    
    printf("Mixed: ");
    scanf("%s", buf);
    printf("Separated: %s\n", separate(buf, strlen(buf)));
    
    return 0;
}
1
112 / 22 / 3
Регистрация: 20.11.2010
Сообщений: 1,294
23.11.2010, 09:16 4
Вот это очень важно замечание, ага
да, замечание важное , сложно было бы решить задачку.
Nameless One а напиши плиз комменты, хотя бы вкратце! Я просто недавно начал изучать С++ и интерестны коды. Ведь не один человек смотрит решение! Половину я понял конечно!
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.11.2010, 09:44 5

Не по теме:

C
1
char vowels[len + 1], nevowels[len + 1]; // ;)
:D



Для сортировки используется стандартная функция qsort, которая реализует (внезапно!) алгоритм быстрой сортировки. Так как в С статическая типизация (а шаблонов нету), для того, чтобы алгоритм работал с массивами всех типов, в функцию передается указатель на void. Также передается размер массива и размер элемента. Последний параметр функции - это указатель на функцию сравнения, ожидаемый прототип которой таков:
C
1
int(*compar)(const void *, const void *)
Функция сравнения принимает указатели на void, которые указывают на сравниваемые элементы массива. Возвращаемое значение - отрицательное, если первый элемент меньше второго, 0, если элементы равны, и положительное число в противном случае. В моей функции сравнения cmp необходимо скастовать указатели к типу char* перед разыменованием, т.к. мы работаем с отдельными символами в С-строке. Если оба символа, на которые указывают параметры функции - гласные или согласные, то возвращается ноль (т.е. они считаются равными). Если первый символ - гласная буква, а второй - согласная, то возвращается -1, и 1 в противном случае.
Функция strchr:
C
1
char *strchr(const char *s, int c)
возвращает указатель на первое вхождение символа c в строку s либо NULL, если вхождений нет.
Подробнее про использованные функции смотри здесь
1
0 / 0 / 0
Регистрация: 03.11.2010
Сообщений: 6
01.12.2010, 20:04  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//---------------------------------------------------------------------------
 
#pragma hdrstop
#include <conio.h>
#include <stdio.h>
#include <string.h>
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
bool IsVowel(char c)
{
  static char glas[] = "AaEeIiJjOoUuYy";
  for (int j = 0; j < strlen(glas); j++)
  {
    if (c == glas[j])
    {
      return true;
    }
  }
  return false;
}
 
bool IsNoVowel(char c)
{
  static char sogl[] = "BbCcDdFfGgHhKkLlMmNnPpQqRrSsTtWwXxZz";
  for (int j = 0; j < strlen(sogl); j++)
  {
    if (c == sogl[j])
    {
      return true;
    }
  }
  return false;
}
 
void CopyVowel(char *p1, char *p2)
{
  while (*p2) p2++;
  while (*p1) {
    if (IsVowel(*p1)) *(p2++) = *p1;
    p1++;
  }
  *p2 = 0;
}
int main(int argc, char* argv[])
{
  int ind = 0, ind2 = 0;
  char glas[] = "AaEeIiJjOoUuYy";
  char sogl[] = "BbCcDdFfGgHhKkLlMmNnPpQqRrSsTtWwXxZz";
  char str1[150];
  char str2[150];
  gets(str1);
 
  CopyVowel(str1, str2);
Приняв некоторую информацию с постов выше, получилось сие... Но теперь вопрос, как можно вывести str2, уже отсортированный массив, использую цикл или всё же есть выход?

Добавлено через 20 часов 23 минуты
ни у кого нет идей?
0
01.12.2010, 20:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2010, 20:04
Помогаю со студенческими работами здесь

Сортировка строки по алфавиту
Здравствуйте, нужно отсортировать строку по алфавиту. Подскажите, как это реализовать? Есть массив...

Сортировка строки матрицы
Отсортировать элементы третьей строки матрицы (многомерного вектора) 5x6 элементов по возрастанию...

Сортировка строки матрицы
Отсортировать элементы третьей строки матрицы (многомерного вектора) 5x6 элементов по возрастанию...

сортировка строки текста
Помогите написать программу, несколько дней уже бьюсь, всё никак не идёт Дана строка. Словом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru