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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
ridd[73rus]
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 17
#1

Дополнить каждое слова пробелами(по количеству максимального) - C++

15.11.2010, 14:09. Просмотров 1158. Ответов 19
Метки нет (Все метки)

Вот задачка. "Дополнить каждео слово предложения пробелами так , чтобы его длина была равна длине самого длинного слова. Распечатать получившееся предложение." Решить задачку нужно используя отдельную функция на каждое действие. Применение глобальных йункций запрещено. Мне уже решали данную задачу , но не без последнего условия , проще помочь. Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2010, 14:09     Дополнить каждое слова пробелами(по количеству максимального)
Посмотрите здесь:

Дополнить каждое слово предложения пробелами (по длине максимального слова) C++
C++ дополнить пробелами каждое слово так, чтобы его длинна приравнялась длинне самого длинного слова в строке
C++ Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по заданному правилу
Поменять местами первые слова (слова разделены пробелами) заданных строк, без использования процедур C++
Вводится строка каждое слово которой отделяется от других слов одним или несколькими пробелами. C++
Дана строка, слова в которой разделены пробелами. Оставьте в ней только те слова, которые начинаются на ту же букву, что и первое слово. C++
C++ Дана строка символов, состоящая из произвольного текста, слова раз-делены пробелами. Вывести на экран порядковый номер слова, накрывающего k позицию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2010, 14:15     Дополнить каждое слова пробелами(по количеству максимального) #2
ridd[73rus], Глобальных функций запрещено? Через класс или прострнаство имен что-ли? оО
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.11.2010, 14:15     Дополнить каждое слова пробелами(по количеству максимального) #3
Цитата Сообщение от ridd[73rus
;1112058]Применение глобальных йункций запрещено
простите, но что это значит?
almazsr
232 / 169 / 7
Регистрация: 13.11.2010
Сообщений: 425
15.11.2010, 14:16     Дополнить каждое слова пробелами(по количеству максимального) #4
Это чтобы был красивый вывод: определенное количество символов на строку с переносом слов?
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
15.11.2010, 15:36     Дополнить каждое слова пробелами(по количеству максимального) #5
Цитата Сообщение от ForEveR Посмотреть сообщение
ridd[73rus], Глобальных функций запрещено? Через класс или прострнаство имен что-ли? оО
Сомневаюсь, возможно ТС не совсем понял, что написал. Возможно имелось ввиду "глобальных переменных" или, что-нибудь в этом роде.
ridd[73rus]
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 17
15.11.2010, 17:05  [ТС]     Дополнить каждое слова пробелами(по количеству максимального) #6
Изввиняюсь , именно Глобальных переменных .
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
15.11.2010, 18:25     Дополнить каждое слова пробелами(по количеству максимального) #7
Как вариант:
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
#include<iostream>
#include<sstream>
#include<iomanip>
using namespace std;
ostream& addspace(ostream& ob,string& S){
    istringstream s(S);
    stringstream Os;
    int max=0;
    int countword=0;
    while(s>>S){
        if(S.size()>max)
            max=S.size();
        Os<<S<<' ';
        countword++;
    }
    while(countword){
    Os>>S;  
    ob<<setw(max)<<left<<S<<' ';
    countword--;
    }
    return ob;
}
 
int main(){
string S;
cout<<"Enter string: ";
getline(cin,S);
cout<<"String with space ";
addspace(cout,S)<<endl;
system("pause");
return 0;
}
В ф-ции хотел создать пустой поток, загнать туда строку с setw() и вернуть этот поток в cout - неполучилось( Может кто-нибудь подскажет, как это реализовать?

P.S. мы же тут не только из-за альтруизма, мы тоже учимся )))
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2010, 20:45     Дополнить каждое слова пробелами(по количеству максимального) #8
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
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
 
int main()
{
     std::string Str;
     std::vector<std::string> Vec;
     std::getline(std::cin, Str);
     std::istringstream ist(Str);
     std::string tmp;
     while(ist>>tmp)
         Vec.push_back(tmp);
     size_t maxlen=0;
     for(std::vector<std::string>::const_iterator It=Vec.begin();
          It!=Vec.end();
          ++It)
     {
          if(It->size()>maxlen)
             maxlen=It->size();
     }
     for(std::vector<std::string>::iterator It=Vec.begin();
          It!=Vec.end();
          ++It)
     {
          It->append(maxlen-It->size(), ' ');
     }
     for(std::vector<std::string>::const_iterator It=Vec.begin();
          It!=Vec.end();
          ++It)
     {
          std::cout<<*It<<' ';
     }
     std::cout<<'\n';
     return 0;
}
Добавлено через 12 минут
Kastaneda, Не понимаю зачем тебе вообще возврат потока. Явно мы результат функции все равно присвоить не сможем. А подаешь ты по ссылке. Так в чем проблема?
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
15.11.2010, 20:52     Дополнить каждое слова пробелами(по количеству максимального) #9
ForEveR, а случайно не знаете как реализовать:
Цитата Сообщение от Kastaneda Посмотреть сообщение
В ф-ции хотел создать пустой поток, загнать туда строку с setw() и вернуть этот поток в cout
?
Объясню на примере:

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
ostream& addspace(string& S){
        stringstream s(S);
        stringstream Os;
        int max=0;
        int countword=0;
        while(s>>S){
                if(S.size()>max)
                        max=S.size();
                Os<<S<<' ';
                countword++;
        }
        while(countword){
        Os>>S;  
        s<<setw(max)<<left<<S<<' ';//вот тут просто заполняем поток
        countword--;
        }
        return s;//и возвращаем его
}
 
int main(){
string S;
cout<<"Enter string: ";
getline(cin,S);
cout<<"String with space "<<addspace(S)<<endl;//возвращенный заполненый поток выводим в cout
system("pause");
return 0
Но так не работает, не могу придумать как это реализовать(

Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Kastaneda, Не понимаю зачем тебе вообще возврат потока. Явно мы результат функции все равно присвоить не сможем. А подаешь ты по ссылке. Так в чем проблема?
Проблема в том, что я вообще не уверен, что такое возможно. Кое как добился компиляции этого кода, но выводится что-то походжее на адресс.

"Явно мы результат функции все равно присвоить не сможем." - не понял о чем речь?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2010, 21:24     Дополнить каждое слова пробелами(по количеству максимального) #10
Kastaneda, Как мы можем вывести поток в cout? Зачем вам это?
При вызове функции addspace(S, cout) - все ведь нормально работает и поток изменяется...

Добавлено через 8 минут
C++
1
cout.rdbuf(addspace(S).rdbuf());//меняем поток на тот который вернулся из функции
Добавлено через 10 минут
А если ты хочешь вывести поток в поток... То сомневаюсь
ridd[73rus]
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 17
15.11.2010, 21:54  [ТС]     Дополнить каждое слова пробелами(по количеству максимального) #11
вот тут прикреплён файл с методичкой ,может вам поможет.
Вложения
Тип файла: pdf Язык Си часть 2.pdf (471.4 Кб, 46 просмотров)
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2010, 22:05     Дополнить каждое слова пробелами(по количеству максимального) #12
ridd[73rus], Сразу говорить надо было что на Си...
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
16.11.2010, 16:40     Дополнить каждое слова пробелами(по количеству максимального) #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Kastaneda, Зачем вам это?
Да просто для себя, хотел понять
А если ты хочешь вывести поток в поток... То сомневаюсь
Вот и я о чем. Мне интересно было - это я так не могу сделать или это реально не возможно ? После уже подумал - да, "поток в поток" - это глупость)
ridd[73rus]
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 17
16.11.2010, 20:12  [ТС]     Дополнить каждое слова пробелами(по количеству максимального) #14
Цитата Сообщение от ForEveR Посмотреть сообщение
ridd[73rus], Сразу говорить надо было что на Си...
Раздел называется С/C++ для начинающих , я и выложил сюда задачку по C.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
16.11.2010, 20:28     Дополнить каждое слова пробелами(по количеству максимального) #15
ridd[73rus], Принято указывать на каком языке. Чистый Си или С++ сильно различаются.
ridd[73rus]
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 17
16.11.2010, 20:50  [ТС]     Дополнить каждое слова пробелами(по количеству максимального) #16
Извиняюсь. Чистый Си.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
16.11.2010, 23:20     Дополнить каждое слова пробелами(по количеству максимального) #17
clear C

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
#include <string.h>
#include <stdio.h>
#include <malloc.h>
 
#define MAX_STR_LEN 250
#define MAX_WORDS_NUMB 30
 
int main()
{
    char Str[MAX_STR_LEN];
    char Arr[MAX_WORDS_NUMB][MAX_STR_LEN];
    fprintf(stdout, "Enter string\n");
    fgets(Str, MAX_STR_LEN, stdin);
    Str[strlen(Str)]='\0';
    char* ptr=strtok(Str, " ");
    if(ptr)
        strcpy(Arr[0], ptr);
    int cnt=1;
    while(ptr)
    {
        ptr=strtok(0, " ");
        if(ptr)
        {
            strcpy(Arr[cnt], ptr);
            ++cnt;
        }
    }
    int i=0;
    int max_strlen=0;
    for(i; i<cnt; ++i)
    {
        if(i==cnt-1)
        {
            Arr[i][strlen(Arr[i])-1]='\0';
        }
        int t=strlen(Arr[i]);
        if(t>max_strlen)
            max_strlen=t;
    }
    char* String;
    for(i=0; i<cnt; ++i)
    {
        int t=strlen(Arr[i]);
        int p=max_strlen-t;
        if(p!=0)
        {
            String=(char*) malloc(sizeof(char)*(p+1));
            memset(String, ' ', sizeof(char)*p);
            String[p]='\0';
            strcat(Arr[i], String);
            free(String);
        }
    }
    for(i=0; i<cnt; ++i)
    {
        fprintf(stdout, "%s ", Arr[i]);
    }
    fprintf(stdout, "\n");
    return 0;
}
Добавлено через 53 минуты
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
#include <string.h>
#include <stdio.h>
#include <malloc.h>
 
/*Макс длина строки*/
#define MAX_STR_LEN 250
/*Макс кол-во слов*/
#define MAX_WORDS_NUMB 30
 
/*Функция, разделающая строку на слова.
Между словами должны быть пробелы*/
int Token(char* Str, char Arr[][MAX_STR_LEN])
{
    int cnt=0;
    char* ptr=strtok(Str, " ");
    if(ptr)
    {
        strcpy(Arr[cnt], ptr);
        ++cnt;
    }
    while(ptr)
    {
        ptr=strtok(0, " ");
        if(ptr)
        {
            strcpy(Arr[cnt], ptr);
            ++cnt;
        }
    }
    return cnt;
}
/*Функция поиска максимальной длины строки*/
int find_max_len(int cnt, char Arr[][MAX_STR_LEN])
{
    int i=0, t=0, max_strlen=0;
    for(i; i<cnt; ++i)
    {
        if(i==cnt-1)
        {
            /*Убираем последний символ в последнем слове
            - перевод строки. '\n', если по простому.*/
            Arr[i][strlen(Arr[i])-1]='\0';
        }
        t=strlen(Arr[i]);
        if(t>max_strlen)
           max_strlen=t;
    }
    return max_strlen;
}
/*Трансформация строки. Функция добавления пробелов*/
void transform_string(char Arr[][MAX_STR_LEN], int cnt, int max_strlen)
{
    /*Временная строка*/
    char* String;
    int i=0, t=0, p=0;
    for(i; i<cnt; ++i)
    {
        t=strlen(Arr[i]);
        /*Находим насколько символов отличается
        длина i-ого слова от максимальной длины слова*/
        p=max_strlen-t;
        if(p!=0)
        {
            String=(char*) malloc(sizeof(char)*(p+1));
            /*Заполняем p пробелами временную строку*/
            memset(String, ' ', sizeof(char)*p);
            /*Ограничиваем строку нулевым терминатором*/
            String[p]='\0';
            strcat(Arr[i], String);
            free(String);
        }
    }
}
/*Печать измененной строки*/
void print_str(char Arr[][MAX_STR_LEN], int cnt)
{
    int i=0;
    for(i; i<cnt; ++i)
    {
        fprintf(stdout, "%s ", Arr[i]);
    }
    fprintf(stdout, "\n");
}
/*Главная функция*/
int main()
{
    char Str[MAX_STR_LEN];
    char Arr[MAX_WORDS_NUMB][MAX_STR_LEN];
    fprintf(stdout, "Enter string\n");
    fgets(Str, MAX_STR_LEN, stdin);
    int i=0, max_strlen=0;
    int cnt=Token(Str, Arr);
    max_strlen=find_max_len(cnt, Arr);
    transform_string(Arr, cnt, max_strlen);
    print_str(Arr, cnt);
    return 0;
}
ridd[73rus]
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 17
21.11.2010, 14:40  [ТС]     Дополнить каждое слова пробелами(по количеству максимального) #18
программа должна работать вот в этом компиляторе http://rapidshare.com/files/432181885/CodeBlocks.rar. заранее благодарен
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
21.11.2010, 14:52     Дополнить каждое слова пробелами(по количеству максимального) #19
ridd[73rus], так должно работать. Вышеприведнные коды используют только стандартные библиотеки языка, так что должно компилироваться любым компилятором.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2010, 09:19     Дополнить каждое слова пробелами(по количеству максимального)
Еще ссылки по теме:

ООП. Напечатать слова, отличные от последнего слова, предварительно преобразовав каждое из них по правилу C++
Дана строка, содержащая разделенные пробелами слова, вывести все слова-палиндромы C++
Сортировать слова по количеству букв (по возрастанию) C++
Дана строка текста, в которой слова разделены пробелами и запятыми, вывести повторяющиеся слова C++
C++ Отсортировать слова по количеству гласных букв

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

Или воспользуйтесь поиском по форуму:
ridd[73rus]
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 17
23.11.2010, 09:19  [ТС]     Дополнить каждое слова пробелами(по количеству максимального) #20
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
void AddSpaces(char str[256], char cstr[256]); // прототип
 
void main()
{
        char str[256]; // это строка 
                char cstr[256];
                AddSpaces(str,cstr);
puts(cstr);// выводим то что у нас получилось
_getch();
}
 
void AddSpaces(char str[256], char cstr[256])
{
        char spaces[20] = {"          "}; // массив пробелов
        gets(str); // ввод строки с клавиатуры
        strcpy(cstr,str); // создаем копию(копируем из str в cstr)
        char * pch; // указатель на символы
        int max_len = 0 ; // длина максимального слова
        int length; // длина отдельно взятого слова
        int dif; // разница в длине
pch = strtok(cstr," "); // указатель указывает на первое слово строки(то что до первого пробела)
while(pch != NULL)
{       
length = strlen(pch); // длина слова
if(max_len < length) max_len = length; // выводим максимальную длину слова
pch = strtok(NULL," "); // переходим к следующему слову
}
 
strcpy(cstr,""); // теперь cstr пустая строка
pch = strtok(str," "); // берем первое слово из str
 
while(pch != NULL)
{
length = strlen(pch); // измеряем его длину
dif = max_len - length; // сравниваем с максимальной
strcat(cstr,pch); // присоединяем его к cstr
strncat(cstr,spaces,dif); // присоединяем к cstr из spaces кол-во пробелов(dif)
pch = strtok(NULL," "); // и так далее до конца строки
}
}

вот это более простое решение задачи , но его нужно разбить на отдельные функции . Сделайте пожалуйста.
выглядеть должно примерно вот так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[// Ввод предложения
void InpPredl(char *s)
{
puts(" Введите предложение \n");
strcpy (s," Верите ли вы, что задача решена?");
// gets (s);
}
// Вывод результата
void OutPredl (char *s1, char *s2)
{
puts ("Исходное предложение");
puts (s1);
puts (" Результат ");
puts (s2);
getch ();
}
Yandex
Объявления
23.11.2010, 09:19     Дополнить каждое слова пробелами(по количеству максимального)
Ответ Создать тему
Опции темы

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