比较c语言中的2个月名称字符串例如,feb>jan

问题描述

我需要用月程序编写一个简单的账单支付程序。假设有输入,例如

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 然后,您可以比较那些而不是比较字符串,而不是比较字符串价值观

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...