Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Изучаем Cи (2001) [rus]

.pdf
Скачиваний:
170
Добавлен:
16.08.2013
Размер:
3.13 Mб
Скачать

Перейдите в папку, где находится исходный текст нашей первой программы (пусть он хранится в файле l11.c), наберите в командной строке файловой оболочки две буквы TC, нажмите Enter и на экране монитора появится окно компилятора. Чтобы загрузить в него исходный текст программы, нажмите клавишу ‘F’, в появившемся меню выберите пункт LOAD, далее выберите шаблон *.c и, наконец, сам файл L11.c1. В окне компилятора появится текст программы (рис. 2.1).

Рис. 2.1. Компилятор Turbo C

Как мы уже знаем, перед запуском программу нужно откомпилировать, то есть превратить текст, приведенный на рис. 2.1, в понятную процессору последовательность команд. Но Turbo C устроен так, что компиляция происходит почти мгновенно, а возможность связать исходный текст программы с порожденной им последовательностью машинных команд почти убеждает нас в том, что Turbo C понимает исходный

1 Этот файл с исходным текстом программы можно создать в редакторе Блокнот (Notepad). Программы нельзя писать в редакторе MS Word — там другой формат, непонятный компилятору.

14

текст программы. Действительно, программу можно выполнять по шагам и при этом следить за состоянием любых переменных.

Чтобы, например, следить за переменной first, подведем к ней курсор (как на рис. 2.1), нажмем клавишу Ctrl и, не отпуская ее, нажмем F7 (такая комбинация клавиш обозначается как Ctrl-F7). В результате на экране появится окно с именем переменной. При нажатии Enter переменная окажется в нижней части окна Turbo C, под заголовком Watch

(рис. 2.2).

Рис. 2.2. Следим за переменными

Теперь программу можно выполнить по шагам: каждому нажатию клавиши F8 соответствует один шаг. На рис. 2.2 показано состояние переменных после первого шага, на котором переменной first было присвоено значение 2.

Как видим, переменные second и sum равны на этом шаге 888 и 27668, то есть содержат «мусор». На втором шаге переменная second станет равной 3, а переменная sum попрежнему будет равна 27668. И лишь на третьем шаге sum (убедитесь в этом сами!) станет равной 5, а переменные first

15

и second как были, так и останутся равны 2 и 3 соответственно.

Связь с внешним миром

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

Деревянные глазки, почему вы так странно смотрите на меня?

Но кукла молчала — должно быть потому, что у нее еще не было рта.

А.Толстой, «Приключения Буратино»

Компиляторы, подобные Turbo C, как заботливые няньки следят за каждым шагом программы (для этого существуют клавиша F8 и окно Watch). Это необходимо, пока программа не вышла из детского возраста и еще нуждается в опеке. Но когда она взрослеет и уже хорошо справляется с поставленной задачей, ей предстоит покинуть среду программирования и начать самостоятельную жизнь. Программа должна работать на любом компьютере — независимо от того, есть на нем компилятор Turbo C или нет.

Хорошо знает об этом и компилятор, поэтому он создает специальный файл с расширением .exe. Загляните в папку, где хранится текст нашей первой программы (файл L11.c), и вы увидите там еще два файла — L11.obj и L11.exe. Файл L11.obj — вспомогательный, так называемый объектный файл, создаваемый компилятором. Файл L11.exe и есть та самая скомпилированная программа, которую можно выполнить на любом компьютере, где есть системы DOS или Windows. Чтобы выполнить программу, нужно перейти в содержащую ее папку, набрать на клавиатуре имя L11 и нажать Enter1. Перешли в директорий? Набрали L11? Нажали

Enter? И что?

1 Так запускается программа в файловой оболочке Norton Commander (для системы DOS) и FAR (для Windows 95/98).

Можно воспользоваться и Проводником (Explorer) в системе

16

А ничего. Молчание. И это понятно — ведь в нашей первой программе нет никакой связи с внешним миром. Пока о программе заботился компилятор, мы могли следить за тем, что творится у нее внутри. Но когда программа попыталась жить самостоятельно, выяснилось, что она еще не умеет говорить — совсем как Буратино, которому папа Карло не успел вырезать рот.

Чтобы заставить программу говорить, необходимо дополнить ее функцией printf() и строкой #include <stdio.h>1

(см. листинг 2.1).

Листинг 2.1 Программа, которая умеет говорить

#include <stdio.h>

main(){

int first, second, sum;

first=2;

second=3;

sum=first+second;

printf("Сумма=%d\n",sum);

}

Загрузив программу, показанную в листинге 2.1 в Turbo C и скомпилировав ее простым нажатием клавиши F9, получим exe-файл, запустив который увидим на экране компьютера:

Сумма=5

Значит, добавленная нами строчка

printf("Сумма=%d\n",sum);

Windows. Для этого перейдите в нужную папку и запустите программу двойным щелчком мыши.

1 Об этой строке поговорим чуть позже

17

выводит на экран символы Сумма= и само значение переменной sum (в нашем случае символ ‘5).

С помощью printf() можно выводить на экран самые разные сообщения, например, вывод слова «Мама» выглядит следующим образом:

printf("МАМА");

причем курсор остается справа от последней буквы ‘А’. Чтобы курсор оказался в начале следующей строчки, добавим в конец фразы символ перевода строки '\n':

printf("МАМА\n");

Строка printf("Сумма=%d\n",sum) в программе,

показанной в листинге 2.1, устроена чуть сложнее. Кроме букв и управляющего символа '\n' в ней есть еще значок %d. Это шаблон, который обозначает место выводимой на экран переменной (переменная sum будет показана сразу за символами «Сумма=»), причем это будет целое число (буква d задает печать переменной целочисленного типа). Сама переменная указывается правее и отделяется от других знаков, заключенных в кавычки "", запятой.

С помощью printf()можно выводить на экран значения нескольких переменных. Для этого нужно сначала поместить в кавычки символы и шаблоны для этих переменных, затем поставить запятую и сами переменные, также разделенные запятыми. Чтобы, например, вывести на экран значения переменных first, second, sum, соответствующая строка программы должна выглядеть так:

printf("first=%d second=%d sum=%d\n", first, second, sum);

Врезультате мы получим на экране first=2 second=3 sum=5

Функция printf(), с которой мы только что познакомились, похожа на отдельную программу. На ее вход поступают аргументы, разделенные запятыми. В функции

printf("МАМА\n");

18

всего один аргумент — последовательность символов, заключенная в кавычки. В функции printf(), выводящей три переменные, уже четыре аргумента, один из которых — это строчка в кавычках, содержащая текст и шаблоны, а три других — разделенные запятыми названия переменных. Аргументы огораживаются в функции круглыми скобками (). Если посмотреть в начало нашей программы, то станет ясно, что main() — это тоже функция, которой можно передавать аргументы, но о том, что это за аргументы и для чего их нужно передавать, мы узнаем чуть позже.

А теперь вернемся к первой строчке листинга 2.1

#include <stdio.h>

Этой строчки не было в нашей первой программе и легко догадаться, что ее появление связано с функцией printf().

Дело в том, что в языке Си все переменные и функции должны быть описаны, иначе компилятор не сможет правильно перевести программу в понятную процессору последовательность команд. До начала работы с переменными компилятор должен знать их тип, иначе он не поймет, сколько ячеек памяти выделять под переменную и как кодировать хранящееся в ней двоичное число. То же самое относится и к функциям. Чтобы правильно обращаться с функцией, компилятор должен знать, какие аргументы ей могут передаваться и как воспользоваться результатами ее работы. Поэтому каждая функция должна быть описана еще до того, как компилятор встретит ее в тексте программы. Если вы сами создаете функцию (а в языке Си это вполне возможно), то сами же должны ее описать. Но если функция стандартная, ее описание хранится в специальном файле. Так, описание printf() хранится в файле stdio.h. Этот файл — неотъемлемая часть компилятора, который, встретив строчку

#include <stdio.h> ,

находит файл stdio.h и вставляет его в текст программы (именно туда, где стоит #include (включить), а уж потом превращает программу, написанную на языке Си в последовательность команд процессора.

19

Простые вычисления

Когда в Самоа были открыты начальные школы, туземцы буквально помешались на арифметических вычислениях. Отложив в сторону копья и луки, они расхаживали, вооруженные грифельными досками и карандашами, предлагая друг другу и гостям из Европы простейшие арифметические задачи. Достопочтенный Фредерик Уолпол сообщает, что его пребывание на прекрасном острове было омрачено бесконечными умножениями и делениями.

Р. Бриффолт

Компьютер, как и туземцы с острова Самоа, умеет не только складывать числа, но и вычитать, умножать, делить. Для выполнения этих действий в языке Си используются обычные знаки арифметических операций. Программа из листинга 2.2, выполняет простые арифметические действия, а также получает остаток от деления одного числа на другое.

Листинг 2.2

/* простые арифметические действия */ #include <stdio.h>

main(){

int fst = 2, scnd = 3; int df,prd,qt,rm;

df = fst - scnd; prd = fst * scnd; qt = fst / scnd; fst = 123;

scnd = 17;

rm = fst % scnd;

/* rm - остаток от деления fst на scnd */ printf("%d %d %d %d\n",df,prd,qt,rm);

20

}

Результат работы этой программы — четыре числа:

-1 6 0 4

Первое число (-1) получается в результате вычитания 3 из 2, второе (6) — результат умножения 2 на 3, третье (0) — частное от деления 2 на 31. Вообще-то, мы привыкли, что 2/3=0.6666…., но все наши переменные — целочисленные, поэтому при присваивании результата деления переменной qt автоматически берется целая часть результата, и поэтому получается ноль. Четвертая цифра (4) есть остаток от деления 123/17. Легко проверить, что 123=17*7+4, то есть остаток действительно равен четырем.

В листинге 2.2 кроме знаков новых арифметических действий нам встретилась еще одна ранее незнакомая конструкция —

слова, обрамленные значками /**/. Это комментарии. Компилятор игнорирует все символы, встреченные после наклонной черты и идущей следом звездочкой. Делает он это до тех пор, пока не встретит звездочку и идущую следом косую черту.

Комментарии помогают понять, что делает программа. Начинающие программисты часто ленятся писать комментарии, не понимая, что программа быстро забывается и уже через несколько месяцев никто, даже автор, не сможет понять, что она делает.

Задача 2.1 Поиграйте в туземцев с острова Самоа. Посмотрите, как работает программа из листинга 2.2 с другими значениями переменных fst и scnd. Что получится, если fst=1000, a scnd=800? Проверьте результат работы программы с помощью калькулятора. Найдите значение произведения fst*scnd, при котором программа еще выдает

1 Значения хранятся в переменных до тех пор, пока мы сами их не поменяем. От того, что переменную fst прочитали в инструкции df = fst - scnd, ее значение не меняется. Читать переменную можно сколько угодно раз

21

правильный результат. Если это удалось, попробуйте догадаться, сколько бит в переменной типа int.

В чем преимущество программ

Огромной скоростью компьютеров можно воспользоваться только лишь с помощью программ, в которых большое число действий задается небольшим количеством строк.

Представим себе, что преподаватель информатики решил «занять» класс на некоторое время и предложил написать программу, которая складывает все числа от единицы до 100. Эта программа может выглядеть так:

#include <stdio.h> main(){

int sum; sum =0;

sum += 1; /* прибавить к sum единицу */ sum += 2; /* прибавить к sum двойку */ sum += 3; /* прибавить к sum тройку */

-----------

sum += 100; /*прибавить к sum сотню */ #printf("Сумма=%d/n", sum);

}

Каждая строка sum += i — это команда прибавить к переменной sum число i. Эту команду можно записать и как sum = sum + i1, но sum += i короче и понятнее.

1 Запись sum=sum+i означает, что к переменной sum прибавляется переменная i и результат снова отправляется в перемнную sum. То есть, ‘=’ означает в Си не равенство, как в алгебре, а присваивание

22

Программу, набросок которой я только что показал, не так-то просто написать, потому что она состоит более чем из 100 строк, ни одна из которых не повторяется. Но 100 строк, в которых подсчитывается сумма, можно представить как последовательность одинаковых групп команд:

#include <stdio.h>

 

main(){

 

 

int

sum,i;

 

 

sum

= 0;

 

 

i =

0;

 

 

sum

+= i; /* прибавить к sum

i */

i += 1;

/* прибавить к i единицу

*/

-------------

/* повторить sum+=1; i+=1; еще 99 раз */ #printf("Сумма=%d/n", sum);

}

Такую программу уже проще написать, если использовать возможности практически любого текстового редактора копировать фрагменты текста1. Но представим себе, что нужно будет сложить не 100, а тысячу или даже миллион чисел! Ясно, что в программе должна быть конструкция, позволяющая повторить одни и те же вычисления любое число раз. В языке Си этому служит цикл while()(пока или до тех пор, пока). Чтобы понять, как он работает, попробуем решить задачу

1 В Turbo C нужно сначала пометить блок текста: подвести курсор к его началу, нажать Ctrl-K, затем B, подвести курсор к концу блока, нажать Ctrl-K, затем K. После того как блок помечен, подведите курсор к тому месту, куда нужно скопировать блок и нажмите Ctrl-K, затем C.

23

Соседние файлы в предмете Программирование на C++