Главная страница

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


Скачать 32.35 Mb.
НазваниеПрограмма на языке Си, так же как и на большинстве современных языков программирования, создается в два этапа
АнкорЭлектронный конспект по программированию часть 1.doc
Дата04.09.2018
Размер32.35 Mb.
Формат файлаdoc
Имя файлаЭлектронный конспект по программированию часть 1.doc
ТипПрограмма
#24059
страница1 из 12
  1   2   3   4   5   6   7   8   9   ...   12

1. Простейшие программы

Необходимость программирования

Иногда создается впечатление, что все существующие задачи могут быть решены с помощью готовых программ для компьютеров. Во многом это действительно так, но опыт показывает, что всегда находятся задачи, которые не решаются (или плохо решаются) стандартными средствами. В этих случаях приходится писать собственную программу, которая делает все так,как вы этого хотите (или нанимать за большие деньги умного дядю, который способен это сделать).

Два этапа создания программ

Программа на языке Си, так же как и на большинстве современных языков программирования, создается в два этапа

1) трансляция – перевод текста программы в машинные коды;

2) компоновка – сборка частей программы и подключение стандартных функций.



Почему же не сделать все за один шаг? Для простейших программ это действительно было бы проще, но для сложных проектов двухступенчатый процесс имеет явные преимущества:

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

• при исправлении в одном модуле не надо снова транслировать (переводить в машинные коды) все остальные (это могут быть десятки тысяч строк);

• при компоновке во многих системах можно подключать модули, написанные на других

языках, например, на Ассемблере (в машинных кодах).

Трансляторы языка Си называются компиляторами: они переводят (транслируют) сразу

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

Исходный файл программы на языке Си имеет расширение *.с или *.cpp (расширение

*.cpp говорит о том, что в программе могут быть использованы возможности языка Си++).

Это обычный текстовый файл, в который записывают текст программы в любом текстовом редакторе, например, в Блокноте.

Транслятор переводит исходный файл (вернее, записанную в нём программу) в машинные коды и строит так называемый объектный файл с тем же именем и расширением *.o. Хотя в нем уже записан машинный код, объектный файл еще нельзя запускать на компьютере,потому что в нем не хватает стандартных функций (например, для ввода и вывода данных).

Компоновщик подключает стандартные функции, хранящиеся в библиотеках (они имеют

расширение *.a). В результате получается один файл с расширением *.exe, который и представляет собой готовую программу.

Простейшая программа на Си

Такая программа состоит всего из 8 символов. Вот она:

main()

{

}

Основная программа всегда называется именем main (будьте внимательны – Си различает

большие и маленькие буквы, а все стандартные операторы Си записываются маленькими буквами). Пустые скобки означают, что main не имеет аргументов. Фигурные скобки обозначают начало и конец основной программы – поскольку внутри них ничего нет, наша программа ничего не делает, она просто соответствует правилам языка Си, ее можно скомпилировать и получить exe-файл.

Вывод текста на экран

Составим теперь программу, которая делает что-нибудь полезное, например, выводит на

экран слово «Привет».


• Чтобы использовать стандартные функции, необходимо сказать транслятору, что есть

функция с таким именем и перечислить тип ее аргументов – тогда он сможет определить,

верно ли мы ее используем. Это значит, что надо включить в программу описание этой

функции. Описания стандартных функций Си находятся в так называемых заголовочных

файлах с расширением *.h (в каталоге C:\Dev-Cpp\include).

• Для подключения заголовочных файлов используется директива (команда) препроцессо-

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

файла надо использовать новую команду #include.

Для вывода информации на экран используется функция printf. В простейшем случае

она принимает единственный аргумент – строку в кавычках, которую надо вывести на экран.

• Каждый оператор языка Си заканчивается точкой с запятой.

Запуск программы

Чтобы проверить эту программу, надо сначала «напустить» на нее транслятор, который

переведет ее в машинные коды, а затем – компоновщик, который подключит стандартные

функции и создаст исполняемый файл. Раньше все это делали, вводя команды в командной строке или с помощью так называемых пакетных файлов. На современном уровне все этапы создания, трансляции, компоновки, отладки и проверки программы объединены и выполняются внутри специальной программы-оболочки, которую называют интегрированная среда разработки(IDEintegrateddevelopmentenvironment). В нее входят

• редактор текста

• транслятор

• компоновщик

• отладчик

В этой среде вам достаточно набрать текст программы и нажать на одну клавишу, чтобы она выполнилась (если нет ошибок).

В оболочке Dev-C++ для запуска программы надо нажать клавишу F9. Если в программе

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

При поиске ошибок надо помнить, что

• часто ошибка сделана не в выделенной строке, а в предыдущей – проверяйте и ее тоже;

• часто одна ошибка вызывает еще несколько, и появляются так называемые наведенные

ошибки.

Остановка времени

Если запускать рассмотренную выше программу, то обнаружится, что программа сразу

заканчивает работу и возвращается обратно в оболочку, не дав нам посмотреть результат ее работы на экране. Бороться с этим можно так – давайте скажем компьютеру, что в конце работы надо дождаться нажатия любой клавиши.


• Задержка до нажатия любой клавиши выполняется функцией getch().

• Описание этой функции находится в заголовочном файле conio.h.

• Знаки // обозначают начало комментария — все правее них до конца строки не обраба-

тывается транслятором и служит нам для пояснения программы.

• Комментарий также можно ограничивать парами символов /* (начало комментария) и */

(конец комментария). В этом случае комментарий может быть многострочный, то есть состоять из нескольких строк.

2. Переменные

Типы данных и переменные

Для обработки данных их необходимо хранить в памяти. При этом к этим данным надо

как-то обращаться. Обычно люди обращаются друг к другу по имени, такой же способ используется в программировании: каждой ячейке памяти (или группе ячеек) дается свое собственное имя. Используя это имя можно прочитать информацию из ячейки и записать туда новую информацию.

Переменная - это ячейка в памяти компьютера, которая имеет имя и хранит некоторое значение. Значение переменной может меняться во время выполнения программы. При записи в ячейку нового значения старое стирается.

С точки зрения компьютера все данные в памяти – это числа (более точно – наборы нулей и единиц). Тем не менее, вы (и компьютер) знаете, что с целыми и дробными числами работают по-разному. Поэтому в каждом языке программирования есть разные типы данных, для обработки которых используются разные методы. Например,

целые переменные – тип int (от английского integer – целый), занимают 4 байта в памяти;

вещественные переменные, которые могут иметь дробную часть (тип float – от английского floating point – плавающая точка) , занимают 4 байта в памяти

символы (тип char – от английского character – символ), занимают 1 байт в памяти

Любую переменную, которые вы будете использовать в программе, необходимо объявлять сказать компьютеру, чтобы он выделил для неё ячейку памяти нужного размера и присвоил ей имя. Переменные обычно объявляются в начале программы. Для объявления надо написать название типа переменных (int, float или char), а затем через запятую имена всех объявляемых переменных. При желании можно сразу записать в новую ячейку нужное значение, как показано в примерах ниже. Если переменной не присваивается никакого значения, то в ней находится «мусор», то есть то, что было там раньше.

Примеры.


Вычисление суммы двух чисел (ввод и вывод)

Пример. Ввести с клавиатуры два целых числа и вывести на экран их сумму.

Сразу запишем решение задачи на языке Си.


• Программа чаще всего содержит 4 части:

o объявление переменных;

o ввод исходных данных;

o обработка данных (вычисления);

o вывод результата.

• Перед вводом данных необходимо вывести на экран подсказку (иначе компьютер будет

ждать ввода данных, а пользователь не будет знать, что от него хочет машина).

• Символы \n в функции printf обозначают переход в начало новой строки.

• Для ввода данных используют функцию scanf.


Формат ввода – это строка в кавычках, в которой перечислены один или несколько

форматов ввода данных:

%d ввод целого числа (переменная типа int)

%f ввод вещественного числа (переменная типа float)

ввод одного символа (переменная типа char)

oПосле формата ввода через запятую перечисляются адреса ячеек памяти, в которые надо записать введенные значения. Почувствуйте разницу:

a значение переменной a

&a адрес переменной a

o Количество форматов в строке должно быть равно количеству адресов переменных в

списке. Кроме того, тип переменных должен совпадать с указанным: например, если a

и b целые переменные, то следующие вызовы функций ошибочны

scanf ( "%d%d", &a ); куда записывать второе введенное число?

scanf ( "%d%d", &a, &b, &c ); не задан формат для переменной c

scanf ( "%f%f", &a, &b ); нельзя вводить целые переменные по ве-

щественному формату

• Для вычислений используют оператор присваивания, в котором o справа от знака равенства стоит арифметическое выражение, которое надо вычислить

o слева от знака равенства ставится имя переменной, в которую надо записать результат

c = a + b; // сумму a и b записать в c

• Для вывода чисел и значений переменных на экран используют функцию printf


содержание скобок при вызове функции printf очень похоже на функцию scanf

oСначала идет символьная строка — формат вывода — в которой можно использовать

специальные символы

%d вывод целого числа

%f вывод вещественного числа

вывод одного символа

%s вывод символьной строки

\n переход в начало новой строки

все остальные символы (кроме некоторых других специальных команд) просто выводятся на экран.

oОдной строки формата недостаточно: в ней сказано, в какое место выводить данные, но

не сказано, откуда их взять. Поэтому через запятую после формата вывода надо поставить список чисел или переменных, значения которых надо вывести, при этом можно сразу проводить вычисления.

printf ( "Результат: %d + %d = %d \n", a, 5, a+5 );

oТак же, как и для функции scanf, надо следить за совпадением типов и количества переменных и форматов вывода.

Арифметические выражения

Составляющие арифметических выражений

Арифметические выражения, стоящие в правой части оператора присваивания, могут содержать

• целые и вещественные числа (в вещественных числах целая и дробная часть разделяются

точкой, а не запятой, как это принято в математике)

• знаки арифметических действий

+ — сложение, вычитание

* / умножение, деление

% остаток от деления

• вызовы стандартных функций

abs(i) модуль целого числа i

fabs(x) модуль вещественного числа x

sqrt(x) квадратный корень из вещественного числа x

pow(x,y) вычисляет x в степени y

• круглые скобки для изменения порядка действий

Особенности арифметических операций

При использовании деления надо помнить, что

При делении целого числа на целое остаток от деления отбрасывается, таким образом, 7/4 будет равно 1. Если же надо получить вещественное число и не отбрасывать остаток, делимое или делитель надо преобразовать к вещественной форме. Например:

int i, n;

float x;

i = 7;

x = i / 4; // x=1, делится целое на целое

x = i / 4.; // x=1.75, делится целое на дробное

x =(float) i / 4; // x=1.75, делится дробное на целое

n = 7. / 4.; // n=1, результат записывается в

// целую переменную

Наибольшие сложности из всех действий вызывает взятие остатка. Если надо вычислить остаток от деления переменной a на переменную b и результат записать в переменную ostatok,то оператор присваивания выглядит так:

ostatok = a % b;

Приоритет арифметических операций

В языках программирования арифметические выражения записываются в одну строчку,

поэтому необходимо знать приоритет (старшинство) операций, то есть последовательность их выполнения. Сначала выполняются

операции в скобках, затем…

• вызовы функций, затем…

• умножение, деление и остаток от деления, слева направо, затем…

• сложение и вычитание, слева направо.


Специфические операторы присваивания

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

например:

i = i + 1;

Если считать это уравнением, то оно бессмысленно с точки зрения математики. Однако с точки зрения информатики этот оператор служит для увеличения значения переменной i на единицу.

Буквально это означает: взять старое значение переменной i, прибавить к нему единицу и записать результат в ту же переменную i.

Инкремент и декремент

В языке Си определены специальные операторы быстрого увеличения на единицу (инкремента)

i ++; // или...

++ i;

что равносильно оператору присваивания

i = i + 1;

и быстрого уменьшения на единицу (декремента)

i— —; // или...

— — i;

что равносильно оператору присваивания

i = i — 1;

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

Сокращенная запись арифметических выражений

Если мы хотим изменить значение какой-то переменной (взять ее старое значение, что-то

с ним сделать и записать результат в эту же переменную), то удобно использовать сокращенную запись арифметических выражений:


Целые числа

Первым параметром при вызове функций scanf и printf должна стоять символьная

строка, определяющая формат ввода или вывода данных. Для функции scanf, которая выполняет ввод данных, достаточно просто указать один из форматов %d, %f или %c для ввода целого числа, вещественного числа или символа, соответственно. В то же время форматная строка в функции printf позволяет управлять выводом на экран, а именно, задать размер поля, которое отводится для данного числа.

Ниже показаны примеры форматирования при выводе целого числа 1234. Чтобы увидеть

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



Для вывода символов используются такие же приемы форматирования, но формат %d заменяется на %c.

Вещественные числа

Для вывода (и для ввода) вещественных чисел могут использоваться три формата: %f,
  1   2   3   4   5   6   7   8   9   ...   12


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