ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Programming Sandboxコミュのカレンダーの作成

  • mixiチェック
  • このエントリーをはてなブックマークに追加
カレンダーの表示プログラムを自分で作ってみました。
元ネタは
http://mixi.jp/view_bbs.pl?id=35521274&comm_id=602606です。

//=============================================================
// MyCalendar.h
// MyCalendarクラスの定義
//=============================================================

#include <iostream>
#include <iomanip>
#include <cstring>
#include <boost/date_time/gregorian/gregorian.hpp>

static const char *day[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

class MyCalendar {
private:
short year;
short month;

public:
MyCalendar(unsigned short year, unsigned short month)
: year(year), month(month){};
void Show() const;
};

// _MyCalendar_h_

コメント(6)

//=============================================================
// MyCalendar.cpp
// MyCalendarクラスの実装
//=============================================================

#include "MyCalendar.h"

void MyCalendar::Show() const
{
using namespace boost::gregorian;

int eom_day = gregorian_calendar::end_of_month_day(year, month);
date firstday(year, month, 1);

std::cout << "\t" << year << "\t" << month << std::endl;

for (int i = 0; i < 7; i++) {
std::cout << std::setw(5) << std::setfill(' ') << day[i];
}
std::cout << std::endl;

int mutch;
for (mutch = 0; mutch < 7; mutch++) {
if (!strcmp(firstday.day_of_week().as_short_string(), day[mutch])) {
break;
}
}

for (int i = 0; i < mutch; i++) {
std::cout << " " ;
}

int end = (mutch + eom_day) % 7 ? (mutch + eom_day) / 7 + 1 : (mutch + eom_day) / 7;
int now = 1;
for (int i = 0; i < end; i++) {
if (!i) {
for (int j = mutch; j < 7; j++) {
std::cout << std::setw(5) << std::setfill(' ') << now;
now++;
}
} else if (i == end - 1) {
while (now <= eom_day) {
std::cout << std::setw(5) << std::setfill(' ') << now;
now++;
}
} else {
for (int j = 0; j < 7; j++) {
std::cout << std::setw(5) << std::setfill(' ') << now;
now++;
}
}
std::cout << std::endl;
}
}

// _MyCalendar_cpp_
#include "MyCalendar.h"

const int MAXBUFSIZE = 256;

int main()
{
unsigned short year, month;

while (true) {
std::cout << "Enter Year(1400..9999): ";
std::cin >> year;

if (!std::cin.fail() && year >= 1400 && year <= 9999) {
break;
}

std::cin.clear();
std::cin.ignore(MAXBUFSIZE, '\n');
}

while (true) {
std::cout << "Enter Month(1..12): " << std::flush;
std::cin >> month;

if (!std::cin.fail() && month >= 1 && month <= 12) {
break;
}

std::cin.clear();
std::cin.ignore(MAXBUFSIZE, '\n');
}

MyCalendar mycal(year, month);
mycal.Show();
}
クラスとかまったく無しでやってみました。
mktimeを使ったもの。1902年から2037年の範囲でしか使えません。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static void usage(const char *);
static void show(int, int);
static int getwday(int, int, int);

static const char *months[] = {
    "January",   "February", "March",    "April",
    "May",       "June",     "July",     "August",
    "September", "October",  "November", "December"
};

static const int nmonths = sizeof(months) / sizeof(months[0]);

static const char *wdays[] = {
    "S", "M", "Tu", "W", "Th", "F", "S"
};

static const int nwdays = sizeof(wdays) / sizeof(wdays[0]);


int main(int argc, char **argv)
{
    int year;
    int month;

    if (argc < 3) {
        usage(argv[0]);
        return EXIT_FAILURE;
    }

    year = atoi(argv[1]);
    if (year < 1902 || year > 2037) {
        fprintf(stderr, "Illegal year: %d (1902..2037)\n", year);
        return EXIT_FAILURE;
    }

    month = atoi(argv[2]);
    if (month < 1 || month > nmonths) {
        fprintf(stderr, "Illegal month: %d (1..%d)\n", month, nmonths);
        return EXIT_FAILURE;
    }

    show(year, month);

    return EXIT_SUCCESS;
}

static void usage(const char *progname)
{
    fprintf(stderr, "usage: %s YEAR MONTH\n", progname);
}
static void show(int year, int month)
{
    int next_wday;
    int wday;
    int day;
    int i;

    printf("%s %04d\n", months[month - 1], year);
    for (wday = 0; wday < nwdays; wday++)
        printf("%2.2s%c", wdays[wday], (wday == nwdays - 1) ? '\n' : ' ');

    day = 1;
    if ((wday = getwday(year, month, day)) == -1)
        return;
    for (i = 0; i < wday; i++)
        printf("   ");

    for (;;) {
        printf("%2d", day);
        day++;
        if ((next_wday = getwday(year, month, day)) == -1) {
            putchar('\n');
            break;
        }
        putchar((wday == nwdays - 1) ? '\n' : ' ');
        wday = next_wday;
    }
}

static int getwday(int year, int month, int day)
{
    struct tm tm;

    tm.tm_year = year - 1900;
    tm.tm_mon = month - 1;
    tm.tm_mday = day;
    tm.tm_hour = 0;
    tm.tm_min = 0;
    tm.tm_sec = 0;
    tm.tm_wday = 0;
    tm.tm_yday = 0;
    tm.tm_isdst = 0;
    mktime(&tm);
    if (tm.tm_mday != day)
        return -1;
    return tm.tm_wday;
}
カレンダーって、学校の課題でよく出るみたいですね。
>palemanさん
for文やif文の練習にちょうどいいからかもしれませんね。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Programming Sandbox 更新情報

Programming Sandboxのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。