29 / 28 / 7
Регистрация: 17.11.2010
Сообщений: 152
1

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

24.11.2010, 17:35. Показов 4614. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем ку. =)

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

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

спс заранее.

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

Добавлено через 31 минуту
heeelp
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2010, 17:35
Ответы с готовыми решениями:

Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д
Помогите, пожалуйста решить задачку с использованием класса string. Я только учусь, и меня пока...

Поменять слова в строке: первое со вторым, второе с третьим, третье с четвертым
Сейчас программа выдает по такому принципу: Поменять слова в сообщении по принципу: первое с n/2+1...

В массиве S поменять местами элементы: первый со вторым, третий с четвертым и т.д.
Помогите написать код к заданию: "В массиве S поменять местами элементы: первый со вторым, третий...

Дана строка. Поменять Первое слово с последним, второе с предпоследним и т.д
Не понимаю как сделать вообше.

13
0 / 0 / 1
Регистрация: 09.11.2010
Сообщений: 47
24.11.2010, 18:21 2
сейчас попробую написать, есть парочка идей
0
29 / 28 / 7
Регистрация: 17.11.2010
Сообщений: 152
24.11.2010, 18:41  [ТС] 3
даже если не будет работать.. скинь код проги сюда.. =)

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

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

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

Не по теме:

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

0
0 / 0 / 1
Регистрация: 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];
 
 
}
0
29 / 28 / 7
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 21:02  [ТС] 5
у когонить есть еще соображения по этой задаче??

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

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



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

Добавлено через 1 час 13 минут
ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ
0
Эксперт С++
5056 / 3116 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
1
29 / 28 / 7
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 21:38  [ТС] 7
спс за подробные комментарии по коду..

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

ет че за зверЪЪ ??
0
Эксперт С++
5056 / 3116 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
1
29 / 28 / 7
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 22:41  [ТС] 9
ага спс..
..

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

const int N = 80
я так понял это создание константы. (я просто такое впервой вижу). так почему низя тупо написать что N=80 и не париться..
0
Эксперт С++
5056 / 3116 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.11.2010, 22:44 10
Да можно конечно, т.к. в этом случае я использую динамическое выделение памяти. Но, например, если бы массив задавался статически (char M[K][N]; ), то просто int N; не проканало бы, поскольку это переменная, вычисляющаяся на этапе выполнения, а не на этапе компиляции. Не заморачивайтесь с этим, там много с чем другим заморочиться можно в моём быдлокоде)))
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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;
}
1
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.
Символ #, що поміщаються перед аргументом макровизначення, вказує на
необхідність перетворення його в символьне рядок. При макровиклиці конструкція
#<формальний параметр> замінюється на "<фактичний параметр>".
2
29 / 28 / 7
Регистрация: 17.11.2010
Сообщений: 152
25.11.2010, 23:33  [ТС] 13
спс но у меня мозк уже в отключке .. завтро почитаю папробую понять

Не по теме:

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

0
Эксперт С++
5056 / 3116 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.11.2010, 04:22 14
Хм... У меня их нет. Попробуйте поэкспериментировать с расчётом длины строки в функциях (всместо len = strlen(str) + 1; пишите len = strlen(str); )
0
26.11.2010, 04:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2010, 04:22
Помогаю со студенческими работами здесь

Дана строка, поменять первое слово в строке с последним словом
Это код на Паскале. есть ли аналогии copy и delete в c++? Подскажите как лучше написать код на...

Дан массив. Поменять местами его первый элемент со вторым, третий - с четвертым и т.д.
Скоро экзамен , кто чем может ) Помоги ближнему , ибо смех продлевает жизнь...) 16. Дан...

Поменять первый элемент со вторым,третий с четвертым и т.д
Дан массив из четного числа элементов.Поменять первый элемент со вторым,третий с четвертым и т.д. В...

Поменять местами первое и последнее слово
Помогите решить задачу, используя строки. В заданном тексте (слова разделены пробелами) поменять...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru