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

  • ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ

  • Первый просмотр: краткий обзор include -включение другого файла.Эта строка указывает компилятору, что нужно включить информацию, содержащуюся в файлеstdio.h

  • Второй просмотр: детали ДалееСодержаниеinclude :Файл с именем stdio.h

  • Четыре довода в пользу объявления переменных

  • Язык Си - Уэйт, Прата, Мартин. M. уэит с. Прата д. Мартин


    Скачать 4.69 Mb.
    НазваниеM. уэит с. Прата д. Мартин
    АнкорЯзык Си - Уэйт, Прата, Мартин.pdf
    Дата15.03.2018
    Размер4.69 Mb.
    Формат файлаpdf
    Имя файлаЯзык Си - Уэйт, Прата, Мартин.pdf
    ТипПрограмма
    #16711
    страница3 из 42
    1   2   3   4   5   6   7   8   9   ...   42
    СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
    ОПИСАНИЕ ПЕРЕМЕННЫХ
    ИСПОЛЬЗОВАНИЕ КОМЕНТАРИЕВ
    ЧИТАЕМОСТЬ ПРОГРАММ
    ОПЕРАЦИИ
    Как выглядит программа, написанная на языке Си? Возможно, вы уже обратили внимание на пример, приведенный в гл. 1, и нашли, что эта программа выглядит довольно специфически из-за наличия в ней символов типа ( и \n". Когда вы прочтете данную книгу, вы обнаружите, что появление этих и Других характерных для языка Си символов станет менее странным, более понятным и, возможно, даже предпочтительным! Начало настоящей главы будет посвящено обсуждению довольно простого примера программы и объяснению того, что она делает. При этом мы рассмотрим некоторые из основных средств языка Си. Если какие-то детали остаются для вас неясными и вы захотите получить более подробные, ответы на возникшие вопросы, не огорчайтесь.
    Мы займемся этим в следующих главах.
    ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
    Далее
    Содержание
    Давайте рассмотрим простую программу на языке Си. Следует сразу сказать, что такой пример нужен нам лишь для выявления некоторых основных черт любой программы, написанной на языке
    Си. Далее мы дадим пояснения к каждой строке, но, перед тем как вы с ними познакомитесь, просто взгляните на программу и попробуйте понять, если сможете, что она будет делать.
    #include main( ) /*простая программа*/
    {
    int num;
    18
    num = l;
    printf ("Я простая");
    printf ("вычислительная машина .\n");
    printf ("Мое любимое число %d, потому что оно самое первое .\n", num);
    }
    Если вы считаете, что программа должна вывести нечто на экран дисплея, то вы совершенно правы! Несколько труднее понять, что же появится на экране на самом деле, поэтому давайте выполним программу на ЭВМ и посмотрим к чему это приведет.
    Первый шаг заключается в использовании имеющегося у вас текстового редактора для создания файла, содержащего текст программы. Этому файлу необходимо будет присвоить какое-то имя;
    если вам не приходит в голову ничего оригинального, то назовите его main.с. Выполните компиляцию вашей программы. (Для этого вы должны терпеливо ознакомиться с руководством по компилятору, имеющемуся в составе вашей вычислительной системы.) Теперь запустим программу. Если все пойдет хорошо, то результат должен выглядеть следующим образом:
    В общем этот результат не кажется особенно неожиданным. Но какую роль в программе выполняют символы \n и %d? И вообще некоторые строки выглядят немного странно. Здесь необходимы дополнительные пояснения.
    ПОЯСНЕНИЯ
    Далее
    Содержание
    Мы выполним два просмотра текста программы: во время первого объясним смысл каждой строки, а во время второго - рассмотрим дополнительные вопросы и детали.
    Первый просмотр: краткий обзор
    #include -включение другого файла.
    Эта строка указывает компилятору, что нужно включить информацию, содержащуюся в файле
    stdio.h.
    main( ) - имя функции
    19

    РИС. 2.1. Структура программы, написанной на языке Си.
    Любая программа, написанная на языке Си, состоит из одной или более "функций", являющихся основными модулями, из которых она собирается.
    Наша программа состоит из одной функции main, и круглые скобки указывают именно на то, что
    main( ) - имя функции.
    /*простая программа*/ - комментарий.
    Вы можете использовать пары символов /* и */ в качестве отбывающей и закрывающей скобок для комментария. Комментарии - это примечания, помогающие понять смысл программы. Они предназначены для читателя и игнорируются компилятором.
    - начало тела функции.
    Открывающая фигурная скобка отмечает начало последовательности операторов, образующих тело (или определение) функции. Конец определения отмечается закрывающей фигурной скобкой }.
    int num; - оператор описания.
    20

    С помощью такого оператора мы объявляем, что будем использовать в программе переменную
    num, которая принимает целые (int) значения.
    num =1; - оператор присваивания.
    Этот оператор служит для присваивания переменной num значения 1.
    printf (" Я простая"); - оператор вывода на печать.
    С его помощью выводится на печать фраза, заключенная в кавычки: Я простая
    printf(" вычислительная машина.\n"); - еще один оператор вывода на печать.
    Этот оператор добавляет слова вычислительная машина. в конец последней печатаемой фразы.
    Комбинация символов \n указывает компилятору на начало новой строки.
    printf ("Мое любимое число %d, потому что оно самое первое. \n", num);
    Этот оператор выводит на печать значение переменной num (равное 1), содержащееся во фразе в кавычках. Символы %d указывают компилятору, где и в какой форме печатать значение этой переменной num.
    } - конец. Как уже упоминалось, программа завершается закрывающей фигурной скобкой.
    Теперь рассмотрим нашу программу более внимательно.
    Второй просмотр: детали
    Далее
    Содержание
    #include < stdio.h> :
    Файл с именем stdio.h является частью пакета, имеющегося в любом компиляторе языка Си и содержащего информацию о вводе-выводе (например, средства взаимодействия программы с вашим терминалом). В качестве имени файла используется аббревиатура английских слов:
    standard input/оutput header - стандартный заголовок ввода-вывода.
    (Программисты называют набор данных, содержащийся в начале файла, заголовком.)В некоторых случаях включение этой строки в начало программы обязательно, а в некоторых - нет. Мы не можем дать однозначную рекомендацию, поскольку ответ зависит как от программы, так и от используемой вами вычислительной системы. При работе на нашей системе вводить указанную строку в эту программу совсем не обязательно, но на системе, имеющейся у вас, она может быть необходимой.
    В любом случае ее использование не принесет никакого вреда. В дальнейшем мы будем указывать эту строку только тогда, когда действительно необходимо.
    Возможно, вас удивляет, почему одно из основных средств языка - процедуры ввода-вывода - не включается компилятором в программу автоматически. Дело в том, что этот пакет используется далеко не всегда, а ведь одна из целей создания языка Си - получение компактного объектного кода. Между прочим, упомянутая строка не является даже оператором языка Си. Символ #
    указывает, что она должна быть обработана "препроцессором" языка Си. Как вы уже могли предположить из названия, препроцессор осуществляет некоторую предварительную обработку текста программы перед началом компиляции. В дальнейшем мы рассмотрим несколько примеров использования команд препроцессора.
    main( )
    Выбор имени main в качестве названия нашей программы довольно очевиден; более того, назвать ее как-то по-другому и нельзя. Дело в том, что программа, написанная на языке Си, всегда начинает выполняться с функции, называемой main( ), поэтому мы имеем возможность выбирать имена для всех используемых нами Функций кроме той, с которой начинается выполнение программы. Зачем здесь скобки? Как уже упоминалось, они указывают на то, что main( ) - имя функции.
    Дополнительные вопросы, относящиеся к функциям, будут обсуждаться ниже. Здесь мы только
    21
    повторим, что функции - это основные модули программы, написанной иа языке Си.
    В круглых скобках в общем случае содержится информация, передаваемая этой функции. В нашем простом примере передача информации отсутствует и, следовательно, в скобках ничего не содержится. Заканчивая обсуждение данного вопроса, дадим вам одщ совет: при написании программы старайтесь не пропускать скобок.
    Файл, содержащий программу, может иметь любое имя, правда, с тем ограничением, что оно должно удовлетворять системным соглашениям и оканчиваться символом . Например, вместо
    main.с мы могли бы выбрать имена mighty.с или silly.с.
    /*простая программа*/:
    Использование комментариев облегчает процесс понимания ва шей программы любым программистом (включая вас самих) Большим удобством при написании комментариев является воз можность располагать их на той же строке, что и операции, кото рые они объясняют. Длинный комментарий может помещаться на отдельной строке или даже занимать несколько строк. Все, что на ходится между символом, указывающим на начало комментария /*, и символом, указывающим на его конец */, игнорируется компилятором, поскольку он не в состоянии интерпретировав язык,
    отличающийся от Си.
    { и } :
    Фигурные скобки { } (и только они) отмечают начало и конец тела функции. Для этой цели не используются ни круглые ( ), ни квадратные [ ] скобки. Фигурные скобки применяются также для того, чтобы объединить несколько операторов программы в сегмент или "блок". Если вы знакомы с такими языками, как Паскаль или Алгол, вы легко сообразите, что такие скобки аналогичны операторам begin и end в этих языках.
    int num;:
    "Оператор описания переменной" - одно из важнейших средств языка Си. Как уже упоминалось выше, в нашем простом пример вводятся два понятия. Первое - использование в теле функции "переменной", имеющей имя num; второе - с помощью слова int объявляется, что переменная num
    принимает целые значения. Точка с запятой в конце строки указывает на то, что в ней содержится оператор языка Си, причем этот символ является здесь частью оператора, а не разделителем операторов, как в Паскале.
    Слово int служит "ключевым словом", определяющим один из основных типов данных языка Си.
    Ключевыми словами называют ся специальные зарезервированные слова, используемые для по строения фраз языка; список ключевых слов вы можете найти в приложении в конце книги.
    В языке Си все переменные должны быть объявлены. Это означает, что, во-первых, в начале программы вы должны привести список всех используемых переменных, а во-вторых, необходимо указать "тип" каждой из них. Вообще объявление переменных считается "хорошим стилем"
    программирования.
    Здесь вы можете задать три вопроса. Первый: каким образом надо выбирать имена? Второй:
    что такое типы данных? Третий: зачем вообще требуется объявлять переменные? Ответы на первый и третий вопросы приведены ниже и отмечены вертикальной линейкой голубого цвета.
    Второй вопрос мы обсудим в гл. 3, а здесь сделаем краткое замечание. Язык Си имеет дело с некоторыми классами (или "типами") данных: целыми числами, символами и числами с плавающей точкой. Объявление переменной, имеющей целый или символьный тип позволяет компилятору размещать данные в памяти, осуществлять их выборку и интерпретировать нужным образом.
    Выбор имени
    Мы предполагаем, что вы используете осмысленные обозначения переменных. Имя переменной
    22
    может содержать от одного до восьми символов. (Фактически вы можете использовать и большее их число, но компилятор пропустит же символы, начиная с девятого. Поэтому имена shakespeare и
    shakespencil считались бы одинаковыми, поскольку первые восемь букв у них совпадают.) Для образования имени переменной разрешается использовать строчные и прописные буквы, цифры и символ подчеркивания, считающийся буквой. Первым символом должна быть обязательно буква.
    Правильные имена
    Неправильные имена
    wiggly
    $Z^** cat1 1cat Hot_Tub
    Hot-Tub _kcaB
    don' t
    В библиотечных процедурах часто используются имена, начинающиеся с символа подчеркивания: Это делается в предположении, что пользователи вряд ли выберут имена,
    начинающиеся с этого символа, поэтому маловероятно, что одно из них будет случайно выбрано для обозначения другого понятия. Старайтесь ив использовать имен, начинающихся с символа подчеркивания, и вам удастся избежать взаимопересечений с множеством библиотечных имен.
    Четыре довода в пользу объявления переменных
    1. Сведение всех операторов объявления переменных в начало программы облегчает понимание ее смысла. Это особенно справедливо, если вы даете переменным осмысленные имена (например,
    taxrate [налоговый тариф] вместо r) и, кроме того, включаете в программу комментарии для объяснения того, что обозначают переменные. Документирование программы подобным образом является одним из основных признаков хорошего стиля программирования.
    2 . Размышление о том, что поместить в секцию объявления переменных, побуждает спланировать программу перед тем, как погрузиться в ее написание. Это эквивалентно получению ответов на вопросы: какая информация необходима программе при запуске? Какую выходную информацию хотелось бы получить?
    3. Объявление переменных позволяет избежать одной из наиболее коварных и труднообнаруживаемых ошибок - неправильно написанных имен. Например, предположим, что программируя на некотором языке, вы использовали оператор
    B0ZO = 32.4,
    а дальше в программе вы ошибочно написали
    ANS = 19.7* BOZO - 2.0
    случайно заменив цифру 0 буквой О. Вследствие этого в программе появится новая переменная с именем BOZO, и будет использовано какое-то ее значение (возможно нуль или какой-то "мусор"). В
    результате переменная ANS получит неправильное значение, и вы, возможно, потратите много времени, пытаясь найти причину. Это не может произойти при программировании на языке Си (если только вы не объявили две переменные со столь похожими именами), поскольку компилятор сразу выдаст сообщение об ошибке, как только встретит в программе необъявленную переменную с именем BOZO.
    4 . Любая программа, написанная на языке Си, не будет выполняться, если не описать все используемые переменные. Мы полагаем, что последний довод окажется решающим в том случае,
    если первые три вас не убедили.
    23
    num = 1; :
    "Оператор присваивания" является одним из основных средств языка. Приведенную выше строку программы можно интерпретировать
    РИС. 2.2. Оператор присваивания - один из основных операторов.
    так: "присвоить переменной num значение 1". Дело в том, что, согласно оператору в четвертой строке программы, переменной num была выделена ячейка памяти, и только теперь в результате выполнения оператора присваивания переменная получает свое значение. При желании мы могли бы присвоить ей другое значение - вот почему имя num обозначает переменную. Отметим, что этот оператор тоже заканчивается точкой с запятой.
    printf (" Я простая");
    printf ("вычислительная машина. \n");
    printf ("Мое любимое число %d, потому что оно самое первое.\n", num);
    Во всех этих строках используется стандартная функция языка Си, называемая printf( ); скобки указывают на то, что мы, конечно же, имеем дело с функцией. Строка символов, заключенная в скобки, является информацией, передаваемой функции printf( ) из нашей главной функции [main(
    )].
    Такая информация называется "аргументом"; в первом случае аргументом является строка "Я
    простая". Возникает вопрос: что функция printf( ) делает с этим аргументом? Ответ довольно очевиден: она просматривает все символы, содержащиеся между кавычками, и выводит их на экран терминала.
    24

    РИС. 2.3. Вид функции printf ( ) и ее аргумента.
    Данная строка дает нам пример того, как мы "вызываем" функцию или "обращаемся" к ней,
    программируя на языке Си. Для этого требуется только указать имя функции и заключить требуемый аргумент (или аргументы) в скобки. Когда при выполнении ваша программа "достигнет"
    этой строки, управление будет передано указанной функции [в данном случае printf( )]. Когда выполнение функции будет завершено, управление вернется обратно в исходную ("вызывающую")
    программу.
    Что можно сказать по поводу следующей строки программы? В ней имеются символы \n,
    которые не появились на экране. В чем дело? Эти символы служат директивой начать новую строку на устройстве вывода. Комбинация \n на самом деле представляет собой один символ, называемый "новая строка". Его смысл кратко формулируется так: начать вывод новой строки с самой левой колонки. Другими словами, с помощью этого символа осуществляются те же функции, что и с помощью клавиши [ввод], имеющейся на обычном терминале. Но вы можете сказать, что комбинация \n выглядит, как два символа, а не как один. Вы, конечно же, правы, но просто по смыслу они представляют собой один символ, для которого не существует соответствующей клавиши на клавиатуре. Возникает вопрос: почему для этой цели нельзя использовать клавишу
    [ввод]? В ответ скажем, что это может быть интерпретировано как некоторая директива вашему текстовому редактору, а не как команда, которая должна быть помещена в память ЭВМ. Другими словами, когда вы нажимаете клавишу [ввод], редактор прекращает заполнение текущей строки, с которой вы в данный момент работаете, и начинает новую строку, оставляя старую неоконченной.
    Символ "новая строка" служит одним из примеров того, что называется "управляющей последовательностью". Эта последовательность используется для представления символов,
    которые трудно или вообще невозможно вводить с обычной клавиатуры. Другими примерами служат \t для табуляции и \b для возврата на одну позицию. В любом случае управляющая последовательность начинается со знака \. Мы вернемся к обсуждению этого вопроса в гл. 3.
    Теперь, мы думаем, стало понятно, почему три оператора печати вывели на экран только две строки: аргумент первого оператора не содержал символа "новая строка".
    Вид второй строки, появившейся на экране, может вызвать недоуменный вопрос: почему отсутствуют символы %d, имеющиеся в операторе вывода? Напомним, что напечатанная строка имела следующий вид:
    Мое любимое число1, потому что оно самое первое.
    Вы, наверное, уже догадались - при печати вместо символов %d было подставлено число 1,
    являющееся значением переменной num. По-видимому, комбинация символов %d служит своего рода указателем места в строке, куда необходимо вставить значение переменной num при печати.
    На языке Бейсик аналогичный оператор печати выглядел бы следующим образом:
    25

    PRINT "Мое любимое число" ; num; "потому что оно самое первое".
    На самом деле в языке Си обсуждаемый оператор позволяет сделать несколько больше.
    Символ
    1   2   3   4   5   6   7   8   9   ...   42


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