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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Federal_kaz
Сообщений: n/a
#1

Определить частоту вхождений символов алфавита в строку. - C++

21.04.2012, 16:07. Просмотров 1310. Ответов 0
Метки нет (Все метки)

Здравствуйте! Пишу курсовую. Уже который день подряд не могу додуматься как реализовать последнюю функцию свой программы.

Задание: определение частоты повторений каждого символа алфавита в целом по массиву строк.

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
 
class Stroki {
public:
 
    void input();
    void output();
    bool palindrom();
    char search(char *haystack, char *needle);
    void alphabet();
private:
    char strStroka[255], strMas[255], strAux; //строковые переменные
    int size1, size2;
};
 
void Stroki::input(){
    do {
        system("cls"); //очистка экрана
        cout << "Vvedite stroku: " << endl;
        fflush(stdin); //очистка буфера с клавиатуры
        gets(strStroka);
        cout << "Vi vveli: " << strStroka << endl;
        cout << "Prodoljit'? (Y / n)" << endl;
        cin >> strAux;
    } while (!((strAux == 'y') || (strAux == 'Y')));
}
 
void Stroki::output(){
    system("cls"); //очистка экрана
    cout << strStroka << endl;
}
 
bool Stroki::palindrom(){
    int left_index = 0;
    int right_index = strlen(strStroka)-1;
 
    while ( left_index < right_index ) { 
        if (strStroka[left_index++]!= strStroka[right_index--]) {  
            cout << "False" << endl;
            return false;
        }
    }
        cout << "True" << endl;
        return true;
}
 
char Stroki::search(char *haystack, char *needle) {
    
        int i,j,k, needle_len = 0,haystack_len = 0;
        int needle_table[256];
 
        for (char *p = needle; *p; *p++)
                ++needle_len;
        for (char *p = haystack; *p; *p++)
                ++haystack_len;
 
        if (needle_len < haystack_len)
        {
                for (i = 0; i < 256; i++)
                        needle_table[i] = needle_len;
 
                for (i = 1; i < needle_len; i++)
                        needle_table[needle[i-1]] = needle_len-i;
 
                i = needle_len;
                j = i;
 
                while (j > 0 && i <= haystack_len)
                {
                        j = needle_len;
                        k = i;
                        while (j > 0 && haystack[k-1] == needle[j-1])
                        {
                                --k;
                                --j;
                        }
                        i+=needle_table[haystack[i-1]];
                }
 
                if (k > haystack_len - needle_len) {
                    cout << "False!" << endl;    
                    return 0;
                }
                else {
                    cout << k+1 << " - " << needle << endl; // выводим позицию и сам запрос
                    return k+1;
                }
        }
        else return 0;
}
 
void Stroki::alphabet() {
    cout << "Test alphabet!!!" << strStroka << endl;
    int i, k, count;
    char aux, alpha[40];
    char num[40];
    k=0;
    for (i=0;strStroka[i]!='\0';i++) {// начинаем перебирать строку
        aux = strStroka[i];
        for (k=0;k<=i;k++) {
            if (aux == alpha[k]) { 
                num[k] += 1;
            }
            else {
                alpha[i] = aux;
                num[i] += 1;
            }
        }
    }
 
    cout << "Vhojdeniya:" << endl;
    for (int j=0;j<=(i-1);j++) {
        cout << alpha[j] << " - " << num[j] << endl;
    }
    
}
 
char main() {
    int n;
    char strMas[255], string[255], word[250];
    Stroki strText;
    
    strText.input();
    strText.output();
    strText.palindrom();
    
    cout << "Poisk: " << endl;
    cout << "Vvedite stroku v kotoroi proizvedem poisk: ";
    fflush(stdin);
    gets(string);
    cout << "Vvedite slovo kotoroe budem iskat': ";
    fflush(stdin);
    gets(word);
    strText.search(string, word);
    strText.alphabet();
    _getch();
}
Проблема в void Stroki::alphabet(), опишу словами что я делаю в данной функции:
Беру символ строки strStroka, присваиваю его вспомогательной переменной aux. Далее начинаю сравнивать эту переменную с имеющимся набором символов (массивом alpha[]). Если данный символ нашёлся, то прибавляем цифру 1 к элементу массива num[] (в котором по задумке хранится кол-во повторений для определённого символа). Иначе - записываем символ в массив alpha[] с соответствующим индексом и прибавляем 1цу в значение элемента из массива num[] для данного символа.

Но на этапе
C++
1
2
alpha[i] = aux;
num[i] += 1;
получается бред.

Помогите разобраться с этим заданием)))

Добавлено через 27 минут
Было найдено гениальное решение на этом же форуме)))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
main()
{
    int i;
    char s[80], 
         freq[256];  /* массив частот символов */
    
    scanf("%s", s);
    memset(freq, 0, sizeof(freq));
    for(i = 0; s[i] != '\0'; i++)
       freq[s[i]]++;
    for(i = 0; i < sizeof(freq); i++)
       if(freq[i])
          printf("%c - %d\n", i, freq[i]);
    getch();
    return 0;
}
Изменил под свои данные и вуаля, курсач почти готов)))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 16:07     Определить частоту вхождений символов алфавита в строку.
Посмотрите здесь:

C++ Количество вхождений всех символов в строку
C++ Определить частоту встречаемости символов в строке
Определить длину содержащейся в тексте максимальной серии символов, отличных от букв латинского алфавита C++
Определить количество вхождений в строку каждого из знаков, встречающихся в ней 1 или более раз C++
C++ Определить количество вхождений подстроки в заданную строку
Подсчитать в процентах частоту вхождений Букв, Цифр и Остальных символов (включая пробелы). Использовать file.get(s) C++
Определить количество вхождений каждого слова в заданную строку C++
Вывод числа вхождений каждого из символов первой строки во вторую строку C++
C++ Определить число вхождений символов в предложение
C++ Подсчитать количество вхождений в строку определенных символов
Подсчитать количество вхождений в строку заданной последовательности символов C++
C++ Ввести строку символов и заменить большие буквы английского алфавита в диапазоне от ‘G’ до ‘V’ на маленькие

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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