С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

07.03.2011, 12:12. Просмотров 2818. Ответов 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...

23
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
16.03.2011, 17:50  [ТС] #16
Нет всё-таки программа неправильно работает, неправильно считает количество непреобразованных слов и выводит все слова кроме первого
0
Ma3a
Эксперт С++
619 / 463 / 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;
    }
0
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
16.03.2011, 20:08  [ТС] #18
Мне надо вывести ПРЕОБРАЗОВАННЫЕ слова! а так я ввожу n=3, строка "privet kak dela", следовательно программа обрабатывает строку и получается "irpvet kak aled" и те функции из вашего варианта выводят "kak aled", и число 2, хотя должны вывести только "kak" и число 1.)) Но следуя исходному заданию нужно вывести "irpvet aled" и число 1...

Добавлено через 1 час 6 минут
Нид хелп))
0
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 693
16.03.2011, 21:25 #19
Что делает этот цикл ?
C++
1
for(int i=1; k=strAlfa(k, len) && i<=n; i++, k+=len)
0
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
16.03.2011, 21:41  [ТС] #20
Цитата Сообщение от parkito Посмотреть сообщение
Что делает этот цикл ?
C++
1
for(int i=1; k=strAlfa(k, len) && i<=n; i++, k+=len)
k содержит адрес первого элемента последней буквенной подстроки. В этом цикле ищется последняя буквенная подстрока. Вы лучше посмотрите листинг, который выложил Ma3a в своём последнем сообщении
0
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 693
16.03.2011, 21:45 #21
Где тело цикла ?
0
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
16.03.2011, 22:21  [ТС] #22
C++
1
2
3
4
5
6
7
8
9
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;
        }
Программа работает правильно, только мне нужно чтобы она выводила только ПРЕОБРАЗОВАННЫЕ СЛОВА и выводила количество НЕПРЕОБРАЗОВАННЫХ слов
0
Ma3a
Эксперт С++
619 / 463 / 31
Регистрация: 28.01.2011
Сообщений: 605
16.03.2011, 23:09 #23
Чтобы выводило преобразованные слова просто замените строчку
C++
1
if(myStrCmp(next_sub_p1,next_sub_p2) == true)
в main на
C++
1
if(myStrCmp(next_sub_p1,next_sub_p2) == false)
А количество непреобразованных слов - тот цикл, который у меня выводит слова и считает, только в теле цикла оставьте строчку ++count; То есть один цикл пустить так, как уже есть, заменив в условии true на false, а второй, для подсчета слов с приведенным выше условием ... == true и в теле цикла только увеличиваете количество слов count , надеюсь, что достаточно понятно излагаю.

Добавлено через 12 минут
Таким образом, функция main будет выглядеть
так

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
int main()
    {
    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;
            }
 
    for(next_sub_p1 = str, next_sub_p2 = str2; (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) == false)
            {
            int fraglen;
            strAlfa(next_sub_p1,fraglen);
            myStrCpy(fragment,next_sub_p1,fraglen);
            cout << fragment << " ";
            }
    cout << endl << "Количество не измененных слов :" << count << endl;
        return 0;
    }
1
z.a.m
49 / 0 / 1
Регистрация: 17.10.2010
Сообщений: 57
19.03.2011, 11:44  [ТС] #24
А-А-А-А препод недоволен, "как всегда" =( Оказывается не надо использовать потоковую операцию cin.get, пользователь заранее должен ввести количество слов в фразе и мне нужно сделать цикл от 1 до N, и вводить обычным "cin >> str". В этом же цикле вызывать функцию gazN. Функция gazN должна вернуть или адрес элемента подстроки или 0, если возвращает адрес элемента, то мы выводим слово, так как оно преобразовано и делаем счетчик непреобразованных слов на единицу меньше. Т.е получается нельзя добавлять свои функции, и нельзя использовать strcpy (((
0
19.03.2011, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2011, 11:44
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

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