Хочу выучить С++ "с нуля" (раньше Pascal учил) дайте ссылки на книги интересные плз!
» Обучение и начало програмирования на С++
Raven Lazy
1. Б. Страуструп, Язык программирования C++
2. А. Пол, Объектно-ориентированное программирование на C++
3. Г. Шилдт, C++. Самоучитель
4. Г. Шилдт, C++: Базовый курс
5. Г. Шилдт, Справочник программиста по C/C++
6. Г. Шилдт, Искусство программирования на C++
7. С. Мейерс, Эффективное использование STL
8. ISO/IEC 14882 Programming Languages: C++
Для начального ознакомления хороши [2]--[4], [1], [5], [8] --- полное описание и самое полное описание, [6], [7] --- описание тонкостей C++ и STL.
1. Б. Страуструп, Язык программирования C++
2. А. Пол, Объектно-ориентированное программирование на C++
3. Г. Шилдт, C++. Самоучитель
4. Г. Шилдт, C++: Базовый курс
5. Г. Шилдт, Справочник программиста по C/C++
6. Г. Шилдт, Искусство программирования на C++
7. С. Мейерс, Эффективное использование STL
8. ISO/IEC 14882 Programming Languages: C++
Для начального ознакомления хороши [2]--[4], [1], [5], [8] --- полное описание и самое полное описание, [6], [7] --- описание тонкостей C++ и STL.
Xarde
Цитата:
Я именно об это споткнулся :((((, видно прийдеться написать свой собственный парсер :)
И еще вопросик.
Как можно загрузить стандартные названия кнопок (ОК, ДА, НЕТ, ПОВТОРИТЬ и т.п.)?
Поясню, есть у одного из клиентов программа, которая полностью на английском, но когда запускаю ее на русской винде в диалогах появляются кнопки с русскими наименованиями, когда на португальской, подписи на кнопках по португальски, на английской по английски. Хотя текст в нутри программы по английски.
Вот и хочу сделать так-же в своей программе. Явно нужно загружать их из ресурсов, но вот как подступиться к поиску идентификаторов этих ресурсов я даже не знаю :(((. Заметил такую-же фичу во многих инсталяторах. явно что-то очень простое.
Цитата:
Сомневаюсь, что есть сложности с расположением переменных в правильной последовательности.
Я именно об это споткнулся :((((, видно прийдеться написать свой собственный парсер :)
И еще вопросик.
Как можно загрузить стандартные названия кнопок (ОК, ДА, НЕТ, ПОВТОРИТЬ и т.п.)?
Поясню, есть у одного из клиентов программа, которая полностью на английском, но когда запускаю ее на русской винде в диалогах появляются кнопки с русскими наименованиями, когда на португальской, подписи на кнопках по португальски, на английской по английски. Хотя текст в нутри программы по английски.
Вот и хочу сделать так-же в своей программе. Явно нужно загружать их из ресурсов, но вот как подступиться к поиску идентификаторов этих ресурсов я даже не знаю :(((. Заметил такую-же фичу во многих инсталяторах. явно что-то очень простое.
vserd
Цитата:
Странно. Ты же все равно хотел указывать их номера в строке, куда подставятся значения... По идее, это предполагает, что ты _уже_ знаешь порядок следования своих переменных. Зачем для этого еще и парсер писать?
Цитата:
Если тебе нужно для диалога типа MessageDlg, то там они идут, кажется, последним параметром (объединение по ИЛИ констант). Тут есть одно "но" - названия кнопок будут на языке твоей винды (если стоит английская, то вместо "да" будет "yes" и т.д.). Насколько я понял, тебя именно это и интересует.
Если пишешь на Builder, то там версии с пятой, кажется, есть возможность делать многоязычны интерфес. Мне это пока не требовалось, но, вроде бы ничего сложного. В меню Project\Language\Add...
Цитата:
Я именно об это споткнулся (((, видно прийдеться написать свой собственный парсер
Странно. Ты же все равно хотел указывать их номера в строке, куда подставятся значения... По идее, это предполагает, что ты _уже_ знаешь порядок следования своих переменных. Зачем для этого еще и парсер писать?
Цитата:
Как можно загрузить стандартные названия кнопок (ОК, ДА, НЕТ, ПОВТОРИТЬ и т.п.)?
Если тебе нужно для диалога типа MessageDlg, то там они идут, кажется, последним параметром (объединение по ИЛИ констант). Тут есть одно "но" - названия кнопок будут на языке твоей винды (если стоит английская, то вместо "да" будет "yes" и т.д.). Насколько я понял, тебя именно это и интересует.
Если пишешь на Builder, то там версии с пятой, кажется, есть возможность делать многоязычны интерфес. Мне это пока не требовалось, но, вроде бы ничего сложного. В меню Project\Language\Add...
Цитата:
Странно. Ты же все равно хотел указывать их номера в строке, куда подставятся значения... По идее, это предполагает, что ты _уже_ знаешь порядок следования своих переменных. Зачем для этого еще и парсер писать?
Прочувствуй разницу между
Цитата:
Format('Test string %s:2 , word %s:1', [' passed', 'yes']);
результат будет
'Test string yes , word passed'
и
printf("Test string %s , word %s", " passed", "yes");
Результат
'Test string passed, word yes'
При условии что 'Test string %s:2 , word %s:1' находится в отдельном файле, и грузится на этапе выполнения. Поэтому без парсера никуда. :(
Цитата:
Если тебе нужно для диалога типа MessageDlg, то там они идут, кажется,
MessageDlg это делфийская или VC++?
Для WINAPI MessageBox все понятно, там действительно на языке винды, я этим на Delphi активно пользуюсь, вместо стандатной делфийской реализации в Dialogs. В виденном мною приложении ВСЕ диалоги, которые включают стандартные кнопки написаны на языке винды, и только некоторые нестандартные надписи на кнопках по английски. Вот и интересует как это сделать в своем приложении. Все эти ресурсы храняться в винде, и нет большого смысла их таскать с собой и переводить в каждом языке по своему. Но вот как это можно сделать в какой DLL и какие именно ID этих ресурсов я нигде не встречал инфы ни на Delphi ни на С++.
vserd
Цитата:
А почему нельзя сразу написать так:
Цитата:
Цитата:
Подобная функция есть и там, и там - она просто обертывает функцию WinAPI.
Цитата:
Я тоже такой инфы не встречал. Большинство стандартных диалогов можно вызвать через WinAPI (придется рыть MSDN) и они будут содержать кнопки с именами на языке винды. Если же ты делаешь свой диалог, то проще определить язык винды и выбирать язык интерфейса программы, подгружая (явно или за счет многоязычности Борланда) строки из ресурсов.
Цитата:
Цитата:Format('Test string %s:2 , word %s:1', [' passed', 'yes']);
результат будет
'Test string yes , word passed'
и
printf("Test string %s , word %s", " passed", "yes");
Результат
'Test string passed, word yes'
При условии что 'Test string %s:2 , word %s:1' находится в отдельном файле, и грузится на этапе выполнения. Поэтому без парсера никуда.
А почему нельзя сразу написать так:
Цитата:
printf("Test string %s , word %s", "yes", " passed");
Цитата:
MessageDlg это делфийская или VC++?
Подобная функция есть и там, и там - она просто обертывает функцию WinAPI.
Цитата:
Но вот как это можно сделать в какой DLL и какие именно ID этих ресурсов я нигде не встречал инфы ни на Delphi ни на С++.
Я тоже такой инфы не встречал. Большинство стандартных диалогов можно вызвать через WinAPI (придется рыть MSDN) и они будут содержать кнопки с именами на языке винды. Если же ты делаешь свой диалог, то проще определить язык винды и выбирать язык интерфейса программы, подгружая (явно или за счет многоязычности Борланда) строки из ресурсов.
Цитата:
А почему нельзя сразу написать так:
Цитата:printf("Test string %s , word %s", "yes", " passed");
Ты мой исходный пост читал?
Мне человек написал что для корректного перевода на его язык нужно чтобы переменные были в другом порядке :(((.
В DELPHI это реализовывалось указанием номера аргумента, а где в строке он встречается мне было глубоко пофигу. В C++ не так, там первым пришол, первым ушол. Вот и спрашиваю, может просто моих знаний языка мало. На данный момент это нужно будет писать самому.
vserd
18:45 19-07-2005
Цитата:
А кто мешает этому человеку написать фильтр-функцию, вся задача которой сводится к перестановке местами аргументов. Решение, возможно, не очень красивое, но как выход, вероятно, сгодиться.
18:45 19-07-2005
Цитата:
Мне человек написал что для корректного перевода на его язык нужно чтобы переменные были в другом порядке ((.
А кто мешает этому человеку написать фильтр-функцию, вся задача которой сводится к перестановке местами аргументов. Решение, возможно, не очень красивое, но как выход, вероятно, сгодиться.
mr_eoi
Ты издеваешся???????
Он в программировании ни взуб ногой, но хорошо знает один из языков на который я хочу перевести программу.
Ты издеваешся???????
Он в программировании ни взуб ногой, но хорошо знает один из языков на который я хочу перевести программу.
Xarde
Цитата:
По моему, это глубочайшее заблуждение. Вопервых зачем? Вовторых если есть кнопка из С++ в ASM (BC5), то почему нет из С++ в Паскаль.
vserd
Цитата:
Да, надо писать, я не встречал.
Сделай аналог Паскаля "Format('Test string %s:2 , word %s:1', [' passed', 'yes']);" для С.
Не забудь исходники сюда бросить ), интересно.
Вопрос
Подскажите, что более привлекательней для использования и кто, как, этим пользуется?
Код:
// Функтор
int (*FUNC)(int i=0);
int f(int i=0) {return i*i;}
// или объект-функция:
class OBFUNC
{
public: int operator()(int i=0) {return i*i;}
};
Цитата:
Видимо, потому, что часть (если не весь) код C++ на Builder транслируется в машинные команды через Pascal.
По моему, это глубочайшее заблуждение. Вопервых зачем? Вовторых если есть кнопка из С++ в ASM (BC5), то почему нет из С++ в Паскаль.
vserd
Цитата:
На данный момент это нужно будет писать самому.
Да, надо писать, я не встречал.
Сделай аналог Паскаля "Format('Test string %s:2 , word %s:1', [' passed', 'yes']);" для С.
Не забудь исходники сюда бросить ), интересно.
Вопрос
Подскажите, что более привлекательней для использования и кто, как, этим пользуется?
Код:
// Функтор
int (*FUNC)(int i=0);
int f(int i=0) {return i*i;}
// или объект-функция:
class OBFUNC
{
public: int operator()(int i=0) {return i*i;}
};
Ой, а можно я тут свой вопрос задам?
Как явно вызвать конструктор?
Код:
class T
{
public:
T(){}
...
};
...
T * t = (T*)malloc(sizeof(T));
t->T(); //нельзя, говорит error C2273: 'function-style cast' : illegal as right side of '->' operator
Как явно вызвать конструктор?
Код:
class T
{
public:
T(){}
...
};
...
T * t = (T*)malloc(sizeof(T));
t->T(); //нельзя, говорит error C2273: 'function-style cast' : illegal as right side of '->' operator
yagififk
Никак. Если объект создается в стеке, то конструктор вызывается автоматически. Если в куче, то используешь operator new. Если по каким-то причинам тебе необходимо создать объект именно через malloc (вот уж не знаю, зачем), то можно просто скопировать объект.
Код: T t; // В стеке, автоматический неявный конструктор
T* t = new T; // В куче, неявный конструктор вручную
T* t = (T*)malloc(sizeof(T));
*t = T(); // Создание и копирование объекта
Никак. Если объект создается в стеке, то конструктор вызывается автоматически. Если в куче, то используешь operator new. Если по каким-то причинам тебе необходимо создать объект именно через malloc (вот уж не знаю, зачем), то можно просто скопировать объект.
Код: T t; // В стеке, автоматический неявный конструктор
T* t = new T; // В куче, неявный конструктор вручную
T* t = (T*)malloc(sizeof(T));
*t = T(); // Создание и копирование объекта
Цитата:
Если по каким-то причинам тебе необходимо создать объект именно через malloc (вот уж не знаю, зачем)Да вообщем хочу сделать класс динамических массивов Просто хотел realloc() использовать
Ну чтож спасибо, сделаю так:
T* t = (T*)malloc(sizeof(T));
*t = T(); // Создание и копирование объекта
Добавлено:
Эээээ, люди, так дело не пойдёт А если в операторе присваивания что-нибудь удаляется, а конструктор то я не вызывал Есть ли какое-нибудь другое решение проблемы?
Вообщем была идея такова. Выделить память под то количество элементов которое требуется и вызвать для них конструкторы, плюс выделить память для запасных элементов и вызывать конструкторы по мере добавления новых элементов в массив Ну а если уж выделенная память закончится то использовать realloс
yagififk
А почему бы не использовать operator new[]()?
Код: T* t = new T[100];
//...
delete[] t;
А почему бы не использовать operator new[]()?
Код: T* t = new T[100];
//...
delete[] t;
Ну я написал выше почему
Оказалось надо перегрузить оператор new
void * operator new (size_t, void *ptr) {return ptr;} //он ничего не делает, просто когда мы будем его использовать, то будет вызываться конструктор, что нам и требовалось
void operator delete(void *, void *){} //чтоб компилятор не матерился
Тогда конструктор можно вызывать так:
T *t;
t = (T*)malloc(sizeof(T)); //выделяем память, но конструктор не вызывается
t = new (t) T(); //в качестве параметра оператора new передаётся указатель куда нужно вызвать конструктор
Оказалось надо перегрузить оператор new
void * operator new (size_t, void *ptr) {return ptr;} //он ничего не делает, просто когда мы будем его использовать, то будет вызываться конструктор, что нам и требовалось
void operator delete(void *, void *){} //чтоб компилятор не матерился
Тогда конструктор можно вызывать так:
T *t;
t = (T*)malloc(sizeof(T)); //выделяем память, но конструктор не вызывается
t = new (t) T(); //в качестве параметра оператора new передаётся указатель куда нужно вызвать конструктор
yagififk
А почему бы не выделить памяти "сколько надо" при помощи operator new[]()? Какая разница --- использовать realloc или связку new[]/delete[] в паре с std::copy()? Все, что нужно --- объявить конструктор по умолчанию, тем более что у тебя он есть.
std::vector реализован именно так: выделяется память при помощи std::vector::reserve(), это параметр capacity. Но кроме него есть еще параметр size, причем в любой момент времени size <= capacity. std::vector::at обеспечивает доступ к элементам вектора в диапазоне [0; size).
А почему бы не выделить памяти "сколько надо" при помощи operator new[]()? Какая разница --- использовать realloc или связку new[]/delete[] в паре с std::copy()? Все, что нужно --- объявить конструктор по умолчанию, тем более что у тебя он есть.
std::vector реализован именно так: выделяется память при помощи std::vector::reserve(), это параметр capacity. Но кроме него есть еще параметр size, причем в любой момент времени size <= capacity. std::vector::at обеспечивает доступ к элементам вектора в диапазоне [0; size).
OtD
Как напишу, кину. Просто у меня было стойкое убеждение что на C++ такое должно быть. :((
ALL
вопрос по перечеслениям (enum)
Есть ли возможность определить последнее (верхнее) значение перечисления, и можно -ли использовать их в цикле?
т.е. хочется чего-то тако-го:
enum testEnum{
tefirst, tesecond, teOther
}
for (i=GetFirstEnum(testEnum); GetLastEnum(testEnum); I=+)
{}
где GetFirstEnum, GetLastEnum, возвращают первую и последнее занчение enum.
Или в С++ более правильным является объявление типа такого
enum testEnum{
tefirst, tesecond, teOther, teLast= teOther
}
и в цикле перебирать for (i=tefirst; teLast; I=+)?
В общем я хочу сделать некоторре множество идентификаторов, а потом использовать его для индексирования некотоого массива.
P.S. не бейте ногами если говорю ересь в смысле C++, я его только изучаю :)
Как напишу, кину. Просто у меня было стойкое убеждение что на C++ такое должно быть. :((
ALL
вопрос по перечеслениям (enum)
Есть ли возможность определить последнее (верхнее) значение перечисления, и можно -ли использовать их в цикле?
т.е. хочется чего-то тако-го:
enum testEnum{
tefirst, tesecond, teOther
}
for (i=GetFirstEnum(testEnum); GetLastEnum(testEnum); I=+)
{}
где GetFirstEnum, GetLastEnum, возвращают первую и последнее занчение enum.
Или в С++ более правильным является объявление типа такого
enum testEnum{
tefirst, tesecond, teOther, teLast= teOther
}
и в цикле перебирать for (i=tefirst; teLast; I=+)?
В общем я хочу сделать некоторре множество идентификаторов, а потом использовать его для индексирования некотоого массива.
P.S. не бейте ногами если говорю ересь в смысле C++, я его только изучаю :)
vserd
А почему бы не использовать std::set, итераторы и std::map? Просто нет способа перечислить элементы перечисления, но можно их занумеровать:
Код: enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3}
for(testEnum e = teFirst; у != teLast; e++);
А почему бы не использовать std::set, итераторы и std::map? Просто нет способа перечислить элементы перечисления, но можно их занумеровать:
Код: enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3}
for(testEnum e = teFirst; у != teLast; e++);
OtD
Цитата:
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.
Цитата:
Я бы использовал первый вариант. Почему? Потому что во втором создается некоторое количество ненужного мусора, вроде таблицы виртуальных функций. Причем во втором у тебя есть один объект на функию и для создания такой же (по параметрам вызова и результата) придется писать еще один объект. И наследование не поможет - нет виртуальности operator(). В указанном примере нет. Но можно и поправить.
Цитата:
По моему, это глубочайшее заблуждение.
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.
Цитата:
Подскажите, что более привлекательней для использования и кто, как, этим пользуется?
Я бы использовал первый вариант. Почему? Потому что во втором создается некоторое количество ненужного мусора, вроде таблицы виртуальных функций. Причем во втором у тебя есть один объект на функию и для создания такой же (по параметрам вызова и результата) придется писать еще один объект. И наследование не поможет - нет виртуальности operator(). В указанном примере нет. Но можно и поправить.
TheChampion, ну я же пока только учусь Тем более двоешник, это задание ещё в мае надо было сдать Спасибо за совет, потом посмотрю разберусь, сейчас пока времени мало
Xarde
Цитата:
Вы будете смеяться, господа, но MSVS программы той же функциональности компилирует чуть-чуть медленнее Delphi. Не умеют в Borland писать компиляторы C++.
А g++ 4 версии вообще всех имеет в плане скорости компиляции!
Цитата:
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.
Вы будете смеяться, господа, но MSVS программы той же функциональности компилирует чуть-чуть медленнее Delphi. Не умеют в Borland писать компиляторы C++.
А g++ 4 версии вообще всех имеет в плане скорости компиляции!
Xarde
Цитата:
Я не знаю как в Builder-е компилируется PAS-код, но по той причине что Builder поддерживает компиляцию Delphi кода не приходится надеятся на быстроту.
Чудес не бывает, за расширенные возможности приходится чем-то жертвовать.
IMHO Даже если используется только C++ компилер выполняет внутренние проверки на PAS, а так как это работа со стороками, на скорость не приходится расчитывать.
TheChampion
Ты сам себе протеворечишь
Цитата:
Или это я глючу что enum == множество? :(
Цитата:
разве enum testEnum{teFirst, teSecond, teThird} не начинается с 0? (вроде в доке сказано что именно так).
я в Delphi могу сделать вот так:
Код:
Type
TTestEnum=(teFirst, teSecond, teThird);
TMyArray= array [Low(TTestEnum)..High(TTestEnum)] of integer ;
Цитата:
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.
Я не знаю как в Builder-е компилируется PAS-код, но по той причине что Builder поддерживает компиляцию Delphi кода не приходится надеятся на быстроту.
Чудес не бывает, за расширенные возможности приходится чем-то жертвовать.
IMHO Даже если используется только C++ компилер выполняет внутренние проверки на PAS, а так как это работа со стороками, на скорость не приходится расчитывать.
TheChampion
Ты сам себе протеворечишь
Цитата:
Просто нет способа перечислить элементы перечисления, но можно их занумеровать:
А вот перечислить элементы множества --- раз плюнуть.
Или это я глючу что enum == множество? :(
Цитата:
Код:enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3}
разве enum testEnum{teFirst, teSecond, teThird} не начинается с 0? (вроде в доке сказано что именно так).
я в Delphi могу сделать вот так:
Код:
Type
TTestEnum=(teFirst, teSecond, teThird);
TMyArray= array [Low(TTestEnum)..High(TTestEnum)] of integer ;
vserd
Цитата:
Нет, просто я знаю C++.
Цитата:
Как ты думаешь, enum и std::set --- синонимы?
Цитата:
Ну да, именно так. Но тебе мало что мешает написать
Код: enum testEnum {teFirst, teSecond = 25, teThird}
Цитата:
Ты сам себе протеворечишь
Нет, просто я знаю C++.
Цитата:
Или это я глючу что enum == множество?
Как ты думаешь, enum и std::set --- синонимы?
Цитата:
разве enum testEnum{teFirst, teSecond, teThird} не начинается с 0? (вроде в доке сказано что именно так).
Ну да, именно так. Но тебе мало что мешает написать
Код: enum testEnum {teFirst, teSecond = 25, teThird}
Народ, помогите, плиз - никак не могу разобраться (пишу на perl очень давно), с++ не знаю вообще, но нужно написать програмку для института. Все элементарно, на perl- все бы сделал за 20 минут... а на с++..
Вопрос такой:
Как на Visual C++ (если что- компилятор Microsoft`овский) прочитать из файла (CSV - файл, где все значения разделены запятыми) и запихнуть в многомерный массив...
Вопрос такой:
Как на Visual C++ (если что- компилятор Microsoft`овский) прочитать из файла (CSV - файл, где все значения разделены запятыми) и запихнуть в многомерный массив...
dantess
Как обычно. Считываешь строки через std::ifstream::getline(), указав в качестве разделителя запятую. Что-то вроде этого:
Код: const int MAX = 1024;
char data[MAX + 1]; // Разделитель!
std::ifstream from("input.dat");
for(;;)
{
from.getline(data, MAX, ','); // Запятая
if(!from)
break;
// Делаем что-то с data
from.getline(data, MAX, ','); // Запятая
// Делаем что-то с data
from.getline(data, MAX, '\n'); // Конец строки
// Делаем что-то с data
}
Как обычно. Считываешь строки через std::ifstream::getline(), указав в качестве разделителя запятую. Что-то вроде этого:
Код: const int MAX = 1024;
char data[MAX + 1]; // Разделитель!
std::ifstream from("input.dat");
for(;;)
{
from.getline(data, MAX, ','); // Запятая
if(!from)
break;
// Делаем что-то с data
from.getline(data, MAX, ','); // Запятая
// Делаем что-то с data
from.getline(data, MAX, '\n'); // Конец строки
// Делаем что-то с data
}
TheChampion
Цитата:
конечно же нет. Если явно указывать что это std::set воросов не возникает, а если литературно....
Тут видно проблема с переводом. :(. В паскале TTestEnum=(teFirst, teSecond, teThird) обозван Enumerated type в русско-язычной литереатуре "множество". Вот и глючу.
Цитата:
Как ты думаешь, enum и std::set --- синонимы?
конечно же нет. Если явно указывать что это std::set воросов не возникает, а если литературно....
Тут видно проблема с переводом. :(. В паскале TTestEnum=(teFirst, teSecond, teThird) обозван Enumerated type в русско-язычной литереатуре "множество". Вот и глючу.
vserd
Цитата:
По-моему в русской версии вирта это называется "перечислимый тип". В паскале ведь это тоже разные вещи! Ты пишешь в духе:
Код: type my_enum = (First, Second, Third);
my_set = set of my_enum;
Цитата:
В паскале TTestEnum=(teFirst, teSecond, teThird) обозван Enumerated type в русско-язычной литереатуре "множество". Вот и глючу.
По-моему в русской версии вирта это называется "перечислимый тип". В паскале ведь это тоже разные вещи! Ты пишешь в духе:
Код: type my_enum = (First, Second, Third);
my_set = set of my_enum;
vserd
общее замечание по поводу перехода на с++ с других языков:
с++ не является высокоуровневым языком программирования, т.е. не имеет встроенной в язык поддержки строк, множеств, комплексных чисел, ввода/вывода и.т.д. Массивы и перечисления поддерживаются в самом базовом исполнении фактически не предоставляя высокоуровневых операций с ними.
Фактически все высокоуровневые типы и возможности реализуются в виде классов и функций.
общее замечание по поводу перехода на с++ с других языков:
с++ не является высокоуровневым языком программирования, т.е. не имеет встроенной в язык поддержки строк, множеств, комплексных чисел, ввода/вывода и.т.д. Массивы и перечисления поддерживаются в самом базовом исполнении фактически не предоставляя высокоуровневых операций с ними.
Фактически все высокоуровневые типы и возможности реализуются в виде классов и функций.
WiseAlex
Цитата:
А чем это плохо? На C++ можно писать программы как угодно и для чего угодно. По-моему, лучше иметь маленький язык с большой хорошей библиотекой, чем большой язык с убогими библиотеками и нафиг ненужными возможностями.
Цитата:
с++ не является высокоуровневым языком программирования, т.е. не имеет встроенной в язык поддержки строк, множеств, комплексных чисел, ввода/вывода и.т.д.
А чем это плохо? На C++ можно писать программы как угодно и для чего угодно. По-моему, лучше иметь маленький язык с большой хорошей библиотекой, чем большой язык с убогими библиотеками и нафиг ненужными возможностями.
По с++ и другим языкам программирования написано множество книг, но почему-то многие (а может и немногие) с этими книгами не могут достичь цели ... Может у них нехватает упорства или чего-то другова, а может дело и в книгах…
По моему мнению многие книги хотя и неплохо описывают "кирпичики языка", но содержат не интересные (абстрактные) примеры и задачи - поэтому быстро надоедает писать что ни будь типа "Hello world" выполняя задачи и примеры, а написать что ни будь толковое самому знаний(фантазии ...) пока что не хватает.
Эти книги можно сравнивать с простейшим конструктором - автор показывает простые кубики , а дальше делай что хочешь...
Мне кажется многим была интересна книга типа "конструктора lego" -где бы автор вначале книги поставил достаточно сложную но интересную задачу , а потом на протяжение книги показал как ее решить(двумя тремя способами). Раскрыл бы свойства языка, провел бы читателей от разработки алгоритма до написания кода ....
По моему мнению многие книги хотя и неплохо описывают "кирпичики языка", но содержат не интересные (абстрактные) примеры и задачи - поэтому быстро надоедает писать что ни будь типа "Hello world" выполняя задачи и примеры, а написать что ни будь толковое самому знаний(фантазии ...) пока что не хватает.
Эти книги можно сравнивать с простейшим конструктором - автор показывает простые кубики , а дальше делай что хочешь...
Мне кажется многим была интересна книга типа "конструктора lego" -где бы автор вначале книги поставил достаточно сложную но интересную задачу , а потом на протяжение книги показал как ее решить(двумя тремя способами). Раскрыл бы свойства языка, провел бы читателей от разработки алгоритма до написания кода ....
Страницы: 12345678910111213141516171819202122
Предыдущая тема: DELPHI. Счетчик ячеек со значенями, значений ячеек
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.