Новичок
Профиль
Группа: Участник
Сообщений: 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; }
|
|