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

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

30.09.2016, 03:02. Показов 1920. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru