Rating@Mail.ru

Форум по операционной системе GNU/Linux и свободному программному обеспечению


Текущее время: 18 дек 2017, 12:10

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: C++ для начинающих
Непрочитанное сообщениеДобавлено: 15 ноя 2015, 20:00 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Olej писал(а):
А вот числом вариантов как это можно сделать - задача хорошая...

Ещё парочка вариантов может быть так:
Код:
string rep4( const string& base, uint rep ) {
   char buf[ 1000 ];
   strcpy( buf, base.c_str() );
   while( strlen( buf ) < rep )
      memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
   buf[ rep ] = '\0';
   return string( buf );
}

Код:
string rep5( const string& base, uint rep ) {
   string ret( base );
   while( ret.length() < rep )
      ret += ret; // удвоить длину
   return ret.erase( rep, ret.length() - rep );
}

При очень больших rep такие варианты может быть очень эффективный (или наоборот, предыдущие варианты - не эффективными ;-) ).


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: C++ для начинающих
Непрочитанное сообщениеДобавлено: 16 ноя 2015, 22:45 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Olej писал(а):
А вот числом вариантов как это можно сделать - задача хорошая...


Я же говорил, что в этом смысле задача благодатная... ;-)
Самый оптимальный из 5-ти предыдущих вариантов - 4-й (как может показаться странным) ... хотя о еальной оптимальности в такой задаче говорить смешно...
Код:
string rep4( const string& base, uint rep ) {
   char buf[ 1000 ];
   strcpy( buf, base.c_str() );
   while( strlen( buf ) < rep )
      memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
   buf[ rep ] = '\0';
   return string( buf );
}

Например, при base="abc" и rep=30000:
- если 1-й вариант с посимвольным копированием потребует 30000 циклов копирования...
- следующие варианты с циклическим копированием base - 10000 циклов копирования...
- а этот вариант ... сколько? ... 15 ... ( 3 * 2 ^ 15 )

Но здесь сразу бросается в глаза, что это вариант - условный: char buf[ 1000 ] - 1000 здесь взято с потолка и для иллюстрации.
Можно от этого избавится?
Предлагаю:

Вариант 6:
Код:
string rep6( const string& base, uint rep ) {
   char* buf = (char*)alloca( rep * 2 );
   strcpy( buf, base.c_str() );
   while( strlen( buf ) < rep )
      memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
   buf[ rep ] = '\0';
   return string( buf );
}


Вариант 7:
Код:
string rep7( const string& base, uint rep ) {
   char buf[ rep * 2 ];
   strcpy( buf, base.c_str() );
   while( strlen( buf ) < rep )
      memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
   buf[ rep ] = '\0';
   return string( buf );
}


Мне тут кой-кто возражал, что char buf[ rep * 2 ] - не будет компилироваться ... но оно не только компилируется, но и работает :lol: :
Код:
olej@nvidia ~/2015_WORK/in.WORK/SchoolCPP/repch $ ./repch
базовая строка?: 123456
длина результата?: 3
123
123
123
123
123
123
123
базовая строка?: 2345
длина результата?: 200
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
базовая строка?: ^C


Правда, возможность эта - расширение поздних стандартов VLA (VLA — variable-length array, массивы переменной длины) в C появляются в стандарте C99 ... в C++ не знаю с какого стандарта, но в C++11 оно уже работает.


Вложения:
repch.cc [2.2 КБ]
Скачиваний: 216
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: C++ для начинающих
Непрочитанное сообщениеДобавлено: 30 ноя 2015, 01:48 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Совершенно элементарная задача: Как очистить указатель — C++? (даже назвать нормально не умеют! :-( ).
Но она требует понимания.
А поэтому полезна ... для начинающих:
Цитата:
Дан указатель
double **p = 0;
Выполните следующие задания (решения можно оформлять внутри функции main).
Создайте конструкцию, изображенную на рисунке.
Изображение
Выведите число в квадратике на экран. После этого удалите все динамические объекты.


Настолько просто, что я файлы прикреплять не стану:
Код:
#include <iostream>
using namespace std;

int main( void ) {
   double **p = 0;
   *( *( p = new double* ) = new double ) = 2;
   cout << **p << endl;
   delete *p;
   delete p;
}

Код:
olej@nvidia ~/2015_WORK/in.WORK/SchoolCPP/2ptr $ g++ -Wall  2ptr.cc   -o 2ptr
olej@nvidia ~/2015_WORK/in.WORK/SchoolCPP/2ptr $ ./2ptr
2


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: C++ для начинающих
Непрочитанное сообщениеДобавлено: 27 дек 2015, 10:09 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Вот задачка ... точнее простенькое упражнение, ... которое я только-что придумал, и которое показалось мне смешным. ;-)
Оно показывает возможности нетрадиционного использования возможностей языка ... , но требует достаточно хорошего понимания сущности происходящего...

Задача:
Класс string C++ является всего лишь контейнером, в который помещаются символы char. В том числе, в него могут быть помещены и терминальные символы '\0', являющиеся в традиционном символьном массиве (char[ ]) C/C++ признаком конца строки, и недопустимые, вообще то говоря, в качестве значения символов. Основываясь не этом, в переменную типа string может быть помещена последовательность терминированных C-строк, что превращает эту переменную в массив переменного размера, содержащий C-строки.
Основываясь на этом нештатном качестве, «запакуйте» в переменную типа string все строки окружения программы (environment). Продемонстрируйте возможность передачи этой строки по цепочке вызовов функций и возможность извлечения из неё любой переменной окружения (скажем PATH).

И решение:
Код:
#include <iostream>
#include <cstring>
using namespace std;

void get_path( string & e ) {
   const char *p = e.c_str(), *find = "PATH=";
   while( *p != 0 ) {
      if( 0 == strncmp( p, find, strlen( find ) ) ) break;
      p += strlen( p ) + 1;
   }
   cout << p << endl;
}

int main( int argc, char **argv, const char *envp[] ) {
   string env;
   int i = 0;
   do {
      if( envp[ i ] != NULL ) env += envp[ i ];
      env.push_back( '\0' );
   }
   while( envp[ i++ ] != NULL );
   get_path( env );
}


Выполняем:
Код:
olej@nvidia ~/2015_WORK/own.BOOK/+Reshebnik/C++/codes/string/arstr $ ./arstr
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/olej/Chromium/depot_tools:/home/olej/Chromium/depot_tools


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: C++ для начинающих
Непрочитанное сообщениеДобавлено: 24 дек 2016, 14:54 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Используйте Онлайн компиляторы для компиляции и отладки примеров C++ кода: это гораздо быстрее и удобнее!


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: C++ для начинающих
Непрочитанное сообщениеДобавлено: 27 июн 2017, 16:34 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Вот учебный курс (это от Yandex подарок ;-) ), который может быть очень неплох, но только для 1-го знакомства, для начинающих (уровня СШ или 1-й курс, ознакомление): [url=https://stepik.org/course/Введение-в-программирование-(C++)-363/syllabus]Введение в программирование (C++)[/url]
(потому что ознакомление и изучение - это не одно и то же).

Там же из отзывов можно прочитать:
Цитата:
Евгений Александрович Тюрин
15 июня 2017 г.
1 - значит первый! По сути курс для школьников и не олимпиадный (хотя есть задачки на подумать). После этого курса станет ясно, что программистом вы не стали и еще далеко, потому что пошли не в ту сторону. Однако здесь полно задачек, чтоб попрактиковаться. Сам по себе курс скучноват, т.к. "++" добавили только для понта (увы). Это процедурный С, а из полюсов берется пара объектов и пара стандартных шаблона. Вас не научат правильной работе с указателями, поэтому для С тоже маловато. Конечно мы не увидим здесь еще курсов от яндикса по программированию. Для тех, кто дочитал мой отзыв, порекомендую курсы по алгоритмам (методы и структуры данных). Не смотрите в сторону курсов mail.ru, т.к. там всего один курс по делу (многопоточное программирование). Я поставил одну звезду, потому что оценка за курс завышена, а его материал уступает другим курсам по с/с++. Однако этот курс лучший в своем сегменте (средняя школа).

И это так и есть ... и я с этим соглашусь - что это "курс лучший в своем сегменте" ;-)


Вернуться к началу
 Профиль Отправить личное сообщение  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
[ Time : 0.330s | 18 Queries | GZIP : On ]