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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Неправильно считает значение по модулю http://www.cyberforum.ru/cpp-beginners/thread554391.html
#include "stdafx.h" #include <conio.h> #include <math.h> #include <stdlib.h> #include <iostream> using namespace std; int main() {int i,j; const int n=8,m=10; float a;
C++ Переделать класс в шаблонный класс Как данный процесс проделать? Я попробовал так по синтаксису из учебника: #include <iostream> #include <fstream> using namespace std; template <class T> http://www.cyberforum.ru/cpp-beginners/thread554389.html
C++ Считывание и запись чисел в gmp библиотеке
Скачал отсюда библиотеку static GMP library and header file for Visual C++ поместил gmp.h в VC и gmp.lib в VC/lib, настроил Visual Studio для работы с библиотекой, разобрался как работать с большими числами при помощи руководства(умножать делить логарифмы брать и т.д.) НО понял как это делать только путём считывания числа из файла, т.е. одно число в одном файле, другое в другом, умножил -...
Наследование дескриптора семафора другими процессами C++
Доброго времени суток, проблема в следующем: пишу приложение, которое использует семафоры. Мне нужно, чтобы дескриптор семафора мог наследоваться другими процессами, т.е если я 1 раз создал семафор в программе и не убил его, то при открытии другой копии этой программы она могла получить доступ к уже созданному семафору. HANDLE WINAPI CreateSemaphore( __in_opt LPSECURITY_ATTRIBUTES...
C++ Какие бывают виды указателей http://www.cyberforum.ru/cpp-beginners/thread554355.html
Какие бывают виды указателей а то что не могу найти надо 4 вида.
C++ Почему в матрице нули выдаёт #include "stdafx.h" #include <conio.h> #include <math.h> #include <stdlib.h> int main() {int i,j; const int n=8,m=10; float a; for (i=0;i<n;i++) { подробнее

Показать сообщение отдельно
Federal_kaz
Сообщений: n/a
21.04.2012, 16:07     Определить частоту вхождений символов алфавита в строку.
Здравствуйте! Пишу курсовую. Уже который день подряд не могу додуматься как реализовать последнюю функцию свой программы.

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

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;
}
Изменил под свои данные и вуаля, курсач почти готов)))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru