Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Schweigert
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 22
1

Подсчет букв в строке (без учета регистра)

07.06.2018, 18:13. Просмотров 978. Ответов 19

День добрый! Очередное задания и опять не могу понять как сделать!


1. Необходимо сосчитать колличество определенных букв в строке. Все сделал все работает, но функция чувствительна к регистру. Если необходимо подсчитать колличестов "а", то "А" он уже не берет в расчет. Как это исправить?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned int characterRate(const char *src, char target)
{
 
    int i,k=0;
    for(i=0; src[i]!=0; i++)
    {
        if(src[i] == '\n' || src[i] == '\0')
 
            break;
 
        if(src[i]==target)
            k++;
    }
    return k;
 
}
2. Необходимо написать функцию void characterFrequencies(const char* src, char *alphabet, unsigned int *frequency) которая:
а. Считает все буквы из alphabet , которые встречаются в src. К примеру src[] = "Hallo World!" , alphabet[] = {l,o} буква "l" встречается 3 раза, буква "о" два раза.
в. Параметр frequency это массив sizeof(alphabet) в нем необходимо разместить частоту встречающихся букв, каждое место "i" в массиве соответствует месту букве в alphabet. "a" занимает первое место в алфавиет, на первом месте ставим сколько раз буква "а" встречается, буква "в" стоит на втором месте, на второе место в массиве ставим сколько раз встретилась эта буква и так далее.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2018, 18:13
Ответы с готовыми решениями:

Подсчитать количество гласных и согласных букв в строке без учета регистра
помогите написать программу на СИ. Пользователь вводит с клавиатуры строку S....

Дан символьный файл. Найти в нем слова, в которые буква "a" входит не менее 2х раз (без учета регистра)
Дан символьный файл. Найти в нем слова в которые буква "a" входит не менее 2х...

Подсчет букв в строке
Написать фрагмент кода, который считывает количество букв в введённой строке....

Подсчет букв в строке
нужно, чтобы кроме введенных букв ничего не подсчитывал, например,ни от F1 до...

Подсчет количества букв в строке
Нужно написать программу, которая будет считать количество введенных букв, но...

19
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
07.06.2018, 18:17 2
Привести все буквы к одному регистру не судьба?
0
Schweigert
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 22
08.06.2018, 10:53  [ТС] 3
SlavaSokolov, как?

Добавлено через 13 часов 50 минут
SlavaSokolov, Так как это сделать, если строка const char *src является константой. Компилятор ругается на любое изменение этой строки!
0
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
08.06.2018, 10:58 4
Schweigert, откройте acii таблицу и посмотрите разницу между кодами верхнего и нижнего регистра. Если правильно помню, то это 32. Дальше немного подумайте и готово.
И да, в СИ нет const...
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26337 / 17667 / 6998
Регистрация: 22.10.2011
Сообщений: 31,083
Записей в блоге: 6
08.06.2018, 11:36 5
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
И да, в СИ нет const...
Застрял в 89-ом? В C90 и дальше - уже есть...
0
SlavaSokolov
08.06.2018, 11:40
  #6

Не по теме:

Цитата Сообщение от volvo Посмотреть сообщение
Застрял в 89-ом? В C90 и дальше - уже есть...
Почему застрял? Я там живу. А если серьёзно, то хватит дезинформировать общественность. У меня нет = не существует.

0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26337 / 17667 / 6998
Регистрация: 22.10.2011
Сообщений: 31,083
Записей в блоге: 6
08.06.2018, 11:43 7
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
У меня нет = нет нигде.
Есть специально обученные врачи, которые тебе помогут понизить ЧСВ. Обратись к ним как можно скорее.
0
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
08.06.2018, 11:57 8
Лучший ответ Сообщение было отмечено Schweigert как решение

Решение

Не по теме:

Цитата Сообщение от volvo Посмотреть сообщение
Обратись к ним как можно скорее.
Они отказались. Сказали, что слишком запущенный случай...



Добавлено через 7 минут
Schweigert,
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
unsigned int characterRate(const char *src, char target)
{
 
    int i, k = 0;
    for (i = 0; src[i] != 0; i++)
    {
        if (src[i] == '\n' || src[i] == '\0')
 
            break;
 
        if (target >= 97 && src[i] >= 97)
        {
            if (target == src[i])
                k++;
        }
        else if (target >= 97 && src[i] <= 90)
        {
            if (target - 32 == src[i])
                k++;
        }
        else
        {
            if (target + 32 == src[i])
                k++;
        }
            
    }
    return k;
 
}
0
DobroAlex
Модератор
392 / 334 / 165
Регистрация: 30.04.2016
Сообщений: 1,719
Завершенные тесты: 3
08.06.2018, 12:28 9
SlavaSokolov, в Си есть конст, почитайте драфт с99.
 Комментарий модератора 
И не надо строчить жалобы по этому поводу: незнание ваше или оппонента -- не нарушение правил форума
0
Вложения
Тип файла: pdf n1256.pdf (3.61 Мб, 6 просмотров)
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
08.06.2018, 12:40 10

Не по теме:

DobroAlex, вы серьёзно? Я же тупо смеюсь. Я спутал с объявлением констант, которые вроде невозможно сделать как в ++?


А за сие документ спасибо.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8098 / 4950 / 1434
Регистрация: 29.11.2010
Сообщений: 13,432
08.06.2018, 13:04 11
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
в СИ нет const
Сильное заявление.
Он есть, но служит для пометки переменных как read only. С помощью него создавать константы времени компиляции, в отличие от С++.

Аккуратнее с выражениями, а то можете
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
дезинформировать общественность
1
MrGluck
Модератор
Эксперт CЭксперт С++
8098 / 4950 / 1434
Регистрация: 29.11.2010
Сообщений: 13,432
08.06.2018, 13:10 12
Взято из ANSI/ISO 9899-1990 (ANSI C)
Подсчет букв в строке (без учета регистра)


В разделе АСМ вас бы за такое убили, наверное
0
SlavaSokolov
08.06.2018, 13:22
  #13

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
В разделе АСМ вас бы за такое убили, наверное
Сомневаюсь... Ну по кукарекали часик-два, а потом поняли, что я прав.:)

0
Schweigert
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 22
08.06.2018, 21:43  [ТС] 14
SlavaSokolov, не поможешь мне со вторым заданием?
написать функция void characterFrequencies(const char* src, char *alphabet, unsigned int *frequency) которая ищет все буквы *alphabet в строке src и ставит в массив frequency по алфавиту. Т.е. frequency[0] соответсвует букве "a" и колличесвто "а" встречающихся в тексте
0
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
08.06.2018, 22:17 15
Schweigert, протестите
Кликните здесь для просмотра всего текста
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
void characterFrequencies(const char* src, char *alphabet, unsigned int *frequency)
{
    int a = 0, b, k;
    while (alphabet[a] != '\0')
    {
        b = 0, k = 0;
        while (src[b] != '\0')
        {
            if (src[b] >= 97 && alphabet[a] >= 97)
            {
                if (src[b] == alphabet[a])
                    k++;
            }
            else if (src[b] >= 97 && alphabet[a] <= 90)
            {
                if (src[b] - 32 == alphabet[a])
                    k++;
            }
            else
            {
                if (src[b] + 32 == alphabet[a])
                    k++;
            }
        }
 
        frequency[a] = k;
    }
}


Первое число частоты соответствует первой букве из alphabet и т.д.

Добавлено через 7 минут
Schweigert, там уже ошибка...
Кликните здесь для просмотра всего текста
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
void characterFrequencies(const char* src, char *alphabet, unsigned int *frequency)
{
    int a = 0, b, k;
    while (alphabet[a] != '\0')
    {
        b = 0, k = 0;
        while (src[b++] != '\0')
        {
            if (src[b] >= 97 && alphabet[a] >= 97)
            {
                if (src[b] == alphabet[a])
                    k++;
            }
            else if (src[b] >= 97 && alphabet[a] <= 90)
            {
                if (src[b] - 32 == alphabet[a])
                    k++;
            }
            else
            {
                if (src[b] + 32 == alphabet[a])
                    k++;
            }
        }
 
        frequency[a++] = k;
    }
}
0
Schweigert
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 22
10.06.2018, 21:46  [ТС] 16
я не могу разобрать, почему он вставляет "1" через один???

H('a') = 68
H('b') = 1
H('c') = 6
H('d') = 1
H('e') = 32
H('f') = 1
H('g') = 25
H('h') = 1
H('i') = 119
H('j') = 1
H('k') = 6
H('l') = 1
H('m') = 13
H('n') = 1
H('o') = 5
H('p') = 1
H('q') = 82
H('r') = 1
H('s') = 3
H('t') = 1
H('u') = 0
H('v') = 1
H('w') = 53
H('x') = 1
H('y') = 48
H('z') = 1

Добавлено через 19 секунд
SlavaSokolov, откуда она вообще взялась?
0
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
10.06.2018, 22:04 17
Schweigert, без понятия.
0
Schweigert
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 22
10.06.2018, 22:12  [ТС] 18
SlavaSokolov, все, работает! Спасибо большое!

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
unsigned int characterRate(const char *src, char target);
void characterFrequencies(const char* src, char *alphabet, unsigned int *frequency);
 
int main()
{
    char src[] = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.";
    char target;
    char alphabet[] = {'a' ,'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    unsigned int frequency[27];
    printf("Welche Buchstaben?\n");
    scanf("%c", &target);
    printf("%c\n", target);
 
 
 
    characterRate(src, target);
    {
        printf("Rate:%d\n", characterRate(src,target));
    }
 
    characterFrequencies(src, alphabet, frequency);
    {
        for (int i=0; i<26; i++)
 
 printf("H('%c') = %d\n", i+'a', frequency[i]);
    }
 
}
 
 
unsigned int characterRate(const char *src, char target)
{
    int k=0;
 
    for(int i =0; (i< strlen(src) || isalpha(src[i])); ++i)
    {
        if(src[i] == '\n' || src[i] == '\0' )
 
            return 0;
 
        if( tolower(src[i])==target || toupper(src[i])==target)
 
            ++k;
 
    }
    return k;
 
 
}
 
void characterFrequencies(const char* src, char *alphabet, unsigned int *frequency)
{
    int a = 0, b, k;
    while (alphabet[a] != '\0')
    {
        b = 0, k = 0;
        while (src[b++] != '\0')
        {
            if (src[b] >= 97 && alphabet[a] >= 97)
            {
                if (src[b] == alphabet[a])
                    k++;
            }
            else if (src[b] >= 97 && alphabet[a] <= 90)
            {
                if (src[b] - 32 == alphabet[a])
                    k++;
            }
            else
            {
                if (src[b] + 32 == alphabet[a])
                    k++;
            }
        }
 
        frequency[a++] = k;
    }
}
0
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
10.06.2018, 22:22 19
Schweigert, так в чём проблема была? Функцию я правильную дал или нет?
0
Schweigert
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 22
10.06.2018, 22:28  [ТС] 20
SlavaSokolov,
да, все правильно. В main.c я указал char alphabet[] = "a b c d e f g h i j k l m n o p q r s t u v w x y z"; т функция посчитала каждый пробел и поставила "1", потом я исправил на char alphabet[] = {'a' ,'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; и все встало на свои места!
0
10.06.2018, 22:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2018, 22:28

Подсчет количества шипящих букв в строке
Смогли бы помочь? 1. Подсчет количества шипящих букв в строке (Си)

Замена букв независимо от регистра
Проблема в том, что прога заменяет только заглавные буквы, т.е буквы zwx она не...

Вывести на экран, сколько букв «Р» в длинной строке, и сколько букв «R» в короткой строке
Программа вводит две строки. Вывести на экран, сколько букв «Р» в длинной...


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

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

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