Pages

Sunday, July 19, 2009

C, C++, C# , Charles Petzold

Чарльз Петзольд уже давно признаный авторитет в программировании для Microsoft Windows. Ему абсолютно все равно, что мой сосед использует его книги как подставку для монитора, а я все время хвалю и удивляюсь, как этот автор умеет находить и очень просто и доступно объяснять основополагающие вещи.

Только сейчас дошли руки открыть его книгу “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