Управляющие структуры языка «Си». Программирование с использованием указателей
Управляющие структуры или операторы управления служат для управления последовательностью вычислений в программе. Операторы ветвления и циклы позволяют переходить к выполнению другой части программы или выполнять какую-то часть программы многократно, пока удовлетворяется одно или более условий. Результат работы программы: Массив первоначально заполняется нулями, затем данные вводятся с клавиатуры… Читать ещё >
Управляющие структуры языка «Си». Программирование с использованием указателей (реферат, курсовая, диплом, контрольная)
Херсонский национальный технический университет
Лабораторная работа № 1, 2
по дисциплине
«Программирование»
Выполнила
студентка группы 1зКСС
Малахова Т.Н.
Проверил
Дроздова Е.А.
Херсон 2005
Лабораторная работа № 1
Управляющие структуры языка «Си»
Цель работы: Изучение приемов использования операторов ветвления и операторов циклов в С.
Теоретические сведения:
Управляющие структуры или операторы управления служат для управления последовательностью вычислений в программе. Операторы ветвления и циклы позволяют переходить к выполнению другой части программы или выполнять какую-то часть программы многократно, пока удовлетворяется одно или более условий.
Блоки и составные операторы.
Любая последовательность операторов, заключенная в фигурные скобки, является составным оператором (блоком). Составной оператор не должен заканчиваться (;), поскольку ограничителем блока служит сама закрывающаяся скобка. Внутри блока каждый оператор должен ограничиваться (;).
Составной оператор может использоваться везде, где синтаксис языка допускает применение обычного оператора.
Пустой оператор.
Пустой оператор представляется символом (;), перед которым нет выражения. Пустой оператор используют там, где синтаксис языка требует присутствия в данном месте программы оператора, однако по логике программы оператор должен отсутствовать.
Необходимость в использовании пустого оператора часто возникает, когда действия, которые могут быть выполнены в теле цикла, целиком помещаются в заголовке цикла.
Операторы ветвления.
К операторам ветвления относятся if, if else, ?, switch и goto. Общий вид операторов ветвления следующий:
if (логическое выражение)
оператор;
if (логическое выражение)
оператор1;
else
оператор2;
<�логическое выражение>? <�выражение1>: <�выражение2>;
Если значение логического выражения истинно, то вычисляется выражение1, в противном случае вычисляется выражение2.
switch (выражение целого типа)
{
case значение1:
последовательность_операторов1;
break;
case значение2:
последовательность_операторов2;
break;
.. .
case значение_n:
последовательность_операторов_n;
break;
default:
последовательность_операторов_n+1;
}
Ветку default можно не описывать. Она выполняется, если ни одно из вышестоящих выражений не удовлетворено.
Оператор цикла.
В Турбо Си имеются следующие конструкции, позволяющие программировать циклы: while, do while и for. Их структуру можно описать следующим образом:
Цикл с проверкой условия наверху:
while (логическое выражение)
оператор;
Цикл с проверкой условия внизу:
do
оператор;
while (логическое выражение);
Универсальный оператор цикла:
for (инициализация; проверка; новое_значение)
оператор;
Задание:
Составить и получить распечатку программы выбора всех четных чисел от 1 до 1000.
Составить и получить распечатку программы выбора всех чисел, заканчивающихся на цифру 5, от 1 до 1000.
Написать программу с использованием цикла do-while, которая ожидает нажатия клавиши `ъ' и по нажатии её завершает работу.
Программа 1: распечатывает все четные числа от 1 до 1000:
#include
int vit;
int main (void)
{
vit = 2;
while (vit <= 1000)
{
vit = vit +2;
printf («%dn», vit);
}
system («PAUSE»);
return 0;
}
Программа 2: распечатывает все числа от 1 до 1000, которые заканчиваются на цифру 5:
#include
#include
int den;
int main ()
{
den = 5;
while (den <= 1000)
{
den = den +10;
printf («%dn», den);
}
system («PAUSE»);
return 0;
}
Программа 3:Программа ожидает нажатия клавиши «Ъ» и по её нажатии завершает работу:
#include
#include
#include
//#include
int getkey;(void);
{
int key, lo, hi;
key=bioskey (0);
lo = key & 0X00FF;
hi = (key & 0X0FF00) >> 8;
return ((lo==0)? hi +256: lo);
}
main ()
{
clrscr ();
int input;
do
{
input = getkey ();
printf («Program is running n»);
}
while (input≠ ']');
}
Лабораторная работа N2
Программирование с использованием указателей
Цель работы: Oзнакомиться с понятием указателя, научиться использовать их при программировании на С.
Теоретические сведения
Указатель — это переменная, которая содержит в памяти адрес данных. Переменная-указатель содержит местоположение значения. То есть, переменная-указатель указывает на значение, так как она содержит его адрес.
Указатели предоставляют эффективные средства доступа и изменения данных. Так как указатели содержат адреса данных, то при поиске значений в памяти у компьютера сокращается объем работы. Указатели не привязывают данные к какому-либо определенному имени переменной. Они могут содержать адрес любого не именованного значения.
Суть переменных-указателей.
Так как указатели являются обычными переменными, для них действительны все правила именования обычных переменных. Как и в случае с обычной переменной, нужно сначала объявить указатель и только потом его использовать. В Си указатели могут быть на все существующие в языке типы данных; можно создать указатель на целое, символьное данное, и так далее. В зависимости от того, в каком месте программы объявлен указатель, он может быть локальным или глобальным (как и для обычных переменных, использовать глобальные без нужды не рекомендуется).
Единственная разница между обычными переменными и указателями заключается в их содержимом. Указатели содержат не само значение, а его адрес.
В Си имеет два оператора, относящихся к указателям:
& - оператор «адрес значения»
* - оператор «значение по адресу»
Объявление указателей.
Если нужно объявить переменную для хранения, например, возраста то можно сделать это следующим образом:
int age = 20;
Такое объявление переменной age подразумевает несколько моментов. Во-первых, сообщается Си, что нужна переменная с именем age, и Си резервирует для этой переменной место в памяти. Во-вторых, Си узнает, что age будет использоваться для хранения только целых чисел. В-третьих, при объявлении эта переменная инициализируется значением 20.
Пусть нужно объявить переменную-указатель, которая не содержит возраст, а указывает на age, переменную, где находятся нужные данные. Для объявления указателя на переменную age нужно сделать следующее:
int *p_age;
В этой строке резервируется место для переменной с именем p_age. Однако это не обычная целочисленная переменная. Так как перед ней стоит *, Си определит, что это переменная-указатель.
Присваивание значений указателям.
Указатель может содержать адреса значений только соответствующего ему типа. Например, p_age может указывать только на целочисленные переменные. Си не инициализирует указатели при их объявлении. Если age объявлена как показано выше, и нужно, чтобы p_age содержала адрес age, нужно присвоить его переменной p_age:
p_age=&age;
Вместо занесения адреса переменной age в переменную p_age при помощи оператора присваивания можно одновременно объявлять и инициализировать указатели.
int age=20;
int *p_age=&age;
Можно присваивать различные значения переменной age следующим оператором:
age=35;
Либо можно сделать то же самое другим путем:
*p_age=35;
Эта строка подразумевает «взять ячейку памяти, на которую указывает p_age и занести туда значение 35» .
Объявление массивов указателей.
Если нужно зарезервировать большое количество указателей для различных данных, можно объявить массив указателей, причем каждый его элемент будет являться указателем одного и того же указанного типа. Следующий пример резервирует массив из 10 указателей на переменную целого типа:
int *iptr[10];
Можно присвоить адрес любому элементу из iptr таким же образом, как и любому другому указателю, не входящему в массив:
iptr[4]=&age;
В следующей строке резервируется массив из 20 указателей на переменные символьного типа:
char *cpoint[20];
Задание:
Составить программу для определения максимального элемента одномерного массива. Массив первоначально заполняется нулями, затем данные вводятся с клавиатуры. Заменить нулем все элементы, равные максимальному. Массив задать при помощи указателя. Зарезервировать память под массив при помощи функций динамического распределения памяти.
Программа: определяет максимальный элемент одномерного массива:
#include
#include
#include
int* arr;
void zero ();
void in ();
int max ();
void out ();
void main ()
{
arr=(int*)malloc (10);
clrscr ();
zero ();
out ();
getch ();
in ();
int maxEl=max ();
int i;
for (i=0;i<10;i++)
if (*(arr+i)==maxEl) *(arr+i)=0;
else ;
clrscr ();
out ();
getch ();
}
void zero ()
{
int i;
for (i=0;i<10;i++)
*(arr+i)=0;
}
void in ()
{
printf («nEnter elements of array:»);
printf («n»);
int i;
for (i=0;i<10;i++)
scanf («n%i», arr+i);
}
int max ()
{
int mx=*arr;
int i=1;
for (i;i<10;i++)
if (mx<*(arr+i)) mx=*(arr+i);
else ;
return mx;
}
void out ()
{
int i;
for (i=0;i<10;i++)
{
printf («%i» ,*(arr+i));
printf (««);
}
system («PAUSE»);
return 0;
}
Результат работы программы: Массив первоначально заполняется нулями, затем данные вводятся с клавиатуры. Заменяются нулем все элементы, равные максимальному. Массив задаётся при помощи указателя. Память под массив зарезервирована при помощи функций динамического распределения памяти.