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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
#1

Подсчет латинских букв - C++

14.11.2010, 15:30. Просмотров 1644. Ответов 23
Метки нет (Все метки)

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

Вот листинг

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
#include <iostream>
#include <cctype>
#include <conio.h>
 
using namespace std;
 
int xcount(const int*);//для чисел
int xcount(const char*);//для строк
int main()
{
    int i;
    int mas[] = {1,2,2,23,4,2,12,7,17,777,0};
    char mas1[] = "0x12 absd 123 43h e12 0 12g44 t";
 
    for(i=0; mas[i]!=0;++i) {
      cout << mas[i] << ' ' ;
    }
    cout << "<<<< " <<  xcount (mas) << " >>>>" <<endl;
    cout<<"__________________________________________"<<endl;
 
    cout << mas1 << "<<<< " <<  xcount (mas1) << " >>>>" << endl;
 
 
    return 0;
}
 
int xcount(const int*mas)
{
 
 int i, status = 0, n=0;
 for(i=0; mas[i]!=0;++i)
 {
     if (!(mas[i]&1) && status)
     {
       ++n;
     }
     status = mas[i] & 1;
}
 
      if (status)
 
       {
         ++n;
       }
 
return n;
}
 
int xcount(const char*mas1)
{
int i,c=0,status=0,status1=0;
 
 
  for(i=0; mas1[i]!=0;++i)
 
{
    if ((isspace(mas1[i]))&& status)
      {
       ++c;
      }
 
     status = (!isspace(mas1[i]));
 
}
     if (status)
 
       {
         ++c;
       }
 
     if (isalpha(mas1[i])&& status )
        {
         ++c;
        }
 
        status1 = (!isalpha(mas1[i]));
 
 
 
return c;
}
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2010, 15:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчет латинских букв (C++):

Подсчитать, сколько было введено: латинских прописных букв, кириллических прописных букв, цифр, знаков переноса, прочих символов. - C++
Помогите, пожалуйста, написать программу :scratch: Подсчитать, сколько было введено: латинских прописных букв, кириллических прописных...

Вывод латинских букв - C++
Подскажите, какую команду использовать для вывода букв?

Сортировка массива латинских букв - C++
набор латинских букв упорядочить по алфавиту Использовать следующие алгоритмы: сортировкой выбором, быструю сортировку Массив...

Определить число латинских букв в строке - C++
Я не знаю как сделать эту задачу. Прошу помочь.

Посчитать количество латинских букв на странице текста - C++
как посчитать число латинских букв на странице текста

Дана строка подсчитать количество латинских букв - C++
Дана строка подсчитать количество латинских букв.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.11.2010, 00:28 #16
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
#include <stdio.h>
 
size_t max_oddseq_array(int arr[], size_t nobj);
 
int main(void)
{
    int n[10] = { 1, 1, 2, 3, 5, 5, 6, 7, 9 };
    
    printf("%u" "\n", max_oddseq_array(n, 10));
    
    return 0;
}
 
size_t max_oddseq_array(int arr[], size_t nobj)
{
    size_t seqmax, count;
    size_t i;
    
    seqmax = count = 0;
    for (i = 0; i < nobj; i++)
        if (arr[i] % 2 != 0) {
            count++;
            if (i + 1 == nobj && count > seqmax)
                seqmax = count;
        } else {
            if (count > seqmax)
                seqmax = count;
            count = 0;
        }
    return seqmax;
}
 
#if 0
size_t max_oddseq_array(int arr[], size_t nobj)
{
    size_t seqmax, count;
    size_t i;
    int inseq;
    
    seqmax = count = 0;
    for (i = 0; i < nobj; i++) {
        if (arr[i] % 2 != 0)
            inseq = 1;
        else {
            inseq = 0;
            if (count > seqmax)
                seqmax = count;
            count = 0;
        }
        if (inseq) {
            count++;
            if (i + 1 == nobj && count > seqmax)
                seqmax = count;
        }
    }
    return seqmax;
}
#endif
Код
[guest@localhost tests]$ ./t
3
[guest@localhost tests]$
1
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
26.11.2010, 22:52  [ТС] #17
а можешь прокоментировать программу??


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
#include <stdio.h>
 
size_t max_oddseq_array(int arr[], size_t nobj);
 
int main(void)
{
    int n[10] = { 1, 1, 2, 3, 5, 5, 6, 7, 9 };
    
    printf("%u" "\n", max_oddseq_array(n, 10));
    
    return 0;
}
 
size_t max_oddseq_array(int arr[], size_t nobj)
{
    size_t seqmax, count;
    size_t i;
    
    seqmax = count = 0;
    for (i = 0; i < nobj; i++)
        if (arr[i] % 2 != 0) {
            count++;
            if (i + 1 == nobj && count > seqmax)
                seqmax = count;
        } else {
            if (count > seqmax)
                seqmax = count;
            count = 0;
        }
    return seqmax;
}
 
#if 0
size_t max_oddseq_array(int arr[], size_t nobj)
{
    size_t seqmax, count;
    size_t i;
    int inseq;
    
    seqmax = count = 0;
    for (i = 0; i < nobj; i++) {
        if (arr[i] % 2 != 0)
            inseq = 1;
        else {
            inseq = 0;
            if (count > seqmax)
                seqmax = count;
            count = 0;
        }
        if (inseq) {
            count++;
            if (i + 1 == nobj && count > seqmax)
                seqmax = count;
        }
    }
    return seqmax;
}
#endif
и

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
size_t count_words(const char *s, const char *d);
 
int main(void)
{
    const char *line = "aa";
    
    printf("%u" "\n", count_words(line, " "));
 
    printf("%u" "\n", count_words("0x12 absd 123 43h e12 0 12g44 t", " "));
    
    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
#include <string.h>
#include <ctype.h>
 
/* количество слов в строке и разделители слов */
size_t count_words(const char *s, const char *d)
{
    size_t i, nwords;
    int inword;
 
    inword = 0;
    for (nwords = i = 0; s[i] != '\0'; i++)
        if (isalpha(s[i])) {
            if (!inword)
                if (i == 0 || (i > 0 && strchr(d, s[i - 1]) != NULL))
                    inword = 1;
        } else if (inword) {
            inword = 0;
            if (strchr(d, s[i]) != NULL)
                nwords++;
        }
    if (inword)
        nwords++;
    return nwords;
}
Напишы коменты
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 23:40 #18
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
 
#include <stdio.h> /* функция printf() описана там */
 
/* прототип функции, чтобы все знали, как функция работает */
size_t max_oddseq_array(int arr[], size_t nobj);
 
int main(void) /* void - значит аргументы не принимаются */
{
    int n[10] = { 1, 1, 2, 3, 5, 5, 6, 7, 9 }; /* создали массив и сразу проинициализировали его */
    
    printf("%u" "\n", max_oddseq_array(n, 10));
    /* сначала срабатывает функция max_oddseq_array(), потом её значение
       передаётся в функцию printf() */
    
    return 0;
    /* код возврата, обозначающий успешное завершение программы
       его можно проверять в системе и принимать решение, что делать дальше */
}
 
/* max_oddseq_array:  ищет в массиве arr среди nobj элементов
                      максимальную последовательность нечётных чисел;
                      возвращает длину такой последовательности */
size_t max_oddseq_array(int arr[], size_t nobj)
{
    size_t seqmax, count; /* size_t - большой неотрицательный целый тип */
    size_t i; /* i тоже size_t, чтобы при компилировании
                 не сообщал об ошибке сравнения знакового и беззнакового */
    
    seqmax = count = 0;
    /* установили всё на ноль,
       всё - это текущую максимальную длину последовательности
       и счётчик, который используется для любой последовательности */
    for (i = 0; i < nobj; i++)
        if (arr[i] % 2 != 0) { /* число не делится на 2 нацело ? значит нечётное */
            count++;
            /* начинаем или продолжаем считать
               длину текущей последовательности нечётных */
            if (i + 1 == nobj && count > seqmax)
            /* если стоим в конце всего массива и находимся в последовательности,
               то, если она больше максимальной последовательности,
               запишем её длину как максимальную */
                seqmax = count;
        } else { /* если начались четные числа */
            if (count > seqmax) /* проверим сколько насчитал счётчик */
            /* если последняя последовательность нечётных длиннее максимальной,
               то сохраним новую длину */
                seqmax = count;
            count = 0;
            /* счётчик подготовим для следующей последовательности нечётных */
        }
    return seqmax; /* тут либо ноль, либо максимальная длина */
}
1
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
27.11.2010, 12:13  [ТС] #19
а для слов можешь??


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
#include <stdio.h>
 
size_t count_words(const char *s, const char *d);
 
int main(void)
{
const char *line = "aa";
 
printf("%u" "\n", count_words(line, " "));
 
printf("%u" "\n", count_words("0x12 absd 123 43h e12 0 12g44 t", " "));
 
return 0;
}
 
#include <string.h>
#include <ctype.h>
 
/* количество слов в строке и разделители слов */
size_t count_words(const char *s, const char *d)
{
size_t i, nwords;
int inword;
 
inword = 0;
for (nwords = i = 0; s[i] != '\0'; i++)
if (isalpha(s[i])) {
if (!inword)
if (i == 0 || (i > 0 && strchr(d, s[i - 1]) != NULL))
inword = 1;
} else if (inword) {
inword = 0;
if (strchr(d, s[i]) != NULL)
nwords++;
}
if (inword)
nwords++;
return nwords;
}
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.11.2010, 23:27 #20
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
#include <stdio.h> /* там объявление printf() и имя типа size_t */
 
/* прототип функции задаётся, чтобы все функции знали,
   как должен выглядеть правильный вызов */
size_t count_words(const char *s, const char *d); /* s и d можно не писать */
/* вместо s и d можно написать любые названия, можно их вообще не писать
   size_t count_words(const char *, const char *);
   но обычно удобнее вспоминать как работает функция, когда там есть названия */
 
int main(void)
{
    const char *line = "aa"; /* создаётся указатель на неменяемую строку,
                                он инициализируется адресом первого символа строки,
                                находящейся где-то в неменяемой памяти
                                (открытой только для чтения) */
    
    printf("%u" "\n", count_words(line, " "));
    /* сначала вызывается функция count_words(),
       в её вызов передаются два аргумента:
       1) адрес, хранящийся в указателе line (адрес символа 'a')
       2) адрес, который имеет первый символ строки " " (адрес символа ' ')
       когда она возвращает результат, он передаётся в вызов функции printf()
       printf() принимает два аргумента:
       1) адрес первого символа строки "%u\n" (адрес символа '%')
       2) значение типа unsigned int */
     
    printf("%u" "\n", count_words("0x12 absd 123 43h e12 0 12g44 t", " "));
    /* сначала вызывается функция count_words(),
       в её вызов передаются два аргумента:
       1) адрес, который имеет первый символ строки "0x12 ... " (адрес символа '0')
       2) адрес, который имеет первый символ строки " " (адрес символа ' ')
       когда она возвращает результат, он передаётся в вызов функции printf()
       printf() принимает два аргумента:
       1) адрес первого символа строки "%u\n" (адрес символа '%')
       2) значение типа unsigned int */
    
    return 0; /* 0 - признак успешного завершения программы, не ноль - всё остальное */
}
 
#include <string.h> /* там объявление strchr() и имя типа size_t */
#include <ctype.h> /* там объявление isalpha(), если это функция */
/* эти включения записаны здесь, потому что нужны только для функции ниже,
   функция, находящаяся выше, не использует из этих файлов ничего;
   будет удобно эту функцию отсоединить в отдельный файл .c,
   так как все заголовочные файлы включены рядом с ней */
 
/* count_words:  подсчитывает количество слов в строке s,
                 разделённых разделителями из строки d */
size_t count_words(const char *s, const char *d)
{
    size_t i, nwords;
    /* size_t позволяет обрабатывать длинные строки,
       количество слов тоже может быть большим */
    int inword; /* флаг состояния внутри_слова/снаружи_слова */
 
    inword = 0; /* устанавливаем флаг в снаружи_слова */
    for (nwords = i = 0; s[i] != '\0'; i++)
        /* цикл заканчивается на нуль-символе исходной строки s */
        if (isalpha(s[i])) { /* если символ какой-то из a-zA-Z */
            if (!inword) /* если снаружи слова */
                if (i == 0 || (i > 0 && strchr(d, s[i - 1]) != NULL))
                    inword = 1;
                /* если это первый символ строки, установить флаг в внутри_слова;
                   если это не первый символ строки и слева от него находится
                   какой-то из разделителей слов, установить флаг в внутри_слова;
                   флаг устанавливается на первом символе каждого слова */
        } else if (inword) { /* если символ не один из a-zA-Z и находится после слова */
            inword = 0; /* установить флаг в снаружи_слова */
            if (strchr(d, s[i]) != NULL) /* в строке разделителей слов d ищем этот символ */
                /* если он есть среди разделителей слов, увеличиваем счётчик слов */
                nwords++;
                /* мы флаг обратно не включаем в обратном случае,
                   а что будет с последовательностью abc1def, если 1 - не разделитель ?
                   по ходу требует доработки; не, тест показал, что всё будет окей
                   def не станет новым словом, потому что слева не разделитель */
        }
    if (inword) /* если строка закончилась, а в конце строки было слово */
        nwords++;
    return nwords; /* возвращает ноль или количество слов */
}
1
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
28.11.2010, 10:53  [ТС] #21
а как то можно сделать так чтобы не использовалась библиотека string.h
0
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
12.01.2011, 00:09  [ТС] #22
может кто то срочно обьяснить мне вот этот кусок программы а то я никак не могу разобрать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string.h>
#include <ctype.h> /* количество слов в строке и разделители слов */ size_t count_words(const char
*s, const char *d)
{
size_t i, nwords;
int inword; inword = 0;
for (nwords = i = 0; s[i] != '\0'; i
++)
if (isalpha(s[i])) {
if (!inword)
if (i == 0 || (i > 0 && strchr(d, s [i - 1]) != NULL))
inword = 1;
} else if (inword) {
inword = 0;
if (strchr(d, s[i]) != NULL)
nwords++; }
if (inword)
nwords++;
return nwords;
}
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.01.2011, 11:05 #23
тут комментарии неясные чтоли ?
0
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
12.01.2011, 12:04  [ТС] #24
просто сильно громоздко)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2011, 12:04
Привет! Вот еще темы с ответами:

Дана непустая последовательность из строчных латинских букв - C++
Дана непустая последовательность из строчных латинских букв, между соседними словами - запятая, за последним словом точка. Напечатать...

Подсчитать слова, состоящие из латинских прописных букв. - C++
int main(int argc, char* argv) { int cnt=0, i; char *str=&quot;I can use the online Help system from the Help menu.&quot;; for (i=1;...

Количество символов, отличных от латинских букв и пробелов - C++
Здравствуйте, нужно посчитать количество символов в строке, отличных от латинских букв и пробелов. Кажется, что ошибка закралась где-то в...

Подсчитать общее вхождение в строку латинских букв - C++
Дана строка символов. Подсчитать общее вхождение в строку латинских букв. Test: input: aa!220$G&quot;1o325A+5468.7 Z 5.!zz output: 8


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.01.2011, 12:04
Ответ Создать тему
Опции темы

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