Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 70

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

 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)