создать недостающую функцию. лаба по ООП.

  • Автор темы xdrr
  • Дата начала
Статус
Закрыто для дальнейших ответов.
X

xdrr

#1
Господа, к сожалению не силён в С.

Имееться листинг: основная программа graph.c и хедер graph.h

/*****************
Файл GRAPH.C
******************/

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include "graph.h"

/*================== Константы и макроопределения ==============*/

/* Коды завершения программы */
#define NO_ERROR 0
#define ERROR_INCORRECT_ARGUMENTS 1
#define ERROR_GRAPHICS 2
#define ERROR_READING_FILE 3
#define ERROR_CODES 4

/*=================== Прототипы функций ========================*/

int InitGraphics(void);
void Exit(unsigned int uErrorCode);
GraphObject* CreateNewObject(const char *cpObjDescr);
int CreateObjects(const char* cpFileName, ObjectList* pList);
void DrawObjects(const ObjectList* pList);
void DeleteObjects(ObjectList* pList);
void DrawRectangle(const GraphObject* pObj);
void DrawCircle(const GraphObject* pObj);

/*==================== Глобальные переменные ===================*/

/* Сообщения, выводимые на экран при завершении программы */
char *g_cpErrorMessage[ERROR_CODES+1] =
{
"Программа завершилась успешно.",
"Неправильное количество параметров командной строки.\n"
"Запуск программы: GRAPH.EXE <имя_файла>.",
"Ошибка при инициализации графического режима",
"Ошибка при чтении параметров графических объектов.",
"Неизвестная ошибка."
};

/*========================== Функции ===========================*/

int main(int argc, char** argv)
{
ObjectList sList = {NULL, NULL}; /* инициализация структуры sList */

if (argc != 2)
Exit(ERROR_INCORRECT_ARGUMENTS);

if (!CreateObjects(argv[1], &sList))
Exit(ERROR_READING_FILE);

if (InitGraphics() != grOk)
Exit(ERROR_GRAPHICS);

DrawObjects(&sList);

getchar(); /* ожидание нажатия клавиши Enter */
closegraph(); /* возврат в текстовый режим */

DeleteObjects(&sList);

Exit(NO_ERROR);
return NO_ERROR;
} /* main() */
/*--------------------------------------------------------------*/
/* Функция InitGraphics инициализирует графический режим.
Параметры: нет.
Возвращаемое значение: код ошибки или grOk в случае успеха. */
int InitGraphics(void)
{
int iGraphDriver = DETECT, iGraphMode;

initgraph(&iGraphDriver, &iGraphMode, "");
return graphresult();
} /* InitGraphics() */
/*--------------------------------------------------------------*/
/* Функция Exit выводит на экран сообщение и завершает работу
программы.
Параметры: uErrorCode - код ошибки.
Возвращаемое значение: нет. */
void Exit(unsigned int uErrorCode)
{
if (uErrorCode > ERROR_CODES-1)
uErrorCode = ERROR_CODES;

printf("\n%s\n", g_cpErrorMessage[uErrorCode]);
exit(uErrorCode);
} /* ErrorExit() */
/*--------------------------------------------------------------*/
/* Функция CreateNewObject выделяет память для нового графического
объекта и заполняет выделенную структуру информацией из текстовой
строки.
Параметры: cpObjDescr - описание параметров графического объекта
в виде текстовой строки.
Возвращаемое значение: указатель на созданный графический объект
или NULL в случае ошибки. */
GraphObject* CreateNewObject(const char *cpObjDescr)
{
/* Эту функцию нужно реализовать! */
return NULL;
} /* CreateNewObject() */
/*--------------------------------------------------------------*/
/* Функция CreateObjects считывает информацию о графических
объектах из файла и помещает ее в список.
Параметры: cpFileName - имя файла,
pList - указатель на список графических объектов.
Возвращаемое значение: код ошибки. */
int CreateObjects(const char* cpFileName, ObjectList* pList)
{
#define MAX_OBJ_DESCR_LENGTH 80
int iResult = 0;
FILE *fp;
char *cpObjDescr;
GraphObject *pObj;

cpObjDescr = malloc(MAX_OBJ_DESCR_LENGTH);

fp = fopen(cpFileName, "rt");
if (fp != NULL) /* файл открыт успешно */
{
/* считывание строк из файла и заполнение списка граф. объектов */
while ( fgets(cpObjDescr, MAX_OBJ_DESCR_LENGTH, fp) )
{
pObj = CreateNewObject(cpObjDescr);
if (pObj != NULL)
{
iResult = 1;
if (pList->pFirst == NULL)
pList->pFirst = pObj;
if (pList->pLast != NULL)
pList->pLast->pNext = pObj;
pList->pLast = pObj;
}
} /* while */
fclose(fp);
} /* if (fp != NULL) */
free(cpObjDescr);
return iResult;
} /* CreateObjects() */
/*--------------------------------------------------------------*/
/* Функция DrawObjects отображает графические объекты на экране.
Параметры: pList - указатель на список графических объектов.
Возвращаемое значение: нет. */
void DrawObjects(const ObjectList* pList)
{
GraphObject *pCurrentObj = pList->pFirst;
while (pCurrentObj != NULL)
{
if (pCurrentObj->draw != NULL)
pCurrentObj->draw(pCurrentObj);
pCurrentObj = pCurrentObj->pNext;
}
} /* DrawObjects() */
/*--------------------------------------------------------------*/
/* Функция DeleteObjects освобождает память, занимаемую
графическими объектами.
Параметры: pList - указатель на список графических объектов.
Возвращаемое значение: нет. */
void DeleteObjects(ObjectList* pList)
{
GraphObject *pCurrentObj = pList->pFirst, *pNext;
while (pCurrentObj != NULL)
{
pNext = pCurrentObj->pNext;
free(pCurrentObj);
pCurrentObj = pNext;
}
pList->pFirst = NULL;
pList->pLast = NULL;
} /* DeleteObjects() */
/*--------------------------------------------------------------*/
/* Функция DrawRectangle отображает на экране прямоугольник.
Параметры: pObj - указатель на структуру параметров
прямоугольника.
Возвращаемое значение: нет. */
void DrawRectangle(const GraphObject* pObj)
{
if (pObj->visible)
{
setfillstyle(SOLID_FILL, pObj->colour);
bar(pObj->x, pObj->y, pObj->x+pObj->width, pObj->y+pObj->height);
}
} /* DrawRectangle() */
//--------------------------------------------------------------
/* Функция DrawCircle отображает на экране круг.
Параметры: pObj - указатель на структуру параметров круга.
Возвращаемое значение: нет. */
void DrawCircle(const GraphObject* pObj)
{
int iRadius = min(pObj->height, pObj->width) / 2;

if (pObj->visible)
{
setfillstyle(SOLID_FILL, pObj->colour);
setcolor(pObj->colour);
fillellipse(pObj->x+iRadius, pObj->y+iRadius, iRadius, iRadius);
}
} /* DrawCircle() */
/*--------------------------------------------------------------*/
/* Конец файла GRAPH.C */


Заголовочный файл:

/***************
Файл GRAPH.H
****************/

/* для предотвращения повторного включения файла */
#ifndef __GRAPH_H
#define __GRAPH_H

struct _GraphObject;

/* Тип указателя на функцию, отображающую граф. объект */
typedef void (*DrawFunction)(const struct _GraphObject*);

typedef struct _GraphObject
{
char visible; /* признак видимости (0 - объект невидим) */
int colour; /* цвет графического объекта */
int background; /* цвет фона, на котором изображается объект */
int x, y; /* координаты левого верхнего угла объекта */
int width, height; /* ширина и высота объекта */
DrawFunction draw; /* указатель на функцию, отображающую объект */
struct _GraphObject* pNext; /* указатель на следующий объект в списке */
} GraphObject;

typedef struct _ObjectList
{
GraphObject *pFirst, *pLast;
} ObjectList;

#endif
/* Конец файла GRAPH.H */


В листинге не достаёт функции CreateNewObject
Она - выделяет память для нового графического
объекта и заполняет выделенную структуру информацией из текстовой
строки.
Параметры: cpObjDescr - описание параметров графического объекта
в виде текстовой строки.
Возвращаемое значение: указатель на созданный графический объект
или NULL в случае ошибки.

Помогите дописать её, если структура исходного файла к примеру такая
<тип>/<видимость>/<цвет>/<x>/<y>/<ширина>/<высота>

1 - объект видим
0 - невидим

Содержимое файла:
круг/1/зеленый/10/20/100/100


Спасибо!
 

Вложения

  • 6.5 КБ Просмотры: 50
  • 909 байт Просмотры: 38
Статус
Закрыто для дальнейших ответов.