Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь в написании функций, Написание строковых функций 
:(
    Опции темы
babat
Дата 8.11.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



а по русски?)
PM MAIL   Вверх
borisbn
Дата 8.11.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



babat, вот есть у тебя ф-ция int increment_value( int * x ) и функция void foo( int a, int b ); и вызываешь ты её так
Код
foo( x, increment_value( &x ) );

а incriment_value реализована так
Код
int increment_value( int * x ) { *x = *x + 1; return *x; }

теперь подумай, что получит foo в качестве a и что в качестве b..

Это сообщение отредактировал(а) borisbn - 8.11.2011, 18:23


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 8.11.2011, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  6.11.2011,  20:50 Найти цитируемый пост)
возможны только в Си, а в Си++ такое невозможно...

С++11 перенял нечто из C99, чтоб сузить пропасть, возникщую за время их самостоятельног развития.. smile



--------------------
PM MAIL WWW   Вверх
Lols
Дата 8.11.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 21.10.2011

Репутация: нет
Всего: нет



Да, мне тоже казалось, что в С++ так не получится 0_о

"undefined behaviour" - неопределенное поведение - то есть, такая функция запросто может не работать?
PM MAIL   Вверх
bsa
Дата 8.11.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Lols @  8.11.2011,  21:59 Найти цитируемый пост)
"undefined behaviour" - неопределенное поведение - то есть, такая функция запросто может не работать? 

И да и нет. такая функция может работать в 99 случаев из 100... Все зависит от компилятора и параметров оптимизации. Может получиться даже так, что в режиме отладки работает, а в релизе нет, так как компилятор оптимизировал вызовы таким образом, каким не предполагал программист. А все потому, что этот код неверен...
PM   Вверх
babat
Дата 13.11.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



Код

char*strcpy2(char*dest,char*s,int p,int k)
{
    int len=strlen(s);
    char *p[10];
    for (int i=0;i<len;i++)
        p[i]=&s[i];
    for (int i=p,j=0;i<p+k;i++,j++)
        dest[j]=*p[i];
    dest[k]=0;
    return dest;
}
void main()
{
    char s[9]="0123123",dest[5];
    int k=3,p=4;
    printf ("%s",strcpy2(dest,s,p,k));
    getch();
}

что не так?(
PM MAIL   Вверх
mes
Дата 13.11.2011, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(babat @  13.11.2011,  16:27 Найти цитируемый пост)
char*strcpy2(char*dest,char*s,int p,int k)
{
    int len=strlen(s);
    char *p[10];




--------------------
PM MAIL WWW   Вверх
bsa
Дата 13.11.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



babat, для примера, как надо писать:
Код
char* strcpy2(char *dest, const char *s, int from, int size)
{
   char *d = dest;
   s += from;//по хорошему, параметр from в принципе не нужен, так как это можно сделать перед вызовом strcpy2: strcpy2(d, s + from, size)
   for(;*s && size; ++s, --size, ++d)
     *d = *s;
   *d = '\0';
   return dest;
}

PM   Вверх
babat
Дата 16.11.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



Код

char*strdel1(char*s,int p,int k)
{
    int len=strlen(s);
    if(p>=len)
        return s;
    if(p+k>=len)
    {
        s[p]=0;
        return s;
    }
    char*ptr1=s+p;
    char*ptr2=s+p+k;
    while(*ptr1++=*ptr2++)
        ;
    return s;
}
char*strdel2(char*s,int p,int k)
{
    int len=strlen(s);

    if(p>=len)
        return s;
    if(p+k>=len)
    {
        s[p]=0;
        return s;
    }
    for (int i=p,j=p+k;j<=len;++i,++j)
        s[i]=s[j];
    
    return(s);
}


Народ,помогите еще 2 написать плиз((
PM MAIL   Вверх
bsa
Дата 16.11.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



babat, помогают написать в другом разделе. Здесь же помогают найти ошибки, отвечают на вопросы и направляют на путь истинный.
У тебя нет вопроса. Поэтому даже не знаю, что ответить.
PM   Вверх
babat
Дата 16.11.2011, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



ну хотябы словами опишите алгоритм))
PM MAIL   Вверх
bsa
Дата 16.11.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



чем функции strdel1 и strdel2 отличаются?
Делать нужно так:
1. в цикле от 0 до p (невключительно) ищешь признак конца строки. Если находишь, то выход.
2. в цикле от p до p+k (включительно) ищешь признак конца строки. Если находишь, то ставишь признак конца строки в позицию p и выход.
3. в цикле копируешь данные из p+k+i в p+i до тех пор, пока не встретится признак конца строки (его тоже надо скопировать).
4. выход

PM   Вверх
babat
Дата 19.11.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



Код

char*strdel3(char*s,int p,int k)
{
    int len=strlen(s);

    if(p>=len)
        return s;
    if(p+k>=len)
    {
        s[p]=0;
        return s;
    }
    int i=p,j=p+k;
    met1:s[i]=s[j];
    if (j>len) goto met2;
    i++,j++;
    goto met1;
    met2:return s;



норм?
PM MAIL   Вверх
bsa
Дата 20.11.2011, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



babat, на данном уровне знания языка попрошу забыть о существовании оператора goto. Используй циклы (for(;;), while(){} или do{}while()) и continue/break.
А потом, ты сильно отклонился от моего алгоритма. У меня циклы использовались обычные, без хитрых повторов.
PM   Вверх
babat
Дата 22.11.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



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

strlen
Код

int strlen1(char*s)
{
    int len=0;
    while (s[len]!=0)
        len++;
    return len;
    
}
int strlen2(char*s)
{
    int len=0;
    for (len;;++len)
        if (s[len]!=0) len++;
        else {
            return len;
            break;
        }
    
}
int strlen3(char*s)
{
    char *ptr=s;
    int len=0;
    while (*ptr++)
        ++len;
    return len;
}

int strlen4(char*s)
{
  int len=-1;
  met1:++len;
  if (s[len]!=0) goto met1;
  else goto met2;
  met2:return len; 
}

норм?

Это сообщение отредактировал(а) babat - 22.11.2011, 20:03
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0870 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.