Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

21.04.2012, 16:07. Просмотров 1388. Ответов 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++):

Подсчитать в процентах частоту вхождений Букв, Цифр и Остальных символов (включая пробелы). Использовать file.get(s) - C++
Подскажите в чем ошибка? если есть можно исправленный код?:) #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int...

Дана строка символов. Подсчитать общее число вхождений символов .,+ в строку - C++
Здравствуйте. Дана строка символов. Подсчитать общее число вхождений символов .,+ в строку. Как такую программу сделать? Заранее спасибо за...

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

Количество вхождений всех символов в строку - C++
Видел похожую тему, но там задача была проще, так как надо было найти конкретный символ. В моем случае строка вводится пользователем....

Подсчитать количество вхождений в строку определенных символов - C++
Помогите написать программу... Данная строка символов S. Подсчитать : а ) сколько раз среди данных символов встречается символ + и...

Определить частоту встречаемости символов в строке - C++
1.Определить частоту встречаемости символов в строке. 2.Определить значение логического выражения введенного в виде строки без скобок. ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 16:07
Привет! Вот еще темы с ответами:

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

Вывод числа вхождений каждого из символов первой строки во вторую строку - C++
Вопрос в названии темы, заранее спс

Ввести строку символов и заменить большие буквы английского алфавита в диапазоне от ‘G’ до ‘V’ на маленькие - C++
Помогите выполнить задание: Ввести строку символов и заменить большие буквы английского алфавита в диапазоне от ‘G’ до ‘V’ на маленькие....

Определить число вхождений символов в предложение - C++
Дано предложение. Определить: а) число вхождений в него буквосочетания &quot;ро&quot;; б) число вхождений в него некоторого буквосочетания из...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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