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

Веселая считалочка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
06.10.2011, 20:59     Веселая считалочка #1
Есть задача: N человек играют в следующую игру: стоя в кругу они начинают считалку. Счёт идёт до числа M. Игрок, на которого падает счёт M, выбывает, а считалка начинается сначала со следующего по кругу игрока. Выигрывает тот, кто остался последним в кругу. Считалка начинается с игрока T, составить алгоритм для определения выигравшего игрока и первой пятёрки выбывших игроков.
Помогите написать код. Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2011, 20:59     Веселая считалочка
Посмотрите здесь:

Веселая игра по сети )
Считалочка. Turbo Pascal
Считалочка Turbo Pascal
Написать программу считалочка C++
C++ Считалочка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
07.10.2011, 10:45     Веселая считалочка #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 unsigned int N, M, T; // èãðîêè, ÷èñëî, Г±ГІГ*ðòîâûé èãðîê
 cin >> N >> M >> T;
 vector <int> gamers(N);
 for (int i=0;i<N;i++) gamers[i]=i+1;
 int i=N, vib;
 T--;
 while (i>1)
 {
  vib=(M%i+T)%i;
  if (!vib) vib=i; vib--;
  cout << "Out: " << gamers[vib] << endl;
  T=vib;
  gamers.erase(gamers.begin()+vib);
  i--;
 }
 cout << "Winner: " << gamers[0] << endl;
 system("pause");
 return 0;
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
07.10.2011, 17:23  [ТС]     Веселая считалочка #3
mimicria,
спасибо, только не мог бы ты переписать код на С? Буду оч благодарен.
и еще: в этой задаче можно обойтись без массивов? если да, то мне лучше будет код без массива.
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2011, 15:47     Веселая считалочка #4
Цитата Сообщение от believe Посмотреть сообщение
Есть задача: N человек играют в следующую игру: стоя в кругу они начинают считалку. Счёт идёт до числа M. Игрок, на которого падает счёт M, выбывает, а считалка начинается сначала со следующего по кругу игрока. Выигрывает тот, кто остался последним в кругу. Считалка начинается с игрока T, составить алгоритм для определения выигравшего игрока и первой пятёрки выбывших игроков.
Помогите написать код. Заранее спасибо!
Цитата Сообщение от believe Посмотреть сообщение
переписать код на С?
Цитата Сообщение от believe Посмотреть сообщение
если да, то мне лучше будет код без массива.
- Вот на Си без масива, а главное предельно просто
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
#include <stdio.h>  //printf
#include <conio.h> //getch
 
int Enumeration(int M, int T, int N)
{
    int count = M - T;
    for(int i = 1; ; i++, count++)
    {
        if(count == M)
            break;
        if(N < i)
            i = 1;
    }
    return i;
}
 
int main()
{
    int i,N,M,T,L;
    do
    {
        printf("Enter N : ");
        scanf("%d",&N);
        printf("Enter M : ");
        scanf("%d",&M);
        printf("Enter T : ");
        scanf("%d",&T);
        printf("Enter L : ");//Число выбывших, не обязательно 5-ка (можно 2 или 10 к примеру)
        scanf("%d",&L);
        for(i = 0; i < L; i++)
        {
            printf(
                "CIRCLE : %d IN CIRCLE : %d COMPETITOR : %d - OUT\r\n", 
                i + 1,
                N - i,
                Enumeration(M, ((i == 0) ? T : 1), N - i) + i
            );
        }
        printf("Press \'y\' for new input\r\n");
    }
    while(getch() == 'y');
    return 0;
}
Миниатюры
Веселая считалочка  
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
09.10.2011, 23:20  [ТС]     Веселая считалочка #5
-=ЮрА=-,
во-первых, на твоем скрине выбывает 4 игрок, потом третий, а потом опять четвертый. Если игрок выбыл, то он уже больше не должен участвовать в считалке.
а во-вторых, поясни, плиз, это:
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int Enumeration(int M, int T, int N)
{
int count = M - T;
for(int i = 1; ; i++, count++)
{
if(count == M)
break;
if(N < i)
i = 1;
}
return i;
}
и это:


Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i = 0; i < L; i++)
{
printf(
"CIRCLE : %d IN CIRCLE : %d COMPETITOR : %d - OUT\r\n",
i + 1,
N - i,
Enumeration(M, ((i == 0) ? T : 1), N - i) + i
);
}
И еще надо определить победителя.

Добавлено через 6 минут
Кстати, все, кто может помочь, отзовитесь, плиз. К вечеру понедельника задача кровь из носу надо. Спасибо.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.10.2011, 23:42     Веселая считалочка #6
Без массива никак. Вам же нужно знать, кто выбыл, а кто нет.

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
#include <stdio.h>
 
#define OK  0
#define OUT 1
 
int main()
{
    size_t players_count;  // количество игроков
    size_t out_count = 0;  // количество выбывших игроков
    size_t game_count;     // количество ходов
    size_t current_player; // текущий игрок
 
    #define FIRST_OUT_COUNT 5
    size_t first_out[ FIRST_OUT_COUNT ] = { 0 }; // учёт выбывших первыми
    size_t first_out_i = 0; // счётчик выбывши первыми
 
    printf( "Players:\n>" );
    scanf( "%d", &players_count );
 
    char * players = (char*) calloc( 1, players_count );
 
    printf( "Max count:\n>" );
    scanf( "%d", &game_count );
 
    printf( "Start with:\n>" );
    scanf( "%d", &current_player );
 
    if( current_player >= players_count )
    {
        printf( "We have %d players only!\n", players_count );
        free( players );
 
        return 0;
    }
 
    size_t i;
 
    while( out_count != players_count - 1 ) // пока не останется один невыбывший
    {
        for( i = 0; i < game_count; i++ ) // считаем от нуля до game_count - 1
        {
            do // ищем следующего невыбывшего
            {
                current_player++; // идём к следущему игроку
 
                if( current_player == players_count ) // если предыдущий был последним
                    current_player = 0; // идём к первому
            }
            while( players[ current_player ] == OUT );
 
            printf( "%3d ", current_player );
        }
 
        out_count++; // ещё один выбыл
        players[ current_player ] = OUT; // отмечаем его как выбывшего
        printf( " - %3d OUT\n", current_player ); // и говорим об этом
 
        if( first_out_i < FIRST_OUT_COUNT ) // если список выбывших первыми ещё не заполнен
        {
            first_out[ first_out_i ] = current_player; // добавляем выбывшего игрока в него
            first_out_i++;
        }
    }
 
    for( i = 0; players[i] != OK; i++ ); // ищем не выбывшего
 
    printf( "\n%d won!\nFirst %d out: ", i, FIRST_OUT_COUNT ); // выводим его
 
    for( i = 0; i < FIRST_OUT_COUNT; i++ ) // выводим первых выбывших
        printf( "%3d ", first_out[i] );
 
    puts( "\nGame over.\n" );
 
    free( players );
 
    return 0;
}
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
10.10.2011, 15:54  [ТС]     Веселая считалочка #7
talis,
закинул код в visual, а он мне пишет:
error C3861: 'calloc': identifier not found
error C3861: 'free': identifier not found
error C3861: 'free': identifier not found
как исправить?

И сделайте, плиз, скрин Ваших результатов.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
10.10.2011, 16:04     Веселая считалочка #8
библиотеку stdlib.h подключить
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
10.10.2011, 16:13  [ТС]     Веселая считалочка #9
aeshes,
спасибо!!!
скажи еще, что такое size_t?
Цитата Сообщение от talis Посмотреть сообщение
size_t players_count; // количество игроков
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
10.10.2011, 16:18     Веселая считалочка #10
это беззнаковый целый тип, используется для хранения размера. Результат такого типа возвращает также оператор sizeof, который определяет размер в байтах своего операнда
В принципе, в своей задаче можешь безболезненно заменить его на int или unsigned int
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
10.10.2011, 16:33  [ТС]     Веселая считалочка #11
ок, а можешь еще сказать, что еще умное можно заменить на простое, чтоб было видно, что эту прогу написал новичок)

Добавлено через 12 минут
aeshes,
а что это за функции calloc и free?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
10.10.2011, 16:37     Веселая считалочка #12
там все остальное просто) Извини за наезд, но насчет calloc и free - яндекс или гугл в помощь. Первая же ссылка в яндексе тебе поможет. Надеюсь, разобрать пару фраз на английском труда не составит?
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
10.10.2011, 16:42  [ТС]     Веселая считалочка #13
aeshes,
понимаешь, на яндексе будет написано умными словами, а тот человек, который знает, что эти функции обозначают, может объяснить просто и доступно)

а поясни плиз еще эту строку, ее целиком я вряд ли найду:
char * players = (char*) calloc( 1, players_count );
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.10.2011, 16:46     Веселая считалочка #14
Link
По мне так понятнее некуда. Даже на русском. Даже на первом листе результатов гугла по запросу "calloc". Смекаешь?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
10.10.2011, 16:49     Веселая считалочка #15
на яндексе при вводе слова calloc первая ссылка void * calloc ( size_t num, size_t size );. Там все написано так же, как и я тебе скажу:
функция выделяет блок памяти для num элементов, каждый из которых занимает по size байт, и инициализирует все биты этой памяти нулями

твоя строка выделяет память под динамический массив символов players

Функция free как видно по ее названию - освобождает выделенную ранее память
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2011, 16:51     Веселая считалочка
Еще ссылки по теме:

Считалочка. Указатели Free Pascal
Lisp Детская считалочка
[Forth] Детская считалочка

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.10.2011, 16:51     Веселая считалочка #16
believe, calloc выделяет в куче блок памяти указанного размера и заполняет его нулями. Возвращает указатель на начало этого блока. free освобождает блок памяти, ранее выделенный из кучи. А вообще, читайте руководства. Человек, который это понимает и может объяснить это простыми словами, знает это из справки. Тот, который просто повторяет простые слова, не сможет объяснить подробнее.

Добавлено через 15 секунд
Опоздал, но ничего
Yandex
Объявления
10.10.2011, 16:51     Веселая считалочка
Ответ Создать тему
Опции темы

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