Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/352: Рейтинг темы: голосов - 352, средняя оценка - 4.97
1 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 45
1

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

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

Author24 — интернет-сервис помощи студентам
Написать фрагмент кода, который считывает количество букв в введённой строке.
И дополнительный код для нахождения количества определённой буквы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2017, 00:13
Ответы с готовыми решениями:

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

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

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

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

13
36 / 35 / 17
Регистрация: 15.06.2017
Сообщений: 184
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
2305 / 1131 / 702
Регистрация: 25.04.2016
Сообщений: 3,220
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;
}
2
36 / 35 / 17
Регистрация: 15.06.2017
Сообщений: 184
11.11.2017, 08:32 4
stake-k26, а пробелы, знаки препинания и т.д. тоже за буквы считаем?
0
2305 / 1131 / 702
Регистрация: 25.04.2016
Сообщений: 3,220
11.11.2017, 08:48 5
Roddog2017, а чем вам пробелы и знаки препинания не угодили? Это точно такие же символы.
0
36 / 35 / 17
Регистрация: 15.06.2017
Сообщений: 184
11.11.2017, 08:55 6
В задании стоит подсчет букв
0
1 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 45
11.11.2017, 20:41  [ТС] 7
Одно плохо- что пробел тоже как за символ считается.
0
2305 / 1131 / 702
Регистрация: 25.04.2016
Сообщений: 3,220
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
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 61
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
2305 / 1131 / 702
Регистрация: 25.04.2016
Сообщений: 3,220
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
1287 / 880 / 254
Регистрация: 30.06.2015
Сообщений: 4,592
Записей в блоге: 51
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
2305 / 1131 / 702
Регистрация: 25.04.2016
Сообщений: 3,220
09.06.2018, 14:07 12
CoderHuligan, для кода, который вы видите в примере, нет нужды извращаться с защитой для дурака - такой защитой является сама структура кода, да вы правы, в каких-то других случаях макрос не сработает и его придется изменить, но где в задании эти самые "другие случаи"? Я их не вижу. А вы?
0
1287 / 880 / 254
Регистрация: 30.06.2015
Сообщений: 4,592
Записей в блоге: 51
09.06.2018, 14:12 13
Цитата Сообщение от stake-k26 Посмотреть сообщение
но где в задании эти самые "другие случаи"?
stake-k26,
я просто, - ради искусства.
0
2305 / 1131 / 702
Регистрация: 25.04.2016
Сообщений: 3,220
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 хранить.
2
09.06.2018, 15:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2018, 15:15
Помогаю со студенческими работами здесь

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

Подсчёт в строке слов, состоящих только из русских букв
задание Подсчёт в строке слов, состоящих только из русских букв #include &lt;stdio.h&gt; int f(char*);...

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru