/*只享受折扣的商品结算 *@parm: store商品库存 *@parm: discount_set 购买的折扣商品 *@parm: double_set 购买的多重优惠的商品 *@parm: saveing 节省金额总计 **/ void settle_discount(struct set_t *store, struct set_t *discount_set,\ struct set_t *double_set, float *saveing, float *consume) { struct set_t *discounts; int i; discounts = NULL; if(double_set) { //去除享受多重优惠的商品 discounts = set_minus(discount_set, double_set); } if(discounts) { //去除享受多重优惠的商品 set_map(discounts, settle_discount_print, (void *)store, consume, saveing); set_free(&discounts); }else if(discount_set){ set_map(discount_set, settle_discount_print, (void *)store, consume, saveing); } }
/*只享受买二送一优惠商品结算 *@parm: store商品库存 *@parm: free_one_set 购买的买二送一商品 *@parm: double_set 购买的多重优惠的商品 *@parm: saveing 节省金额总计 **/ void settle_free_one(struct set_t *store, struct set_t *free_one_set,\ struct set_t *double_set, float *saveing,\ float *consume) { struct set_t *free_ones; int i; free_ones = NULL; if(double_set) { //去除享受多重优惠的商品 free_ones = set_minus(free_one_set, double_set); } if(free_ones) { //去除享受多重优惠的商品 set_map(free_ones, settle_free_one_print, (void *)store, consume, saveing); set_free(&free_ones); }else if(free_one_set){ set_map(free_one_set, settle_free_one_print, (void *)store, consume, saveing); } }
static array<tree> merge_springer_author_datas (array<tree> a) { if (N(a) < 2) return a; tree name(CONCAT); int i=0; while (i<N(a) && name == concat()) name= get_author_name (a[i++]); if (i == N(a)) return a; array<tree> same= get_authors_by_name (a, name); array<tree> others= set_minus (a, same); tree datas= same[0]; for (int i=1; i<N(same); i++) for (int j=0; j<N(same[i]); j++) if (!contains (same[i][j], A(datas))) datas << same[i][j]; array<tree> r; r << datas; if (N(others) == 1) r << others; if (N(others) > 1) r << merge_springer_author_datas (others); return r; }
void test_set(void) { int i; void* S = set_create(100, NULL, NULL); fprintf(stdout, "call function : %s\n", __func__); set_object(S); fprintf(stdout, "\ntest function - set_insert ===>\n"); { srand((unsigned int)time(0)); for (i = 0; i < 5; ++i) { double* d = (double*)malloc(sizeof(double)); *d = (i + 1) * rand() % 1000 * 0.456; fprintf(stdout, "\tinsert {object=>0x%p, vlaue=>%.3f}\n", d, *d); set_insert(S, d); } set_object(S); set_for_each(S, set_member_show_double, NULL); set_for_each(S, set_member_destroy, NULL); set_object(S); set_clear(S); } set_object(S); fprintf(stdout, "\ntest function - set_remove ===>\n"); { double* remove_member = NULL; srand((unsigned int)time(0)); for (i = 0; i < 5; ++i) { double* d = (double*)malloc(sizeof(double)); *d = (i + 1) * rand() % 1000 * 0.456; fprintf(stdout, "\tinsert {object=>0x%p, vlaue=>%.3f}\n", d, *d); set_insert(S, d); if (0 == i) remove_member = d; } set_object(S); set_for_each(S, set_member_show_double, NULL); set_remove(S, remove_member); set_object(S); set_for_each(S, set_member_show_double, NULL); set_for_each(S, set_member_destroy, NULL); set_object(S); set_clear(S); } set_object(S); fprintf(stdout, "\ntest function - set_release ===>\n"); set_release(&S); set_object(S); fprintf(stdout, "\n\ntest function - set operations ===>\n"); { void* s = set_create(100, NULL, NULL); void* t = set_create(100, NULL, NULL); void* oper_s; for (i = 0; i < 7; ++i) { double* d = (double*)malloc(sizeof(double)); *d = (i + 1) * (i + 1) * 0.234; fprintf(stdout, "\tinsert s {object=>0x%p, value=>%.3f}\n", d, *d); if (i < 5) set_insert(s, d); set_insert(t, d); } fprintf(stdout, " show 's' set object:\n"); set_object(s); set_for_each(s, set_member_show_double, NULL); fprintf(stdout, " show 't' set object:\n"); set_object(t); set_for_each(t, set_member_show_double, NULL); /* set_union */ fprintf(stdout, " test function - set_union ===>\n"); oper_s = set_union(NULL, t); fprintf(stdout, " s = NULL, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release union(s=NULL,t=t):\n"); set_object(oper_s); /* *** */ oper_s = set_union(s, NULL); fprintf(stdout, " s = s, t = NULL:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release union(s=s,t=NULL):\n"); set_object(oper_s); /* *** */ oper_s = set_union(s, t); fprintf(stdout, " s = s, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release union(s=s,t=t):\n"); set_object(oper_s); /* set_inter */ fprintf(stdout, " test function - set_inter ===>\n"); oper_s = set_inter(NULL, t); fprintf(stdout, " s = NULL, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release inter(s=NULL,t=t):\n"); set_object(oper_s); /* *** */ oper_s = set_inter(s, NULL); fprintf(stdout, " s = s, t = NULL:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release inter(s=s,t=NULL):\n"); set_object(oper_s); /* *** */ oper_s = set_inter(s, t); fprintf(stdout, " s = s, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release inter(s=s,t=t):\n"); set_object(oper_s); /* set_minus */ fprintf(stdout, " test function - set_minus ===>\n"); oper_s = set_minus(NULL, t); fprintf(stdout, " s = NULL, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release minus(s=NULL,t=t):\n"); set_object(oper_s); /* *** */ oper_s = set_minus(s, NULL); fprintf(stdout, " s = s, t = NULL:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release minus(s=s,t=NULL):\n"); set_object(oper_s); /* *** */ oper_s = set_minus(s, t); fprintf(stdout, " s = s, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release minus(s=s,t=t):\n"); set_object(oper_s); /* set_diff */ fprintf(stdout, " test function - set_diff ===>\n"); oper_s = set_diff(NULL, t); fprintf(stdout, " s = NULL, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release diff(s=NULL,t=t):\n"); set_object(oper_s); /* *** */ oper_s = set_diff(s, NULL); fprintf(stdout, " s = s, t = NULL:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release diff(s=s,t=NULL):\n"); set_object(oper_s); /* *** */ oper_s = set_diff(s, t); fprintf(stdout, " s = s, t = t:\n"); set_object(oper_s); set_for_each(oper_s, set_member_show_double, NULL); set_clear(oper_s); set_release(&oper_s); fprintf(stdout, " after release diff(s=s,t=t):\n"); set_object(oper_s); fprintf(stdout, " release 's' and 't' object:\n"); set_for_each(t, set_member_destroy, NULL); set_clear(s); set_clear(t); set_release(&s); set_release(&t); fprintf(stdout, " show 's' set object:\n"); set_object(s); fprintf(stdout, " show 't' set object:\n"); set_object(t); } }
void pay(struct set_t *store, struct sales_promotion *promotions, struct set_t *shopping) { struct set_t *pomo_set; //购物车中的促销商品 struct set_t* double_pomo_set; //购物车中同时享受两种优惠的商品 struct set_t *temp1, *temp2; //临时变量 struct set_t *pure_goods; //购物车中不享受优惠的商品 struct promotion_one_info *pomo_info; //促销活动 enum promotion_category pomo_priority; //如果商品享受两种优惠,应该优先使用哪种 float cost_save; //优惠节约金额 float expenditure; //消费总计 struct free_one_list *free_list; //赠送的商品 cost_save = expenditure = 0; pomo_info = promotions->promotion_all_info;//指向优惠活动的头指针 pomo_priority = promotions->priority; free_list = NULL; double_pomo_set = shopping; pure_goods = shopping; while(pomo_info) { //循环遍历每种活动 //先计算享受两种优惠的商品 temp1 = double_pomo_set; double_pomo_set = set_inter(double_pomo_set, pomo_info->sales_set); if (temp1 != shopping) { set_free(&temp1); }/*释放set_inter生成的临时的set*/ //计算没有优惠的商品 temp2 = pure_goods; pure_goods = set_minus(pure_goods, pomo_info->sales_set); if(temp2 != shopping) { set_free(&temp2); }/*释放set_minus生成的临时的set*/ pomo_info = pomo_info->next_promotion; }/*while*/ //打印小票头信息 print_title(); //计算没有优惠 settle_product(store, pure_goods, &cost_save, &expenditure); //计算二重优惠 settle_double_promotion(store, pomo_priority, double_pomo_set, &cost_save, &expenditure); //计算一种优惠的商品,并结算 for (pomo_info = promotions->promotion_all_info;\ pomo_info; pomo_info = pomo_info->next_promotion){ switch (pomo_info->type) { case DISCOUNT: //95折扣 temp1 = set_inter(pomo_info->sales_set,shopping); settle_discount(store, temp1, double_pomo_set, &cost_save, &expenditure); if(temp1) set_free(&temp1); break; case FREE_ONE: //买二送一 temp1 = set_inter(pomo_info->sales_set,shopping); settle_free_one(store, temp1, double_pomo_set, &cost_save, &expenditure); if(temp1) set_free(&temp1); break; default: assert(!"no this promotion\n"); break; }/*switch*/ }/*for*/ //赠送商品列表打印 free_list = put_free_one_list(NULL, 0); free_one_print(free_list); //小票末尾信息打印 print_tail(cost_save, expenditure); }