Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76

Реализовать функцию инвентирования предложения, используя функцию инвентирования слова

30.09.2016, 03:02. Показов 1943. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <iostream>
#include <cstring>
 
using namespace std;
// shablon invert
template <typename T>
T invert(T * massiv, int razmer)
{
   for (int i = 0 , j = razmer - 1 ; i < j ; ++i , --j ) { 
         T  t = massiv[i];                   
         massiv[i] = massiv[j];
         massiv[j] = t;  }
        return *massiv;
}
 
char invert( char *stroka )
{
    size_t len = strlen(stroka);
 
    for ( size_t i = 0; i < len/2; i++ )         //oborachivaet stroku
    {
        char temp = stroka [i];
        stroka[i] = stroka [len-i-1];
        stroka [len-i-1] = temp;
    }
 
         char word[20];int k = 0;
    for ( size_t i = 0, j = 0; i <= len; ++i, ++j ){     
    if ( stroka[i] == ' ' || stroka[i] == '\0' )
    {
           char reversWord[20];
           *reversWord = invert(word,k) ;     
           k = 0;
           ++i;
           j = 0;
 
        for(int l = i - k + 1, g = 0; l < i; l++){     
        stroka[l] = reversWord[g];
        g++;
        }
    }
      else {word[k] = stroka[i];k++;}      
        //++i;
        //j = 0;
 
      }
     return *stroka;
}
//------------------------------------------------------------------------------
int main()
{
    const int 
              MAX = 80;
 
 
    char str [MAX]; 
    cout << "\nVvedit stroku: "; 
    cin.get(str,MAX);    
    *str = invert(str);
    cout <<"Invert stroka: "<<str<<endl; 
 
 
system("PAUSE");
return 0;
}
У меня в задание нужно было использовать перегрузку и шаблоны функций. Invert который шаблон, работает для double,int,char(если слово).Второй invert, должен поменять местами слова в предложении(1 циклом оборачиваю строку, потом 2 отделяю слово, и слово нужно передать в шаблон, там его инвентировать в "нормальный" вид и вернуть во второй invert, а второй invert должен вернуть всё предложение со словами которые были инвентированы.что собственно говоря он и не делает.Помогите пожалуйста, что то я совершенно запутался с указателями и прочим.
Пример: вводим "Hello world" выводится "world Hello".А на данный момент выводится "dlrow olleH".
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2016, 03:02
Ответы с готовыми решениями:

Как можно запустить прогу, не используя функцию Shell, а используя API функцию?
Привет Всем! Подскажите, как можно запустить прогу, не используя функцию Shell, а используя API функцию. Наверное PostMessage или...

Реализовать задачу, используя функцию
есть это: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { char c, x, y; for (x='B', y='E'; y&gt;'@'; x++, y--){ ...

Реализовать и использовать функцию, разбивающую строку на слова
Реализовать и использовать функцию, разбивающую строку на слова int strToWords( const char str, int location); Входные данные: ...

13
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
30.09.2016, 09:08
Зачем в строках 24-29 оборачивать строку, если Вам не нужно ее оборачивать? Я так понял, что нужно просто переставить слова в обратном порядке. Так?
0
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76
30.09.2016, 12:07  [ТС]
ну я сделал что бы происходило вот так:
Hello world->dlrow olleH->dlrow(передается в шаблон Invert) становится world возвращается во второй Invert (так со всеми словами, и потом он(второй Invert) возвращает все предложение).Как сделать по другому я не знаю.
Да, Вы правы что нужно просто сделать так что бы первое слово стало последним, последнее первым и так далее.

Добавлено через 6 минут
Если Вы можете подсказать код, который будет оборачивать предложение с использованием моего шаблона Invert, я буду весь Вам благодарен
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
30.09.2016, 13:49
Вот моя программа. Рабочая. C++Builder 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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <cstring>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
int x, len;
const int MAX = 80;
char copyofstr[MAX];
bool FirstWord = true;
 
//shablon invert
template <typename T>
void invert(T *massiv, int razmer)
{
for(int i=0, j=razmer-1; i < j; ++i, --j){
    T t = massiv[i];
    massiv[i] = massiv[j];
    massiv[j] = t;
    }
//return *massiv;
}
 
char invert(char *stroka)
{
    len = strlen(stroka)/*4 bytes*/;
    int popolam = len/2, k = 0, i, j, l, m;
    char word[20], reversWord[20];
 
    //Invertiruet stroku
    for(i = 0; i < popolam; i++){
        char temp = stroka[i];
        stroka[i] = stroka[len-i-1];
        stroka [len-i-1] = temp;
        }
    //++++++++++++++++++++++++++++++++++++
 
    for(i = 0, j = 0; i <= len; ++i, ++j){
        if(stroka[i] == ' '||stroka[i] == '\0'){
          invert(word,k);
          for(x = 0; x < len; x++)
              reversWord[x] = word[x];
          //strcpy(reversWord,word);
          j = 0;
 
          for(l = len - i, m = 0; m < k; l++, m++)
              copyofstr[l] = reversWord[m];
          if(!FirstWord) copyofstr[l] = ' ';    
          k = 0;
          FirstWord = false;
          }//if
        else{
          word[k] = stroka[i];
          k++;
          }
          //++i;
          //j = 0;
        }//for(size_t)
     return *stroka;
}
 
int main(int argc, char* argv[])
{
char str[MAX] = "Feedback First.";
//cout << "\nVvedite stroku(" << MAX << "):";
//cin.get(str,MAX);
*str = invert(str);
cout <<"Invert stroka: "<<str<<endl;
cout <<"Copy Of Str: "<<copyofstr<<endl;
 
system("PAUSE");
return 0;
}
//---------------------------------------------------------------------------
0
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76
30.09.2016, 16:03  [ТС]
Работает.А как сделать, что бы оно работало для массива который не инициализирован сразу, а введен с клавиатуры?

Добавлено через 9 минут
я наверное не корректно написал тот комментарий который выше.
Hello world(вводится с клавиатуры и передается в Invert который не шаблон)->dlrow olleH->dlrow(передается в шаблон Invert) становится world возвращается во второй Invert (так со всеми словами, и потом он(второй Invert) возвращает все предложение).

Добавлено через 6 минут
Я ввожу Hello world.инвертирую и выводить должно world Hello;
0
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76
30.09.2016, 16:29  [ТС]
Вот что получается , а нужно что бы инвентировало и предложение и слова. Если можете помогите, пожалуйста.
Миниатюры
Реализовать функцию инвентирования предложения, используя функцию инвентирования слова  
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
30.09.2016, 17:04
Поправил чуть-чуть. С точкой после первого слова пойдет?
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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <cstring>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
int x, len;
const int MAX = 80;
char copyofstr[MAX];
bool FirstWord = true;
 
//shablon invert
template <typename T>
void invert(T *massiv, int razmer)
{
for(int i=0, j=razmer-1; i < j; ++i, --j){
    T t = massiv[i];
    massiv[i] = massiv[j];
    massiv[j] = t;
    }
//return *massiv;
}
 
char invert(char *stroka)
{
    len = strlen(stroka)/*4 bytes*/;
    int popolam = len/2, k = 0, i, j, l, m;
    char word[20], reversWord[20];
 
    //Invertiruet stroku
    for(i = 0; i < popolam; i++){
        char temp = stroka[i];
        stroka[i] = stroka[len-i-1];
        stroka [len-i-1] = temp;
        }
    //++++++++++++++++++++++++++++++++++++
 
    for(i = 0, j = 0; i <= len; ++i, ++j){
        if(stroka[i] == ' '||stroka[i] == '\0'){
          invert(word,k);
          for(x = 0; x < k; x++)
              reversWord[x] = word[x];
          //strcpy(reversWord,word);
          j = 0;
         
          //for(l = len - i, m = 0; m < k; l++, m++)
          for(l = i-k, m = 0; m < k; l++, m++)
              copyofstr[l] = reversWord[m];
          if(FirstWord) copyofstr[l] = ' ';
          k = 0;
          FirstWord = false;
          }//if
        else{
          word[k] = stroka[i];
          k++;
          }
          //++i;
          //j = 0;
        }//for(size_t)
     return *stroka;
}
 
int main(int argc, char* argv[])
{
char str[MAX] = "Feedback First.";
/*len = strlen(str);
for(x = 0; x < len; x++)
    copyofstr[x] = str[x];*/
//cout << "\nVvedite stroku(" << MAX << "):";
//cin.get(str,MAX);
*str = invert(str);
cout <<"Invert stroka: "<<str<<endl;
cout <<"Copy Of Str: "<<copyofstr<<endl;
 
system("PAUSE");
return 0;
}
//---------------------------------------------------------------------------
Добавлено через 3 минуты
Цитата Сообщение от Xleb Посмотреть сообщение
Работает.А как сделать, что бы оно работало для массива который не инициализирован сразу, а введен с клавиатуры?
- Вы так сильно не тупите, читайте код хоть чуть-чуть. И вообще нужно уметь разбираться в чужом коде программиста. Там просто надо комментарии убрать со строк 74 и 75.
0
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76
30.09.2016, 17:08  [ТС]
А можете подправить что бы работало для предложений больше нежели два слова ?
Миниатюры
Реализовать функцию инвентирования предложения, используя функцию инвентирования слова  
0
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76
30.09.2016, 17:14  [ТС]
Я понял что протупил насчет комментирования, хотел отредактировать, а время для редактирования прошло.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
30.09.2016, 17:33
Лучший ответ Сообщение было отмечено Xleb как решение

Решение

А, блин, щас посмотрю.

Добавлено через 11 минут
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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <cstring>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
int x, len;
const int MAX = 80;
char copyofstr[MAX];
bool LastWord = false;
 
//shablon invert
template <typename T>
void invert(T *massiv, int razmer)
{
for(int i=0, j=razmer-1; i < j; ++i, --j){
    T t = massiv[i];
    massiv[i] = massiv[j];
    massiv[j] = t;
    }
//return *massiv;
}
 
char invert(char *stroka)
{
    len = strlen(stroka)/*4 bytes*/;
    int popolam = len/2, k = 0, i, j, l, m;
    char word[20], reversWord[20];
 
    //Invertiruet stroku
    for(i = 0; i < popolam; i++){
        char temp = stroka[i];
        stroka[i] = stroka[len-i-1];
        stroka [len-i-1] = temp;
        }
    //++++++++++++++++++++++++++++++++++++
 
    for(i = 0, j = 0; i <= len; ++i, ++j){
        if(stroka[i] == ' '||stroka[i] == '\0'){
          if((stroka[i] == '\0')||(i ==(len-1)))
              LastWord = true;
 
          invert(word,k);
          for(x = 0; x < k; x++)
              reversWord[x] = word[x];
          //strcpy(reversWord,word);
          j = 0;
          
          //for(l = len - i, m = 0; m < k; l++, m++)
          for(l = i-k, m = 0; m < k; l++, m++)
              copyofstr[l] = reversWord[m];
          if(!LastWord) copyofstr[l] = ' ';
          k = 0;
          }//if
        else{
          word[k] = stroka[i];
          k++;
          }
          //++i;
          //j = 0;
        }//for(size_t)
     return *stroka;
}
 
int main(int argc, char* argv[])
{
char str[MAX] = "First Second Third Fourth";
/*len = strlen(str);
for(x = 0; x < len; x++)
    copyofstr[x] = str[x];*/
//cout << "\nVvedite stroku(" << MAX << "):";
//cin.get(str,MAX);
cout <<"Ishodnaya stroka: "<<str<<endl;
*str = invert(str);
cout <<"Invert stroka: "<<str<<endl;
cout <<"Copy Of Str: "<<copyofstr<<endl;
 
system("PAUSE");
return 0;
}
//---------------------------------------------------------------------------
1
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76
30.09.2016, 17:39  [ТС]
copyofstr в ней как бы находится правильная строка (которая уже инвентированая) и которую Вы выводите.
А разве вот такая операция (*str = invert(str); ) , не должна была записать в str измененную(конечную, с измененным порядком, нормальных слов) строку?У меня просто именно с этим возникали трудности и я пытаюсь разобраться.Просто когда я работаю с массивами чисел, то я делаю (*intMassiv=invert(intMassiv,iSize)) передаю в шаблон, и вывожу же intMassiv, а здесь Вы сделали по другом.Это какая то особенность или Вы просто так решили, для удобства?

По поводу кода, огромная благодарность.всё работает именно так как нужно.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
30.09.2016, 17:57
Работает так: в 29 строке передается исходная строка - никаких изменений нет. В строках 35-41 она инвертируется наоборот. Дальше с ней ничего не происходит и в 67 строке она выводится и все!
0
1 / 1 / 1
Регистрация: 07.03.2015
Сообщений: 76
30.09.2016, 18:06  [ТС]
Да, это я понимаю.А можно было сделать так что бы внутри функции Invert , строке присвоить то что Вы присвоили copyofstr, и что когда функция возвращала *stroka , в int main str при вызове функции (*str=invert(str)) присваивалось то что нужно (полностью измененное нормально предложение) и мы выводили str и все.
То есть что бы был массив, его закинули в функцию , он там изменился полностью и его же мы вывели?
приношу свои извинения за то что подтупливаю.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
30.09.2016, 18:53
Между 66 и 67 строкой вставь код:
C++
1
2
for(x = 0; x < len; x++)
    stroka[x] = copyofstr[x];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.09.2016, 18:53
Помогаю со студенческими работами здесь

Поменять местами четные слова с нечетными, используя функцию strtok
Здравствуйте! Помогите, пожалуйста, написать программу, которая меняет местами четные слова с нечетными, используя функцию strtok. Без...

Используя битовые операции, реализовать функцию вывода десятичного числа в двоичном виде
Здравствуйте! Есть такая задача: Написать программу, в которой будет реализована функция вывода десятичного числа в двоичном виде. С...

Реализовать рекурсивную функцию умножения двух натуральных чисел, используя рекуррентное соотношение
Написать программу решения на с++. Помогите, пожалуйста.

Оформить процедуру / функцию вычисления модуля числа, не используя функцию abs
Оформить процедуру вычисления модуля числа, не используя функцию abs. ...

Реализовать функцию strstr на ассемблере, и подключить эту функцию в проект MVS2008
Нужно реализовать функцию strstr на ассемблере, и подключить эту функцию в проет MVS2008. Код функции: .386 extern _strstr:near...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru