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

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

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

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

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

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

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

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

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

1272
Эксперт С++
3204 / 1731 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
30.01.2011, 14:51 1201
valeriikozlov, удалось сделать мгновенным вычисление последней ненулевой цифры факториала для любых значений long long:
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
/////////////////////////////////////////////////////////////////////////////////////////
//Вычисление последней ненулевой цифры факториала.
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <limits>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef long long    T_num;
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void  add_2_count_and_mult_multiplier_for_interval
    (
        T_num   interval,
        T_num   n,
        T_num&  _2_count,
        T_num&  multiplier
    )
{
    T_num  n_cur  =   n / interval;
    _2_count      +=  n_cur / 10 * 4;     
 
    for(T_num i = 2; i <= n_cur % 10; ++i)
    {
        if(i % 5 != 0)
        {            
            multiplier = multiplier * i % 10;        
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
T_num  get_last_nonzero_dig(T_num  n)
{
    const int  _2_COUNT_MOD  = 4;
    T_num      _2_count      = 0;   
    T_num      _5_fact       = 5;
 
    while(n / _5_fact > 0)
    {
       _2_count -= n / _5_fact;
       _5_fact  *= 5;
    }
 
    T_num  res = 1;
    for(T_num  interval = 1; interval <= n; interval *= 5)
    {
        add_2_count_and_mult_multiplier_for_interval
            (
                interval,
                n,
                _2_count,
                res
            );
    }
    ++(--_2_count %= _2_COUNT_MOD);
 
    if(_2_count < 0)
    {
        _2_count += _2_COUNT_MOD;
    }    
 
    while(_2_count--)
    {
        res = res * 2 % 10;
    }    
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));    
    
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << "n <= "
                  << std::numeric_limits<T_num>::max()                  
                  << std::endl
                  << "    :";
        T_str  s;
        std::cin >> s;
        std::istringstream  ssin(s); 
        T_num  n = 0;
        if(   !(ssin >> n)
           || n <= 0      )
        {
            break;     
        }
 
        std::cout << "Последняя цифра у "
                  << n                   
                  << "! равна "
                  << get_last_nonzero_dig(n)                  
                  << std::endl;   
    }
}
2
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
30.01.2011, 15:29 1202
Mr.X, Отличное решение, честно. По-моему с этой задачи хватит. У меня к Вам просьба - можете следущую задачу сами предложить?
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
30.01.2011, 15:41 1203
valeriikozlov, если несложно, то при помещении задачи коллекционируй ссылки на пост зачадей. В самом первом посте данной темы собраны ссылки на задачи, а модераторы по ходу дела уже не успевают ковыряться в теме, которая очень активно развивается. Под твоим руководством было решено много задач, которые действительно интересны начинающим. Надо бы ссылочки на них собрать и отправить кому-нибудь из модераторов
1
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
30.01.2011, 15:44 1204
Evg, хорошая идея
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
30.01.2011, 15:46 1205
Цитата Сообщение от Nameless One Посмотреть сообщение
Evg, хорошая идея
Идея не моя, она давно существует постфактум. Просто те, кто активно в эту тему пишут, уже давно на первый пост не обращают внимания
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
30.01.2011, 15:49 1206
Evg, Сейчас попробую. Может быть Nameless One поможет оформить?
0
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
30.01.2011, 15:51 1207
valeriikozlov, без проблем, напишешь мне в личку
0
1 / 1 / 0
Регистрация: 02.02.2011
Сообщений: 11
02.02.2011, 18:18 1208
Спойлер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
void main() {
    for(int wight=0;wight<64;wight++)
    {
 
        for(int black=0;black<64;black++){
 
        if((wight/8+black/8)%2==0)
        {
            cout << "W";
        }
        else
            cout << "B";
            }
    cout << endl;
        }
    }
0
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 3
13.02.2011, 07:14 1209
Цитата Сообщение от HIMen Посмотреть сообщение
Lavroff, Дан целочисленный массив, наподобие такого {1, 7, 3, 7, 8, 1, 3}. Все его элементы, кроме одного повторяются ровно 2 раза (две 1, две 7, две 3, но одна 8). Найти это неповторяющееся число. Числа и размер массива могут быть любыми.
Надеюсь понятно объяснил.
Мой ответ :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define N 7
int main () {
    int a[N];
    int *b, *c;
    cout << " vvedite massiv: " << endl;
    for (int k = 0; k < N; k ++ ) {
        cin >> a[k];
    }
    for(int i = 0; i < N; i++) {
        b = &a[i];
        int count = 0;
        for(int j=0; j < N; j++) {
            if (a[i] == a[j] ) count += 1;
            else if(count == 1) { b = &a[j]; }
        }
        if (count == 1) { c = &a[i]; }
 
 
    }
        cout << "final odpoved: " << *c << endl;
 
 
}
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
13.02.2011, 07:54  [ТС] 1210
PragueR, Если полистать чуть дальше, там будет предоставленное автором задачи решение с использованием XOR.
0
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 3
13.02.2011, 08:44 1211
Паук и Муха

В пустой прямоугольной комнате размерами АхВхС (длина, ширина, высота) на пол упала уснувшая муха. Паук, находившийся на одной из стен, или на полу комнаты, начал двигаться к ней по кратчайшему пути.
На какое расстояние он при этом переместится?
входные данные - переменные a, b, c.
Задача не сложная, но интерестная.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
int main () {
int x1,x2,y1,y2,z1,z2;
cout << "vvedite coordinaty muhi: (x1, y1, z1=0) = " << endl;
cin >> x1 >> y1 >> z1;
cout << "vvedite coordinaty pauka: (x2, y2, z2) note (x2 = 0 | y2 = 0) " << endl;
cin >> x2 >> y2 >> z2;
int wag;
if ( x1 == 0 || x2 == 0 ) wag = (abs)(z2 - z1 ) + (abs)( x1-x2 );
else if ( y1 == 0 || y2 == 0 ) wag = (abs)(z2 - z1 ) + (abs)( y2 - y1 );
cout << " rastoyanie mejdu nimi: " << (sqrt)((z2 - z1) * (z2 - z1) + ( wag - (abs)(z2 - z1)) * ( wag - (abs)(z2 - z1)) ) << " a pauk sdelaet: " << wag << " wagov\n";
 
 
}
0
1075 / 1001 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
13.02.2011, 11:41 1212
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Последняя цифра N!
(Время: 1 сек. Память: 16 Мб Сложность: 39%)
Решение
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
// Класс "особой" дроби
struct MyFrac
{
    unsigned int nLastNumber; // последняя цифра в числителе
    int dPower; // степень двойки в знаменателе. Будет отрицательная
    
    MyFrac()
    {
        reset();
    }
    
    void reset()
    {
        nLastNumber = 1;
        dPower = 0;
    }
    
    void mul(unsigned int m)
    {
        if (m%10 == 1) return;
        
        while (m%10 == 0)
            m /= 10;
        
        while (m%5 == 0)
        {
            dPower++;
            m /= 5;
        }
        
        while (m%2 == 0)
        {
            dPower--;
            m /= 2;
        }
        
        nLastNumber = ( nLastNumber * m ) %10;
    }
    
    unsigned int result()
    {
        unsigned int r = nLastNumber;
        int t = dPower;
        if (dPower < -4)
            dPower += 4;
 
        while (t<0)
        {
            t++;
            r = (r*2)%10;
        }
        return r;
    }
    
};
 
int main()
{
    unsigned int n;
    MyFrac* obj = new MyFrac();
    
    //*
    ifstream cin;
    ofstream cout;
    
    cin.open("input.txt", ios_base::in);
    cout.open("output.txt", ios_base::out);
    
    // */
    
    cin >> n;
    
    for (unsigned int i=2; i<=n; i++)
    {
        obj->mul(i);
    }
    
    cout << obj->result() << endl;
    
    return 0;
}

При n=9999 ответ выводит моментально. Все тесты пройдены.
Но я думаю, что мое решение можно переделать в более лучшую сторону.

Добавлено через 12 минут
Нашел косяк в функции MyFrac::result(). Исправил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    unsigned int result()
    {
        unsigned int r = nLastNumber;
        int t = dPower;
        t = t%4;
        if (t == 0) t=-4;
 
        while (t<0)
        {
            t++;
            r = (r*2)%10;
        }
        return r;
    }
1
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
13.02.2011, 16:08 1213
решил самую первую задачу в теме(person)
Только не получается конструировать обьект BadDude с помощью конструкторов PokerPlayer и Gunslinger(строки остаются пустыми)
classes.h
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
#ifndef CLASSES_H_
#define CLASSES_H_
#include <string>
class Person
 { 
 protected:
  std::string name,surname;   
 public:
   Person(){};
   Person(std::string n,std::string s):name(n),surname(s){};
  ~Person(){};
  virtual void Set(std::string n,std::string s);
  virtual void Show();
};
 
class Gunslinger:virtual public Person
{
public:
    Gunslinger(){};
    Gunslinger(std::string n,std::string s,unsigned short k):Person(n,s),stvol(k){};
    void Set(std::string n,std::string s,unsigned short k);
    virtual~Gunslinger(){};
    virtual void Show();
    double Draw();
protected:
    unsigned short stvol;
};
 
 class PokerPlayer:virtual public Person
 {
 public:
     PokerPlayer(){};
     PokerPlayer(std::string n,std::string s):Person(n,s){};
     virtual~PokerPlayer(){};
     int Draw();
     void Show();
     void Set(std::string n,std::string s);
 };
 
 class BadDude:public Gunslinger,public PokerPlayer
{
public:
    BadDude(std::string n,std::string s,unsigned short k):PokerPlayer(n,s),Gunslinger(n,s,k){};
    virtual~BadDude(){};
    double Gdraw();
    int Cdraw();
    void Set(std::string n,std::string s,unsigned short k);
    void Show();
};
#endif
functions.cpp
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
#include<iostream>
#include<string>
#include "classes.h"
#include<ctime>
//------------------------------------------------
//--------------------PERSON----------------------
//------------------------------------------------
void Person::Set(std::string n="Name",std::string s="Surname")
{
 name=n;
 surname=s;
}
void Person::Show()
{
 std::cout<<"Name:"<<name<<"\n"<<"Surname:"<<surname<<"\n";
}
//------------------------------------------------
//--------------------GUNSLINGER------------------
//------------------------------------------------
void Gunslinger::Set(std::string n,std::string s,unsigned short k)
{
 Person::Set(n,s);
 stvol=k;
}
double Gunslinger::Draw()
{
 double hours,minutes;
 srand((unsigned)time(NULL));
 hours=rand()%(24);
 minutes=rand()%(59)+1;
 minutes/=100;
 double tim=hours+ minutes;
 return tim;
}
void Gunslinger::Show()
{
    Person::Show();
    std::cout<<"Number of stvols:"<<stvol<<"\n";
    std::cout<<"Time:"<<Draw()<<"\n";
}
//------------------------------------------------
//--------------------POKERPLAYER-----------------
//------------------------------------------------
int PokerPlayer::Draw()
{
 srand((unsigned)time(NULL));
 return rand()%(52)+1;
}
void PokerPlayer::Show()
{
    Person::Show();
    std::cout<<"Next card:"<<Draw()<<"\n";
}
void PokerPlayer::Set(std::string n,std::string s)
{
 Person::Set(n,s);
}
//------------------------------------------------
//--------------------BADDUDE---------------------
//------------------------------------------------
int BadDude::Cdraw()
{
 return PokerPlayer::Draw();
}
double BadDude::Gdraw()
{
 return Gunslinger::Draw();
}
void BadDude::Set(std::string n,std::string s,unsigned short k)
{
 name=n;
 surname=s;
 stvol=k;
}
void BadDude::Show()
{
 std::cout<<"Name:"<<name<<"\n";
 std::cout<<"Surname:"<<surname<<"\n";
 std::cout<<"Number of stvols:"<<stvol<<"\n";
 std::cout<<"Next card:"<<Cdraw()<<"\n";
 std::cout<<"Time:"<<Gdraw()<<"\n";
}
person.cpp
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
#include <iostream>
#include<string>
#include "classes.h"
int main()
{
 std::string name,surname;
 unsigned short type,k;
 std::cout<<"Enter type:\n-1 for person\n-2 for gunslinger\n-3 for poker player\n-4 for bad dude\n";
 std::cin>>type;
 std::cout<<"Enter name\n";
 std::cin>>name;
 std::cout<<"Enter surname\n";
 std::cin>>surname;
 if(type==2 || type==4)
 {
  std::cout<<"Enter number of stvols\n";
  std::cin>>k;
 }
 Person* pers;
 switch(type)
 {
  case 1:{pers=new Person(name,surname);break;}
  case 2:{pers=new Gunslinger(name,surname,k);break;}
  case 3:{pers=new PokerPlayer(name,surname);break;}
  case 4:{pers=new BadDude(name,surname,k);break;}
  default:std::cout<<"Illegal type";
 }
 pers->Show();
 std::cin.get();
 std::cin.get();
}
BadDude нормально работает,если заменить строку
C++
1
    BadDude(std::string n,std::string s,unsigned short k):PokerPlayer(n,s),Gunslinger(n,s,k){};
на
C++
1
    BadDude(std::string n,std::string s,unsigned short k){Set(n,s,k);};
в файле "classes.h"
Можете обьяснить плз,как конструировать BadDude с помощью конструкторов PokerPlayer и Gunslinger
0
6 / 6 / 4
Регистрация: 14.01.2011
Сообщений: 81
19.02.2011, 13:40 1214
swap(a,b)
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
19.02.2011, 15:11 1215
это к чему???
0
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.02.2011, 00:25 1216
Цитата Сообщение от AnDrew_LP Посмотреть сообщение
это к чему???
Видимо к:
Цитата Сообщение от MikeSoft Посмотреть сообщение
Lavroff, вот вам ещё задачка ... здесь больше на логику.
Даны две переменных:
C++
1
2
int a = 10;
int b = 25;
Не используя третью переменную добиться результата:
C++
1
2
a = 25;
b = 10;
То есть, поменять значения местами.
У задачи существует как минимум три решения (может и больше, но мне в голову пришли три)
0
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.02.2011, 00:29 1217
Alex1205, если это так, как сказал CyBOSSeR, тогда вопрос: как вы думаете, как внутри реализован обмен переменных?
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
20.02.2011, 10:44 1218
Цитата Сообщение от Alex1205 Посмотреть сообщение
swap(a,b)
Чем это принципиально отличается от того, чтобы завести функцию my_function и в точке работы с переменными a и b написать "my_function (&a, &b)"?
0
2818 / 1628 / 252
Регистрация: 03.12.2007
Сообщений: 4,223
23.02.2011, 19:57 1219
Итак, что выведет эта прога? :-)
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
void PrintSum(int x);
 
int main()
{
    double d(-0.5);
 
    int f(floor(d));
    int c(ceil(d));
    int s(signed(d));
    int i(d);
 
    cout << bool(f) == 0;
    cout << bool(c) == 0;
    cout << bool(s) == 0;
    cout << bool(i) == 0;
    cout << endl;
 
    for (int i = 0, s = 0; i < 2; s += i++)
    {
        PrintSum(f + c + s + i);
    }
}
 
int s(int x)
{
    static int sum = 0;
    return sum += x;
}
 
void PrintSum(int x)
{
    cout << s(x) << endl;
}
0
2 / 2 / 0
Регистрация: 05.02.2011
Сообщений: 82
27.02.2011, 21:17 1220
а если вот так
a=b+0;
b=a+0;
результат будет тот что нужно) иль эт не подоходит?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2011, 21:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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