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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
14.11.2010, 15:30     Подсчет латинских букв #1
надо подсчитать количество идущих подряд чисел и слова которые состоят только из латинских букв,с чтислами вроде получилось а вот с буквами как то не очень ,кто знает в чем проблема помогите .
Буду благодарен если поможете оптимизировать программу и сделать ее более корректной и лаконичной.

Вот листинг

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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2010, 06:44     Подсчет латинских букв #2
количество идущих подряд чисел и слова которые состоят только из латинских букв
идущих подряд чисел ? что это значит ?
слова - это что ? !isspace() ? а запятые, точки ?
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
15.11.2010, 18:33  [ТС]     Подсчет латинских букв #3
это значит :
количество идущих подряд нечетных чисел-( ответ должен быть 3)
количество слов состоящих из латинских букв - (ответ 2 слова absd и t)
Функция isalpha() возвращает ненулевое значение, если ее аргумент ch является буквой, в противном случае возвращается нуль. Принадлежность символа к буквам зависит от конкретного языка. Для английского языка таковыми являются прописные и строчные буквы от А до Z.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.11.2010, 00:26     Подсчет латинских букв #4
флажки юзал когда-нибудь ?
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
16.11.2010, 08:20  [ТС]     Подсчет латинских букв #5
неа(а что это обьясни пожалуйста
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.11.2010, 12:13     Подсчет латинских букв #6
Цитата Сообщение от vippi07
количество слов состоящих из латинских букв - (ответ 2 слова absd и t)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    long nwords;
    int inword;
 
    nwords = 0;
    inword = 0;
    for (i = 0; s[i] != '\0'; i++) {
        if (isalpha(s[i])) {
            if (!inword) {
                inword = 1;
                nwords++;
            }
        } else
            inword = 0;
    }
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
16.11.2010, 16:00  [ТС]     Подсчет латинских букв #7
а как это правильно применитиь к программе?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.11.2010, 22:00     Подсчет латинских букв #8
в 64 строке у тебя скобка стоит, её надо перенести за 76 строку
но там всё равно не то

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
size_t xcount(const char *s)
{
    size_t i, nwords;
    int inword;
 
    inword = 0;
    for (nwords = i = 0; s[i] != '\0'; i++) {
        if (isalpha(s[i])) {
            if (!inword) {
                inword = 1;
                nwords++;
            }
        } else
            inword = 0;
    }
    return nwords;
}
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
18.11.2010, 17:34  [ТС]     Подсчет латинских букв #9
если делать по этому примеру получаеться результат 6 слов а должно быть 2


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
#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, a = 0, n=0;
 for(i=0; mas[i]!=0;++i)
 {
     if (!(mas[i]&1) && a)
     {
       ++n;
     }
     a = mas[i] & 1;
}
 
      if (a)
 
       {
         ++n;
       }
 
return n;
}
 
 
    int xcount(const char *mas1)
{
  int i, nwords,inword;
 
    inword = 0;
    for (nwords = i = 0; mas1[i] != '\0'; i++) {
        if (isalpha(mas1[i])) {
            if (!inword) {
                inword = 1;
                nwords++;
            }
        } else
            inword = 0;
    }
    return nwords;
}
подскажи что не правильно
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.11.2010, 02:34     Подсчет латинских букв #10
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* количество слов в строке и разделители слов */
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;
}
C
1
    count_words(line, " ");
пример

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;
}
Код
[guest@localhost tests]$ ./t
1
2
[guest@localhost tests]$
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
19.11.2010, 09:13  [ТС]     Подсчет латинских букв #11
а как обьеденить это с числами??можеш полностью сделать??я буду очень признателен
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.11.2010, 11:37     Подсчет латинских букв #12
про числа неясно
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
19.11.2010, 15:41  [ТС]     Подсчет латинских букв #13
плохо что не ясно)
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.11.2010, 15:56     Подсчет латинских букв #14
неясно, что за задание
vippi07
26 / 23 / 1
Регистрация: 01.11.2009
Сообщений: 134
19.11.2010, 23:52  [ТС]     Подсчет латинских букв #15
ВОТ ВСЯ ФОРМУЛИРОВКА ЗАДАНИЯ:
Написать программу на языке C++,реализующию перегруженную функцию xcount,получа-
ющую в качестве аргумента или массив целыхчисел,или символьную строку,и возвраща-
ющую количество подсчитанных элементов.Признаком конца числового массива считать
нулевой элемент.Функция не должна изменять переденныеей массивы.
Для массива целых чисел функция должна подсчитать максимальное количество иду-
щих подряд нечётных чисел,а для символьной строки–количество слов,состоящих только
из латинских букв.
accept
4837 / 3236 / 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]$
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;
}
Напишы коменты
accept
4837 / 3236 / 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; /* тут либо ноль, либо максимальная длина */
}
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2010, 23:27     Подсчет латинских букв
Еще ссылки по теме:

C++ Вывод латинских букв
C++ Подсчитать общее вхождение в строку латинских букв
C++ Сортировка массива латинских букв

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

Или воспользуйтесь поиском по форуму:
accept
4837 / 3236 / 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; /* возвращает ноль или количество слов */
}
Yandex
Объявления
27.11.2010, 23:27     Подсчет латинских букв
Ответ Создать тему
Опции темы

Текущее время: 11:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru