Программы со структурами. Функция возвращает указатель на структуру

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

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

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий