keypad(stdscr, FALSE);
nocbreak();
echo();
if (key == 'q') selected = 'q';
return(selected);
}
2. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ Π΄Π²Π΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ clear_all_screen ΠΈ draw_menu Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ getchoice. ΠΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ draw_menu:
void draw_menu(char* options[], int current_highlight, int start_row, int start_col) {
int current_row = 0;
char **option_ptr;
char *txt_ptr;
option_ptr = options;
while (*option_ptr) {
if (current_row == current_highlight) attron(A_STANDOUT);
txt_ptr = options[current_row];
txt_ptr++;
mvprintw(start_row + current_row, start_col, "%s", txt_ptr);
if (current_row == current_highlight) attroff(A_STANDOUT);
current_row++;
option_ptr++;
}
mvprintw(start_row + current_row + 3, start_col,
"Move highlight then press Return ");
refresh();
}
3. ΠΠ°Π»Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ clear_all_screen, ΠΊΠΎΡΠΎΡΠ°Ρ, ΠΊΠ°ΠΊ Π½ΠΈ ΡΡΡΠ°Π½Π½ΠΎ, ΠΎΡΠΈΡΠ°Π΅Ρ ΡΠΊΡΠ°Π½ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ. ΠΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊ Π²ΡΠ±ΡΠ°Π½, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅:
void clear all_screen() {
clear();
mvprintw(2, 20, "%s", "CD Database Application");
if (current_cd[0]) {
mvprintw(ERROR_LINE, 0, "Current CD: %s: %s\n", current_cat, current_cd);
}
refresh();
}
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΎΠΏΠΈΡΠ°Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠΎΠ². Π€ΡΠ½ΠΊΡΠΈΠΈ add_record, update_cd ΠΈ remove_cd Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ main.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ1. ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ .
void add_record {
char catalog_number[MAX_STRING];
char cd_title[MAX_STRING];
char cd_type[MAX_STRING];
char cd_artist[MAX_STRING];
char cd_entry[MAX_STRING];
int screenrow = MESSAGE_LINE;
int screencol = 10;
clear_all_screen();
mvprintw(screenrow, screencol, "Enter new CD details");
screenrow += 2;
mvprintw(screenrow, screencol, "Catalog Number: " );
get_string(catalog_number);
screenrow++;
mvprintw(screenrow, screencol, " CD Title: ");
get_string(cd_title);
screenrow++;
mvprintw(screenrow, screencol, " CD Type: ");
get_string(cd_type);
screenrow++;
mvprintw(screenrow, screencol, " Artist: ");
get_string(cd_artist);
screenrow++;
mvprintw(PROMPT_LINE-2, 5, "About to add this new entry:");
sprintf(cd_entry, "%s, %s, %s, %s",
catalog_number, cd_title, cd_type, cd_artist);
mvprintw(PROMPT_LINE, 5, "%s", cd_entry);
refresh();
move(PROMPT_LINE, 0);
if (get_confirm()) {
insert_title(cd_entry);
strcpy(current_cd, cd_title);
strcpy(current_cat, catalog_number);
}
}
2. Π€ΡΠ½ΠΊΡΠΈΡ get_string ΠΏΡΠΈΠ³Π»Π°ΡΠ°Π΅Ρ ΠΊ Π²Π²ΠΎΠ΄Ρ ΠΈ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΡΡΠΎΠΊΡ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠΊΡΠ°Π½Π°. ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΄Π°Π»ΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ Π½ΠΎΠ²ΡΡ ΠΏΡΡΡΡΡ ΡΡΡΠΎΠΊΡ:
void get_string(char* string) {
int len;
wgetnstr(stdscr, string, MAX_STRING);
len = strlen(string);
if (len > 0 && string[len - 1] == '\n') string[len - 1] = '\0';
}
3. Π€ΡΠ½ΠΊΡΠΈΡ get_confirm Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅. ΠΠ½Π° ΡΠΈΡΠ°Π΅Ρ Π²Π²Π΅Π΄Π΅Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΡΡΠΎΠΊΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» β Y ΠΈΠ»ΠΈ Ρ. ΠΡΠ»ΠΈ ΠΎΠ½Π° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ», ΡΠΎ Π½Π΅ Π΄Π°Π΅Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ.
int get_confirm() {
int confirmed = 0;
char first_char;
mvprintw(Q_LINE, 5, "Are you sure? ");
clrtoeol();
refresh();
cbreak();
first_char = getch();
if (first_char == 'Y' || first_char == 'y') {
confirmed = 1;
}
nocbreak();
if (!confirmed) {
mvprintw(Q_LINE, 1, " Cancelled");
clrtoeol();
refresh();
sleep(1);
}
return confirmed;
}
4. ΠΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ insert_title. ΠΠ½Π° Π²ΡΡΠ°Π²Π»ΡΠ΅Ρ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠΎΠ² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΡΡΡΠΎΠΊΡ Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ Π² ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²:
void insert_title(char* cdtitle) {
FILE *fp = fopen(title_file, "a");
if (!fp) {
mvprintw(ERROR_LINE, 0, "cannot open CD titles database");
} else {
fprintf(fp, "%s\n", cdtitle);
fclose(fp);
}
}
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ1. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ main. Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΈΠ· Π½ΠΈΡ β ΡΡΠ½ΠΊΡΠΈΡ update_cd. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠ±Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΡΠ°ΠΌΠΊΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Ρ ΠΏΡΠΎΠΊΡΡΡΠΊΠΎΠΉ ΠΈ Π½ΡΠΆΠ΄Π°Π΅ΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ list_tracks.
#define BOXED_LINES 11
#define BOXED_ROWS 60
#define BOX_LINE_POS 8
#define BOX_ROW_POS 2
2. Π€ΡΠ½ΠΊΡΠΈΡ update_cd ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°Π½ΠΎΠ²ΠΎ Π²Π²Π΅ΡΡΠΈ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ Π΄ΠΎΡΠΎΠΆΠΊΠ°Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ°. Π£Π΄Π°Π»ΠΈΠ² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΎ Π΄ΠΎΡΠΎΠΆΠΊΠ°Ρ , ΠΎΠ½Π° ΠΏΡΠΈΠ³Π»Π°ΡΠ°Π΅Ρ Π²Π²Π΅ΡΡΠΈ Π½ΠΎΠ²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
void update_cd() {
FILE *tracks_fp;
char track_name[MAX_STRING];
int len;
int track = 1;
int screen_line = 1;
WINDOW *box_window_ptr;
WINDOW *sub_window_ptr;
clear_all_screen();
mvprintw(PROMPT_LINE, 0, "Re-entering tracks for CD. ");
if (!get_confirm())
return;
move(PROMP_TLINE, 0);
clrtoeol();
remove_tracks();
mvprintw(MESSAGE_LINE, 0, "Enter a blank line to finish");
tracks_fp = fopen(tracks_file, "a");
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠΈΡΡΠΈΠ½Π³ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅ΡΠ΅Π· ΠΌΠΈΠ½ΡΡΡ; ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΡΠ°ΡΠΊΡΡ ΠΏΠ°ΡΠ·Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π°ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Π²ΠΎΠ΄ Π΄Π°Π½Π½ΡΡ Π² ΠΎΠ±ΡΠ°ΠΌΠ»Π΅Π½Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Ρ ΠΏΡΠΎΠΊΡΡΡΠΊΠΎΠΉ. Π₯ΠΈΡΡΠΎΡΡΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΌΠΊΠΈ ΠΏΠΎ Π΅Π³ΠΎ ΠΊΡΠ°Ρ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π²Π½ΡΡΡΠΈ ΡΡΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Ρ ΠΏΡΠΎΠΊΡΡΡΠΊΠΎΠΉ.
box_window_ptr = subwin(stdscr, BOXED_LINES + 2, BOXED_ROWS + 2,
BOX_LINE_POS - 1, BOX_ROW_POS - 1);
if (!box_window_ptr) return;
box(box_window_ptr, ACS_VLINE, ACS_HLINE);
sub_window_ptr = subwin(stdscr, BOXED_LINES, BOXED_ROWS,
BOX_LINE_POS, BOX_ROW_POS);
if (!sub_window_ptr) return;
scrollok(sub_window_ptr, TRUE);
werase(sub_window_ptr);
touchwin(stdscr);
do {
mvwprintw(sub_window_ptr, screen_line++, BOX_ROW_POS + 2,
"Track %d: ", track);
clrtoeol();
refresh();
wgetnstr(sub_window_ptr, track_name, MAX_STRING);
len = strlen(track_name);
if (len > 0 && track_name[len - 1] = '\n')
track_name[len - 1] = '\0';
if (*track_name)
fprintf(tracks_fp, "%s, %d, %s\n", current_cat, track, track_name);
track++;
if (screen_line > BOXED__LINES - 1) {
/* Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ°ΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΡ */
scroll(sub_window_ptr);
screen_line--;
}
} while (*track_name);
delwin(sub_window_ptr);
fclose(tracks_fp);
}
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ1. remove_cd β ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ main.
void remove_cd() {
FILE *titles_fp, *temp_fp;
char entry[MAX_ENTRY];
int cat_length;
if (current_cd[0] == '\0') return;
clear_all_screen();
mvprintw(PROMPT_LINE, 0, "About to remove CD %s: %s. ", current_cat, current_cd);
if (!get_confirm())
return;
cat_length = strlen(current_cat);
/* Π€Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ Π΄Π°Π½Π½ΡΠΉ CD */
titles_fp = fopen(title_file, "r");
temp_fp = fopen(temp_flie, "w");
while(fgets(entry, MAX_ENTRY, titles_fp)) {
/* Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π΅ΡΠ»ΠΈ Π½Π΅
Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ */
if (strncmp(current_cat, entry, cat_length) != 0)
fputs(entry, temp_fp);
}
fclose(titles_fp);
fclose(temp_fp);
/* Π£Π΄Π°Π»ΡΠ΅Ρ ΡΠ°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» */
unlink(title_file);
rename(temp_file, title_file);
/* Π’Π΅ΠΏΠ΅ΡΡ Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π΄Π»Ρ ΡΠ°ΠΉΠ»Π° Π΄ΠΎΡΠΎΠΆΠ΅ΠΊ */
remove_tracks();
/* Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ 'None' Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ CD */
current_cd[0] = '\0';
}
2. Π’Π΅ΠΏΠ΅ΡΡ Π²Π°ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ΅Π½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ remove_tracks, ΡΠ΄Π°Π»ΡΡΡΠ΅ΠΉ Π΄ΠΎΡΠΎΠΆΠΊΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ°. ΠΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π²ΡΠΌΡ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ β update_cd ΠΈ remove_cd.
void remove_tracks() {
FILE *tracks_fp, *temp_fp;
char entry[MAX_ENTRY];
int cat_length;
if (current_cd[0] == '\0') return;
cat_length = strlen(current_cat);
tracks_fp = fopen(tracks_file, "r");
if (tracks_fp == (FILE *)NULL) return;
temp_fp = fopen(temp_file, "w");
while (fgets(entry, MAX_ENTRY, tracks_fp)) {
/* Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π΅ΡΠ»ΠΈ Π½Π΅
Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ */
if (strncmp(current_cat, entry, cat_length) != 0)