C语言系列4——day of week

C风格的字符串
字符数组,以‘\0’结尾
char str[1000]
输入 scanf(“%s”,str);
输出 printf(“%s\n”,str);

C++风格的字符串

string #include<string>
using namespace std;

初始化 string str1 = str; // “hello”
连接 str1 + “world” → “hello world”
字符 str1[0] → ‘h’
长度 str1.length()
判断相等 str1 == “hello”
比较字典序 str1 > “abandon”
从c++ → c str1.c_str()

C++风格
map 实现下标是字符串内容是Int
映射

#include <map>
using namespace std;

“Caixunkun” → “ikun”
“wuyifan” → “Meigeni”

map的基本使用

#include <map>
#include <cstdio>
#include <string>
using namespace std;

int main() {
    // 键 key --> 值 value
    // <键的类型,值的类型>
    map<string,string> myMap = {
            {"Caixukun","ikun"},
            {"wuyifan","meigeni"}
    };
    // 读取字符串用C风格的
    char str[100];
    scanf("%s",str);
    // 转换成C++风格的
    string name = str;
    // 输出C++风格 --> C风格
    // myMap[key] 根据key映射到对应的值(C++风格的字符串)
    printf("%s的粉丝被称为%s\n",name.c_str(),myMap[name].c_str());

    return 0;
}

根据年月日算星期几
在这里插入图片描述
图片来源于王道机试课程

代码

#include <cstdio>
#include <map>
#include <string>
using namespace std;// 一般来说,都加上这句话

int main() {
    int mday[13] = {-1,31,28,31,30,31,30,31,31,30,31,30,31};
    string intToWeekday[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
    map<string,int> monthToint = {
            //复制代码时小心中英文标点
            {"January",1},{"February",2},{"March",3},{"April",4},{"Map",5},
            {"June",6},{"July",7},{"August",8},{"September",9},{"October",10},
            {"November",11},{"December",12}
    };
    int year,mon,day;
    char str[100];
    string month;
    //9 October 2001
    //scanf 要使用C风格
    bool isBefore;//为真来自之前,为假来自之后
    while (scanf("%d%s%d",&day,str,&year) != EOF){
        month = str;//把字符串从C风格转换成C++风格
        mon = monthToint[month];//从字符串到整数
        if(year < 2023
        || 2023 == year && mon < 2
        || 2023 == year && mon < 2 && day < 8){
            isBefore = true;
        } else{
            isBefore = false;
        }

        //从begin走到End
        int begYear, begMon, begDay, endYear, endMon, endDay;
        if (isBefore){
            begYear = year; begMon = mon; begDay = day;
            endYear = 2023; endMon = 2; endDay = 8;
        } else{
            begYear = 2023; begMon = 2; begDay = 8;
            endYear = year; endMon = mon; endDay = day;
        }
        //计算总天数
        int totalDay = 0;
        while(true){
            if (begYear == endYear && begMon == endMon && begDay == endDay){
                break;
            }
            ++totalDay;
            //nextDay
            bool isleap = begYear%400==0 || begYear%100!=0 && begYear%4==0;
            if (isleap){
                mday[2] = 29;
            } else{
                mday[2] = 28;
            }
            ++begDay;
            if (begDay > mday[begMon]){
                begDay = 1;
                ++begMon;
                if (begMon > 12){
                    begMon = 1;
                    ++begYear;
                }
            }
        }

        if (isBefore){
            // (x+totalDay)%7 = 3 --> x = (10 - totalDay%7)%7
            printf("%s\n",intToWeekday[(10 - totalDay%7)%7].c_str());
        } else{
            printf("%s\n",intToWeekday[(totalDay+3)%7].c_str());
        }
//        if(month == "January"){
//            mon = 1;
//            //printf也要使用C风格的字符串
//            printf("mon = %d, month = %s\n", mon, month.c_str());
//        } else if(month == "February"){
//            mon = 2;
//            //printf也要使用C风格的字符串
//            printf("mon = %d, month = %s\n", mon, month.c_str());
//        }

    }

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值