Функции работаты с массивом структур или с отдельной структурой через указатели - 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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д