Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2012, 22:54   #1
tanyuxxxa
Пользователь
 
Регистрация: 28.02.2012
Сообщений: 38
По умолчанию По коду разобраться в программе

Требуется создать программу – «Шашки». Имеется несколько шашек (не более 80) разного цвета, программа должна запросить число цветов, количество шашек каждого цвета и вывести сообщение об их расположению по кругу, так, чтобы рядом не стояли шашки одного цвета, в случае положительного ответа программа должна вывести строки цветов, пример такой расстановки.

Код:
#include <stdio.h>      
#include <stdlib.h>      
#include <conio.h>
 
template<class T>      
void swap(T& a, T& b)      
{    
    a = a + b;    
    b = a - b;    
    a = a - b;    
}     
 
// пузырьком      
void sort_lk(int* by,int* l, int n)      
{    
    int i,j;    
    for(i = 0;i < n;i++)    
     for(j = 1;j < n;j++)    
      if(by[j] > by[j-1])    
       {    
        swap(by[j], by[j-1]);    
        swap(l[j], l[j-1]);    
       }     
}      
 
void insert(int *m, int n, int to, int elem)      
{    
//  printf("ins %d to %d\n", elem, to);    
    int i;    
    for(i = n - 1; i >= to; i--)    
        m[i+1] = m[i];    
    m[to] = elem;    
}     
 
int main()      
{    
    int cl;    
    int i, j;    
    int *count, *cname;    
    int *res, total;  
    FILE *f;  
    char filename[32] = "rezult.txt";  
 
    // получение инфы    
    printf("Enter color count:");    
    scanf("%d",&cl);    
    if(cl < 1) return 0;    
 
    count = (int*)malloc(cl*sizeof(int));    
    cname = (int*)malloc(cl*sizeof(int));    
    for(i = 0;i < cl;i++)    
    {    
        printf("Enter chips' count for color '%d':", i + 1);    
        do scanf("%d", count + i); while(count[i] < 0);    
        cname[i] = i + 1;    
    }     
 
    sort_lk(count, cname, cl);      
 
    // определение возможности размещения      
    j = 0;      
    for(i = 1; i < cl; i++)      
    {    
        j += count[i];    
    }     
 
    total = count[0] + j;      
 
    f = fopen(filename,"w");   
 
    if(j < count[0])      
    {    
        printf("\nImposible!\n");      
        fprintf(f,"\nImposible!\n");    
        free(count);    
        free(cname);    
        getch();
        return(0);    
    }     
 
    printf("\nIt's posible!\n");
    fprintf(f,"\nIt's posible!\n");
 
    res = (int*)malloc(total*sizeof(int));      
 
    j = 1;      
 
    while(count[0] > 0)      
    {    
        insert(res,total,0,cname[j]);    
        insert(res,total,0,cname[0]);    
        count[0]--;    
        count[j]--;    
        if(count[j] < 1) j++;    
    }     
 
    while(j < cl)      
    {    
        for(i = 1;res[i] == cname[j] || res[i-1] == cname[j];i++);    
        insert(res, total, i, cname[j]);     
        count[j]--;    
        if(count[j] < 1) j++;    
    }     
 
    fprintf(f,"Result: ");      
    printf("Result: ");
    for(i = 0;i < total;i++)      
    {
        printf("%d ",res[i]);      
        fprintf(f,"%d ",res[i]);      
    }     
    fprintf(f,"\n");      
    printf("\n");      
 
    free(res);      
    free(count);      
    free(cname);      
    fclose(f);   
    getch();
    return(0);      
}
поясните пожалуйста по циклам что происходит в них,я не понимаю(а завтра защита этой программы( знаю только общий принцип работы
Программа запрашивает количество цветов, количество шашек каждого цвета и выдает сообщение о возможности размещения по кругу, одинаковых цветов шашки не должны стоять рядом. Алгоритм программы: мы сортируем цвета шашек по убыванию их количества. Если окажется, что наибольшее количество шашек одного цвета больше суммарного количества остальных шашек (больше половины всех шашек), то расставить эти шашки по кругу нельзя. Иначе расставить можно. В этом случае можно поступить следующим образом: ставить шашки, которых больше всего, на нечетные места; когда эти шашки закончатся – ставить шашки следующего цвета и так продолжать до тех пор, пока не заполнятся нечетные места. Затем нужно заполнять оставшимися шашками четные места.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 10.04.2012 в 23:58.
tanyuxxxa вне форума Ответить с цитированием
Старый 10.04.2012, 23:51   #2
tanyuxxxa
Пользователь
 
Регистрация: 28.02.2012
Сообщений: 38
По умолчанию

непонимаю что за cname для чего функция void insert(int *m, int n, int to, int elem)
{
int i;
for(i = n - 1; i >= to; i--)
m[i+1] = m[i];
m[to] = elem;
}
и для чего total
tanyuxxxa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается разобраться в программе с указателями sunny_alice Паскаль, Turbo Pascal, PascalABC.NET 15 16.04.2011 22:26
разобраться в программе fredwriter Помощь студентам 6 10.10.2010 10:47
Помогите разобраться в программе... Tee Jay Помощь студентам 0 25.06.2009 19:20
помогите разобраться в программе iwaniwan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 15.04.2009 19:38
Помогите разобраться в программе Gekada Общие вопросы C/C++ 1 09.12.2008 19:23