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

    На этом шаге мы рассмотрим программу, возвращающую структуру.

    Ниже приведен пример программы, в которой функция возвращает структуру.

 // 63_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 - размерность массива, которая должна быть задана не больше, 
//чем количество инициализированных элементов массива.
//Возвращает структуру (элемент массива tab[]), в которой находится слово, 
//заданное в word, либо tab[] последнего обработанного индекса 
//(можно было бы возвратить tab[] любого существующего индекса), 
//в котором значение keycount равно -1 (сигнал того, что 
//заданное слово в массиве структур не обнаружено)
{
	int low, high, mid, cond; 
	low=0; high=n-1;
	while(low <= high) {
		mid = (low + high) / 2;
		if ((cond = strcmp(word, tab[mid].keyword)) < 0) 
			high = mid - 1;
		if(cond < 0)
		{
			high = mid - 1; continue;
		}
		if(cond > 0)
		{
			low = mid + 1; continue;
		}
		tab[mid].keycount = 0;
		return tab[mid];	//найдено
	}  //while
	tab[mid].keycount = -1; 
	return tab[mid];   //не найдено
}

void main()
{
	setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами
	                             //для корректного вывода кириллицы
	char s[MAXLINE];
	int c; 
	do
	{
		printf("Задайте новую строку >");
		getline(s, MAXLINE);
		bbb = BinaryInStruc(s,tab,5);
		if ( bbb.keycount!= -1 )
			printf("Строка найдена = %s\n",bbb.keyword); 
		else
			printf("Строка не найдена\n");
	}
	while( (c=getchar() ) != eof);
	//здесь, как и в функции getline(), надо использовать getchar(),a не getch(), 
	//иначе не будет останова на вводе в getline() при повторном обращении
}
Архив проекта можно взять здесь.

    Рассмотрим функцию BinaryInStruc, возвращающую структуру:

  key BinaryInStruc(char *word, key tab[], int n) 

    Сама структура определена до объявления функции: объявлен шаблон key и по этому шаблону задан массив структур tab[] и один экземпляр bbb.

    Массив структур инициализирован: заданы значения только символьных т. к. мы собираемся искать нужную строку, задавая на входе ее образец.

    Массив упорядочен по возрастанию строк, т. к. для поиска будем применять метод деления отрезка пополам. Значение keycount для поиска не используется, а используется только для возвратаa: если не найдена структура, в которой содержится заданное с клавиатуры слово, то возвращается структура, у которой значение keycount будет равно -1.

    В теле функции реализован метод двоичного поиска: концы отрезка, на котором располагаются индексы массива tab[], постоянно находятся в переменных low и high, а средняя точка - в переменной mid. Сравнение значений в word и tab[] осуществляется с помощью уже рассмотренной функции strcmp(word, tab[mid].keyword). Если в средней точке строки в переменной word и в переменной tab[mid] значения keyword совпадают, то возвращается таблица структур в этой точке, иначе возвращается таблица структур в последней средней точке со значением keycount, равным -1.

    В основной программе запрашивается слово, которое вводится функцией getline(), а затем передается вместе с массивом структур (таблицей tab[]) в качестве параметров функции BinaryInStruc, возвращающей структуру, значение которой, в свою очередь, присваивается экземпляру bbb этого же шаблона (как мы видели ранее, эту операцию можно применить к структурам одинаковых шаблонов). Результат работы программы показан на рисунке 1.


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим функцию, взвращающую указатель на структуру.




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