OOP In C

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);
     }
}

//注意指针的内存分配及释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值