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

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

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

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

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

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

Дополнить каждое слово предложения пробелами (по длине максимального слова) - C++
Вот задачка. "Дополнить каждое слово предложения пробелами так, чтобы его длина была равна длине самого длинного слова. Распечатать...

дополнить пробелами каждое слово так, чтобы его длинна приравнялась длинне самого длинного слова в строке - C++
Язык Си. Нужна помощь с файлами. Компиляция проходит успешно, но при запуске Windows выдает ошибку. Задача программы: дополнить пробелами...

Дана строка, содержащая разделенные пробелами слова, вывести все слова-палиндромы - C++
Дана строка, содержащая разделенные пробелами слова.Вивесты все имеющиеся слова-палиндлромы и их общее количество,срочно надо,у меня не...

Дана строка текста, в которой слова разделены пробелами и запятыми, вывести повторяющиеся слова - C++
Помогите пожалуйста! Как мне найти и вывести повторяющиеся слова? П.С. При работе со строками не использовать указатели. Строки...

Поменять местами первые слова (слова разделены пробелами) заданных строк, без использования процедур - C++
Вводятся две строки произвольного текста. Поме-нять местами их первые слова (слова разделены пробелами). без подпроцедур.

Дана строка, слова в которой разделены пробелами. Оставьте в ней только те слова, которые начинаются на ту же букву, что и первое слово. - C++
5.17 Дана строка, слова в которой разделены пробелами. Оставьте в ней только те слова, которые начинаются на ту же букву, что и первое...

Вводится строка каждое слово которой отделяется от других слов одним или несколькими пробелами. - C++
Вводится строка каждое слово которой отделяется от других слов одним или несколькими пробелами. Найти количество слов состоящих из пяти...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Форумчанин
Эксперт С++
4510 / 2852 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 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
Форумчанин
Эксперт С++
4510 / 2852 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Форумчанин
Эксперт С++
4510 / 2852 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
15.11.2010, 22:05     Дополнить каждое слова пробелами(по количеству максимального) #12
ridd[73rus], Сразу говорить надо было что на Си...
Kastaneda
Форумчанин
Эксперт С++
4510 / 2852 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Форумчанин
Эксперт С++
4510 / 2852 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 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++
Дан текст, содержащий от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними словами - не менее одного пробела....

ООП. Напечатать слова, отличные от последнего слова, предварительно преобразовав каждое из них по правилу - C++
Напечатать слова, отличные от последнего слова, предварительно преобразовав каждое из них по правилу: удалить из слова первую букву....

Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по заданному правилу - C++
Дан текст, содержащий от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними словами - не менее одного пробела....

Отсортировать слова по количеству гласных букв - C++
Помогите написать программу для Visual C++. Сам не очень разбираюсь, желательно чтобы было понятно. Сама программа &quot;Есть файл, в файле...

Сортировать слова по количеству букв (по возрастанию) - 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