Главная Обратная связь Поможем написать вашу работу!

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Р У К О В О Д С Т В О Д Л Я Н А Ч И Н А Ю Щ И Х



Я З Ы К С И.

 

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

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

 

Предлагаемый справочник - это мини-учебник по языку Си.

Пишите текст программы, используя (кроме особенных случаев) маленькие латинские буквы

 

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

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

¦ Типичная ¦

¦ Си-программа¦

L------T-------

¦ ------------- ¦Директивы

+-----+#Заголовок ------------------+

¦ L------------- ¦препроцессора

¦

¦

¦ -------------

+-----+ main() ¦

¦ L------T------

¦ ¦ ----------- ¦Функция, с которой начинается

¦ L-----------------+Операторы -------+выполнение программы, всегда

¦ L-----T----- ¦носит имя main()

¦ -------------

+-----+Функция a() ¦

¦ L------T------

¦ ¦ -----------

¦ L-----------------+Операторы ¦

¦ ------------- L-----T----- ¦Функции -

+-----+Функция b() ---------------------------+это строительные

¦ L------T------ ¦блоки языка Си

¦ ¦ ----------- ¦Функции -

¦ L-----------------+Операторы -----------------------+состоят из

L-----T----- ¦операторов

¦Описание

+----------- К Д О

¦Присваивание л с а п

+----------- ю л н е

¦Функция ч о н р

+----------- е в ы а

¦Управление в а е т

+----------- ы о

¦Пустой е р

L----------- ы

оператор

 

Любая программа, написанная на языке Си, состоит из одной или более "функций", являющихся основными модулями, из которых она собирается. Одна из функций ОБЯЗАТЕЛЬНО должна называться main(). программа, написанная на языке Си, всегда начинает выполняться с функции, называемой main()!



 

ПРИМЕР простой программы:

#include <stdio.h>

main()

{

int num;

 

num = 1;

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

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

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

 

}

 

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

 

main() - имя главной (и, в данном случае, единственной) функции. В круглых скобках в общем случае содержится информация, передаваемая этой функции. В данном примере передача информации отсутствует и, следовательно, в скобках ничего не содержится. При написании программы старайтесь не пропускать скобок!!

 

Фигурные скобки { } (и только они) отмечают начало и конец тела функции. Для этой цели не используются ни круглые ( ), ни квадратные [] скобки. Фигурные скобки применяются также для того, чтобы объединить несколько операторов программы в сегмент или "блок".

 

int num; - оператор описания переменной. В языке Си ВСЕ переменные должны быть объявлены. Это означает, что, во-первых, в начале программы вы должны привести список всех используемых переменных, а во-вторых, необходимо указать "тип" каждой из них.

Основные типы данных:

 

int - целые числа;

char - символы (буквы, цифры, и некоторые другие символы);



float - вещественные числа;

double - вещественные числа двойной точности.

 

num = 1- это оператор присваивания; переменной num присваивается значение 1.

 

printf("..."); - функция, осуществляющая вывод строки "..." на терминал. Символ \n является управляющим символом "новая строка", т.е. с помощью этого символа осуществляются те же функции, что и с помощью клавиши [ввод], имеющейся на

обычном терминале.

В этом операторе комбинация символов %d служит указателем места в строке, куда необходимо вставить значение переменной num при печати.

 

МАССИВЫ

 

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

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

Описание массива:

тип имя[размер1][размер2]...

Например:

int mas[10];

ПЕРЕЧИСЛЕНИЕ ЭЛЕМЕНТОВ МАССИВА НАЧИНАЕТСЯ С 0, А НЕ С 1 !!! Т.е. mas[0], mas[1] и т.д. Таким образом, индексами должны быть целые числа, индексирование начинается с 0.

 

ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ ВВОДА - ВЫВОДА

 

Функции ввода-вывода дают пользователю возможность взаимодействия с программой. Наиболее универсальными в Си являются функции printf() (в FORTRANe это оператор WRITE, и scanf() (в FORTRANE это оператор READ).

Обычно функции printf() и scanf() "работают" во многом одинаково - каждая использует "управляющую строку" и список "аргументов". При необходимости ввести (вывести) значение какой-либо переменной НЕОБХОДИМО ИСПОЛЬЗОВАТЬ ОПРЕДЕЛЕННЫЙ ФОРМАТ. Каждому формату соответствует тип выводимой (вводимой) информации.



Формат Аналог в FORTRAN Тип выводимой информации

%d I Десятичное целое число

%c A1 Один символ

%s Aw (w-длина) Строка символов

%e E Число с плавающей точкой , экспоненциальная запись

%f F Число с плавающей точкой , десятичная запись

%u I Десятичное целое число без знака

%o O Восьмеричное целое число без знака

%x Z Шестнадцатиричное целое число без знака

 

Пример:

.

Pi = 3.14159;

printf(" Значение числа pi равно %f.\n",Pi);

.

Результат будет выглядеть так:

Значение числа pi равно 3.14159.

 

Формат, указываемый при обращении к функции printf(), выглядит следующим образом:

printf(Управляющая строка, аргумент1, аргумент2,...);

где аргумент1, аргумент2 и т.д. - это печатаемые параметры, которые могут быть переменными, константами или даже выражениями, вычисляемыми вначале, перед выводом на печать.

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

Таким образом, в управляющей строке содержится информация двух различных видов: 1. Символы, печатаемые в виде текста. 2. Идентификаторы данных, называемые также "спецификациями преобразования".

КАЖДОМУ АРГУМЕНТУ ИЗ СПИСКА, СЛЕДУЮЩЕГО ЗА УПРАВЛЯЮЩЕЙ СТРОКОЙ, ДОЛЖНА СООТВЕТСТВОВАТЬ ОДНА СПЕЦИФИКАЦИЯ ПРЕОБРАЗОВАНИЯ!!!

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

 

printf("Привет!\n");

printf("%c%d\n",'$',sum);

 

Во втором примере первый аргумент из печатаемого списка является символьной константой, а не переменной! Между знаком % и символом, определяющим тип преобразования, можно поместить модификатор:

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

- Аргумент будет печататься с левой позиции поля заданной ширины. Обычно печать аргумента оканчивается в самой первой позиции поля.

Пример : %-10d

Строка цифр Задает минимальную ширину поля. Большее поле будет использоваться, если печатаемое число или строка не помещаются в исходное поле.

Пример : %4d

Строка цифр Определяет точность: для типов данных с плавающей точкой - число печатаемых цифр справа от десятичной точки; для символьных строк - максимальное число печатаемых символов.

Пример : %5.2f

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

Пример : %lf

 

ОСОБЕННОСТИ ФУНКЦИИ scanf().

 

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

1.Если вам нужно ввести некоторое значение и присвоить его переменной одного из основных типов, то перед его именем переменной требуется писать символ &.

2.Если вы ходите ввести значение строковой переменной, использовать символ & не нужно. Примеры:

.

int a;

float b, c;

.

scanf("%f",&b);

scanf("%d%f",&a,&c);

.

.

Функция scanf() использует практически тот же набор символов спецификации преобразования, что и функция printf().

 

ДИРЕКТИВА #define

 

В "заголовок" программы могут быть включены одна или несколько директив #define, когда возникает необходимость использовать в программе константы. Для этого в начало файла, содержащего вашу программу, необходимо добавить строку, аналогичную следующей:

#define PI 3.14159

При компиляции программы каждый раз, когда появится переменная PI, она будет заменяться величиной 3.14159.Это называется подстановкой "во время компиляции".

Несколько замечаний по поводу формата. Сначала идет ключевое слово #define. Оно должно начинаться с самой левой позиции. Потом следует символическое имя константы, а затем ее величина. Символ "точка с запятой" не используется. Традиционно имена констант пишутся прописными буквами.

В Фортране существует аналогичный оператор : PARAMETER.

 

ОСНОВНЫЕ ОПЕРАЦИИ

 

Основными операциями в Си являются:

 

= -- операция присваивания;

* -- операция умножения;

/ -- операция деления;

+ -- операция сложения;

- -- операция вычитания или операция изменения знака.

 

Дополнительные операции:

 

+=, -=, *=, /=, %= - дополнительные операции присваивания, корректирующие значения переменной, стоящей слева от знака присваивания. Переменной присваивается новое значение, равное старому, скорректированному с помощью величины выражения, стоящего справа. Результат зависит от используемой операции. Напрмер:

scor += 20; - то же самое, что scor = scor + 20;

dim *= 3*scor + 5; - то же самое, что dim = dim*(3*scor+5);

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

 

% - операция деления по модулю, использующаяся в целочисленной арифметике. Результат - остаток от деления. Например, 13 % 5 = 3, так как 13=2*5+3.

++ и -- - операции увеличения и уменьшения. Они увеличивают (уменьшают) значение своего операнда на 1. Например :

операция a++ аналогична операции a=a+1.

 

ВЫБОР ВАРИАНТОВ

 

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

 

1. Выполнение последовательности операторов.

2. Выполнение определенной последовательности операторов до тех пор, пока некоторое условие истинно.

3. Использование проверки истинности условия для выбора между различными возможными способами действия.

 

Операторы if и switch позволяют реализовать третью форму управления.

 

 

ОПЕРАТОР if.

 

Этот оператор имеет следующие структуры:

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

оператор оператор1 оператор1

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

оператор2 оператор2

else

оператор3

 

Если в "оператор" на самом деле входит несколько операторов, то они объединяются в блок с помощью фигурных скобок.

Например:

if ( a == 1 )

{

c = d;

i++;

}

else

j++;

 

Не забывайте, что else соответствует ближайшему if, кроме тех случаев, когда имеются фигурные скобки.

 

ОПЕРАЦИИ ОТНОШЕНИЯ.

Си Фортран Смысл

< .LT. меньше

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

== .EQ. равно

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

> .GT. больше

!= .NE. не равно

 

ЛОГИЧЕСКИЕ ОПЕРАЦИИ

Си Фортран Смысл

&& .AND. И

|| .OR. ИЛИ

! .NE. НЕ

 

ПОРЯДОК ВЫЧИСЛЕНИЙ.

Логические выражения вычисляются слева направо; вычисления прекращаются, как только устанавливается истинность или

ложность всего выражения.

 

ОПЕРАЦИЯ УСЛОВИЯ.

 

В языке Си имеется короткий способ записи одного из видов оператора if-else. Он называется "условным выражением" и использует операцию условия - ?: . Эта операция состоит из двух частей и содержит три операнда. Пример оператора, с по-

мощью которого находится абсолютное значение числа:

x = (y < 0) ? -y : y;

Все, что находится между знаком = и символом "точка с запятой" представляет собой условное выражение. Смысл этого оператора заключается в следующем: если y меньше 0, то x=-y; в противном случае x=y. В терминах оператора if-else данный оператор мог выглядеть так:

if (y < 0) x = -y; else x = y;

В общем виде условное выражение можно записать следующим образом: выражение1 ? выражение2 : выражение3

Если выражение1 истинно, то значением всего условного выражения является величина выражения2; в противном случае значение всего условного выражения - величина выражения3.

 

МНОЖЕСТВЕННЫЙ ВЫБОР: ОПЕРАТОР switch.

 

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

 

Общая структура оператора:

 

switch (целое выражение)

{

case метка1:

операторы; (необязательные)

break; (необязательный)

case метка2:

операторы; (необязательные)

break; (необязательный)

...

default:(необязательные)

операторы; (необязательные)

}

 

Вначале вычисляется выражение в скобках, расположенное за ключевым словом switch. Затем программа просматривает список "меток" до тех пор, пока не находит "метку", соответствующую данному значению. Далее программа переходит к выполнению оператора, расположенного в этой строке. Если такой подходящей метки не найдется, то если существует строка с "меткой" case default: , то будет выполняться оператор, помеченный этой меткой. В противном случае произойдет переход к оператору, расположенному за оператором switch.

Выполнение оператора break приводит к тому, что в программе происходит выход из оператора switch и осуществляется переход к следующему за ним оператору. При отсутствии оператора break будут выполнены все операторы, начиная с помеченного данной меткой до конца оператора switch.

Метки, имеющиеся в операторе switch, должны быть константами или константными выражениями (выражение, операторы которого константы) целого типа (включая тип char). Запрещается использовать в качестве метки переменную. Значением выражения в скобках должна быть величина целого типа.

 

ЦИКЛЫ

 

ОПЕРАТОР while

 

ОБЩИЕ ЗАМЕЧАНИЯ

 

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

 

ФОРМА ЗАПИСИ

 

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

оператор

Выполнение оператора циклически повторяется до тех пор, пока выражение не станет ложным, или равным нулю.

 

ПРИМЕРЫ

while ( n++ < 100 )

printf(" %d %d \n",n,2*n+1);

 

while ( far < 1000 )

{

far = far + step;

step = 2 * step; }

 

ЦИКЛ for (аналог оператора DO в FORTRANe)

 

ОБЩИЕ ЗАМЕЧАНИЯ

 

В операторе for используются три выражения, управляющие работой цикла; они разделены символами "точка с запятой". Инициализирующее выражение вычисляется только один раз до начала выполнения какого-нибудь из операторов цикла. Если проверяемое выражение оказывается истинным (или не равным нулю), тело цикла выполняется один раз. Затем вычисляется величина корректируемого выражения, и значение проверяемого выражения определяется вновь. Оператор fоr - это цикл с предусловием: решение, выполнить в очередной раз тело цикла или нет, принимается до начала его прохождения. Поэтому может случиться так, что тело цикла не будет выполнено ни разу. Оператор, образующий тело цикла, может быть как простым, так и составным.

 

ФОРМА ЗАПИСИ

 

for (инициализация; проверка условия; коррекция)

оператор;

Тело цикла выполняется до тех пор, пока проверяемое условие не станет ложным, или равным нулю.

 

ПРИМЕР

for ( n=0; n < 10; n++)

printf(" %d %d \n",n,2*n+1);

В "инициализации" и "коррекции" могут находиться несколько операций, разделяемых между собой запятыми. Например:

for (sum = 0.0, x = 1.0, count = 1; count <= 10; count++, x *= 2.0)

{

sum += 1.0/x;

printf(" sum = %f ,когда count = %d.\n",sum,count);

}

ЦИКЛ С УСЛОВИЕМ НА ВЫХОДЕ : do while

 

ОБЩИЕ ЗАМЕЧАНИЯ

 

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

 

ФОРМА ЗАПИСИ

 

do

оператор

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

Выполнение оператора повторяется до тех пор, пока выражение не станет ложным, или равным нулю.

 

ПРИМЕР

do

scanf("%d",&number);

while( number != 20);

 

ФУНКЦИИ

 

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

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

Для создания больших программ используйте функции в качестве "строительных блоков"!! Каждая функция должна выполнять одну вполне определенную задачу. используйте аргументы для передачи значений функции и ключевое слово return для передачи результирующего значения в вызывающую программу. Если возвращаемое функцией значение не принадлежит типу int,

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

 

ФОРМА ЗАПИСИ :

Типичное определение функции имеет следующий вид:

имя ( список аргументов )

описание аргументов

тело функции

 

Наличие списка аргументов и описаний не является обязательным. Переменные, отличные от аргументов, описываются внутри тела, которое заключается в фигурные скобки.

 

Пример:

 

main()

{

float q, n, x, primer(); /* описание в вызывающей программе */

...

q = primer ( n, x); /* вызов функции */

...

}

 

float primer (x,y) /* тип, имя функции и список аргументов */

float x,y; /* описание аргументов */

{ /* начало тела функции */

float z; /* описание локальной переменной */

z = x - y;

return (z); /* возврат вычисленного значения */

} /* конец тела функции */

 

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

 

Функции должны иметь тот же тип, что и значения, которые они возвращают в качестве результатов. По умолчанию предполагается, что они имеют тип int. Если функция имеет другой тип, он должен быть указан и в вызывающей программе, и в

самом определении функции.

 

НАХОЖДЕНИЕ АДРЕСОВ : ОПЕРАЦИЯ &. УКАЗАТЕЛИ.

 

В результате выполнения операции & определяется адрес ячейки памяти, которая соответствует переменной. Если pooh - имя переменной, то &pooh - ее адрес. Пусть адрес ячейки, где размещается переменная pooh, - 12126. Тогда машинный код, соответствующий оператору pooh = 24; словами можно выразить приблизительно так : "Поместить число 24 в ячейку с адресом 12126". А в результате выполнения оператора

printf(" %d %d\n",pooh,&pooh);

получим

24 12126

Фактический адрес - это число ( в нашем случае 12126 ), а символическое представление адреса &pooh является константой типа указатель. Вообще говоря, указатель - некоторое символическое представление адреса. В языке Си имеются и переменные типа указатель. Точно так же как значением переменной типа int является целое число, значением переменной типа указатель служит адрес некоторой величины.

 

ОПЕРАЦИЯ КОСВЕННОЙ АДРЕСАЦИИ:

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

 

 

Пример:

 

int nur, val, *ptr; /* описание целых переменных и указателя на переменную целого типа */

 

nur = 22;

ptr = &nur; /* указатель на nur */

val = ptr;

 

Результатом выполнения этого фрагмента является присваивание значения 22 переменой val. В описании спецификация типа задает тип переменной, на которую ссылается указатель, а символ звездочка (*) определяет саму переменную как указатель.

 

ПРИМЕР ИСПОЛЬЗОВАНИЯ УКАЗАТЕЛЕЙ, ОБЕСПЕЧИВАЮЩИХ ПРАВИЛЬНУЮ РАБОТУ ФУНКЦИИ :

/* обмен */

main()

{

int x = 5, y = 10;

change (&x,&y); /* передача адресов функции */

}

 

change (u,v)

int *u, *v; /* u и v являются указателями */

{

int temp;

temp = *u; /* temp присваивается значение, на которое указывает u */

*u = *v;

*v = temp;

}

 

Обратите внимание !!! Вместо передачи значений x и y мы передаем их адреса !!!

 

РАБОТА С ФАЙЛАМИ

 

Пример:

#include <stdio.h>

main()

{

FILE *f1;

int ch, i;

 

f1 = fopen("data.dat","w");

 

ch = 2;

for ( i=0; i < 100; i++)

fprintf(f1," i = %d\n",i*ch);

 

fclose(f1);

}

 

Описание файла : FILE *переменная ( это аналог номера логического устройства в Фортране).

Открытие файла : функция fopen("имя_файла","par");

здесь par - параметр, указывающий на то, как должен использоваться файл ( в Фортране это STATUS). Параметр может быть:

 

"r" - файл нужно считать (в Фортране это STATUS="OLD");

"w" - файл нужно записать (в Фортране это STATUS="NEW");

"a" - файл нужно дополнить.

 

Закрытие файла : функция fclose(переменная);

Вывод в файл : функция fprintf(переменная,...).

Чтение из файла : функция fscanf(переменная,...).

 


Просмотров 443

Эта страница нарушает авторские права




allrefrs.ru - 2021 год. Все права принадлежат их авторам!