1

Тема: Цікавенько "Про футбол"

Доброго вечора. Потрібна ваша допомога.
Ось стоїть таке завдання:

Прихований текст

http://pic.lg.ua/x/17/3221bb/872effb4.png

У мене ось є трошки коду, який виводить масив, та назви команд. Але я не можу зрозуміти як його заповнити, тому що наприклад, Команда 0 не може грати сама з собою та заробляти за це бали, так само і решта.

#include "stdafx.h"
#include "windows.h"
#include "locale.h"
#include <ctime>
#define N 5
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "RUS");
    int tabl[N][N];
    int i,j,k=0,l=0,champ;
    srand(time(NULL));
    printf("Таблиця чемпіоната футболу %dx%d\n",N,N);
    for (i=0;i<N;i++)
    {
        printf("Команда %d | ",i);
        for (j=0;j<N;j++)
        {
            tabl[i][j]=rand()%3;
        }
    }
    printf("\n");
    for (i=0;i<N;i++)
    {
        printf("\n");
        for (j=0;j<N;j++)
        {
            printf("     %d      ",tabl[i][j]);
        }
        printf("| Команда %d",i);
    }
    printf("\n\n\n");
    system("Pause");
    return 0;
}

2 Востаннє редагувалося Itari (30.11.2015 20:41:43)

Re: Цікавенько "Про футбол"

Напиши так:

tabl[i][j]=(i!=j)?(rand()%3):-1;

Та аналізуй - якщо -1, то цю ячейку пропускатиме.

Доречі, а де сам аналіз? Як його робити ти теж не знаєш?

3

Re: Цікавенько "Про футбол"

Itari написав:

Напиши так:

tabl[i][j]=(i!=j)?(rand()%3):-1;

Та аналізуй - якщо -1, то цю ячейку пропускатиме.

Доречі, а де сам аналіз? Як його робити ти теж не знаєш?

Ні, аналіз не вивчали ще. А можна якось аналіз організувати по-другому?

4

Re: Цікавенько "Про футбол"

Ти незрозумів )
Я питаю, чи розказали тобі преподи як таку таблицю вони потребують аналізувати?
Добре, створи таблицю на папірці, та покажи як визначати команди, які пройшли тур. Зрозуміло?

5 Востаннє редагувалося snikers.mc (30.11.2015 22:12:46)

Re: Цікавенько "Про футбол"

Він нам розповідав щось про заповнення верхньої частини таблиці рандомом, а нижню - дзеркально, але самого метода як це зробити не розповідав.
такий ось графік получається незаповнений

Прихований текст

http://pic.lg.ua/x/12/1b3657/5dad7c17.png

А мені потрібно заповнить його отак наприклад:
Якщо зіграла команда 1 - 2 і команда 1 виграла, їй нараховується 2 бала, а команді 2 - 1 - записується 0 балів

6

Re: Цікавенько "Про футбол"

Дзеркально - це просто поміняти індекси місцями:

0,0  0,1
1,0  1,1

Ось, бачите - 0,1 і 1,0?  Тут все легко заповнюється одним циклом

7

Re: Цікавенько "Про футбол"

0-поразка, 1- нічія, 2- виграш
Ось приклад заповнення, тут виходить, що команда 1 і команда 7 пройшл турнір без поразок.

Прихований текст

http://pic.lg.ua/x/17/56ced8/10af831c.png

8 Востаннє редагувалося snikers.mc (02.12.2015 16:38:02)

Re: Цікавенько "Про футбол"

Дякую всім хто допомагав, посидів поміскував та й вирішив дану задачу.
Ось код, якщо кому цікаво)

Прихований текст
#include "stdafx.h"
#include "windows.h"
#include "locale.h"
#include <ctime>
#define M 6

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "RUS");
    int arr[M][M];
    int arg[M];
    int i,j,s=0,k=0,max=0;
    srand(time(NULL));
    printf("\t\tТурнрна таблиця чемпiонату [ %dx%d ]\n\n",M,M);
    for (i=0;i<M;i++)
    {
        for (j=i+1;j<M;j++)
        {
            arr[i][j]=rand()%3;
            if (arr[i][j] == 2)
                arr[j][i]=0;
            if (arr[i][j] == 1)
                arr[j][i]=1;
            if (arr[i][j] == 0)
                arr[j][i]=2;
        }
    }
    for(i=0;i<M;i++)
    {
        printf("Команда %d |  ",i);
        for(j=0;j<M;j++)
            if (arr[i][j] < 0)
                arr[i][j]=9;
    }
    for(i=0;i<M;i++)
    {
        for(j=0;j<M;j++)
        {
            if (arr[i][j] < 3 && arr[i][j] != 0)
                k++;
        }
        arg[i]=k; // записуємо в другий масив скільки виіграшів і нічей в команд
        k=0;
    }
    for (i=0;i<M;i++)
    {
        printf("\n");
        for(j=0;j<M;j++)
        {
            printf("     %d      ",arr[i][j]);
        }
        printf("   | %d",i);
    }
    printf("\n\n");
    for (i=0;i<M;i++)
        printf("У команди [ %d ] - [ %d ] виграшiв\n",i,arg[i]);
    printf("\n");
    for(i=0;i<M;i++)
        if (arg[i] == M-1)
            printf("Команда [ %d ] пройшла турнiр без поразок!\n\n",i);
    system("Pause");
    return 0;
}

9 Востаннє редагувалося koala (02.12.2015 17:53:26)

Re: Цікавенько "Про футбол"

Рядки 19-25:

arr[i][j] = rand()%3;
arr[j][i] = 2 - arr[i][j];

або ж навіть

arr[j][i] = 2 - (arr[i][j] = rand()%3);

але це вже для обфускаторів :)

Умова arr[ i ][ j ] < 0 (рядок 32) завжди хибна.
Умова arr[ i ][ j ] < 3 (рядок 39) завжди правдива.
Змінні бажано проголошувати і ініціалізувати перед використанням, тобто замість рядка 43 краще між 36 та 37 додати int k=0; і, відповідно, прибрати цю змінну з рядка 12. Ще краще взагалі прибрати k і лічити одразу в arg[ i ]. А взагалі чудово лічити чи навіть просто позначати поразки, а не навпаки - тобто десь так:

рядок 11: bool loses[M];
рядки 37-41: 
hasLoses[i] = false;
for(j=0;j<M && !hasLoses[i];j++)
{
  if (arr[i][j] == 0)
    hasLoses[i] = true;
}
рядок 59: if( !hasLoses[i] )

Ну і рядок 61 - страшна річ, але для навчального завдання стерпно.

Подякували: snikers.mc1

10 Востаннє редагувалося snikers.mc (02.12.2015 22:44:07)

Re: Цікавенько "Про футбол"

koala написав:

Умова arr[ i ][ j ] < 0 (рядок 32) завжди хибна.

Ця умов замінює діагональ, яка чомусь від'ємна, не зміг розібратись чому. Якщо прибрати цю умову, біагональ буде не з дев'яток, а з -858993....

koala написав:

Умова arr[ i ][ j ] < 3 (рядок 39) завжди правдива.

Так, за цією умовою перевіряю елементи рядка і збільшую лічильник, якщо вони менші за 3 і недорівнюють 0, , тобто 1 і 2, тому що в рядках ще є цифра 9, а її враховувати не потрібно.

koala написав:

Ну і рядок 61 - страшна річ, але для навчального завдання стерпно.

А як краще затримку організовувати?
А за все що підказали дякую, буду аналізувати та виправляти)

11

Re: Цікавенько "Про футбол"

Просто зануліть діагональ:

for(i = 0; i < M; ++i)
    arr[i][i] = 0;

Це проти всіх випадкових значень, які на цю діагональ лізуть.
А паузу - або системною функцією, залежно від ОС, або просто вводьте рядок, який вам не потрібен:

printf("Натисніть Enter...");
while('\n'!=getchar())
    ;
Подякували: snikers.mc1