- •Министерство образования и науки Российской Федерации
- •«Тюменский государственный нефтегазовый университет»
- •Методические рекомендации по самостоятельной работе студентов и изучению дисциплины
- •Министерство образования и науки Российской Федерации
- •«Тюменский государственный нефтегазовый университет»
- •Методические указания по выполнению лабораторных работ
- •Часть 1. Материал для повторения
- •8. Операторы
- •Часть 2.
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;
}