Шаг 64.
Microsoft Visual C++ 2010. Язык С/С++. Указатели и структуры данных. Программы со структурами. Функция возвращает указатель на структуру

    На этом шаге мы рассмотрим использование такой функции.

    Изменим программу предыдущего шага так, чтобы функция возвращала вместо индекса массива указатель на структуру, в которой найдено или не найдено данное слово.

// 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. Результат работы приложения

    На следующем шаге мы рассмотрим программу упрощенного расчета заработной платы одному работнику.




Предыдущий шаг Содержание Следующий шаг