
Лекция № 3 по программированию от 04.09.2011
Условные операции позволяют также производить один из путей решения, но в отличии от условного оператора возвращает результат:
выражение-условие? выражение 1: выражение 2
Вычисляется значение выражения условия если его значение отлично от нуля(оно истинно); операция возвращает в качестве результата значение выражения 1, в противном случае результатом будет значение выражения 2.
Пример:
Даны три числа a,b,c. Найти максимальное из этих чисел.
Решение
#include <stdio.h>
void main()
{
float a,b,c,max;
printf("\n Введите три числа\n");
scanf("%f,%f,%f",&a,&b,&c);
max=a>b?(a>c?a:c):(b>c?b:c);
printf("%f",max);
}
Переключатель
Реализует логическую структуру выбор одного из многих путей решения.
switch(целочисленное выражение)
{
case выражение 1:оператор 1;
............................
case выражение N:операторы N;
break;
default:оператор_default;
}
Выражение 1...Выражение N - константные выражения, значение которых может принимать целочисленное выражение.
Порядок работы: Вычисляется значение целочисленного выражения, которое затем последовательно сравнивается со значениями выражений 1...выражений N. При совпадении выполняется соответствующая группа операторов. И при наличии break управление передается следующему за switch оператору. если break в данной группе операторов отстутствует, то выполняются операторы всех последующих групп, до тех пор пока не встретится break или до конца оператора switch. если целочисленное выражение не совпало ни с одним значением, то выполняется группа операторов default, если она как таковая присутствует. Значения константных выражений совпадать не могут. Для одной группы операторов можно определить несколько значений. Каждое такое значение записывается со своим case.
Задача.
Дано целое число, определяющее номер месяца в году. Вывести на экран количество дней в этом месяце.
Решение:
#include <stdlib>
Void main()
{
int month,days,year;
printf("Введите число месяца:"); scanf("%d",&month);
switch
{
case 1,case 3,case 5,case 7,case 8,case 10,case 12:days=31;break;
case 4,case 6,case 9,case 11: days=30;break;
case 2: printf("\nВведите год:");
scanf("%d",&year);
if(year%4==0 && !(year%100==0 && year%400==0)) days=29;
else days=28;break;
default:days=0;
}
if(days!=0) printf("Количество дней в месяце "%d" "Равно %d\n",month,days); else printf("Ошибка!!!");
}
Программирование циклов
Циклом называется многократное повторение одного или нескольких операторов, записанных в программе только один один раз. В языке Си различают три оператора цикла. Логическая структура "Пока выполняется условие - выполняй действие" реализуется оператором цикла while
while(скалярное выражение)
оператор;
Вычисляется скалярное выражение, если его значение отлично от нуля - выполняется оператор и снова вычисляется скалярное выражение. Цикл прекращает работу, когда скалярное выражение станет равным 0, поэтому, во избежании зацикливания, значение скалярного выражение должно изменятся в теле цикла. Если скалярное выражение равно 0 изначально, тело цикла не выполняется ни разу.
Конструкция выполнения действия пока выполняется условие:
do
{
оператор 1;
. . . . . . .
оператор n;
}
while (скалярное_выражение);
Сначала выполняются операторы тела цикла,затем вычисляется скалярное выражение. Если выражение отлично от нуля (то есть оно истинно) снова выполняется тело цикла. Цикл заканчивает работу, когда скалярное выражение равно 0. Во избежании зацикливаний значение выражения должно изменятся в теле цикла. Тело цикла хотя бы один раз выполняется.
Пример:
Дано целое число N. Определить количество цифр в числе. 283542
Цикл for
for(оператор_иницилизации; скалярное_выражение; операторы_модификации)
Оператор иницилизации позволяет задать начальное значение параметрам цикла; выполняются один раз при входе в цикл. Скалярное выражение определяет условия выполнения цикла, оператор модификации определяет изменение параметра цикла. Операторов иницилизации и операторов модификации может быть несколько, в этом случае они перечисляются через запятую. Скалярное выражение всегда одно!
Порядок работы:
Выполняются операторы иницилизации
Проверяется скалярное выражение. Если его значение отлично от нуля — выполняется тело цикла, после чего выполняются операторы модицикации и снова вычисляется скалярное выражение.
Цикл прекращает работу, когда скалярное выражение равно 0.
Отдельные секции в заголовке цикла for могут отстутствовать, поэтому точка с запятой должна присутствовать обязательно.
Массивы
Определяется массив следующим образом:
тип_элемента имя массива [количество_элементов] //одномерный
Количество элементов не может быть определено переменной, однако это может быть выражение, которое на момент определения массива может быть вычислено. Для многомерных массивов размер указывается по каждой размерности.
Float [4][5][2]
Изменение индексов осуществляется «с конца», т.е. Си хранит массивы по строкам. Массив может быть инициализирован при определении. При этом старший индекс может быть опущен, размер массива будет определятся по количеству заданных значений.
Int a[]={1,2,3} // 3 элемента
float xy [ ][2]={1.5, 2.6, 3.5, 4.1, 2.8, 7.1, 2.7, 3.1}//xy [4][2]
Ввод и вывод элементов массива осуществляется поэлементно с использованием циклов. Для доступа к элементу массива необходимо указать имя массива и в квадратных скобках индекса.
Адреса
Чтобы связать неинициализированный указатель с новым участком памяти еще не занятый никаким программным объектом используется оператор new
Int *ptr;
ptr – new int;
Нельзя рассчитывать, что выделенный участок памяти будет содержать нулевое значение, и в общем-то обычно он не содержит нулевое значение. Размер выделенного участка определяется типом, записанным после new; адрес выделенного участка сохраняется в указателе. Работать данными, указанными в выделенном участке можно с помощью операции разыменование. Инициализировать выделенный участок можно непосредственно при использовании оперцации new.
Указатель = new тип (инициализирующее_выражение)
С помощью указателей можно добраться до некоторой служебной информаций. Например до байтов состояния клавиатуры, видеопамяти и тому подобное. В этом случае используют прямые адреса. Например: состояние клавиатуры можно анализировать с помощью указателя объявленного следующим образом:
char *key_byte = (char*)1047;
Указатель может быть объявлен как константный
Тип *const имя_указателя = инициализирующее_выражение;
Изменит такой указатель в программе нельзя, т.е. сам адрес изменить нельзя, но получить доступ к участку памяти и изменить значение, хранящееся в этом участке памяти можно. По умолчанию в Borland C выделяет память в стеки1. Любой указатель требует в памяти два байта. А поскольку сам указатель хранится в памяти, то его адрес также можно сохранить в указателе.
Int **pptr; //Указатель на указатель, способный хранить
Pptr = &ptr //адрес переменной типа
Над указателем допустимы следующие операции:
Разыменование
Присваивание
Получение адреса
Приведение типов (смотри пример с байтовым определением клавиатуры)
Инкремент
Декремент
Сложение и вычитание
Сравнение
Адресная арифметика
Вычитание – допускается применять операцию вычитания для двух указателей одного типа. Результатом является количество объектов базового типа указателей, которые могли бы располагаться между адресами, определяемыми указателями.
#include <stdio.h>