- •( Часть 1)
- •230100 «Информатика и вычислительная техника»
- •Введение
- •1. Первая программа на языке Си
- •Примеры
- •Задания для самостоятельной работы
- •2. Переменные. Основные типы данных. Форматный ввод-вывод
- •Примеры
- •Упражнения
- •Наберите текст следующей программы и проанализируйте работу функции printf() в каждом случае.
- •Наберите текст следующей программы и проанализируйте работу функции scanf().
- •Задания для самостоятельной работы
- •3. Операции и выражения
- •Примеры
- •Упражнения
- •Задания для самостоятельной работы
- •I. Вычисление значения математического выражения
- •II. Решение задач на составление выражений
- •4. Операторы ветвления
- •Примеры
- •Задания для самостоятельной работы
- •I. Обработка введенного символа
- •II. Вычисление значения функции
- •III. Mультиветвление
- •5. Операторы цикла и передачи управления
- •Примеры
- •Задания для самостоятельной работы
- •I. Решение задач тремя способами (с for, while и do-while) Решить следующие задачи в трех вариантах – с помощью циклов for, while и do-while
- •II. Детерминированные циклы
- •III. Итерационные циклы
- •6. Массивы
- •Примеры
- •Задания для самостоятельной работы
- •I. Одномерные массивы
- •II. Двумерные массивы
- •7. Строки
- •Примеры
- •Задания для самостоятельной работы
- •Список литературы
Наберите текст следующей программы и проанализируйте работу функции scanf().
#include<stdio.h>
#include<conio.h>
int main ()
{
int a,b,c,d,e,i,j;
char a1,b1,c1;
int data,month,year;
int name[15];
clrscr();
//---------------пример работы scanf()------------------------------
/* При вводе каждое число должно */
/* отделяться от другого пробелом */
printf(“\n Введите 5 целых чисел\n”)
scanf (" %d%d%d%d%d",&a,&b,&c,&d,&e);
printf ("\n %d %d %d %d %d",a,b,c,d,e);
getch();
//----------------работа с модификатором *------------------------
printf ("\nВведите два числа i, j\n");
scanf ("%d %*d ",&i,&j);
printf ("i=%d, j=%d\n",i,j,);
printf ("Повторите ввод: \n");
scanf ("%d %d",&i,&j);
printf ("i=%d, j=%d\n",i,j);
getch();
//----------------работа со строками------------------------
printf ("Как вас зовут? "); scanf ("%s",name);
printf ("Приятно познакомиться, %s ", name);
getch();
return 0;
}
Задания для самостоятельной работы
Описать четыре переменных целого типа, инициализировать начальными значениями. Очистить экран. Вывести значения переменных на экран следующим образом (как таблицу с невидимыми границами):
1065 231
11 8
Напишите программу, выводящую на экран ASCII коды символов A,a, B,a и С,с. Каждая пара букв должна быть выведена на новой строке. Коды букв в строках должны разделяться символом табуляции. (подсказка: для получения ASCII-кода нужно объявить символьную переменную и инициализировать ее конкретной буквой. Например, char a=’A’. Затем при выводе с помощью printf() выводить ее со спецификатором целого числа).
Напишите программу, в результате работы которой на экране будет следующий «диалог». Имя, дата рождения и город вводятся с клавиатуры. Результат работы программы:
-
Как вас зовут? Иван
Укажите дату, месяц и год вашего рождения.
Дата: 14
Месяц (числом): 10
Год: 1986
В каком городе? Свердловск
Теперь мы с вами знакомы!
Вас зовут Иван
Вы родились в городе Саратов (14.10.1986)
3. Операции и выражения
Выражение - это правило (например, формула) для вычисления нового значения. Выражения в Си могут быть арифметические, логические, условные, над символами и строками и над адресами. Тип выражения определяется типом результата, т. е. значением, которое формируется при выполнении последней операции выражения. Выражения формируются из операндов, операций и круглых скобок, с помощью которых можно задать требуемый порядок выполнения его операций. В качестве операндов могут быть константы, переменные и результаты функций. Результатом выполнения выражения может быть значение одного из допустимых типов: арифметического (целого или вещественного) или символьного. Тип результата определяется как типом операндов, так и типом операций, выполненных над операндами.
Операции делятся на унарные, которые выполняются над одним операндом, и бинарные – над двумя операндами.
Унарные операции:
& |
операция получения адреса операнда; |
‘*’ |
операция обращения по адресу; |
‘-‘ |
унарный минус, изменяет знак арифметического операнда; |
+ |
унарный плюс, введен для симметрии с унарным минусом; |
~ |
инвертирует значение каждого бита операнда; |
! |
НЕ – логическое отрицание операнда; |
++ |
увеличение на 1. Эта операция имеет две формы – префиксная операция и постфиксная. Префиксная – увеличение значения операнда на 1 до его использования. Постфиксная – увеличение значения операнда на 1 после его использования; |
-- |
уменьшение на 1; |
sizeof |
операция вычисления размера (в байтах) для объекта того типа, который имеет операнд; |
Бинарные операции
Аддитивные |
|||||||||||||||||||||||||||||
+ |
бинарный плюс; |
||||||||||||||||||||||||||||
- |
бинарный минус; |
||||||||||||||||||||||||||||
* |
умножение операндов арифметического типа; |
||||||||||||||||||||||||||||
/ |
деление операндов арифметического типа. При целочисленных операндах абсолютное значение результата округляется до целого; |
||||||||||||||||||||||||||||
% |
получение остатка от деления целочисленных операндов. При неотрицательных операндах остаток положительный. В противном случае – зависит от компилятора. В нашем случае 13%-4 равно 1, а -13%4 равно -1 |
||||||||||||||||||||||||||||
Операции сдвига |
|||||||||||||||||||||||||||||
<< |
Операции сдвига << и >> выполняют сдвиг левого операнда влево или вправо на количество разрядов, заданное правым операндом. Таким образом, выражение х << 2 сдвигает х влево на 2 разряда; это эквивалентно умножению х на 4. Таким образом, операции сдвига могут применяться для деления или умножения целого значения на число, равное степени 2. |
||||||||||||||||||||||||||||
>> |
|||||||||||||||||||||||||||||
Поразрядные операции (битовые) Работают в двоичной системе |
|||||||||||||||||||||||||||||
& x&y |
Поразрядная коньюнкция (И) битовых представлений целочисленных операндов. Каждый бит результата будет содержать 1, если в соответствующих битах операндов тоже стоят 1. Например 10&15 (1010&1111) будет 10 (1010) |
||||||||||||||||||||||||||||
| |
Поразрядная дизъюнкция (битовое ИЛИ). Каждый бит результата будет содержать 1, если хотя бы в одном из соответствующих битов операндов стоит 1. Например 10|15 (1010|1111) будет 15 (1111) |
||||||||||||||||||||||||||||
^ |
Поразрядное исключающее ИЛИ. Каждый бит результата будет содержать 1, если только в одном из соответствующих битов операндов стоит 1. Например 10^15 (1010^1111) будет 5 (0101) |
||||||||||||||||||||||||||||
Операции отношений (сравнения) |
|||||||||||||||||||||||||||||
< |
int a, b,i,n; float с, d; а = d > с; b = i + n < 100;
|
||||||||||||||||||||||||||||
> |
|||||||||||||||||||||||||||||
<= |
|||||||||||||||||||||||||||||
>= |
|||||||||||||||||||||||||||||
== |
|||||||||||||||||||||||||||||
!= |
|||||||||||||||||||||||||||||
Логические бинарные операции |
|||||||||||||||||||||||||||||
&& |
Коньюнкция арифметических операндов. Результат целочисленный – 0(ложь) или 1(истина) |
||||||||||||||||||||||||||||
|| |
Дизъюнкция арифметических операндов. Результат целочисленный – 0(ложь) или 1(истина) |
||||||||||||||||||||||||||||
|
Операндами этих логических операций могут быть результаты выражений любого типа. Но перед выполнением логических операций значения результатов выражений-операндов преобразуются в логические значения истина - 1 или ложь - 0. Все значения, отличные от 0, интерпретируются как истинные - 1, а если значение равно 0, то оно ложно. Результат логической oneрации равен 1, если логическое выражение истинно, и результат равен 0, если логическое выражение ложно.
Таблица 3. Результат логических операций
|
||||||||||||||||||||||||||||
Операции присваивания |
|||||||||||||||||||||||||||||
= |
Простое присваивание: присвоить значение выражения-операнда из правой части операнду левой части. p=10.3-2*x С помощью одного оператора присваивания могут получить новое значение несколько переменных. Например, переменные а, b, с, е получат значение, равное нулю: а = b = с = е = 0 ; В одном операторе операция присваивания может использоваться несколько раз. Например: а = ( b = с ) * d ; здесь сначала переменной b присваивается значение переменной с, а затем вычисляется выражение b*d и результат присваивается переменной а. |
||||||||||||||||||||||||||||
*= |
Присваивание после умножения: присвоить операнду левой части произведение значений обоих операндов. То есть p*=2 эквивалентно p=p*2 |
||||||||||||||||||||||||||||
/= |
Присваивание после деления. p/=2-x эквивалентно p=p/(2-x) |
||||||||||||||||||||||||||||
%= |
Присваивание после деления по модулю. присвоить операнду левой части остаток от целочисленного деления значения левого операнда на значение правого. p%=3 эквивалентно p=p%3 |
||||||||||||||||||||||||||||
+= |
Присваивание после суммирования |
||||||||||||||||||||||||||||
-= |
Присваивание после вычитания. p-=4-z эквивалентно p=p-(4-z) |
||||||||||||||||||||||||||||
&= |
Присваивание после поразрядной коньюнкции. e&=44 e=e&44 |
||||||||||||||||||||||||||||
|= |
Присваивание после поразрядной дизъюнкции. e|=c e=e|c |
||||||||||||||||||||||||||||
^= |
Присваивание после поразрядного исключающего ИЛИ |
||||||||||||||||||||||||||||
<<= |
Присваивание после сдвигов разрядов влево. a<<=4 a=a<<4 |
||||||||||||||||||||||||||||
>>= |
Присваивание после сдвигов разрядов вправо |
||||||||||||||||||||||||||||
Операции выбора компонентов структурированного объекта |
|||||||||||||||||||||||||||||
. (точка) |
Используются со сложными типами данных – структурами и объединениями. |
||||||||||||||||||||||||||||
-> |
|||||||||||||||||||||||||||||
Запятая в качестве операции |
|||||||||||||||||||||||||||||
, |
Несколько выражений, разделенных запятыми вычисляются слева направо. В качестве результата – значение и тип самого правого выражения. Например: int a,b; a=(b=3,3*b) printf(“%d”,a) //даст результат 9
|
||||||||||||||||||||||||||||
Скобки |
|||||||||||||||||||||||||||||
(), [] |
Играют роль бинарных операций при вызове функций и индексировании элементов массива. |
||||||||||||||||||||||||||||
Условная трехместная операция |
|||||||||||||||||||||||||||||
?: |
Используется с тремя операндами (тернарная). Синтаксис: Выражение1?выражение2:выражение3 Первым вычисляется значение выражения1. Если оно истинно, то есть не равно 0, то вычисляется значение выражения 2, которое и становится результатом. Если при высичлении выражения1 получится 0, то вычисляется и берется в качестве результата выражение3. Пример: x<0?-x:x // выражение возвращает абсолютную величину x |
||||||||||||||||||||||||||||
При выполнении смешанных выражений автоматически производится преобразование операндов к одному типу в соответствии с приоритетами. Ниже приведен порядок следования типов по возрастанию их старшинства:
char<int<long<float<double
Автоматически выполняются следующие преобразования типов:
char преобразуется в int, float в double
если старшим типом является double, то все остальные типы преобразуются в double. Таким же будет и тип результата.
если старшим типом является long, то все остальные типы преобразуются в long. Таким же будет и тип результата.
если старшим типом является unsigned, то все остальные типы преобразуются в unsigned. Таким же будет и тип результата.
Если не выполняется ни одно из предыдущих условий и выражение содержит значение типа int, то результат будет int. Существует одно исключение из этих правил. Если выражение содержит типы long и unsigned, то unsigned не преобразуется к long. Типом результата будет usigned long.
Часто возникают ситуации, когда желательно вместо целых значений использовать вещественные.
Рассмотрим пример:
int x,y;
float z;
x=10;
y=100;
z=x/y;
В результате вычислений переменная z получит значение 0 как целое число, а не 0.1 как вещественное. В подобных ситуациях часто прибегают к явному преобразованию типов с помощью следующей конструкции:
(имя-типа) выражение
где тип –корректный тип данных С. Например, для получения правильного значения при вычислении выражения a/b, где a и b целые числа необходимо преобразовать результат к типу float:
(float)a/b;
