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

Отредактировать текст так, чтобы между словами был ровно один пробел - C++

Восстановить пароль Регистрация
 
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
19.04.2010, 21:57     Отредактировать текст так, чтобы между словами был ровно один пробел #1
Люди, плз помогите с задачами :

№ 1. Даны две символьные строки, состоящие только из цифр (длина каждой - более 10 символов). Считая, что в этих строках находятся очень длинные целые числа, сформировать третью строку - сумму этих чисел.

№ 2. Дан произвольный текст. Отредактировать текст так, чтобы:
а) между словами был ровно один пробел;
б) предложения в тексте разделялись ровно двумя пробелами.
Очень прошу - HELP!!!

Добавлено через 13 минут
НА языке Си
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2010, 21:57     Отредактировать текст так, чтобы между словами был ровно один пробел
Посмотрите здесь:

Добавить пробел между словами C++
C++ Преобразовать строку так, чтобы между словами был ровно один пробел
C++ в строке между словами вставить вместо пробела запятую и пробел?
C++ В строке между словами вставить вместо пробела запятую и пробел
C++ В тексте вставить между словами вместо одного пробела запятую и пробел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
delfamur
 Аватар для delfamur
42 / 42 / 0
Регистрация: 16.03.2010
Сообщений: 199
19.04.2010, 21:57     Отредактировать текст так, чтобы между словами был ровно один пробел #2
предположим, №1
C++
1
IntToStr(sum=StrToInt(a)+StrToInt(b));
Добавлено через 23 секунды
это результат 3 строки
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
19.04.2010, 21:59  [ТС]     Отредактировать текст так, чтобы между словами был ровно один пробел #3
по-моему не все так просто
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
19.04.2010, 22:02     Отредактировать текст так, чтобы между словами был ровно один пробел #4
а на с++ не пойдет?
delfamur
 Аватар для delfamur
42 / 42 / 0
Регистрация: 16.03.2010
Сообщений: 199
19.04.2010, 22:02     Отредактировать текст так, чтобы между словами был ровно один пробел #5
все гениальное просто, а ты думаешь, что тут все сложно)))
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
19.04.2010, 22:04     Отредактировать текст так, чтобы между словами был ровно один пробел #6
Цитата Сообщение от delfamur Посмотреть сообщение
IntToStr(sum=StrToInt(a)+StrToInt(b));
неправильно, ему же надо сумму цифр строк, а не сумму строк
delfamur
 Аватар для delfamur
42 / 42 / 0
Регистрация: 16.03.2010
Сообщений: 199
19.04.2010, 22:08     Отредактировать текст так, чтобы между словами был ровно один пробел #7
ему нужно сложить 2 числа. так и есть

Добавлено через 2 минуты
я проверял
C++
1
IntToStr(StrToInt(a)+StrToInt(b));
можно даже так)))без интов
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
19.04.2010, 22:10     Отредактировать текст так, чтобы между словами был ровно один пробел #8
а если a или b больше INT_MAX? - ошибка

Добавлено через 40 секунд
a=555555555555555;
b=66666666666666666;
a+b=?
delfamur
 Аватар для delfamur
42 / 42 / 0
Регистрация: 16.03.2010
Сообщений: 199
19.04.2010, 22:13     Отредактировать текст так, чтобы между словами был ровно один пробел #9
ну извините, выбрать тип данных для работы в состоянии ведь

Добавлено через 50 секунд
можно складывать по 6
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
19.04.2010, 22:13  [ТС]     Отредактировать текст так, чтобы между словами был ровно один пробел #10
кстати да,PointsEqual прав по-моему; на си++ пойдет, если у меня получится переделать. то вообще круто =)
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
21.04.2010, 20:02  [ТС]     Отредактировать текст так, чтобы между словами был ровно один пробел #11
Народ, плз помогите
Для задачи №2: Вот короче программка, которая удаляет из строки все пробелы
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
#include <stdio.h>
void compress(char *str)
{
    int i=0,j=0,k=0,l=0;
    while(str[i]==' ')
        i++;
    while(1)
    {
        while(str[j]!=' ' && str[j]!='\0')
            j++;
        if(str[j]=='\0') break;
            k=j;
        while(str[k]==' ') k++;
            l=j;
        do
        {
            str[l]=str[k];
            l++;k++;
        }while(str[k-1]!='\0');
    }
}
int main()
{
    char str[100];
    printf("Enter string:\n");
    gets(str);
    compress(str);
    printf("After compressing:\n");
    puts(str);
    return 0 ;
}
Я не знаю как ее переделать, чтобы 1)между словами был только 1 пробел;2)2 пробела.
Кто может - хелп плз

Добавлено через 11 минут
Плз хел еще с этим
Для задачи №1:
Вот что я нешел, мне надо это как-то сложить все в кучу и чтобы получилась норм код, но я не знаю как сделать.
Это вроде на С++, а как на С переделать (тут исп. atoi, lnum
тут типо используем длинную арифметику( http://e-maxx.ru/algo/big_integer )

C
1
2
const int base = 1000*1000*1000*1000; // 12 цифр
typedef vector<int> lnum;
Чтение( используем массив char'ов:
C
1
2
3
4
for (int i=(int)strlen(s); i>0; i-=9) {
    s[i] = 0;
    a.push_back (atoi (i>=9 ? s+i-9 : s));
}
Сложение:
C
1
2
3
4
5
6
7
8
int carry = 0;
for (size_t i=0; i<max(a.size(),b.size()) || carry; ++i) {
    if (i == a.size())
        a.push_back (0);
    a[i] += carry + (i < b.size() ? b[i] : 0);
    carry = a[i] >= base;
    if (carry)  a[i] -= base;
}
Вывод :
C
1
2
3
printf ("%d", a.empty() ? 0 : a.back());
for (int i=(int)a.size()-2; i>=0; --i)
    printf ("%09d", a[i]);
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.04.2010, 20:09     Отредактировать текст так, чтобы между словами был ровно один пробел #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
1. Выглядит мрачновато, но работает
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_NUM 32
 
char *chrsum(const char *a, const char *b){
    static char buf[MAX_NUM];
    const char *pa, *pb;
    char  *pBuf;
    int over, sum;
 
    memset(buf, 0, sizeof(buf));
    pa = a + strlen(a) - 1;
    pb = b + strlen(b) - 1;
    pBuf = buf + sizeof(buf) - 2;
    over = 0;
    while ( pBuf >= buf ){
        sum = over + ( pa < a ? 0 : (*pa-- - '0') ) + ( pb < b ? 0 : (*pb-- - '0') );
        if ( !sum )
            break;
        over = sum / 10;
        sum = sum % 10 + '0';
        *pBuf-- = sum;
    }
 
    return ++pBuf;
}
 
int main(void){
    char a[MAX_NUM], b[MAX_NUM], *p;
 
    while ( 1 ){
        printf("A = ");
        if ( !fgets(a, MAX_NUM, stdin) )
            exit(1);
        if ( p = strrchr(a, '\n') )
            *p = '\0';
        if ( !*a )
            break;
        printf("B = ");
        if ( !fgets(b, MAX_NUM, stdin) )
            exit(1);
        if ( p = strrchr(b, '\n') )
            *p = '\0';
        if ( !*b )
            break;
        printf("A + B = %s\n", chrsum(a, b));
    }
    exit(0);
}
Для выхода просто enter нажать...
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
21.04.2010, 22:37  [ТС]     Отредактировать текст так, чтобы между словами был ровно один пробел #13
а не могли бы Вы по хлду задачи объяснить ?
C
1
2
3
4
5
    memset(buf, 0, sizeof(buf));
    pa = a + strlen(a) - 1;
    pb = b + strlen(b) - 1;
    pBuf = buf + sizeof(buf) - 2;
        over = 0;
C
1
(*pa-- - '0')
C
1
if ( !fgets(a, MAX_NUM, stdin) )
C
1
if ( p = strrchr(a, '\n') )
Огромное спасибо!!!

Добавлено через 1 минуту
1) вообще по ходу
2) тоже
3) !fgets, stdin
4) strrchr

Добавлено через 2 часа 14 минут
кто-нибудб может для задания 2 переделать код, который я выше вылаживал ? ПЛЗ
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.04.2010, 23:30     Отредактировать текст так, чтобы между словами был ровно один пробел #14
Цитата Сообщение от Лестат Посмотреть сообщение
а не могли бы Вы по хлду задачи объяснить ?
В двух словах: создаются три указателя и устанавливаются соответственно на последний символ строк a, b и на предпоследний статического буфера (последний - 0). memset() обнуляет буфер, хотя оно тут и не обязательно, можно и убрать, только в буфере последний символ в ноль установить. Заводится переменная over, в которую выносится то, что в один разряд при сложении не поместилось. Ну а дальше берутся значения указателей, если те ещё за левый предел строк не вылезли, складываются со значением over, к остатку от деления на 10 прибавляется '0', чтобы получилось текстовое представление цифры и вставляется в буфер, а частное от деления в over заносится...
fgets и strrchr - библиотечные функции, а stdin - стандартный поток ввода...
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
22.04.2010, 10:10  [ТС]     Отредактировать текст так, чтобы между словами был ровно один пробел #15
люди, може кто-нибудь насчет 2-й задачи что-то подсказать или изменить код, которыя я раньше выкладывал тут ???
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.04.2010, 11:49     Отредактировать текст так, чтобы между словами был ровно один пробел #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от easybudda Посмотреть сообщение
Выглядит мрачновато, но работает
"Вторая часть Марлезонского балета!" (с)

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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define S_END ".!?"
#define SP_CHARS " \t\n"
 
int main(void){
    char buf_in[BUFSIZ], buf_out[BUFSIZ], *p;
    
    printf("Enter some text:\n");
    if ( !fgets(buf_in, BUFSIZ, stdin) || *buf_in == '\n' )
        exit(1);
    
    *buf_out = '\0';
    for ( p = strtok(buf_in, SP_CHARS); p; p = strtok(NULL, SP_CHARS) ){
        strcat(buf_out, p);
        strcat(buf_out, ( strchr(S_END, *(p + strlen(p) - 1)) ) ? "  " : " ");
    }
    
    printf("\nProcessed text:\n%s\n", buf_out);
    
    exit(0);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2010, 12:56     Отредактировать текст так, чтобы между словами был ровно один пробел
Еще ссылки по теме:

C++ В символьной строке между словами вставить вместо пробела запятую и пробел
Удалить в строке лишние пробелы, оставив между словами ровно по одному C++
Как сделать, чтобы в результате был пробел между именем и фамилией и отображалось отчество C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.04.2010, 12:56     Отредактировать текст так, чтобы между словами был ровно один пробел #17
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот, если надо, первая задача - поразрядное сложение... Возможно, не особо круто сделано, все почти тупо в лоб, но зато работает правильно. Изменяя значение N - изменяем максимальное количество разрядов, с которыми можно работать.

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <stdio.h>
#include <string.h>
 
#define N 255
 
int get_num(int *mas_num, char number)
{
    if (number == '0')
    {
        *mas_num = 0;
        
        return 0;
    }
    
    if (number == '1')
    {
        *mas_num = 1;
        
        return 0;
    }
    
    if (number == '2')
    {
        *mas_num = 2;
        
        return 0;
    }
    
    if (number == '3')
    {
        *mas_num = 3;
        
        return 0;
    }
    
    if (number == '4')
    {
        *mas_num = 4;
        
        return 0;
    }
    
    if (number == '5')
    {
        *mas_num = 5;
        
        return 0;
    }
    
    if (number == '6')
    {
        *mas_num = 6;
        
        return 0;
    }
    
    if (number == '7')
    {
        *mas_num = 7;
        
        return 0;
    }
    
    if (number == '8')
    {
        *mas_num = 8;
        
        return 0;
    }
    
    if (number == '9')
    {
        *mas_num = 9;
        
        return 0;
    }
    
    return -1;
}
 
int main()
{
    char number1[N];
    int num1[N];
    int len1;
    char number2[N];
    int num2[N];
    int len2;
    int result[N];
    
    int i;
    int n;
    int global_len;
    int older, younger;
    
    FILE *f;
    
    if ((f = fopen("sum.in", "r")) == NULL)
    {
        printf("Read file error!\n");
        exit(1);
    }
    
    fscanf(f, "%s", &number1);
    fscanf(f, "%s", &number2);
    
    fclose(f);
    
    len1 = strlen(number1);
    len2 = strlen(number2);
    
    for (i = len1 - 1, global_len = N - 1; i >= 0; i--, global_len--)
    {
        get_num(&num1[global_len], number1[i]);
    }
    
    for (i = global_len; i >= 0; i--)
    {
        num1[i] = 0;
    }
    
    for (i = len2 - 1, global_len = N - 1; i >= 0; i--, global_len--)
    {
        get_num(&num2[global_len], number2[i]);
    }
    
    for (i = global_len; i >= 0; i--)
    {
        num2[i] = 0;
    }
    
    for (i = N - 1; i >= 0; i--)
    {
        result[i] = num1[i] + num2[i];
    }
    
    for (i = N - 1; i >= 0; i--)
    {
        if (result[i] > 9)
        {
            younger = result[i] % 10;
            older = result[i] / 10;
            result[i] = younger;
            result[i - 1] += older;
        }
    }
    
    if ((f = fopen("sum.out", "w+")) == NULL)
    {
        printf("Write file error!\n");
        exit(1);
    }
    
    for (n = 0; n < N; n++)
    {
        if (result[n] != 0)
        {
            for (i = n; i < N; i++)
            {
                fprintf(f, "%d", result[i]);
            }
            
            return 0;
        }
    }
    
    fprintf(f, "0");
    
    fclose(f);
    
    return 0;
}
Yandex
Объявления
23.04.2010, 12:56     Отредактировать текст так, чтобы между словами был ровно один пробел
Ответ Создать тему
Опции темы

Текущее время: 14:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru