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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
believe
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 15
#1

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

06.10.2011, 20:59. Просмотров 3247. Ответов 15
Метки нет (Все метки)

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

Считалочка - C++
Народ помогите написать программу считалочка, суть самой программы - написать программу в которой водим количество играков, затем водим...

Написать программу считалочка - C++
Народ помогите написать программу считалочка, суть самой программы - написать программу в которой водим количество играков, затем водим...

Веселая игра по сети ) - Игры
Всем добрый вечер! ситуация такая: работа запарила и хочется моральной разгрузки )). Есть 4 ноутбука и вай фай роутер. Подскажите игру в...

Считалочка - Delphi
Реализовать программу Считалочка с выводом выбывающих участников. Вот мой код, но он некоректно работает unit Main; interface ...

Считалочка - Turbo Pascal
Сделать задачу используя модули. Даны натуральные n, m. Предпологается, что n человек встают в круг и получают номера, считая против...

Считалочка - Turbo Pascal
В круге стоят ученики кадий из них имеет свой номер от 1 до 10 их начинают считать начиная с ученека под номером 1 ученик под номером 4...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
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
791 / 543 / 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
440 / 203 / 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
440 / 203 / 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
440 / 203 / 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
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.10.2011, 16:46 #14
Link
По мне так понятнее некуда. Даже на русском. Даже на первом листе результатов гугла по запросу "calloc". Смекаешь?
aeshes
440 / 203 / 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:49
Привет! Вот еще темы с ответами:

Считалочка. - Turbo Pascal
Помогите написать прогу: Вводится n детей, ввести их имена, сформировать в виде кольцевоаго однонаправленного списка, определить...

[Forth] Детская считалочка - Программирование
Нужно больше тем по форту! А то для него даже тега нет. :cry: По мотивам \ kid: 3 cells: next address and name (addr u) :...

Детская считалочка - Lisp
Определите функцию моделирующую &quot;детскую считалочку&quot;. В кругу стоит n человек имеющих разные имена, в &quot;считалочке&quot; m слов. Функция должна...

Считалочка. Указатели - Free Pascal
N ребят стоят по кругу. Начав отсчет первого, выгоняют каждого k-того, смыкая круг. Распечатать порядок удаления и номера двух оставшихся...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.10.2011, 16:49
Ответ Создать тему
Опции темы

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