Функции работаты с массивом структур или с отдельной структурой через указатели - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Я вот переписал код, но прога не работает. Не пойму почему. Помогите, пожалуйста.
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <string.h>
#include <locale.h>
 
#define TRUE 1
#define FALSE 0
#define ESC 27
 
struct date
{
    int d, m, y;
};
 
typedef struct Student
{
    char Name[80];
    struct date start; //дата поступления
    struct date end; //дата отчисления
    int i_isFull; // флаг: 0 - пустой, 1 - содержит данные
}myType;
 
int menu(),
getCleanElem(),
growArray(),
sortByName(const void*, const void*),
sortByStart(const void*, const void*),
sortByEnd(const void*, const void*),
addElement(),
showElement(int),
deleteElement(int),
editElement(int),
cleanElem(int),
gotoxy(int x, int y),
showAll(),
sortSelect();
myType  *createArray();

//-------------------------------------------------------------------------------------------------
char *gcp_lastError = NULL;                                                 // строка сообщений об ошибках
myType *structArray;                                                        // глобальный массив структур
int gi_arrSize;                                                             // и его размер
int gp_sortFuncArr[3];                                                      // массив из трех сортировок
 
int main()
{
    setlocale(LC_ALL, "Russian");
    structArray = createArray();                                            // динамическое выделение памяти для массива
    system("cls");
    while (menu() == TRUE);                                                 // рабочий цикл программы
    free(structArray);                                                      // очистка массива
    return 0;
}
 
myType* createArray()                                                       // возвращает указатель на массив структур
{                                                                           //
    printf("Введите количество элементов массива: ");                       //
    scanf_s("%d", &gi_arrSize);                                             //
    myType *tempPtr;    //
    tempPtr = (myType*)malloc(gi_arrSize * sizeof(myType));                 //
    int i;
    for (i = 0; i<gi_arrSize; i++)                                          // сдвигаем указатель по массиву
    {                                                                       // и присваиваем его элементам
        strcpy(tempPtr->start.d, tempPtr->start.m, tempPtr->start.y, "");
        strcpy(tempPtr->Name, "");
        strcpy(tempPtr->end.d, tempPtr->end.m, tempPtr->end.y, "");
        tempPtr->i_isFull = 0;
        tempPtr++;                                                          // значение эталонной структуры
    }                                                                       // затем сдвигаем указатель structArray
    tempPtr -= i;                                                           // в начало массива
    return tempPtr;                                                         // возвращает указатель на массив структур
}
 
int addElement()                                                           // добавить элемент
{                                                                           //
    editElement(growArray());                                               // редактировать элемент, номер которого
    return 0;
}
 
int showElement(int number)                                             // вывод выбранного элемента
{
    if (number < 0 || number >= gi_arrSize)
    {
        gcp_lastError = "Выход за пределы массива (showElement)";
        return;
    }
    myType *tempPtr = structArray + number;
    printf("|%3d|%20s|%20d|%10d\n",
        number,
        tempPtr->Name,
        tempPtr->start,
        tempPtr->end);
    gcp_lastError = "Ошибок не было (show)";
    return 0;
}
 
int showAll()
{
    int i = 0;
    for (; i<gi_arrSize; i++)
    {
        gotoxy(10, 15 + i);
        showElement(i);
    }
    return 0;
}
 
int editElement(int number)                                                // 
{                                                                           // 
    if (number<0 || number >= gi_arrSize)                                       // 
    {                                                                       // 
        gcp_lastError = "Выход за пределы массива (editElement)";           // 
        return;                                                             // 
    }                                                                       //
    myType *tempPtr = structArray + number;                                   // указатель ориентирую на выбранный элемент структуры
    printf("Введите ФИО: ");                                                // и запрашиваю новые данные полей
    scanf("%s", tempPtr->Name);                                         // 
    printf("Дата поступления: ");                                                   // 
    scanf("%d", tempPtr->start);                                    // 
    printf("Дата отчисления: ");                                                        // 
    scanf("%d", tempPtr->end);                                          // 
                                                                        
    tempPtr->i_isFull = 1;                                                  // 
    gcp_lastError = "Ошибок не было (edit)";                                // 
    return 0;                                                                 // 
}
 
int cleanElem(int number)
{
    if (number<0 || number >= gi_arrSize)                                       // 
    {                                                                       // 
        gcp_lastError = "Выход за пределы массива (clean)";                 // 
        return;                                                             // 
    }                                                                       //
    myType *tempPtr = structArray + number;
    if (tempPtr->i_isFull == 0)
    {
        gcp_lastError = "Элемент пуст (clean)";
        return;
    }
    strcpy(tempPtr->start.d, tempPtr->start.m, tempPtr->start.y, " ");
    strcpy(tempPtr->Name, " ");
    strcpy(tempPtr->end.d, tempPtr->end.m, tempPtr->end.y, " ");
    tempPtr->i_isFull = 0;
    gcp_lastError = "Ошибок не было (clean)";
    return 0;
    return 0;
}
 
int getCleanElem()
{
    int i = 0;
    for (; i<gi_arrSize; i++)
    {
        if (structArray->i_isFull == 0)
        {
            structArray -= i;
            return i;
        }
        structArray++;
    }
    structArray -= i;
    gcp_lastError = "Ошибок не было (getClean)";
    return -1;
}
 
int growArray()                                                             // вызывается при добавлении элемента в массив.
{
    gi_arrSize += 1;                                                        // увеличиваем размер будущего массива. |
    myType *tempPtr = (myType*)malloc((gi_arrSize) * sizeof(myType));           // динамическое выделение памяти        |
    int i = 0;                                                                  // под новый массив размера "size+1".   |
    for (; i<gi_arrSize - 1; i++)                                       // копирование всех                 |
    {                                                                       // элементов исходного массива      |
        *tempPtr++ = *structArray++;                                        // в новый путём сдвига указателей. |
    }                                                                       //
    tempPtr -= i;                                                           // сдвиг в начало массива временного и  |
    structArray -= i;                                                       // основного указателей.                |
    free(structArray);                                                      // освобождение памяти из-под старого массива   |
    structArray = tempPtr;                                                  // и ориентирование указателя на новый          |
    return gi_arrSize - 1;
}
 
int deleteElement(int number)
{
    if (number < 0 || number >= gi_arrSize)
    {
        gcp_lastError = "Выход за пределы массива (deleteElement)";
        return;
    }
    int i = number;
    for (; i<gi_arrSize - 1; i++)
    {
        structArray[i] = structArray[i + 1];
    }
    cleanElem(i);                                                           // очистка последнего элемента после сдвига
    gcp_lastError = "Ошибок не было (delete)";
    return 0;
}
 
int sortSelect()                                                                // сортировка массива по полям
{
    gp_sortFuncArr[0] = sortByName;                                             // заполняю массив сортировок
    gp_sortFuncArr[1] = sortByStart;                                                //
    gp_sortFuncArr[2] = sortByEnd;                                          //
            
    int choice;                                                             //  
    choice = _getch();
    if (choice < '1' || choice > '4')
    {
        gcp_lastError = "Не верный выбор (sortBy)";
        return;
    }
    choice = choice - '0';                                                      // 
    qsort(structArray, gi_arrSize, sizeof(myType), gp_sortFuncArr[choice - 1]); // вызов библиотечной сортировки
    gcp_lastError = "Ошибок не было (sortBy)";                                  // с выбранным полем сортировки
    return 0;
}
 
int sortByName(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return strcmp(one->Name, two->Name);                                    // сравнение двух строк (библ.функция)
}
 
int sortByStart(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return strcmp(one->start.d, two->start.d);                              // сравнение двух строк (библ.функция)
}
 
int sortByEnd(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return strcmp(one->end.d, two->end.d);                      // сравнение двух строк (библ.функция)
}
 
int gotoxy(int xpos, int ypos)
{
    COORD scrn;
    HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
    scrn.X = xpos; scrn.Y = ypos;
    SetConsoleCursorPosition(hOuput, scrn);
    return 0;
}
 
int menu()
{
    system("cls");
    printf("Размер массива: %d\t"
        "Сообщения об ошибках: %s\n", gi_arrSize, gcp_lastError);
    printf("\t1 - добавить строку\n"
        "\t2 - вывод строки\n"
        "\t3 - изменение элемента\n"
        "\t4 - удаление элемента со сдвигом\n"
        "\t5 - очистка элемента\n"
        "\t6 - вывод свободного элемента\n"
        "\t0 - сортировка массива по значениям полей\n"
        "\tESC - выход\n");
    gotoxy(10, 14);
    printf("|  №|        Фамилия И.О.|           Дата поступления|    Дата отчисления");
    showAll();                                                              // вывод всех элементов
    char choice;
    choice = _getch();
    int number,                                                             // номер элемента/"пустого" элемента
        value;
 
    switch (choice)
    {
    case '1':
        addElement();
        break;
    case '2':
        printf("Номер элемента для вывода: ");
        scanf_s("%d", &number);
        if (number < 0 || number >= gi_arrSize)
        {
            gcp_lastError = "Выход за пределы массива (show)";
            break;
        }
        if ((structArray + number)->i_isFull = 0)
        {
            gcp_lastError = "Элемент пуст (show)";
            break;
        }
        system("cls");
        gotoxy(10, 12);
        printf("Содержимое %d-го элемента маcсива: \n", number);
        gotoxy(10, 14);
        printf("|  №|        Фамилия И.О.|           Дата поступления|    Дата отчисления");
        gotoxy(10, 15 + number);
        showElement(number);
        _getch();
        break;
    case '3':
        printf("Номер элемента для изменения: ");
        scanf_s("%d", &number);
        editElement(number);
        break;
    case '4':
        printf("Номер элемента для удаления: ");
        scanf_s("%d", &number);
        deleteElement(number);
        break;
    case '5':
        printf("Номер элемента для очистки: ");
        scanf_s("%d", &number);
        cleanElem(number);
        break;
    case '6':
        number = getCleanElem();                                            // функция вернёт номер пустого
        if (number < 0)                                                     // или -1, если такого нет
        {
            system("cls");
            gotoxy(20, 10);
            printf("Пустых элементов нет!");
            _getch();
            break;
        }
        system("cls");
        gotoxy(35, 12);
        printf("Пустой элемент №: %d", number);
        gotoxy(10, 14);
        printf("|  №|        Фамилия И.О.|           Дата поступления|    Дата отчисления\n");
        gotoxy(10, 15 + number);
        showElement(number);
        _getch();
        break;
    case '0':
        gotoxy(0, 22);
        printf("\tВариант сортировки: \n"
            "\t1 - по фамилии"
            "\t2 - по дате поступления"
            "\t3 - по дате отчисления");
        sortSelect();
        break;
    case ESC:
        return FALSE;
        break;
    }
    return TRUE;
}

Решение задачи: «Функции работаты с массивом структур или с отдельной структурой через указатели»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define N 100
 
void sort(char A[]);
 
void main()
{
    char A[N];
    printf("String: ");
    fgets(A, N, stdin);
    sort(A);
    _getch();
}
 
void sort(char A[])
{
    char *p = A;
    p++;
    if (*(p + 1) == 'a')
    {
        char tmp;
        tmp = *(p + 1);
        *(p + 1) = *(p - 1);
        *(p - 1) = tmp;
        }
    printf("Result: ");
    p++;
    printf("%s", A);
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы