Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Календарь любого года 
:(
    Опции темы
masime
Дата 25.1.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.1.2010

Репутация: нет
Всего: нет



Помогите, пожалуйста мне доделать программу. Нужен календарь произвольного года. Все это нужно сделать в графическом режиме в BC31.  Надо, что бы календарь был в 4 строчки по 3 месяца. Как мне сделать? Не могу реализовать именнно этот вывод, даже представить не могу  . Очень срочно надо, пожалуйста.
Вот что у меня уже есть (сильно не ругайте).
Код

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include "stdio.h"
#include <math.h>
#include <dos.h>
#include "keyboard.h"
#include <alloc.h>

#define M_LEFT 2
#define M_RIGHT 159
#define M_TOP 119
#define M_BOTTOM 219

void Exit(); //Exit program
void Start(); //Start program
void About(); // about program
int InputMenu(char *Items[], int N); //general menu
void DrawMenu(char *Items[], int N, int choice);
void calendar(int year);
void printMonth(int x, int y, int mon, int yr);
int what_day ();
int printYear(int yr);

struct struct_date
{
    char day;
    char month;
    short year;
};

void main(void)
{
    int dr=DETECT, mod; // vybrat' BGI-drajver i graficheskij rezhim
    initgraph(&dr,&mod,""); // inicializacija grafiki
    setbkcolor(WHITE);
    int b = 1;
    char *Items[]={"About", "Start", "Exit"};
    int choice, N = 3;
    do
    {
        choice = InputMenu(Items, N);
        switch(choice)
        {
            case -1:
            case 2: b = 0; break;
            case 0: About(); break;
            case 1: Start(); break;
        }
    }while(b);
    //getch();
    closegraph();
}

int InputMenu(char *Items[], int N)
{
    int choice=0, Done=0; // ⥪гйЁ© ўлЎ®а, ЇаЁ§­ Є § ўҐа襭Ёп ўлЎ®а 
    do
    {
        DrawMenu(Items, N, choice);
        int key=GetKey(); // бзЁвлў Ґ¬ Є« ўЁиг
        switch(key) // ®Ўа Ў влў Ґ¬ ҐҐ
        {
            case kbUp: if(choice>0) choice--; else choice=N-1; break;
            case kbDown: if(choice<N-1) choice++; else choice=0; break;
            case kbEsc: choice=-1; // ЇаЁ§­ Є ®вЄ §  Ё ЇҐаҐ©вЁ ¤ «миҐ
            case kbEnter: Done=1; break;
        }
    }
    while(!Done);
    return choice;
}

void DrawMenu(char *Items[], int N, int active)
{
    setcolor(RED);
    rectangle(M_LEFT, M_TOP, M_RIGHT, M_BOTTOM);
    setfillstyle(SOLID_FILL, BLUE);
    bar(M_LEFT+1, M_TOP+1, M_RIGHT-1, M_BOTTOM-1);
    settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 2);
    settextjustify(LEFT_TEXT, LEFT_TEXT);
    int y;
    int x=(M_RIGHT-M_LEFT)/4;
    int dy=(M_BOTTOM-M_TOP)/(N+1);
    int dx=(M_RIGHT-M_LEFT)/4;
    for(int i=0; i<N; i++) // ўлўҐбвЁ Їг­Євл ¬Ґ­о
    {
        y=M_TOP+(i+1)*dy;
        if(i==active)
        {
            setcolor(WHITE);
        }
        else setcolor(YELLOW);
        outtextxy( x, y, Items[i]);
    }
}

/////////////Users Functions/////
void About()
{
    setcolor(BLUE);
    settextstyle(SMALL_FONT, HORIZ_DIR, 5);
    outtextxy(300, 239, "Course project <<Calendar>>");
    outtextxy(300, 259, "Completed: Denisenkov Maxim");
    outtextxy(320, 279, "Year 2010");
    getch();
    setfillstyle(SOLID_FILL, WHITE);
    bar(300, 220, 640, 480);
}

void calendar(int year)
{
char *syear;
itoa(year, syear, 10);
    outtextxy(5, 25, "Year:");
    outtextxy(75, 25, syear);
    settextstyle(SMALL_FONT, HORIZ_DIR, 5);
 char *mon[12]={"January", "February", "March", "April", "May", "June",
                                "July", "August", "September", "October", "November", "December"};
 char *wk[7] = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"};
 unsigned days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
 int i;
 int ix, iy=15;
 for (i=0; i<12; i++)
 {
    ix = M_RIGHT + 25;
    setcolor(BLUE);
    outtextxy(ix, iy, mon[i++]);
    int dy=10;
    int i1;
    for(i1=0; i1<7; i1++)
    {
     outtextxy(ix-15, iy+dy, wk[i1]);
     dy=dy+15;
    }
    dy=10;
    for(i1=0; i1<7; i1++)
    {
        outtextxy(ix+170-15, iy+dy, wk[i1]);
        dy=dy+15;
    }
    outtextxy(ix+170, iy, mon[i++]);
    dy=10;
    for(i1=0; i1<7;i1++)
    {
        outtextxy(ix+320-15, iy+dy, wk[i1]);
        dy=dy+15;
    }
    outtextxy(ix+320, iy, mon[i]);
    iy=iy+115;
 }
///‘®Ўб⢥­­® б ¬ Є «Ґ­¤ ам

}

void printMonth(int x, int y, int mon, int yr)
{

}
/*int what_day()
{
    int a = (14 - date->month) / 12;
    int y = date->year - a;
    int m = date->month + 12 * a - 2;
    return  (7000 + (date->day + y + y / 4 - y / 100 + y 0 400 + (31 *m) / 12)) % 7;
} */
void Start()
{
 int yr;
 int year = printYear(yr);
 calendar(year);
}

int printYear(int yr)
{
    {
        gotoxy(35, 12);
        printf("Input year: ");
        scanf("%d", &yr);
    }while((yr<1) &&  (yr>9999));
 return yr;
}

PM MAIL WWW ICQ   Вверх
masime
Дата 26.1.2010, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.1.2010

Репутация: нет
Всего: нет



Вопрос решен, но только на половину. Теперь программа работает с "ошибкой процессора" и я не могу понять где. Есть подозрение, что вылетает из-за выхода за границы массива, но я не знаю где. Помогите, пожалуйста. Вот мой код:
Код

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include "stdio.h"
#include <math.h>
#include <dos.h>
#include "keyboard.h"
#include <alloc.h>

#define M_LEFT 2
#define M_RIGHT 159
#define M_TOP 119
#define M_BOTTOM 219

void Exit(); //Exit program
void Start(); //Start program
void About(); // about program
int InputMenu(char *Items[], int N); //general menu
void DrawMenu(char *Items[], int N, int choice);
void calendar(int year);
void printMonth(int x, int y, int mon, int yr);
int what_day (int month, int year);
int printYear(int yr);

void main(void)
{
    int dr=DETECT, mod; // vybrat' BGI-drajver i graficheskij rezhim
    initgraph(&dr,&mod,""); // inicializacija grafiki
    setbkcolor(WHITE);
    int b = 1;
    char *Items[]={"About", "Start", "Exit"};
    int choice, N = 3;
    
    do
    {
        choice = InputMenu(Items, N);
        switch(choice)
        {
            case -1:
            case 2: b = 0; break;
            case 0: About(); break;
            case 1: Start(); break;
        }
    }while(b);
    //getch();
    closegraph();
}

int InputMenu(char *Items[], int N)
{
    int choice=0, Done=0; // текущий выбор, признак завершения выбора
    do
    {
        DrawMenu(Items, N, choice);
        int key=GetKey(); // считываем клавишу
        switch(key) // обрабатываем ее
        {
            case kbUp: if(choice>0) choice--; else choice=N-1; break;
            case kbDown: if(choice<N-1) choice++; else choice=0; break;
            case kbEsc: choice=-1; // признак отказа и перейти дальше
            case kbEnter: Done=1; break;
        }
    }
    while(!Done);
    return choice;
}

void DrawMenu(char *Items[], int N, int active)
{
    setcolor(RED);
    rectangle(M_LEFT, M_TOP, M_RIGHT, M_BOTTOM);
    setfillstyle(SOLID_FILL, BLUE);
    bar(M_LEFT+1, M_TOP+1, M_RIGHT-1, M_BOTTOM-1);
    settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 2);
    settextjustify(LEFT_TEXT, LEFT_TEXT);
    int y;
    int x=(M_RIGHT-M_LEFT)/4;
    int dy=(M_BOTTOM-M_TOP)/(N+1);
    int dx=(M_RIGHT-M_LEFT)/4;
    for(int i=0; i<N; i++) // вывести пункты меню
    {
        y=M_TOP+(i+1)*dy;
        if(i==active)
        {
            setcolor(WHITE);
        }
        else setcolor(YELLOW);
        outtextxy( x, y, Items[i]);
    }
}

/////////////Users Functions/////
void About()
{
    setcolor(BLUE);
    settextstyle(SMALL_FONT, HORIZ_DIR, 5);
    outtextxy(300, 239, "Course project <<Calendar>>");
    outtextxy(300, 259, "Completed: Denisenkov Maxim");
    outtextxy(320, 279, "Year 2010");
    getch();
    setfillstyle(SOLID_FILL, WHITE);
    bar(300, 220, 640, 480);
}

void calendar(int year)
{
char *syear;
itoa(year, syear, 10);
    outtextxy(5, 25, "Year:");
    outtextxy(75, 25, syear);
    settextstyle(SMALL_FONT, HORIZ_DIR, 5);
 char *mon[12]={"January", "February", "March", "April", "May", "June",
                                "July", "August", "September", "October", "November", "December"};
 char *wk[7] = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"};
 
 int i;
 int ix, iy=12;
 for (i=0; i<12; i++)
 {
    ix = M_RIGHT + 25;
    setcolor(BLUE);
    outtextxy(ix, iy-3, mon[i++]);
    int dy=10;
    int i1;
    for(i1=0; i1<7; i1++)
    {
     outtextxy(ix-15, iy+dy, wk[i1]);
     dy=dy+15;
    }
    printMonth(ix, iy, i, year);
    dy=10;
    for(i1=0; i1<7; i1++)
    {
        outtextxy(ix+170-15, iy+dy, wk[i1]);
        dy=dy+15;
    }
    outtextxy(ix+170, iy-3, mon[i++]);
    printMonth(ix+170, iy, i, year);
    dy=10;
    for(i1=0; i1<7;i1++)
    {
        outtextxy(ix+320-15, iy+dy, wk[i1]);
        dy=dy+15;
    }
    outtextxy(ix+320, iy-3, mon[i]);
    printMonth(ix+320, iy, i+1, year);
    iy=iy+120;
 }
///Собственно сам календарь

}

void printMonth(int x, int y, int mon, int yr)
{
    settextstyle(SMALL_FONT, HORIZ_DIR, 5);
    setcolor(LIGHTGRAY);
    unsigned days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int months[7][5];
    int count=1;
    char *smon;
    //Proverit perviy den nedeli mesyaca

    switch (what_day(mon, yr))
    {
        case 1: count=1; break; //Ponedelnik
        case 2: count=0; break; //Vtornik
        case 3: count=-1; break; //Sreda
        case 4: count=-2; break; //Chetverg
        case 5: count=-3; break; //Pyatnica
        case 6: count=-4; break; //Subbota
        case 0: count=-5; break; //Voskresenie
    }

    for (int i=0; i<5; i++)
    {
        for (int i1=0; i1<7; i1++)
        {
            if(count > days[mon])
            {
                months[i1][i] = 0;
            }
            else
            {
                months[i1][i] = count++;
            }
        }
    }
    int dx=5;
    for (i=0; i<5; i++)
    {
    int dy=10;
        for(int i1=0; i1<7; i1++)
        {
            if (months[i1][i] < 1)
            {
                outtextxy(x+dx, y+dy, "0");
            }
            else
            {
                itoa(months[i1][i], smon, 10);
                outtextxy(x+dx, y+dy, smon);
            }
            dy=dy+15;
        }
        if (i == 0)
        {
            dx=dx+15;
        }
        else
        {
            dx=dx+20;
        }
    }
    setcolor(BLUE);
}

int what_day(int month, int year)
{
    int a = (14 - month) / 12;
    int y = year - a;
    int m = month + 12 * a - 2;
    return  (7000 + (1 + y + y / 4 - y / 100 + y / 400 + (31 *m) / 12)) % 7;
}
void Start()
{
 int yr;
 int year = printYear(yr);
 calendar(year);
}

int printYear(int yr)
{
    do
    {
        setfillstyle(SOLID_FILL, WHITE);
        clrscr();
        bar(0, 0, 640, 480);
        gotoxy(35, 12);
        printf("Input year: ");
        scanf("%d", &yr);
    }while(yr < 1 &&  yr > 9999);
    clrscr();
    bar(0, 0, 640, 480);

 return yr;
}

PM MAIL WWW ICQ   Вверх
t_gran
Дата 27.1.2010, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Вы бы лучше ошибку написали, а то что ошибка препроцессора это и так понятно. Здесь телепатов нет. Но пару ошибок конечно видно не вооружённым глазом: строчки 107 и 160. Тут вы объявляете указатель, но даже и не собираетесь выделять память, а это грубейшая ошибка, о которой компилятор вам и не сообщит. А лучше задайте размер, но такой, чтобы хватило. Т.е. char *syear на char syear[10] и т.п.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
masime
Дата 27.1.2010, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.1.2010

Репутация: нет
Всего: нет



Цитата(t_gran @ 27.1.2010,  05:20)
Вы бы лучше ошибку написали, а то что ошибка препроцессора это и так понятно. Здесь телепатов нет. Но пару ошибок конечно видно не вооружённым глазом: строчки 107 и 160. Тут вы объявляете указатель, но даже и не собираетесь выделять память, а это грубейшая ошибка, о которой компилятор вам и не сообщит. А лучше задайте размер, но такой, чтобы хватило. Т.е. char *syear на char syear[10] и т.п.

Спасибо вам большое, хотя вы сказали, что и не телепат, но все указали верно, и программа теперь работает  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.