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

Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
legend
 Аватар для legend
28 / 27 / 0
Регистрация: 17.11.2010
Сообщений: 152
24.11.2010, 17:35     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #1
всем ку. =)

я еще плохо разбираюсь в строках.. помогите реализовать следуующее:

вводим строку в одномерный масив..
задача 1
удалить каждое второе слово к чертям..
задача 2
поменять местами перове слово со вторым.. 3 и4 5 и 6 7 и 8.. ..

спс заранее.

п.с. сильно прошу раставить коментарии ..

Добавлено через 31 минуту
heeelp
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2010, 17:35     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д.
Посмотрите здесь:

C++ Поменять местами первое и последние слово.
C++ Поменять местами первое и последнее слово в строке
C++ Дан массив. Поменять местами его первый элемент со вторым, третий - с четвертым и т.д.
Поменять первый элемент со вторым,третий с четвертым и т.д C++
Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ang_07
 Аватар для Ang_07
0 / 0 / 0
Регистрация: 09.11.2010
Сообщений: 47
24.11.2010, 18:21     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #2
сейчас попробую написать, есть парочка идей
legend
 Аватар для legend
28 / 27 / 0
Регистрация: 17.11.2010
Сообщений: 152
24.11.2010, 18:41  [ТС]     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #3
даже если не будет работать.. скинь код проги сюда.. =)

мне просто нужно понять как использовать функции считования строки.. удаление елемента. и тд и тп.

п.с. главное коментарии

Добавлено через 6 минут

Не по теме:

какие же тут кавайные модераторы

Ang_07
 Аватар для Ang_07
0 / 0 / 0
Регистрация: 09.11.2010
Сообщений: 47
24.11.2010, 19:10     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
void main()
{
    int n;
 
    char str[100];
    gets(str)           //Ввод строки
    n=strlen(str);                        //Подсчёт элементов строки
    for(int i=0;i<n;i++)
        if(str[i]==' ')
        {
            i++;
            while(str[i]!=' ');
            {
                str[i]=' ';
                i++;
            }
            
            i++;
            }
        
        for(int i=0;str[i]!=0;i++)
            cout<<str[i];
 
 
}
legend
 Аватар для legend
28 / 27 / 0
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 21:02  [ТС]     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #5
у когонить есть еще соображения по этой задаче??

Добавлено через 38 минут
ХЕЛППП!! ХДД

Добавлено через 23 часа 5 минут



heeeelp уже второй день мучаюсь :cofee2:

Добавлено через 1 час 13 минут
ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.11.2010, 21:27     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #6
Первое

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
#define N 80
 
void delSecondWord(char **str)
{
    char *result; // Указатель на результирующую строку
    char *s;      // Временный указатель, для удобства работы
    int len;      // Длина входной строки
    int i, j;     // Счётчики
 
    // Выделяем память под результирующую строку
    result = (char *)malloc(2 * N * sizeof(char));
 
     // Устанавливаем временный указатель на входную строку
    s = *str;
    
    // Считаем длину входной строки (+1 для того, чтобы захватить
    // завершающий нуль-символ '\0')
    len = strlen(s) + 1;
 
    // В цикле прохоим по всем элементам входной строки
    for (i = 0, j = 0; i < len; i++)
    {
        // Если очередной символ входной строки не равен пробелу
        if (s[i] != ' ')
            // Просто уопируем его в выходную строку
            result[j++] = s[i];
        // Иначе, если символ пробельный
        else
        {
            // В выходную строку ставим пробел
            result[j++] = ' ';
 
            // Пропускаем все пробелы во входной строке
            // (эти пробелы предшествуют удаляемому слову)
            while (s[i] == ' ')
                i++;
 
            // Пропускаем само слово
            while (s[i] != ' ' && s[i] != '\0')
                i++;
 
            // Пропускаем завершающие слово пробелы
            while (s[i] == ' ')
                i++;
 
            // Поскольку перед выполнением следующей итерации
            // счётчик увеличится, чтобы не пропустить символ,
            // откатываем его назад
            i--;
        }
    }
 
    // Освобождаем память из-под старой, не преобразованной строки
    free(*str);
 
    // Ставим указатель на строку указывать на новую, преобразованную
    // строку (таким образом пользователь ничего и не заметит - ввёл
    // непреобразованную строку в функцию - получил преобразованную)
    *str = result;
}
 
int main(void)
{
    char *str; // Будущая строка
 
    // Выделяем память под строку
    str = (char *)malloc(N * sizeof(char));
 
    printf("Enter string:\n");
    
    // Вводим строку
    fgets(str, N, stdin);
 
    // Преобразуем строку
    delSecondWord(&str);
 
    // Выводим преобразованную строку
    printf("Result string:\n%s", str);
 
    free(str);
 
    return 0;
}
legend
 Аватар для legend
28 / 27 / 0
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 21:38  [ТС]     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #7
спс за подробные комментарии по коду..

Добавлено через 29 секунд
#define N 80

ет че за зверЪЪ ??
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.11.2010, 22:17     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #8
Препроцессор. Когда программа будет компилироваться (вернее чуть раньше, перед этим), все вхождения N в коде будут заменены на 80. Если пишите в Плюсах, можно сказать, это аналог const int N = 80;

Добавлено через 33 минуты
Второе. Только, чувствую, намудрил страшно...

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
#define N 80
 
int swapTwoWords(char *str)
{
    char *word1, *word2; // Каждое из слов пары
    int n, m;            // Длины слов
    int tn;              // Временный счётчик
    int i;
 
    tn = 0;
 
    // Считаем длину первого слова
    while (str[tn] != ' ' && str[tn] != '\0')
        tn++;
 
    if (str[tn] == '\0')
        return 1;
 
    n = tn;
 
    // Выделяем память под первое слов
    word2 = (char *)malloc(n * sizeof(char));
 
    // Пропускаем пробелы между первым и вторым словом
    while (str[tn] == ' ')
        tn++;
 
    m = tn;
 
    // Считаем длину второго слова
    while (str[m] != ' ' && str[m + 1] != '\0')
        m++;
 
    m -= tn;
 
    // Выделяем память под второе слово
    word1 = (char *)malloc(m * sizeof(char));
 
    // Копируем первое слово из исходной строки
    for (i = 0; i < n; i++)
        word2[i] = str[i];
 
    // Копируем копируем слово из исходной строки
    for (i = 0; i < m; i++)
        word1[i] = str[i + tn];
 
    // Копируем второе слово в исходную строку на место первого
    for (i = 0; i < n; i++)
        str[i] = word1[i];
 
    // Копируем первое слово в исходную строку на место второго
    for (i = 0; i < m; i++)
        str[i + tn] = word2[i];
 
    // Освобождаем память
    free(word1);
    free(word2);
 
    return 0;
}
 
void swapAllWords(char *str)
{
    int len;
    int i;
 
    // Считаем длину строки
    len = strlen(str) + 1;
 
    // Идём по строке
    for (i = 1; i < len; i++)
    {
        // меняем очередную пару
        swapTwoWords(str + i - 1);
 
        // Пропускаем первое слово только что обмененной пары
        while (str[i] != ' ' && str[i] != '\0')
            i++;
 
        // Пропускаем пробелы между первым и вторым словом пары
        while (str[i] == ' ')
            i++;
 
        // Пропускаем второе слово пары
        while (str[i] != ' ' && str[i] != '\0')
            i++;
 
        // Пропускаем пробелы межды этой парой и следующей
        while (str[i] == ' ')
            i++;
    }
}
 
int main(void)
{
    char *str; // Будущая строка
 
    // Выделяем память под строку
    str = (char *)malloc(N * sizeof(char));
 
    printf("Enter string:\n");
    
    // Вводим строку
    fgets(str, N, stdin);
 
    // Преобразуем строку
    swapAllWords(str);
 
    // Выводим преобразованную строку
    printf("Result string:\n%s", str);
 
    free(str);
 
    return 0;
}
legend
 Аватар для legend
28 / 27 / 0
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 22:41  [ТС]     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #9
ага спс..
..

п.с. но я чет не доканца вьехал прикол этого "#define N 80"

const int N = 80
я так понял это создание константы. (я просто такое впервой вижу). так почему низя тупо написать что N=80 и не париться..
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.11.2010, 22:44     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #10
Да можно конечно, т.к. в этом случае я использую динамическое выделение памяти. Но, например, если бы массив задавался статически (char M[K][N]; ), то просто int N; не проканало бы, поскольку это переменная, вычисляющаяся на этапе выполнения, а не на этапе компиляции. Не заморачивайтесь с этим, там много с чем другим заморочиться можно в моём быдлокоде)))
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.11.2010, 23:16     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Второе. Только, чувствую, намудрил страшно...
Можно попробовать таким образом, я особо не размышлял на тем, как это должно работать, но смысл думаю будет понятен.
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
#include <stdio.h>
#include <string.h>
 
#define MAXWORDLEN      32
#define MAXWORDS        16
 
#define MAXSYMBOLS      (MAXWORDLEN * MAXWORDS)
 
#define DELIMETERS      " \n"
 
int main()
{
        int i = 0;
        int nwords = 0;
        char buffer[MAXSYMBOLS];
        char words[MAXWORDS][MAXWORDLEN];
        char *wordptr = NULL;
 
        printf("> ");
        fgets(buffer, MAXSYMBOLS, stdin);
 
        // split source string
        wordptr = strtok(buffer, DELIMETERS);
        for(nwords = 0; nwords < MAXWORDS && wordptr; ++nwords) {
                strncpy(words[nwords], wordptr, MAXWORDLEN);
                wordptr = strtok(NULL, DELIMETERS);
        }
 
        // swap words
        for(i = 0; i + 1 < nwords; i += 2) {
                strncpy(buffer, words[i], MAXWORDLEN);
                strncpy(words[i], words[i+1], MAXWORDLEN);
                strncpy(words[i+1], buffer, MAXWORDLEN);
        }
 
        // pick string
        memset(buffer, 0, MAXSYMBOLS);
        for(i = 0; i < nwords; ++i) {
                strncat(buffer, words[i], MAXWORDLEN);
                strcat(buffer, " ");
        }
 
        printf("%s\n", buffer);
        return 0;
}
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
25.11.2010, 23:26     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #12
Макропідстановки


Макропідстановки реалізуються директивою #define, яка має наступний синтаксис:
#define <ідентифікатор> <текст>
#define <ідентифікатор>(<список параметрів>) <текст>
Директива # define замінює всі входження <ідентифікатора> у вихідному файлі на
<текст>, наступний в директиві за <ідентифікатором>. Цей процес називається
макропідстановкою. <Ідентифікатор> замінюється лише в тому випадку, якщо він являє
собою окрему лексему. Наприклад, якщо <ідентифікатор> є частиною рядка або більш
довгого ідентифікатора, він не замінюється.
<Текст> являє собою набір лексем, таких як ключові слова, константи, ідентифікатори
або вираз. Один або більше пробільних символів повинні відокремлювати <текст> від
<ідентифікатора> (або від укладених в дужки параметрів). Якщо <текст> не вміщується на
один рядок, то він може бути продовжений на наступному рядку, для цього слід набрати в
кінці рядка символ «\» (зворотний слеш) і одразу за ним натиснути клавішу «Enter».
<Текст> може бути опущений. У цьому випадку всі екземпляри <ідентифікатора>
будуть вилучені з вихідного тексту програми. Тим не менше, сам <ідентифікатор>
розглядається як правильно визначений.
<Список параметрів>, якщо він вказаний, містить один або більше ідентифікаторів,
розділених комами, та повинен бути в середині в круглих дужок. Ідентифікатори у списку
повинні відрізнятися один від одного. Їх область дії обмежена макровизначенням, в якому
вони задані. Імена формальних параметрів <тексті> відзначають позиції, в які повинні бути
підставлені фактичні аргументи макровиклику.
У макровиклик слідом за <ідентифікатором> записується в круглих дужках список
фактичних аргументів, що відповідають формальним параметрам з <список параметрів>.
Списки фактичних та формальних параметрів повинні містити одну й те ж кількість елементів.
Не слід плутати підстановки аргументів на макровизначення з передачею аргументів
функції. Підстановки в препроцесор носить чисто текстовий характер. Ніяких обчислень
або перетворень типу при цьому не проводиться.
Після того, як виконана макропідстановка, отриманий рядок знову проглядається для
пошуку інших імен макровизначень. При повторному перегляді не приймається до розгляду
ім'я раніше виробленої макропідстановки. Тому директива #define x x не призведе до за
циклювання препроцесора.
Приклади
#define N 100
#define MULT(a, b) ((a) * (b))
#define MAX(x, y) ((x) > (y)) ? (x) : (y)
Макровиклик MULT (x + y, z) буде замінено на ((x + y) * (z)). При відсутності внутрішніх
дужок вийшло б (x + y * z), що невірно.
Макровиклик MAX (i, a [i + +]) замінити на ((i)> (a [i ++]))? (i): (a [i ++])). Результат
обчислення непередбачуваний.
У директиві #define дві лексеми можуть бути «заклеєно» разом. Для цього їх потрібно
об'єднати знаками ## (Зліва і з права допустимі пробіли). Препроцесор об'єднує такі лексеми
в одну. Наприклад, макровизначення #define VAR (i, j) i ## j при макроклиці VAR (x, 6) утворює
ідентифікатор x6.
Символ #, що поміщаються перед аргументом макровизначення, вказує на
необхідність перетворення його в символьне рядок. При макровиклиці конструкція
#<формальний параметр> замінюється на "<фактичний параметр>".
legend
 Аватар для legend
28 / 27 / 0
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 23:33  [ТС]     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #13
спс но у меня мозк уже в отключке .. завтро почитаю папробую понять

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2010, 04:22     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д.
Еще ссылки по теме:

Поменять местами в строке первое и последнее слово C++
Поменять местами первое и последнее слово в предложении C++
C++ Дана строка, поменять первое слово в строке с последним словом

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.11.2010, 04:22     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. #14
Хм... У меня их нет. Попробуйте поэкспериментировать с расчётом длины строки в функциях (всместо len = strlen(str) + 1; пишите len = strlen(str); )
Yandex
Объявления
26.11.2010, 04:22     Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д.
Ответ Создать тему
Опции темы

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