Язык Си - Уэйт, Прата, Мартин. M. уэит с. Прата д. Мартин
Скачать 4.69 Mb.
|
% сигнализирует программе, что, начиная с этой позиции, необходимо напечатать число, a d указывает, что переменную необходимо печатать в десятичном формате. Функция printf( ) предоставляет возможность выбора соответствующего формата для печати переменных. Буква f в имени функции printf( ) фактически служит напоминанием, что это оператор печати с заданным форматом. СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ Далее Содержание Теперь, после того как мы привели конкретный пример, вы готовы к тому, чтобы познакомиться с несколькими общими правилами, касающимися программ, написанных на языке Си. Программа состоит из одной или более функций, причем какая-то из них обязательно должна называться main( ). Описание функции состоит из заголовка и тела. Заголовок в свою очередь состоит из директив препроцессора типа #include и т. д. и имени функции. РИС. 2.4. Структура функции в языке Си: заголовок и тело. Отличительным признаком имени функции служат круглые скобки, причем аргумент, вообще говоря, может отсутствовать. Тело функции заключено в фигурные скобки и представляет собой набор операторов, каждый из которых оканчивается символом "точка с запятой". В нашем примере тело состояло из оператора описания, в котором объявлялись имя и тип используемой переменной, оператора присваивания, с помощью которого переменная получила некоторое значение, и, наконец, трех операторов печати, каждый из которых представляет собой вызов функции printf( ). НЕСКОЛЬКО СОВЕТОВ, КАК СДЕЛАТЬ ПРОГРАММУ ЧИТАЕМОЙ Далее Содержание Создание читаемой программы служит признаком хорошего стиля программирования. Это приводит к облегчению понимания смысла программы, поиска ошибок и в случае необходимости ее модификации. Действия, связанные с улучшением читаемости программы, кроме того, помогут более четко понять, что программа делает. На протяжении всего изложения мы будем пытаться указывать полезные приемы, способствующие достижению этой цели. Мы уже упоминали о двух таких способах: выбор осмысленных обозначений для переменных и использование комментариев. Заметим, что эти два метода дополняют друг друга. Если вы дали переменной имя width (ширина), то необходимость в комментарии, сообщающем о том, что данная переменная определяет ширину, отпадает. 26 Еще один прием состоит в использовании пустых строк для того, чтобы отделить одну часть функции, соответствующую некоторому семантическому понятию, от другой. Например, в нашей простой программе одна пустая строка отделяет описательную часть от выполняемой (присваивание значения и вывод на печать). Синтаксические правила языка Си не требуют наличия пустой строки в данном месте, но поскольку это стало уже традицией, то и мы делаем также. Четвертый принцип, которому мы следуем, заключается в том, чтобы помещать каждый оператор на отдельной строке. Опять же это только соглашение, которое никак не регламентируется правилами языка, так как Си имеет "свободный формат". Вы можете поместить несколько операторов на одной строке или распространить один оператор на несколько строк. Нижеследующий пример является абсолютно правильной программой: main( ) { int four; four = 4; printf(" %d \n", four); } Совершенно очевидно, что символ "точка с запятой" указывает компилятору, где кончается один оператор и начинается следующий, но логика программы окажется проще, если вы последуете соглашениям, приведенным выше. Поскольку в нашем примере запутанной логики нет, вид программы в данном случае не влияет на понимание ее смысла, но, по нашему мнению, лучше прививать хорошие привычки с самого начала. РИС. 2.5. Способы улучшения читаемости программы. СЛЕДУЮЩИЙ ШАГ Далее Содержание Наша первая программа была довольно простой, и следующий пример будет ненамного сложнее. Он выглядит так: main( )/* Переводит 2 морские сажени в футы*/ 1) { int feet, fathoms; fathoms = 2; feet = 6 *fathoms; printf (" В %d морских саженях содержится %d футов!" , feet, fathoms); } Что здесь нового? Во-первых, мы описали две переменные вместо одной. Для этого потребовалось только разделить в операторе описания имена двух переменных запятой. Во-вторых, мы выполнили вычисления - использовали громадную вычислительную мощность 27 нашего компьютера для умножения 2 на 6. В Си, так же как и во многих других языках, символ * обозначает умножение. Поэтому смысл оператора feet = 6 *fathoms; заключается в следующем: взять величину переменной fathoms, умножить ее на 6 и присвоить результат переменной feet. (Судя по этой парафразе, обычный английский язык менее лаконичен, чем простой язык Си; это одна из причин, лежащих в основе разработки языков программирования.) И наконец, мы использовали функцию printf( ) более сложным образом. Если вы выполните эту программу на компьютере, то результат должен выглядеть так: Можно заметить, что было произведено две подстановки: первое вхождение символов %d в строку, заключенную в кавычки, было заменено значением первой переменной (fathoms) из списка, следующего за указанной строкой, а второе - значением второй переменной (feet) из этого же списка. Обратите внимание, что список печатаемых переменных расположен в конце оператора. Область применения данной программы несколько ограниченна, но она может послужить прообразом программы перевода морских саженей в футы. Все, что нам потребуется - специальный способ присваивания произвольных значений переменной feet; о том, как это делается, вы узнаете несколько позже. ДОПОЛНИТЕЛЬНЫЙ ПРИМЕР Далее Содержание Здесь мы приведем еще один пример. До сих пор в наших программах использовалась только стандартная функция printf( ). В данном разделе мы хотим продемонстрировать, как включить в программу 2) и использовать функцию, которую вы сами написали. main( )/* butler*/ { printf("Я вызываю функцию butler.\n"); butler( ); printf ("Да. Принесите мне чашку чая и гибкие диски.\n"); } butler( ) { printf("Bы вызывали, сэр?\n"); } Результаты работы программы выглядят следующим образом: Я вызываю функцию butler. Bы вызывали, сэр? Да. Принесите мне чашку чая и гибкие диски. Функция butler( ) определяется точно так же, как и функция main(); ее тело заключено в фигурные скобки. Вызов функции осуществляется путем простого указания ее имени, включая круглые скобки. Мы вернемся к этому важному вопросу только в гл. 9, а здесь хотели продемонстрировать ту легкость, с которой вы можете включать в программу свои собственные функции. ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ Далее Содержание Ниже приведена краткая сводка строгих правил (но не чрезмерно жестких), которые, мы надеемся, вы усвоили. Мы включили сюда же краткие примеры. 28 Как назвать файл, содержащий вашу программу: eye.с, или black.с, или infan.c и т. п. Какое имя можно использовать в качестве названия программы, состоящей из одной функции: main(). Структура простой программы: заголовок, тело, фигурные скобки, операторы. Как описать целую переменную: int varname; Как присвоить значение переменной: varname = 1024; Как напечатать фразу printf ("Хотите купить утку?"); Как напечатать значение переменной: printf ("%d", varname); Символ новая строка: \n Как включать комментарии в программу: /*анализ движения наличных денег*/ ВОПРОСЫ И ОТВЕТЫ Ниже приведено несколько вопросов, которые помогут вам проверить и расширить свое понимание материала данной главы. Вопросы 1. Икабод Боуди Марфут (ИБМ) 3) подготовил программу, приведенную ниже, и принес ее вам для проверки. Пожалуйста, помогите ему найти в ней ошибки. include studio, h main{} /*эта программа печатает число недель в году/* ( int s s: = 56; print (В году s недель.); 2. Что будет напечатано в каждом из примеров, приведенных ниже, в предположении, что они являются частями некоторых полных программ? a. printf(" Б-э-э Б-э-э, Черная Овца."); а. printf("У тебя есть шерсть?\n"); б. рrintf("Убирайся!\n Мешок сала!"); в. printf("Что?\n Нет/n Кларнет?\n"); г. int num; num = 2; printf(" %d + %d = %d", num, num, num + num); Ответы 1. Строка 1: данная строка должна начинаться с символа # правильное написание имени файла - stdio.h; имя файла должно быть заключено в угловые скобки. Строка 2: вместо фигурных скобок {} необходимо использовать круглые ( ); комментарий должен оканчиваться символами */, а не /* Строка 3: 29 вместо круглой скобки ( должна стоять фигурная {. Строка 4: оператор должен оканчиваться символом "точка с запятой". Строка 5: эту строку (пустую) м-р ИБМ написал Совершенно правильно! Строка 6: в операторе присваивания необходимо использовать символ =, а не :=. (К сожалению, м-р ИБМ имеет представление о языке Паскаль.) В году 52 недели, а не 56. Строка 7: оператор должен выглядеть так printf ("В году %d недель. \n", s); Строка 8: отсутствует, но она обязательно должна быть и содержать закрывающую фигурную скобку - }. 2. а. Б-э-э Б-э-э. Черная Овца. У тебя есть шерсть? (Заметим, что пробел после точки отсутствует. Для того чтобы поместить в это место пробел, необходимо было вместо "У тебя" писать " У тебя") б. Убирайся! Мешок сала! (Отметим, что курсор теперь находится в конце второй строчки.) в. Что? Нет /n Кларнет? Заметим, что символ (/) производит не тот же эффект, как символ (\) г. 2 + 2 = 4 (Отметим, что каждое вхождение комбинации символов %d в строку заменяется значением соответствующей переменной из списка. Заметим также, что символ + означает сложение и что таким образом вычисления могут быть проведены "внутри" оператора printf( ).) УПРАЖНЕНИЯ Чтобы изучить язык Си, одного только чтения недостаточно. Вы должны попробовать сами написать одну или две простые программы и посмотреть, пройдет ли все так же гладко, как это может показаться в результате чтения данной главы. Мы хотим предложить вам несколько идей, но, если желаете, вы можете воспользоваться своими собственными соображениями на этот счет. 1. Напишите программу, печатающую ваше имя. 2. Напишите программу, печатающую ваши имя и адрес, используя три или более строк. 3. Напишите программу, которая укажет ваш возраст, данный в годах, в днях. Не усложняйте ее, учитывая високосные и невисокосные годы. 1) 1 морская сажень = 1,83 м; 1 фут = 30,5 см. - Прим. ред. 2) В программе используется слово butler (англ.) - дворецкий. - Прим. перев. 3) Аббревиатура этого шутливого имени совпадает с аббревиатурой названия крупнейшей американской фирмы по выпуску вычислительной техники ИБМ (IBM). - Прим. ред. 30 int, short, long, unsigned, char, float, double, sizeof Программы имеют дело с данными. Мы вводим в компьютер числа, буквы и слова и ожидаем, что он будет проводить над ними какие-то операции. В этой и следующей главах мы сосредоточим наше внимание на данных различных типов и их свойствах. В соответствии с этим мы будем последовательно останавливаться на каждом из типов и смотреть, как их можно использовать. Но, по скольку заниматься одним только обсуждением представляется нам не очень веселым делом, мы рассмотрим также небольшие про граммы обработки данных. Эта глава в основном посвящена обсуждению двух важнейших классов типов данных целым числам и числам с плавающей точкой. Язык Си предоставляет программисту возможность использовать несколько разновидностей этих типов Мы займемся изучением следующих вопросов что такое типы данных, как их описать, как и когда их использовать. Кроме того, мы обсудим различия между константами и переменными. Теперь, так же как прежде, пришло время рассмотреть какую нибудь простую программу. Возможно, вы обнаружите в ней какие-то непонятные места Мы постараемся разъяснить их вам при последующем обсуждении в данной главе Общий смысл про граммы должен быть достаточно понятен, поэтому попробуйте осуществить компиляцию и выполнить эту программу 1) . Для экономии времени можете опустить комментарии при вводе программы в машину. (Замечание: мы включили имя программы в ее со cтав как комментарий, в дальнейшем, приводя программы, будем придерживаться этого правила ). /*Ваш золотой эквивалент*/ /*определение стоимости количества золота, равного вашему весу*/ main( ) { float weight, value, /* 2 переменные с плавающей точкой */ char beep; /* символьная переменная */ beep = ' /007' ; /* присваивание специального символа переменной beep */ printf(" Стоите ли вы своего веса в золотом эквиваленте? \n"); printf(" Укажите, пожалуйста, свой вес в фунтах и узнаете \n"); scanf("%f ", &weight;); /* получение данных */ value= 400.0 *weight*14,5833; /* предполагаемая цена золота - 400 долл за тройскую унцию */ /* коэффициент 14,5833 служит для перевода в тройские унции */ printf(" %c Стоимость вашего веса в золотом эквиваленте $%2,2 f%c.\n", beep, value, beep); printf("Bы несомненно стоите столько' Если цена золота упадет,"); printf(" ешьте больше, \n чтобы сохранить свою стоимость \n"); } При вводе этой программы в компьютер вы можете захотеть заменить число 400.00 величиной текущей цены золота. Мы надеемся, однако, что вы не будете пускаться на обман, заменяя число 14,5 833, равное числу унций в фунте (Речь идет об унциях в тройской системе мер, применяемой при взвешивании благородных металлов, и фунтах в обычной системе мер, используемой при взвешивании всего остального). Заметим, что слова "укажите свой вес" означают, что необходимо набрать на клавиатуре число, выражающее вес, и нажать клавишу "ввод" или "возврат" (Не надо только вставать на клавиатуру!) Нажав эту клавишу, вы тем самым сообщаете компьютеру, что вы уже закончили ввод. Данная программа имеет также некоторую незаметную на первый взгляд особенность. Чтобы обнаружить ее и понять, в чем дело, вы должны сами запустить эту программу; имя одной из переменных служит довольно недвусмысленным намеком. Что нового содержится в этой программе? 31 1. По-видимому, вы уже заметили, что мы ввели описание двух новых типов переменных. До этого мы использовали только целые переменные, а теперь добавили переменные с плавающей точкой и символьные переменные, так что теперь мы можем обрабатывать данные более общего вида. 2. Мы использовали в программе несколько новых способов задания констант. Теперь мы умеем вводить в программу числа с десятичной точкой и знакомы с довольно специфическим способом представления значения символьной переменной beep. 3. Для вывода на печать этих переменных нового типа в операторе printf( ) мы использовали спецификации %f и %с, соответствующие переменной с плавающей точкой и символьной переменной. Модификаторы в спецификации %f применяются для улучшения вида результата на экране дисплея. 4. Возможно, самой существенной новой особенностью является то, что эта программа "диалоговая". Компьютер запрашивает У вас информацию, а затем использует число, которое вы ввели. Работать с диалоговой программой гораздо интереснее, чем с программами недиалогового типа, которые мы использовали до этого. Более важным является еще и то, что такой подход позволяет нам создавать более гибкие программы. Например, нашу программу можно использовать при задании любого веса (конечно, в разумных пределах), а не только веса в 175 фунтов. Нам не нужно переписывать программу всякий раз, когда мы захотим обработать вес еще одного человека. Функции scanf( ) и printf( ) делают это вполне возможным. Функция scanf( ) читает данные, набираемые на пульте дисплея, и вводит их в программу. В гл. 2 мы уже видели, что функция printf( ) читает данные из программы и выводит их на экран. Вместе эти две функции позволяют установить двустороннюю связь с вашей программой, что делает общение с компьютером гораздо более приятным. В данной главе мы рассмотрим два первых пункта - переменные и константы различных типов данных. Оставшиеся два пункта мы обсудим в следующей главе, но функции scanf( ) и printf( ) будем использовать по-прежнему. ДАННЫЕ: ПЕРЕМЕННЫЕ И КОНСТАНТЫ Далее Содержание Компьютер, выполняя программу, может заниматься разнообразной деятельностью. Он может складывать числа, сортировать имена, заниматься распознаванием речи и изображения на экране видеодисплея, вычислять орбиты комет, подготавливать список почтовых адресов абонентов, чертить фигуры, делать логические выводы или что-нибудь еще, что только вы можете себе представить. Чтобы заниматься всем этим, программам необходимо работать с "данными" - числами и символами, т. е. объектами, которые несут в себе информацию, предназначенную для использования. Некоторые данные устанавливаются равными определенным значениям еще до того, как программа начнет выполняться, а после ее запуска сохраняют такие значения неизменными на всем протяжении работы программы. Это "константы". Другие данные могут изменяться, или же им могут быть присвоены значения во время выполнения программы; они называются "переменными". (Мы уже использовали данный термин в предыдущей главе, но формально вы зна-комитесь с ним только здесь.) В нашей простой программе weight - это переменная; число 16.0 - константа. Что можно скаэать по поводу числа 400.00? Совершенно очевидно, что в действительности цена золота не остается неизменной, но в нашей программе мы считаем ее константой. Различие между переменной и константой довольно очевидно: во время выполнения программы значение переменной может быть изменено (например, с помощью присваивания), а значение константы - нет. Указанное различие приводит к тому, что обработка переменных компьютером оказывается немного сложнее и требует больше времени, чем обработка констант, но, несмотря на это, он вполне справляется с такой деятельностью. |