OOP In C
http://stackoverflow.com/questions/1403890/how-do-you-implement-a-class-in-c
How do you implement a class in C?
date_client.c
#include "date.h"
#include <stdio.h>
#include <assert.h>
void TestDate(Date* date, int after, int before) {
printf("Year: %d\n", GetYear(date));
printf("Month: %d\n", GetMonth(date));
printf("Day: %d\n", GetDay(date));
char* date_string = GetDateString(date);
printf("Formatted: %s\n", date_string);
DestroyDateString(&date_string);
assert(date_string == NULL);
DestroyDateString(&date_string);
IncreaseDate(date);
date_string = GetDateString(date);
printf("1 day later: %s\n", date_string);
DestroyDateString(&date_string);
int i;
for (i = 0; i < after; ++i) {
IncreaseDate(date);
}
date_string = GetDateString(date);
printf("Another %d day(s) later: %s\n", after, date_string);
DestroyDateString(&date_string);
for (i = 0; i < before; ++i) {
DecreaseDate(date);
}
date_string = GetDateString(date);
printf("Another %d day(s) earlier: %s\n", before, date_string);
DestroyDateString(&date_string);
}
int main() {
int year, month, day;
int after, before;
scanf("%d%d%d%d%d", &year, &month, &day, &after, &before);
Date* date1 = CreateDate(year, month, day);
assert(sizeof(*date1) == sizeof(Date));
Date* date2 = CopyDate(date1);
assert(date1 != date2);
assert(date1->month == date2->month);
SetDate(date1, year + 1, month, day);
SetYear(date1, year);
SetMonth(date1, month);
SetDay(date1, day);
TestDate(date1, after, before);
DestroyDate(&date1);
DestroyDate(&date2);
assert(date1 == NULL);
DestroyDate(&date2);
return 0;
}
/*
One probable test case:
1900 2 28 365 366
Year: 1900
Month: 2
Day: 28
Formatted: 1900-02-28
1 day later: 1900-03-01
Another 365 day(s) later: 1901-03-01
Another 366 day(s) earlier: 1900-02-28
*/
date.h
#ifndef DATE_H_
#define DATE_H_
typedef struct {
int year, month, day;
} Date;
Date* CreateDate(int year, int month, int day);
void DestroyDate(Date** p);
Date* CopyDate(const Date* date);
int GetYear(const Date* date);
int GetMonth(const Date* date);
int GetDay(const Date* date);
void SetYear(Date* date, int year);
void SetMonth(Date* date, int month);
void SetDay(Date* date, int day);
void SetDate(Date* date, int year, int month, int day);
char* GetDateString(const Date* date);
void DestroyDateString(char** p);
void IncreaseDate(Date* date);
void DecreaseDate(Date* date);
#endif
date.c*
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
Date* CreateDate(int year, int month, int day){
Date* date = (Date*)malloc(sizeof(Date));
date->year = year;
date->month = month;
date->day = day;
return date;
}
int daysOfMonth(int year, int month) {
if (month == 2) {
if (year%4 == 0 && year%100 != 0 || year%400 == 0) return 29;
else return 28;
}
else if (month == 4||month == 6||month == 9||month == 11) return 30;
return 31;
}
void DestroyDate(Date** p){
free(*p);
*p = NULL;
}
Date* CopyDate(const Date* date){
Date* date1 = (Date*)malloc(sizeof(Date));
date1->year = date->year ;
date1->month = date->month ;
date1->day = date->day ;
return date1;
}
int GetYear(const Date* date){
int year1 = date->year;
return year1;
}
int GetMonth(const Date* date){
int month1 = date->month;
return month1;
}
int GetDay(const Date* date){
int day1 = date->day;
return day1;
}
void SetYear(Date* date, int year){date->year = year;}
void SetMonth(Date* date, int month){date->month = month;}
void SetDay(Date* date, int day){date->day = day;}
void SetDate(Date* date, int year, int month, int day){
date->year = year;
date->month = month;
date->day = day;
}
char* GetDateString(const Date* date){
char * dateString = (char*)malloc(11);
sprintf(dateString,"%04d-%02d-%02d",date->year,date->month,date->day);
return dateString;
}
void DestroyDateString(char** p){
free(*p);
*p = NULL;
}
void IncreaseDate(Date* date){
if (date->day < daysOfMonth(date->year,date->month)) date->day++;
else {
if (date->month == 12) {
date->year++;
date->month = 1;
}
else date->month++;
date->day = 1;
}
}
void DecreaseDate(Date* date){
if (date->day > 1) date->day--;
else {
if (date->month == 1) {
date->year--;
date->month = 12;
}
else date->month--;
date->day = daysOfMonth(date->year,date->month);
}
}
//注意指针的内存分配及释放