日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Objective-C实现Mac终端日历程序(cal命令)

發布時間:2024/3/26 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Objective-C实现Mac终端日历程序(cal命令) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???? 當我們在Mac下打開終端,然后輸入以下命令:看看會發生什么?

(1)cal:輸出當年當月的日歷;

。

(2)cal 1 2016? :輸出指定年份和月份的日歷;

。


(3)cal 2015? :輸出該年的日歷;

。


(4)cal -m 10??? :輸出當年指定月份的日歷;

???? 可以看到,cal命令是Mac下查看日歷(Calendar)的一個命令,使用起來非常的方便,現在我們使用Objective-C來實現這個控制臺程序,要實現一模一樣的效果。下面我可能貼的代碼有點多,程序我已經上傳??https://github.com/chenyufeng1991/Calendar 。有些實現部分可能略顯繁瑣冗余,大家有興趣也可以優化或者重構一下。

???? 首先這個程序最重要也是最難的部分就是輸出格式的問題,輸出格式必須和Mac程序保持一致,這個難度會比較大。然后就是如何計算某一天是星期幾?我們可以查到第一年的第一天剛好是星期六,所以我們可以計算出任何一天是星期幾,當然中間會涉及到閏年的判斷。其中最主要的一個計算方式就是就算某年的第一天距離第一年的第一天中間隔了多少天。

???? 輸出單單一個月的日歷會比較簡單,輸出整個年份又會提升一個難度。因為一年的日歷每一行將會輸出三個月,總共輸出四行。我這里采取的方式是一行一行輸入:一月二月三月一起輸出第一行,一月二月三月輸出第二行。。。感覺就像是印刷一樣。說的比較單調,我們直接通過代碼來實現。

(0)注意:該程序的輸入使用了main函數中的argc ,argv 兩個參數。前者表示輸入參數的數量,后者是一個數組,數組元素表示每一個輸入參數。所以在運行本程序時,需要把Products 組下的可執行文件在Finder中打開,然后把該文件直接拖入到終端下運行即可。運行效果應該是和Mac自帶的日歷是一樣的。輸出格式也是根據終端來設計的,所以請不要直接在Xcode控制臺下進行輸入輸出。


(1)YearAndMonthNow.h?? 獲取當前的年份和月份

#import <Foundation/Foundation.h>@interface YearAndMonthNow : NSObject@property(nonatomic) int yearNow; @property(nonatomic) int monthNow;- (void) yearAndMonth;@end
(2)YearAndMonthNow.m?? 獲取當前的年份和月份實現

/*這個類是獲取當前的年份和月份;*/#import "YearAndMonthNow.h"@implementation YearAndMonthNow- (void) yearAndMonth{NSDate *date = [NSDate date];NSCalendar *cal = [NSCalendar currentCalendar];//這句是說你要獲取日期的元素有哪些。獲取年就要寫NSYearCalendarUnit,獲取小時就要寫NSHourCalendarUnit,中間用|隔開;unsigned int unitFlags = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay;//把要從date中獲取的unitFlags標示的日期元素存放在NSDateComponents類型的d里面;NSDateComponents *d = [cal components:unitFlags fromDate:date];_yearNow = (int)[d year];_monthNow = (int)[d month];// NSLog(@"%d",_yearNow); // NSLog(@"%d",_monthNow); }@end
(3)JudgeNumberRegex.h?? 判斷用戶輸入的數字正確性

#import <Foundation/Foundation.h>@interface JudgeNumberRegex : NSObject- (BOOL) isNumber:(NSString*)str;@end
(4)JudgeNumberRegex.m ? 判斷用戶輸入的數字正確性實現

#import "JudgeNumberRegex.h"@implementation JudgeNumberRegex- (BOOL) isNumber:(NSString*)str{//這個是匹配數字字符串的正則表達式;NSString *numberRegex = @"^[0-9]+$";NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", numberRegex];BOOL isMatch = [pred evaluateWithObject:str];if (isMatch) { // NSLog(@"匹配");return true;} else { // NSLog(@"不匹配");return false;} }@end
(5)PrintYearAndMonth.h???? 打印日歷

#import <Foundation/Foundation.h>@interface PrintYearAndMonth : NSObject- (void) printmonth:(int)year yue:(int)yue; - (void) printyear:(int)year;@end
(6)PrintYearAndMonth.m??? 打印日歷實現

#import "PrintYearAndMonth.h" #import "Days.h"@implementation PrintYearAndMonth//MARK: - 輸出每個月的日歷的函數; //輸出一個月的日歷; - (void) printmonth:(int)year yue:(int)yue{NSNumber *none = [[NSNumber alloc] initWithInt:0];NSNumber *jan = [[NSNumber alloc] initWithInt:31];NSNumber *febLeap = [[NSNumber alloc] initWithInt:29];NSNumber *febNotLeap = [[NSNumber alloc] initWithInt:28];NSNumber *mar = [[NSNumber alloc] initWithInt:31];NSNumber *apr = [[NSNumber alloc] initWithInt:30];NSNumber *may = [[NSNumber alloc] initWithInt:31];NSNumber *jun = [[NSNumber alloc] initWithInt:30];NSNumber *jul = [[NSNumber alloc] initWithInt:31];NSNumber *aug = [[NSNumber alloc] initWithInt:31];NSNumber *sep = [[NSNumber alloc] initWithInt:30];NSNumber *oco = [[NSNumber alloc] initWithInt:31];NSNumber *nov = [[NSNumber alloc] initWithInt:30];NSNumber *dec = [[NSNumber alloc] initWithInt:31];NSMutableArray *monthArray = [[NSMutableArray alloc] init];if ([Days isLeapYear:year]) {NSArray *arr = [[NSArray alloc] initWithObjects:none,jan,febLeap,mar,apr,may,jun,jul,aug,sep,oco,nov,dec, nil];[monthArray addObjectsFromArray:arr];} else {NSArray *arr = [[NSArray alloc] initWithObjects:none,jan,febNotLeap,mar,apr,may,jun,jul,aug,sep,oco,nov,dec, nil];[monthArray addObjectsFromArray:arr];}int day=0;//考慮怎樣使標題居中顯示;//計算一個月份日歷的長度;NSString *calendarStr = [[NSString alloc] initWithFormat:@"%@",@" Su Mo Tu We Th Fr Sa"];//年份轉化為字符串;NSMutableString *yearStr = [[NSMutableString alloc] initWithFormat:@"%d",year];NSMutableString *monthStr = [PrintYearAndMonth transformMonthToEnglish:yue];[monthStr appendString:@" "];[monthStr appendString:yearStr];//計算標題的長度:int titleLen = (int)yearStr.length;//計算一個月日歷的長度:int calendarLen = (int)calendarStr.length;//計算左側需要空出的空格數;int blankLen = (calendarLen - titleLen) / 2;for (int i = 0; i < blankLen - 2; i++) {printf(" ");}printf("%s\n",[monthStr UTF8String]);printf(" Su Mo Tu We Th Fr Sa\n");day = [Days daysOfUntilLastMonth:year yue:yue];// NSLog(@"今天距離0年第1天有%d天",day);//下面開始進行輸出;//首先尋找這個月的1號是星期幾?//主要就是在哪一個位置輸出;/*一月 1日 一 二 三 四 五 六12 3 4 5 6 7 89 10 11 12 13 14 1516 17 18 19 20 21 2223 24 25 26 27 28 2930 31*///日 一 。。。。。 五 六//0位置 1位置 。。。。 5位置 6位置//算法如下:/*位置 = (day+5)%7+1;*/int position = (day + 5) % 7 + 1;// NSLog(@"Position位置 = %d",position);//注意:當position == 7的時候,第一行會留空;//確定Position后開始打印;//輸出第一行前面的空格;if (position == 7) {}else{for (int i = 0; i < position; i++) {printf(" ");}}//輸出第一行;int i;for (i = 0; i < (6 - position) + 1;) {printf(" %2d",++i);}if (position == 7) {} else {printf("\n");}//輸出第二行開始所有的;int count = 0;for (; i < [[monthArray objectAtIndex:yue] intValue]; ) {printf(" %2d",++i);count++;if (count == 7) {printf("\n");count = 0;}}//月份輸出完畢,換行結束;printf("\n");}//printmonth();+ (NSMutableString *) transformMonthToEnglish:(int)month{switch (month) {case 1:return [[NSMutableString alloc] initWithFormat:@"January"];break;case 2:return [[NSMutableString alloc] initWithFormat:@"February"];break;case 3:return [[NSMutableString alloc] initWithFormat:@"March"];break;case 4:return [[NSMutableString alloc] initWithFormat:@"April"];break;case 5:return [[NSMutableString alloc] initWithFormat:@"May"];break;case 6:return [[NSMutableString alloc] initWithFormat:@"June"];break;case 7:return [[NSMutableString alloc] initWithFormat:@"July"];break;case 8:return [[NSMutableString alloc] initWithFormat:@"August"];break;case 9:return [[NSMutableString alloc] initWithFormat:@"September"];break;case 10:return [[NSMutableString alloc] initWithFormat:@"October"];break;case 11:return [[NSMutableString alloc] initWithFormat:@"November"];break;case 12:return [[NSMutableString alloc] initWithFormat:@"December"];break;default:break;}return [[NSMutableString alloc] initWithFormat:@""];; }//MARK: - 輸出全年的函數; //輸出年份; /*2015January February MarchSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 6 74 5 6 7 8 9 10 8 9 10 11 12 13 14 8 9 10 11 12 13 1411 12 13 14 15 16 17 15 16 17 18 19 20 21 15 16 17 18 19 20 2118 19 20 21 22 23 24 22 23 24 25 26 27 28 22 23 24 25 26 27 2825 26 27 28 29 30 31 29 30 31April May JuneSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa1 2 3 4 1 2 1 2 3 4 5 65 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 1312 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 2019 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 2726 27 28 29 30 24 25 26 27 28 29 30 28 29 3031July August SeptemberSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa1 2 3 4 1 1 2 3 4 55 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 1212 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 1919 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 2626 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 3030 31October November DecemberSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa1 2 3 1 2 3 4 5 6 7 1 2 3 4 54 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 1211 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 1918 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 2625 26 27 28 29 30 31 29 30 27 28 29 30 31*//*打印一年的方式也是一行一行打印,一行包括3個月;*/ - (void) printyear:(int)year{//首先居中打出年份;printf(" %d\n\n",year);//首先判斷一下今年是閏年嗎?//打印第一組;//總共四組,首先實現第一組;printf(" January February March\n");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf("\n");//開始打印一月的第一行;int day1 = 0;//上一年距離第一年第一天的天數;day1 = [Days daysOfUntilLastMonth:year yue:1];int position1 = (day1 + 5) % 7 + 1;if (position1 == 7) {}else{for (int i = 0; i < position1; i++) {printf(" ");}}int i1;if (position1 == 7) {for (i1 = 0; i1 < 7;) {printf(" %2d",++i1);}} else {for (i1 = 0; i1 < (6 - position1) + 1;) {printf(" %2d",++i1);}}//開始打印2月的第一行;int day2 = 0;day2 = [Days daysOfUntilLastMonth:year yue:2];int position2 = (day2 + 5) % 7 + 1;printf(" ");if (position2 == 7) {}else{for (int i = 0; i < position2; i++) {printf(" ");}}int i2;if (position2 == 7) {for (i2 = 0; i2 < 7;) {printf(" %2d",++i2);}} else {for (i2 = 0; i2 < (6 - position2) + 1;) {printf(" %2d",++i2);}}//開始打印3月的第一行;int day3 = 0;day3 = [Days daysOfUntilLastMonth:year yue:3];int position3 = (day3 + 5) % 7 + 1;printf(" ");if (position3 == 7) {}else{for (int i = 0; i < position3; i++) {printf(" ");}}int i3;if (position3 == 7) {for (i3 = 0; i3 < 7;) {printf(" %2d",++i3);}} else {for (i3 = 0; i3 < (6 - position3) + 1;) {printf(" %2d",++i3);}}printf("\n");int count1 = 0;int count2 = 0;int count3 = 0;BOOL flag1 = true;BOOL flag2 = true;BOOL flag3 = true;while (flag1 || flag2 || flag3) {//開始打印1月的第二行;for (; true; ) {if (i1 >= 31) {printf(" ");第1個月全部打印完畢,打印空格;flag1 = false;}else{printf(" %2d",++i1);}count1++;if (count1 == 7) {count1 = 0;//打印2月的第二行;printf(" ");for (; true ; ) {if (i2 >= ([Days isLeapYear:year] == true ? 29 : 28)) {printf(" ");第2個月全部打印完畢,打印空格;flag2 = false;}else{printf(" %2d",++i2);}count2++;if (count2 == 7) {count2 = 0;//打印3月的第二行;printf(" ");for (; true; ) {if (i3 >= 31) {flag3 = false;} else {printf(" %2d",++i3);}count3++;if (count3 == 7) {count3 = 0;printf("\n");break;}//if;}//for;break;}//if;}//for;break;}//if;}//for;}//while// printf("\n");打印第2組;//總共四組,首先實現第2組;printf(" April May June\n");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf("\n");//開始打印一月的第一行;int day4 = 0;//上一年距離第一年第一天的天數;day4 = [Days daysOfUntilLastMonth:year yue:4];int position4 = (day4 + 5) % 7 + 1;if (position4 == 7) {}else{for (int i = 0; i < position4; i++) {printf(" ");}}int i4;if (position4 == 7) {for (i4 = 0; i4 < 7;) {printf(" %2d",++i4);}} else {for (i4 = 0; i4 < (6 - position4) + 1;) {printf(" %2d",++i4);}}//開始打印2月的第一行;int day5 = 0;day5 = [Days daysOfUntilLastMonth:year yue:5];int position5 = (day5 + 5) % 7 + 1;printf(" ");if (position5 == 7) {}else{for (int i = 0; i < position5; i++) {printf(" ");}}int i5;if (position5 == 7) {for (i5 = 0; i5 < 7;) {printf(" %2d",++i5);}} else {for (i5 = 0; i5 < (6 - position5) + 1;) {printf(" %2d",++i5);}}//開始打印3月的第一行;int day6 = 0;day6 = [Days daysOfUntilLastMonth:year yue:6];int position6 = (day6 + 5) % 7 + 1;printf(" ");if (position6 == 7) {}else{for (int i = 0; i < position6; i++) {printf(" ");}}int i6;if (position6 == 7) {for (i6 = 0; i6 < 7;) {printf(" %2d",++i6);}} else {for (i6 = 0; i6 < (6 - position6) + 1;) {printf(" %2d",++i6);}}printf("\n");int count4 = 0;int count5 = 0;int count6 = 0;BOOL flag4 = true;BOOL flag5 = true;BOOL flag6 = true;while (flag4 || flag5 || flag6) {//開始打印4月的第二行;for (; true; ) {if (i4 >= 30) {printf(" ");第4個月全部打印完畢,打印空格;flag4 = false;}else{printf(" %2d",++i4);}count4++;if (count4 == 7) {count4 = 0;//打印2月的第二行;printf(" ");for (; true ; ) {if (i5 >= 31) {printf(" ");第5個月全部打印完畢,打印空格;flag5 = false;}else{printf(" %2d",++i5);}count5++;if (count5 == 7) {count5 = 0;//打印3月的第二行;printf(" ");for (; true; ) {if (i6 >= 30) {flag6 = false;}else{printf(" %2d",++i6);}count6++;if (count6 == 7) {count6 = 0;printf("\n");break;}//if;}//for;break;}//if;}//for;break;}//if;}//for;}//while// printf("\n");打印第3組;//總共四組,首先實現第3組;printf(" July August September\n");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf("\n");//開始打印一月的第一行;int day7 = 0;//上一年距離第一年第一天的天數;day7 = [Days daysOfUntilLastMonth:year yue:7];int position7 = (day7 + 5) % 7 + 1;if (position7 == 7) {}else{for (int i = 0; i < position7; i++) {printf(" ");}}int i7;if (position7 == 7) {for (i7 = 0; i7 < 7;) {printf(" %2d",++i7);}} else {for (i7 = 0; i7 < (6 - position7) + 1;) {printf(" %2d",++i7);}}//開始打印2月的第一行;int day8 = 0;day8 = [Days daysOfUntilLastMonth:year yue:8];int position8 = (day8 + 5) % 7 + 1;printf(" ");if (position8 == 7) {}else{for (int i = 0; i < position8; i++) {printf(" ");}}int i8;if (position8 == 7) {for (i8 = 0; i8 < 7;) {printf(" %2d",++i8);}} else {for (i8 = 0; i8 < (6 - position8) + 1;) {printf(" %2d",++i8);}}//開始打印3月的第一行;int day9 = 0;day9 = [Days daysOfUntilLastMonth:year yue:9];int position9 = (day9 + 5) % 7 + 1;printf(" ");if (position9 == 7) {}else{for (int i = 0; i < position9; i++) {printf(" ");}}int i9;if (position9 == 7) {for (i9 = 0; i9 < 7;) {printf(" %2d",++i9);}} else {for (i9 = 0; i9 < (6 - position9) + 1;) {printf(" %2d",++i9);}}printf("\n");int count7 = 0;int count8 = 0;int count9 = 0;BOOL flag7 = true;BOOL flag8 = true;BOOL flag9 = true;while (flag7 || flag8 || flag9) {//開始打印7月的第二行;for (; true; ) {if (i7 >= 31) {printf(" ");第7個月全部打印完畢,打印空格;flag7 = false;}else{printf(" %2d",++i7);}count7++;if (count7 == 7) {count7 = 0;//打印8月的第二行;printf(" ");for (; true ; ) {if (i8 >= 31) {printf(" ");第8個月全部打印完畢,打印空格;flag8 = false;}else{printf(" %2d",++i8);}count8++;if (count8 == 7) {count8 = 0;//打印9月的第二行;printf(" ");for (; true; ) {if (i9 >= 30) {flag9 = false;}else{printf(" %2d",++i9);}count9++;if (count9 == 7) {count9 = 0;printf("\n");break;}//if;}//for;break;}//if;}//for;break;}//if;}//for;}//while// printf("\n");打印第4組;//總共四組,首先實現第4組;printf(" October November December\n");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf(" Su Mo Tu We Th Fr Sa ");printf("\n");//開始打印10月的第一行;int day10 = 0;//上一年距離第一年第一天的天數;day10 = [Days daysOfUntilLastMonth:year yue:10];int position10 = (day10 + 5) % 7 + 1;if (position10 == 7) {}else{for (int i = 0; i < position10; i++) {printf(" ");}}int i10;if (position10 == 7) {for (i10 = 0; i10 < 7;) {printf(" %2d",++i10);}} else {for (i10 = 0; i10 < (6 - position10) + 1;) {printf(" %2d",++i10);}}//開始打印11月的第一行;int day11 = 0;day11 = [Days daysOfUntilLastMonth:year yue:11];int position11 = (day11 + 5) % 7 + 1;printf(" ");if (position11 == 7) {}else{for (int i = 0; i < position11; i++) {printf(" ");}}int i11;if (position11 == 7) {for (i11 = 0; i11 < 7;) {printf(" %2d",++i11);}} else {for (i11 = 0; i11 < (6 - position11) + 1;) {printf(" %2d",++i11);}}//開始打印12月的第一行;int day12 = 0;day12 = [Days daysOfUntilLastMonth:year yue:12];int position12 = (day12 + 5) % 7 + 1;printf(" ");if (position12 == 7) {}else{for (int i = 0; i < position12; i++) {printf(" ");}}int i12;if (position12 == 7) {for (i12 = 0; i12 < 7;) {printf(" %2d",++i12);}} else {for (i12 = 0; i12 < (6 - position12) + 1;) {printf(" %2d",++i12);}}printf("\n");int count10 = 0;int count11 = 0;int count12 = 0;BOOL flag10 = true;BOOL flag11 = true;BOOL flag12 = true;while (flag10 || flag11 || flag12) {//開始打印10月的第二行;for (; true; ) {if (i10 >= 31) {printf(" ");第7個月全部打印完畢,打印空格;flag10 = false;}else{printf(" %2d",++i10);}count10++;if (count10 == 7) {count10 = 0;//打印11月的第二行;printf(" ");for (; true ; ) {if (i11 >= 30) {printf(" ");第8個月全部打印完畢,打印空格;flag11 = false;}else{printf(" %2d",++i11);}count11++;if (count11 == 7) {count11 = 0;//打印12月的第二行;printf(" ");for (; true; ) {if (i12 >= 31) {flag12 = false;}else{printf(" %2d",++i12);}count12++;if (count12 == 7) {count12 = 0;printf("\n");break;}//if;}//for;break;}//if;}//for;break;}//if;}//for;}//whileprintf("\n");}@end


(7)Days.h??? 計算中間間隔天數

#import <Foundation/Foundation.h>@interface Days : NSObject //這個類里面的方法只要設計成類方法就好了,沒必要使用實例方法,只要進行簡單的計算即可;//判斷是否是閏年; + (BOOL)isLeapYear:(int)year;//計算從公元0年到你輸入的上一年總共有多少天; + (int)daysOfUntilLastYear:(int)year;//計算公元0年到你輸入上個月共有多少天; + (int)daysOfUntilLastMonth:(int)year yue:(int)yue;@end
(8)Days.m?? 計算中間間隔天數

#import "Days.h"@implementation Days/*注意閏年的判斷:滿足下列一個條件即可:1. 能被4整除但是不能被100整除;2. 能被400整除;*///判斷是否是閏年; + (BOOL)isLeapYear:(int)year{if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {return true;}else{return false;}}//計算從公元0年到你輸入的上一年總共有多少天; + (int)daysOfUntilLastYear:(int)year{int day = 0;BOOL isLeap;for(int i = 1 ; i < year ; i++){isLeap = [Days isLeapYear:year];if(isLeap){day += 366;}else{day += 365;}}return day; }//計算公元0年到你輸入上個月共有多少天; + (int)daysOfUntilLastMonth:(int)year yue:(int)yue{NSNumber *none = [[NSNumber alloc] initWithInt:0];NSNumber *jan = [[NSNumber alloc] initWithInt:31];NSNumber *febLeap = [[NSNumber alloc] initWithInt:29];NSNumber *febNotLeap = [[NSNumber alloc] initWithInt:28];NSNumber *mar = [[NSNumber alloc] initWithInt:31];NSNumber *apr = [[NSNumber alloc] initWithInt:30];NSNumber *may = [[NSNumber alloc] initWithInt:31];NSNumber *jun = [[NSNumber alloc] initWithInt:30];NSNumber *jul = [[NSNumber alloc] initWithInt:31];NSNumber *aug = [[NSNumber alloc] initWithInt:31];NSNumber *sep = [[NSNumber alloc] initWithInt:30];NSNumber *oco = [[NSNumber alloc] initWithInt:31];NSNumber *nov = [[NSNumber alloc] initWithInt:30];NSNumber *dec = [[NSNumber alloc] initWithInt:31];int day = [Days daysOfUntilLastYear:year];//首先計算0年到上一年有多少天;NSMutableArray *monthArray = [[NSMutableArray alloc] init];if ([Days isLeapYear:year]) {NSArray *arr = [[NSArray alloc] initWithObjects:none,jan,febLeap,mar,apr,may,jun,jul,aug,sep,oco,nov,dec, nil];[monthArray addObjectsFromArray:arr];} else {NSArray *arr = [[NSArray alloc] initWithObjects:none,jan,febNotLeap,mar,apr,may,jun,jul,aug,sep,oco,nov,dec, nil];[monthArray addObjectsFromArray:arr];}// NSLog(@"第二個元素 = %d",[[monthArray objectAtIndex:2] intValue] );for(int i = 1 ; i < yue ; i++){day += [[monthArray objectAtIndex:i] intValue];}return day;}@end
(9)main.m主函數實現

/*要求:1.運行cal,輸出當月的月歷;2.運行cal 10 2014,輸出2014年10月的月歷;3.運行cal -m 10,輸出當年10月的月歷;4.運行cal 2014,輸出2014年的月歷;*//*注意事項:1.年份是從 1...9999的;2.月份是從 1...12的;*/#import <Foundation/Foundation.h> #import "YearAndMonthNow.h" #import "JudgeNumberRegex.h" #import "PrintYearAndMonth.h" #import "Days.h"int main(int argc, const char * argv[]) {@autoreleasepool{int year,yue;PrintYearAndMonth *printMonthObj = [[PrintYearAndMonth alloc] init];PrintYearAndMonth *printYearObj = [[PrintYearAndMonth alloc] init];if (argc == 2) {//1.執行“cal”命令;//執行該命令時argc = 2;argv[1] = cal;argv[2] = null//計算當前年月;YearAndMonthNow *yearAndMonthNow = [[YearAndMonthNow alloc] init];[yearAndMonthNow yearAndMonth];year = yearAndMonthNow.yearNow;yue = yearAndMonthNow.monthNow;[printMonthObj printmonth:year yue:yue];}else if(argc == 3){//4.執行“cal 2014”命令;//這個argv2表示年份;NSString *argv2 = [NSString stringWithUTF8String:argv[2]];[printYearObj printyear:[argv2 intValue]];}else if(argc == 4){//2.執行“cal 10 2014”命令;//這一步是為了把傳遞進來的char * argv參數轉化為 OC中的NSString;// NSString *argv1 = [NSString stringWithUTF8String:argv[1]];NSString *argv2 = [NSString stringWithUTF8String:argv[2]];NSString *argv3 = [NSString stringWithUTF8String:argv[3]];JudgeNumberRegex *judgeNumberRegex = [[JudgeNumberRegex alloc] init];BOOL isMonthRegex = [judgeNumberRegex isNumber:argv2];BOOL isYearRegex = [judgeNumberRegex isNumber:argv3];if (isMonthRegex && isYearRegex) {//執行該命令時,argc = 4,argv[1] = cal,argv[2] = 10,argv[3] = 2014;//需要把數字字符串轉化為整型;[printMonthObj printmonth:[argv3 intValue] yue:[argv2 intValue]];}else{//3.執行“cal -m 10”命令;//需要輸出本年的10月份日歷;//注意這里和上一個if的差異:這里的月份是在第三個參數的;YearAndMonthNow *yearAndMonthNow = [[YearAndMonthNow alloc] init];[yearAndMonthNow yearAndMonth];year = yearAndMonthNow.yearNow;[printMonthObj printmonth:year yue:[argv3 intValue]];}}}return 0; }
(10)編譯程序。運行時需要把Products組下面的可執行文件直接拖入到終端中運行。然后輸入“cal”,"cal -m 10","cal 2015","cal 10 2015"等命令查看結果。



github主頁:https://github.com/chenyufeng1991? 。歡迎大家訪問!

總結

以上是生活随笔為你收集整理的Objective-C实现Mac终端日历程序(cal命令)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。