编写一个存储艺术作品的程序。艺术作品分为三类:Painting、Music和Chamber,Chamber是Music中的一类。要求如下所述。

①每件作品都要标明著者、作品标题、作品诞生年份及其所属分类。
② Painting类要求显示画的宽和高等尺寸信息。
③ Music类要求显示能够代表其内容的关键信息,例如"D Major"。
④ Chamber类要求显示其中包括的演奏人员的数目。


#include<stdio.h>

enum art_class{
    PAINTING,
    MUSIC,
    CHAMBER,
    ART_CLASS_MAX
};

typedef struct art_s{
#define AUTHOR_STR_MAX (20)
#define TITLE_STR_MAX (20)
#define DATE_STR_MAX (50)
#define ARTICLE_DESC_STR_MAX (100)
    char author[AUTHOR_STR_MAX];
    char title[TITLE_STR_MAX];
    char date[DATE_STR_MAX];
    enum art_class class;
    union{
        struct{
            int widgh;
            int height;
        }painting;
        union{
            struct{
                char description[ARTICLE_DESC_STR_MAX];
            }music;
            struct{
                char description[ARTICLE_DESC_STR_MAX];
                int musicians_num;
            }chamber;
        }u;
    }; 
}art_t;

#define get_painting_info(c) (c)->painting
#define get_music_info(c) (c)->u.music
#define get_chamber_info(c) (c)->u.chamber

int main()
{
    art_t art[10];
    
    char *author="夜雨*飘雪"; 
    char *title="No.1";
    char *date = "2021年11月3日";
    char *description = "没谁了";
    
    memcpy(art[0].author,author,strlen(author)+1);
    memcpy(art[0].title,title,strlen(title)+1);
    memcpy(art[0].date,date,strlen(date)+1);
    art[0].class = CHAMBER;
    memcpy(get_chamber_info(&art[0]).description,description,strlen(description)+1);
    get_chamber_info(&art[0]).musicians_num=2;
    
    printf("author is %s\n",art[0].author);
    printf("title is %s\n",art[0].title);
    printf("date is %s\n",art[0].date);
    printf("class is %d\n",art[0].class);
    printf("description is %s\n",get_chamber_info(&art[0]).description);
    printf("musicians_num is %d\n",get_chamber_info(&art[0]).musicians_num);
    
    return 0;
}