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

C++

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

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

15.07.2010, 05:53. Просмотров 338685. Ответов 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++ Какой компилятор выбрать для лучшего изучения С++ по книге Берна Страуструпа?п
C++ Элементарные программы, для лучшего понимания языка...
Нужны задачи для тренировки C++
C++ Киньте задачки для тренировки
C++ Нужны простые задачи для тренировки
Нужны задачи для тренировки C++
На соревнованиях по фигурному катанию оценки заносятся в компьютер. Составить программу для вывода на экран лучшего результата после каждого выступлен C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17310 / 5558 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
03.08.2010, 22:39     Задачи для тренировки и лучшего понимания #481
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот это уже больше похоже на правду
А теперь запусти этот код на любом другом процессоре, кроме intel'овского. Код сломается на исполнении
fasked
03.08.2010, 22:41
  #482

Не по теме:

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

Nameless One
Эксперт С++
5765 / 3414 / 255
Регистрация: 08.02.2010
Сообщений: 7,431
03.08.2010, 22:42     Задачи для тренировки и лучшего понимания #483
Цитата Сообщение от Evg Посмотреть сообщение
А теперь запусти этот код на любом другом процессоре, кроме intel'овского. Код сломается на исполнении
Ну так никто с этим и не спорит.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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;
}
Evg
Эксперт CАвтор FAQ
17310 / 5558 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
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;
}
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
03.08.2010, 23:34     Задачи для тренировки и лучшего понимания #486
Цитата Сообщение от Evg Посмотреть сообщение
В чём его некорректность?
сдаюсь, сплошной бред в голову лезет
Evg
Эксперт CАвтор FAQ
17310 / 5558 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
03.08.2010, 23:50     Задачи для тренировки и лучшего понимания #487
Сообщение было отмечено автором темы, экспертом или модератором как ответ
некорректность
По стандарту Си операция разности указателей (а может и вся поинтерная арифметика) определена только для указателей, смотрящих на один и тот же объект. Под словом "объект" здесь подразумевается то, что на бытовом уровне называется "переменная", а не "объект Си++". Как следствие итоговое значение delta с точки зрения стандарта undefined

На двух компиляторах с мощным контекстным анализатором и какими-то хитрыми аппаратными фичами тест отработал некорректно. Тест был немного в другом виде, но для простоты оставил таким. Что за компиляторы - толком не помню, ибо давно было. Но один из них вроде бы был Intel'овский компилятор для Itanium'а. Каким был второй компилятор - никак не вспомню.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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; // интересует вот этот момент
Evg
Эксперт CАвтор FAQ
17310 / 5558 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
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 минуту
"Смотрят на один и тот же" наверно криво выразился. Скорее "смотрят вовнутрь одного и того же объекта"
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 00:14     Задачи для тренировки и лучшего понимания #490
Цитата Сообщение от Evg Посмотреть сообщение
ptr = &a + delta;
то есть, если изначально адрес брался от переменной "a", компилятор будет думать, что указатель указывает именно на "a", куда бы его не смещали?
Evg
Эксперт CАвтор FAQ
17310 / 5558 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
04.08.2010, 00:19     Задачи для тренировки и лучшего понимания #491
Цитата Сообщение от fasked Посмотреть сообщение
то есть, если изначально адрес брался от переменной "a", компилятор будет думать, что указатель указывает именно на "a", куда бы его не смещали?
С учётом моей кривой фразы не "на a", а "куда-то вовнутрь a". И не "что указывает", а "должен указывать, а если не указывает, то это undefined ситуация". Ну и от компилятора зависит, насколько мощный анализатор в оптимизаторе.

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

Добавлено через 1 минуту
Напишите программу умножения двух чисел ЛЮБЫМ способом. условие только одно - НИГДЕ не использовать оператор *.
neske
1463 / 830 / 69
Регистрация: 26.03.2010
Сообщений: 2,830
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(стар.)) НЕ ИСПОЛЬЗУЯ ДОП. ПЕРЕМЕННЫХ.
- А нет, понял, буду думать =)
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 минуту
я слышал что задачку также можно решить используя битовые операции, но я пока до этого не "дорос" если кто знает как, выложите плиз
neske
1463 / 830 / 69
Регистрация: 26.03.2010
Сообщений: 2,830
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;
}
Может быть не самое красивое решение, но под условие задачи - подходит.
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 10:37     Задачи для тренировки и лучшего понимания #496
neske, в принципе такая задачка уже была, но на две переменные, так что я ступил выложив её... если знаете что нить интересное, напишите пожалуйста...
neske
1463 / 830 / 69
Регистрация: 26.03.2010
Сообщений: 2,830
04.08.2010, 10:40     Задачи для тренировки и лучшего понимания #497
Не знаю, к сожалению.
Nameless One
Эксперт С++
5765 / 3414 / 255
Регистрация: 08.02.2010
Сообщений: 7,431
04.08.2010, 10:44     Задачи для тренировки и лучшего понимания #498
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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;
}
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 10:46     Задачи для тренировки и лучшего понимания #499
Nameless One, а чем отличается return EXIT_SUCCESS от return 0?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 10:48     Задачи для тренировки и лучшего понимания
Еще ссылки по теме:

C++ Какая база требуется для понимания C++?
C++ Нужен пример рекурсивной функции для понимания ее назначения и практической пользы
C++ Builder Прошу примеров для понимания INDY
Книги для тренировки/развития котелка и просто убийства времени C++
Дайте задания для тренировки C++

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5765 / 3414 / 255
Регистрация: 08.02.2010
Сообщений: 7,431
04.08.2010, 10:48     Задачи для тренировки и лучшего понимания #500
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nikkka Посмотреть сообщение
Nameless One, а чем отличается return EXIT_SUCCESS от return 0?
Большей понятностью, наверно. EXIT_SUCCESS - это константа Си, равная нулю. Определена, по-моему, в cstdlib. Также есть константа EXIT_FAILURE, равная 1.
Yandex
Объявления
04.08.2010, 10:48     Задачи для тренировки и лучшего понимания
Закрытая тема Создать тему
Опции темы

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