Войти

Показать полную графическую версию : Работа со строками


Anastasiya9kmmr
05-07-2019, 06:56
В общем не могу дописать программу использовала ее изначально как шаблон(задания на словах очень похожие) и пытаюсь менять под свои условия но не получается, условия ниже.
Написать программу, обрабатывающую введенный пользователем текст, состоящий из слов, записанных через пробелы. Длина текста не больше 255 символов. В тексте могут быть использованы любые символы. Словом считать последовательность символов, не содержащую пробел. Необходимо введенный текст вывести на экран до и после его преобразования, сформировать новую строку, в которую включены слова по возрастанию их длин. Найти первое цифровое слово и изменить его значение, поделив на 100.









#include <stdio.h>
#include <string.h>
#define MAX_SIZE 255
#define is_space(c) ((c) == ' ' || (c) == '\t')

char* mul_numbers(size_t max_size, char* s, int n);

int main(void){
int N;
char c;
char s[N];
printf("vvedite slova \n");
scanf("%[^\n]%*c",&s);
printf("vivod \n");
puts( mul_numbers(N, s, 100) );
return 0;
}






char* mul_numbers(size_t max_size, char* s, int n){
char* p;
int c, i = 0, d = 0, x = 0, y = 0;
size_t l = strlen(s);
char* t = s;
do {
c = *s;
if(c && !is_space(c)){
if(c >= '0' && c <= '9'){
x = x/10 + (c - '0');
++d;
}
++i;
} else if(i > 0){
if(i == d){
x *= n;
i = 0;
c = x;
y = 1;
do {
++i;
y *= 10;
} while((c /= 10) != 0);

p = s - d;
i -= d;
if((l + i) >= max_size)
break;

if(i > 0)
memmove(p + i, p, l - (size_t)(p - t));
s += i - 1;
l += i;

c = x;
y /= 10;
do {
*p++ = (char)(c / y % 10) + '0';
} while((y /= 10) != 0);
}
i = d = x = 0;
}
} while(*s++ != '\0');
return t;
}

lxa85
05-07-2019, 12:58
Anastasiya9kmmr, используйте более "говорящие" переменные и комментируйте код.
Для того, чтобы сторонний человек понял работу функции mul_numbers надо очень сильно постараться.
При попытке расставить отступы, чтобы добраться хотя бы до структуры, и от ее строения понять выполняемую логику, возникло подозрение.
if(i > 0)
memmove(p + i, p, l - (size_t)(p - t));
s += i - 1;
l += i;
В этих строках нет пропущенных фигурных скобок (составного оператора) ?
Далее не разбирал.
Прошу добавить комментариев и пояснить смысл действий, и дать более "говорящие" названия переменным, или при объявлении рассказать что за что отвечает.

Anastasiya9kmmr
05-07-2019, 13:47
lxa85, Anastasiya9kmmr, используйте более "говорящие" переменные и комментируйте код.
Для того, чтобы сторонний человек понял работу функции mul_numbers надо очень сильно постараться.
При попытке расставить отступы, чтобы добраться хотя бы до структуры, и от ее строения понять выполняемую логику, возникло подозрение.
PHP код:
if(i*>*0)
memmove(p*+*i,*p,*l*-*(size_t)(p*-*t));
s*+=*i*-*1;
l*+=*i;
В этих строках нет пропущенных фигурных скобок (составного оператора) ?
Далее не разбирал.
Прошу добавить комментариев и пояснить смысл действий, и дать более "говорящие" названия переменным, или при объявлении рассказать что за что отвечает. »

Так?
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 255
#define is_space(c) ((c) == ' ' || (c) == '\t')

char* slova(size_t max_size, char* s, int n);

int main(void)
{
int N;
char c;
char s[N];
printf("vvedite slova \n");
scanf("%[^\n]%*c",&s);
printf("vivod \n");
puts( slova(N, s, 100) );
return 0;
}
//Все цифровые слова увеличить в n раз.
char* slova(size_t max_size, char* s, int n)
{
char* p;
int c, i = 0, d = 0, x = 0, y = 0;
size_t l = strlen(s);
char* t = s;
do
{
c = *s;
if(c && !is_space(c))


{
if(c >= '0' && c <= '9')


{
x = x/10 + (c - '0');
++d;
}
++i;
}
else if(i > 0)
{
if(i == d)
{
x *= n;
i = 0;
c = x;
y = 1;
do
{
++i;
y *= 10;
}

while((c /= 10) != 0);
p = s - d;
i -= d;
if((l + i) >= max_size)
break;

if(i > 0)
memmove(p + i, p, l - (size_t)(p - t));
s += i - 1;
l += i;
c = x;
y /= 10;
do
{

*p++ = (char)(c / y % 10) + '0';
}

while((y /= 10) != 0);
}

i = d = x = 0;
}

}

while(*s++ != '\0');
return t;

}

птичка0001
05-07-2019, 13:49
автор, Ваши лабораторные давно решены. Причем ежегодно решаются заново.

Anastasiya9kmmr
05-07-2019, 14:33
птичка0001, автор, Ваши лабораторные давно решены. Причем ежегодно решаются заново. »

Откуда такая уверенность? Лично не нашла такой же задачи.

птичка0001, автор, Ваши лабораторные давно решены. Причем ежегодно решаются заново. »

Откуда такая уверенность? Лично не нашла такой же задачи.

lxa85
05-07-2019, 14:54
Anastasiya9kmmr, с одной стороны легче, с другой - последовательность действий остается загадкой.
Распишите алгоритм словами, как если бы рассказывали решение другу.
Что надо найти в первую очередь, как понять что это слово, и т.д.
Мне все еще не ясны манипуляции с буквами s, c, p, d, y, l однобуквенных переменных, без указания описания очень много.
Переменные ясны для вас, как для автора, но не для того, кто читает. И т.к. код нельзя прочесть, сложно сказать, допущена в рассуждениях ошибка или нет.
Или ошибка в выражении мыслей в терминах языка.

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

if(i*>*0)
memmove(p*+*i,*p,*l*-*(size_t)(p*-*t));
s*+=*i*-*1;
l*+=*i;
c*=*x;
y*/=*10; »

Сейчас по условию i>0 выполняется, только только строка memmove().
Остальные выполняются всегда.
Вопрос. Это правильно? Или по условию i>0 должны выполняться строки

"
s+= i - 1;
l += i;
c = x;
" ?

Anastasiya9kmmr
05-07-2019, 16:09
Anastasiya9kmmr, с одной стороны легче, с другой - последовательность действий остается загадкой.
Распишите алгоритм словами, как если бы рассказывали решение другу.
Что надо найти в первую очередь, как понять что это слово, и т.д.
Мне все еще не ясны манипуляции с буквами s, c, p, d, y, l однобуквенных переменных, без указания описания очень много.
Переменные ясны для вас, как для автора, но не для того, кто читает. И т.к. код нельзя прочесть, сложно сказать, допущена в рассуждениях ошибка или нет.
Или ошибка в выражении мыслей в терминах языка.
птичка0001, дидактические материалы по алгебре то же давно решены, но это не значит, что надо придумывать каждый раз новые задачи, а ученики и студенты вместо обучения должны искать и списывать готовые ответы.
PHP код:
if(i*>*0)
memmove(p*+*i,*p,*l*-*(size_t)(p*-*t));
s*+=*i*-*1;
l*+=*i;
c*=*x;
y*/=*10;*»
Сейчас по условию i>0 выполняется, только только строка memmove().
Остальные выполняются всегда.
Вопрос. Это правильно? Или по условию i>0 должны выполняться строки
"
s+= i - 1;
l += i;
c = x;
" ? »


Вообще до этого момента как я поняла программа думает что за слова она берет из ввода и если это число, то начинает с ним манипуляции если нет, то скидывает вниз на вывод. Отчищаются переменные и по новой пока не закончаться слова. По моему все так и работает, а переменные про которые вы говорите это как раз те в которые записываются символы, разве нет? Честно говоря пересмотрела уже всё как мне кажется особенно после слов птички от как это должно выполняться, разного рода подобные задачи но увы.

lxa85
05-07-2019, 16:56
Честно говоря пересмотрела уже всё как мне кажется особенно после слов птички от как это должно выполняться, разного рода подобные задачи но увы. »
Та-а-ак стоп! Вот с этого момента - стоп!
Если сейчас продолжиться анализ чужого мнения (а код, это запись чужих мыслей), то я в этом не участвую.
Мне абсолютно не интересно кто и как решил эту задачу. Если изначальный код - чужой, и вы пытаетесь понять как он работает - это тупиковая ветка.
Вы пытаетесь понять чью-то чужую, явно извращенную логику.
У вас есть своя голова и свои мысли.
Поэтому вы берете чистый лист, и решаете задачу так, как если бы ее решали вы. Не птичка, не сосед дядя Коля, не лучшая подруга, а самостоятельно.
Причем первый шаг - именно словесный.
Никакого С++, никаких высоких материй; простыми словами, так, как вы бы объяснили ребенку.




© OSzone.net 2001-2012