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

Подсчет букв в строке

11.11.2017, 00:13. Просмотров 4823. Ответов 13
Метки нет (Все метки)

Написать фрагмент кода, который считывает количество букв в введённой строке.
И дополнительный код для нахождения количества определённой буквы.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2017, 00:13
Ответы с готовыми решениями:

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

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

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

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

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

13
Roddog2017
35 / 34 / 17
Регистрация: 15.06.2017
Сообщений: 184
Завершенные тесты: 1
11.11.2017, 03:49 2
C++
1
2
3
4
5
6
7
8
char str[]="abcd abcd";
int i,j;
 
   j=0;
    for(i=0; i<strlen(str); i++)
     if(isalpha(str[i])) j++;
 
   printf("Letters %d", j);
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
char str[]="abcd abcd";
char findL='a';
int i,j;
 
   j=0;
    for(i=0; i<strlen(str); i++)
     if(str[i]==findL) j++;
 
   printf("Letter %c %d",findL, j);
0
stake-k26
541 / 413 / 324
Регистрация: 25.04.2016
Сообщений: 1,197
11.11.2017, 08:25 3
Получает строку, возвращает длину этой строки, не считая символа '\0'.
C
1
2
3
4
5
6
int LenString (char * str)
{
    int i = 0;
    while (str[i]) i++;
    return i;
}
Пример использования внутри кода, а не отдельной функцией:
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main (void)
{
    char *s = "Hello, world.";  //строка символов
    int i = 0;                  //счетчик
    while (s[i]) i++;           //пока символ строки не равен 0, считаем
    printf("%i\n", i);          //вывод результата на экран
    return 0;
}
1
Roddog2017
35 / 34 / 17
Регистрация: 15.06.2017
Сообщений: 184
Завершенные тесты: 1
11.11.2017, 08:32 4
stake-k26, а пробелы, знаки препинания и т.д. тоже за буквы считаем?
0
stake-k26
541 / 413 / 324
Регистрация: 25.04.2016
Сообщений: 1,197
11.11.2017, 08:48 5
Roddog2017, а чем вам пробелы и знаки препинания не угодили? Это точно такие же символы.
0
Roddog2017
35 / 34 / 17
Регистрация: 15.06.2017
Сообщений: 184
Завершенные тесты: 1
11.11.2017, 08:55 6
В задании стоит подсчет букв
0
Jerzy12
0 / 0 / 0
Регистрация: 29.10.2017
Сообщений: 26
11.11.2017, 20:41  [ТС] 7
Одно плохо- что пробел тоже как за символ считается.
0
stake-k26
541 / 413 / 324
Регистрация: 25.04.2016
Сообщений: 1,197
11.11.2017, 23:35 8
Цитата Сообщение от Jerzy12 Посмотреть сообщение
Одно плохо- что пробел тоже как за символ считается.
Добавьте еще одну переменную и сделайте исключение, например:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main (void)
{
    char *s = "Hello, world.";
    int i = 0, len = 0;
    while (s[i++])
        if ((s[i-1] >= 'A' && s[i-1] <= 'Z') || (s[i-1] >= 'a' && s[i-1] <= 'z'))
            len++;
    printf("%i\n", len);
    return 0;
}
- будет считать только буквы.

условие if (s[i] != ' ') len++; исключит из подсчета все пробелы. И так далее.
0
Schweigert
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 26
08.06.2018, 10:55 9
stake-k26,
как сделать , что бы считал определенные буквы, но без учета регистра. А то считает только маленькие буквы!

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;
 
}
0
stake-k26
541 / 413 / 324
Регистрация: 25.04.2016
Сообщений: 1,197
09.06.2018, 12:31 10
Schweigert, привести target и каждый символ строки к одному виду символов, например к маленьким буквам. Для этого можно написать свой макрос:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#define lower(k) (k>='A' && k<= 'Z')? (k+'a'-'A') : k;
unsigned int characterRate(const char *src, char target)
{
    int i, k=0;
    char c, t = lower(target);
    for(i=0; src[i]!=0 && src[i]!='\n'; i++)
    {
        c = lower(src[i]);
        if(c == t) k++;
    }
    return k;
}
 
int main (void)
{
    char * s = "This is the test string.";
    char target = 't';
    char target1 = 'T';
    printf("count of symbol %c is: %d\n", target, characterRate(s, target));
    printf("count of symbol %c is: %d\n", target1, characterRate(s, target1));
    return 0;
}
алгоритм которого сводится к:
C
1
if (k>='A' && k<='Z') k = k+'a'-'A';
или воспользоваться готовым макросом tolower() из стандартной библиотеки си:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <ctype.h>
unsigned int characterRate(const char *src, char target)
{
    int i, k=0;
    char c, t = tolower(target);
    for(i=0; src[i]!=0 && src[i]!='\n'; i++)
    {
        c = tolower(src[i]);
        if(c == t) k++;
    }
    return k;
}
 
int main (void)
{
    char * s = "This is the test string.";
    char target = 't';
    char target1 = 'T';
    printf("count of symbol %c is: %d\n", target, characterRate(s, target));
    printf("count of symbol %c is: %d\n", target1, characterRate(s, target1));
    return 0;
}
алгоритм которого точно такой же, просто он уже написан и для его использования достаточно подключить заголовок ctype.h
0
CoderHuligan
811 / 537 / 201
Регистрация: 30.06.2015
Сообщений: 2,996
Записей в блоге: 13
09.06.2018, 13:54 11
С макросами нужно быть осторожным. Лучше вместо:
C
1
#define lower(k) (k>='A' && k<= 'Z')? (k+'a'-'A') : k;
обезопасить себя так:
C
1
#define lower(k) ((k)>='A' && (k)<= 'Z')? ((k)+'a'-'A') : (k) //без завершающей точки с запятой
Но даже тут могут быть проблемы если, например, мы попытаемся вычислить параметр таким образом:
C
1
2
int a = 81;
lower(++a);
тогда сами понимаете что может случится.
Ещё лучше вот так:
C
1
2
3
4
5
6
#define lower(a, k) \
do \
{ \
    int lowerMacro = (k); \
    (a) = ((lowerMacro)>='A' && (lowerMacro)<= 'Z')? ((lowerMacro)+'a'-'A') : (lowerMacro); \
}while(0)
вместо а нужно подставить переменную , в которую записывается результат.
Такой код лучше. Единственный большой недостаток что нельзя подставлять макрос непосредственно в выражение как функцию, но с этим можно смириться.
0
stake-k26
541 / 413 / 324
Регистрация: 25.04.2016
Сообщений: 1,197
09.06.2018, 14:07 12
CoderHuligan, для кода, который вы видите в примере, нет нужды извращаться с защитой для дурака - такой защитой является сама структура кода, да вы правы, в каких-то других случаях макрос не сработает и его придется изменить, но где в задании эти самые "другие случаи"? Я их не вижу. А вы?
0
CoderHuligan
811 / 537 / 201
Регистрация: 30.06.2015
Сообщений: 2,996
Записей в блоге: 13
09.06.2018, 14:12 13
Цитата Сообщение от stake-k26 Посмотреть сообщение
но где в задании эти самые "другие случаи"?
stake-k26,
я просто, - ради искусства.
0
stake-k26
541 / 413 / 324
Регистрация: 25.04.2016
Сообщений: 1,197
09.06.2018, 15:15 14
Лучший ответ Сообщение было отмечено Jerzy12 как решение

Решение

Ну если только для примера.. Тогда тоже исключительно примера ради, вообще без макроса:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
unsigned int characterRate(const char *src, char target)
{
    int i, k=0;
    char c, t = (target >= 'A' && target <= 'Z')? target+'a'-'A' : target;
    for(i=0; src[i]!=0 && src[i]!='\n'; i++)
    {
        c = (src[i] >= 'A' && src[i] <= 'Z')? src[i]+'a'-'A' : src[i];
        if(c == t) k++;
    }
    return k;
}
 
int main (void)
{
    char * s = "This is the test string.";
    char target = 't';
    char target1 = 'T';
    printf("count of symbol %c is: %d\n", target, characterRate(s, target));
    printf("count of symbol %c is: %d\n", target1, characterRate(s, target1));
    return 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
#include <stdio.h>
unsigned int characterRate(const char *src, char target)
{
    int i, k=0;
    char c, t;
    if (target >= 'A' && target <= 'Z') t = target+'a'-'A';
    else t = target;
    for(i=0; src[i]!=0 && src[i]!='\n'; i++)
    {
        if (src[i] >= 'A' && src[i] <= 'Z') c = src[i]+'a'-'A';
        else c = src[i];
        if(c == t) k++;
    }
    return k;
}
 
int main (void)
{
    char * s = "This is the test string.";
    char target = 't';
    char target1 = 'T';
    printf("count of symbol %c is: %d\n", target, characterRate(s, target));
    printf("count of symbol %c is: %d\n", target1, characterRate(s, target1));
    return 0;
}
Добавлено через 53 минуты
или еще как вариант, все средствами стандартной библиотеки:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <ctype.h>
unsigned int characterRate(const char *src, char target)
{
    int i, k=0;
    char c, t = (isupper(target))? tolower(target) : target;
    for(i=0; src[i]!=0 && src[i]!='\n'; i++)
    {
        c = (isupper(src[i]))? tolower(src[i]) : src[i];
        if(c == t) k++;
    }
    return k;
}
 
int main (void)
{
    char * s = "This is the test string.";
    char target = 't';
    char target1 = 'T';
    printf("count of symbol %c is: %d\n", target, characterRate(s, target));
    printf("count of symbol %c is: %d\n", target1, characterRate(s, target1));
    return 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
#include <stdio.h>
#include <ctype.h>
unsigned int characterRate(const char *src, char target)
{
    int i, k=0;
    char c, t = (isupper((int)target))? (char)tolower((int)target) : target;
    for(i=0; src[i]!=0 && src[i]!='\n'; i++)
    {
        c = (isupper((int)src[i]))? (char)tolower((int)src[i]) : src[i];
        if(c == t) k++;
    }
    return k;
}
 
int main (void)
{
    char * s = "This is the test string.";
    char target = 't';
    char target1 = 'T';
    printf("count of symbol %c is: %d\n", target, characterRate(s, target));
    printf("count of symbol %c is: %d\n", target1, characterRate(s, target1));
    return 0;
}
Добавлено через 2 минуты
хотя тут, конечно, лучше все символы изначально в int хранить.
1
09.06.2018, 15:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2018, 15:15

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

В первой строке выписать все первые буквы всех слов, во второй строке — вторых букв
Помогите решить задачу. С клавиатуры вводятся слова через пробел (любой длины и...

Подсчет числа определенных букв
Хочу подсчитать количество букв A и g. Подскажите где ошибка,если не трудно ...


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

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

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