Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
1

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

19.04.2010, 21:57. Просмотров 1297. Ответов 16
Метки нет (Все метки)

Люди, плз помогите с задачами :

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

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

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

Отредактировать текст так, чтобы между словами был ровно один пробел
помогите решить задачу. Дан произвольный текст.Отредактировать его...

Преобразовать строку так, чтобы между словами был ровно один пробел
При реализации программы необходимо использовать функции обработки строк из...

Отредактировать текст, удаляя лишние символы пробелов между словами
Отредактировать текст,удаляя лишние символы пробелов между словами;по нажатию...

Как сделать, чтобы в результате был пробел между именем и фамилией и отображалось отчество
Доброго времени суток! Я только начинаю изучать язык C++ и столкнулся со...

Добавить пробел между словами
проблема, как добавить в конце проги чтобы было пробела между словами #include...

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

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

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

Добавлено через 50 секунд
можно складывать по 6
0
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
19.04.2010, 22:13  [ТС] 10
кстати да,PointsEqual прав по-моему; на си++ пойдет, если у меня получится переделать. то вообще круто =)
0
Лестат
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]);
0
easybudda
Модератор
Эксперт CЭксперт С++
10092 / 6002 / 1504
Регистрация: 25.07.2009
Сообщений: 11,385
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 нажать...
1
Лестат
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 переделать код, который я выше вылаживал ? ПЛЗ
0
easybudda
Модератор
Эксперт CЭксперт С++
10092 / 6002 / 1504
Регистрация: 25.07.2009
Сообщений: 11,385
21.04.2010, 23:30 14
Цитата Сообщение от Лестат Посмотреть сообщение
а не могли бы Вы по хлду задачи объяснить ?
В двух словах: создаются три указателя и устанавливаются соответственно на последний символ строк a, b и на предпоследний статического буфера (последний - 0). memset() обнуляет буфер, хотя оно тут и не обязательно, можно и убрать, только в буфере последний символ в ноль установить. Заводится переменная over, в которую выносится то, что в один разряд при сложении не поместилось. Ну а дальше берутся значения указателей, если те ещё за левый предел строк не вылезли, складываются со значением over, к остатку от деления на 10 прибавляется '0', чтобы получилось текстовое представление цифры и вставляется в буфер, а частное от деления в over заносится...
fgets и strrchr - библиотечные функции, а stdin - стандартный поток ввода...
1
Лестат
12 / 11 / 1
Регистрация: 24.09.2009
Сообщений: 188
22.04.2010, 10:10  [ТС] 15
люди, може кто-нибудь насчет 2-й задачи что-то подсказать или изменить код, которыя я раньше выкладывал тут ???
0
easybudda
Модератор
Эксперт CЭксперт С++
10092 / 6002 / 1504
Регистрация: 25.07.2009
Сообщений: 11,385
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);
}
1
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
}
1
23.04.2010, 12:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2010, 12:56

Удалить в строке лишние пробелы, оставив между словами ровно по одному
Дана строка состоящая из слов, между которыми есть некое количество пробелов....

В строке между словами вставить вместо пробела запятую и пробел
скажите, в чем ошибка В строке между словами вставить вместо пробела запятую и...

Азбука Морзе, добавить пробел между словами при декодировании
Написал &quot;программу&quot; для перевода кода Морзе на Английский и наоборот, но никак...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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