问题描述
我需要用月程序编写一个简单的账单支付程序。假设有输入,例如
4 月 5 月
第一个是我应该支付账单的月份,第二个是我支付账单的月份。每月未按时还款的,原账单上会加利息。
比方说,
500.00 0.10
第一个浮动是原始票据,第二个是利息。 另一方面,如果您在同月支付账单,则不会有利息。您只需按原样填写原始账单即可。
#include<stdio.h>
#include<string.h>
void sum(float,float );
void sum1(float,float);
int main()
{
char fmonth[10];
char smonth[10];
double original,interest,bill,bill2;
printf("Enter: ");
scanf("%s %s %lf %lf ",&fmonth,&smonth,&original,&interest);
if(strcmp(fmonth,"Jan")==0 && strcmp(smonth,"Feb")==0)
{
sum(original,interest);
}
else if(strcmp(fmonth,"Feb")==0 && strcmp(smonth,"Mar")==0)
{
sum(original,"Mar")==0 && strcmp(smonth,"Apr")==0)
{
sum(original,"Apr")==0 && strcmp(smonth,"May")==0)
{
sum(original,"May")==0 && strcmp(smonth,"Jun")==0)
{
sum(original,"Jun")==0 && strcmp(smonth,"Aug")==0)
{
sum(original,"Aug")==0 && strcmp(smonth,"Sep")==0)
{
sum(original,"Sep")==0 && strcmp(smonth,"Oct")==0)
{
sum(original,"Oct")==0 && strcmp(smonth,"Nov")==0)
{
sum(original,"Nov")==0 && strcmp(smonth,"Dec")==0)
{
sum(original,"Dec")==0 && strcmp(smonth,"Jan")==0)
{
sum(original,smonth)==0)
{
sum1(original,interest);
}
}
void sum(float original,float interest)
{
double a,b;
a=original*interest;
b=a+original;
printf("%.2lf",b);
}
void sum1(float original,float interest)
{
printf("%.2lf",original);
}
当然,也会有fmonth
&& smonth
不是一个月的间隔吧?例如
Jan Dec
他应该在 jan
付款,但他在 dec
付款。利息需要等于客户在离到期月份支付账单的月份。
我不能只是手动预测所有结果,对吗?必须要缩短它
解决方法
要比较月份,您必须将月份名称转换为其对应的数字并比较这些数字。您可以为此使用完美的散列:一个简单的函数,它为所有有效值计算不同的数字。下面是一个适用于大写和小写 ASCII 表示的示例:
#include <stdio.h>
int month_number(const char *a) {
#define HASH(a,b,c) (((b) + (c)) & 31)
switch (HASH(a[0],a[1],a[2])) {
case HASH('j','a','n'): return 1;
case HASH('f','e','b'): return 2;
case HASH('m','r'): return 3;
case HASH('a','p','r'): return 4;
case HASH('m','y'): return 5;
case HASH('j','u','n'): return 6;
case HASH('j','l'): return 7;
case HASH('a','g'): return 8;
case HASH('s','p'): return 9;
case HASH('o','c','t'): return 10;
case HASH('n','o','v'): return 11;
case HASH('d','c'): return 12;
default: return 0;
}
}
int compare_months(const char *a,const char *b) {
int ma = month_number(a);
int mb = month_number(b);
return (ma > mb) - (ma < mb);
}
int main(int argc,char *argv[]) {
char fmonth[10],smonth[10];
double original,rate,interest;
printf("Enter start and end month,capital and interest rate: ");
if (scanf("%9s %9s %lf %lf",fmonth,smonth,&original,&rate) == 4) {
int fmon = month_number(fmonth);
int smon = month_number(smonth);
if (fmon == 0 || smon == 0) {
printf("invalid month\n");
} else {
if (smon <= fmon)
smon += 12;
// compute interest,assuming reimbursement on the same day of the month
interest = round((double)(smon - fmon) * rate / 12.0) / 100.0;
printf("Result: %.2f\n",original + interest);
}
} else {
printf("invalid input\n");
}
return 0;
}
,
一个简单的解决方法是将每个月映射到相应的数字(例如 March->3 然后,您可以比较那些而不是比较字符串,而不是比较字符串价值观。