Показать полную графическую версию : Работа со строками
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;
}
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, автор, Ваши лабораторные давно решены. Причем ежегодно решаются заново. »
Откуда такая уверенность? Лично не нашла такой же задачи.
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;
" ? »
Вообще до этого момента как я поняла программа думает что за слова она берет из ввода и если это число, то начинает с ним манипуляции если нет, то скидывает вниз на вывод. Отчищаются переменные и по новой пока не закончаться слова. По моему все так и работает, а переменные про которые вы говорите это как раз те в которые записываются символы, разве нет? Честно говоря пересмотрела уже всё как мне кажется особенно после слов птички от как это должно выполняться, разного рода подобные задачи но увы.
Честно говоря пересмотрела уже всё как мне кажется особенно после слов птички от как это должно выполняться, разного рода подобные задачи но увы. »
Та-а-ак стоп! Вот с этого момента - стоп!
Если сейчас продолжиться анализ чужого мнения (а код, это запись чужих мыслей), то я в этом не участвую.
Мне абсолютно не интересно кто и как решил эту задачу. Если изначальный код - чужой, и вы пытаетесь понять как он работает - это тупиковая ветка.
Вы пытаетесь понять чью-то чужую, явно извращенную логику.
У вас есть своя голова и свои мысли.
Поэтому вы берете чистый лист, и решаете задачу так, как если бы ее решали вы. Не птичка, не сосед дядя Коля, не лучшая подруга, а самостоятельно.
Причем первый шаг - именно словесный.
Никакого С++, никаких высоких материй; простыми словами, так, как вы бы объяснили ребенку.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.