Мегаобучалка Главная | О нас | Обратная связь


Структура простой программы на Си



2019-12-29 139 Обсуждений (0)
Структура простой программы на Си 0.00 из 5.00 0 оценок




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

#include<stdio.h>

main( )              /*Простая программа*/

{

 int num;

 

num=1;

printf(“Я простая”);

printf(“вычислительная машина.\n”);

printf(“Мое любимое число %d , потому что оно самое первое.\n”,num);

}

    Результат работы программы на экране выглядит следующим образом:

    Я простая вычислительная машина.

    Мое любимое число 1, потому что оно самое первое.

Сделаем просмотр исходного текста программы. 

#include<stdio.h> - включение текстового файла.

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

main() – имя функции.

Любая программа на Си состоит из одной или более функций, являющихся основными модулями из которых она собирается. Наша программа состоит из одной функции main, круглые скобки указывают на то, что main() – имя функции.

/* Простая программа*/ - комментарий.

Комментарий – это примечание, помогающее понять смысл программы. Они предназначены для читателя и игнорируются компилятором.

{ - начало тела функции.

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

int num ; - оператор описания.

С помощью такого оператора мы объявляем, что в программе будет использоваться переменная num , принимающая целые (int) значения.

num=1; - оператор присваивания.

Этот оператор присваивает переменной num значение 1.

printf(“Я простая”); - оператор вывода на дисплей.

С его помощью выводится на дисплей фраза , заключенная в кавычки – Я простая.

printf(“вычислительная машина.\n”); - оператор вывода на дисплей.

Этот оператор добавляет слова : вычислительная машина в конце предыдущего вывода. Комбинация символов \n указывает функции printf  на начало новой строки.

printf(“Мое любимое число %d , потому что оно самое первое.\n”,num); - оператор вывода на дисплей.

Этот оператор выводит на дисплей значение переменной num

( равное 1), содержащееся во фразе в кавычках. Символы %d указывают функции printf где и в какой форме выводить значение этой переменной num.

} – конец определения (тела) функции.

Закрывающей фигурной скобкой заканчивается текст программы.

Основные элементы программирования

    Целью большинства программ является обработка данных на ЭВМ по алгоритму, заданному программой. Таким образом для решения задачи (обработки данных) необходимо:

- ввести информацию (данные) в программу (ЭВМ);

- иметь (задать) место в основной памяти для хранения данных;

- задать инструкции (программу) по обработке данных;

- вывести обработанные данные (результат) из программы пользователя (ЭВМ) на внешние машинные носители.

Инструкции по обработке данных можно организовать таким образом, что :

- некоторые из них выполняются только тогда, когда какое-либо условие (набор условий) истинно;

- другие повторяются некоторое число раз;

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

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

Вывод - означает запись информации (данных) на экран дисплея, магнитный диск или в порт ввода-вывода.

Типы данных – это константы, переменные и структуры, которые содержат числа (целые и с плавающей точкой), текст (символы и строки), адреса (переменных и структур).

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

    Ввод – означает чтение (ввод) данных с клавиатуры, магнитного диска или порта ввода-вывода.

    Условное выполнение – выполнение определенного набора инструкций, если указаны условие (выражение) истинно, или пропуск данного набора инструкций, если условие ложно.

    Циклы – выполнение набора инструкций определенное число раз или пока некоторое условие (выражение) истинно.

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

   

Вывод

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

printf (<форматная строка>,<аргумент>,<аргумент>,…);     

Форматная строка – это строка, которая начинается и заканчивается двойными кавычками (“вот так”). Целью функции printf является вывод этой строки на экран. До вывода аргументы функции преобразуются в соответствии со спецификаторами формата, указанными в форматной строке. Например,

    printf (“Сумма равна %d \n”, sum);

 Последовательность %d в форматной строке является спецификатором формата. Все спецификаторы формата начинаются со знака процента (%) за которым следует обычно одна буква, указывающая тип данных и способ форматирования этих данных.

    Для каждого спецификатора формата должен быть указан только один аргумент. Аргументами могут быть переменная , константы, выражения или вызовы функций. Спецификатор %d означает , что аргумент является целым. Ниже приведены наиболее часто используемые спецификаторы форматов:

    %u – беззнаковое целое

    %p – значение указателя

    %f – с плавающей точкой

    %e – с плавающей точкой в экспоненциальной форме

    %c - символ

    %s - строка

    %x – целое в шестнадцатиричном формате.

    Ширина поля может быть указаны цифрой, помещенной между знаком % и буквой. Например, десятичное поле шириной 4 символа будет указано так: %4d. Значение будет напечатано выровненным вправо. Итак, между знаком % и буквой можно поместить модификаторы спецификации преобразования. Если одновременно используются несколько модификаторов, то они должны быть указаны в порядке приведенным ниже:

Модификатор                   Значение

_                               Аргумент будет печататься с левой позиции

                                 (%_10d)

строка цифр            Задает минимальную ширину поля (%4d).

Большее поле используется если число не помещается в исходном поле

строка цифр               Определяет точность для данных с плаваю

щей точкой, т.е. число цифр справа от десятичной точки (%4.2f)

l                                Соответствующий элемент данных имеет

тип long, а не int (%ld).

    Последовательность \n не является спецификатором формата, а представляет собой символ перехода на новую строку, поэтому после вывода строки на экран маркер переходит в начало следующей строки.

    Для вывода на экран строковых данных используется функция puts , имеющая формат:

puts (“Здравствуй, мир”); 

 Эта функция выводит на экран строку, оканчивающуюся символом перехода на новую строку. Обратите внимание, что символ \n в конце выводимой строки отсутствует, так как он добавляется самой функцией.

    Функция putchar выводит на экран один символ и не добавляет символ \n. Функция имеет формат:

    putchar (‘символ’);

Char x;

putchar (x); эквивалентна printf (“%c”, x);

 

Лекция 12

 

Типы данных

    Данные, обрабатываемые в ЭВМ, могут быть числами и символами. Некоторые данные устанавливаются равными определенным значениям еще до того, как программа начнет выполняться, а после ее запуска сохраняют эти значения неизменными на всем протяжении работы программы – это константы. Другие данные могут изменяться, или же им могут быть присвоены значения во время выполнения программы – это переменные. Тип константы компилятор распознает по виду ее присутствия в программе, а тип переменной должен быть объявлен в программе с помощью оператора описания.

Данные в Си могут быть четырех основных типов: целые числа, числа с плавающей точкой, текст и указатели:

- целые числа – это числа, используемые для счета (1,-21,752)

- числа с плавающей точкой имеют дробную часть (3.14159) или экспоненту (2.579Е+24)

- текст состоит из символов (‘a’,’H’,’s’) и строк (“Привет”)

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

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

словом int, а также short int и long int. В Турбо-Си эти типы данных занимают 16 бит (short), 16 бит (int), 32 бита (long). Переменную целого типа можно объявить беззнаковой с помощью модификатора unsigned, например,

 unsigned int х;    

    Данные с плавающей точкой в Си описываются типом float (32 бита) или double (64 бита).

    Тип данных char (8 бит) определяет целые числа без знака в диапазоне от 0 до 255. Обычно такое целое размещается в одном байте памяти. В ЭВМ используется код ASCII для перевода этих чисел в символы и обратно. Таблица кода ASCII  позволяет представлять в памяти машины 256 различных символов (вводимых с клавиатуры или выводимых на печать). Для описания символьных переменных применяется ключевое слово char , например,

    char x,y;

    char z = ‘s’;       

Символьные константы в программе пишутся в апострофах (z = ‘t’;).

    Символьная строка – это последовательность из одного или более символов. Например,

    “Строка символов”.

Язык Си не поддерживает отдельный строковый тип данных, но позволяет определять строки двумя способами.

    В первом способе используется массив символов, например,

char msg[30];

Число [30] в квадратных скобках после идентификатора msg указывает компилятору на необходимость зарезервировать место для 29 символов, т.е. организовать массив из 29 переменных типа char

(30-м символом будет нулевой символ \0, который называется нуль-символ и отмечает конец строки). Сама переменная msg не содержит символьного значения, в ней находится адрес ячейки памяти в которой хранится первая из 29 переменных типа char.

    Из-за зависимости от нулевого символа строки в языке Си называются “заканчивающиеся нулем”, т.е. они представляют из себя последовательность символов за которой следует нулевой символ. Такая трактовка строк позволяет снять ограничения на длину строки.

    Во втором способе используется указатель или ссылка на символ. Например,

    char *msg;  

Звездочка перед идентификатором msg сообщает компилятору о том, что msg является ссылкой на символ. Другими словами, в переменную msg (ее формат – p, т.е. тип указатель) может быть записан адрес некоторого символа. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную msg конкретным адресом.

    Имена, которые присваиваются константам, типам данных, переменным и функциям известны как идентификаторы. Приведем примеры идентификаторов:

 - char, int, float    - предопределенные типы данных;

 - main             - основная функция программы;

 - msg, x, y            - переменные, определенные пользователем;

 - printf, puts         - библиотечные функции.

    Все идентификаторы должны начинаться с буквы (a…z или A…Z) или с символа подчеркивания ( _ ). В идентификаторе могут использоваться и цифры. Идентификаторы зависят от регистра, т.е. компилятор различает буквы верхнего и нижнего регистра. Например, следующие 3 идентификатора: indx, Indx, INDX различны. Идентификаторы различаются по первым 32 символам.

 

Лекция 13

Операторы

    Для манипуляции данными в языке Си имеются многочисленные операторы.

    Оператор присваивания имеет формат:

      Переменная= выражение;

В языке Си присваивание обозначается знаком равенства ( = ).

Семантика оператора – значение выражения правой стороны присваивается переменной с левой стороны в качестве нового значения.

    Язык Си поддерживает стандартный набор бинарных арифметических операций:

умножение  - ( * )

деление        - ( / )

взятие остатка – (%)

сложение     - ( + )

вычитание   - ( - )

и операцию унарного минуса ( a + ( - b ) ), которая выполняет дополнение до двух.

    Оператор инкремента ( ++ ) позволяет добавить единицу к любому значению, а оператор декремента ( -- ) – вычесть единицу.

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

Кроме того, можно определить, будут ли они выполняться до или после вычисления всего выражения. Рассмотрим две строки:

    sum = a + b++;

    sum = a + ++b;

Первая строка производит следующие действия: складываются значения переменных a и b, результат вычисления присваивается переменной sum, затем переменная b увеличивается на единицу. Вторая строка делает следующее: значение b увеличивается на единицу, значение a складывается с b, результат сложения присваивается переменной sum.

    В языке Си имеются следующие побитовые операторы:

cдвиг влево -  ( << )

сдвиг вправо – ( >> )

И – ( & )

ИЛИ – ( I )

исключающее ИЛИ – ( ^ )

НЕ – ( ~).

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

    Язык Си поддерживает два адресных оператора:

оператор взятия адреса ( & ) и косвенный оператор ( * ).

    Оператор & возвращает адрес переменной: если sum есть переменная типа int, тогда &sum есть адрес (ячеки памяти) этой переменной. Если msg есть указатель (ссылка) на переменную типа char, тогда *msg есть символ, на который указывает msg.

 

Лекция 14

Ввод

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

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

    scanf(<форматная строка>,<адрес>,<адрес>,…);

Эта функция использует многие спецификаторы формата, рассмотренные ранее: %d для целых чисел, %f для чисел с плавающей точкой, %s для строк и т.д. Однако у этой функции есть важная отличительная черта: за форматной строкой следуют не значения а адреса. Например,

    scanf(“%d %d”, &a, &b);

Эта строка означает, что программа ожидает ввода двух десятичных целых значений, разделенных пробелом. Первое значение введется по адресу переменной a (&a), а второе – по адресу переменной b.

    Для ввода строковых данных в языке Си имеется функция gets, имеющая формат

    gets(name);

Эта функция воспринимает любую информацию до тех пор, пока не нажмете клавишу Enter. В конце введенной строки добавляется функцией нулевой символ \0.

    Для ввода единичного символа в языке Си имеется функция getch, которая считывает с клавиатуры один символ. В отличие от функций scanf и gets функция считанный символ не передает в основную память, а сама принимает значение символа, считанного склавиатуры. Таким образом значение функции getch может быть присвоено переменной типа char например,

    char x;

    x = getch();

Лекция 15

Условные операторы

    Рассмотрим операторы отношения и логические операторы, которые принимают значения true (истина) и false (ложь).

    Операторы отношения позволяют сравнивать два значения, результат оператора зависит от того, истинно или ложно сравнение. Если сравнение ложно, значение результата равно нулю, если истинно, значение равно единице. В языке Си следующие операторы отношения:

больше чем            - >

больше или равно - >=

меньше чем       - <

меньше или равно - <=

равно                 - = =

не равно            - !=

    Например, выражение b < 0 принимает значение true если значение переменной b меньше нуля.

    В языке Си имеются три логических оператора: И(&&), ИЛИ(II) и НЕ(!). Их необходимо отличать от побитовых операторов (&, I, ~). Логические операторы выполняются над логическими значениями true и false, а побитовые операторы – над нулями и единицами, находящимися в битах. Логические операторы дают результат или равный 1 (истина) или равный 0 (ложь).

    Оператор if в языке Си имеет следующий формат:

    if (выражение)

              оператор 1;

    else

              оператор 2;

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

    if (выражение)

              оператор 1;

В данном случае оператор 1 выполняется только тогда, когда значение выражения не равно нулю. Если значение выражения равно нулю, тогда выполняется оператор следующий за if.

    Если вместо оператора 1 стоит последовательность операторов, то ее надо записать в фигурных скобках. Это и будет составным оператором в языке Си. Составной оператор имеет вид:

{

оператор

оператор

………..

оператор

}

 

Циклы.

В языке Си имеются три вида циклов: while, for, do…while.

Цикл while является наиболее общим видом цикла и имеет формат:

while (выражение)

    оператор;

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

    Цикл for выполняет набор операторов (тело цикла) определенное число раз, пока некоторая переменная (параметр цикла) не пройдет некоторый промежуток значений. Цикл for имеет следующий формат:

    for (выражение1; выражение2; выражение3)

              оператор;

Выражение1 присваивает начальное значение параметру цикла.

Выражение2 проверяет условие продолжения цикла.

Выражение3 модифицирует параметр цикла на шаг.

Оператор может быть простым или составным.

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

    Цикл do … while реализует итерационный циклический вычислительный процесс и имеет следующий формат:

    do оператор while (выражение);

Выполняется оператор (тело цикла) и вычисляется выражение, если оно принимает значение истина, то тело цикла выполняется вновь, если оно принимает значение ложь - происходит выход из цикла.

 

Лекция 16

    Подпрограммы

    В языке Си подпрограммы называются функциями. Теоретически, каждая функция должна возвращать какое-либо значение. Практически, значения, возвращаемые многими функциями, просто игнорируются. В язык Си имеется возможность определения функции типа void, что означает , что эти функции никогда не возвращают никакого значения.

    В языке Си функцию можно объявить и определить. При объявлении функции вся программа узнает о ее существовании и все другие функции, включая main, могут к ней обращаться. При определении функции пишется программа, составляющая тело функции. Например,

/*Объявление функций*/

void get_parms (float *p1, float *p2);

float get_ratio (float divident, float divisor);

void put_ratio (float ratio);

 

const float INFINITY = 3.4E+38

 

/*Начало программы*/

main()

{

float a, b, ratio;

char ch;

do

{

get_parms (&a, &b);   /*Ввод параметров*/

ratio = get_ratio(a, b); /*Вычисление ratio*/

put_ratio(ratio);          /*Вывод ответа*/

printf (‘’Нажмите клавишу ’q’ , то выход, любую другую - продолжение ‘’);

} while ((ch = getch()) != ’q’);

}

/*Конец функции main*/

 

/*Определение функций*/

void get_parms (float *p1, float *p2)

{

printf(‘’ Введите два числа: ‘’);

scanf (‘’%f %f ‘’, p1, p2);

}        

 

float qet_ratio(float divident, float divisor)

{

if (divisor = = 0.0)

return (INFINITY);

else

return (divident / divisor);     

}

 

void put_ratio(float ratio)

{

if (ratio = = INFINITY)

printf (‘’Отношение не определено\n‘’);

else

printf (‘’Отношение = %f \n ‘’, ratio);

}

        

        

    Первые три строки программы - это объявления функций. Они служат для объявления типа функции, а также для объявления типа и количества параметров с целью обнаружения ошибок сопряжения подпрограмм.

    В следующей строке определяется константа с плавающей точкой INFINITY ( в языке Си принято обозначать глобальные константы символами верхнего регистра). Эта константа имеет очень большое положительное значение и используется для сигнализации об ошибке деления на ноль. Так как она определена здесь, область ее видимости распространяется на все функции, включая main. Далее идет функция main (головной модуль), т.е. основная часть программы. Каждая программа на языке Си имеет функцию main. При вызове программы операционной системой (или запуск из Турбо-Си ) управление передается функции main, из нее же происходит и возврат управления в операционную систему. В процессе выполнения головного модуля (функции main) осуществляется обращение к подпрограммам (функциям).     После функции main идут определения трех функций, объявленных в разделе прототипов.

    Функция get_parms не возвращает значения, поэтому она объявлена типа void. Ее целью является ввод двух значений по некоторым адресам. Мы должны передать функции get_parms два параметра. Эти параметры суть адреса, по которым будут храниться значения переменных. Посмотрите: тип этих параметров не float , ссылка на тип float, т.е. эти параметры считаются адресами переменных типа float.

    Именно эти адреса мы и передаем при вызове функции get_parms из функции main - &a, &b. Обратите внимание также, что при вызове встроенной функции scanf из функции get_parms перед переменными p1 и p2 нет адресных операторов. Это потому , что p1 и p2 уже являются адресами переменных a и b.

    Функция get_ratio возвращает значение типа float , вычисленное на основе двух переданных ей значений типа float (divident - делимое и divisor - делитель). Возвращаемое значение зависит от того равен делитель нулю или нет. Оператор return присваивает возвращаемое значение имени функции get_ratio.

    Функция put_ratio не возвращает значение , поэтому она определена типа void и не имеет оператора return. Ее единственный параметр ratio определяет выводимую на экран информацию.

 

Глобальные описания

    Константы, тип данных и переменных, объявленные за пределами любой функции, включая main, считаются глобальными, начиная с момента определения. Это значит, что они могут использоваться любой функцией программы, находящейся после их объявления.

Комментарии

    Иногда необходимо вставить в текст программы пояснения, служащие для напоминания (разъяснения) читателю о том , что означают конкретные переменные, что делают некоторые операторы и т.д. Такие пояснения называются комментариями. Начало комментария /*, после такого знака компилятор игнорирует всю информацию до появления знака */ - конец комментария.

 

Лекция 17



2019-12-29 139 Обсуждений (0)
Структура простой программы на Си 0.00 из 5.00 0 оценок









Обсуждение в статье: Структура простой программы на Си

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (139)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)