C语言商品打折
【问题描述】超市对快要过期的食品,进行统一的打折促销,食品信息包括:食品名称,生产日期,保质期,单价,其中生产日期使用日期结构体定义。距离保质期20天到10天的打5折,距离保质期10天以内的打3折。请将输入的食品单价进行修改,输出新的食品信息。对于已经过期食品,输出:食品名称,过去天数(负数),单价(0)
【输入形式】食品名称 生产日期 保质期(天数) 单价当前日期
当输入食品名称为"#"时表示输入结束。
【输出形式】食品名称 还有几天过期 修改后单价
【样例输入】
pm 2018.1.30 30 45
mb 2018.2. 6 25 30
gz 2018.2.15 25 20
0.0.0 0 02018.2.24
【样例输出】
pm 5 13.5
mb 7 9.0
gz 16 10.0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Date
{
int year, month, day; //年,月,日
};
struct Food_information
{
char name[12]; //名称
struct Date time; //生产日期
int days; //保质期
float price; //单价
float final_price = 0; //打折后的价格
int space_days = 0; //时间差(生产日期与当前日期)
int space_time; //距离过期的时间
};
int main()
{
int calculate(struct Date now, struct Food_information food); //函数声明,计算时间差
struct Food_information food[36]; //food数组,存放商品信息
struct Date now; //当前日期
int i, n;
char *str = "#";
for (i = 0, n = 0;; i++, n++)
{
scanf_s("%s %d.%d.%d %d %f", food[i].name, 12, &food[i].time.year, &food[i].time.month, &food[i].time.day, &food[i].days, &food[i].price);
if (strcmp(food[i].name, str) == 0)
break;
}
/*i = n = 0;
do
{
scanf_s("%s %d.%d.%d %d %f", food[i].name, 12, &food[i].time.year, &food[i].time.month, &food[i].time.day, &food[i].days, &food[i].price);
i++;
n++;
} while (strcmp(food[i].name, str) != 0);*/
scanf_s("%d.%d.%d", &now.year, &now.month, &now.day);
for (i = 0; i < n; i++)
{
food[i].space_days = calculate(now,food[i]);
food[i].space_time = food[i].days - food[i].space_days; //距离过期的时间(可能是负数)
if (food[i].space_time >= 10 && food[i].space_time <= 20)
food[i].final_price = food[i].price*0.5;
if (food[i].space_time >= 0 && food[i].space_time < 10)
food[i].final_price = food[i].price*0.3;
if (food[i].space_time < 0)
food[i].final_price = 0;
//printf("打折后的价格:%.1f \n", food[i].final_price);
}
for (i = 0; i < n; i++)
{
printf("%s %d %.1f \n", food[i].name, food[i].space_time, food[i].final_price);
}
system("pause");
return 0;
}
int calculate(struct Date now, struct Food_information food) //计算时间差(生产日期与当前日期)
{
int Days(int y, int m, int d); //函数声明,计算该天在该年中的天数
int z, m, n;
m = Days(now.year, now.month, now.day);
n = Days(food.time.year, food.time.month, food.time.day);
z = m - n;
//printf("生产日期与当天的天数差:%d天 \n", z);
return z;
}
int Days(int y, int m, int d) //计算该天在该年中的天数
{
int z, n;
switch (m)
{
case 1:n = d; break;
case 2:n = 31 + d; break;
case 3:n = 59 + d; break;
case 4:n = 90 + d; break;
case 5:n = 120 + d; break;
case 6:n = 151 + d; break;
case 7:n = 181 + d; break;
case 8:n = 212 + d; break;
case 9:n = 243 + d; break;
case 10:n = 273 + d; break;
case 11:n = 304 + d; break;
case 12:n = 334 + d; break;
default:printf("Input error(month)!\n");
}
if (((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) && n > 2)
z = n + 1;
else
z = n;
//printf("%d年%d月%d日是该年的%d天 \n", y, m, d, z);
return z;
}
运行结果:

说明:
1.程序在计算间隔天数是需保证是同一年,否则会出错;可自行添加相关语句以完善程序功能。
2.简述思路:
判断当前日期与生产日期间的间隔天数,与保质期对比,
若间隔<保质期,则未过期;
若间隔>保质期,则已过期。
1755

被折叠的 条评论
为什么被折叠?



