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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VLAD1M1R
0 / 0 / 0
Регистрация: 04.11.2009
Сообщений: 55
#1

Отсортировать слова по длине - C++

23.01.2010, 12:40. Просмотров 678. Ответов 8
Метки нет (Все метки)

Здравствуйте, у меня есть задание с таким условием: "Есть файл со словами. Вывести на экран все слова в которых количество гласных, стоящих на позициях с четными и нечетными номерами одинакова. Слова отсортировать по длине." Буду очень благодарен, если поможете написать код программы...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2010, 12:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отсортировать слова по длине (C++):

Отсортировать слова по длине - C++
Вот условие программы: "Есть файл со словами. Вывести на экран все слова в которых количество гласных, стоящих на позициях с четными и...

Отсортировать слова в предложении по их длине,начиная с наибольшего - C++
отсортировать слова в предложении по их длине,начиная с наибольшего

Сортировка строки по длине слова - C++
Сабж. Здравствуйте. Есть код, который вроде логически построен правильно, но он не работает. Уже не знаю как быть. Подскажите пожалуйста в...

Сортировка слов в строке по длине слова - C++
Помогите пожалуйста с алгоритмом сортировки строки. Необходимо осуществить сортировку строки чтобы в начале строки располагалось слово...

Сортировка строк по длине первого слова - C++
Добрый вечер формучане.Облазил весь нет как и этот форум но толком ничего не нашел.Собственно обращаюсь с просьбой решить эту задачку....

Дополнить каждое слово предложения пробелами (по длине максимального слова) - C++
Вот задачка. "Дополнить каждое слово предложения пробелами так, чтобы его длина была равна длине самого длинного слова. Распечатать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
qwarta
73 / 73 / 7
Регистрация: 20.11.2009
Сообщений: 238
30.01.2010, 18:24 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хотел помочь VLAD1M1R с решением, да так и застрял. Может кто подскажет:

1. Почему вывод вроде бы делается правильно, но с лишними символами?
язва#
инфекционноеx☺=
группы=
животного☺=
язвой☺=
группы= животного☺= инфекционноеx☺= язва# язвой☺=
В результате не работает сортировка. В процессе написания программы в строке 81 применял одномерный массив mas[k] и вывод был правильным.

2. Нужно отсекать символы кавычек. Как их вставить в строку if(!strchr(",.!?-:;()",ch))

Вот код:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//Есть файл со словами. Вывести на экран все слова, в которых количество гласных, стоящих на 
//позициях с четными и нечетными номерами одинакова. Слова отсортировать по длине.
 
#include <stdio.h>
#include <windows.h>
#define MAX 20
 
int main(void)
{
  char str[MAX],mas[MAX][MAX],buf[MAX],ch;
  int i,k,len,chet,nechet,cout;
  FILE *fp;
 
  char* Rus(char *message)                            // для вывода русского текста
  {
        CharToOem(message, buf);
        return buf;
  }
 
  void qsort_st(char ftm[][MAX],int left, int right)      // сортировка строк методом Хоара
  {
   register int i,j;
   char *st;
   char temp[MAX];
   
   i=left; j=right;
   st=ftm[(left+right)/2];
   
   do {
     while((strcmp(ftm[i],st)<0) && (i<right)) i++;
     while((strcmp(ftm[j],st)>0) &&(j>left)) j--;
     if(i<=j)
     {
       strcpy(temp,ftm[i]);
       strcpy(ftm[i],ftm[j]);
       strcpy(ftm[j],temp);
       i++;
       j--;
     }
   }while(i<j);
   if(left<j) qsort_st(ftm,left,j);
   if(i<right) qsort_st(ftm,i,right);
  }
 
  if((fp=fopen("F.txt","r"))==NULL)
  {
    printf("Error opening file!\n");
    exit(1);
  }
  i=k=len=chet=nechet=cout=0;
 
  while (!feof(fp))                          // пока не достигнут конец файла
  {
    ch=getc(fp);
    if(ch==' ' || ch=='\n' || ch=='\t')      // разделяем на слова
    {
      if(len>1)                              // пропускаем однобуквенные союзы
      {
        str[i]='\0';
        for(i=0;i<len;i++)
        {
          if(strchr("аеиоуыэюя",str[i]))     // считаем гласные
          {
            cout=i+1;
            if(!(cout%2))                    // если на четной позиции
              chet++;
            else                             // если на нечетной позиции
              nechet++; 
          }
        }
        if((chet != 0) && (chet==nechet))    // если кол-во гласных одинаковое
        {
          for(i=0;i<len;i++)
          {
            if(i>MAX-1)
            {
              printf(Rus("Превышение отведенного лимита букв для слова"));
              exit(1);
            }
            mas[k][i]=str[i];                   // записываем слово
          }
//---------- в рабочей программе этого не нужно - промежуточный вывод -------------------
          printf("%s\n",Rus(mas[k]));
//--------------------------------------------------------------------------------------- 
          k++;
          if(k==MAX-1)
          {
              printf(Rus("Нужно увеличить объем массива для чтения!"));
              exit(1);
          }
        }
      }
      i=len=chet=nechet=0;
    }
    else
    {
      if(!strchr(",.!?-:;()",ch))             // если знак препинания - пропускаем его
      {
        str[i]=ch;                          // иначе записываем символ в массив
        i++;
        len++;
      }
    }
  }
  qsort_st(mas,0,k-1);                         // сортируем слова по длине
  for(i=0;i<k;i++)
  {
    printf("%s  ",Rus(mas[i]));
  }
  fclose(fp);
  getch();
  return 0;
}
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
30.01.2010, 19:56 #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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
    
/*
    Есть файл со словами. Вывести на экран все слова в которых количество гласных, 
    стоящих на позициях с четными и нечетными номерами одинакова. Слова отсортировать по длине.
*/
 
/* возвращает 0 если чётных и нечётных гласных поровну и больше нуля */
int vowBalance(const char *s){
    static const char VOWELS[] = "AEIOU";
    const char *p;
    int odd = 0, even = 0;
    
    for ( p = s; *p; ++p ){
        if ( strchr(VOWELS, toupper(*p)) ){
            if ( ( p - s ) & 1 )
                ++odd;
            else
                ++even;
        }
    }
    if ( !odd && !even )
        return EOF;
    return odd - even;
}
 
/* сравнивалка длинн */
int lencmp(const void *a, const void *b){
    return strlen(*(char**)a) - strlen(*(char**)b);
}
 
#define FILE_NAME "testwords.txt"
 
int main(void){
    char buf[BUFSIZ], **words;
    int i, cnt;
    FILE *f;
    
    if ( ( f = fopen(FILE_NAME, "r") ) == NULL ){
        fprintf(stderr, "Can't open file <%s> for input!\n", FILE_NAME);
        exit(1);
    }
    
    words = NULL;
    cnt = 0;
    
    while ( fscanf(f, "%s", buf) == 1 ){
        if ( !vowBalance(buf) ){
            if ( ( words = (char**)realloc(words, sizeof(char*) * (cnt + 1)) ) == NULL ){
                fprintf(stderr, "Bad memory!\n");
                exit(1);
            }
            if ( ( words[cnt] = strdup(buf) ) == NULL ){
                fprintf(stderr, "Bad memory!\n");
                exit(1);
            }
            ++cnt;
        }
    }
    if ( ferror(f) ){
        fprintf(stderr, "Error while reading file <%s>\n", FILE_NAME);
        exit(1);
    }
    fclose(f);
    if ( !words ){
        fprintf(stderr, "Can't find some good words!\n");
        exit(1);
    }
    
    qsort(words, cnt, sizeof(char*), lencmp);
    for ( i = 0; i < cnt; ++i )
        printf("%s\n", words[i]);
    
    for ( i = 0; i < cnt; ++i )
        free(words[i]);
    free(words);
    exit(0);
}
testwords.txt
Код
It is a good day to die
выводит
Код
die
good
qwarta
73 / 73 / 7
Регистрация: 20.11.2009
Сообщений: 238
30.01.2010, 20:42 #4
Однако нужно немного доделать, т.к.пропускает лишние знаки (скобки,точки и т.д.).

А чем плох мой код? Хотелось бы узнать мнение более опытных "товарищей по цеху". Неужели так сильно нагородил?
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
30.01.2010, 21:12 #5
Цитата Сообщение от qwarta Посмотреть сообщение
Хотел помочь VLAD1M1R с решением, да так и застрял. Может кто подскажет:

1. Почему вывод вроде бы делается правильно, но с лишними символами?

В результате не работает сортировка. В процессе написания программы в строке 81 применял одномерный массив mas[k] и вывод был правильным.
А вы не забыли, что строка должна оканчиваться символом \0? Проблема в этом.
qwarta
73 / 73 / 7
Регистрация: 20.11.2009
Сообщений: 238
30.01.2010, 21:18 #6
Пробовал устраивать проверку на этот символ и выход из цикла вывода массива - результат тот же.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
30.01.2010, 21:37 #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от qwarta Посмотреть сообщение
Однако нужно немного доделать, т.к.пропускает лишние знаки (скобки,точки и т.д.).
Однако предупреждать надо! Вот
так
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
    
/*
    Есть файл со словами. Вывести на экран все слова в которых количество гласных, 
    стоящих на позициях с четными и нечетными номерами одинакова. Слова отсортировать по длине.
*/
 
/* возвращает 0 если чётных и нечётных гласных поровну и больше нуля */
int vowBalance(const char *s){
    static const char VOWELS[] = "AEIOU";
    const char *p;
    int odd = 0, even = 0;
    
    for ( p = s; *p; ++p ){
        if ( strchr(VOWELS, toupper(*p)) ){
            if ( ( p - s ) & 1 )
                ++odd;
            else
                ++even;
        }
    }
    if ( !odd && !even )
        return EOF;
    return odd - even;
}
 
/* сравнивалка длинн */
int lencmp(const void *a, const void *b){
    return strlen(*(char**)a) - strlen(*(char**)b);
}
 
/* удалялка скобок и прочей байды */
char *clearWord(char *s){
    char *head, *tail;
    for ( head = s; *head && !isalpha(*head); ++head )
        ;
    for ( tail = s + strlen(s) - 1; tail >= head && !isalpha(*tail); --tail )
        ;
    *(tail + 1) = 0;
    return head;
}
 
#define FILE_NAME "testwords.txt"
 
int main(void){
    char buf[BUFSIZ], **words, *wrd;
    int i, cnt;
    FILE *f;
    
    if ( ( f = fopen(FILE_NAME, "r") ) == NULL ){
        fprintf(stderr, "Can't open file <%s> for input!\n", FILE_NAME);
        exit(1);
    }
    
    words = NULL;
    cnt = 0;
    
    while ( fscanf(f, "%s", buf) == 1 ){
        wrd = clearWord(buf);
        if ( !vowBalance(wrd) ){
            if ( ( words = (char**)realloc(words, sizeof(char*) * (cnt + 1)) ) == NULL ){
                fprintf(stderr, "Bad memory!\n");
                exit(1);
            }
            if ( ( words[cnt] = strdup(wrd) ) == NULL ){
                fprintf(stderr, "Bad memory!\n");
                exit(1);
            }
            ++cnt;
        }
    }
    if ( ferror(f) ){
        fprintf(stderr, "Error while reading file <%s>\n", FILE_NAME);
        exit(1);
    }
    fclose(f);
    if ( !words ){
        fprintf(stderr, "Can't find some good words!\n");
        exit(1);
    }
    
    qsort(words, cnt, sizeof(char*), lencmp);
    for ( i = 0; i < cnt; ++i )
        printf("%s\n", words[i]);
    
    for ( i = 0; i < cnt; ++i )
        free(words[i]);
    free(words);
    exit(0);
}
не пропускает

Цитата Сообщение от qwarta Посмотреть сообщение
А чем плох мой код?
Да там чёрт ногу сломит! (Простите, конечно...)
qwarta
73 / 73 / 7
Регистрация: 20.11.2009
Сообщений: 238
30.01.2010, 21:44 #8
Ну что же, отрицательный результат все же результат. Не ошибается тот, кто ничего не делает. Будем работать!
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
30.01.2010, 22:01 #9
Цитата Сообщение от qwarta Посмотреть сообщение
Ну что же, отрицательный результат все же результат. Не ошибается тот, кто ничего не делает. Будем работать!
Вот это правильный подход! В конце-концов и у меня решение далеко не идеальное, можно лучше сделать. Если позволите, два совета:
1. Старайтесь разбивать задачу на более мелкие и выносить их в отдельные функции - так нагляднее.
2. Давайте переменным и функциям более содержательные имена. Поскольку писать комментарий к каждой строке лень, понятные имена - верный способ разобраться в своей же программе через какое-то время...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2010, 22:01
Привет! Вот еще темы с ответами:

Получить из файла строки, содержащие четырехбуквенные слова. Слова отсортировать в алфавитном порядке - C++
Задание: Дан текстовый файл, получить строки, содержащие четырехбуквенные слова. Слова отсортировать в алфавитном порядке. Заранее...

В заданной строке вывести все слова по длине попадающие в заданный интервал - C++
Помогите. Вывести на экран все слова, которые встречаются в заданном строке и по длине попадают в заданный интервал. #include...

В строку через пробел вводятся слова. Отсортировать введенные слова по алфавиту. Результат вывести в виде столбца. - C++
В строку через пробел вводятся слова. Отсортировать введенные слова по алфавиту. Результат вывести в виде столбца.

Определить количество слов в тексте, и вывести слова, которые по длине меньше заданного числа - C++
Помогите написать прогу... Не работает..;) /*Дан текст, в котором слова разделяются пробелами, * в конце стоит точка. Определить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.01.2010, 22:01
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru