Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Работа со строками (http://forum.oszone.net/showthread.php?t=341180)

Anastasiya9kmmr 05-07-2019 06:56 2878250

Работа со строками
 
В общем не могу дописать программу использовала ее изначально как шаблон(задания на словах очень похожие) и пытаюсь менять под свои условия но не получается, условия ниже.
Написать программу, обрабатывающую введенный пользователем текст, состоящий из слов, записанных через пробелы. Длина текста не больше 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 2878295

Anastasiya9kmmr, используйте более "говорящие" переменные и комментируйте код.
Для того, чтобы сторонний человек понял работу функции mul_numbers надо очень сильно постараться.
При попытке расставить отступы, чтобы добраться хотя бы до структуры, и от ее строения понять выполняемую логику, возникло подозрение.
PHP код:

if(0)
memmove(ip- (size_t)(t));
+= 1;
+= i

В этих строках нет пропущенных фигурных скобок (составного оператора) ?
Далее не разбирал.
Прошу добавить комментариев и пояснить смысл действий, и дать более "говорящие" названия переменным, или при объявлении рассказать что за что отвечает.

Anastasiya9kmmr 05-07-2019 13:47 2878308

lxa85,
Цитата:

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

Так?
PHP код:

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

charslova(size_t max_sizecharsint n);

int main(void)
{
    
int N;
    
char c;
    
char s[N];
    
printf("vvedite slova \n");
    
scanf("%[^\n]%*c",&s);
    
printf("vivod \n");
    
putsslova(Ns100) );
return 
0;
}
//Все цифровые слова увеличить в n раз.
  
charslova(size_t max_sizecharsint n)
{
  
charp;
  
int c0000;
  
size_t l strlen(s);
  
chars;
     do
{
= *s;
if(
&& !is_space(c))


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


{
   
x/10 + ('0');
   ++
d;
}
   ++
i;

   else if(
0)
{
    if(
== d)
{
        
*= n;
        
0;
        
x;
        
1;
    do

    ++
i;
    
*= 10;
}

while((
/= 10) != 0);
       
d;
       
-= d;
       if((
i) >= max_size)
  break;

       if(
0)
       
memmove(ip- (size_t)(t));
       
+= 1;
       
+= i;
       
x;
       
/= 10;
       do
{
    
  *
p++ = (char)(10) + '0';


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

   
0;
}

}

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



птичка0001 05-07-2019 13:49 2878309

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

Anastasiya9kmmr 05-07-2019 14:33 2878313

птичка0001,
Цитата:

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

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

птичка0001,
Цитата:

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

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

lxa85 05-07-2019 14:54 2878316

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

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

PHP код:

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

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

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

Anastasiya9kmmr 05-07-2019 16:09 2878331

Цитата:

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

Цитата Anastasiya9kmmr
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 2878335

Цитата:

Цитата Anastasiya9kmmr
Честно говоря пересмотрела уже всё как мне кажется особенно после слов птички от как это должно выполняться, разного рода подобные задачи но увы. »

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


Время: 01:25.

Время: 01:25.
© OSzone.net 2001-