Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/2010: Рейтинг темы: голосов - 2010, средняя оценка - 4.88
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
1

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

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

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

Список задач, решение которых присутствует в данной теме:
43
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2010, 05:53
Ответы с готовыми решениями:

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

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

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

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

1272
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
04.08.2010, 15:49  [ТС] 561
М... С алгоритмами-то тему будет создавать/думать?
ЗЫ Задачки то еще будут? + интересны другие способы написания C или C++ в зависимости от типа файла
0
fasked
04.08.2010, 15:53
  #562

Не по теме:

Цитата Сообщение от Lavroff Посмотреть сообщение
С алгоритмами-то тему будет создавать/думать?
надо чтобы каждый предложил по алгоритму и выбрать самый интересный :)
или же пусть кто-нибудь из тех кто "постарше" проявит жесткую инициативу. потому что я лично в большинстве случаев только со стандартными и всем известными сталкивался.

0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
04.08.2010, 15:59  [ТС] 563

Не по теме:

fasked, Вцелом аналогично. Обычно такие алгоритмы наиболее ходовые и есть.



Нестандартная реализация программы перевода из арабских чисел в римские:

C#
1
2
3
4
5
6
7
8
9
10
11
public static final String arab2Roman(int arab){
    String res=new String();
    String arab_str=String.valueOf(arab % 4000); 
    for (int d,dd5,i2= 0,i3=0,j=arab_str.length()-1; j>=0;i2+=2,i3+=3,j--){         
       d = (arab_str.charAt(j))-(char)'0';
       dd5=i2+((d+3)>>3);
       res=((d!=4 && d!=9) ? vld.substring(i2,dd5)+ ixcm.substring(i3, i3+d % 5) 
       : new String(new char[] {ixcm.charAt(i3), vld.charAt(dd5)}))+res;             
    }
  return res;
}
© Govnokod
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
04.08.2010, 17:05 564
Варианты тестов с различным поведением Си и Си++
  1. В Си если мы имеем тип "struct s", то к нему можем обращаться только через "struct s", а в Си++ можно через "s".

    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    #include <stdio.h>
     
    int x[1111];
     
    int
    main (void)
    {
      struct x {int a;} s;
     
      if (sizeof (x) == sizeof (s))
        printf("lang=C++\n");
      else
        printf("lang=C\n");
      return 0;
    }
  2. Здесь на 100% не уверен, надо стандарты читать. Но вроде бы дело было такое. В двухаргументных операциях с разными типами аргументов приведение типа делается для "более короткого" типа к "более длинному". Далее идут пояснения, что такое "более длинный". В случае целых типов одного размера, беззнаковый тип является более длинным. Но с битовыми полями немного сложнее. В Си считается, что битовое поле трактуется как обычная переменная этого же типа, а потому битовое поле типа unsigned размера 3 считается "более широким", чем 32-битная переменная типа int (потому что сравнение идёт через типы). А в Си++ сначала идёт честное сранение размеров, а потому битовое поле размера 3 всегда более короткое чем переменная размера 32 (независимо от знаковости типов). Или что-то типа того. Как уже гвоорил, на 100% не уверен

    Кстати, я поторопился назвать этот способ честным. Тут есть всякие unspecified случаи (то как приведение отрицательного значения к беззнаковому типу).

    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    #include <stdio.h>
     
    struct { unsigned d:3; } s = { 7 };
    unsigned sd = 7;
     
    main()
    {
      int x = -1;
      int p1, p2;
     
      p1 = x < s.d;
      p2 = x < sd;
     
      printf("%d %d\n", p1, p2);
    }
    Код
    $ g++ t.c ; ./a.out
    0 0
    
    $ gcc t.c ; ./a.out
    1 0
  3. В Си++ есть комментарии через "//", а в Си нет

    C
    1
    2
    
    a = b //**/ c
        + d;
    Компилятор Си два слеша как комментарий не должен воспринимать, а потому комментарием будет "/**/" и выражение будет "b / c + d". А компилятор Си++ два слэша воспримет как комментарий, а потому выражение будет "b + d".

    Решение назвал теоретически честным, потому что, например, gcc в режиме Си так же воспринимает "//".

  4. С точки зрения Си++ переменные "int x" и "const int x" - это две разные переменные. Тест состоит из двух файлов

    C
    1
    
    const int x = 1;
    C
    1
    2
    
    int x;
    int main() { return x; }
    В режиме Си два объекта "x" должны быть одним и тем же. В Си разрешено линковать инициализированный и неинициализированный объекты содним именем. В итоге после линковки будет одна переменная "x", которая статически проинциализирована единицей. В режиме Си++ после линковки будут две переменные "x": одна инициализирована единицей (const int x), адругая - нулём (int x), поскольку глобальные неинициализированные объекты инициализируются нулём

Добавлено через 58 минут
Цитата Сообщение от fasked Посмотреть сообщение
почему же неправильно, если в Си sizeof('a') == sizeof(int), а в Си++ sizeof('a') == sizeof(char)
Но sizeof(char) может быть равен sizeof(int). Например, это имеет место быть на некоторых сигнальных процессорах
12
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
05.08.2010, 14:30  [ТС] 565
Вот. Сам ее решил не писать, ибо было впадлу)

Траектория черепахи
Траектория черепахи:

(Траектории черепахи) Язык Лого, особенно популярный среди пользователей персональных компьютеров, сделал известной идею траекторий черепахи. редставьте себе механическую черепаху, которая ползает по комнате под управлением программы на C++. Черепаха несет пишущее перо, которое может находиться в одной из двух позиций — нижней или верхней. Если перо в нижней позиции, черепаха вычерчивает траекторию движения, если в верхней, то черепаха передвигается свободно и ничего не вычерчивает. В этой задаче вы будете моделировать действия черепахи и создавать компьютеризованный эскиз пути. Используйте массив floor размером 20 на 20 с нулевыми начальными условиями. Считывайте команды из содержащего их массива. Все время отмечайте текущую позицию, черепахи и положение пера — нижнее или верхнее. Предполагайте, что черепаха всегда стартует из позиции О, О на полу с верхним положением пера. Ваша программа должна подавать команды черепахе в соответствии со следующими обозначениями:
Команда
1 - перо вверх
2 - перо вниз
3 - поворот направо
4 - поворот налево
5, 10 - передвижение вперед на 10 шагов
6 - печать массива 20 на 20
9 - конец данных (сигнальная метка)

Предположим, что черепаха находится где-то возле центра комнаты. Следующая «программа управления черепахой» начертила бы квадрат 12 на 12 и оставила бы перо в верхней позиции:
2
5,12 '
3
5,12
3
5,12
3
5,12
1
6
9
Если черепаха передвигается с пером, находящимся в нижней позиции, устанавливайте соответствующие элементы массива floor равными 1. При подаче команды 6 (печать) отображайте звездочкой или каким-либо другим символом все значения 1 в массиве, где бы они ни были. Все нули, где бы они ни были, отобразите пробелами. Напишите программу, реализующую рассмотренные возможности отображения траектории передвижения черепахи. Добавьте другие команды для повышения мощности вашего языка управления траекторией черепахи.
0
Эксперт С++
5015 / 2594 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.08.2010, 15:18 566
Цитата Сообщение от Lavroff Посмотреть сообщение
Траектория черепахи
^__^
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <utility>
#include <string>
#include <iostream>
#include <cstdlib>
 
class Tortoise
{
public:
    
    Tortoise(const std::string &name) : m_pos(0, 0),
                                        m_name(name),
                                        m_stylus(false)
    {
        for(int i = 0; i < m_xsize; ++i)
            std::fill_n(m_floor[i], m_ysize, ' ');
    }
 
    void MoveUp()
    {
        if(m_pos.second + 1 < m_ysize)
            ++m_pos.second;
 
        DrawPath();
    }
 
    void MoveDown()
    {
        if(m_pos.second - 1 >= 0)
            --m_pos.second;
 
        DrawPath();
    }
 
    void MoveLeft()
    {
        if(m_pos.first - 1 >= 0)
            --m_pos.first;
 
        DrawPath();
    }
 
    void MoveRight()
    {
        if(m_pos.first + 1 < m_xsize)
            ++m_pos.first;
 
        DrawPath();
    }
 
    std::pair<int, int> GetPosition() const
    {
        return m_pos;
    }
 
    bool GetStylusState() const
    {
        return m_stylus;
    }
 
    void SetStylusState(bool state)
    {
        m_stylus = state;
    }
 
    std::ostream& PrintFloor(std::ostream& os) const
    {
        for(int i = 0; i < m_xsize; ++i)
            os << "+ ";
        os << std::endl;
 
        for(int i = 0; i < m_xsize; ++i)
        {
            os << "+ ";
 
            for(int j = 0; j < m_ysize; ++j)
            {
                if(i == m_pos.first && j == m_pos.second)
                    os << 'x' << ' ';
                else
                    os << m_floor[i][j] << ' ';
            }
 
            os << "+" << std::endl;
        }
 
        for(int i = 0; i < m_xsize; ++i)
            os << "+ ";
        os << std::endl;
 
        return os;
    }
 
private:
 
    void DrawPath()
    {
        if(GetStylusState())
            m_floor[m_pos.first][m_pos.second] = '*';
    }
 
    const static size_t m_xsize = 20;   // size of floor
    const static size_t m_ysize = 20;   // x and y
 
    std::string m_name;                 // name of tortoise ^^
    std::pair<int, int> m_pos;          // cuurent coordinates
    bool m_stylus;                      // if true - on top, if false - at the bottom
 
    char m_floor[m_xsize][m_ysize];     // floor :)
};
 
 
int main()
{
    Tortoise kim("Kimberly");
    kim.SetStylusState(true);
 
    for(int i = 0; i < 20; ++i)
    {
        int step = rand() % 4;
        
        switch (step)
        {
        case 0: kim.MoveDown(); break;
        case 1: kim.MoveLeft(); break;
        case 2: kim.MoveRight(); break;
        case 3: kim.MoveUp(); break;
        }
    }
 
    kim.PrintFloor(std::cout);
 
    system("PAUSE");
    return 0;
}
2
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
05.08.2010, 15:20 567
Напишите интерпретатор языка HQ9+
1
║XLR8║
1042 / 831 / 254
Регистрация: 25.07.2009
Сообщений: 4,121
Записей в блоге: 5
05.08.2010, 16:09 568
На ACM контестерах уйма задач, выбирайте какаю хотите.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
05.08.2010, 16:45 569
Цитата Сообщение от Nameless One Посмотреть сообщение
Напишите интерпретатор языка HQ9+
"Чего только не придумают, лишь бы картошку не копать" (c)
0
Эксперт С++
475 / 443 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
05.08.2010, 17:27 570
Цитата Сообщение от outoftime Посмотреть сообщение
На ACM контестерах уйма задач, выбирайте какаю хотите.
Предлагал уже, чем-то не нравятся.
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.08.2010, 17:46 571
очень желательно решить без компилятора
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
#include <iostream>
struct A
{
    A(): i(1){}
    int i;
};
struct B : A
{
    B(): j(2){}
    int j;
};
int main()
{
    A *p = new B[10];
    A *q = p;
    int total = 0;
    for (int i = 0; i < 10; ++i)
    {
        total += q++->i;
    }
    std::cout << total << std::endl;
    //чему равна переменная total в этом участке кода?
    delete [] p;
}
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10838 / 6652 / 1614
Регистрация: 25.07.2009
Сообщений: 12,430
05.08.2010, 17:56 572
Цитата Сообщение от niXman Посмотреть сообщение
очень желательно решить без компилятора
ничего не понял... был уверен, что 10 получится, скомпилил - 15... с какого перепуга?
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.08.2010, 18:01 573
Цитата Сообщение от easybudda Посмотреть сообщение
скомпилил - 15
рано вы ответ дали

Цитата Сообщение от easybudda Посмотреть сообщение
с какого перепуга?
думаем..
0
Эксперт С++
5015 / 2594 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.08.2010, 18:03 574
Цитата Сообщение от easybudda Посмотреть сообщение
ничего не понял... был уверен, что 10 получится, скомпилил - 15... с какого перепуга?
таже фигня, получается что половина массива это тип А, а половина массива тип В
при чем именно через один.
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.08.2010, 18:09 575
B - это массив из десяти элементов. каждый элемент - это объект(класс)-потомок от A. собственные поля у B - это поле j, помимо этого достается поле от A - это i. смотрим далее: q - это указатель изначально на B[0]. при q++ мы переходим на размер, занимаемый типом элемента массива. в типе класса B описана только одна переменная, а элемент массива содержит две переменные (j и i), значит мы перейдем к ее значению. в адресном пространстве сначала располагаются поля родительского класса, потом потомка. после десяти повторений получаем, что total=1+2+...=15

вот такие чудеса
11
Эксперт С++
3204 / 1731 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
05.08.2010, 18:18 576
Цитата Сообщение от niXman Посмотреть сообщение
B - это массив из десяти элементов. каждый элемент - это объект(класс)-потомок от A. собственные поля у B - это поле j, помимо этого достается поле от A - это i. смотрим далее: q - это указатель изначально на B[0]. при q++ мы переходим на размер, занимаемый типом элемента массива. в типе класса B описана только одна переменная, а элемент массива содержит две переменные (j и i), значит мы перейдем к ее значению. в адресном пространстве сначала располагаются поля родительского класса, потом потомка. после десяти повторений получаем, что total=1+2+...=15

вот такие чудеса
Немножко не так. q++ сдвигает указатель на один int не потому, что в B объявлена одна переменная, а потому, что он указатель на структуру A, размер которой int.
5
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.08.2010, 18:22 577
Цитата Сообщение от Mr.X Посмотреть сообщение
Немножко не так. q++ сдвигает указатель на один int не потому, что в B объявлена одна переменная, а потому, что он указатель на структуру A, размер которой int.
те же яйца, только в профиль.
0
Эксперт С++
3204 / 1731 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
05.08.2010, 18:26 578
Цитата Сообщение от niXman Посмотреть сообщение
те же яйца, только в профиль.
Ну почему же. Если в строках 15 и 16 тип A заменить на B, то выведет 10.
0
easybudda
05.08.2010, 18:30
  #579

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Напишите интерпретатор языка HQ9+
Ржачный язык прогаммирования :D

0
Nameless One
05.08.2010, 18:38     Задачи для тренировки и лучшего понимания
  #580

Не по теме:

easybudda, это еще что... Взять хотя бы INTERCAL, paranoid или тот же LOLCODE :D...

0
05.08.2010, 18:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 18:38
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
580
Закрытая тема Создать тему
Опции темы

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