Beispiel #1
0
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);
}
Beispiel #2
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);
  }
}
Beispiel #3
0
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);

}