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

C++

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

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

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

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

Список задач, решение которых присутствует в данной теме:
41
Лучшие ответы (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++
Добрый день всем:) Наверное подобных тем как я тут сотни,но всё же. Начал изучать С++(так как необходим для универа)в дальнейшем...

1272
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,972
Записей в блоге: 27
03.08.2010, 22:39 #481
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот это уже больше похоже на правду
А теперь запусти этот код на любом другом процессоре, кроме intel'овского. Код сломается на исполнении
0
fasked
03.08.2010, 22:41
  #482

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
К хакерству отношения никакого не имеет, просто это закладка на знание внутренних особенностей компилятора.
там как раз говорится о том, что хакеры это не те кто что-то ломает, а кто фанатично изучает особенности и строение различных систем. например, они способны просто ради удовольствия написать что-то подобное

0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
03.08.2010, 22:42 #483
Цитата Сообщение от Evg Посмотреть сообщение
А теперь запусти этот код на любом другом процессоре, кроме intel'овского. Код сломается на исполнении
Ну так никто с этим и не спорит.
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.08.2010, 22:46 #484
как вариант еще одно подобное извращение
C
1
2
3
4
5
6
7
#include <stdio.h>
char *program = "#include <stdio.h>%cchar *program = %c%s%c;%cint main()%c{%c printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c    return 0;%c}%c";
int main()
{
        printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);
        return 0;
}
0
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,972
Записей в блоге: 27
03.08.2010, 22:47 #485

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
там как раз говорится о том, что хакеры это не те кто что-то ломает, а кто фанатично изучает особенности и строение различных систем. например, они способны просто ради удовольствия написать что-то подобное
Ну разве что с такой позиции



Тогда задача на тему "хакерства" (с вышеобозначенной позиции). Данный код на некоторых компиляторах даёт разный результат в режиме с оптимизациями и без оптимизаций. Это означает, что код некорректный. В чём его некорректность?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stddef.h>
 
int a = 3;
int b = 5;
 
int
main (void)
{
  size_t delta;
  int *ptr;
 
  delta = &b - &a;
  ptr = &a + delta;
  
  printf ("%d\n", *ptr);
  return 0;
}
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.08.2010, 23:34 #486
Цитата Сообщение от Evg Посмотреть сообщение
В чём его некорректность?
сдаюсь, сплошной бред в голову лезет
0
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,972
Записей в блоге: 27
03.08.2010, 23:50 #487
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
некорректность
По стандарту Си операция разности указателей (а может и вся поинтерная арифметика) определена только для указателей, смотрящих на один и тот же объект. Под словом "объект" здесь подразумевается то, что на бытовом уровне называется "переменная", а не "объект Си++". Как следствие итоговое значение delta с точки зрения стандарта undefined

На двух компиляторах с мощным контекстным анализатором и какими-то хитрыми аппаратными фичами тест отработал некорректно. Тест был немного в другом виде, но для простоты оставил таким. Что за компиляторы - толком не помню, ибо давно было. Но один из них вроде бы был Intel'овский компилятор для Itanium'а. Каким был второй компилятор - никак не вспомню.
5
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 00:06 #488
получается, что такой к примеру код тоже не корректен?
C
1
2
3
4
5
6
7
8
9
10
int arr[n] = { 1, 2, 3 ... 99 };
int * ptrarr = arr;
int * ptrlsd = &arr[1];
int * ptrmsd = &arr[n];
 
/* действия в процессе, которых ptrlsd смещается и указывает в итоге на последний элемент массива */
for( ; ptrlsd <= ptrmsd; ++ptrlsd)
   ...
 
*ptrarr = ptrlsd - ptrarr; // интересует вот этот момент
0
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,972
Записей в блоге: 27
04.08.2010, 00:11 #489
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
По поводу теста. Вспомнил, в чём там была проблема. Более "корректный" исходник выглядит так

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stddef.h>
 
int a = 3;
int b = 5;
 
int
func (size_t delta)
{
  int *ptr;
 
  ptr = &a + delta;
  *ptr = 7;
  return b;
}
 
/* Чтобы не было inline, функцию вызовем через указатель на функцию */
int (* volatile fptr)(size_t) = func;
 
int
main (void)
{
  int c;
 
  c = fptr (&b - &a);
  printf ("%d\n", c);
  return 0;
}
Некорректность
В строках 13 и 14 имеются две операции обращения в память: запись по указателю *ptr и чтение глобальной переменной "b". С точки зрения стандарта получается, что эти два обращения в память независимы, поскольку запись делается в объект "a" (но по факту запись делается в объект "b"), а чтение объекта "b". У потому продвинутый компилятор операции чтения и записи может поменять местами (поскольку с точки зрения стандарта эти два обращения в память не конфликтуют между собой). Операции чтения из памяти как правило компиляторы ставят как можно раньше по исполнению (потому что обращение в память - медленная операция).


Добавлено через 1 минуту
Цитата Сообщение от fasked Посмотреть сообщение
получается, что такой к примеру код тоже не корректен?
Корректен, поскольку у тебя указатели смотрят на один и тот же объект arr

Добавлено через 1 минуту
"Смотрят на один и тот же" наверно криво выразился. Скорее "смотрят вовнутрь одного и того же объекта"
4
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 00:14 #490
Цитата Сообщение от Evg Посмотреть сообщение
ptr = &a + delta;
то есть, если изначально адрес брался от переменной "a", компилятор будет думать, что указатель указывает именно на "a", куда бы его не смещали?
0
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,972
Записей в блоге: 27
04.08.2010, 00:19 #491
Цитата Сообщение от fasked Посмотреть сообщение
то есть, если изначально адрес брался от переменной "a", компилятор будет думать, что указатель указывает именно на "a", куда бы его не смещали?
С учётом моей кривой фразы не "на a", а "куда-то вовнутрь a". И не "что указывает", а "должен указывать, а если не указывает, то это undefined ситуация". Ну и от компилятора зависит, насколько мощный анализатор в оптимизаторе.

Слабенький анализатор на gcc видит запись по неизвестному указателю (поскольку адрес для записи вычисляется) и чтение конкретного объекта. Поскольку указатель может смотреть куда угодно, то он считает, что эти две операции могут конфликтовать и переставлять чтение и запись не будет. Если завтра не забуду, попробую на работе Sun'овский или Intel'овский компилятор толкнуть
2
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 09:15 #492
А вот ещё: Напишите программу, которая будет менять значения ТРЁХ переменных a, b и c (так что а(нов.)=/=а(стар.) b(нов.)=/=b(стар.) c(нов.)=/=c(стар.)) НЕ ИСПОЛЬЗУЯ ДОП. ПЕРЕМЕННЫХ.

Добавлено через 1 минуту
Напишите программу умножения двух чисел ЛЮБЫМ способом. условие только одно - НИГДЕ не использовать оператор *.
0
neske
1501 / 868 / 84
Регистрация: 26.03.2010
Сообщений: 2,973
04.08.2010, 10:27 #493
Цитата Сообщение от nikkka Посмотреть сообщение
Напишите программу умножения двух чисел ЛЮБЫМ способом. условие только одно - НИГДЕ не использовать оператор *.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        // Напишите программу умножения двух чисел ЛЮБЫМ способом.
        // Условие только одно - НИГДЕ не использовать оператор *.
 
#include <iostream>
 
int main (void)
{
    int X=5;
    int Y=10;
    int REZULT=0;
 
    for (int i=0; i<Y; i++)
        REZULT+=X;
 
    std::cout << "X*Y=" << REZULT;
    std::cout << std::endl;
 
    return 0;
}
Аналогичное решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        // Напишите программу умножения двух чисел ЛЮБЫМ способом.
        // Условие только одно - НИГДЕ не использовать оператор *.
 
#include <iostream>
 
int main (void)
{
    int X=5;
    int Y=10;
    int REZULT=0;
 
    for (int i=0; i<X; i++)
        REZULT+=Y;
 
    std::cout << "X*Y=" << REZULT;
    std::cout << std::endl;
 
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от nikkka Посмотреть сообщение
А вот ещё: Напишите программу, которая будет менять значения ТРЁХ переменных a, b и c (так что а(нов.)=/=а(стар.) b(нов.)=/=b(стар.) c(нов.)=/=c(стар.)) НЕ ИСПОЛЬЗУЯ ДОП. ПЕРЕМЕННЫХ.
- А нет, понял, буду думать =)
1
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 10:35 #494
neske, вот решение на умножение без использования оператора *. ваши решения вполне подойдут, но вот моё:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
int main()
{
    double b=8;
    double c=2.5;
    std::cout<<b/(1/c)<<"\n";
    system("pause");
    return 0;
}
Добавлено через 1 минуту
я слышал что задачку также можно решить используя битовые операции, но я пока до этого не "дорос" если кто знает как, выложите плиз
1
neske
1501 / 868 / 84
Регистрация: 26.03.2010
Сообщений: 2,973
04.08.2010, 10:36 #495
Да, вы правы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        // Напишите программу, которая будет менять значения ТРЁХ переменных a, b и c
        // (так что а(нов.)=/=а(стар.) b(нов.)=/=b(стар.) c(нов.)=/=c(стар.)) НЕ ИСПОЛЬЗУЯ ДОП. ПЕРЕМЕННЫХ.
 
#include <iostream>
 
int main (void)
{
    int A=5;
    int B=10;
    int C=15;
    // swap A and B
    A=A+B;
    B=A-B;
    A=A-B;
    // swap B and C
    B=B+C;
    C=B-C;
    B=B-C;
    // output
    std::cout << "A: " << A << std::endl
              << "B: " << B << std::endl
              << "C: " << C << std::endl;
 
    return 0;
}
Может быть не самое красивое решение, но под условие задачи - подходит.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 10:36
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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