Форум программистов, компьютерный форум CyberForum.ru

Сортировка строки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Kardinal264
0 / 0 / 0
Регистрация: 03.11.2010
Сообщений: 6
23.11.2010, 03:06     Сортировка строки #1
Доброй всем ночи!
Скажите, пожалуйста, как можно реализовать сортировку введённой пользователем строки, т.е. переместить гласные буквы в левую часть, а согласные в правую часть?

Добавлено через 29 минут
забыл написать, запрос строки у пользователя через printf...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2010, 03:06     Сортировка строки
Посмотрите здесь:

C++ Сортировка строки
Строки.Сортировка C++
C++ Сортировка строки матрицы
C++ Сортировка строки матрицы
Сортировка строки матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
+c+
112 / 22 / 3
Регистрация: 20.11.2010
Сообщений: 1,294
23.11.2010, 09:16     Сортировка строки #4
Вот это очень важно замечание, ага
да, замечание важное , сложно было бы решить задачку.
Nameless One а напиши плиз комменты, хотя бы вкратце! Я просто недавно начал изучать С++ и интерестны коды. Ведь не один человек смотрит решение! Половину я понял конечно!
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
23.11.2010, 09:44     Сортировка строки #5

Не по теме:

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



Для сортировки используется стандартная функция 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, если вхождений нет.
Подробнее про использованные функции смотри здесь
Kardinal264
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 минуты
ни у кого нет идей?
Yandex
Объявления
01.12.2010, 20:04     Сортировка строки
Ответ Создать тему
Опции темы

Текущее время: 21:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru