Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Работа со строками на С++

Автор: Rudolf 29.10.2006 17:31

Задача:программа должна выделять в тексте с русскими и английскими словами все русские буквы и определить наиболее часто повторяющиеся из них.
Подскажите можно ли на си++ задать массив 'а' до 'я' целых чисел для подсчета встречающихся букв?

Автор: volvo 29.10.2006 17:38

На С++ - можно... Только боюсь, решение тебе опять не подойдет, ибо это делается с привлечением STL...

Сделай проще: напиши функцию (скажем, LetterIndex()), определяющую порядковый номер буквы в алфавите (организуй строковую константу от 'а' до 'я', и смотри, на каком месте заданная буква встречается в этой строке), и простой массив:

int count[32]; // <--- По количеству букв в алфавите

и делай так:
++count[LetterIndex('д')];

чтобы увеличить счетчик буквы 'д'...

Автор: Rudolf 29.10.2006 20:18

Вот что написал:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>

int LetterIndex(char ch)
{ int i;
const char str[32]="абвгдеёжзийклмнопрстуфхцчшщъьэюя";
for (i=0;i<=32;i++)
if (ch==str[i]) return i;

}
int main(void)
{clrscr();
int i,j,k,count[32],max;
char a[32]="абвгдеёжзийклмнопрстуфхцчшщъьэюя";
char txt[10],rus[10],ch,maxch;

cin>>txt;
for (i=0;i<=9;i++)
for (j=0;j<=32;j++)
if (txt[i]==a[j])
{
k++;
rus[k]=txt[i];
}
for(i=0;i<=k;i++)
cout<<rus[i];
for (i=0;i<=k;i++)
for (j=0;j<=32;j++)
if (rus[i]==a[j]) ++count[LetterIndex(rus[i])];
max=count[0];
for (i=0;i<=32;i++)
if (count[i]>max) maxch=a[i];
cout<<maxch;
getch();
return 0;
}

но теперь не могу проверить, компилятор русские буквы не поддерживает.Может подскажите как это исправить?

Автор: volvo 29.10.2006 20:45

Тогда можно так (но учти, это решение привязано к кодировке... У меня, например, оно работать не будет - кириллицы в таблице символов нет - так что я даю только идею, проверяй сам):

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
#include <stdlib.h>

int LetterIndex(char ch) {
// Буква от "а" до "п" ?
if(ch >= (char)160 && ch <= (char)191) return (ch - 160);
else
// Буква от "р" до "я" ?
if(ch >= (char)224 && ch <= (char)239) return 16 + (ch - 224);
// Значит, вообще не русская буква
return -1;
}

int main(void) {
clrscr();
int i, k = 0, count[32], max, pos;
char txt[10],rus[10],ch,maxch;

cin >> txt;
for(i = 0; i < strlen(txt); ++i) {
if((pos = LetterIndex(txt[i])) > -1)
count[pos] += 1;
rus[++k] = txt[i];
}

maxch = count[0];
for(i=0;i<=32;i++)
if (count[i]>maxch) maxch=count[i];
cout<<maxch;
getch();
return 0;
}