Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/2345: Рейтинг темы: голосов - 2345, средняя оценка - 4.54
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

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

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

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

Список задач, решение которых присутствует в данной теме:
44
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.07.2010, 05:53
Ответы с готовыми решениями:

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

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

Литература для лучшего понимания сути программирования
Привет! Подскажите литературу, которая поможет разобраться в сути самого процесса программирования, поможет изучить теорию алгоритмов,...

1272
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2010, 22:39
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот это уже больше похоже на правду
А теперь запусти этот код на любом другом процессоре, кроме intel'овского. Код сломается на исполнении
0
03.08.2010, 22:41

Не по теме:

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

0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.08.2010, 22:42
Цитата Сообщение от Evg Посмотреть сообщение
А теперь запусти этот код на любом другом процессоре, кроме intel'овского. Код сломается на исполнении
Ну так никто с этим и не спорит.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
03.08.2010, 22:46
как вариант еще одно подобное извращение
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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2010, 22:47

Не по теме:

Цитата Сообщение от 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
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
03.08.2010, 23:34
Цитата Сообщение от Evg Посмотреть сообщение
В чём его некорректность?
сдаюсь, сплошной бред в голову лезет
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2010, 23:50
некорректность
По стандарту Си операция разности указателей (а может и вся поинтерная арифметика) определена только для указателей, смотрящих на один и тот же объект. Под словом "объект" здесь подразумевается то, что на бытовом уровне называется "переменная", а не "объект Си++". Как следствие итоговое значение delta с точки зрения стандарта undefined

На двух компиляторах с мощным контекстным анализатором и какими-то хитрыми аппаратными фичами тест отработал некорректно. Тест был немного в другом виде, но для простоты оставил таким. Что за компиляторы - толком не помню, ибо давно было. Но один из них вроде бы был Intel'овский компилятор для Itanium'а. Каким был второй компилятор - никак не вспомню.
5
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
04.08.2010, 00:06
получается, что такой к примеру код тоже не корректен?
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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2010, 00:11
По поводу теста. Вспомнил, в чём там была проблема. Более "корректный" исходник выглядит так

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
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
04.08.2010, 00:14
Цитата Сообщение от Evg Посмотреть сообщение
ptr = &a + delta;
то есть, если изначально адрес брался от переменной "a", компилятор будет думать, что указатель указывает именно на "a", куда бы его не смещали?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2010, 00:19
Цитата Сообщение от fasked Посмотреть сообщение
то есть, если изначально адрес брался от переменной "a", компилятор будет думать, что указатель указывает именно на "a", куда бы его не смещали?
С учётом моей кривой фразы не "на a", а "куда-то вовнутрь a". И не "что указывает", а "должен указывать, а если не указывает, то это undefined ситуация". Ну и от компилятора зависит, насколько мощный анализатор в оптимизаторе.

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

Добавлено через 1 минуту
Напишите программу умножения двух чисел ЛЮБЫМ способом. условие только одно - НИГДЕ не использовать оператор *.
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
04.08.2010, 10:27
Цитата Сообщение от 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
Мат в 32 хода
 Аватар для nikkka
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 10:35
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
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
04.08.2010, 10:36
Да, вы правы.

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
Мат в 32 хода
 Аватар для nikkka
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 10:37
neske, в принципе такая задачка уже была, но на две переменные, так что я ступил выложив её... если знаете что нить интересное, напишите пожалуйста...
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
04.08.2010, 10:40
Не знаю, к сожалению.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 10:44
Цитата Сообщение от nikkka Посмотреть сообщение
я слышал что задачку также можно решить используя битовые операции, но я пока до этого не "дорос" если кто знает как, выложите плиз
С помощью сдвигов можно умножать и делить нацело на степени двойки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main()
{
    int a = 5;
    int b = 7;
    a <<= 1; //Умножаем на 2 в степени 1
    b >>= 1; //Делим на 2 в степени 1
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    system("pause");
    return EXIT_SUCCESS;
}
3
Мат в 32 хода
 Аватар для nikkka
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 10:46
Nameless One, а чем отличается return EXIT_SUCCESS от return 0?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 10:48
Цитата Сообщение от nikkka Посмотреть сообщение
Nameless One, а чем отличается return EXIT_SUCCESS от return 0?
Большей понятностью, наверно. EXIT_SUCCESS - это константа Си, равная нулю. Определена, по-моему, в cstdlib. Также есть константа EXIT_FAILURE, равная 1.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.08.2010, 10:48

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

Проверить на правильность и закомментировать весь код для лучшего понимания
Всем здравствуйте. Условие задачи - Заданная матрица целых чисел размером (N, N). Найти среднее арифметическое элементов в окрашенной...

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

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

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


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

Или воспользуйтесь поиском по форуму:
500
Закрытая тема Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru