Только сейчас дошли руки открыть его книгу “Programming Microsoft Windows C#”. Чарльз Петзольд, который сам прошел эволюцию от С к С++, а затем к C#, уже в самом начале книги объяснил основное отличие между этими языками и, по-моему, просто открыл мне дверь для понимания C#.
Тривиальная задача взята за основу – посчитать номер дня в году. На С это выглядит супер просто и супер понятно:
#include <stdio.h>
struct Date
{
int year;
int month;
int day;
};
int IsLeapYear(int year)
{
return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}
int DayOfYear(struct Date date)
{
static int MonthDays[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
return MonthDays[date.month - 1] + date.day + ((date.month > 2) && IsLeapYear(date.year));
}
int main()
{
struct Date mydate;
mydate.month = 8;
mydate.day = 29;
mydate.year = 2001;
printf("Day of year = %i\n", DayOfYear(mydate));
return 0;
}
Превратить этот код в С++ не сложно:
#include <stdio.h>
struct Date
{
int year;
int month;
int day;
int IsLeapYear()
{
return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}
int DayOfYear()
{
static int MonthDays[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
return MonthDays[month - 1] + day + ((month > 2) && IsLeapYear());
}
};
int main()
{
struct Date mydate;
mydate.month = 8;
mydate.day = 29;
mydate.year = 2001;
printf("Day of year = %i\n", mydate.DayOfYear());
return 0;
}
И тоже все ясно – поскольку две функции «спрятались» в структуре, то и параметры им уже не нужны. Эту структуру можно заменить на класс.
А теперь просто можна показать эту же программу на C#:
using System;
using System.Collections.Generic;
using System.Text;
namespace DayOfYearCSharp
{
class Program
{
static void Main(string[] args)
{
Date mydate = new Date();
mydate.year = 2001;
mydate.month = 8;
mydate.day = 29;
Console.WriteLine("Day of year = {0}", mydate.DayOfYear());
}
}
class Date
{
public int year;
public int month;
public int day;
public static bool IsLeapYear(int year)
{
return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}
public int DayOfYear()
{
int[] MonthDays = new int[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
return MonthDays[month - 1] + day + ((month > 2) && IsLeapYear(year) ? 1 : 0);
}
}
}
Одна и та же задача решена на трех языках. Сразу видно, что все эти языки родственны – одно семейство С языков.
No comments:
Post a Comment