Главная страница
Навигация по странице:

  • Debug

  • Start Without Debugging Ctrl + F5

  • File | Save All

  • File | Close Solution

  • Имена и типы переменных

  • Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П


    Скачать 17.38 Mb.
    НазваниеБорис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
    АнкорMS Visual C.pdf
    Дата04.08.2018
    Размер17.38 Mb.
    Формат файлаpdf
    Имя файлаMS Visual C.pdf
    ТипДокументы
    #22453
    страница4 из 37
    1   2   3   4   5   6   7   8   9   ...   37
    Build Solution (откомпилировать и построить. Такой режим мы использовали, когда первый раз запускали нашу программу. Как видно из рисунка, ошибки исчезли. Теперь можно запускать программу на выполнение. Для этого в главном меню среды требуется открыть выпадающее меню опции Debug и выбрать из него желаемое действие по запуску сформированной для выполнения программы старт с отладчиком (Start Debugging F5); старт без подключения отладчика (Start Without Debugging Ctrl + F5).
    Глава 1. Общие сведения о среде
    Visual C++ 2011
    . Создание консольного приложения Рис 1.21. Текст программы после подключения необходимых библиотеки результат его компиляции
    Если программу выполнить, тов окне черного цвета (рис. 1.22), которое называется консольным окном, высветится текст "Hello!". Если теперь нажать любую клавишу, то программа не завершится, а выдаст сообщение "Для продолжения нажмите любую клавишу. Нажимаем любую клавишу и снова видим текст программы, т. к. окно вывода закрывается. Рис 1.22. Результат выполнения консольной программы
    Здесь надо отметить, что в этом примере видна новинка версии 2011 по сравнению с версией 2010: в последней приходилось вставлять в программу функцию _getch()
    ,

    28 Часть
    I. Изучение языка С/С++
    которая ждет ввода любого символа с клавиатуры и этим задерживает закрытие экрана. Мы таки поступили, когда составили текст программы. Однако это оказалось излишним разработчики среды сами позаботились, чтобы окно вывода не закрывалось, не убегало, а задерживалось до нажатия любой клавиши на экране. На такое усовершенствование фирме Microsoft понадобилось около десятка лет, если не больше. Поздравим фирму с новым достижением.
    Сохраним новый проект, выполнив команду File | Save All. Поясним суть программы. Любая программа на С/С++ строится из множества элементов, называемых функциями, — блоков программных кодов, выполняющих определенные действия. Имена этих блоков-кодов, построенных по специальным правилам, задает либо программист (если он самих конструирует, либо имена уже заданы в поставленной со средой программирования библиотеке стандартных функций. Имя главной функции, с которой собственно и начинается выполнение приложения, задано в среде программирования. Это имя — main()
    . В процессе выполнения программы сама функция main()
    обменивается данными с другими функциями и пользуется их результатами. Обмен данными между функциями происходит через параметры функций, которые указываются в круглых скобках, расположенных вслед за именем функции. Функция может и не иметь параметров, но круглые скобки после имени всегда должны присутствовать по ним компилятор узнает, что передним функция, а не что-либо другое. В нашем примере в главной функции main()
    использованы две функции — это printf()
    и Функция printf()
    в качестве аргумента имеет строку символов (символы, заключенные в двойные кавычки. Среди символов этой строки есть специальный символ. Это так называемый управляющий символ — один из первых 32 символов таблицы кодировки символов ASCII. Управляющие символы не имеют экранного отображения и используются для управления процессами. В данном случае символ
    \n служит для выбрасывания буфера функции printf()
    , в котором находятся остальные символы строки, на экран и установки указателя изображения символов на экране в первую позицию — в начало следующей строки. То есть когда работает функция printf()
    , символы строки по одному записываются в некоторый буфер до тех пор, пока не встретится символ
    \n
    . Как только символ
    \n будет прочтен, содержимое буфера тут же передастся на устройство вывода (в данном случае — на экран. При создании консольного (неграфического) интерфейса с окном консольного приложения всегда автоматически связываются два файла один из них — для ввода данных с клавиатуры, а другой — для вывода данных на экран. О функции
    _
    getch()
    мы говорили выше. При наличии _
    getch()
    программа станет ждать, пока будет введен хотя бы один символ. Как только такой символ будет введен (например, символ 'a'), функция завершит свою работу, а вместе с ней завершит работу и вся программа, т. к. функция была последним исполняемым оператором (выполнение программы идет сверху вниз подряд, если не встречаются операторы, изменяющие последовательность исполнения. Функция _
    getch()
    — это функция ввода одного символа с клавиатуры она ждет нажатия какой-либо клавиши. Благодаря этой функции результат выполнения про
    Глава 1. Общие сведения о среде
    Visual C++ 2011
    . Создание консольного приложения граммы задерживается на экране до тех пор, пока мы не нажмем любую клавишу. Начинающий программист должен знать о подобном приеме задержки "убегания" экрана. Следует отметить, что основное назначение функции _
    getch()
    — вводить символы с клавиатуры и передавать их символьным переменным, о которых речь пойдет чуть позже. Теперь, чтобы начать создавать новую программу, надо старую закрыть. Для этого выполняем опцию File | Close Solution. Программа с оператором Рассмотрим программу вывода на экран таблицы температур по Фаренгейту и Цельсию. Формула перевода температур такова С = (5 / 9)(F – 32), где С — это температура по шкале Цельсия, а F — по шкале Фаренгейта. Задается таблица температур по
    Фаренгейту: 0, 20, 40, ..., 300. Требуется вычислить таблицу по шкале Цельсия и вывести на экран обе таблицы. Для этого производим следующие действия Создаем заготовку консольного приложения. Приложение автоматически сохраняется. Но можно его сохранять и пользуясь командами Save, Save All опции
    File главного меню среды. Кроме того, если вы забыли сохранить программу и попытаетесь закрыть проект, то среда запросит у вас подтверждение на сохранение, если в проекте были какие-либо изменения. Записываем код новой программы в тело главной функции (листинг 1.1). Листинг 1.1

    // 2_2011.cpp
    #include "stdafx.h"
    #include для функции printf() using namespace System; int main()
    { int lower,upper,step; float fahr,cels; lower=0; upper=300; step=20; fahr=lower; while(fahr <= upper)
    { cels=(5.0/9.0)*(fahr-32.0); printf("%4.0f %6.1f\n",fahr,cels);

    30 Часть
    I. Изучение языка С/С++
    fahr=fahr+step;
    }
    }
    //------------------------------------------------------------- Запускаем компилятор и построитель одновременно клавишей . Программа откомпилируется, построится. Для ее выполнения нажмем комбинацию клавиш
    +. Результат высветится в окне (рис. 1.23). Рис 1.23. Результат расчета таблицы температур по Цельсию
    Имена и типы переменных
    Поясним суть программы из листинга 1.1. Строка int это так называемые объявления переменных, где lower
    , upper
    , step
    — имена переменных. Компилятор соотнесет с этими именами определенные адреса в памяти и, начиная с этих адресов, выделит участки памяти (в байтах) в соответствии стем, какого типа объявлены переменные. В нашем случае тип переменных, заданный при их объявлении, — int от англ. integer — целое число. Это означает, что все переменные имеют вид целое число со знаком, и что под каждое значение числа, которое будет записано на участках lower
    , upper или step
    , отведено определенное количество байтов памяти (в данном случае 4 байта. Рассмотрим, как определяется количество памяти, отводимое под переменную, в данной среде программирования.
    Глава 1. Общие сведения о среде
    Visual C++ 2011
    . Создание консольного приложения
    int
    — этот тип данных занимает место большее или равное, чем тип short int
    , и меньшее или равное, чем тип long
    темы видим, что данные этого типа получаются как бы безразмерными в заданных границах. Объекты типа int могут объявляться как signed int
    (целое со знаком, таки целое без знака.
    Signed int
    — это синоним int
    . В дополнение к int существует тип данных, названный. Здесь n
    задает размер данных. Значения n
    могут быть равными 8, 16, 32 или 64. Таким образом, имена переменных — это названия тех полочек в памяти компьютера (а каждая полочка имеет свой адрес, где будут находиться данные (числа и не числа, с которыми программа будет работать при реализации алгоритма. Имена переменным надо давать осмысленно, чтобы облегчить их запоминание еще говорят, что переменным надо давать мнемонические обозначения) — так, чтобы они отражали характер содержания переменной. В нашем случае lower
    , upper и именуют, соответственно, нижнюю и верхнюю границы таблицы температур по Фаренгейту и шаг этой таблицы. Нижняя граница таблицы (
    lower
    ) равна 0, верхняя) равна 300, а шаг таблицы (те. разность между соседними значениями) равен 20. Перечень описываемых переменных одного типа (тип указывается вначале перечня) обязательно должен оканчиваться точкой с запятой — сигналом для компилятора, что описание переменных данного типа завершено. В языке С выражение, после которого стоит точка с запятой, считается оператором, те. законченным действием. В противном случае компилятор станет при компиляции искать ближайшую точку с запятой и объединять все, что до нее находится, в один оператор в общем, объединятся разнородные данные) ив конце концов, выдаст ошибку компиляции. float fahr,cels;
    — это описание переменных с именами fahr
    , cels
    , но тип этих переменных уже иной. Эти переменные — нецелые числа, атак называемые числа

    c плавающей точкой. "Полочки" в памяти, обозначаемые этими переменными, могут хранить любые вещественные числа, а не только целые. Таким образом, перед составлением программы, которая будет оперировать данными (числовыми и нечисловыми), эти данные следует описать им должны быть присвоены типы и имена. Присвоение переменным типов и имен фактически означает, что компилятор определит им место в памяти, куда данные будут помещаться и откуда будут извлекаться при выполнении операций над ними. Следовательно, когда мы пишем c = a + b
    , это означает, что одна часть данных будет извлечена с "полочки" а, другая часть данных — с "полочки" b
    , произойдет их суммирование, а результат будет "положен" (записан) на "полочку" Знак "
    =
    " означает "присвоить, это не знак равенства, а знак операции пересылки. Знак равенства выглядит иначе (о знаке равенства см. в главе 2
    ). Присваивать некоторой переменной можно не только значение с какой-либо "полочки, те. значение другой переменной, но и просто числа. Например, a = 10
    . В этом случае компилятор просто "положит на полочку" a
    число 10.

    32 Часть
    I. Изучение языка С/С++
    В VC++ 2011 имеется еще один тип. Он ставится перед именем переменной, которая определяется правой частью некоторого выражения. Компилятор по значению правой части для этого типа определяет истинный тип переменной. Например Компилятор присвоит переменной а тип Оператор Чтобы вычислить температуру по Цельсию для каждого значения шкалы по Фарен- гейту, не требуется писать программный код для каждой точки шкалы. В этом случае не хватило бы никакой памяти, поскольку шкала может содержать миллиарды точек. В подобных ситуациях выходят из положения так делают вычисления для одной точки, используя некоторый параметра потом, изменяя этот параметр, заставляют участок расчета снова выполняться до тех пор, пока параметр не примет определенного значения, после которого повторение расчетов прекращают. Повторение расчетов называют циклом расчетов. Для организации циклов существуют специальные операторы цикла, которые охватывают участок расчета и прокручивают его необходимое количество раз. Одним из таких операторов в языке С+ является оператор англ. while — до тех пор, пока. Тело этого оператора ограничивается парой фигурных скобок начинается с открывающей фигурной скобки, а заканчивается закрывающей фигурной скобкой. В это-то тело и помещается прокручиваемый участок. А сколько раз прокручивать — определяется условием окончания цикла, которое задается в заголовочной части оператора. Вид оператора while
    : условие окончания цикла)
    { Тело
    } Работает оператор так вначале проверяется условие окончания цикла. Если оно истинно, то тело оператора выполняется. Если условие окончания цикла ложно, то выполнение оператора прекращается, и начинает выполняться программный код, расположенный непосредственно после закрывающей скобки тела оператора. Приведем пример истинности условия. Условие может быть записано в общем случаев виде некоторого выражения (переменные, соединенные между собой знаками операций. Например, a < b
    (a меньше b). Значение переменной а — это то, что лежит на полочке с именем "
    a
    ", a значение переменной b
    — то, что лежит на полочке "
    b
    ". Если значение переменной a
    действительно меньше значения b
    , то выражение считается истинным, в противном случае — ложным. Внимательно посмотрев на оператор while
    , можно сделать вывод для завершения цикла (для этого условие окончания цикла должно стать ложным) надо, чтобы само условие окончания изменялось в телеоператора по мере выполнения цикла ив нужный момент стало бы ложным. Теперь рассмотрим, как это происходит в нашей программе.
    Глава 1. Общие сведения о среде
    Visual C++ 2011
    . Создание консольного приложения Сперва определяются начальные значения переменных lower
    , upper
    , step
    . Параметром, задающим циклу нас является переменная fahr
    : ее значение будет меняться от цикла к циклу на величину шага шкалы по Фаренгейту, начиная от минимального, когда fahr = lower
    (мы присваиваем ей значение переменной lower
    , которая ранее получила значение нуля — начала шкалы по Фаренгейту), и заканчивая максимальным, когда значение переменной lower достигнет значения переменной upper
    , которое мы вначале указали равным 300. Поэтому условие окончания цикла в операторе цикла while будет таковым "пока значение fahr не превзойдет значения переменной upper
    ". На языке С+ это записывается в виде while(fahr <= upper) В теле же самого оператора цикла мы записываем на языке С+ формулу вычисления значения переменной cels
    (те. точки шкалы по Цельсию, функцию printf()
    для вывода значений точек по Фаренгейту и Цельсию, переменную fahr для изменения параметров цикла (она добавляет значение шага шкалы по Фарен- гейту, что подготавливает переход к вычислению переменной cels для нового значения переменной fahr
    ). Это произойдет, когда программа дойдет до выполнения конца тела оператора while
    (те. до закрывающей фигурной скобки) и перейдет к выполнению выражения, стоящего в заголовочной части while и проверке его на истинность/ложность. Если истинность выражения-условия не нарушилась, то начнет снова выполняться тело оператора while
    . Когда жепеременная fahr примет значение, большее значения upper
    , цикл завершится начнет выполняться код, следующий за телом оператора while
    . А это будет закрывающая скобка тела главной функции программы, функции main()
    . То есть сама программа фактически завершится, нот. к. консольное окно, в которое выведены результаты расчета, еще незакрыто, то программа не выходит из выполнения. А выйдет только после нажатия любой клавиши на клавиатуре. Только после этого начнет выполняться закрывающая скобка тела главной функции main()
    . После ее обработки наше приложение закончит свою работу. Поясним операции, примененные при формировании переменной cels
    . Это арифметические операции деления (
    /
    ), умножения (
    *
    ), вычитания (

    ). Операция деления имеет одну особенность если ее операнды типа int
    , то и результат — всегда целое число, т. кв этом случае остаток отделения отбрасывается. И если бы мы в формуле для вычисления переменной cels записали 5 / 9, то получили бы 0, а не 0,55. Чтобы этого не случилось, нам пришлось "обмануть" операцию деления мы записали так, будто операнды в формате плавающей точки (для таких операндов остаток отделения не отбрасывается. Функция printf()
    в общем случае имеет такой формат printf(Control,arg1,arg2,...,argN);
    Control
    — это строка символов, заключенных в двойные кавычки. arg1
    , arg2
    , ..., argN
    — имена переменных, значения которых должны быть выведены на устройство вывода.

    34 Часть
    I. Изучение языка С/С++
    Строка
    Control содержит указания на формат переменных arg1
    , arg2
    , ..., argN
    (к какому виду эти переменные должны быть преобразованы. Указания на формат расположены точно в том же порядке, что и сами переменные arg1
    , arg2
    , Обозначение формата всегда начинается с символа
    %
    , а заканчивается символом типа форматирования d
    — для переменных типа int
    , f
    — для float
    , s
    — для строк символов и т. д. То есть если в строке
    Control группа символов не начинается с символа
    %
    и не заканчивается символом типа форматирования, то такие символы выводятся в том виде, как они записаны (например, некоторый текст. Между символом и символом типа форматирования задается ширина поля вывода, количество знаков после точки (для типа f
    ) и т. д. Полное определение форматов можно посмотреть в разделе Help для функции среды разработки (напишите, например, в любом месте текста вашей программы printf()
    , щелкните дважды по этой записи, нажмите клавишу ивам откроется страница Help, касающаяся функции printf()
    ). Так как переменные cels и относятся к типу float
    , то ив функции printf()
    указан соответствующий формат — Значение переменной fahr выводится целым числом в поле шириной 4 байта, а значение переменной cels
    , имеющее в результате расчетов дробное значение, выводится в поле шириной
    6 байтов с одним знаком после точки (формат
    %6.1f
    ). Строка
    Control может содержать и другие символы, которые выводятся без всякого форматирования (те. без преобразования в другую форму. Оператор Кроме оператора while
    , цикл позволяет организовать и оператор for
    . Перепишем уже рассмотренную программу расчета температур в несколько ином виде листинг. Листинг 1.2

    // 3_2011.cpp
    #include "stdafx.h"
    #include для функции printf() using namespace System; int main()
    { int fahr; for(fahr=0; fahr <= 300; fahr= fahr + 20) printf("%4d %6.1f\n",fahr,(5.0/9.0)*(fahr-32.0));
    } Здесь для получения того же результата, что ив предыдущем случае, применен оператор цикла for
    . Тело этого оператора, как и тело оператора while
    , циклически
    Глава 1. Общие сведения о среде
    Visual C++ 2011
    . Создание консольного приложения выполняется (прокручивается. В нашем случае тело for состоит всего из одного оператора — printf(...);
    , поэтому такое тело не берется в фигурные скобки (если бы тело оператора while состояло только из одного оператора, оно тоже не бралось бы в скобки. Мы видим, что запись программы приобрела более компактный вид. В заголовочной части оператора for расположены три выражения, из которых первые два оканчиваются точкой с запятой, третье — круглой скобкой, обозначающей границу заголовочной части for
    (компилятор понимает, что третье выражение завершилось. Как говорят, в данном случае "цикл идет попеременной в первом выражении она получает начальное значение, второе выражение — это условие окончания цикла (цикл закончится тогда, когда fahr примет значение, большее 300), а третье выражение изменяет параметр цикла на величину шага цикла. Работа происходит так инициализируется переменная цикла (те. получает начальное значение, затем проверяется условие продолжения цикла. Если оно истинно, то сначала выполняется тело оператора (в данном случае, функция printf()
    ), затем управление передается в заголовочную часть оператора for
    . После этого вычисляется третье выражение (изменяется параметр цикла) и проверяется значение второго выражения. Если оно истинно, то выполняется тело, затем управление снова передается на вычисление третьего выражения и т. д. Если же второе выражение становится ложным, то выполнение оператора for завершается и начинает выполняться оператор, следующий непосредственно за ним (а это — завершающая фигурная скобка main()
    , означающая прекращение работы функции main()
    ). В данном примере следует обратить внимание на аргумент функции printf()
    . Вместо обычной переменной там стоит целое выражение, которое сначала будет вычислено, а потом его значение выведется на устройство вывода. Выражение можно указывать в качестве аргумента функции, исходя из правила языка СВ любом контексте, в котором допускается использование переменной некоторого типа, можно использовать и выражение этого же типа. Символические константы

    Задание конкретных чисел в телепрограммы не очень хороший стиль программирования, т. к. такой подход затрудняет дальнейшую модификацию программы и ее понимание. При создании программы надо стремиться задавать все конкретные данные вначале программы, используя специальный оператор компилятора
    #define
    , который позволяет соотнести с каждым конкретным числом или выражением набор символов — символических (не символьных символьные — это другое) констант. В этом случае на местах конкретных чисел в программе будут находиться символические константы, которые в момент компиляции программы будут заменены на соответствующие им числа, но это уже невидимо для программиста. Отсюда и название "символические константы" — это не переменные, имеющие свой адрес и меняющие свое значение по мере работы программы, а постоянные,

    36 Часть
    I. Изучение языка С/С++
    которые один раз получают свое значение и не меняют его. С учетом сказанного, наша программа из листинга 1.2 примет следующий вид — листинг 1.3. Листинг 1.3
    // 4_2011.cpp
    #include "stdafx.h"
    #include для функции printf() using namespace System;
    #define lower 0
    #define upper 300
    #define step 20
    //------------------------------------------------------------- int main()
    { int fahr; for(fahr=lower; fahr <= upper; fahr= fahr + step) printf("%4d %6.1f\n",fahr,(5.0/9.0)*(fahr-32.0));
    _getch();
    } Теперь, когда начнется компиляция, компилятор просмотрит текст программы и заменит в нем все символические константы (в данном случае это — lower
    , upper
    , step
    ) на их значения, заданные оператором
    #define
    . Заметим, что после данного оператора никаких точек с запятой не ставится, т. к. это оператор не языка С, а компилятора. И если нам понадобится изменить значения переменных lower
    ,
    upper
    ,
    step
    , тоне придется разбираться в тексте программы, а достаточно будет посмотреть в ее начало, быстро найти изменяемые величины и выполнить их модификацию. Результат расчета температуры по всем трем вариантам, естественно, одинаков и показан на рис. 1.23.
    ГЛАВА Программы для работы
    1   2   3   4   5   6   7   8   9   ...   37


    написать администратору сайта