int main(int argc, string argv[]) { stream istr, ostr; string itags1[MaxBodyFields], itags2[MaxBodyFields]; string *produce, *otags; bodyptr btab1 = NULL, btab2 = NULL, btab; int nbody1, nbody2, nbody; real tsnap; initparam(argv, defv); if (! streq(getparam("produce"), "*")) { produce = burststring(getparam("produce"), ", "); layout_body(produce, Precision, NDIM); } else produce = NULL; istr = stropen(getparam("in1"), "r"); get_history(istr); if (! get_snap(istr, &btab1, &nbody1, &tsnap, itags1, produce == NULL)) error("%s: no data in 1st input file\n"); istr = stropen(getparam("in2"), "r"); get_history(istr); if (! get_snap(istr, &btab2, &nbody2, &tsnap, itags2, FALSE)) error("%s: no data in 2nd input file\n"); otags = set_inter(itags1, itags2); if (produce != NULL) checktags(otags, produce); eprintf("[%s: nbody = %d + %d]\n", getargv0(), nbody1, nbody2); nbody = nbody1 + nbody2; btab = (bodyptr) allocate(SizeofBody * nbody); snapstack(btab, btab1, nbody1, btab2, nbody2, otags); ostr = stropen(getparam("out"), "w"); put_history(ostr); put_snap(ostr, &btab, &nbody, &tsnap, otags); strclose(ostr); return (0); }
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); }