Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! N 10. Консольная программа на Си++ и Бейсике


Информационный Канал Subscribe.Ru

 
Школа программирования

Программирование с нуля - это совсем просто!

10) Делаем консольную программу. Теперь на Си++ в C++Builder и Visual Studio

Прошлый выпуск некоторым попал каким-то излишне растянутым в ширину. Там в одном месте все пробелы из фразы вылетели, она так и растянулась. Я честно говоря так и не понял, почему. Сколько лет выпускю рассылки, но такое впервые :) При том, что перед отправкой в двух службах рассылок предварительно проверил, все выглядело нормально. А пришло растянутым.
Так что прошу прощения за досадный сбой, но как такого избежать, дажеи не знаю.


В прошлом занятии мы делали консольную программу на Паскале и Delphi. Теперь то же занятие для тех, кто выбрал Си++. Для этого нужна либо система Borland C++Builder 6 (или версии ниже, но не выше; я нашел кстати версию C++Builder 5 и на ней буду делать), либо Visual Studio 6 (или версии выше, но не ниже).

Насчет Си++ и Borland C++Builder - вот строки из письма Андрея:

А заказчики и работодатели любят Си++, как мне кажется, потому что:
1) этот язык очень прост в изучении. В одном компьютерном журнале насмешливо так написали, как о чём-то невозможном, "если Вы - гений и выучили С++ за 2 недели по хелпам". Я, помнится, очень сильно удивился, потому что лично я этот язык выучил самостоятельно за 10 дней;
2) программы на С++ маленькие и быстрые. EXE-файл после компиляции текста на С++ всегда меньше, чем та же программа, написанная на Паскале, я проверял. Да и вообще многие задачи, которые в других языках решаются только с привлечением Ассемблера, в С++ решаются средствами самого языка. Этого я не проверял, но мне говорили...
3) Для большинства языков компиляторы или очень дорогие, или очень старые... А для С++ сколько угодно новых и бесплатных, вот хоть взять Borland C++ Command Line Tools или DJCPP. Да и в платных выбор богатый... Один Borland C++ Builder чего стоит...
4) С++ очень гибкий и удобный. Я после того, как С++ освоил, попытался на Pascal'е попробовать... Жуть до чего язык деревянный! По-моему, этот язык создавался как игрушечный, для обучения, так им и остался, с излишне жёсткой структурой и этими невозможными begin, end, которые меня просто бесили: зачем столько букв, когда можно просто поставить скобку? Да и возможностей для написания программ (хотя я не специалист, может, чего-то не знаю) в С++ больше, чем в других языках, он гибкий. Вот, сколько функций для вывода строки в Паскале? 2. А в Си? Более 20, что больше подходит, то и выбираешь. А если ещё и возможности собственно С++ прибавить?
5) С++ - язык стандартизованный, а другие - нет. Я, например, в Borland C++ чувствую себя так же спокойно, как в Watcom C++ или DJCPP. А в других языках учишь не язык, а компилятор. Недаром ОбъектПаскаль называют не Паскалем, а Дельфи...

...Если Вы отдаёте предпочтение С++ и Паскалю, то логичнее было бы поставить Borland C++ Builder. Внешний вид такой же точно как у Delphi, а возможностей гораздо больше. У меня как-то стояли однономерный Дельфи и Билдер, так Дельфи постоянно "падала", а Билдер - как часы. Как гласит реклама самого "Дяди Бормана" "Простота и удобство Дельфи в сочетании с мощью С++". Я вот всё-таки не понимаю, почему, если С++, то обязательно Visual Studio? В Билдере же есть всё то же, что и в Студии + много чего ещё. Консольные приложения? - Console Application Vizard. Приложения с использованием MFC? - MFC Vizard. А что ещё надо? Плюс имеется и паскалевый компилятор, все компоненты для Дельфи нормально устанавливаются, можно в проект и формы дельфиньи вставлять вполне свободно, и в Си-шный текст выражения на Паскале вставлять, всё нормально откомпилируется. Так зачем 2 плохих компилятора иметь вместо одного хорошего? Кстати, сейчас модно ругать "Дядю Бормана" за то, что в Дельфи он Паскаль урезал, выкинув старьё. А вот в Билдере, наоборот, все мои любимые функции под DOS оставил. Поэтому, например, вот эта программа (см. исходный текст во вложении) в Студии работать не будет (проверял), а в Билдере - запросто!
Да и стоит Студия в 6 раз дороже Билдера... А Дельфи - хоть Билдеру и близнец, но почему-то на 900 рублей всегда дороже стоит... Вот это парадокс!

Между прочим, на сайте Майкрософта чётко написано, что они не занимаются розничной продажей средств разработки и рекомендуют обращаться к региональным партнёрам. На сайте Борланда можно скачать / заказать 90-days trial version Билдера или Дельфи. Но, как мне кажется, качать (при модемном соединении!) около 75 Мб может только гибрид миллионера с мазохистом...
Поэтому рекомендую купить Delphi 7 на Озоне. Вот прямая ссылка (не Вам, конечно, у Вас-то есть, а подписчикам):
http://www.ozon.ru/context/detail/id/1380655/
Форма оплаты самая разнообразная (в т.ч. WebMoney), ко мне, в Казахстан (а рассылают они товары во все страны мира) CD приходят где-то за месяц, по России, думаю, будет быстрее.
Там же есть и Студия... по цене лично для меня совершенно неприемлемой, поэтому и ссылку не даю...
А лучше купить Билдер: http://www.ozon.ru/context/detail/id/1380564/
Как я и писал, на 900 рублей дешевле Дельфи (ср. 2001 и 2900 р.)

Надеюсь, службы рассылок не сочтут это за рекламу.


Повторять сказанное в прошлом уроке не буду, просто выполним описанные в нем шаги, только не в Delphi, а сначала в C++Builder. Если у вас установлены и Delphi, и C++Builder, то при поочередном запуске они могут в начале загрузки спрашивать разную ерунду на английском :) Это потому что обе эти системы проверяют некоторые системные настройки (по-моему путь к отладчику), и просят их переустановить под себя. Просто Yes ответьте, и все.

Итак, даем команду File > New > Other, выбираем значок Console Wizard. В Delphi сразу был Console Application, да? А тут визард, мастер. Он просит еще дополнительные шаги сделать перед созданием заготовки консольной программы. Вот его вопрос:

http://russianenterprisesolutions.com/sbo/im/50.gif

Слева указывается язык, на котором будет создаваться программа. Си или Си++. Ну, Си++ помощнее и получше, кроме того, выучив Си++. человек автоматически выучивает и Си. А наоборот не получится, поэтому выбираем мы Си++, правильно? Справа снимем флажок с строчки "Use VCL" (это возможность использования единой библиотеки готовых компонентов C++Builder/Delphi, которая называется VCL; к музыкальному плееру например можно обращаться, если флажок включен; но пока нам это не надо). Затем отключим флажок со строки Multi Threaded (это когда в одном приложении можно создавать несколько одновременно работающих потоков; своего рода параллельншое программирование; на самом деле конечно на одном процессоре реальной одновременной работы несколькоих программ быть не может, но вот смоделировать их работу так, что будет полный эффект параллельности, можно; собственно, Windows так функционирует). Ну а Console Application конечно сохраним :)

Кстати, а что будет, если и Console Application отключить?

Все, жмем ОК и попадаем в редактор, где находится текст нашей программы. Заготовка.

//------

#pragma hdrstop

//-----

#pragma argsused
int main(int argc, char* argv[])
{
        return 0;
}
//-----

Теперь начинаем удалять лишние строки :) Вообще-то, добавлены они для наглядности, и вам самим в будущем понравится их добавлять, а не убирать, но пока все отвлекающее внимание ликвидируем. И вот что должно остаться:

int main(int argc, char* argv[])
{

}

Кроме того, первую строчку для наглядности и еще можно подкорректировать, вот так:

int main()
{

}

Теперь эта программа больше напоминает написанную на Delphi, правда?

В консольной программе на Си++ начало задается такой строкой:

int main()

Попозже мы разберем ее детально, а пока только отмечу, что слово main переводится как "главный". Главная программа то бишь.

Фигурные скобочки { и } обозначают то же, что и слова begin и end в Delphi, то есть начало и конец. Таким образом, данная программа содержит три строчки, первая из которых отмечает, что делаем мы главное приложение (примерно как команда со словечком CONSOLE в Delphi, помните? хотя это не совсем одно и то же, что main(), но для простоты можно так пока принять). Вторая, "{", указывает на начало программы, а третья "}"- на конец. Вот и все. Запускается программа нажатием на клавишу F9 или кнопкой Run. Так же вы на краткий миг увидите, как мелькнуло черное окно и сразу закрылось.

Теперь надо добавить команду ожидания нажатия клавиши на клавиатуре.

Система общения с пользователем в Си++ организована немного по другому, нежели в Паскале. Там в самом языке уже имеются команды ввода/вывода информации, а в Си++ они вынесены во внешние библиотеки (их сотни, если не тысячи), которые разбиты на тематические наборы. Что означает внешние? Это означает, что в программе надо явно указать, какую конкретно библиотеку мы хотим использовать. В реальной работе обычно бывают нужны единицы, реже десятки определенных библиотек, названия которых вы быстро на практике запомните :)

Команды общения с пользователем в консольном приложении находятся в библиотеке с названием conio (сокращение от console input/output; си-разработчики вообще очень любят сокращения :). Чтобы хранящиеся в ней команды стали доступны нашему приложению, ссылку на conio надо явно указать в начале программы. Делается это такой командой, немного странно выглядящей на первый взгляд:

#include <conio.h>
А вся программа будет выглядеть так:

#include <conio.h>

int main()
{

}

На самом деле эта команда подключения устроена просто. include переводится как "включить" (это команда препроцессора, и в Delphi тоже была схожая; до них мы еще доберемся), а затем просто указывается имя файла conio.h. Расширение .h обычно применяется в си-программах для хранения всевозможных описаний. Вот мы и добавили в нашу программу описание функций консольного ввода-вывода, чтобы компилятор знал, что такие существуют :) Запоминать это пока необязательно, главное, смысл поймите.

Нужная нам команда ожидания нажатия клавиши (любой) в библиотеке conio записывается так:

getch();

Сначала следует название нужной функции (сокращение :) от английского get - получить, и char - символ), затем круглые скобки (они в Си++ для функций обязательны, даже если в них ничего нету), а затем знакомый из Delphi символ ";", завершающий команду. Он нужен в конце каждого оператора.

Важно! В отличие от Паскаля, в Си++ делаются различия между большими и маленькими буквами, то есть записи getch и GetCh будут различными!

Вот что вышло в итоге:

#include <conio.h>

int main()
{

getch();

}
Пускаете программу, и теперь она, как послушная рабыня :) покорно ожидает, когда вы нажмете любую клавишу, чтобы закончиться.

Смысл понятен? Смысл КАЖДОЙ строки этой программы?


Схожим образом создается консольная программа на Си++ и в Visual Studio.
Схожим, да не совсем. Да, любят товарищи из Microsoft туману напустить :)

Кстати, по умолчанию кнопка Start в настройках рабочего окна Visual Studio может быть скрыта. Чтобы сделать ее видимой, надо переместить курсор мыши на область командных кнопок в верхней части, вызвать локальное меню и выбрать пункт Debug (Отладка). В результате к наборам командных кнопок добавится новая панель с кнопками управления ходом работы создаваемого приложения.

Запускаем Visual Studio (я делаю в версии 2003 .NET, вы можете пробовать и в более ранних, версии 6, 5, ...). Даем команду главного меню File > New > Project. В окне выбираем раздел Visual C++ Projects, в нем подраздел Win32 (я его умышленно беру, он по идее должен быть совместим с Visual Studio 6), и справа - значок Win32 Console Wizard. Ну, визарды нам знакомы уже. Внизу надо еще каталог и имя проекта указать. Правда, единственное окошко мастера ни одного вопроса мне не задало :) Жмем Finish, и вот что возникает на экране:

// w32c.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
 return 0;
}

Некоторые вещи уже нам знакомы, но есть и различия. Что можно удалить? Все, да не все. Команду include не удалить (можно удались конечно, но надо лезть в настройки, пока оставим) - в ней включается, как вы уже можете догадаться, некая библиотека stdafx. Это на самом деле самая важная библиотека при создании программ в Visual Studio, в ней много всяких возможностей имеется. Буквы std - сокращение от standard (стандартный), а что такое afx, я и не помню. Кто подскажет?

Путем дальнейших проб и ошибок получается вот такой минимизированный код:

#include "stdafx.h"

int _tmain()
{

}

Почему _tmain() вместо общепринятого main() указано, не представляю. Вот такие они, разработчики БГ, загадочные...

Я кстати попробовал и так:

#include "stdafx.h"

int main()
{

}

И тоже сработало. Ура! :)

Теперь добавим команду включения нужной нам библиотеки conio и вызов функции getch():

#include "stdafx.h"
#include <conio.h>

int main()
{
    getch();
}

Только включение conio надо делать после stdafx, иначе оно может не подхватиться (а чтобы подхватывалось, надо повозиться с настройками проекта). Но отличие минимальное от варианта C++Builder, как видно. В основном в настроечных параметрах программы, какие там библиотеки специфические взять например.

Запустите и проверьте ожидание нажатия.

Теперь вы представляете примерно, какого плана могут быть проблемы, если пользоваться разными средами разработки. Легко преодолимого плана :)

А вот насчет консольного приложения на Бейсике в Visual Studio 6 (не .NET), что-то мне подсказывает, что одной командой ввода там не обойтись. Увы... Вот как выглядит консольный вариант на Бейсике из Visual Studio .NET (проект создается командой главного меню File > New > Visual Basic Projects, значок Console Application):

Module Module1

    Sub Main()

    End Sub

End Module

Здесь есть уже знакомое слово Main(), с него основная программа и начинается. А словами End Sub заканчивается. Только она еще сама включена в другой, более глобальный элемент исходного кода, модуль называется. Модуль начинается словами

Module Module1

(Module1 - это название модуля, автоматически созданное, его можно изменить), а заканчивается словами

End Module

Внутри этого модуля и расположены наши исполняемые команды. В Visual Basic команда ожидания нажатия на Enter так выглядит:

Console.ReadLine()

Мда, еще говорят, что Бейсик проще :) Хотя вот точку с запятой в конце ставить не надо.

Вот что получилось:

Module Module1

    Sub Main()

        Console.ReadLine()

    End Sub

End Module

А вот что делать пользователям Visual Studio версии 6 и более ранних, даже и не знаю. Переходите на Visual C++ :)

Может, подскажет кто какой простой выход для ввода/вывода в консольной программе на VB6 ?


Время моего ответа на ваши письма несколько увеличивается :) но все равно пишите. Я отвечаю всем.

(c) 2004 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
http://russianenterprisesolutions.com/sbo/

Все выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/base.htm

 

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull
Отписаться

В избранное