Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория информационных процессов и систем120822.doc
Скачиваний:
2
Добавлен:
17.11.2019
Размер:
331.26 Кб
Скачать

8. Операторы

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

if ( условие )

команда1

[ else

команда2 ]

Сначала программа проверяет истинность условия. Если условие истинно, то выполняется команда1, если нет, и присутствует ключевое слово else – то выполняется команда2. Затем управление передается команде, следующей за ветвлением.

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

/*prog10.c*/

/*программа вычисляет абсолютную величину вещественного числа */

#include <stdio.h>

main()

{

float x, y;

scanf ( “х = %f”, &x );

if ( x >= 0 )

y = x;

else

y = - x;

printf ( “ | %f | = %f\n”, x, y );

return 0;

}

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

if ( условие )

{

команда1a

команда1b

...

}

[ else

{

команда2a

команда2b

...

}

]

Условие оператора ветвления обычно включает в себя операции сравнения:

> - больше;

< - меньше;

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

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

== - равно (равняется)

!= - не равно.

Определённые трудности вызывает операция “==”. В языке математики символ равенства “=” обозначает две разных операции: присваивание (x = 1 – переменной x присваивается значение 1) и сравнения ( 2 = 2 – утверждение, что 2 равно 2).В языке C символ “=” обозначает операцию присваивания, слева от него должна стоять переменная, эта операция возвращает значение присвоенной переменной. Например, в результате выполнения команды x = ( y = 2 ) переменным x и y будет присвоено одно и то же значение – число 2. Операция сравнения обозначается с помощью символа “==”, слева и справо от него стоят выражения, результат операции сравнения может быть ложью или истиной. В языке C лжи соответствует число 0, а истине – ненулевое число, как правило, это 1. Таким образом, результатом операции 2 == 2 является истина (1), а результатом операции 2 == 1 – ложь (0).

Логические операции:

&& - конъюнкция (и);

|| - дизъюнкция (или);

! - отрицание (не).

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

while ( условие )

тело цикла.

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

/*prog11.c*/

//программа вычисляет сумму квадратов чисел 1, 2,..., n

#include <stdio.h>

main()

{

int n, s = 0, i = 1; /* переменная s является сумматором, в ней будет накапливаться сумма чисел от 1 до n */.

scanf ( “n = %d”, &n );

while ( i <= n )

{

s = s + i * i;

i++;

}

printf ( “ 1 * 1 + 2 * 2 +...+ %d * %d = %d\n”, n, n, s );

return 0;

}

Эту же задачу можно решить с использованием цикла for:

/*prog12.c*/

//программа вычисляет сумму квадратов чисел 1, 2,..., n

#include <stdio.h>

main()

{

int n, s, i; /* переменная s является сумматором, в ней будет накапливаться сумма чисел от 1 до n*/.

scanf ( “n = %d”, &n );

for ( i = 1, s = 0; i <= n; i++)

s = s + i * i;

printf ( “ 1 * 1 + 2 * 2 +...+ %d * %d = %d\n”, n, n, s );

return 0;

}

Операции, которые отделяются друг от друга запятой, в языке С образуют единое целое; таким образом, в начале цикла for переменной i присваивается значение 1, а сумматору s - значение 0. После каждого прохода цикла значение переменной i увеличивается на 1, а к значению s программа прибавляет квадрат значения i. Повторение цикла прекратится, когда значение переменной i будет больше 1. НЕ НАДО СТАВИТЬ ТОЧКУ С ЗАПЯТОЙ ПОСЛЕ КОНСТРУКЦИИ for !!!

/*prog13.c

на вход программы поступают целые положительные числа, программа вычисляет их сумму. Ввод прекращается, когда пользователь введёт 0*/

#include <stdio.h>

main()

{

int i, s = 0; /* переменная s является сумматором, в ней будет накапливаться сумма чисел, которые вводит пользователь; в ячейке i хранится очередное число, прочитанное программой */

scanf ( “%d”, &i );

while ( i != 0 )

{

s = s + i;

scanf ( “%u”, &i );

}

printf ( “ сумма введённых чисел равна %d\n”, s );

return 0;

}

Язык С предназначен в первую очередь для разработки программ, которые выполняются на компьютерах, обладающих очень высокой производительностью. Здесь машинное время очень дорого, поэтому ввод данных осуществляется не с клавиатуры, а из файла. Изменим программу prog13.c:

/*prog14.c

на вход программы поступают вещественные числа, программа вычисляет их сумму*/

#include <stdio.h>

main()

{

float x, s = 0; /* переменная s является сумматором, в ней будет накапливаться сумма чисел, которые вводит пользователь; в ячейке x хранится очередное число, прочитанное программой */

int flag; /* в переменную flag помещается значение, которое возвращает функция scanf */

flag = scanf ( "%f", &x);

/*программа читает данные из файла, содержимое которого направляется в её входной поток; когда прочитан весь файл, функция scanf возвращает значение EOF, оно определяется в файле stdio.h*/

while ( flag != EOF )

{

s = s + x;

flag = scanf ( "%f", &x);

}

printf ( “ сумма введённых чисел равна %f\n”, s );

return 0;

}

Составим текстовый файл mydata.txt, содержащий следующие вещественные числа:

121.45 12.78 151.11 777.76

Откомпилируем программу prog14.c и запустим её, набрав в командной строке:

prog14.exe < mydata.txt

Символ '<' указывает операционной системе, что стандартный канал ввода исполняемого файла prog14.exe следует соединить с файлом mydata.txt. Программа выводит на экран сумму чисел, содержащихся в файле mydata.txt.

СИМВОЛЫ И СТРОКИ

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

/*prog15.c*/

#include<stdio.h>

main()

{

char x = ‘A’, y = 97;

printf (“Численное значение переменной х равно %d, в ней хранится символ %c \n Численное значение переменной у равно %d, в ней хранится символ %с \n”, x, x, y, y);

return 0;

}

Откомпилировав и выполнив программу мы увидим, что буква ‘А’ имеет ASCII-код 65, а ASCII-коду 97 соответствует строчная буква ‘а’.

Таким образом, мы можем присваивать целочисленные значения переменным типов int и char, выполнять с ними обычные арифметические действия, представлять в десятичной системе счисления. Однако переменные этих типов занимают разный объем памяти. Операция

sizeof (имя_переменной)

определяет количество байтов, которые операционная система выделила указанной переменной.

/*prog16.c*/

#include<stdio.h>

main()

{

int x = 97;

char y = 97;

printf (“Переменной х типа int присвоено значение %d, она занимает %d байт Переменной у типа char присвоено значение %d, она занимает %d байт ”, x, sizeof(x), y, sizeof(y));

return 0;

}

При вызове функции printf вычисляются значения всех её аргументов - x, sizeof ( x ), y, sizeof ( y ) – эти значения операционная система выводит на экран.

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

/*prog17.c*/

#include<stdio.h>

main()

{

char str[20] = “I am a student”;

str[6] = 0;

printf( “%s\n”, str );

return 0;

}

Прежде всего, обратим внимание на объявление массива str. Сначала идёт имя типа элемента массива – char, затем имя массива – str и модификатор типа – квадратные скобки. В языке С квадратные скобки интерпретируются как операция доступа к элементу массива: str[6] = 0 – элементу массива str с индексом 6 присвоить значение 0. Объявление массива следует понимать так: выполнив с переменной str операцию доступа к элементу массива, мы получим значение типа char. Число в квадратных скобках при объявлении массива равно количеству его элементов; так как индекс начального элемента 0, то индекс последнего элемента массива равен 19. В строке “I am a student” 11 букв и три пробела – всего 14 символов, да еще символ с нулевым значением, завершающий строку – получается, что длина строки составляет 15 символов, последний байт массива не используется. В теле функции элементу с индексом 6 присваивается значение 0, следовательно, строка сокращается. Откомпилировав и выполнив программу prog16.c, мы увидим, что она выводит на экран лишь 6 символов строки: “I am a”.

Есть еще один способов объявления массива. На самом деле в переменной str хранится адрес начального элемента массива, т.е. str – это ссылка на переменную str[0]. Значение адреса можно получить с помощью операции разадресации, она обозначается символом *.

/*prog18.c*/

#include<stdio.h>

main()

{

char *str = “I am a student”;

str [ 7 ] = ‘S’;

printf( “%s \n”, str );

return 0;

}

После выполнения программы на экране появляется сообщение “I am a Student”. Таким образом, объявления

char str[20];

char *str;

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

В программах prog17.c и prog18.c мы присваивали строке значение при помощи инициализации, а затем изменяли ее отдельные символы. Использовать операцию = для изменения самой строки в теле функции нельзя, это делает специальная библиотечная функция. Зато при вводе строки не надо выполнять операцию ссылки: scanf(“%s”, str);

/*prog19.c*/

/* Программа выводит на экран слово, которое ввёл пользователь */

#include <stdio.h>

#define N 1000

main()

{

char str[ N ];

scanf ( “%s”, str);

printf(“%s \n”, str);

return 0;

}

Переменная str в программе prog19 является буфером – областью памяти для временного хранения введённой информации. Обычно объём требуемой памяти для буфера известен лишь приблизительно, поэтому его выделяют с некоторым запасом. Числовые значения, которые используются в программе, следует задавать с помощью директивы препроцессору define, в этом случае уменьшается вероятность ошибок в случае их изменения. В начале компиляции программы препроцессор определяет все вхожднения идентификатора N и заменяет их на 1000.

/*prog20.c*/

/* Программа подсчитывает количество символов в строке (без пробелов), которую ввёл пользователь */

#include<stdio.h>

#define N 1000

main()

{

char c, str [ N ]; /* в массиве str будет храниться строка, которую введёт пользователь, прочитанный символ строки программа будет помещать в ячейку c */

int i; /* переменная i будет индексом символа строки */

scanf ( “%s”, str);

i = 0;

c = str [ i ]; /*начальный символ строки помещается в ячейку c*/

while ( c != 0 )

{

i++;

c = str [ i ];

}

/*после выхода из цикла значение переменной i будет равно индексу последнего элемента строки, значение этого элемента равно нулю; индекс начального элемента строки равен нулю, следовательно, значение переменной i после завершения цикла будет совпадать с количествомтех символов, которые ввёл пользователь*/

printf(“%d \n”, i );

return 0;

}