Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 2744, средняя оценка - 4.89
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
#1

Задачи для тренировки и лучшего понимания - C++

15.07.2010, 05:53. Просмотров 345156. Ответов 1272
Метки нет (Все метки)

Ребят. Кто-нибудь может дать задачу для тренировки? Приблизительно по всему курсу С++. Буду благодарен за сложную задачу, но которую способен сделать новичок-любитель. Затраты сил-времени не важно. Главное, чтобы это было интересно и не слишком рутинно. + Если найдется человек который даст задачу просьба помогать с кодом, который я буду себя скидывать. Не переписывать за меня, но указывать на ошибки и желательно объяснять. Заранее спасибо.

Список задач, решение которых присутствует в данной теме:
Лучшие ответы (59)
Сообщение: #857841 Сообщение: #857861 Сообщение: #858352 Сообщение: #859371 Сообщение: #860160 Сообщение: #860255 Сообщение: #860259 Сообщение: #860317 Сообщение: #860368 Сообщение: #860466 Сообщение: #860508 Сообщение: #860720 Сообщение: #861091 Сообщение: #862174 Сообщение: #862617 Сообщение: #867259 Сообщение: #870298 Сообщение: #872053 Сообщение: #876456 Сообщение: #880114 Сообщение: #882889 Сообщение: #884418 Сообщение: #886414 Сообщение: #886989 Сообщение: #887733 Сообщение: #888464 Сообщение: #888487 Сообщение: #888941 Сообщение: #888947 Сообщение: #889040 Сообщение: #889450 Сообщение: #889587 Сообщение: #891772 Сообщение: #891790 Сообщение: #891862 Сообщение: #897758 Сообщение: #897782 Сообщение: #906325 Сообщение: #907991 Сообщение: #943672 Сообщение: #943700 Сообщение: #967735 Сообщение: #1053777 Сообщение: #1054209 Сообщение: #1083853 Сообщение: #1083928 Сообщение: #1131058 Сообщение: #1131359 Сообщение: #1273743 Сообщение: #1275465 Сообщение: #1276743 Сообщение: #1279215 Сообщение: #1282583 Сообщение: #1309088 Сообщение: #1315633 Сообщение: #1366395 Сообщение: #1550164 Сообщение: #1603678 Сообщение: #1604364
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 05:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задачи для тренировки и лучшего понимания (C++):

Прошу примеров для понимания INDY - C++ Builder
Уважаемые коллеги и братья по интересу. Прошу примеров использования Indy UDP Server (TIdUDPServer) и Indy UDP Client (TIdUDPClient) для...

Ищу примеры для понимания взаимодействия Callback + event - C++ WinAPI
Господа, подкиньте плиз какой-нибудь пример для понимания взаимодействия Callback+event С самими Callback функциями вроде разобрался, а...

Элементарные программы, для лучшего понимания языка... - C++
Здравствуйте. Вот сегодня решил что пора изучать с++. Есть пару задач. Начал решать и уже на первой запоролся( суть в том чтобы определить...

Нужны задачи для тренировки - C++
Здравствуйте киньте пожалуйста задания по с++ для человека начинающего изучать Turbo с++

Нужны задачи для тренировки - C++
Киньте задачки на классы......а то в самоучителе, по которому я учу Сишку....приведены задачки, касающиеся только математики.....сами...

Нужны простые задачи для тренировки - C++
Добрый день всем:) Наверное подобных тем как я тут сотни,но всё же. Начал изучать С++(так как необходим для универа)в дальнейшем...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
24.07.2010, 17:31 #196
Цитата Сообщение от Kastaneda Посмотреть сообщение
почему компилятор понимает, что это вызов конструктора, а не переменная 0 типа А ?
Потому что имя переменной не может начинаться с цифры?
buugman
24.07.2010, 19:44
  #197

Не по теме:

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

ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.07.2010, 15:29  [ТС] #198
buugman, Сами делали оттуда задачи? Они там кстати действительно довольно мощные

Добавлено через 12 часов 35 минут
Что-т тема опять мрет потихоньку.
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
25.07.2010, 15:33 #199
Цитата Сообщение от buugman Посмотреть сообщение
Не по теме:
Давным давно нашел книгу в нете называется "Этюды для программиста" автор Ч. Уэзерелл книжка старая и там есть очень интересные задачи, над которыми порой и не один денек посидеть надо будет.
будь добр, скинь в лс линк
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.07.2010, 15:37  [ТС] #200
nikkka, Заходишь в инет пишешь этюды для программистов, скачиваешь. Первая программа там как раз задание про "Жизнь". Книга в формате djvu
nikkka
25.07.2010, 16:19
  #201

Не по теме:

посмотрел, задачи трудные :-s

ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.07.2010, 00:34  [ТС] #202
nikkka, А вы ноктюрн сыграть смогли бы на флейте водосточных труб? ©

Добавлено через 15 часов 26 минут
Где же интересные задачки?( Кончились?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
27.07.2010, 07:59 #203
Вот задачка с одного известного ресурса. Многие наверное ее там видели, но для тех, кто не знает будет интересно)
Нужно заменить ровно один (любой) символ в следующей строке, причём так, чтобы она скомпилилась и было выведено ровно 20 звёздочек:
C++
1
int main() { int i, n = 20; for (i = 0; i < n; i--) { printf("*"); } }
Для тех, кто «набил руку» на особенностях C, задачка, скорее всего, сложности не представляет; но существует как минимум 3 решения, и если вы нашли одно — то это не повод расслабиться А может быть, вы найдёте ещё четвёртое, пятое..?
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
27.07.2010, 09:13 #204
Решение №1

C++
1
int main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } } //поменять i-- на n--

прошу присылать ответы в теге CUT.

Добавлено через 18 минут
Решение №2
C++
1
int main() { int i, n = 20; for (i = 0; i + n; i--) { printf("*"); } } //будет выводить символ пока i не станет равным -20, то есть пока n+i!=0, а 0 это false


Добавлено через 5 минут
всё, третее потом придумаю, сейчас времени нет...
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
27.07.2010, 10:46 #205
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я тоже эти 2 решения нашел, третье так и не смог, поэтому посмотрел в ответы. Там оказывается решение состоит в том, что добавляется один символ, что по-моему не совсем соответствует условию задачи. (кстати об этом решении я думал, но счел его некорректным)

Добавлено через 10 минут
Помните недавно задачку, сейчас случайно в инете нашел более подробное описание, почему данный код так себя ведет.
Кому интересно.
Неочевидная особенность в синтаксисе определения переменных
Предлагается совершенно невинный на вид кусок кода на C++. Здесь нет ни шаблонов, ни виртуальных функций, ни наследования, но создатели этого чудесного языка спрятали грабли посреди чистa поля.

struct A {
A (int i) {}
};

struct B {
B (A a) {}
};

int main () {
int i = 1;
B b(A(i)); // (1)
return 0;
}

* This source code was highlighted with Source Code Highlighter.


Вопрос: какой тип у переменной b? Совсем не тот, который можно было бы предположить на первый взгляд.


Анализ

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

Для начала добавим немного отладочной печати:
#include <iostream>
struct A {
A (int i) { std::cout << 'A';}
};

struct B {
B (A a) { std::cout << 'B';}
};

int main () {
int i = 1;
B b(A(i)); // (1)
return 0;
}

* This source code was highlighted with Source Code Highlighter.


Если попробовать запустить этот код, окажется, что вообще ничего не выводится. Но если заменить строку (1) на
B b(A(1));

внезапно всё начинает работать.

А теперь посмотрим внимательно на вывод компилятора при максимально включенных предупреждениях
$ g++ -W -Wall test.cpp
x.cpp:2: warning: unused parameter ‘i’
x.cpp:6: warning: unused parameter ‘a’
x.cpp: In function ‘int main()’:
x.cpp:10: warning: unused variable ‘i’

С первыми двумя строками всё понятно, действительно параметры конструкторов не используются. А вот последняя строка выглядит очень странно. Как переменная i оказалась неиспользуемой, если она используется в следующей строке?

В принципе, этой информации достаточно, чтобы, немного подумав, ответить на поставленный вопрос. Но если умные мысли в голову не приходят, и хочется ещё немного поприключаться, почему бы просто не спросить компилятор? На помощь приходит RTTI.

#include <iostream>
#include <typeinfo>

struct A {
A (int i) {}
};

struct B {
B (A a) {}
};

int main () {
int i = 1;
B b(A(i)); // (1)
std::cout << typeid(b).name() << std::endl;
return 0;
}

* This source code was highlighted with Source Code Highlighter.


При компиляции GCC 4.3 результатом выполнения этой программы является строка
F1B1AE

в которой зашифрована нужная нам информация о типе переменной (конечно, другой компилятор выдаст другую строку, формат вывода type_info::name() в стандарте не описан и оставлен на усмотрение разработчика). Узнать же, что означают эти буквы и цифры, нам поможет c++filt.
$ c++filt -t F1B1AE
B ()(A)

Вот и ответ: это функция, принимающая на вход параметр типа A и возвращающая значение типа B.

Причина

Осталось понять, почему наша строка проинтерпретировалась таким неожиданным способом. Всё дело в том, что в объявлении типа переменной лишние скобки вокруг имени игнорируются. Например, мы можем написать
int (v);

и это будет означать в точности тоже самое, что
int v;


Поэтому многострадальную строку (1) можно без изменения смысла переписать, убрав лишнюю пару скобок:
B b(A i);

Теперь невооружённым взглядом видно, что b это объявление функции с одним аргументом типа A, которая возвращает значение типа B.

Заодно мы объяснили странный ворнинг о неиспользованной переменной i — действительно, она не имеет никакого отношения к формальному параметру i.

Workarounds

Нам осталось только объяснить компилятору, что же на самом деле мы от него хотим — то есть, получить переменную типа B, проинициализированную переменной типа A. Самый простой способ — добавить лишних скобок, вот так:
B b((A(i)));

или так:
B b((A)(i));

Этого достаточно, чтобы убедить парсер, что это не объявление функции.

Как альтернативу, можно использовать форму вызова конструктора с помощью присваивания, если только конструктор не объявлен explicit:
B b = A(i);

Несмотря на наличие знака '=', никакого лишнего копирования здесь не происходит, в чём можно легко убедиться, заведя в классе B приватный конструктор копирования.

А можно просто ввести дополнительную переменную:
A a(i);
B b(a);

Правда, при этом потребуется лишнее копирование переменной a, но во многих случаях это приемлемо.

Выберите тот способ, который кажется вам более понятным
nikkka
27.07.2010, 10:57
  #206

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
решение состоит в том, что добавляется один символ
ага, то есть можно не убирая какой то символ, добавить ещё?! другое дело...

Kastaneda
27.07.2010, 11:28
  #207

Не по теме:

Цитата Сообщение от nikkka Посмотреть сообщение

Не по теме:


ага, то есть можно не убирая какой то символ, добавить ещё?! другое дело...

Да, тут по-моему вопрос спорный. Символ, который нужно добавить, можно интерпретировать как замена символа, который "не видно", т.е. он подразумевается по умолчанию, но никогда не печатается (разве что в исключительных ситуациях). Поэтому третье решение можно расценивать как "замена невидимого символа", поэтому со стороны выглядет как будто добавляется один символ.
Большего сказать не могу, а то решение станет очевидным)))

Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
27.07.2010, 12:47 #208
Цитата Сообщение от Kastaneda Посмотреть сообщение
Кому интересно.Как альтернативу, можно использовать форму вызова конструктора с помощью присваивания, если только конструктор не объявлен explicit:
C++
1
 B b = A(i);
М-да, это заставляет усомниться в справедливости рекомендации Дьюхэрста всегда применять прямую инициализацию (т.е. со скобками), а не инициализацию копированием (т.е. со знаком присваивания). Он мотивирует это тем, что стандарт только разрешает компиляторам неявно заменять инициализацию копированием прямой инициализацией, но не требует этого, т.е. возможны реализации, где этой неявной замены не происходит. Но, мне кажется, лучше пожертвовать эффективностью, чем смыслом.
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
27.07.2010, 13:22 #209
Цитата Сообщение от Kastaneda Посмотреть сообщение
int main() { int i, n = 20; for (i = 0; i < n; i--) { printf("*"); } }
Третье решение
C++
1
int main() { int i, n = 20; for (i = 0;-i < n; i--) { printf("*"); }}
Заменили пробел на минус.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
27.07.2010, 13:32 #210
Вообще то я в своем предыдущем посте имел ввиду '+' на '-', но решение правильное)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2010, 13:32
Привет! Вот еще темы с ответами:

Какая база требуется для понимания C++? - C++
Доброго времени суток! Возникло желание научиться работать в Си, но одолели смутные сомнения. Каюсь, ничего сложнее Pascal ABC в школьные...

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

Киньте задачки для тренировки - C++
Хочу порешать задачки по C++......нужны либо книжки с задачками - либо ваши примеры.....желательно (если книжки) - чтобы там и решение...

Дайте задания для тренировки - C++
День добрый. Учу C++. Я уверен, что тут есть люди которые с ним отлично знаком и работают. Можете ли вы накидать заданий, возможно из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.07.2010, 13:32
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru