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

Работа со строками - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
07.03.2011, 12:12     Работа со строками #1
ммм, в общем задание такое:
Функция int isAlfa (char s) получает символ и определяет, является ли он символом латиницы или кириллицы(строчным или прописным)
Функция char* strAlfa(char* str, int& lenAlfa) получает строку str и ищет первую буквенную подстроку. Функция возвращает адрес найденной подстроки и ее длину или NULL, если в строке нет буквенной подстроки символов.
Функция void qaz(char* str, int n) получает строку str и преобразует ее, переставляя в обратном порядке n первых символов.
Функция char* qazN(char* str, int n) получает строку str и число n и преобразует в строке каждую n–ую буквенную подстроку, переставляя буквы в ней в обратном порядке. Используйте при разработке алгоритма функции функции strAlfa, qaz.

Программа со стандартного устройства ввода считывает число n и фразу, состоящую из N слов (точное количество слов во фразе задает пользователь заранее). Программа изменяет каждое слово фразы с помощью функции qazN и выводит на экран только измененные слова исходной фразы. Программа подсчитывает количество не преобразованных слов в исходной фразе.
Если честно чувствую себя тупым, читая это задание...
Препод сказал, что строка вводится без пробелов например abcd123efgh456
Написал вот что :

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
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
int isAlfa(char );
char *gazN(char * , int );
char *strAlfa(char * , int& );
void gaz(char * , int );
void main (void)
{
    setlocale(LC_ALL,"rus");
    char str[100];
    int n, len;
    cout << "n = ";
    cin >> n;
    cout << "Введите символ: ";
    system("cls");
    cout << "Введите строку: ";
    cin.get(str,sizeof(str));
    char *p=str;
 
    for(int i=1; i<=n; i++)
        p=strAlfa(str, len);
    if(p)
        {
            gaz(str, n); 
            gazN(p, len);
        }   
 
    getch();
}
 
int isALfa (char s)
{
    if (s>='a' && s<='z' || s>='A' && s<='Z'|| s>='а' && s<='я' || s>='А' && s<='Я')
        return 1;
    return 0;
}
 
char *strAlfa(char *str, int& len)
{
    len=0;
    for ( ; !isAlfa(*str) && *str; str++);
    if (*str==0)
        return 0;
    char *p=str;
    for ( ; isAlfa(*str); str++, len++);
    return p;
}
 
void gaz(char *str, int n)
{
    char p;
    int i, j;
    for (i=0, j=n-1; i<j; i++, j--)
    {
        p=*(str+j);
        *(str+j)=*(str+i);
        *(str+i)=p;
    }
}
 
char *gazN(char *str, int n)
{
    char p;
    int i, j;
    for (i=0, j=n-1; i<j; i++, j--)
    {
        p=*(str+j);
        *(str+j)=*(str+i);
        *(str+i)=p;
    }
    return str;
}
При построении вылезает ошибка:
ссылка на неразрешенный внешний символ "int __cdecl isAlfa(char)" (?isAlfa@@YAHD@Z) в функции "char * __cdecl strAlfa(char *,int &)" (?strAlfa@@YAPADPADAAH@Z)
И ещё я не знаю как подсчитать количество не преобразованных слов
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2011, 12:12     Работа со строками
Посмотрите здесь:

C++ Работа со строками
Работа со строками C++
C++ Работа со строками.
Работа со строками. C++
Работа с строками C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 12:36     Работа со строками #2
C++
1
int isAlfa(char );
и
C++
1
int isALfa (char s)
Не сходится по названиям слегка, не?
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
07.03.2011, 12:45  [ТС]     Работа со строками #3
хех точно
млин а почему программа не хочет вводить строку и выходит сразу?

Добавлено через 4 минуты
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
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
int isAlfa(char );
char *gazN(char * , int );
char *strAlfa(char * , int& );
void gaz(char * , int );
void main (void)
{
        setlocale(LC_ALL,"rus");
        char str[100];
        int n, len;
        cout << "n = ";
        cin >> n;
        cout << "Введите строку: ";
        cin.get(str,sizeof(str));
        char *p=str;
 
        for(int i=1; i<=n; i++)
                p=strAlfa(str, len);
        if(p)
                {
                        gaz(str, n); 
                        gazN(p, len);
                }       
 
        getch();
}
 
int isAlfa (char s)
{
        if (s>='a' && s<='z' || s>='A' && s<='Z'|| s>='а' && s<='я' || s>='А' && s<='Я')
                return 1;
        return 0;
}
 
char *strAlfa(char *str, int& len)
{
        len=0;
        for ( ; !isAlfa(*str) && *str; str++);
        if (*str==0)
                return 0;
        char *p=str;
        for ( ; isAlfa(*str); str++, len++);
        return p;
}
 
void gaz(char *str, int n)
{
        char p;
        int i, j;
        for (i=0, j=n-1; i<j; i++, j--)
        {
                p=*(str+j);
                *(str+j)=*(str+i);
                *(str+i)=p;
        }
}
 
char *gazN(char *str, int n)
{
        char p;
        int i, j;
        for (i=0, j=n-1; i<j; i++, j--)
        {
                p=*(str+j);
                *(str+j)=*(str+i);
                *(str+i)=p;
        }
        return str;
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
07.03.2011, 12:51     Работа со строками #4
Внимательно посмотри на 33 строчку.
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
07.03.2011, 12:56  [ТС]     Работа со строками #5
kazak, да я понял, заменил L на l, теперь программа отказывается вводить строку, после первого введенного символа вылетает, без объяснения причин
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
07.03.2011, 12:57     Работа со строками #6
Цитата Сообщение от z.a.m Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
char *strAlfa(char *str, int& len)
{
 len=0;
 for ( ; !isAlfa(*str) && *str; str++);
 if (*str==0)
 return 0;
 char *p=str;
 for ( ; isAlfa(*str); str++, len++);
 return p;
}
мне почемуто кажется, что эта функция всегда будет возвращать ноль.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 12:59     Работа со строками #7
Цитата Сообщение от z.a.m Посмотреть сообщение
а почему программа не хочет вводить строку и выходит сразу?
Перед cin.get(str,sizeof(str)); вставь строчку cin.sync();
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
07.03.2011, 13:07  [ТС]     Работа со строками #8
kazak, нет, она вернет ноль, только тогда, когда не будет найдено символов

Ma3a, проблема решилась, но можете объяснить почему без cin.sync не работала?

млин, да и ещё оказалось что алгоритм неправильный =(
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 13:16     Работа со строками #9
cin.sync() предназначено для того, чтобы из входного буфера вычистить непрочитанные символы. Судя по всему, штука заключается в том, что после прочтения n в буфере осталась лежать "\n", что и препятствовало вызовам типа cin.get или cin.getline. Соответственно вызовом sync мы эту "хвостовую" новую строку убрали, можно считывать дальше.
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
07.03.2011, 14:48  [ТС]     Работа со строками #10
Помогите разобраться с функцией gazN, она всё портит, остальные функции работают нормально, да и ещё как подсчитать количество не преобразованных слов и как вывести на экран только преобразованные слова?) пожалуйста помогите

Добавлено через 27 минут
Помогите пожалуйста!

Добавлено через 24 минуты
вот так я исправил свою прогу, а именно функцию gazN
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
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
int isAlfa(char );
char *gazN(char * , int );
char *strAlfa(char * , int& );
void gaz(char * , int );
void main (void)
{
        setlocale(LC_ALL,"rus");
        char str[100];
        int n, len;
        cout << "n = ";
        cin >> n;
        cout << "Введите строку: ";
        cin.sync();
        cin.get(str, sizeof(str));
 
        if(strAlfa(str, len))
                {
                        gaz(str, n); 
                        gazN(str, n);
                        cout << str;
                }       
 
        getch();
}
 
int isAlfa (char s)
{
        if (s>='a' && s<='z' || s>='A' && s<='Z'|| s>='а' && s<='п' || s>='р' && s<='я' || s>='А' && s<='Я')
                return 1;
        return 0;
}
 
char *strAlfa(char *str, int& len)
{
        len=0;
        for ( ; !isAlfa(*str) && *str; str++);
        if (*str==0)
                return 0;
        char *p=str;
        for ( ; isAlfa(*str); str++, len++);
        return p;
}
 
void gaz(char *str, int n)
{
        char p;
        int i, j;
        for (i=0, j=n-1; i<j; i++, j--)
        {
                p=*(str+j);
                *(str+j)=*(str+i);
                *(str+i)=p;
        }
}
 
char *gazN(char *str, int n)
{
        char p;
        int len, i, j;
        char *k=str; 
        for(int i=1; k=strAlfa(k, len) && i<=n; i++, k+=len)
 
        for (i=0, j=len-1; i<j; i++, j--)
        {
                p=*(k+j);
                *(k+j)=*(k+i);
                *(k+i)=p;
        }
        return k;
}
но выходит ошибка на счёт вот этой строки:
C++
1
k=strAlfa(k, len)
мол
невозможно преобразовать "bool" в "char *
хотя обе переменные "char *"
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 15:07     Работа со строками #11
C++
1
k=strAlfa(k, len) && i<=n;
При выполнении этой строчки сначала будут вычислены strAlfa, после этого i<=n, потом &&, что в итоге даст тип bool возвращаемого значения, и только потом будет выполнено присваивание, ибо у него приоритет здесь самый низкий и оно выполняется позже всех.
Скорее всего, вам нужно сделать так
C++
1
(k=strAlfa(k, len)) && i<=n;
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
07.03.2011, 18:46  [ТС]     Работа со строками #12
Ma3a, спасибо, но вы бы не могли помочь разобраться с функцией gazN, программа неверно выводит строку... после выполнение функции gaz всё проходит отлично а вот после функции gazN всё не так =(

Добавлено через 2 часа 11 минут
HELP!!!
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 19:38     Работа со строками #13
Если правильно понимаю постановку вопроса ( не вчитывался особо так как мутно написано условие как-то ), то получится примерно следующее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char *gazN(char *str, int n)
    {
    int len;
    char temp;
    char * next_sub_p = str;
    for(int i = 1; (next_sub_p = strAlfa(next_sub_p, len));++i, next_sub_p += len)
        {
        if(i % n == 0)
            {
            for(int j = 0; j < len / 2; ++j)
                {
                temp = *(next_sub_p + len - j - 1);
                *(next_sub_p + len - j - 1) = *(next_sub_p + j);
                *(next_sub_p + j) = temp;
                }
            }
        }
    return next_sub_p;
    }
Чтобы подсчитать количество не преобразованных слов, перед тем, как собственно преобразовывать, нужно сделать что-то в стиле
C++
1
2
char str2[100];
strcpy(str,str2);
А потом, после преобразования над строкой, пройтись циклом по этим строкам, беря последовательно подстроки от первой( измененной ) и второй ( изначальной )строк и просто смотреть условие strcmp(substr1,substr2)==0.

Добавлено через 13 минут
В соответствии с заданием небольшая поправочка, если уж указано, что использовать нужно функцию gaz

C++
1
2
3
4
5
6
7
8
9
10
char *gazN(char *str, int n)
    {
    int len;
    char temp;
    char * next_sub_p = str;
    for(int i = 1; (next_sub_p = strAlfa(next_sub_p, len));++i, next_sub_p += len)
        if(i % n == 0)
            gaz(next_sub_p,len);
    return next_sub_p;
    }
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
08.03.2011, 10:08  [ТС]     Работа со строками #14
У меня тоже была такая идея, но препод запрещает пользоваться любыми операциями <string.h>, кроме strlen. Кроме того, там не только количество не преобразованных слов надо посчитать, но и вывести все преобразованные слова... я бессилен ....
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
08.03.2011, 12:33     Работа со строками #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Довольно топорно, но не хотелось с этим возиться:

В начале прототипы
C++
1
2
3
4
void myStrCpy(char * , char * );
void myStrCpy(char * , char * , int);
int myStrLen(char * );
bool myStrCmp(char * , char * );
В main после преобразований gaz и gazN
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cout << endl << "Unchanged words are: ";
int count;
    
char * next_sub_p1 = str;
char * next_sub_p2 = str2;
char fragment[100];
int len1,len2;
 
for(count = 0; (next_sub_p1 = strAlfa(next_sub_p1, len1)) &&
    (next_sub_p2 =strAlfa(next_sub_p2,len2));
    next_sub_p1 += len1, next_sub_p2 += len2)
        if(myStrCmp(next_sub_p1,next_sub_p2) == true)
        {
    ++count;
    int fraglen;
    strAlfa(next_sub_p1,fraglen);
    myStrCpy(fragment,next_sub_p1,fraglen);
    cout << fragment << " ";
    }
cout << endl << "Total words remaining unchanged :" << count << endl;
Сами функции
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
void myStrCpy(char * dest, char * src)
    {
    int len = strlen(src);
    int i;
    for(i = 0; i < len; ++i)
        dest[i] = src[i];
    dest[i] = '\0';
    }
 
void myStrCpy(char * dest, char * src, int len)
    {
    int i;
    for(i = 0; i < len; ++i)
        dest[i] = src[i];
    dest[i] = '\0';
    }
 
int myStrLen(char * str)
    {
    for(int i = 0,len = strlen(str); i < len; ++i)
        if(!isAlfa(*(str + i)))
            return i;
    return strlen(str);
    }
 
bool myStrCmp(char * str1,char * str2)
    {
    int len1 = myStrLen(str1),len2 = myStrLen(str2);
 
    if(len1 != len2)
        return false;
 
    for(int i = 0; i < len1; ++i)
        if(str1[i] != str2[i])
            return false;
 
    return true;
    }
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
16.03.2011, 17:50  [ТС]     Работа со строками #16
Нет всё-таки программа неправильно работает, неправильно считает количество непреобразованных слов и выводит все слова кроме первого
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
16.03.2011, 18:34     Работа со строками #17
А можно пример, где у вас неправильно работает? У меня отрабатывает нормально. Насчет первого слова: в ваших кодах у вас перед преобразованием gazN делается вызов gaz(str, n), который в соответствии со своим предназначением меняет n первых символов строки местами в обратном порядке, так что если этот вызов затрагивает это первое слово в строке, то естественно, что оно поменяется и не пройдет кастинг.

Полный листинг программы

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include <cstring>
 
using namespace std;
 
void myStrCpy(char * , char * );
void myStrCpy(char * , char * , int);
int myStrLen(char * );
bool myStrCmp(char * , char * );
 
int isAlfa (char s)
    {
    if (s>='a' && s<='z' || s>='A' && s<='Z'|| s>='а' && s<='п' || s>='р' && s<='я' || s>='А' && s<='Я')
        return 1;
    return 0;
    }
 
char *strAlfa(char *str, int& len)
    {
    len=0;
    for ( ; !isAlfa(*str) && *str; str++);
    if (*str==0)
        return 0;
    char *p=str;
    for ( ; isAlfa(*str); str++, len++);
    return p;
    }
 
void gaz(char *str, int n)
    {
    char p;
    int i, j;
    for (i=0, j=n-1; i<j; i++, j--)
        {
        p=*(str+j);
        *(str+j)=*(str+i);
        *(str+i)=p;
        }
    }
 
char *gazN(char *str, int n)
    {
    int len;
    char * next_sub_p = str;
    for(int i = 1; (next_sub_p = strAlfa(next_sub_p, len));++i, next_sub_p += len)
        if(i % n == 0)
            gaz(next_sub_p,len);
    return next_sub_p;
    }
 
int main (void)
    {
    setlocale(LC_ALL,"rus");
    char str[100];
    char str2[100];
    int n, len;
    cout << "n = ";
    cin >> n;
    cout << "Введите строку: ";
    cin.sync();
    cin.get(str, sizeof(str));
    strcpy(str2,str);
 
    if(strAlfa(str, len))
        {
        //gaz(str, n); 
        gazN(str, n);
        cout << str;
        }
 
    cout << endl << "Неизмененные слова: ";
    int count;
 
    char * next_sub_p1 = str;
    char * next_sub_p2 = str2;
    char fragment[100];
    int len1,len2;
 
    for(count = 0; (next_sub_p1 = strAlfa(next_sub_p1, len1)) &&
        (next_sub_p2 =strAlfa(next_sub_p2,len2));
        next_sub_p1 += len1, next_sub_p2 += len2)
        if(myStrCmp(next_sub_p1,next_sub_p2) == true)
            {
            ++count;
            int fraglen;
            strAlfa(next_sub_p1,fraglen);
            myStrCpy(fragment,next_sub_p1,fraglen);
            cout << fragment << " ";
            }
    cout << endl << "Количество не измененных слов :" << count << endl;
 
        return 0;
    }
 
void myStrCpy(char * dest, char * src)
    {
    int len = strlen(src);
    int i;
    for(i = 0; i < len; ++i)
        dest[i] = src[i];
    dest[i] = '\0';
    }
 
void myStrCpy(char * dest, char * src, int len)
    {
    int i;
    for(i = 0; i < len; ++i)
        dest[i] = src[i];
    dest[i] = '\0';
    }
 
int myStrLen(char * str)
    {
    for(int i = 0,len = strlen(str); i < len; ++i)
        if(!isAlfa(*(str + i)))
            return i;
    return strlen(str);
    }
 
bool myStrCmp(char * str1,char * str2)
    {
    int len1 = myStrLen(str1),len2 = myStrLen(str2);
 
    if(len1 != len2)
        return false;
 
    for(int i = 0; i < len1; ++i)
        if(str1[i] != str2[i])
            return false;
 
    return true;
    }
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
16.03.2011, 20:08  [ТС]     Работа со строками #18
Мне надо вывести ПРЕОБРАЗОВАННЫЕ слова! а так я ввожу n=3, строка "privet kak dela", следовательно программа обрабатывает строку и получается "irpvet kak aled" и те функции из вашего варианта выводят "kak aled", и число 2, хотя должны вывести только "kak" и число 1.)) Но следуя исходному заданию нужно вывести "irpvet aled" и число 1...

Добавлено через 1 час 6 минут
Нид хелп))
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
16.03.2011, 21:25     Работа со строками #19
Что делает этот цикл ?
C++
1
for(int i=1; k=strAlfa(k, len) && i<=n; i++, k+=len)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2011, 21:41     Работа со строками
Еще ссылки по теме:

Работа со строками. C++
работа со строками C++
Работа со строками C++

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

Или воспользуйтесь поиском по форуму:
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 56
16.03.2011, 21:41  [ТС]     Работа со строками #20
Цитата Сообщение от parkito Посмотреть сообщение
Что делает этот цикл ?
C++
1
for(int i=1; k=strAlfa(k, len) && i<=n; i++, k+=len)
k содержит адрес первого элемента последней буквенной подстроки. В этом цикле ищется последняя буквенная подстрока. Вы лучше посмотрите листинг, который выложил Ma3a в своём последнем сообщении
Yandex
Объявления
16.03.2011, 21:41     Работа со строками
Ответ Создать тему
Опции темы

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