На этом шаге мы рассмотрим использование такой функции.
Изменим программу предыдущего шага так, чтобы функция возвращала вместо индекса массива указатель на структуру, в которой найдено или не найдено данное слово.
// 64_1.cpp: главный файл проекта. #include "stdafx.h" #include <clocale> //обязательно для функции setlocale() #include <stdio.h> //for getchar(),putchar() #include <conio.h> #include <stdlib.h> //for atoi() #include <string.h> #define eof -1 #define MAXLINE 1000 using namespace System; //--- Ввод строки с клавиатуры --- int getline(char s[], int lim) { int c,i; for(i=0; i<lim-1 && (c=getchar()) != eof && c != '\n'; i++) s[i] = c; s[i] = '\0'; i++; //для учета количества return i; } struct key { char* keyword; int keycount; } tab[] = {"break", 0, "case", 0, "char", 0, "continue", 0, "end", 0 },*bbb; key* BinaryInStruc(char* word, key tab[], int n) //Ищет в массиве структур слово, находящееся в word. //n - размерность массива, которая должна быть задана не больше, //чем количество инициализированных элементов массива. //Возвращает указатель на структуру типа key, в которой находится //слово, заданное в word, либо возвращает NULL (сигнал того, что //заданное слово в массиве структур не обнаружено) { int cond; key* low = &tab[0]; //здесь low и high - это указатели на key* high = &tab[n-1];//первый и последний элементы таблицы key* mid; //указатель на средний элемент таблицы while(low <= high) //указатели можно сравнивать { mid = low + (high - low)/2; //разность между указателями - это число элементов массива, //которое можно делить, а поскольку операция деления даст //целое число, то его можно прибавить к указателю low if ( (cond=strcmp(word,mid->keyword) ) < 0) { high = mid - 1; //от указателя можно вычесть целое //число, в результате получим //указатель на предыдущий элемент continue; } if(cond > 0) { low = mid + 1; continue; } return mid; //возврат указателя на найденный элемент таблицы, //т. е. на структуру } //while return NULL; //не найдено } void main() { setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы char s[MAXLINE]; int c; do { printf("Задайте новую строку >"); getline(s, MAXLINE); bbb = BinaryInStruc(s,tab,5); //bbb объявлен как указатель на структуру типа key if ( bbb != NULL ) printf("Строка найдена = %s\n",bbb->keyword); else printf("Строка не найдена\n"); } while( (c=getchar() ) != eof); }
Пояснения к этой программе даны в ее тексте. Результат работы совпадает с результатом работы программы из предыдущего шага и показан на рисунке 1.
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим программу упрощенного расчета заработной платы одному работнику.