Добавление, вставка и удаления элемента структуры - C (СИ)
Формулировка задачи:
добавить операции добавление, вставка и удаления элемента с интерактивного меню
#include <stdlib.h> #include <stdio.h> #include <string.h> #define STR_LEN 64 typedef struct str { char name[STR_LEN]; char exp[STR_LEN]; unsigned long size; int day; int mon; int year; } str_t; int name_c(const void * a, const void * b){ return strcmp(((str_t*)a)->name, ((str_t*)b)->name); } int exp_c(const void * a, const void * b){ return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp); } int size_c(const void * a, const void * b){ return ((str_t*)a)->size - ((str_t*)b)->size; } int day_c(const void * a, const void * b){ return ((str_t*)a)->day - ((str_t*)b)->day; } int mon_c(const void * a, const void * b){ return ((str_t*)a)->mon - ((str_t*)b)->mon; } int year_c(const void * a, const void * b){ return ((str_t*)a)->year - ((str_t*)b)->year; } int name_d(const void * b, const void * a){ return strcmp(((str_t*)a)->name, ((str_t*)b)->name); } int exp_d(const void * b, const void * a){ return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp); } int size_d(const void * b, const void * a){ return ((str_t*)a)->size - ((str_t*)b)->size; } int day_d(const void * b, const void * a){ return ((str_t*)a)->day - ((str_t*)b)->day; } int mon_d(const void * b, const void * a){ return ((str_t*)a)->mon - ((str_t*)b)->mon; } int year_d(const void * b, const void * a){ return ((str_t*)a)->year - ((str_t*)b)->year; } void show(const str_t * arr, size_t cnt){ printf("Name Exp Size Date \n"); while ( cnt-- ){ printf("%-20s%-5s%10u%10i%5i.%i.%i\n", arr->name, arr->exp, arr->size, arr->day, arr->mon, arr->year); ++arr; } } #define NUM_FILES 4 int main(void) { str_t a[NUM_FILES]; int i,s; int j=0; for(i=0; i < NUM_FILES; i++) { printf("file #%i\n", i+1); printf("enter name: "); scanf("%s", &a[i].name); printf("enter expansion: "); scanf("%s", &a[i].exp); printf("enter size: "); scanf("%lu", &a[i].size); printf("date: "); printf("enter day:"); scanf("%i", &a[i].day); printf("enter month:"); scanf("%i", &a[i].mon); printf("enter year:"); scanf("%i", &a[i].year); } printf("\n Unsorted \n"); show(a, NUM_FILES); printf("\n Choose function:\n "); printf("\n 1. To sort by name.\n "); printf("\n 2. To sort by expansion. \n "); printf("\n 3. To sort by size. \n "); printf("\n 4. To sort by date. \n "); printf("\n 5. To sort by name (rev).\n "); printf("\n 6. To sort by expansion (rev). \n "); printf("\n 7. To sort by size (rev). \n "); printf("\n 8. To sort by date (rev). \n "); printf("\n 9. To show common size. \n "); printf("\n 0. To close. \n "); do { scanf("%i", &s); switch(s) { case 1: printf("\n Sorted by name: \n"); qsort(a, NUM_FILES, sizeof(str_t), name_c); show(a, NUM_FILES); break; case 2: printf("\n Sorted by expansion: \n"); qsort(a, NUM_FILES, sizeof(str_t), exp_c); show(a, NUM_FILES); break; case 3: printf("\n Sorted by size: \n"); qsort(a, NUM_FILES, sizeof(str_t), size_c); show(a, NUM_FILES); break; case 4: printf("\n Sorted by date: \n"); qsort(a, NUM_FILES, sizeof(str_t), day_c); qsort(a, NUM_FILES, sizeof(str_t), mon_c); qsort(a, NUM_FILES, sizeof(str_t), year_c); show(a, NUM_FILES); break; case 5: printf("\n Sorted by name (reverse): \n"); qsort(a, NUM_FILES, sizeof(str_t), name_d); show(a, NUM_FILES); break; case 6: printf("\n Sorted by expansion (reverse): \n"); qsort(a, NUM_FILES, sizeof(str_t), exp_d); show(a, NUM_FILES); break; case 7: printf("\n Sorted by size (reverse): \n"); qsort(a, NUM_FILES, sizeof(str_t), size_d); show(a, NUM_FILES); break; case 8: printf("\n Sorted by date (reverse): \n"); qsort(a, NUM_FILES, sizeof(str_t), day_d); qsort(a, NUM_FILES, sizeof(str_t), mon_d); qsort(a, NUM_FILES, sizeof(str_t), year_d); show(a, NUM_FILES); break; case 9: for(i=0; i < NUM_FILES; i++) j=j+a[i].size; printf("common size %i",j); case 0: break; } }while(s != 0); getch(); return 0; }
вот попытка добавления, но ругается на NUM_FILES=NUM_FILES+1;
case 10: NUM_FILES=NUM_FILES+1; printf("file #%i\n", NUM_FILES); printf("enter name: "); scanf("%s", &a[NUM_FILES].name); printf("enter expansion: "); scanf("%s", &a[NUM_FILES].exp); printf("enter size: "); scanf("%lu", &a[NUM_FILES].size); printf("date: "); printf("enter day:"); scanf("%i", &a[NUM_FILES].day); printf("enter month:"); scanf("%i", &a[NUM_FILES].mon); printf("enter year:"); scanf("%i", &a[NUM_FILES].year); break;
Решение задачи: «Добавление, вставка и удаления элемента структуры»
textual
Листинг программы
#ifndef MENU_H #define MENU_H #include <stdio.h> #include <stdlib.h> #include <string.h> void check_ptr(void *ptr); struct MenuNode; typedef void (*item_type)(struct MenuNode *); struct MenuNode { char *title; item_type item; size_t submenus_count; struct MenuNode **submenus; }; struct MenuNode *create_menu_node(const char *title, item_type item); void free_menu_node(struct MenuNode *menu); void free_menu(struct MenuNode *menu); struct MenuNode *add_submenu(struct MenuNode *menu, const char *title, item_type item); void print_menu(struct MenuNode *menu); void menu_handler(struct MenuNode *menu); #endif
Объяснение кода листинга программы
Объяснение кода:
- Включающие директивы:
#include <stdio.h>
- включает функции для работы с файлами, в том числе для отправки сообщений в консоль#include <stdlib.h>
- включает функции для работы с памятью, в том числе для выделения и освобождения памяти#include <string.h>
- включает функции для работы со строками, в том числе для копирования, конкатенации и сравнения строк
- Функции:
check_ptr(void *ptr)
- проверяет, что указатель не равенNULL
, иначе выводит сообщение об ошибке и завершает программуcreate_menu_node(const char *title, item_type item)
- создает новый узел меню с указанным заголовком и элементом менюfree_menu_node(struct MenuNode *menu)
- освобождает память, выделенную под узел менюfree_menu(struct MenuNode *menu)
- освобождает память, выделенную под все узлы меню и их подменюadd_submenu(struct MenuNode *menu, const char *title, item_type item)
- добавляет новое подменю в узел менюprint_menu(struct MenuNode *menu)
- выводит меню на экранmenu_handler(struct MenuNode *menu)
- обрабатывает выбор пользователя из меню
- Типы данных и переменные:
void (*item_type)(struct MenuNode *)
- указатель на функцию, которая будет вызываться при выборе элемента менюstruct MenuNode
- структура, представляющая узел меню, содержащая заголовок, элемент меню и список подменюchar *title
- указатель на строку, содержащую заголовок узла меню или подменюitem_type item
- указатель на функцию, которая будет вызываться при выборе элемента менюsize_t submenus_count
- переменная, содержащая количество подменю в узле менюstruct MenuNode **submenus
- указатель на массив указателей на узлы подменю
- Прототипы функций:
void check_ptr(void *ptr);
struct MenuNode *create_menu_node(const char *title, item_type item);
void free_menu_node(struct MenuNode *menu);
void free_menu(struct MenuNode *menu);
struct MenuNode *add_submenu(struct MenuNode *menu, const char *title, item_type item);
void print_menu(struct MenuNode *menu);
void menu_handler(struct MenuNode *menu);
- Основная функция программы:
- В данном случае, основной функции программы нет, так как код является заголовочным файлом для создания функций и структур в других файлах.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д