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

Тема в разделе "Общие вопросы по С и С++", создана пользователем xdrr, 1 дек 2007.

Статус темы:
Закрыта.
  1. xdrr

    xdrr Гость

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

    Имееться листинг: основная программа 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


    Спасибо!
     

    Вложения:

    • GRAPH.C
      Размер файла:
      6,5 КБ
      Просмотров:
      50
    • GRAPH.H
      Размер файла:
      909 байт
      Просмотров:
      38
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей