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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
#1

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

07.03.2011, 12:12. Просмотров 2663. Ответов 23
Метки нет (Все метки)

ммм, в общем задание такое:
Функция 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)
И ещё я не знаю как подсчитать количество не преобразованных слов
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2011, 12:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа со строками (C++):

Работа со строками в С++ - C++
Здравствуйте, вы бы не могли мне помочь решить такую задачу: Дана строка, представляющая предложение. Слова в предложении состоят из ...

Работа со строками - C++
Есть задание: Код, который давали на лекции int main() { char s = { 0 }; gets_s(s); int len = strlen(s);

Работа со строками - C++
Доброго времени суток! Пробую создать программу, которая разделяет строку на слова, убирает из них последующие включения первой буквы, и...

Работа со строками в СИ++ - C++
Парни помагите напишите прогу если не втягость заранее благодарю))) Вот условие: Дана строка. Преобразовать ее, удалив каждый символ *...

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

Работа со строками C++ - C++
Задание: Запросить у пользователя массив из 10 строк и вывести на экран те, которые равны слову «Ура». #include &quot;stdafx.h&quot; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ma3a
Эксперт C++
617 / 461 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 12:36 #2
C++
1
int isAlfa(char );
и
C++
1
int isALfa (char s)
Не сходится по названиям слегка, не?
1
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
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;
}
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
07.03.2011, 12:51 #4
Внимательно посмотри на 33 строчку.
0
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
07.03.2011, 12:56  [ТС] #5
kazak, да я понял, заменил L на l, теперь программа отказывается вводить строку, после первого введенного символа вылетает, без объяснения причин
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
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;
}
мне почемуто кажется, что эта функция всегда будет возвращать ноль.
0
Ma3a
Эксперт C++
617 / 461 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 12:59 #7
Цитата Сообщение от z.a.m Посмотреть сообщение
а почему программа не хочет вводить строку и выходит сразу?
Перед cin.get(str,sizeof(str)); вставь строчку cin.sync();
0
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
07.03.2011, 13:07  [ТС] #8
kazak, нет, она вернет ноль, только тогда, когда не будет найдено символов

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

млин, да и ещё оказалось что алгоритм неправильный =(
0
Ma3a
Эксперт C++
617 / 461 / 31
Регистрация: 28.01.2011
Сообщений: 605
07.03.2011, 13:16 #9
cin.sync() предназначено для того, чтобы из входного буфера вычистить непрочитанные символы. Судя по всему, штука заключается в том, что после прочтения n в буфере осталась лежать "\n", что и препятствовало вызовам типа cin.get или cin.getline. Соответственно вызовом sync мы эту "хвостовую" новую строку убрали, можно считывать дальше.
1
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
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 *"
0
Ma3a
Эксперт C++
617 / 461 / 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;
2
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
07.03.2011, 18:46  [ТС] #12
Ma3a, спасибо, но вы бы не могли помочь разобраться с функцией gazN, программа неверно выводит строку... после выполнение функции gaz всё проходит отлично а вот после функции gazN всё не так =(

Добавлено через 2 часа 11 минут
HELP!!!
0
Ma3a
Эксперт C++
617 / 461 / 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;
    }
2
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
08.03.2011, 10:08  [ТС] #14
У меня тоже была такая идея, но препод запрещает пользоваться любыми операциями <string.h>, кроме strlen. Кроме того, там не только количество не преобразованных слов надо посчитать, но и вывести все преобразованные слова... я бессилен ....
0
Ma3a
Эксперт C++
617 / 461 / 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;
    }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2011, 12:33
Привет! Вот еще темы с ответами:

Работа со строками - C++
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных (маленьких) латинских букв; между соседними...

Работа со строками - C++
Приветствую, друзья-программисты. Дали в универе лабу по строкам. У нас выпала лекция и сказали самостоятельно изучить. Прочитал много...

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

Работа со строками - C++
Даны строки S1 и S2. Удалить из строки S1 последнюю подстроку, совпадающую с S2. Если совпадающих подстрок нет, то вывести строку S1 без...


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

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

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